Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-hatchling for openSUSE:Factory checked in at 2022-09-16 13:32:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-hatchling (Old) and /work/SRC/openSUSE:Factory/.python-hatchling.new.2083 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-hatchling" Fri Sep 16 13:32:02 2022 rev:8 rq:1003720 version:1.9.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-hatchling/python-hatchling.changes 2022-08-27 11:48:19.453615463 +0200 +++ /work/SRC/openSUSE:Factory/.python-hatchling.new.2083/python-hatchling.changes 2022-09-16 13:32:21.673272665 +0200 @@ -1,0 +2,25 @@ +Tue Sep 13 20:05:14 UTC 2022 - Beno??t Monin <benoit.mo...@gmx.fr> + +- update to version 1.9.0: + * Changed: + + File pattern matching now more closely resembles Git's + behavior + * Added: + + Implement a minimal version of + prepare_metadata_for_build_wheel and + prepare_metadata_for_build_editable for non-frontend tools + that only need to inspect a project's metadata + + Add metadata command to view PEP 621 project metadata + + Improve error messages for SPDX license errors + + Retroactively support License-File for core metadata starting + at version 2.1 + + Bump the minimum supported version of pathspec to 0.10.1 + * Fixed: + + Allow the valid non-SPDX license values + LicenseRef-Public-Domain and LicenseRef-Proprietary + + Show the help text of the CLI when no subcommand is selected +- requires python-base to set the minimum python version, -devel is + not needed +- requires pathspec >= 0.10.1 + +------------------------------------------------------------------- Old: ---- hatchling-1.8.1.tar.gz New: ---- hatchling-1.9.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-hatchling.spec ++++++ --- /var/tmp/diff_new_pack.JAfiJI/_old 2022-09-16 13:32:22.117274099 +0200 +++ /var/tmp/diff_new_pack.JAfiJI/_new 2022-09-16 13:32:22.121274112 +0200 @@ -19,17 +19,17 @@ %define skip_python2 1 %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-hatchling -Version: 1.8.1 +Version: 1.9.0 Release: 0 Summary: Build backend used by Hatch License: MIT URL: https://hatch.pypa.io/latest/ Source0: https://files.pythonhosted.org/packages/source/h/hatchling/hatchling-%{version}.tar.gz -BuildRequires: %{python_module devel >= 3.7} +BuildRequires: %{python_module base >= 3.7} BuildRequires: %{python_module editables >= 0.3} BuildRequires: %{python_module importlib-metadata if %python-base < 3.8} BuildRequires: %{python_module packaging >= 21.3} -BuildRequires: %{python_module pathspec >= 0.9} +BuildRequires: %{python_module pathspec >= 0.10.1} BuildRequires: %{python_module pip} BuildRequires: %{python_module pluggy >= 1.0.0} BuildRequires: %{python_module tomli >= 1.2.2 if %python-base < 3.11} @@ -37,7 +37,7 @@ BuildRequires: python-rpm-macros Requires: python-editables >= 0.3 Requires: python-packaging >= 21.3 -Requires: python-pathspec >= 0.9 +Requires: python-pathspec >= 0.10.1 Requires: python-pluggy >= 1.0.0 Requires(post): update-alternatives Requires(postun):update-alternatives ++++++ hatchling-1.8.1.tar.gz -> hatchling-1.9.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/PKG-INFO new/hatchling-1.9.0/PKG-INFO --- old/hatchling-1.8.1/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: hatchling -Version: 1.8.1 +Version: 1.9.0 Summary: Modern, extensible Python build backend Project-URL: Homepage, https://hatch.pypa.io/latest/ Project-URL: Sponsor, https://github.com/sponsors/ofek @@ -8,6 +8,7 @@ Project-URL: Tracker, https://github.com/pypa/hatch/issues Project-URL: Source, https://github.com/pypa/hatch/tree/master/backend Author-email: Ofek Lev <o...@ofek.dev> +License-File: LICENSE.txt Keywords: build,hatch,packaging Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -27,7 +28,7 @@ Requires-Dist: editables>=0.3 Requires-Dist: importlib-metadata; python_version < '3.8' Requires-Dist: packaging>=21.3 -Requires-Dist: pathspec>=0.9 +Requires-Dist: pathspec>=0.10.1 Requires-Dist: pluggy>=1.0.0 Requires-Dist: tomli>=1.2.2; python_version < '3.11' Description-Content-Type: text/markdown diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/__about__.py new/hatchling-1.9.0/src/hatchling/__about__.py --- old/hatchling-1.8.1/src/hatchling/__about__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/__about__.py 2020-02-02 01:00:00.000000000 +0100 @@ -1 +1 @@ -__version__ = '1.8.1' +__version__ = '1.9.0' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/build.py new/hatchling-1.9.0/src/hatchling/build.py --- old/hatchling-1.8.1/src/hatchling/build.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/build.py 2020-02-02 01:00:00.000000000 +0100 @@ -31,6 +31,24 @@ return builder.config.dependencies +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + """ + https://peps.python.org/pep-0517/#prepare-metadata-for-build-wheel + """ + from hatchling.builders.wheel import WheelBuilder + + builder = WheelBuilder(os.getcwd()) + + directory = os.path.join(metadata_directory, f'{builder.artifact_project_id}.dist-info') + if not os.path.isdir(directory): + os.mkdir(directory) + + with open(os.path.join(directory, 'METADATA'), 'w', encoding='utf-8') as f: + f.write(builder.config.core_metadata_constructor(builder.metadata)) + + return os.path.basename(directory) + + def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): """ https://peps.python.org/pep-0517/#build-wheel @@ -51,6 +69,28 @@ return builder.config.dependencies +def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): + """ + https://peps.python.org/pep-0660/#prepare-metadata-for-build-editable + """ + from hatchling.builders.wheel import EDITABLES_MINIMUM_VERSION, WheelBuilder + + builder = WheelBuilder(os.getcwd()) + + directory = os.path.join(metadata_directory, f'{builder.artifact_project_id}.dist-info') + if not os.path.isdir(directory): + os.mkdir(directory) + + extra_dependencies = [] + if not builder.config.dev_mode_dirs and builder.config.dev_mode_exact: + extra_dependencies.append(f'editables~={EDITABLES_MINIMUM_VERSION}') + + with open(os.path.join(directory, 'METADATA'), 'w', encoding='utf-8') as f: + f.write(builder.config.core_metadata_constructor(builder.metadata, extra_dependencies=extra_dependencies)) + + return os.path.basename(directory) + + def build_editable(wheel_directory, config_settings=None, metadata_directory=None): """ https://peps.python.org/pep-0660/#build-editable diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/builders/config.py new/hatchling-1.9.0/src/hatchling/builders/config.py --- old/hatchling-1.8.1/src/hatchling/builders/config.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/builders/config.py 2020-02-02 01:00:00.000000000 +0100 @@ -25,7 +25,7 @@ self.__force_include = None self.__vcs_exclusion_files = None - # Possible pathspec.PathSpec + # Possible pathspec.GitIgnoreSpec self.__include_spec = None self.__exclude_spec = None self.__artifact_spec = None @@ -151,9 +151,7 @@ all_include_patterns.append(f"/{relative_path.replace(os.sep, '/')}/") if all_include_patterns: - self.__include_spec = pathspec.PathSpec.from_lines( - pathspec.patterns.GitWildMatchPattern, all_include_patterns - ) + self.__include_spec = pathspec.GitIgnoreSpec.from_lines(all_include_patterns) self.__include_patterns = all_include_patterns @@ -187,9 +185,7 @@ all_exclude_patterns.extend(self.load_vcs_exclusion_patterns()) if all_exclude_patterns: - self.__exclude_spec = pathspec.PathSpec.from_lines( - pathspec.patterns.GitWildMatchPattern, all_exclude_patterns - ) + self.__exclude_spec = pathspec.GitIgnoreSpec.from_lines(all_exclude_patterns) self.__exclude_patterns = all_exclude_patterns @@ -220,9 +216,7 @@ all_artifact_patterns.append(artifact_pattern) if all_artifact_patterns: - self.__artifact_spec = pathspec.PathSpec.from_lines( - pathspec.patterns.GitWildMatchPattern, all_artifact_patterns - ) + self.__artifact_spec = pathspec.GitIgnoreSpec.from_lines(all_artifact_patterns) self.__artifact_patterns = all_artifact_patterns @@ -808,9 +802,7 @@ # Include anything the hooks indicate build_artifacts = build_data['artifacts'] if build_artifacts: - self.build_artifact_spec = pathspec.PathSpec.from_lines( - pathspec.patterns.GitWildMatchPattern, build_artifacts - ) + self.build_artifact_spec = pathspec.GitIgnoreSpec.from_lines(build_artifacts) self.build_force_include.update(normalize_inclusion_map(build_data['force_include'], self.root)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/builders/wheel.py new/hatchling-1.9.0/src/hatchling/builders/wheel.py --- old/hatchling-1.8.1/src/hatchling/builders/wheel.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/builders/wheel.py 2020-02-02 01:00:00.000000000 +0100 @@ -21,11 +21,6 @@ ) from hatchling.metadata.spec import DEFAULT_METADATA_VERSION, get_core_metadata_constructors -try: - from editables import EditableProject -except ImportError: # no cov - EditableProject = None - EDITABLES_MINIMUM_VERSION = '0.3' @@ -335,6 +330,8 @@ return self.build_editable_detection(directory, **build_data) def build_editable_detection(self, directory, **build_data): + from editables import EditableProject + build_data['tag'] = self.get_default_tag() with WheelArchive(self.artifact_project_id, self.config.reproducible) as archive, closing( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/cli/__init__.py new/hatchling-1.9.0/src/hatchling/cli/__init__.py --- old/hatchling-1.8.1/src/hatchling/cli/__init__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/cli/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -2,19 +2,25 @@ from hatchling.cli.build import build_command from hatchling.cli.dep import dep_command +from hatchling.cli.metadata import metadata_command from hatchling.cli.version import version_command def hatchling(): parser = argparse.ArgumentParser(prog='hatchling', allow_abbrev=False) - subparsers = parser.add_subparsers(required=True) + subparsers = parser.add_subparsers() defaults = {'metavar': ''} build_command(subparsers, defaults) dep_command(subparsers, defaults) + metadata_command(subparsers, defaults) version_command(subparsers, defaults) kwargs = vars(parser.parse_args()) - command = kwargs.pop('func') - command(**kwargs) + try: + command = kwargs.pop('func') + except KeyError: + parser.print_help() + else: + command(**kwargs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/cli/metadata/__init__.py new/hatchling-1.9.0/src/hatchling/cli/metadata/__init__.py --- old/hatchling-1.8.1/src/hatchling/cli/metadata/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/cli/metadata/__init__.py 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,47 @@ +import argparse + + +def metadata_impl(called_by_app, field, compact): + import json + import os + + from hatchling.bridge.app import get_application + from hatchling.metadata.core import ProjectMetadata + from hatchling.metadata.utils import resolve_metadata_fields + from hatchling.plugin.manager import PluginManager + + app = get_application(called_by_app) + + root = os.getcwd() + plugin_manager = PluginManager() + project_metadata = ProjectMetadata(root, plugin_manager) + + metadata = resolve_metadata_fields(project_metadata) + if field: # no cov + if field not in metadata: + app.abort(f'Unknown metadata field: {field}') + elif field == 'readme': + app.display_info(metadata[field]['text']) + elif isinstance(metadata[field], str): + app.display_info(metadata[field]) + else: + app.display_info(json.dumps(metadata[field], indent=4)) + + return + + for key, value in list(metadata.items()): + if not value: + metadata.pop(key) + + if compact: + app.display_info(json.dumps(metadata, separators=(',', ':'))) + else: # no cov + app.display_info(json.dumps(metadata, indent=4)) + + +def metadata_command(subparsers, defaults): + parser = subparsers.add_parser('metadata') + parser.add_argument('field', nargs='?') + parser.add_argument('-c', '--compact', action='store_true') + parser.add_argument('--app', dest='called_by_app', action='store_true', help=argparse.SUPPRESS) + parser.set_defaults(func=metadata_impl) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/dep/core.py new/hatchling-1.9.0/src/hatchling/dep/core.py --- old/hatchling-1.8.1/src/hatchling/dep/core.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/dep/core.py 2020-02-02 01:00:00.000000000 +0100 @@ -4,10 +4,10 @@ from packaging.markers import default_environment from packaging.requirements import Requirement -try: +if sys.version_info >= (3, 8): from importlib.metadata import Distribution, DistributionFinder -except ImportError: # no cov - from importlib_metadata import Distribution, DistributionFinder # type: ignore +else: + from importlib_metadata import Distribution, DistributionFinder class DistributionCache: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/licenses/parse.py new/hatchling-1.9.0/src/hatchling/licenses/parse.py --- old/hatchling-1.8.1/src/hatchling/licenses/parse.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/licenses/parse.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,13 +1,28 @@ from hatchling.licenses.supported import EXCEPTIONS, LICENSES -def normalize_license_expression(license_expression): - if not license_expression: - return license_expression +def get_valid_licenses(): + valid_licenses = LICENSES.copy() + + # https://peps.python.org/pep-0639/#should-custom-license-identifiers-be-allowed + public_license = 'LicenseRef-Public-Domain' + valid_licenses[public_license.lower()] = {'id': public_license, 'deprecated': False} + + proprietary_license = 'LicenseRef-Proprietary' + valid_licenses[proprietary_license.lower()] = {'id': proprietary_license, 'deprecated': False} + + return valid_licenses + + +def normalize_license_expression(raw_license_expression): + if not raw_license_expression: + return raw_license_expression + + valid_licenses = get_valid_licenses() # First normalize to lower case so we can look up licenses/exceptions # and so boolean operators are Python-compatible - license_expression = license_expression.lower() + license_expression = raw_license_expression.lower() # Then pad parentheses so tokenization can be achieved by merely splitting on white space license_expression = license_expression.replace('(', ' ( ').replace(')', ' ) ') @@ -25,7 +40,7 @@ elif token == 'with': python_tokens.append('or') elif token == '(' and python_tokens and python_tokens[-1] not in ('or', 'and'): - raise ValueError('Invalid license expression') + raise ValueError(f'invalid license expression: {raw_license_expression}') else: python_tokens.append(token) @@ -33,7 +48,7 @@ try: assert eval(python_expression) is False except Exception: - raise ValueError('Invalid license expression') + raise ValueError(f'invalid license expression: {raw_license_expression}') from None # Take a final pass to check for unknown licenses/exceptions normalized_tokens = [] @@ -44,7 +59,8 @@ if normalized_tokens and normalized_tokens[-1] == 'WITH': if token not in EXCEPTIONS: - raise ValueError(f'Unknown license exception: {token}') + raise ValueError(f'unknown license exception: {token}') + normalized_tokens.append(EXCEPTIONS[token]['id']) else: if token.endswith('+'): @@ -53,10 +69,10 @@ else: suffix = '' - if token not in LICENSES: - raise ValueError(f'Unknown license: {token}') + if token not in valid_licenses: + raise ValueError(f'unknown license: {token}') - normalized_tokens.append(LICENSES[token]['id'] + suffix) + normalized_tokens.append(valid_licenses[token]['id'] + suffix) # Construct the normalized expression normalized_expression = ' '.join(normalized_tokens) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/metadata/core.py new/hatchling-1.9.0/src/hatchling/metadata/core.py --- old/hatchling-1.8.1/src/hatchling/metadata/core.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/metadata/core.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,14 +1,15 @@ import os +import sys from copy import deepcopy from hatchling.metadata.utils import get_normalized_dependency, is_valid_project_name, normalize_project_name from hatchling.utils.constants import DEFAULT_CONFIG_FILE from hatchling.utils.fs import locate_file -try: +if sys.version_info >= (3, 11): import tomllib -except ImportError: - import tomli as tomllib # type: ignore +else: + import tomli as tomllib def load_toml(path): @@ -26,6 +27,8 @@ self._core = None self._hatch = None + self._core_raw_metadata = None + self._name = None self._version = None self._project_file = None @@ -47,6 +50,33 @@ return self._context @property + def core_raw_metadata(self): + if self._core_raw_metadata is None: + if 'project' not in self.config: + raise ValueError('Missing `project` metadata table in configuration') + + core_raw_metadata = self.config['project'] + if not isinstance(core_raw_metadata, dict): + raise TypeError('The `project` configuration must be a table') + + self._core_raw_metadata = core_raw_metadata + + return self._core_raw_metadata + + @property + def name(self): + # Duplicate the name parsing here for situations where it's + # needed but metadata plugins might not be available + if self._name is None: + name = self.core_raw_metadata.get('name', '') + if not name: + raise ValueError('Missing required field `project.name`') + + self._name = normalize_project_name(name) + + return self._name + + @property def version(self): """ https://peps.python.org/pep-0621/#version @@ -82,27 +112,20 @@ @property def core(self): if self._core is None: - if 'project' not in self.config: - raise ValueError('Missing `project` metadata table in configuration') - - core_metadata = self.config['project'] - if not isinstance(core_metadata, dict): - raise TypeError('The `project` configuration must be a table') - - metadata = CoreMetadata(self.root, core_metadata, self.hatch.metadata, self.context) + metadata = CoreMetadata(self.root, self.core_raw_metadata, self.hatch.metadata, self.context) metadata_hooks = self.hatch.metadata.hooks if metadata_hooks: - static_fields = set(core_metadata) + static_fields = set(self.core_raw_metadata) if 'version' in self.hatch.config: self._set_version(metadata) - core_metadata['version'] = self.version + self.core_raw_metadata['version'] = self.version for metadata_hook in metadata_hooks.values(): - metadata_hook.update(core_metadata) + metadata_hook.update(self.core_raw_metadata) metadata.add_known_classifiers(metadata_hook.get_known_classifiers()) - new_fields = set(core_metadata) - static_fields + new_fields = set(self.core_raw_metadata) - static_fields for new_field in new_fields: if new_field in metadata.dynamic: metadata.dynamic.remove(new_field) @@ -537,7 +560,11 @@ elif isinstance(data, str): from hatchling.licenses.parse import normalize_license_expression - self._license_expression = normalize_license_expression(data) + try: + self._license_expression = normalize_license_expression(data) + except ValueError as e: + raise ValueError(f'Error parsing field `project.license` - {e}') from None + self._license = '' elif isinstance(data, dict): if 'file' in data and 'text' in data: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/metadata/spec.py new/hatchling-1.9.0/src/hatchling/metadata/spec.py --- old/hatchling-1.8.1/src/hatchling/metadata/spec.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/metadata/spec.py 2020-02-02 01:00:00.000000000 +0100 @@ -110,6 +110,10 @@ else: metadata_file += f'{indent}{line}\n' + if metadata.core.license_files: + for license_file in metadata.core.license_files: + metadata_file += f'License-File: {license_file}\n' + if metadata.core.keywords: metadata_file += f"Keywords: {','.join(metadata.core.keywords)}\n" @@ -182,6 +186,10 @@ else: metadata_file += f'{indent}{line}\n' + if metadata.core.license_files: + for license_file in metadata.core.license_files: + metadata_file += f'License-File: {license_file}\n' + if metadata.core.keywords: metadata_file += f"Keywords: {','.join(metadata.core.keywords)}\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/metadata/utils.py new/hatchling-1.9.0/src/hatchling/metadata/utils.py --- old/hatchling-1.8.1/src/hatchling/metadata/utils.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/metadata/utils.py 2020-02-02 01:00:00.000000000 +0100 @@ -27,3 +27,25 @@ # All TOML writers use double quotes, so allow direct writing or copy/pasting to avoid escaping return str(requirement).replace('"', "'") + + +def resolve_metadata_fields(metadata): + # https://packaging.python.org/en/latest/specifications/declaring-project-metadata/ + return { + 'name': metadata.core.name, + 'version': metadata.version, + 'description': metadata.core.description, + 'readme': {'content-type': metadata.core.readme_content_type, 'text': metadata.core.readme}, + 'requires-python': metadata.core.requires_python, + 'license': metadata.core.license_expression or metadata.core.license, + 'authors': metadata.core.authors, + 'maintainers': metadata.core.maintainers, + 'keywords': metadata.core.keywords, + 'classifiers': metadata.core.classifiers, + 'urls': metadata.core.urls, + 'scripts': metadata.core.scripts, + 'gui-scripts': metadata.core.gui_scripts, + 'entry-points': metadata.core.entry_points, + 'dependencies': metadata.core.dependencies, + 'optional-dependencies': metadata.core.optional_dependencies, + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.8.1/src/hatchling/ouroboros.py new/hatchling-1.9.0/src/hatchling/ouroboros.py --- old/hatchling-1.8.1/src/hatchling/ouroboros.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.9.0/src/hatchling/ouroboros.py 2020-02-02 01:00:00.000000000 +0100 @@ -36,7 +36,7 @@ 'editables>=0.3', 'importlib-metadata; python_version < "3.8"', 'packaging>=21.3', - 'pathspec>=0.9', + 'pathspec>=0.10.1', 'pluggy>=1.0.0', 'tomli>=1.2.2; python_version < "3.11"', ], @@ -95,8 +95,48 @@ return CONFIG['project']['dependencies'] +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + """ + https://peps.python.org/pep-0517/#prepare-metadata-for-build-wheel + """ + from hatchling.builders.wheel import WheelBuilder + + builder = WheelBuilder(os.getcwd(), config=CONFIG) + + directory = os.path.join(metadata_directory, f'{builder.artifact_project_id}.dist-info') + if not os.path.isdir(directory): + os.mkdir(directory) + + with open(os.path.join(directory, 'METADATA'), 'w', encoding='utf-8') as f: + f.write(builder.config.core_metadata_constructor(builder.metadata)) + + return os.path.basename(directory) + + def get_requires_for_build_editable(config_settings=None): """ https://peps.python.org/pep-0660/#get-requires-for-build-editable """ return CONFIG['project']['dependencies'] + + +def prepare_metadata_for_build_editable(metadata_directory, config_settings=None): + """ + https://peps.python.org/pep-0660/#prepare-metadata-for-build-editable + """ + from hatchling.builders.wheel import EDITABLES_MINIMUM_VERSION, WheelBuilder + + builder = WheelBuilder(os.getcwd(), config=CONFIG) + + directory = os.path.join(metadata_directory, f'{builder.artifact_project_id}.dist-info') + if not os.path.isdir(directory): + os.mkdir(directory) + + extra_dependencies = [] + if not builder.config.dev_mode_dirs and builder.config.dev_mode_exact: + extra_dependencies.append(f'editables~={EDITABLES_MINIMUM_VERSION}') + + with open(os.path.join(directory, 'METADATA'), 'w', encoding='utf-8') as f: + f.write(builder.config.core_metadata_constructor(builder.metadata, extra_dependencies=extra_dependencies)) + + return os.path.basename(directory)