Continuous delivery helpers for python projects
Project description
A helper for continuous delivery of python packages
What is the problem, exactly?
Python’s packaging and distribution scheme is really designed for manual intervention, most notably as regards versions. In your typical project, the version is hardcoded somewhere in the source tree, and the project history will be littered with messages like “bumped version to x.y.” Isn’t this what tagging is for? Also, why should a work in progress be given a version number in the first place? It seems backwards. It also is solvable.
Aside from that major issue, there are a number of minor annoyances that arise when handling python projects in github. Chief among these is the problem of README files. Github clearly prefers README.md files, and the markdown syntax widely available and very natural to use. Pypi, on the other hand, requires the use of README.rst files (or at least that format) in order to display on the project’s main site. I find this more difficult to work with and, regardless, one should be able to use one’s preferred README syntax. Converting from one to the other is doable, so it should also be simple.
Finally, when doing any kind of modification of source files on the fly (a build process) it is important that the package tree be untouched. This is largely due to the fact that an automated tagging process (critical to CD) falls down when the working copy is dirty. As such, automated management of a working directory which can be safely ignored in VCS is an integrated part of hatchery.
Core features
Isolation of all source manipulations to a working directory (.hatchery.work)
On-the-fly version management using the popular _version.py specification method ** Logic to make sure that only accepted (PEP)
Optional on-the-fly readme conversion from md to rst
Notion of “tasks” which must be run in a particular order
Dictate as little project structure as possible (see below)
Project prerequisites
As of the time of this writing, there are a few prerequisites that a project must meet in order to integrate with hatchery:
The project should consist of a single root package which contains all of the python logic. That package can be as large or as small as is needed, containing as many subpackages as you like, but there must only be one.
There are some code requirements in setup.py and <packagename>._version.py. Run hatchery check for more information. And don’t worry, if these prereqs aren’t met, hatchery will tell you about it instead of doing something wonky.
In order to make use of some of the features (running tests, registering and uploading releases of your project), you will have to maintain a configuration file. More information below.
Installation
$ pip install hatchery
As always, it is strongly recommended that you use this inside of a virtual environment.
Configuration
As previously mentioned, in order to take full advantage of what hatchery has to offer, there is a little configuration that is required…and I do mean a little. There are a number of parameters avialable, but most of them can just be left to their default values:
Parameter |
Default value |
Usage |
---|---|---|
auto_push_tag |
False |
Automatically run the tag-and-push logic after a successful upload operation |
create_wheel |
True |
Create a wheel along with the source distribution during the packaging step |
git_remote_name |
'origin' |
The name of the remote to push to when pushing a git tag |
pypi_repository |
None |
String parameter describing which pypi index server to upload packages to. It actually refers to an alias which must be defined in your pypirc file |
readme_to_rst |
True |
Convert a README.md file to README.rst on the fly if the former is detected and the latter is not |
test_command |
None |
A list of arbitrary shell commands that should be run during the test task. If any of them fails, the test will be considered a failure. |
These parameters should be defined in yaml format in the file .hatchery.yml in the root of your project. If you want to make any of them global across all your projects, you can also choose to define them in ~/.hatchery/hatchery.yml; just remember that the project-level file’s values will always win!
See .hatchery.yml in this repository for a contextual example.
Aside: there are lots of different opinions about how best to test one’s code. There are many frameworks, and many ways to execute them. Allowing users to have complete control over this was a key design decision. You want to use tox? Go for it! Prefer using py.test directly? Fine by me. Think pylint is important? Throw it on there! The point is, choose what testing feedback is important to you, and hatchery will execute it for you.
Examples
Make sure you have all of the prerequisites in place
$ hatchery check
Run all tests defined in configuration
$ hatchery clean test
Register your project with the pypi repository defined in configuration
$ hatchery register
Create packages (with markdown -> rst conversion)
$ hatchery package --release-version=1.2.3
Upload your packages to the pypi repository defined in configuration
$ hatchery upload
String everything together in one go!
$ hatchery clean register test package upload --release-version=1.2.3
Find out what other great features you’re missing out on
$ hatchery help
Postscript
I wrote this utility because it helps me to work in the way in which I am most productive. It will not be perfect for everyone…not yet. If you think there’s something missing that would help you find your happy path, please open up a feature request. Better yet, implement it and throw up a pull request. Feedback is welcome!
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for hatchery-0.1-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c997d14f8b955a2b21c132bef49240c40b920ed63a654916f2b5a2baa9833fee |
|
MD5 | 46dec53e132b3e3c70f689d15c1e4d4c |
|
BLAKE2b-256 | b3b18c5eacde93e333c2931f452769a8095cae1ab623491cc8df80e54a204ceb |