diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index e1cf6fdf..ad0c6deb 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -29,8 +29,12 @@ jobs: python -m pip install --upgrade pip python -m pip install requests==2.31.0 python -m pip install bandit==1.7.7 + python -m pip install packaging python -m pip install .[test] + - name: Check for prerelease dependencies + run: python scripts/check_for_prereleases.py + - name: Generate release notes env: GH_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }} diff --git a/scripts/check_for_prereleases.py b/scripts/check_for_prereleases.py new file mode 100644 index 00000000..9c1cc4dd --- /dev/null +++ b/scripts/check_for_prereleases.py @@ -0,0 +1,34 @@ +"""Script that checks project requirements for pre-release versions.""" + +from pathlib import Path + +import tomllib +from packaging.requirements import Requirement + + +def get_dev_dependencies(dependency_list): + """Return list of dependencies with prerelease specifiers.""" + prereleases = [] + for dependency in dependency_list: + requirement = Requirement(dependency) + if requirement.specifier.prereleases or requirement.url: + prereleases.append(dependency) + + return prereleases + + +if __name__ == '__main__': + folder = Path(__file__).parent + toml_path = folder.joinpath('..', 'pyproject.toml') + + with open(toml_path, 'rb') as f: + pyproject = tomllib.load(f) + + dependencies = pyproject['project']['dependencies'] + optional_dependencies = pyproject['project'].get('optional-dependencies', {}) + for dependency_list in optional_dependencies.values(): + dependencies.extend(dependency_list) + dev_deps = get_dev_dependencies(dependencies) + + if dev_deps: + raise RuntimeError(f'Found dev dependencies: {", ".join(dev_deps)}') diff --git a/tests/test_scripts.py b/tests/test_scripts.py new file mode 100644 index 00000000..8ba3fabb --- /dev/null +++ b/tests/test_scripts.py @@ -0,0 +1,37 @@ +from scripts.check_for_prereleases import get_dev_dependencies + + +def test_get_dev_dependencies(): + """Test get_dev_dependencies ignores regular releases.""" + # Setup + dependencies = ['rdt>=1.1.1', 'sdv>=1.0.2'] + + # Run + dev_dependencies = get_dev_dependencies(dependency_list=dependencies) + + # Assert + assert len(dev_dependencies) == 0 + + +def test_get_dev_dependencies_prereleases(): + """Test get_dev_dependencies detects prereleases.""" + # Setup + dependencies = ['rdt>=1.1.1.dev0', 'sdv>=1.0.2.rc1'] + + # Run + dev_dependencies = get_dev_dependencies(dependency_list=dependencies) + + # Assert + assert dev_dependencies == dependencies + + +def test_get_dev_dependencies_url(): + """Test get_dev_dependencies detects url requirements.""" + # Setup + dependencies = ['rdt>=1.1.1', 'sdv @ git+https://github.com/sdv-dev/sdv.git@main'] + + # Run + dev_dependencies = get_dev_dependencies(dependency_list=dependencies) + + # Assert + assert dev_dependencies == ['sdv @ git+https://github.com/sdv-dev/sdv.git@main']