This document describes the actions to take when releasing a new version.
Check if the
CHANGES.rst
is up to date with the changes part of this release.Check if
AUTHORS
needs to be updated for contributors.Ensure the working tree is clean and up to date:
~/src/dotsecrets$ source venv/bin/activate (venv) ~/src/dotsecrets$ git pull Already up to date. (venv) ~/src/dotsecrets$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
Ensure all the tests pass:
(venv) ~/src/dotsecrets$ python setup.py test running test running egg_info writing top-level names to dotsecrets.egg-info/top_level.txt writing requirements to dotsecrets.egg-info/requires.txt writing entry points to dotsecrets.egg-info/entry_points.txt writing dotsecrets.egg-info/PKG-INFO writing dependency_links to dotsecrets.egg-info/dependency_links.txt reading manifest file 'dotsecrets.egg-info/SOURCES.txt' writing manifest file 'dotsecrets.egg-info/SOURCES.txt' running build_ext test_regex_sub (tests.test_clean.TestCleanSecret) Test regex substitution with predefined short cuts ... ok test_sub_qs_single_match (tests.test_clean.TestCleanSecret) Test quotedstring single match two times ... ok test_sub_qs_single_match_inner_dquotes (tests.test_clean.TestCleanSecret) Test quotedstring single match with inner double quotes ... ok test_sub_qs_single_match_inner_squotes (tests.test_clean.TestCleanSecret) Test quotedstring single match with inner single quotes ... ok test_sub_uth_double_match_in_comment (tests.test_clean.TestCleanSecret) Test uptohash one match before comment, ... ok test_sub_uth_no_match (tests.test_clean.TestCleanSecret) Test uptohash copy line on no match ... ok test_sub_uth_single_match (tests.test_clean.TestCleanSecret) Test uptohash single match ... ok test_sub_uth_single_match_comment (tests.test_clean.TestCleanSecret) Test uptohash single match with comment ... ok test_sub_uth_single_match_inside_comment (tests.test_clean.TestCleanSecret) Test uptohash single match inside comment ... ok test_double_sub (tests.test_smudge.TestSmudgeFilter) ... ok test_nokey_sub (tests.test_smudge.TestSmudgeFilter) ... ok test_nomatch_sub (tests.test_smudge.TestSmudgeFilter) ... ok test_nosecret_sub (tests.test_smudge.TestSmudgeFilter) ... ok test_single_sub (tests.test_smudge.TestSmudgeFilter) ... ok test_copyfilter (tests.test_utils.TestUtils) Test copy filter ... ok ---------------------------------------------------------------------- Ran 15 tests in 0.013s OK
Remove prior build artifacts and ensure the working tree is clean:
(venv) ~/src/dotsecrets$ rm -rf build/ dist/ *.egg-info (venv) ~/src/dotsecrets$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean
Ensure that recent wheel and setuptools are installed:
(venv) ~/src/dotsecrets$ pip install --upgrade wheel setuptools Requirement already satisfied: wheel in ./venv/lib/python3.5/site-packages (0.34.2) Requirement already up-to-date: setuptools in ./venv/lib/python3.5/site-packages (49.2.0)
Ensure that twine is installed:
(venv) ~/src/dotsecrets$ pip install twine Requirement already satisfied: twine in ./venv/lib/python3.5/site-packages (1.15.0) Requirement already satisfied: requests!=2.15,!=2.16,>=2.5.0 in ./venv/lib/python3.5/site-packages (from twine) (2.24.0) Requirement already satisfied: pkginfo>=1.4.2 in ./venv/lib/python3.5/site-packages (from twine) (1.5.0.1) Requirement already satisfied: tqdm>=4.14 in ./venv/lib/python3.5/site-packages (from twine) (4.47.0) Requirement already satisfied: setuptools>=0.7.0 in ./venv/lib/python3.5/site-packages (from twine) (28.8.0) Requirement already satisfied: requests-toolbelt!=0.9.0,>=0.8.0 in ./venv/lib/python3.5/site-packages (from twine) (0.9.1) Requirement already satisfied: readme-renderer>=21.0 in ./venv/lib/python3.5/site-packages (from twine) (26.0) Requirement already satisfied: chardet<4,>=3.0.2 in ./venv/lib/python3.5/site-packages (from requests!=2.15,!=2.16,>=2.5.0->twine) (3.0.4) Requirement already satisfied: idna<3,>=2.5 in ./venv/lib/python3.5/site-packages (from requests!=2.15,!=2.16,>=2.5.0->twine) (2.10) Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.5/site-packages (from requests!=2.15,!=2.16,>=2.5.0->twine) (2020.6.20) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in ./venv/lib/python3.5/site-packages (from requests!=2.15,!=2.16,>=2.5.0->twine) (1.25.9) Requirement already satisfied: Pygments>=2.5.1 in ./venv/lib/python3.5/site-packages (from readme-renderer>=21.0->twine) (2.6.1) Requirement already satisfied: six in ./venv/lib/python3.5/site-packages (from readme-renderer>=21.0->twine) (1.15.0) Requirement already satisfied: bleach>=2.1.0 in ./venv/lib/python3.5/site-packages (from readme-renderer>=21.0->twine) (3.1.5) Requirement already satisfied: docutils>=0.13.1 in ./venv/lib/python3.5/site-packages (from readme-renderer>=21.0->twine) (0.16) Requirement already satisfied: packaging in ./venv/lib/python3.5/site-packages (from bleach>=2.1.0->readme-renderer>=21.0->twine) (20.4) Requirement already satisfied: webencodings in ./venv/lib/python3.5/site-packages (from bleach>=2.1.0->readme-renderer>=21.0->twine) (0.5.1) Requirement already satisfied: pyparsing>=2.0.2 in ./venv/lib/python3.5/site-packages (from packaging->bleach>=2.1.0->readme-renderer>=21.0->twine) (2.4.7)
Change the version number in
dotsecrets/metadata.py
usually by removing the fourth element. Make sure to follow PEP-440 [1] and the semantic versioning guidelines [2].Typically the diff would look like this:
(venv) ~/src/dotsecrets$ git diff dotsecrets/metadata.py diff --git a/dotsecrets/metadata.py b/dotsecrets/metadata.py index e51f521..5fd31e8 100644 --- a/dotsecrets/metadata.py +++ b/dotsecrets/metadata.py @@ -1,6 +1,6 @@ from datetime import datetime as dt -__version_info__ = (0, 3, 3, "dev0") +__version_info__ = (0, 3, 3) __version__ = '.'.join(map(str, __version_info__))
Commit the version change:
(venv) ~/src/dotsecrets$ git add dotsecrets/metadata.py (venv) ~/src/dotsecrets$ git commit -m "Ready for release v0.3.3"
Do a source build:
(venv) ~/src/dotsecrets$ python setup.py sdist running sdist running egg_info creating dotsecrets.egg-info writing dotsecrets.egg-info/PKG-INFO writing top-level names to dotsecrets.egg-info/top_level.txt writing dependency_links to dotsecrets.egg-info/dependency_links.txt writing requirements to dotsecrets.egg-info/requires.txt writing entry points to dotsecrets.egg-info/entry_points.txt writing manifest file 'dotsecrets.egg-info/SOURCES.txt' warning: Failed to find the configured license file 'L' warning: Failed to find the configured license file 'C' warning: Failed to find the configured license file 'N' reading manifest file 'dotsecrets.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'dotsecrets.egg-info/SOURCES.txt' running check creating dotsecrets-0.3.3 creating dotsecrets-0.3.3/dotsecrets creating dotsecrets-0.3.3/dotsecrets.egg-info copying files to dotsecrets-0.3.3... copying AUTHORS -> dotsecrets-0.3.3 copying CHANGES.rst -> dotsecrets-0.3.3 copying LICENSE -> dotsecrets-0.3.3 copying MANIFEST.in -> dotsecrets-0.3.3 copying README.rst -> dotsecrets-0.3.3 copying RELEASE.rst -> dotsecrets-0.3.3 copying setup.cfg -> dotsecrets-0.3.3 copying setup.py -> dotsecrets-0.3.3 copying dotsecrets/__init__.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/clean.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/compat.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/init.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/main.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/metadata.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/params.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/smudge.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/stow.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/test.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/textsub.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets/utils.py -> dotsecrets-0.3.3/dotsecrets copying dotsecrets.egg-info/PKG-INFO -> dotsecrets-0.3.3/dotsecrets.egg-info copying dotsecrets.egg-info/SOURCES.txt -> dotsecrets-0.3.3/dotsecrets.egg-info copying dotsecrets.egg-info/dependency_links.txt -> dotsecrets-0.3.3/dotsecrets.egg-info copying dotsecrets.egg-info/entry_points.txt -> dotsecrets-0.3.3/dotsecrets.egg-info copying dotsecrets.egg-info/requires.txt -> dotsecrets-0.3.3/dotsecrets.egg-info copying dotsecrets.egg-info/top_level.txt -> dotsecrets-0.3.3/dotsecrets.egg-info Writing dotsecrets-0.3.3/setup.cfg creating dist Creating tar archive removing 'dotsecrets-0.3.3' (and everything under it)
Do a binary wheel build:
(venv) ~/src/dotsecrets$ python setup.py bdist_wheel running bdist_wheel running build running build_py creating build creating build/lib creating build/lib/dotsecrets copying dotsecrets/__init__.py -> build/lib/dotsecrets copying dotsecrets/main.py -> build/lib/dotsecrets copying dotsecrets/params.py -> build/lib/dotsecrets copying dotsecrets/textsub.py -> build/lib/dotsecrets copying dotsecrets/utils.py -> build/lib/dotsecrets copying dotsecrets/init.py -> build/lib/dotsecrets copying dotsecrets/clean.py -> build/lib/dotsecrets copying dotsecrets/smudge.py -> build/lib/dotsecrets copying dotsecrets/metadata.py -> build/lib/dotsecrets copying dotsecrets/test.py -> build/lib/dotsecrets copying dotsecrets/compat.py -> build/lib/dotsecrets copying dotsecrets/stow.py -> build/lib/dotsecrets installing to build/bdist.linux-x86_64/wheel running install running install_lib creating build/bdist.linux-x86_64 creating build/bdist.linux-x86_64/wheel creating build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/__init__.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/main.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/params.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/textsub.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/utils.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/init.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/clean.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/smudge.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/metadata.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/test.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/compat.py -> build/bdist.linux-x86_64/wheel/dotsecrets copying build/lib/dotsecrets/stow.py -> build/bdist.linux-x86_64/wheel/dotsecrets running install_egg_info running egg_info writing entry points to dotsecrets.egg-info/entry_points.txt writing dependency_links to dotsecrets.egg-info/dependency_links.txt writing top-level names to dotsecrets.egg-info/top_level.txt writing dotsecrets.egg-info/PKG-INFO writing requirements to dotsecrets.egg-info/requires.txt warning: Failed to find the configured license file 'L' warning: Failed to find the configured license file 'C' warning: Failed to find the configured license file 'N' reading manifest file 'dotsecrets.egg-info/SOURCES.txt' reading manifest template 'MANIFEST.in' writing manifest file 'dotsecrets.egg-info/SOURCES.txt' Copying dotsecrets.egg-info to build/bdist.linux-x86_64/wheel/dotsecrets-0.3.3-py3.5.egg-info running install_scripts adding license file "CHANGES.rst" (matched pattern "*.rst") adding license file "README.rst" (matched pattern "*.rst") adding license file "RELEASE.rst" (matched pattern "*.rst") adding license file "LICENSE" (matched pattern "LICENSE") creating build/bdist.linux-x86_64/wheel/dotsecrets-0.3.3.dist-info/WHEEL creating 'dist/dotsecrets-0.3.3-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it adding 'dotsecrets/__init__.py' adding 'dotsecrets/clean.py' adding 'dotsecrets/compat.py' adding 'dotsecrets/init.py' adding 'dotsecrets/main.py' adding 'dotsecrets/metadata.py' adding 'dotsecrets/params.py' adding 'dotsecrets/smudge.py' adding 'dotsecrets/stow.py' adding 'dotsecrets/test.py' adding 'dotsecrets/textsub.py' adding 'dotsecrets/utils.py' adding 'dotsecrets-0.3.3.dist-info/CHANGES.rst' adding 'dotsecrets-0.3.3.dist-info/LICENSE' adding 'dotsecrets-0.3.3.dist-info/METADATA' adding 'dotsecrets-0.3.3.dist-info/README.rst' adding 'dotsecrets-0.3.3.dist-info/RELEASE.rst' adding 'dotsecrets-0.3.3.dist-info/WHEEL' adding 'dotsecrets-0.3.3.dist-info/entry_points.txt' adding 'dotsecrets-0.3.3.dist-info/top_level.txt' adding 'dotsecrets-0.3.3.dist-info/RECORD' removing build/bdist.linux-x86_64/wheel
Upload test packages to test instance of PyPI:
(venv) ~/src/dotsecrets$ python -m twine upload --repository testpypi dist/* Enter your username: Enter your password: Uploading distributions to https://test.pypi.org/legacy/ Uploading dotsecrets-0.3.3-py3-none-any.whl 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43.4k/43.4k [00:02<00:00, 16.0kB/s] Uploading dotsecrets-0.3.3.tar.gz 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 39.6k/39.6k [00:01<00:00, 35.7kB/s] View at: https://test.pypi.org/project/dotsecrets/0.3.3/
Review the package discription on Test PyPI.
Create a new virtual environment and install the test package:
(venv) ~/src/dotsecrets$ deactivate ~/src/dotsecrets$ cd ~/tmp ~/tmp$ python3 -m venv test_venv_ds ~/tmp$ source test_venv_ds/bin/activate (test_venv_ds) ~/tmp$ $ pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple dotsecrets Collecting dotsecrets Downloading https://test-files.pythonhosted.org/packages/ef/67/fe725a9cec7e5391660ec36631e61900eb2d8e67be69f8b5dad3c28b0213/dotsecrets-0.3.3-py3-none-any.whl Collecting dploy>=0.1.2 (from dotsecrets) Collecting ruamel.yaml>=0.15.100 (from dotsecrets) Using cached https://files.pythonhosted.org/packages/a6/92/59af3e38227b9cc14520bf1e59516d99ceca53e3b8448094248171e9432b/ruamel.yaml-0.16.10-py2.py3-none-any.whl Collecting ruamel.yaml.clib>=0.1.2; platform_python_implementation == "CPython" and python_version < "3.9" (from ruamel.yaml>=0.15.100->dotsecrets) Using cached https://files.pythonhosted.org/packages/e8/da/d7f3368dcb3ed175b5b5778362c2e7092988ff3878d23f9b717708d9a01f/ruamel.yaml.clib-0.2.0-cp35-cp35m-manylinux1_x86_64.whl Installing collected packages: dploy, ruamel.yaml.clib, ruamel.yaml, dotsecrets Successfully installed dotsecrets-0.3.3 dploy-0.1.2 ruamel.yaml-0.16.10 ruamel.yaml.clib-0.2.0 You are using pip version 9.0.1, however version 20.1.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.
Test some of the commands on your dotfiles repository:
(test_venv_ds) ~/dotfiles$ dotsecrets --version dotsecrets 0.3.3 (test_venv_ds) ~/dotfiles$ dotsecrets init (test_venv_ds) ~/dotfiles$ dotsecrets test <relative name of a dotfile> (test_venv_ds) ~/dotfiles$ dotsecrets stow <name of toplevel folder> (test_venv_ds) ~/dotfiles$ dotsecrets unstow <name of toplevel folder> (test_venv_ds) ~/dotfiles$ deactivate
If something is not as expected, do not upload a new version to PyPI, Troubleshoot and fix issues (or ultimately revert the version back to development). If any repository changes have been made since step 6,
go back to step 6 to recreate the distribution and start over.
When all is as expected push and tag the release:
~/src/dotsecrets$ source venv/bin/activate (venv) ~/src/dotsecrets$ git push (venv) ~/src/dotsecrets$ git tag -a "v0.3.3" -m "Tag release v0.3.3" (venv) ~/src/dotsecrets$ git push --tags
Upload the final release version to PyPI:
(venv) ~/src/dotsecrets$ python -m twine upload dist/* Enter your username: Enter your password: Uploading distributions to https://upload.pypi.org/legacy/ Uploading dotsecrets-0.3.3-py3-none-any.whl 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 43.4k/43.4k [00:02<00:00, 16.0kB/s] Uploading dotsecrets-0.3.3.tar.gz 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 39.6k/39.6k [00:01<00:00, 35.7kB/s] View at: https://pypi.org/project/dotsecrets/0.3.3/
Change the version number to start next development cycle by adjusting
dotsecrets/metadata.py
. Add a fourth element to the version tuple. The version should follow PEP-440 [1] and the semantic versioning guidelines [2].Typically the diff would look like this:
(venv) ~/src/dotsecrets$ git diff dotsecrets/metadata.py diff --git a/dotsecrets/metadata.py b/dotsecrets/metadata.py index e51f521..5fd31e8 100644 --- a/dotsecrets/metadata.py +++ b/dotsecrets/metadata.py @@ -1,6 +1,6 @@ from datetime import datetime as dt -__version_info__ = (0, 3, 3) +__version_info__ = (0, 3, 4, "dev0") __version__ = '.'.join(map(str, __version_info__))
Add new entry to CHANGES.rst:
(venv) ~/src/dotsecrets$ git diff diff --git a/CHANGES.rst b/CHANGES.rst index 36b1b6e..2652da6 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,10 @@ Changes ======= +0.3.4 (devel) +----------- +- TODO + 0.3.3 (2020-07-15)
Commit the version change:
(venv) ~/src/dotsecrets$ git add dotsecrets/metadata.py CHANGES.rst (venv) ~/src/dotsecrets$ git commit -m "Start development v0.3.4.dev0"
[1] | (1, 2) https://www.python.org/dev/peps/pep-0440/ |
[2] | (1, 2) https://semver.org/ |