From 683c34e9c5b21e1127fa9dae484a3ea23fdd7a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20=C3=9Cbler?= Date: Thu, 11 Dec 2025 11:00:25 +0100 Subject: [PATCH] WIP 2 --- .gitea/release.yaml | 2 +- .gitea/workflows/check.yaml | 2 +- add-artefact/action.yaml | 8 +---- declare/action.yaml | 8 +---- flake.lock | 23 ++++++++++++- flake.nix | 49 +++++++++++---------------- pyproject.toml | 16 +++++++++ setup.py | 6 ---- src/main.py | 11 +++--- src/release/project.py | 10 +++--- src/release/release.py | 2 +- src/release/tests/assets/release.yaml | 4 +-- src/release/tests/project.py | 14 ++++---- 13 files changed, 80 insertions(+), 75 deletions(-) create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/.gitea/release.yaml b/.gitea/release.yaml index 6907e14..962899a 100644 --- a/.gitea/release.yaml +++ b/.gitea/release.yaml @@ -1 +1 @@ -version_descriptor: setup.py +version_descriptor: pyproject.toml diff --git a/.gitea/workflows/check.yaml b/.gitea/workflows/check.yaml index ff5e3c7..1cbe636 100644 --- a/.gitea/workflows/check.yaml +++ b/.gitea/workflows/check.yaml @@ -135,7 +135,7 @@ jobs: - uses: ./add-artefact with: type: wheel - pattern: "test-assets/wheels/*.whl" + filename: "test-assets/wheels/*.whl" - uses: ./add-artefact with: diff --git a/add-artefact/action.yaml b/add-artefact/action.yaml index e6999a0..ef3647d 100644 --- a/add-artefact/action.yaml +++ b/add-artefact/action.yaml @@ -18,7 +18,7 @@ inputs: filename: required: false - description: "required for tarball, sdist" + description: "required for tarball, sdist, wheel" default: "" package_name: @@ -26,11 +26,6 @@ inputs: description: "required for tarball" default: "" - pattern: - required: false - description: "required for wheel" - default: "" - directory: required: false description: "required for npm" @@ -54,7 +49,6 @@ runs: --artefact-name "${{ inputs.name }}" \ --artefact-filename "${{ inputs.filename }}" \ --artefact-package-name "${{ inputs.package_name }}" \ - --artefact-pattern "${{ inputs.pattern }}" \ --artefact-directory "${{ inputs.directory }}" \ --version-descriptor "${{ inputs.version_descriptor }}" \ --write-env-vars-to-filename "$GITHUB_ENV" diff --git a/declare/action.yaml b/declare/action.yaml index bce2a7a..87f6729 100644 --- a/declare/action.yaml +++ b/declare/action.yaml @@ -41,7 +41,7 @@ inputs: artefact_filename: required: false - description: "required for tarball, sdist" + description: "required for tarball, sdist, wheel" default: "" artefact_package_name: @@ -49,11 +49,6 @@ inputs: description: "required for tarball" default: "" - artefact_pattern: - required: false - description: "required for wheel" - default: "" - artefact_directory: required: false description: "required for npm" @@ -129,7 +124,6 @@ runs: --artefact-name "${{ inputs.artefact_name }}" \ --artefact-filename "${{ inputs.artefact_filename }}" \ --artefact-package-name "${{ inputs.artefact_package_name }}" \ - --artefact-pattern "${{ inputs.artefact_pattern }}" \ --artefact-directory "${{ inputs.artefact_directory }}" \ --version-descriptor "${{ inputs.artefact_version_descriptor }}" fi diff --git a/flake.lock b/flake.lock index 08e416f..f01d5cb 100644 --- a/flake.lock +++ b/flake.lock @@ -34,10 +34,31 @@ "type": "github" } }, + "pyproject-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1764134915, + "narHash": "sha256-xaKvtPx6YAnA3HQVp5LwyYG1MaN4LLehpQI8xEdBvBY=", + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "rev": "2c8df1383b32e5443c921f61224b198a2282a657", + "type": "github" + }, + "original": { + "owner": "pyproject-nix", + "repo": "pyproject.nix", + "type": "github" + } + }, "root": { "inputs": { "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "pyproject-nix": "pyproject-nix" } }, "systems": { diff --git a/flake.nix b/flake.nix index 6b53cca..a6d6e7b 100644 --- a/flake.nix +++ b/flake.nix @@ -4,52 +4,41 @@ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; flake-utils.url = "github:numtide/flake-utils"; + + pyproject-nix = { + url = "github:pyproject-nix/pyproject.nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, flake-utils, ... }: + outputs = { self, nixpkgs, flake-utils, pyproject-nix }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; - python = pkgs.python313.withPackages (ps: with ps; [ - isort - flake8 - semver - toml - requests - pyyaml - packaging - ]); - - pythonPackage = pkgs.python3Packages.buildPythonPackage { - name = "release-action"; - src = ./.; + pythonProject = pyproject-nix.lib.project.loadPyproject { + projectRoot = ./.; }; + + pythonInterpreter = pkgs.python313; in { devShells.default = pkgs.mkShell { buildInputs = [ - pkgs.envsubst pkgs.just pkgs.gitea-actions-runner - python + (pythonInterpreter.withPackages + (pythonProject.renderers.withPackages { + python = pythonInterpreter; + extraPackages = ps: with ps; [ flake8 isort ]; + })) ]; }; - packages.default = pkgs.writers.writePython3Bin - "release-action" - { - libraries = with pkgs.python3Packages; [ - semver # TODO move to setup.py? - toml - requests - pythonPackage - pyyaml - packaging - ]; - } - (builtins.readFile ./src/main.py) - ; + packages.default = pythonInterpreter.pkgs.buildPythonPackage ( + pythonProject.renderers.buildPythonPackage { + python = pythonInterpreter; + }); } ); } diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d3df7ab --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "gitea-release-action" +version = "0.0.1" +description = "reusable action for release workflows" +authors = [ ] +requires-python = ">=3.13" +dependencies = [ + "semver", + "toml", + "requests", + "pyyaml", + "packaging" +] + +[project.scripts] +gitea-release-action = "main:main_cli" diff --git a/setup.py b/setup.py deleted file mode 100644 index 5ab564c..0000000 --- a/setup.py +++ /dev/null @@ -1,6 +0,0 @@ -from setuptools import setup - -setup( - name='release-action', - version='0.0.1', -) diff --git a/src/main.py b/src/main.py index 94a9f02..94393d7 100755 --- a/src/main.py +++ b/src/main.py @@ -82,7 +82,7 @@ def dump_project_description(project_description: ProjectDescription): print(' release version name: %s' % release_info.version_str) elif isinstance(generated, Wheel): - print(' - wheel: %s' % generated.pattern) + print(' - wheel: %s' % generated.filename) print(' repository: %s' % generated.repository) print(' release version name: %s' % release_info.version_str) @@ -152,7 +152,6 @@ def make_artefact(type: str, name: str, filename: str, package_name: str, - pattern: str, directory: str, version_descriptor) -> ArtefactDescription: @@ -172,8 +171,8 @@ def make_artefact(type: str, **maybe_repository) elif type == 'wheel': - assert pattern is not None - generated = Wheel(pattern=pattern, **maybe_repository) + assert filename is not None + generated = Wheel(filename=filename, **maybe_repository) elif type == 'sdist': assert filename is not None @@ -248,7 +247,7 @@ def sync_versions(project_description: ProjectDescription): sync(artefact.version_descriptor) -if __name__ == '__main__': +def main_cli(): parser = ArgumentParser() parser.add_argument('action', choices=[ 'declare', @@ -297,7 +296,6 @@ if __name__ == '__main__': parser.add_argument('--artefact-name', type=nullable_string) parser.add_argument('--artefact-package-name', type=nullable_string) parser.add_argument('--artefact-filename', type=nullable_string) - parser.add_argument('--artefact-pattern', type=nullable_string) parser.add_argument('--artefact-directory', type=nullable_string) parser.add_argument('--deployment-type', @@ -359,7 +357,6 @@ if __name__ == '__main__': args.artefact_name, args.artefact_filename, args.artefact_package_name, - args.artefact_pattern, args.artefact_directory, args.version_descriptor) diff --git a/src/release/project.py b/src/release/project.py index ee0a3b6..b08b0c3 100644 --- a/src/release/project.py +++ b/src/release/project.py @@ -97,14 +97,14 @@ class Tarball: @dataclass(frozen=True) class WheelReleaseInfo: - pattern: str + filename: str repository: str version_str: str @dataclass(frozen=True) class Wheel: - pattern: str + filename: str repository: str = DEFAULT_PYPI_REPOSITORY_NAME def make_environment_variables(self, context, version): @@ -112,7 +112,7 @@ class Wheel: def make_release_info(self, context: ReleaseContext, version: Version): return WheelReleaseInfo( - pattern=self.pattern, + filename=self.filename, repository=self.repository, version_str=python_version_str(version)) @@ -327,8 +327,8 @@ def parse_project_description(obj): **optional(tar, 'repository')) def parse_wheel(whl): - assert 'pattern' in whl - return Wheel(pattern=whl['pattern'], + assert 'filename' in whl + return Wheel(filename=whl['filename'], **optional(whl, 'repository')) def parse_sdist(sdist): diff --git a/src/release/release.py b/src/release/release.py index ba491f3..6b118c5 100644 --- a/src/release/release.py +++ b/src/release/release.py @@ -84,7 +84,7 @@ def publish_wheel(info: WheelReleaseInfo, cli: Cli): 'upload', '--verbose', '--repository', info.repository, - info.pattern) + info.filename) print() diff --git a/src/release/tests/assets/release.yaml b/src/release/tests/assets/release.yaml index 010ad62..b201448 100644 --- a/src/release/tests/assets/release.yaml +++ b/src/release/tests/assets/release.yaml @@ -19,10 +19,10 @@ artefacts: repository: balls - type: wheel - pattern: './scratch/wheels/*.whl' + filename: './scratch/wheels/*.whl' - type: wheel - pattern: './scratch/wheels/*.whl' + filename: './scratch/wheels/*.whl' repository: other - type: sdist diff --git a/src/release/tests/project.py b/src/release/tests/project.py index 79137c4..716442a 100644 --- a/src/release/tests/project.py +++ b/src/release/tests/project.py @@ -30,7 +30,7 @@ class TestProjectDescription(TestCase): version_descriptor='src/python/Cargo.toml', artefacts=[ ArtefactDescription( - generated=Wheel(pattern='./scratch/wheels/*.whl')) + generated=Wheel(filename='./scratch/wheels/*.whl')) ]) # productdesignerd @@ -55,7 +55,7 @@ class TestProjectDescription(TestCase): ArtefactDescription( generated=OciImage(name='masa-images')), ArtefactDescription( - generated=Wheel(pattern='./scratch/wheels/*.whl')) + generated=Wheel(filename='./scratch/wheels/*.whl')) ], deployments=[ DeploymentDescription( @@ -134,7 +134,7 @@ class TestProjectDescription(TestCase): artefacts=[ ArtefactDescription( version_descriptor='src/python/pyproject.toml', - generated=Wheel(pattern='./scratch/wheels/*.whl')), + generated=Wheel(filename='./scratch/wheels/*.whl')), ArtefactDescription(generated=OciImage(name='prngl')), ], deployments=[ @@ -211,9 +211,9 @@ class TestProjectDescription(TestCase): tarball.make_release_info(None, Version(1, 2, 3, 'dev4'))) def test_wheel_release_info(self): - wheel = Wheel(pattern='dist/wheels/*') + wheel = Wheel(filename='dist/wheels/*') self.assertEqual( - WheelReleaseInfo(pattern='dist/wheels/*', + WheelReleaseInfo(filename='dist/wheels/*', repository='gitea', version_str='1.2.3.dev4'), wheel.make_release_info(None, Version(1, 2, 3, 'dev4'))) @@ -366,9 +366,9 @@ class TestProjectDescription(TestCase): repository='balls')), ArtefactDescription(generated=Wheel( - pattern='./scratch/wheels/*.whl')), + filename='./scratch/wheels/*.whl')), ArtefactDescription(generated=Wheel( - pattern='./scratch/wheels/*.whl', repository='other')), + filename='./scratch/wheels/*.whl', repository='other')), ArtefactDescription(generated=Sdist( filename='./dist/papyru-0.0.1.tar.gz')),