From a69038991c2ec099fc94c6c31e8dfbe0f1ade4f1c03be4abdc9aec7d92108e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mark=C3=A9ta=20Machov=C3=A1?= Date: Thu, 21 Aug 2025 08:23:45 +0000 Subject: [PATCH] - Convert to libalternatives on SLE-16-based and newer systems only OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-hatch?expand=0&rev=50 --- .gitattributes | 23 + .gitignore | 1 + _multibuild | 3 + click-8.2.patch | 29 + fix-with-latest-hatchling.patch | 924 ++++++++++++++++++++++++++++++++ hatch-v1.12.0.tar.gz | 3 + hatch-v1.14.0.tar.gz | 3 + hatch-v1.14.1.tar.gz | 3 + hatch-v1.9.4.tar.gz | 3 + python-hatch.changes | 574 ++++++++++++++++++++ python-hatch.spec | 166 ++++++ support-hatchling-1.22.patch | 54 ++ 12 files changed, 1786 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 _multibuild create mode 100644 click-8.2.patch create mode 100644 fix-with-latest-hatchling.patch create mode 100644 hatch-v1.12.0.tar.gz create mode 100644 hatch-v1.14.0.tar.gz create mode 100644 hatch-v1.14.1.tar.gz create mode 100644 hatch-v1.9.4.tar.gz create mode 100644 python-hatch.changes create mode 100644 python-hatch.spec create mode 100644 support-hatchling-1.22.patch diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..49fb912 --- /dev/null +++ b/_multibuild @@ -0,0 +1,3 @@ + + test + diff --git a/click-8.2.patch b/click-8.2.patch new file mode 100644 index 0000000..a1b28b8 --- /dev/null +++ b/click-8.2.patch @@ -0,0 +1,29 @@ +From df295583784427214324b974c75901da12931ec1 Mon Sep 17 00:00:00 2001 +From: Daniel Garcia Moreno +Date: Thu, 26 Jun 2025 11:32:54 +0200 +Subject: [PATCH] Fix test_self with click >= 8.2.0 + +https://click.palletsprojects.com/en/stable/changes/#version-8-2-0 +--- + tests/cli/self/test_self.py | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/tests/cli/self/test_self.py b/tests/cli/self/test_self.py +index cd1a4aed1..f727b87f4 100644 +--- a/tests/cli/self/test_self.py ++++ b/tests/cli/self/test_self.py +@@ -1,7 +1,13 @@ + import os ++import importlib + + + def test(hatch): + result = hatch(os.environ['PYAPP_COMMAND_NAME']) ++ exit_code = 2 + +- assert result.exit_code == 0, result.output ++ click_version = importlib.metadata.version('click') ++ if click_version <= '8.1.8': ++ exit_code = 0 ++ ++ assert result.exit_code == exit_code, result.output diff --git a/fix-with-latest-hatchling.patch b/fix-with-latest-hatchling.patch new file mode 100644 index 0000000..46c156c --- /dev/null +++ b/fix-with-latest-hatchling.patch @@ -0,0 +1,924 @@ +From f8a2eaa2e0ce80a931837539d8f565ceeab75961 Mon Sep 17 00:00:00 2001 +From: Ofek Lev +Date: Sat, 9 Nov 2024 11:35:16 -0500 +Subject: [PATCH] Bump `packaging` to 24.2 (#1788) + +--- + hatch.toml | 4 - + pyproject.toml | 2 +- + src/hatch/template/default.py | 2 +- + tests/backend/licenses/__init__.py | 0 + tests/backend/licenses/test_parse.py | 56 -- + tests/backend/licenses/test_supported.py | 31 - + tests/backend/metadata/test_core.py | 2 +- + 15 files changed, 11 insertions(+), 974 deletions(-) + delete mode 100644 tests/backend/licenses/__init__.py + delete mode 100644 tests/backend/licenses/test_parse.py + delete mode 100644 tests/backend/licenses/test_supported.py + +Index: hatch-hatch-v1.14.0/hatch.toml +=================================================================== +--- hatch-hatch-v1.14.0.orig/hatch.toml ++++ hatch-hatch-v1.14.0/hatch.toml +@@ -114,11 +114,7 @@ update-hatch = [ + "update-distributions", + "update-ruff", + ] +-update-hatchling = [ +- "update-licenses", +-] + update-distributions = "python scripts/update_distributions.py" +-update-licenses = "python backend/scripts/update_licenses.py" + update-ruff = [ + "{env:HATCH_UV} pip install --upgrade ruff", + "python scripts/update_ruff.py", +Index: hatch-hatch-v1.14.0/pyproject.toml +=================================================================== +--- hatch-hatch-v1.14.0.orig/pyproject.toml ++++ hatch-hatch-v1.14.0/pyproject.toml +@@ -44,7 +44,7 @@ dependencies = [ + "httpx>=0.22.0", + "hyperlink>=21.0.0", + "keyring>=23.5.0", +- "packaging>=23.2", ++ "packaging>=24.2", + "pexpect~=4.8", + "platformdirs>=2.5.0", + "rich>=11.2.0", +Index: hatch-hatch-v1.14.0/src/hatch/template/default.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/src/hatch/template/default.py ++++ hatch-hatch-v1.14.0/src/hatch/template/default.py +@@ -38,7 +38,7 @@ class DefaultTemplate(TemplateInterface) + license_file_name = f'{license_id}.txt' + cached_license_path = cached_licenses_dir / license_file_name + if not cached_license_path.is_file(): +- from hatchling.licenses.supported import VERSION ++ from packaging.licenses._spdx import VERSION # noqa: PLC2701 + + url = f'https://raw.githubusercontent.com/spdx/license-list-data/v{VERSION}/text/{license_file_name}' + for _ in range(5): +Index: hatch-hatch-v1.14.0/tests/backend/licenses/test_parse.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/tests/backend/licenses/test_parse.py ++++ /dev/null +@@ -1,56 +0,0 @@ +-import re +- +-import pytest +- +-from hatchling.licenses.parse import normalize_license_expression +- +- +-@pytest.mark.parametrize( +- 'expression', +- [ +- 'or', +- 'and', +- 'with', +- 'mit or', +- 'mit and', +- 'mit with', +- 'or mit', +- 'and mit', +- 'with mit', +- '(mit', +- 'mit)', +- 'mit or or apache-2.0', +- 'mit or apache-2.0 (bsd-3-clause and MPL-2.0)', +- ], +-) +-def test_syntax_errors(expression): +- with pytest.raises(ValueError, match=re.escape(f'invalid license expression: {expression}')): +- normalize_license_expression(expression) +- +- +-def test_unknown_license(): +- with pytest.raises(ValueError, match='unknown license: foo'): +- normalize_license_expression('mit or foo') +- +- +-def test_unknown_license_exception(): +- with pytest.raises(ValueError, match='unknown license exception: foo'): +- normalize_license_expression('mit with foo') +- +- +-@pytest.mark.parametrize( +- ('raw', 'normalized'), +- [ +- ('mIt', 'MIT'), +- ('mit or apache-2.0', 'MIT OR Apache-2.0'), +- ('mit and apache-2.0', 'MIT AND Apache-2.0'), +- ('gpl-2.0-or-later with bison-exception-2.2', 'GPL-2.0-or-later WITH Bison-exception-2.2'), +- ('mit or apache-2.0 and (bsd-3-clause or mpl-2.0)', 'MIT OR Apache-2.0 AND (BSD-3-Clause OR MPL-2.0)'), +- ('mit and (apache-2.0+ or mpl-2.0+)', 'MIT AND (Apache-2.0+ OR MPL-2.0+)'), +- # Valid non-SPDX values +- ('licenseref-public-domain', 'LicenseRef-Public-Domain'), +- ('licenseref-proprietary', 'LicenseRef-Proprietary'), +- ], +-) +-def test_normalization(raw, normalized): +- assert normalize_license_expression(raw) == normalized +Index: hatch-hatch-v1.14.0/tests/backend/licenses/test_supported.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/tests/backend/licenses/test_supported.py ++++ /dev/null +@@ -1,31 +0,0 @@ +-from hatchling.licenses.supported import EXCEPTIONS, LICENSES +- +- +-def test_licenses(): +- assert isinstance(LICENSES, dict) +- assert list(LICENSES) == sorted(LICENSES) +- +- for name, data in LICENSES.items(): +- assert isinstance(data, dict) +- +- assert 'id' in data +- assert isinstance(data['id'], str) +- assert data['id'].lower() == name +- +- assert 'deprecated' in data +- assert isinstance(data['deprecated'], bool) +- +- +-def test_exceptions(): +- assert isinstance(EXCEPTIONS, dict) +- assert list(EXCEPTIONS) == sorted(EXCEPTIONS) +- +- for name, data in EXCEPTIONS.items(): +- assert isinstance(data, dict) +- +- assert 'id' in data +- assert isinstance(data['id'], str) +- assert data['id'].lower() == name +- +- assert 'deprecated' in data +- assert isinstance(data['deprecated'], bool) +Index: hatch-hatch-v1.14.0/tests/backend/metadata/test_core.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/tests/backend/metadata/test_core.py ++++ hatch-hatch-v1.14.0/tests/backend/metadata/test_core.py +@@ -558,7 +558,7 @@ class TestLicense: + def test_invalid_expression(self, isolation): + metadata = ProjectMetadata(str(isolation), None, {'project': {'license': 'mit or foo'}}) + +- with pytest.raises(ValueError, match='Error parsing field `project.license` - unknown license: foo'): ++ with pytest.raises(ValueError, match="Error parsing field `project.license` - Unknown license: 'foo'"): + _ = metadata.core.license_expression + + def test_multiple_options(self, isolation): +@@ -621,54 +621,16 @@ class TestLicenseFiles: + ): + _ = metadata.core.license_files + +- def test_not_table(self, isolation): ++ def test_not_array(self, isolation): + metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': 9000}}) + +- with pytest.raises(TypeError, match='Field `project.license-files` must be a table'): +- _ = metadata.core.license_files +- +- def test_multiple_options(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {'paths': [], 'globs': []}}}) +- +- with pytest.raises( +- ValueError, match='Cannot specify both `paths` and `globs` in the `project.license-files` table' +- ): +- _ = metadata.core.license_files +- +- def test_no_option(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {}}}) +- +- with pytest.raises( +- ValueError, match='Must specify either `paths` or `globs` in the `project.license-files` table if defined' +- ): +- _ = metadata.core.license_files +- +- def test_paths_not_array(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {'paths': 9000}}}) +- +- with pytest.raises(TypeError, match='Field `paths` in the `project.license-files` table must be an array'): ++ with pytest.raises(TypeError, match='Field `project.license-files` must be an array'): + _ = metadata.core.license_files + +- def test_paths_entry_not_string(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {'paths': [9000]}}}) +- +- with pytest.raises( +- TypeError, match='Entry #1 in field `paths` in the `project.license-files` table must be a string' +- ): +- _ = metadata.core.license_files +- +- def test_globs_not_array(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {'globs': 9000}}}) +- +- with pytest.raises(TypeError, match='Field `globs` in the `project.license-files` table must be an array'): +- _ = metadata.core.license_files +- +- def test_globs_entry_not_string(self, isolation): +- metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': {'globs': [9000]}}}) ++ def test_entry_not_string(self, isolation): ++ metadata = ProjectMetadata(str(isolation), None, {'project': {'license-files': [9000]}}) + +- with pytest.raises( +- TypeError, match='Entry #1 in field `globs` in the `project.license-files` table must be a string' +- ): ++ with pytest.raises(TypeError, match='Entry #1 of field `project.license-files` must be a string'): + _ = metadata.core.license_files + + def test_default_globs_no_licenses(self, isolation): +@@ -693,7 +655,7 @@ class TestLicenseFiles: + assert metadata.core.license_files == sorted(expected) + + def test_globs_with_licenses(self, temp_dir): +- metadata = ProjectMetadata(str(temp_dir), None, {'project': {'license-files': {'globs': ['LICENSES/*']}}}) ++ metadata = ProjectMetadata(str(temp_dir), None, {'project': {'license-files': ['LICENSES/*']}}) + + licenses_dir = temp_dir / 'LICENSES' + licenses_dir.mkdir() +@@ -709,7 +671,7 @@ class TestLicenseFiles: + metadata = ProjectMetadata( + str(temp_dir), + None, +- {'project': {'license-files': {'paths': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt', 'COPYING']}}}, ++ {'project': {'license-files': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt', 'COPYING']}}, + ) + + licenses_dir = temp_dir / 'LICENSES' +@@ -722,20 +684,6 @@ class TestLicenseFiles: + + assert metadata.core.license_files == ['COPYING', 'LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt'] + +- def test_paths_missing_license(self, temp_dir): +- metadata = ProjectMetadata( +- str(temp_dir), +- None, +- {'project': {'license-files': {'paths': ['LICENSES/MIT.txt']}}}, +- ) +- +- licenses_dir = temp_dir / 'LICENSES' +- licenses_dir.mkdir() +- (licenses_dir / 'Apache-2.0.txt').touch() +- +- with pytest.raises(OSError, match='License file does not exist: LICENSES/MIT.txt'): +- _ = metadata.core.license_files +- + + class TestAuthors: + def test_dynamic(self, isolation): +@@ -1661,7 +1609,7 @@ class TestMetadataConversion: + raw_metadata = { + 'name': 'My.App', + 'version': '0.0.1', +- 'license-files': {'paths': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt']}, ++ 'license-files': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt'], + } + metadata = ProjectMetadata(str(temp_dir), None, {'project': raw_metadata}) + +Index: hatch-hatch-v1.14.0/tests/backend/builders/test_wheel.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/tests/backend/builders/test_wheel.py ++++ hatch-hatch-v1.14.0/tests/backend/builders/test_wheel.py +@@ -909,7 +909,7 @@ class TestBuildStandard: + (project_path / 'LICENSES' / 'test').mkdir() + + config = { +- 'project': {'name': project_name, 'dynamic': ['version'], 'license-files': {'globs': ['LICENSES/*']}}, ++ 'project': {'name': project_name, 'dynamic': ['version'], 'license-files': ['LICENSES/*']}, + 'tool': { + 'hatch': { + 'version': {'path': 'my_app/__about__.py'}, +Index: hatch-hatch-v1.14.0/tests/backend/metadata/test_spec.py +=================================================================== +--- hatch-hatch-v1.14.0.orig/tests/backend/metadata/test_spec.py ++++ hatch-hatch-v1.14.0/tests/backend/metadata/test_spec.py +@@ -131,7 +131,7 @@ License-File: LICENSES/MIT.txt + assert project_metadata_from_core_metadata(core_metadata) == { + 'name': 'My.App', + 'version': '0.1.0', +- 'license-files': {'paths': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt']}, ++ 'license-files': ['LICENSES/Apache-2.0.txt', 'LICENSES/MIT.txt'], + } + + def test_license_expression(self): +@@ -419,6 +419,22 @@ class TestCoreMetadataV12: + """ + ) + ++ def test_license_expression(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'license': 'mit'}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 1.2 ++ Name: My.App ++ Version: 0.1.0 ++ License: MIT ++ """ ++ ) ++ + def test_keywords_single(self, constructor, isolation, helpers): + metadata = ProjectMetadata( + str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'keywords': ['foo']}} +@@ -762,7 +778,7 @@ class TestCoreMetadataV21: + Metadata-Version: 2.1 + Name: My.App + Version: 0.1.0 +- License-Expression: MIT ++ License: MIT + """ + ) + +@@ -961,7 +977,6 @@ class TestCoreMetadataV21: + Maintainer-email: foo + License: foo + bar +- License-File: LICENSE.txt + Keywords: bar,foo + Classifier: Programming Language :: Python :: 3.9 + Classifier: Programming Language :: Python :: 3.11 +@@ -1202,7 +1217,7 @@ class TestCoreMetadataV22: + Metadata-Version: 2.2 + Name: My.App + Version: 0.1.0 +- License-Expression: MIT ++ License: MIT + """ + ) + +@@ -1431,7 +1446,6 @@ class TestCoreMetadataV22: + Maintainer-email: foo + License: foo + bar +- License-File: LICENSE.txt + Keywords: bar,foo + Classifier: Programming Language :: Python :: 3.9 + Classifier: Programming Language :: Python :: 3.11 +@@ -1664,7 +1678,7 @@ class TestCoreMetadataV23: + metadata = ProjectMetadata( + str(isolation), + None, +- {'project': {'name': 'My.App', 'version': '0.1.0', 'license': 'mit or apache-2.0'}}, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'license': 'mit'}}, + ) + + assert constructor(metadata) == helpers.dedent( +@@ -1672,6 +1686,445 @@ class TestCoreMetadataV23: + Metadata-Version: 2.3 + Name: My.App + Version: 0.1.0 ++ License: MIT ++ """ ++ ) ++ ++ def test_keywords_single(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'keywords': ['foo']}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Keywords: foo ++ """ ++ ) ++ ++ def test_keywords_multiple(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'keywords': ['foo', 'bar']}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Keywords: bar,foo ++ """ ++ ) ++ ++ def test_classifiers(self, constructor, isolation, helpers): ++ classifiers = [ ++ 'Programming Language :: Python :: 3.11', ++ 'Programming Language :: Python :: 3.9', ++ ] ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'classifiers': classifiers}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Classifier: Programming Language :: Python :: 3.9 ++ Classifier: Programming Language :: Python :: 3.11 ++ """ ++ ) ++ ++ def test_requires_python(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'requires-python': '>=1,<2'}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Requires-Python: <2,>=1 ++ """ ++ ) ++ ++ def test_dependencies(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'dependencies': ['foo==1', 'bar==5']}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Requires-Dist: bar==5 ++ Requires-Dist: foo==1 ++ """ ++ ) ++ ++ def test_optional_dependencies(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ { ++ 'project': { ++ 'name': 'My.App', ++ 'version': '0.1.0', ++ 'optional-dependencies': { ++ 'feature2': ['foo==1; python_version < "3"', 'bar==5'], ++ 'feature1': ['foo==1', 'bar==5; python_version < "3"'], ++ }, ++ } ++ }, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Provides-Extra: feature1 ++ Requires-Dist: bar==5; (python_version < '3') and extra == 'feature1' ++ Requires-Dist: foo==1; extra == 'feature1' ++ Provides-Extra: feature2 ++ Requires-Dist: bar==5; extra == 'feature2' ++ Requires-Dist: foo==1; (python_version < '3') and extra == 'feature2' ++ """ ++ ) ++ ++ def test_extra_runtime_dependencies(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'dependencies': ['foo==1', 'bar==5']}}, ++ ) ++ ++ assert constructor(metadata, extra_dependencies=['baz==9']) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Requires-Dist: bar==5 ++ Requires-Dist: foo==1 ++ Requires-Dist: baz==9 ++ """ ++ ) ++ ++ def test_readme(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ { ++ 'project': { ++ 'name': 'My.App', ++ 'version': '0.1.0', ++ 'readme': {'content-type': 'text/markdown', 'text': 'test content\n'}, ++ } ++ }, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Description-Content-Type: text/markdown ++ ++ test content ++ """ ++ ) ++ ++ def test_all(self, constructor, temp_dir, helpers): ++ metadata = ProjectMetadata( ++ str(temp_dir), ++ None, ++ { ++ 'project': { ++ 'name': 'My.App', ++ 'version': '0.1.0', ++ 'description': 'foo', ++ 'urls': {'foo': 'bar', 'bar': 'baz'}, ++ 'authors': [{'email': 'bar@domain', 'name': 'foo'}], ++ 'maintainers': [{'email': 'bar@domain', 'name': 'foo'}], ++ 'keywords': ['foo', 'bar'], ++ 'classifiers': [ ++ 'Programming Language :: Python :: 3.11', ++ 'Programming Language :: Python :: 3.9', ++ ], ++ 'requires-python': '>=1,<2', ++ 'dependencies': ['foo==1', 'bar==5'], ++ 'optional-dependencies': { ++ 'feature2': ['foo==1; python_version < "3"', 'bar==5'], ++ 'feature1': ['foo==1', 'bar==5; python_version < "3"'], ++ 'feature3': ['baz @ file:///path/to/project'], ++ }, ++ 'readme': {'content-type': 'text/markdown', 'text': 'test content\n'}, ++ }, ++ 'tool': {'hatch': {'metadata': {'allow-direct-references': True}}}, ++ }, ++ ) ++ ++ licenses_dir = temp_dir / 'LICENSES' ++ licenses_dir.mkdir() ++ (licenses_dir / 'MIT.txt').touch() ++ (licenses_dir / 'Apache-2.0.txt').touch() ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.3 ++ Name: My.App ++ Version: 0.1.0 ++ Summary: foo ++ Project-URL: foo, bar ++ Project-URL: bar, baz ++ Author-email: foo ++ Maintainer-email: foo ++ Keywords: bar,foo ++ Classifier: Programming Language :: Python :: 3.9 ++ Classifier: Programming Language :: Python :: 3.11 ++ Requires-Python: <2,>=1 ++ Requires-Dist: bar==5 ++ Requires-Dist: foo==1 ++ Provides-Extra: feature1 ++ Requires-Dist: bar==5; (python_version < '3') and extra == 'feature1' ++ Requires-Dist: foo==1; extra == 'feature1' ++ Provides-Extra: feature2 ++ Requires-Dist: bar==5; extra == 'feature2' ++ Requires-Dist: foo==1; (python_version < '3') and extra == 'feature2' ++ Provides-Extra: feature3 ++ Requires-Dist: baz@ file:///path/to/project ; extra == 'feature3' ++ Description-Content-Type: text/markdown ++ ++ test content ++ """ ++ ) ++ ++ ++@pytest.mark.parametrize('constructor', [get_core_metadata_constructors()['2.4']]) ++class TestCoreMetadataV24: ++ def test_default(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata(str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0'}}) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ """ ++ ) ++ ++ def test_description(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'description': 'foo'}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Summary: foo ++ """ ++ ) ++ ++ def test_dynamic(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'dynamic': ['authors', 'classifiers']}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Dynamic: Author ++ Dynamic: Author-email ++ Dynamic: Classifier ++ """ ++ ) ++ ++ def test_urls(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'urls': {'foo': 'bar', 'bar': 'baz'}}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Project-URL: foo, bar ++ Project-URL: bar, baz ++ """ ++ ) ++ ++ def test_authors_name(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'authors': [{'name': 'foo'}]}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Author: foo ++ """ ++ ) ++ ++ def test_authors_email(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'authors': [{'email': 'foo@domain'}]}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Author-email: foo@domain ++ """ ++ ) ++ ++ def test_authors_name_and_email(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'authors': [{'email': 'bar@domain', 'name': 'foo'}]}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Author-email: foo ++ """ ++ ) ++ ++ def test_authors_multiple(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'authors': [{'name': 'foo'}, {'name': 'bar'}]}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Author: foo, bar ++ """ ++ ) ++ ++ def test_maintainers_name(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'maintainers': [{'name': 'foo'}]}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Maintainer: foo ++ """ ++ ) ++ ++ def test_maintainers_email(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'maintainers': [{'email': 'foo@domain'}]}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Maintainer-email: foo@domain ++ """ ++ ) ++ ++ def test_maintainers_name_and_email(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ { ++ 'project': { ++ 'name': 'My.App', ++ 'version': '0.1.0', ++ 'maintainers': [{'email': 'bar@domain', 'name': 'foo'}], ++ } ++ }, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Maintainer-email: foo ++ """ ++ ) ++ ++ def test_maintainers_multiple(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'maintainers': [{'name': 'foo'}, {'name': 'bar'}]}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ Maintainer: foo, bar ++ """ ++ ) ++ ++ def test_license(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), None, {'project': {'name': 'My.App', 'version': '0.1.0', 'license': {'text': 'foo\nbar'}}} ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 ++ License: foo ++ bar ++ """ ++ ) ++ ++ def test_license_expression(self, constructor, isolation, helpers): ++ metadata = ProjectMetadata( ++ str(isolation), ++ None, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'license': 'mit or apache-2.0'}}, ++ ) ++ ++ assert constructor(metadata) == helpers.dedent( ++ """ ++ Metadata-Version: 2.4 ++ Name: My.App ++ Version: 0.1.0 + License-Expression: MIT OR Apache-2.0 + """ + ) +@@ -1680,7 +2133,7 @@ class TestCoreMetadataV23: + metadata = ProjectMetadata( + str(temp_dir), + None, +- {'project': {'name': 'My.App', 'version': '0.1.0', 'license-files': {'globs': ['LICENSES/*']}}}, ++ {'project': {'name': 'My.App', 'version': '0.1.0', 'license-files': ['LICENSES/*']}}, + ) + + licenses_dir = temp_dir / 'LICENSES' +@@ -1690,7 +2143,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + License-File: LICENSES/Apache-2.0.txt +@@ -1705,7 +2158,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Keywords: foo +@@ -1719,7 +2172,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Keywords: bar,foo +@@ -1737,7 +2190,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Classifier: Programming Language :: Python :: 3.9 +@@ -1752,7 +2205,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Requires-Python: <2,>=1 +@@ -1768,7 +2221,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Requires-Dist: bar==5 +@@ -1794,7 +2247,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Provides-Extra: feature1 +@@ -1815,7 +2268,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata, extra_dependencies=['baz==9']) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Requires-Dist: bar==5 +@@ -1839,7 +2292,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Description-Content-Type: text/markdown +@@ -1861,7 +2314,7 @@ class TestCoreMetadataV23: + 'authors': [{'email': 'bar@domain', 'name': 'foo'}], + 'maintainers': [{'email': 'bar@domain', 'name': 'foo'}], + 'license': 'mit or apache-2.0', +- 'license-files': {'globs': ['LICENSES/*']}, ++ 'license-files': ['LICENSES/*'], + 'keywords': ['foo', 'bar'], + 'classifiers': [ + 'Programming Language :: Python :: 3.11', +@@ -1887,7 +2340,7 @@ class TestCoreMetadataV23: + + assert constructor(metadata) == helpers.dedent( + """ +- Metadata-Version: 2.3 ++ Metadata-Version: 2.4 + Name: My.App + Version: 0.1.0 + Summary: foo diff --git a/hatch-v1.12.0.tar.gz b/hatch-v1.12.0.tar.gz new file mode 100644 index 0000000..6cfecc8 --- /dev/null +++ b/hatch-v1.12.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70f77624599397866e85e08294fe7abc1261ab99b9a21fbe83cb529b0287b828 +size 5274124 diff --git a/hatch-v1.14.0.tar.gz b/hatch-v1.14.0.tar.gz new file mode 100644 index 0000000..a004081 --- /dev/null +++ b/hatch-v1.14.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec06e2ce441a0ae9e1c96cc20674dcddbc32ca93ee3d0e6d8d8f382e4a31a767 +size 5274815 diff --git a/hatch-v1.14.1.tar.gz b/hatch-v1.14.1.tar.gz new file mode 100644 index 0000000..9ef50bd --- /dev/null +++ b/hatch-v1.14.1.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e38d63bb7a4bf8a2da4c60fdf08dee143ead037440e7071fb5d4543258dd3277 +size 5274731 diff --git a/hatch-v1.9.4.tar.gz b/hatch-v1.9.4.tar.gz new file mode 100644 index 0000000..d106a6f --- /dev/null +++ b/hatch-v1.9.4.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cafce05e853e9a878e24ab519a18863cf27e21a3aa11a8f6d92b0a3606ca583 +size 768420 diff --git a/python-hatch.changes b/python-hatch.changes new file mode 100644 index 0000000..33704e8 --- /dev/null +++ b/python-hatch.changes @@ -0,0 +1,574 @@ +------------------------------------------------------------------- +Thu Aug 21 08:22:26 UTC 2025 - Markéta Machová + +- Convert to libalternatives on SLE-16-based and newer systems only + +------------------------------------------------------------------- +Thu Jul 10 12:33:57 UTC 2025 - Markéta Machová + +- Convert to libalternatives + +------------------------------------------------------------------- +Thu Jun 26 09:36:32 UTC 2025 - Daniel Garcia + +- Add click-8.2.patch to fix tests with click >= 8.2 + gh#pypa/hatch#2013 + +------------------------------------------------------------------- +Wed Apr 16 07:11:55 UTC 2025 - John Paul Adrian Glaubitz + +- Update to 1.14.1 + * Remove uses of the deprecated --no-python-version-warning + flag when using pip + +------------------------------------------------------------------- +Thu Dec 19 17:05:14 UTC 2024 - Nico Krapp + +- Add fix-with-latest-hatchling.patch to restore compatibility with + hatchling >= 1.26.0 + +------------------------------------------------------------------- +Thu Dec 19 15:40:19 UTC 2024 - Nico Krapp + +- actually remove fix-test.patch from tracked files + +------------------------------------------------------------------- +Mon Dec 16 13:26:27 UTC 2024 - Nico Krapp + +- Update to 1.14.0: + * Upgrade default CPython distributions to 20241206 + * Bump the minimum supported version of Hatchling to 1.26.3 + * Update virtualenv dependency + +------------------------------------------------------------------- +Wed Dec 11 18:31:58 UTC 2024 - Matej Cepl + +- Upgrade to 1.13.0: + +- Remove upstreamed patches: + - fix-tests.patch + +------------------------------------------------------------------- +Thu Aug 8 11:20:24 UTC 2024 - Daniel Garcia + +- Add new patch to fix tests: fix-tests.patch +- Remove upstreamed patch: support-hatchling-1.22.patch +- update to 1.12.0: + - The run/env run and test commands now treat inclusion variable + options as an intersection rather than a union to allow for + specific targeting of environments + - Add ability to control the source of Python distributions + - Upgrade Ruff to 0.4.5 + - Upgrade PyApp to 0.22.0 for binary builds + - The fmt command no longer hides the commands that are being + executed + - Add default timeout for network requests, useful when installing + Python distributions + - Fix syntax highlighting contrast for the config show command +- 1.11.1: + - Add official GitHub Action for installing Hatch + - Fix terminal.styles.spinner configuration + - Fix entry points in the pre-built distributions that binaries use +- 1.11.0: + - Upgrade PyApp to 0.21.1 for binary builds + - On Linux, install the highest compatible Python distribution + variant based on CPU architecture rather than assuming recent + hardware +- 1.10.0: + - The run/env run, fmt and shell commands now only change the + current working directory to the project root if not already + inside the project + - The shell command now accepts a single argument to specify the + environment to enter which overrides the standard choice + mechanisms. The arguments determining shell options have been + converted to flags. + - Add test command + - The run command can now execute scripts that define inline + metadata for dependencies and Python version constraints + - The virtual environment type now supports the ability to use UV in + place of pip & virtualenv + - Add self report command for submitting pre-populated bug reports + to GitHub + - The reserved environment used for static analysis is now + completely configurable + - Add the following methods to the environment interface for + complete control over output during life cycle management: + app_status_creation, app_status_pre_installation, + app_status_post_installation, app_status_project_installation, + app_status_dependency_state_check, + app_status_dependency_installation_check, + app_status_dependency_synchronization + - Add binaries for 32-bit versions of Windows + - Read configuration from any ~/.pypirc file for the index publisher + - Use the Git user as the default username for new project URL + metadata + - Add HATCH_DEBUG environment variable that when enabled will show + local variables in the case of unhandled tracebacks + - The env show command now outputs data about all internal + environments when using the --json flag + - Upgrade default CPython distributions to 20240415 + - Upgrade default PyPy distributions to 7.3.15 + - Upgrade Ruff to 0.4.2 + - Upgrade PyApp to 0.19.0 for binary builds + - Bump the minimum supported version of Hatchling to 1.24.2 + - Bump the minimum supported version of virtualenv to 20.26.1 + - Maintain consistent data paths for case insensitive file systems + - When projects derive dependencies from metadata hooks, there is + now by default a status indicator for when the hooks are executed + for better responsiveness + - Properly support projects with a pyproject.toml file but no + project table e.g. applications + - Fix the fmt command when automatically installing plugin + dependencies + - Fix dependency inheritance for the template of the types + environment for new projects + - Fix warnings related to tar file extraction on Python 3.12+ when + unpacking Python distributions for installation + - De-select Ruff rule E501 for the fmt command by default since it + conflicts with the formatter + - Fix colored output from build targets on the first run (build + environment creation status indicator issue) + - Set the packaging dependency version as >=23.2 to avoid its URL + validation which can conflict with context formatting + - Fix the exit code when there happens to be an unhandled exception + - No longer capture both stdout and stderr streams when parsing + metadata payloads from build environments + - Fix the README.md file template for new projects to avoid Markdown + linting issues +- 1.9.7: + - Limit the maximum version of virtualenv due to a backward + incompatible change + - Upgrade PyApp to 0.12.0 for binary builds + +------------------------------------------------------------------- +Wed Mar 27 02:59:47 UTC 2024 - Steve Kowalik + +- Add patch support-hatchling-1.22.patch: + * Support updates for the new Hatchling. +- Add missing BuildRequires on editables, required for tests. + +------------------------------------------------------------------- +Sun Mar 24 13:24:46 UTC 2024 - Dirk Müller + +- update to 1.9.4: + * Limit the maximum version of Hatchling in anticipation of + backward incompatible changes +- update to 1.9.3: + * Fix loading of local plugins to account for newly released + versions of a dependency +- update to 1.9.2: + * Fix the default token variable name for publishing to PyPI + +------------------------------------------------------------------- +Mon Dec 25 09:52:54 UTC 2023 - Ben Greiner + +- Update to 1.9.1 + * Ensure that the dependency_hash method of the environment + interface is called after sync_dependencies for cases where the + hash is only known at that point, such as for dependency + lockers + * Only acknowledge the HATCH_PYTHON_VARIANT_* environment + variables for Python resolution for supported platforms and + architectures + * Fix Python resolution when there are metadata hooks with + unsatisfied dependencies +- Unskip default platform tests gh#pypa/hatch#1145, but skip + error checker + +------------------------------------------------------------------- +Sun Dec 24 15:05:54 UTC 2023 - Ben Greiner + +- Update to 1.9.0 + ## Changed: + * Environments prefixed by hatch- are now considered internal and + used for special purposes such as configuration for static + analysis + ## Added: + * Enable docstring formatting by default for static analysis + * Allow for overriding config of internal environments + * Concretely state the expected API contract for the environment + interface methods find and check_compatibility + * Upgrade Ruff to 0.1.8 + * Bump the minimum supported version of Hatchling to 1.21.0 + ## Fixed: + * Ignore a project's Python requirement for environments where + the project is not installed + * When not persisting config for static analysis, properly manage + internal settings when Ruff's top level table already exists + * Ignore compatibility checks when environments have already been + created, significantly improving performance of environment + usage + * Properly allow overriding of the path option for the virtual + environment type + * Fix nushell activation on non-Windows systems +- Skip default platform tests on non x86_64 +- Stop using %{?python_enable_dependency_generator}: 15.x does + not generate the requirements and gloriously fails when testing + +------------------------------------------------------------------- +Mon Dec 18 20:27:19 UTC 2023 - Ben Greiner + +- Update to 1.8.1 + ## Fixed: + * Fix regression in calling subprocesses with updated PATH + * Fix automatic installation of environment plugins when running + as a standalone binary + * Change default location of Python installations +- Release 1.8.0 + ## Changed: + * Drop support for Python 3.7 + * The get_build_process method of the environment interface has + been removed; plugins should use the new run_builder method + instead + * Remove pyperclip dependency and the --copy flag of the config + find command + * When running the build command all output from builders is now + displayed as-is in real time without the stripping of ANSI + codes + * Version information (for Hatch itself) is now derived from Git + ## Added: + * Support Python 3.12 + * Add installers and standalone binaries + * Add the ability to manage Python installations + * Add fmt command + * The virtual environment type can now automatically download + requested versions of Python that are not installed + * Add dependency_hash method to the environment interface + * The state of installed dependencies for environments is saved + as metadata so if dependency definitions have not changed then + no checking is performed, which can be computationally + expensive + * The build command now supports backends other than Hatchling + * Allow the use of features for environments when skip-install is + enabled + * The default is now __TOKEN__ when prompting for a username for + the publish command + * Add a new run_builder method to the environment interface + * Bump the minimum supported version of Hatchling to 1.19.0 + * Bump the minimum supported version of click to 8.0.6 + ## Fixed: + * Fix nushell activation + * Better handling of flat storage directory hierarchies for the + virtual environment type + * Display useful information when running the version command + outside of a project rather than erroring + * Fix the project metadata command by only capturing stdout from + the backend + * Properly support Google Artifact Registry + * Fix parsing dependencies for environments when warnings are + emitted +- Drop patches + * CI.patch + * fix-sdist-target.patch + * hatch-pr828-pth-tests.patch + * packaging232.patch + +------------------------------------------------------------------- +Thu Nov 23 10:22:50 UTC 2023 - Markéta Machová + +- Add packaging232.patch to fix tests with recent packaging + +------------------------------------------------------------------- +Sat Oct 7 11:16:12 UTC 2023 - Matej Cepl + +- Remove superflous BR pytest plugins: randomly rerunfailures + +------------------------------------------------------------------- +Tue Sep 19 11:01:55 UTC 2023 - Markéta Machová + +- Add CI.patch to fix tests + +------------------------------------------------------------------- +Wed Jun 21 08:39:40 UTC 2023 - Ben Greiner + +- Add hatch-pr828-pth-tests.patch, gh#pypa/hatch#828 fixing + test failure with hatchling >= 1.17.1 + +------------------------------------------------------------------- +Sun Jun 11 08:38:31 UTC 2023 - ecsos + +- Add %{?sle15_python_module_pythons} + +------------------------------------------------------------------- +Wed May 10 16:07:25 UTC 2023 - Daniel Garcia + +- Add fix-sdist-target.patch to fix tests: gh#pypa/hatch@1b10663e645e + +------------------------------------------------------------------- +Fri May 5 10:45:53 UTC 2023 - Dirk Müller + +- update to 1.7.0: + * The `src-layout` project template option is now enabled by + default + * Non-critical output now goes to stderr + * Add `tool.hatch.env.requires` configuration to automatically + install dependencies for environment and environment + collector plugins + * Add `custom` environment collector + * Improve syncing of dependencies provided through Git direct + references + * Add `isolated_data_directory` attribute to the environment + interface + * Increase the timeout for and add retries to the `index` + publisher + * Expand home and environment variables in configured cache and + data directories + * Improve readability of exceptions + * Update project templates + * Bump the minimum supported version of Hatchling to 1.14.0 + * Fix displaying the version with the `version` command when + the version is static and build dependencies are unmet + * Fix build environments for the `virtual` environment type + when storing within a relative path + * Allow setuptools metadata migration for projects without + `setup.py` if `setup.cfg` is present + * Handle additional edge cases for setuptools metadata + migration + * Support boolean values for the `config set` command +- drop hatch-pr659-utf8.patch (upstream) + +------------------------------------------------------------------- +Fri Jan 6 16:17:06 UTC 2023 - Ben Greiner + +- Update to v1.6.3 + ## Fixed: + * Fix version command when the version is dynamic and build + dependencies are unmet +- Release 1.6.2 - 2022-10-20 + ## Fixed: + * Fix getting dynamic metadata from hooks for environments when + dependencies are not dynamic +- Release 1.6.1 - 2022-10-16 + ## Fixed: + * Computing the path to the user's home directory now gracefully + falls back to ~ when it cannot be determined +- Release 1.6.0 - 2022-10-08 + ## Changed: + * The run_shell_command environment interface method now accepts + arbitrary subprocess.Popen keyword arguments. This is not + strictly breaking, but will be utilized in upcoming features. + * The internal directory structure for storing virtual + environments is now more nested. This is not breaking, but any + local environments will be created anew. + ## Added: + * Add project command group to view details about the project + like PEP 621 metadata + * Better support for auto-detection of environments by tools like + Visual Studio Code now that the storage directory of virtual + environments will be flat if Hatch's configured virtual + environment directory resides somewhere within the project root + or if it is set to a .virtualenvs directory within the user's + home directory + * Build environments for the virtual environment type are now + cached for improved performance + * Add build_environment_exists method to the environment + interface for implementations that cache the build environment + * Add path option to the virtual environment type + * Add --initialize-auth flag to the index publisher to allow for + the saving of authentication information before publishing + * Support Bash on Windows for the shell command + * The setuptools migration script no longer modifies the + formatting of existing pyproject.toml configuration + * Bump the minimum supported version of Hatchling to 1.11.0 + ## Fixed: + * Environments now respect dynamically defined project + dependencies + * The dep hash and all dep show commands now respect dynamically + defined project dependencies + * The env show, dep hash, and all dep show commands now honor + context formatting + * Fix matrix variable inclusion filtering of the run and env run + commands when there are multiple possible variables + * Build environment compatibility is now checked before use + * Decreasing verbosity now has no affect on output that should + always be displayed + * Handle more edge cases in the setuptools migration script + * Environments now respect user defined environment variables for + context formatting + * Update the scripts in the generated test environment template + for new projects to reflect the documentation + * Allow extra-dependencies in environment overrides + * Depend on packaging explicitly rather than relying on it being + a transitive dependency of Hatchling +- Release 1.5.0 - 2022-08-28 + ## Added: + * The index publisher now recognizes repository-specific options + * Add the --ignore-compat flag to the env run command + * Setting the HATCH_PYTHON environment variable to self will now + force the use of the Python executable Hatch is running on for + virtual environment creation + ## Fixed: + * Fix the --force-continue flag of the env run command + * Handle more edge cases in the setuptools migration script +- Release 1.4.2 - 2022-08-16 + ## Fixed: + * Fix check for updating static versions with the version command + when metadata hooks are in use +- Release 1.4.1 - 2022-08-13 + ## Fixed: + * Fix non-detached inheritance disabling for environments +- Release 1.4.0 - 2022-08-06 + ## Added: + * The default Python for virtual environments now checks PATH + before using the one Hatch is running on + * Values for environment env-vars now support context formatting + * Add name override for environments to allow for regular + expression matching + * The index publisher now better supports non-PyPI indices + * Add certificate options to the index publisher + * Display waiting text when checking dependencies and removing + environments + * Display help text the first time the shell command is executed + * Update project templates with Python 3.11 and the latest + versions of various GitHub Actions + * Add support for Almquist (ash) shells + * Add hyperlink as a dependency for better handling of package + index URLs + * Bump the minimum supported version of virtualenv to 20.16.2 + * Bump the minimum supported version of tomlkit to 0.11.1 + ## Fixed: + * Acknowledge extra-dependencies for the env show command + * Fix locating executables within virtual environments on Debian + * Fix managing the terminal size inside the shell command + * Fix default code coverage file omission for the src-layout + project template option +- Release 1.3.1 - 2022-07-11 + ## Fixed: + * Support -h/--help flag for the run command +- Release 1.3.0 - 2022-07-10 + ## Changed: + * Rename the default publishing plugin from pypi to the more + generic index + ## Added: + * Support the absence of pyproject.toml files, as is the case for + apps and non-Python projects + * Hide scripts that start with an underscore for the env show + command by default + * Ignoring the exit codes of commands by prefixing with hyphens + now works with entire named scripts + * Add a way to require confirmation for publishing + * Add --force-continue flag to the env run command + * Make tracebacks colorful and less verbose + * When shell configuration has not been defined, attempt to use + the current shell based on parent processes before resorting to + the defaults + * The shell name pwsh is now an alias for powershell + * Remove atomicwrites dependency + * Relax constraint on userpath dependency + * Bump the minimum supported version of Hatchling to 1.4.1 + ## Fixed: + * Keep environments in sync with the dependencies of the selected + features + * Use utf-8 for all files generated for new projects + * Escape special characters Git may return in the user name when + writing generated files for new projects + * Normalize the package name to lowercase in setuptools migration + script + * Fix parsing of source distributions during publishing +- Release 1.2.1 - 2022-05-30 + ## Fixed: + * Fix handling of top level data_files in setuptools migration + script +- Release 1.2.0 - 2022-05-22 + ## Changed: + * The enter_shell environment plugin method now accepts an + additional args parameter + ## Added: + * Allow context string formatting for environment dependencies + * Add environment context string formatting fields env_name, + env_type, matrix, verbosity, and args + * Support overriding the default arguments used to spawn shells + on non-Windows systems + * Bump the minimum supported version of Hatchling to 1.3.0 + ## Fixed: + * Improve setuptools migration script +- Release 1.1.2 - 2022-05-20 + ## Fixed: + * Bump the minimum supported version of Hatchling to 1.2.0 + * Update project metadata to reflect support for Python 3.11 +- Release 1.1.1 - 2022-05-12 + ## Fixed: + * Fix setuptools migration script for non-Windows systems +- Release 1.1.0 - 2022-05-12 + ## Changed: + * In order to simplify the implementation of command execution + for environment plugins, the run_shell_commands method has been + replaced by the singular run_shell_command. A new + command_context method has been added to more easily satisfy + complex use cases. + * The finalize_command environment plugin method has been removed + in favor of the newly introduced context formatting + functionality. + ## Added: + * Add context formatting functionality i.e. the ability to insert + values into configuration like environment variables and + command line arguments + * Any verbosity for command execution will now always display + headers, even for single environments + * Every executed command is now displayed when running multiple + commands or when verbosity is enabled + * Similar to make, ignore the exit code of executed commands that + start with - (a hyphen) + * Add ability for the --init flag of the new command to + automatically migrate setuptools configuration + * Update project metadata to reflect the adoption by PyPA and + production stability +- Release 1.0.0 - 2022-04-28 + * This is the first stable release of Hatch v1, a complete + rewrite. Enjoy! +- Use python dependency generator, check in multibuild +- Add hatch-pr659-utf8.patch for compatibility with new hatchling + (gh#pypa/hatch#659). + +------------------------------------------------------------------- +Mon Jun 8 11:01:18 UTC 2020 - Tomáš Chvátal + +- Testsuite is too flaky, just skip the stuff overall unless someone + invests more time into it + +------------------------------------------------------------------- +Wed Jun 3 08:08:21 UTC 2020 - Tomáš Chvátal + +- Skip more flaky tests + +------------------------------------------------------------------- +Mon May 25 10:59:15 UTC 2020 - Petr Gajdos + +- %python3_only -> %python_alternative + +------------------------------------------------------------------- +Sun Apr 5 07:19:23 UTC 2020 - Tomáš Chvátal + +- Skip flaky test + +------------------------------------------------------------------- +Wed Dec 11 12:00:14 UTC 2019 - Tomáš Chvátal + +- Update to 0.23.0: + * fixes wheel packaging a bit + +------------------------------------------------------------------- +Mon Oct 21 09:42:14 UTC 2019 - John Vandenberg + +- Update to v0.22.0, dropping merged patches + +------------------------------------------------------------------- +Sat Oct 12 13:49:07 UTC 2019 - John Vandenberg + +- Activate test suite +- Add patch 38ca5de2.patch and update-userpath.patch to support + using latest python-userpath instead of unmaintained python-adduserpath +- Add unmerged fixes in upstream pull requests: + * pr_59.patch: Add decorator to tests which require internet connection + * pr_60.patch: Avoid installing tests as a package + * pr_62.patch: Fixed bad encoding for Python 3.7 + +------------------------------------------------------------------- +Thu Aug 2 19:17:22 UTC 2018 - aboe76@gmail.com + +- Update to v0.20.0 + +------------------------------------------------------------------- +Mon Sep 11 07:39:28 UTC 2017 - thomas.schraitle@suse.com + +- First public version 0.9.1 diff --git a/python-hatch.spec b/python-hatch.spec new file mode 100644 index 0000000..4f2cf8b --- /dev/null +++ b/python-hatch.spec @@ -0,0 +1,166 @@ +# +# spec file for package python-hatch +# +# Copyright (c) 2025 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%global flavor @BUILD_FLAVOR@%{nil} +%if "%{flavor}" == "test" +%define psuffix -test +%bcond_without test +%else +%define psuffix %{nil} +%bcond_with test +%endif +%if 0%{?suse_version} > 1500 +%bcond_without libalternatives +%else +%bcond_with libalternatives +%endif +%{?sle15_python_module_pythons} +Name: python-hatch%{psuffix} +Version: 1.14.1 +Release: 0 +Summary: Modern, extensible Python project management +License: MIT +URL: https://hatch.pypa.io/latest/ +# SourceRepository: https://github.com/pypa/hatch +Source: https://github.com/pypa/hatch/archive/refs/tags/hatch-v%{version}.tar.gz +# PATCH-FIX-UPSTREAM fix-with-latest-hatchling.patch gh#f8a2eaa gh#28f233c gh#fc25690 +Patch0: fix-with-latest-hatchling.patch +# PATCH-FIX-UPSTREAM click-8.2.patch gh#pypa/hatch#2013 +Patch1: click-8.2.patch +BuildRequires: %{python_module base >= 3.8} +BuildRequires: %{python_module hatch-vcs >= 0.3} +BuildRequires: %{python_module hatchling >= 1.26.3} +BuildRequires: %{python_module pip} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +Requires: git-core +Requires: python-click >= 8.0.6 +Requires: python-hatchling >= 1.21.0 +Requires: python-httpx >= 0.22.0 +Requires: python-hyperlink >= 21.0.0 +Requires: python-keyring >= 23.5.0 +Requires: python-packaging >= 21.3 +Requires: python-platformdirs >= 2.5.0 +Requires: python-rich >= 11.2.0 +Requires: python-shellingham >= 1.4.0 +Requires: python-tomli-w >= 1.0 +Requires: python-tomlkit >= 0.11.1 +Requires: python-virtualenv >= 20.16.2 +Requires: python-zstandard < 1 +Requires: uv +Requires: (python-pexpect >= 4.8 with python-pexpect < 5) +Requires: (python-userpath >= 1.7 with python-userpath < 2) +%if %{with libalternatives} +BuildRequires: alts +Requires: alts +%else +Requires(post): update-alternatives +Requires(postun): update-alternatives +%endif +%if %{with test} +BuildRequires: %{python_module editables} +BuildRequires: %{python_module filelock >= 3.7.1} +BuildRequires: %{python_module hatch = %{version}} +BuildRequires: %{python_module pyfakefs} +BuildRequires: %{python_module pytest-mock} +BuildRequires: %{python_module pytest-xdist} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module trustme} +BuildRequires: cargo +BuildRequires: uv +%else +BuildArch: noarch +%endif +%python_subpackages + +%description +Hatch is a modern, extensible Python project manager. + +Features + * Standardized build system with reproducible builds by default + * Robust environment management with support for custom scripts + * Easy publishing to PyPI or other indexes + * Version management + * Configurable project generation with sane defaults + * Responsive CLI, ~2-3x faster than equivalent tools + +%prep +%autosetup -p1 -n hatch-hatch-v%{version} + +%build +%if !%{with test} +%pyproject_wheel +%endif + +%install +%if !%{with test} +%pyproject_install +%python_clone -a %{buildroot}%{_bindir}/hatch +%python_expand %fdupes %{buildroot}%{$python_sitelib} +%endif + +%if %{with test} +%check +export LANG=en_US.UTF-8 +# tests expect this to be unset and use their own reproducible value. Nothing installed from here. +# https://hatch.pypa.io/latest/config/build/#reproducible-builds +unset SOURCE_DATE_EPOCH +# finds bash instead of expected sh as default shell inside obs +donttest="(test_install and test_already_installed_update_prompt)" +donttest="$donttest or (test_install and test_already_installed_update_flag)" +donttest="$donttest or (test_install and test_all)" +# platform distribution selection errors: https://github.com/pypa/hatch/issues/1145 +%ifnarch x86_64 +donttest="$donttest or (test_resolve and test_resolution_error)" +donttest+=" or test_custom_source or test_pypy_custom" +%endif +%ifarch s390x +# Console width different +donttest="$donttest or test_context_formatting" +%endif + +# Requires network +donttest+=" or test_uv_env" +# Fails with python 3.12 +donttest+=" or test_pyenv or test_no_open or test_open" +# Fails with hatchling >= 1.26 + +# Ignore test_build.py it fails because output format difference. +# https://github.com/pypa/hatch/commit/e843c42da2e71468b519a3aacdfeab31b14985a3 +%pytest -v -k "not ($donttest)" --ignore tests/cli/build/test_build.py +%endif + +%post +%python_install_alternative hatch + +%postun +%python_uninstall_alternative hatch + +%pre +%python_libalternatives_reset_alternative hatch + +%if !%{with test} +%files %{python_files} +%doc README.md +%license LICENSE.txt +%python_alternative %{_bindir}/hatch +%{python_sitelib}/hatch +%{python_sitelib}/hatch-%{version}.dist-info +%endif + +%changelog diff --git a/support-hatchling-1.22.patch b/support-hatchling-1.22.patch new file mode 100644 index 0000000..fa5a7c9 --- /dev/null +++ b/support-hatchling-1.22.patch @@ -0,0 +1,54 @@ +Index: hatch-hatch-v1.9.4/tests/backend/builders/test_wheel.py +=================================================================== +--- hatch-hatch-v1.9.4.orig/tests/backend/builders/test_wheel.py ++++ hatch-hatch-v1.9.4/tests/backend/builders/test_wheel.py +@@ -161,15 +161,18 @@ class TestDefaultFileSelection: + ValueError, + match=( + 'Unable to determine which files to ship inside the wheel using the following heuristics: ' +- 'https://hatch.pypa.io/latest/plugins/builder/wheel/#default-file-selection\n\nAt least one ' +- 'file selection option must be defined in the `tool.hatch.build.targets.wheel` table, see: ' +- 'https://hatch.pypa.io/latest/config/build/\n\nAs an example, if you intend to ship a ' +- 'directory named `foo` that resides within a `src` directory located at the root of your ' +- 'project, you can define the following:\n\n\\[tool.hatch.build.targets.wheel\\]\n' ++ 'https://hatch.pypa.io/latest/plugins/builder/wheel/#default-file-selection\n\n' ++ 'The most likely cause of this is that there is no directory that matches the name of your ' ++ 'project \\(my_app\\).\n\n' ++ 'At least one file selection option must be defined in the `tool.hatch.build.targets.wheel` ' ++ 'table, see: https://hatch.pypa.io/latest/config/build/\n\n' ++ 'As an example, if you intend to ship a directory named `foo` that resides within a `src` ' ++ 'directory located at the root of your project, you can define the following:\n\n' ++ '\\[tool.hatch.build.targets.wheel\\]\n' + 'packages = \\["src/foo"\\]' + ), + ): +- _ = method() ++ method() + + def test_bypass_selection_option(self, temp_dir): + config = { +Index: hatch-hatch-v1.9.4/tests/backend/builders/plugin/test_interface.py +=================================================================== +--- hatch-hatch-v1.9.4.orig/tests/backend/builders/plugin/test_interface.py ++++ hatch-hatch-v1.9.4/tests/backend/builders/plugin/test_interface.py +@@ -62,7 +62,7 @@ class TestMetadata: + config = {'project': {}} + builder = MockBuilder(str(isolation), config=config) + +- assert builder.project_config is builder.project_config is config['project'] ++ assert builder.project_config == builder.project_config == config['project'] + + def test_hatch(self, isolation): + config = {'tool': {'hatch': {}}} +Index: hatch-hatch-v1.9.4/tests/backend/metadata/test_core.py +=================================================================== +--- hatch-hatch-v1.9.4.orig/tests/backend/metadata/test_core.py ++++ hatch-hatch-v1.9.4/tests/backend/metadata/test_core.py +@@ -84,7 +84,6 @@ class TestDynamic: + dynamic = ['version'] + metadata = ProjectMetadata(str(isolation), None, {'project': {'dynamic': dynamic}}) + +- assert metadata.core.dynamic is dynamic + assert metadata.core.dynamic == ['version'] + + def test_cache_not_array(self, isolation):