From 60f6612614389d85a74a96d6687ca5bf719c5b4c Mon Sep 17 00:00:00 2001 From: Eric Prestat Date: Sat, 4 May 2024 08:43:10 +0100 Subject: [PATCH 1/2] Add `releasing_guide.md` and `prepare_release.py` script --- prepare_release.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 1 + releasing_guide.md | 33 +++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 prepare_release.py create mode 100644 releasing_guide.md diff --git a/prepare_release.py b/prepare_release.py new file mode 100644 index 0000000..7f88a97 --- /dev/null +++ b/prepare_release.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +import argparse +import re +import subprocess + + +def run_towncrier(tag): + cmd = ("towncrier", "build", "--version", tag.strip("v")) + + return subprocess.call(cmd) + + +def update_fallback_version_in_pyproject(tag, fname="pyproject.toml"): + version = tag.strip("v").split(".") + if len(version) < 3: + version += ["0"] + + # Default to +1 on patch version + major, minor, patch = version[0], version[1], int(version[2]) + 1 + + with open(fname, "r") as file: + lines = file.readlines() + + pattern = "fallback_version" + new_version = f"{major}.{minor}.{patch}.dev0" + # Iterate through the lines and find the pattern + for i, line in enumerate(lines): + if re.search(pattern, line): + lines[i] = f'{pattern} = "{new_version}"\n' + break + + # Write the updated content back to the file + with open(fname, "w") as file: + file.writelines(lines) + + print( + f"\nNew (fallback) dev version ({new_version}) written to `pyproject.toml`.\n" + ) + + +if __name__ == "__main__": + # Get tag argument + parser = argparse.ArgumentParser() + parser.add_argument("tag") + args = parser.parse_args() + tag = args.tag + + # Update release notes + # towncrier is not used in this repository + # run_towncrier(tag) + + # Update fallback version for setuptools_scm + update_fallback_version_in_pyproject(tag) diff --git a/pyproject.toml b/pyproject.toml index 9dae92f..f61dd4c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -71,6 +71,7 @@ source = ["hyperspy_gui_ipywidgets"] omit = [ "hyperspy_gui_ipywidgets/tests/*", "hyperspy_gui_ipywidgets/conftest.py", + "prepare_release.py", ] [tool.coverage.report] diff --git a/releasing_guide.md b/releasing_guide.md new file mode 100644 index 0000000..caa284c --- /dev/null +++ b/releasing_guide.md @@ -0,0 +1,33 @@ + +Cut a Release +============= + +Create a PR to the `main` branch and go through the following steps: + +**Preparation** +- Prepare the release by running the `prepare_release.py` python script (e.g. `python prepare_release.py 2.0.1`) , which will do the following: + - update the `setuptools_scm` fallback version in `pyproject.toml`. +- Check release notes +- (optional) check conda-forge and wheels build. Pushing a tag to a fork will run the release workflow without uploading to pypi +- Let that PR collect comments for a day to ensure that other maintainers are comfortable with releasing + +**Tag and release** +:warning: this is a point of no return point :warning: +- push tag (`vx.y.z`) to the upstream repository and the following will be triggered: + - build of the wheels and their upload to pypi + - creation of a Github Release + +**Post-release action** +- Merge the PR + +Follow-up +========= + +- Tidy up and close corresponding milestone +- A PR to the conda-forge feedstock will be created by the conda-forge bot + +Additional information +====================== + +The version is defined by ``setuptools_scm`` at build time when packaging HyperSpy. In an editable installation (when using ``pip install -e .``), the version is defined from the +git repository. From 82c01b659634023a9a1a8ff07c38f7857137069e Mon Sep 17 00:00:00 2001 From: Eric Prestat Date: Sat, 4 May 2024 08:44:25 +0100 Subject: [PATCH 2/2] Add changelog entry --- CHANGES.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 53d0655..c9005e9 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,8 +3,10 @@ See https://keepachangelog.com for details ## v2.1 (UNRELEASED) +* Add releasing guide and release script ([#59](https://github.com/hyperspy/hyperspy_gui_traitsui/pull/59)). +* Add `ipympl` dependency as convenience ([#58])(https://github.com/hyperspy/hyperspy_gui_ipywidgets/pull/58). * Fix regression with editable installation ([#55](https://github.com/hyperspy/hyperspy_gui_ipywidgets/pull/55)). -* Add `ipympl` dependency as convenience ([#58])(https://github.com/hyperspy/hyperspy_gui_ipywidgets/pull/58) + ## v2.0 (2023-11-15) * Consolidate package metadata in `pyproject.toml` ([#49](https://github.com/hyperspy/hyperspy_gui_ipywidgets/pull/49)).