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-08-16 17:06:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-hatchling (Old) and /work/SRC/openSUSE:Factory/.python-hatchling.new.1521 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-hatchling" Tue Aug 16 17:06:53 2022 rev:5 rq:995126 version:1.7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/python-hatchling/python-hatchling.changes 2022-08-04 13:23:35.728521131 +0200 +++ /work/SRC/openSUSE:Factory/.python-hatchling.new.1521/python-hatchling.changes 2022-08-16 17:07:02.279751478 +0200 @@ -1,0 +2,25 @@ +Sat Aug 13 19:23:18 UTC 2022 - Beno??t Monin <benoit.mo...@gmx.fr> + +- update to version 1.7.1: + * Fixed: + + Fix the value the relative_path attribute of included files, + that some build plugins may use, when selecting explicit + paths + +------------------------------------------------------------------- +Sat Aug 13 14:17:00 UTC 2022 - Beno??t Monin <benoit.mo...@gmx.fr> + +- update to version 1.7.0: + * Added: + + Add require-runtime-features option for builders and build + hooks + + Check for unknown trove classifiers + + Update SPDX license information to version 3.18 + * Fixed: + + Add better error message for wheel target dev mode + installations that define path rewrites with the sources + option + + Note the allow-direct-references option in the relevant error + messages + +------------------------------------------------------------------- Old: ---- hatchling-1.6.0.tar.gz New: ---- hatchling-1.7.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-hatchling.spec ++++++ --- /var/tmp/diff_new_pack.NdwEtO/_old 2022-08-16 17:07:03.355754696 +0200 +++ /var/tmp/diff_new_pack.NdwEtO/_new 2022-08-16 17:07:03.359754707 +0200 @@ -19,7 +19,7 @@ %define skip_python2 1 %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-hatchling -Version: 1.6.0 +Version: 1.7.1 Release: 0 Summary: Build backend used by Hatch License: MIT ++++++ hatchling-1.6.0.tar.gz -> hatchling-1.7.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/PKG-INFO new/hatchling-1.7.1/PKG-INFO --- old/hatchling-1.6.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/PKG-INFO 2020-02-02 01:00:00.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: hatchling -Version: 1.6.0 +Version: 1.7.1 Summary: Modern, extensible Python build backend Project-URL: Homepage, https://hatch.pypa.io/latest/ Project-URL: Sponsor, https://github.com/sponsors/ofek @@ -14,11 +14,11 @@ Classifier: License :: OSI Approved :: MIT License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Build Tools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/scripts/update_classifiers.py new/hatchling-1.7.1/scripts/update_classifiers.py --- old/hatchling-1.6.0/scripts/update_classifiers.py 1970-01-01 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/scripts/update_classifiers.py 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,28 @@ +import pathlib +from contextlib import closing +from importlib.metadata import version +from io import StringIO + +import trove_classifiers + + +def main(): + project_root = pathlib.Path(__file__).resolve().parent.parent + data_file = project_root / 'src' / 'hatchling' / 'metadata' / 'classifiers.py' + + with closing(StringIO()) as file_contents: + file_contents.write(f'VERSION = {version("trove-classifiers")!r}\n\nSORTED_CLASSIFIERS = [\n') + + for classifier in trove_classifiers.sorted_classifiers: + file_contents.write(f' {classifier!r},\n') + + file_contents.write(']\nKNOWN_CLASSIFIERS = set(SORTED_CLASSIFIERS)\n\n\n') + file_contents.write('def is_private(classifier):\n') + file_contents.write(" return classifier.lower().startswith('private ::')\n") + + with data_file.open('w', encoding='utf-8') as f: + f.write(file_contents.getvalue()) + + +if __name__ == '__main__': + main() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/scripts/update_licenses.py new/hatchling-1.7.1/scripts/update_licenses.py --- old/hatchling-1.6.0/scripts/update_licenses.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/scripts/update_licenses.py 2020-02-02 01:00:00.000000000 +0100 @@ -6,10 +6,9 @@ import httpx -VERSION = '3.17' - -LICENSES_URL = f'https://raw.githubusercontent.com/spdx/license-list-data/v{VERSION}/json/licenses.json' -EXCEPTIONS_URL = f'https://raw.githubusercontent.com/spdx/license-list-data/v{VERSION}/json/exceptions.json' +LATEST_API = 'https://api.github.com/repos/spdx/license-list-data/releases/latest' +LICENSES_URL = 'https://raw.githubusercontent.com/spdx/license-list-data/v{}/json/licenses.json' +EXCEPTIONS_URL = 'https://raw.githubusercontent.com/spdx/license-list-data/v{}/json/exceptions.json' def download_data(url): @@ -27,14 +26,16 @@ def main(): + latest_version = download_data(LATEST_API)['tag_name'][1:] + licenses = {} - for license_data in download_data(LICENSES_URL)['licenses']: + for license_data in download_data(LICENSES_URL.format(latest_version))['licenses']: license_id = license_data['licenseId'] deprecated = license_data['isDeprecatedLicenseId'] licenses[license_id.lower()] = {'id': license_id, 'deprecated': deprecated} exceptions = {} - for exception_data in download_data(EXCEPTIONS_URL)['exceptions']: + for exception_data in download_data(EXCEPTIONS_URL.format(latest_version))['exceptions']: exception_id = exception_data['licenseExceptionId'] deprecated = exception_data['isDeprecatedLicenseId'] exceptions[exception_id.lower()] = {'id': exception_id, 'deprecated': deprecated} @@ -43,7 +44,7 @@ data_file = project_root / 'src' / 'hatchling' / 'licenses' / 'supported.py' with closing(StringIO()) as file_contents: - file_contents.write(f'VERSION = {VERSION!r}\n\nLICENSES = {{\n') + file_contents.write(f'VERSION = {latest_version!r}\n\nLICENSES = {{\n') for normalized_name, data in sorted(licenses.items()): file_contents.write(f' {normalized_name!r}: {data!r},\n') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/__about__.py new/hatchling-1.7.1/src/hatchling/__about__.py --- old/hatchling-1.6.0/src/hatchling/__about__.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/__about__.py 2020-02-02 01:00:00.000000000 +0100 @@ -1 +1 @@ -__version__ = '1.6.0' +__version__ = '1.7.1' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/bridge/app.py new/hatchling-1.7.1/src/hatchling/bridge/app.py --- old/hatchling-1.6.0/src/hatchling/bridge/app.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/bridge/app.py 2020-02-02 01:00:00.000000000 +0100 @@ -36,6 +36,10 @@ class Application: """ The way output is displayed can be [configured](../config/hatch.md#terminal) by users. + + !!! important + Never import this directly; Hatch judiciously decides if a type of plugin requires + the capabilities herein and will grant access via an attribute. """ def __init__(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/builders/config.py new/hatchling-1.7.1/src/hatchling/builders/config.py --- old/hatchling-1.6.0/src/hatchling/builders/config.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/builders/config.py 2020-02-02 01:00:00.000000000 +0100 @@ -5,6 +5,7 @@ from hatchling.builders.constants import DEFAULT_BUILD_DIRECTORY, EXCLUDED_DIRECTORIES, BuildEnvVars from hatchling.builders.utils import normalize_inclusion_map, normalize_relative_directory, normalize_relative_path +from hatchling.metadata.utils import normalize_project_name from hatchling.utils.fs import locate_file @@ -48,6 +49,7 @@ self.__dev_mode_dirs = None self.__dev_mode_exact = None self.__require_runtime_dependencies = None + self.__require_runtime_features = None @property def builder(self): @@ -338,6 +340,40 @@ return self.__require_runtime_dependencies @property + def require_runtime_features(self): + if self.__require_runtime_features is None: + if 'require-runtime-features' in self.target_config: + features_config = self.target_config + features_location = f'tool.hatch.build.targets.{self.plugin_name}.require-runtime-features' + else: + features_config = self.build_config + features_location = 'tool.hatch.build.require-runtime-features' + + require_runtime_features = features_config.get('require-runtime-features', []) + if not isinstance(require_runtime_features, list): + raise TypeError(f'Field `{features_location}` must be an array') + + all_features = {} + for i, feature in enumerate(require_runtime_features, 1): + if not isinstance(feature, str): + raise TypeError(f'Feature #{i} of field `{features_location}` must be a string') + elif not feature: + raise ValueError(f'Feature #{i} of field `{features_location}` cannot be an empty string') + + feature = normalize_project_name(feature) + if feature not in self.builder.metadata.core.optional_dependencies: + raise ValueError( + f'Feature `{feature}` of field `{features_location}` is not defined in ' + f'field `project.optional-dependencies`' + ) + + all_features[feature] = None + + self.__require_runtime_features = list(all_features) + + return self.__require_runtime_features + + @property def only_packages(self): """ Whether or not the target should ignore non-artifact files that do not reside within a Python package. @@ -500,6 +536,7 @@ dependencies[dependency] = None require_runtime_dependencies = self.require_runtime_dependencies + require_runtime_features = {feature: None for feature in self.require_runtime_features} for hook_name, config in self.hook_config.items(): hook_require_runtime_dependencies = config.get('require-runtime-dependencies', False) if not isinstance(hook_require_runtime_dependencies, bool): @@ -509,6 +546,31 @@ elif hook_require_runtime_dependencies: require_runtime_dependencies = True + hook_require_runtime_features = config.get('require-runtime-features', []) + if not isinstance(hook_require_runtime_features, list): + raise TypeError(f'Option `require-runtime-features` of build hook `{hook_name}` must be an array') + + for i, feature in enumerate(hook_require_runtime_features, 1): + if not isinstance(feature, str): + raise TypeError( + f'Feature #{i} of option `require-runtime-features` of build hook `{hook_name}` ' + f'must be a string' + ) + elif not feature: + raise ValueError( + f'Feature #{i} of option `require-runtime-features` of build hook `{hook_name}` ' + f'cannot be an empty string' + ) + + feature = normalize_project_name(feature) + if feature not in self.builder.metadata.core.optional_dependencies: + raise ValueError( + f'Feature `{feature}` of option `require-runtime-features` of build hook `{hook_name}` ' + f'is not defined in field `project.optional-dependencies`' + ) + + require_runtime_features[feature] = None + hook_dependencies = config.get('dependencies', []) if not isinstance(hook_dependencies, list): raise TypeError(f'Option `dependencies` of build hook `{hook_name}` must be an array') @@ -525,6 +587,11 @@ for dependency in self.builder.metadata.core.dependencies: dependencies[dependency] = None + if require_runtime_features: + for feature in require_runtime_features: + for dependency in self.builder.metadata.core.optional_dependencies[feature]: + dependencies[dependency] = None + self.__dependencies = list(dependencies) return self.__dependencies diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/builders/plugin/interface.py new/hatchling-1.7.1/src/hatchling/builders/plugin/interface.py --- old/hatchling-1.6.0/src/hatchling/builders/plugin/interface.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/builders/plugin/interface.py 2020-02-02 01:00:00.000000000 +0100 @@ -195,19 +195,18 @@ ) elif os.path.isdir(source): for root, dirs, files in safe_walk(source): - relative_path = get_relative_path(root, source) + relative_directory = get_relative_path(root, source) dirs[:] = sorted(d for d in dirs if d not in EXCLUDED_DIRECTORIES) files.sort() for f in files: - relative_file_path = os.path.join(relative_path, f) - distribution_path = os.path.join(target_path, relative_file_path) - if not self.config.path_is_reserved(distribution_path): + relative_file_path = os.path.join(target_path, relative_directory, f) + if not self.config.path_is_reserved(relative_file_path): yield IncludedFile( os.path.join(root, f), - '' if external else os.path.relpath(relative_file_path, self.root), - self.config.get_distribution_path(distribution_path), + '' if external else relative_file_path, + self.config.get_distribution_path(relative_file_path), ) def recurse_explicit_files(self, inclusion_map) -> Generator[IncludedFile, None, None]: @@ -221,20 +220,19 @@ ) elif os.path.isdir(source): for root, dirs, files in safe_walk(source): - relative_path = get_relative_path(root, source) + relative_directory = get_relative_path(root, source) dirs[:] = sorted(d for d in dirs if d not in EXCLUDED_DIRECTORIES) files.sort() is_package = '__init__.py' in files for f in files: - relative_file_path = os.path.join(relative_path, f) - distribution_path = os.path.join(target_path, relative_file_path) - if self.config.include_path(distribution_path, explicit=True, is_package=is_package): + relative_file_path = os.path.join(target_path, relative_directory, f) + if self.config.include_path(relative_file_path, explicit=True, is_package=is_package): yield IncludedFile( os.path.join(root, f), - '' if external else os.path.relpath(relative_file_path, self.root), - self.config.get_distribution_path(distribution_path), + '' if external else relative_file_path, + self.config.get_distribution_path(relative_file_path), ) @property diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/builders/wheel.py new/hatchling-1.7.1/src/hatchling/builders/wheel.py --- old/hatchling-1.6.0/src/hatchling/builders/wheel.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/builders/wheel.py 2020-02-02 01:00:00.000000000 +0100 @@ -353,10 +353,17 @@ exposed_packages[root_module] = os.path.join(self.root, root_module) else: distribution_module = distribution_path.split(os.sep)[0] - exposed_packages[distribution_module] = os.path.join( - self.root, - f'{relative_path[:relative_path.index(distribution_path)]}{distribution_module}', - ) + try: + exposed_packages[distribution_module] = os.path.join( + self.root, + f'{relative_path[:relative_path.index(distribution_path)]}{distribution_module}', + ) + except ValueError: + raise ValueError( + 'Dev mode installations are unsupported when any path rewrite in the `sources` option ' + 'changes a prefix rather than removes it, see: ' + 'https://github.com/pfmoore/editables/issues/20' + ) from None editable_project = EditableProject(self.metadata.core.name, self.root) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/licenses/supported.py new/hatchling-1.7.1/src/hatchling/licenses/supported.py --- old/hatchling-1.6.0/src/hatchling/licenses/supported.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/licenses/supported.py 2020-02-02 01:00:00.000000000 +0100 @@ -1,4 +1,4 @@ -VERSION = '3.17' +VERSION = '3.18' LICENSES = { '0bsd': {'id': '0BSD', 'deprecated': False}, @@ -87,6 +87,7 @@ 'cc-by-3.0': {'id': 'CC-BY-3.0', 'deprecated': False}, 'cc-by-3.0-at': {'id': 'CC-BY-3.0-AT', 'deprecated': False}, 'cc-by-3.0-de': {'id': 'CC-BY-3.0-DE', 'deprecated': False}, + 'cc-by-3.0-igo': {'id': 'CC-BY-3.0-IGO', 'deprecated': False}, 'cc-by-3.0-nl': {'id': 'CC-BY-3.0-NL', 'deprecated': False}, 'cc-by-3.0-us': {'id': 'CC-BY-3.0-US', 'deprecated': False}, 'cc-by-4.0': {'id': 'CC-BY-4.0', 'deprecated': False}, @@ -268,7 +269,6 @@ 'jasper-2.0': {'id': 'JasPer-2.0', 'deprecated': False}, 'jpnic': {'id': 'JPNIC', 'deprecated': False}, 'json': {'id': 'JSON', 'deprecated': False}, - 'kicad-libraries-exception': {'id': 'KiCad-libraries-exception', 'deprecated': False}, 'lal-1.2': {'id': 'LAL-1.2', 'deprecated': False}, 'lal-1.3': {'id': 'LAL-1.3', 'deprecated': False}, 'latex2e': {'id': 'Latex2e', 'deprecated': False}, @@ -302,7 +302,10 @@ 'lppl-1.2': {'id': 'LPPL-1.2', 'deprecated': False}, 'lppl-1.3a': {'id': 'LPPL-1.3a', 'deprecated': False}, 'lppl-1.3c': {'id': 'LPPL-1.3c', 'deprecated': False}, + 'lzma-sdk-9.11-to-9.20': {'id': 'LZMA-SDK-9.11-to-9.20', 'deprecated': False}, + 'lzma-sdk-9.22': {'id': 'LZMA-SDK-9.22', 'deprecated': False}, 'makeindex': {'id': 'MakeIndex', 'deprecated': False}, + 'minpack': {'id': 'Minpack', 'deprecated': False}, 'miros': {'id': 'MirOS', 'deprecated': False}, 'mit': {'id': 'MIT', 'deprecated': False}, 'mit-0': {'id': 'MIT-0', 'deprecated': False}, @@ -314,12 +317,14 @@ 'mit-open-group': {'id': 'MIT-open-group', 'deprecated': False}, 'mitnfa': {'id': 'MITNFA', 'deprecated': False}, 'motosoto': {'id': 'Motosoto', 'deprecated': False}, + 'mpi-permissive': {'id': 'mpi-permissive', 'deprecated': False}, 'mpich2': {'id': 'mpich2', 'deprecated': False}, 'mpl-1.0': {'id': 'MPL-1.0', 'deprecated': False}, 'mpl-1.1': {'id': 'MPL-1.1', 'deprecated': False}, 'mpl-2.0': {'id': 'MPL-2.0', 'deprecated': False}, 'mpl-2.0-no-copyleft-exception': {'id': 'MPL-2.0-no-copyleft-exception', 'deprecated': False}, 'mplus': {'id': 'mplus', 'deprecated': False}, + 'ms-lpl': {'id': 'MS-LPL', 'deprecated': False}, 'ms-pl': {'id': 'MS-PL', 'deprecated': False}, 'ms-rl': {'id': 'MS-RL', 'deprecated': False}, 'mtll': {'id': 'MTLL', 'deprecated': False}, @@ -337,6 +342,7 @@ 'netcdf': {'id': 'NetCDF', 'deprecated': False}, 'newsletr': {'id': 'Newsletr', 'deprecated': False}, 'ngpl': {'id': 'NGPL', 'deprecated': False}, + 'nicta-1.0': {'id': 'NICTA-1.0', 'deprecated': False}, 'nist-pd': {'id': 'NIST-PD', 'deprecated': False}, 'nist-pd-fallback': {'id': 'NIST-PD-fallback', 'deprecated': False}, 'nlod-1.0': {'id': 'NLOD-1.0', 'deprecated': False}, @@ -409,6 +415,7 @@ 'psfrag': {'id': 'psfrag', 'deprecated': False}, 'psutils': {'id': 'psutils', 'deprecated': False}, 'python-2.0': {'id': 'Python-2.0', 'deprecated': False}, + 'python-2.0.1': {'id': 'Python-2.0.1', 'deprecated': False}, 'qhull': {'id': 'Qhull', 'deprecated': False}, 'qpl-1.0': {'id': 'QPL-1.0', 'deprecated': False}, 'rdisc': {'id': 'Rdisc', 'deprecated': False}, @@ -512,7 +519,10 @@ 'gpl-3.0-linking-exception': {'id': 'GPL-3.0-linking-exception', 'deprecated': False}, 'gpl-3.0-linking-source-exception': {'id': 'GPL-3.0-linking-source-exception', 'deprecated': False}, 'gpl-cc-1.0': {'id': 'GPL-CC-1.0', 'deprecated': False}, + 'gstreamer-exception-2005': {'id': 'GStreamer-exception-2005', 'deprecated': False}, + 'gstreamer-exception-2008': {'id': 'GStreamer-exception-2008', 'deprecated': False}, 'i2p-gpl-java-exception': {'id': 'i2p-gpl-java-exception', 'deprecated': False}, + 'kicad-libraries-exception': {'id': 'KiCad-libraries-exception', 'deprecated': False}, 'lgpl-3.0-linking-exception': {'id': 'LGPL-3.0-linking-exception', 'deprecated': False}, 'libtool-exception': {'id': 'Libtool-exception', 'deprecated': False}, 'linux-syscall-note': {'id': 'Linux-syscall-note', 'deprecated': False}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/metadata/classifiers.py new/hatchling-1.7.1/src/hatchling/metadata/classifiers.py --- old/hatchling-1.6.0/src/hatchling/metadata/classifiers.py 1970-01-01 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/metadata/classifiers.py 2020-02-02 01:00:00.000000000 +0100 @@ -0,0 +1,814 @@ +VERSION = '2022.8.7' + +SORTED_CLASSIFIERS = [ + 'Development Status :: 1 - Planning', + 'Development Status :: 2 - Pre-Alpha', + 'Development Status :: 3 - Alpha', + 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', + 'Development Status :: 6 - Mature', + 'Development Status :: 7 - Inactive', + 'Environment :: Console', + 'Environment :: Console :: Curses', + 'Environment :: Console :: Framebuffer', + 'Environment :: Console :: Newt', + 'Environment :: Console :: svgalib', + 'Environment :: GPU', + 'Environment :: GPU :: NVIDIA CUDA', + 'Environment :: GPU :: NVIDIA CUDA :: 1.0', + 'Environment :: GPU :: NVIDIA CUDA :: 1.1', + 'Environment :: GPU :: NVIDIA CUDA :: 2.0', + 'Environment :: GPU :: NVIDIA CUDA :: 2.1', + 'Environment :: GPU :: NVIDIA CUDA :: 2.2', + 'Environment :: GPU :: NVIDIA CUDA :: 2.3', + 'Environment :: GPU :: NVIDIA CUDA :: 3.0', + 'Environment :: GPU :: NVIDIA CUDA :: 3.1', + 'Environment :: GPU :: NVIDIA CUDA :: 3.2', + 'Environment :: GPU :: NVIDIA CUDA :: 4.0', + 'Environment :: GPU :: NVIDIA CUDA :: 4.1', + 'Environment :: GPU :: NVIDIA CUDA :: 4.2', + 'Environment :: GPU :: NVIDIA CUDA :: 5.0', + 'Environment :: GPU :: NVIDIA CUDA :: 5.5', + 'Environment :: GPU :: NVIDIA CUDA :: 6.0', + 'Environment :: GPU :: NVIDIA CUDA :: 6.5', + 'Environment :: GPU :: NVIDIA CUDA :: 7.0', + 'Environment :: GPU :: NVIDIA CUDA :: 7.5', + 'Environment :: GPU :: NVIDIA CUDA :: 8.0', + 'Environment :: GPU :: NVIDIA CUDA :: 9.0', + 'Environment :: GPU :: NVIDIA CUDA :: 9.1', + 'Environment :: GPU :: NVIDIA CUDA :: 9.2', + 'Environment :: GPU :: NVIDIA CUDA :: 10.0', + 'Environment :: GPU :: NVIDIA CUDA :: 10.1', + 'Environment :: GPU :: NVIDIA CUDA :: 10.2', + 'Environment :: GPU :: NVIDIA CUDA :: 11.0', + 'Environment :: GPU :: NVIDIA CUDA :: 11.1', + 'Environment :: GPU :: NVIDIA CUDA :: 11.2', + 'Environment :: GPU :: NVIDIA CUDA :: 11.3', + 'Environment :: GPU :: NVIDIA CUDA :: 11.4', + 'Environment :: GPU :: NVIDIA CUDA :: 11.5', + 'Environment :: GPU :: NVIDIA CUDA :: 11.6', + 'Environment :: GPU :: NVIDIA CUDA :: 11.7', + "Environment :: Handhelds/PDA's", + 'Environment :: MacOS X', + 'Environment :: MacOS X :: Aqua', + 'Environment :: MacOS X :: Carbon', + 'Environment :: MacOS X :: Cocoa', + 'Environment :: No Input/Output (Daemon)', + 'Environment :: OpenStack', + 'Environment :: Other Environment', + 'Environment :: Plugins', + 'Environment :: Web Environment', + 'Environment :: Web Environment :: Buffet', + 'Environment :: Web Environment :: Mozilla', + 'Environment :: Web Environment :: ToscaWidgets', + 'Environment :: Win32 (MS Windows)', + 'Environment :: X11 Applications', + 'Environment :: X11 Applications :: GTK', + 'Environment :: X11 Applications :: Gnome', + 'Environment :: X11 Applications :: KDE', + 'Environment :: X11 Applications :: Qt', + 'Framework :: AWS CDK', + 'Framework :: AWS CDK :: 1', + 'Framework :: AWS CDK :: 2', + 'Framework :: AiiDA', + 'Framework :: Ansible', + 'Framework :: AnyIO', + 'Framework :: Apache Airflow', + 'Framework :: Apache Airflow :: Provider', + 'Framework :: AsyncIO', + 'Framework :: BEAT', + 'Framework :: BFG', + 'Framework :: Bob', + 'Framework :: Bottle', + 'Framework :: Buildout', + 'Framework :: Buildout :: Extension', + 'Framework :: Buildout :: Recipe', + 'Framework :: CastleCMS', + 'Framework :: CastleCMS :: Theme', + 'Framework :: Celery', + 'Framework :: Chandler', + 'Framework :: CherryPy', + 'Framework :: CubicWeb', + 'Framework :: Dash', + 'Framework :: Datasette', + 'Framework :: Django', + 'Framework :: Django :: 1', + 'Framework :: Django :: 1.4', + 'Framework :: Django :: 1.5', + 'Framework :: Django :: 1.6', + 'Framework :: Django :: 1.7', + 'Framework :: Django :: 1.8', + 'Framework :: Django :: 1.9', + 'Framework :: Django :: 1.10', + 'Framework :: Django :: 1.11', + 'Framework :: Django :: 2', + 'Framework :: Django :: 2.0', + 'Framework :: Django :: 2.1', + 'Framework :: Django :: 2.2', + 'Framework :: Django :: 3', + 'Framework :: Django :: 3.0', + 'Framework :: Django :: 3.1', + 'Framework :: Django :: 3.2', + 'Framework :: Django :: 4', + 'Framework :: Django :: 4.0', + 'Framework :: Django :: 4.1', + 'Framework :: Django CMS', + 'Framework :: Django CMS :: 3.4', + 'Framework :: Django CMS :: 3.5', + 'Framework :: Django CMS :: 3.6', + 'Framework :: Django CMS :: 3.7', + 'Framework :: Django CMS :: 3.8', + 'Framework :: Django CMS :: 3.9', + 'Framework :: Django CMS :: 3.10', + 'Framework :: FastAPI', + 'Framework :: Flake8', + 'Framework :: Flask', + 'Framework :: Hatch', + 'Framework :: Hypothesis', + 'Framework :: IDLE', + 'Framework :: IPython', + 'Framework :: Jupyter', + 'Framework :: Jupyter :: JupyterLab', + 'Framework :: Jupyter :: JupyterLab :: 1', + 'Framework :: Jupyter :: JupyterLab :: 2', + 'Framework :: Jupyter :: JupyterLab :: 3', + 'Framework :: Jupyter :: JupyterLab :: 4', + 'Framework :: Jupyter :: JupyterLab :: Extensions', + 'Framework :: Jupyter :: JupyterLab :: Extensions :: Mime Renderers', + 'Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt', + 'Framework :: Jupyter :: JupyterLab :: Extensions :: Themes', + 'Framework :: Kedro', + 'Framework :: Lektor', + 'Framework :: Masonite', + 'Framework :: Matplotlib', + 'Framework :: Nengo', + 'Framework :: Odoo', + 'Framework :: Odoo :: 8.0', + 'Framework :: Odoo :: 9.0', + 'Framework :: Odoo :: 10.0', + 'Framework :: Odoo :: 11.0', + 'Framework :: Odoo :: 12.0', + 'Framework :: Odoo :: 13.0', + 'Framework :: Odoo :: 14.0', + 'Framework :: Odoo :: 15.0', + 'Framework :: Opps', + 'Framework :: Paste', + 'Framework :: Pelican', + 'Framework :: Pelican :: Plugins', + 'Framework :: Pelican :: Themes', + 'Framework :: Plone', + 'Framework :: Plone :: 3.2', + 'Framework :: Plone :: 3.3', + 'Framework :: Plone :: 4.0', + 'Framework :: Plone :: 4.1', + 'Framework :: Plone :: 4.2', + 'Framework :: Plone :: 4.3', + 'Framework :: Plone :: 5.0', + 'Framework :: Plone :: 5.1', + 'Framework :: Plone :: 5.2', + 'Framework :: Plone :: 5.3', + 'Framework :: Plone :: 6.0', + 'Framework :: Plone :: Addon', + 'Framework :: Plone :: Core', + 'Framework :: Plone :: Theme', + 'Framework :: Pylons', + 'Framework :: Pyramid', + 'Framework :: Pytest', + 'Framework :: Review Board', + 'Framework :: Robot Framework', + 'Framework :: Robot Framework :: Library', + 'Framework :: Robot Framework :: Tool', + 'Framework :: Scrapy', + 'Framework :: Setuptools Plugin', + 'Framework :: Sphinx', + 'Framework :: Sphinx :: Extension', + 'Framework :: Sphinx :: Theme', + 'Framework :: Trac', + 'Framework :: Trio', + 'Framework :: Tryton', + 'Framework :: TurboGears', + 'Framework :: TurboGears :: Applications', + 'Framework :: TurboGears :: Widgets', + 'Framework :: Twisted', + 'Framework :: Wagtail', + 'Framework :: Wagtail :: 1', + 'Framework :: Wagtail :: 2', + 'Framework :: Wagtail :: 3', + 'Framework :: ZODB', + 'Framework :: Zope', + 'Framework :: Zope2', + 'Framework :: Zope3', + 'Framework :: Zope :: 2', + 'Framework :: Zope :: 3', + 'Framework :: Zope :: 4', + 'Framework :: Zope :: 5', + 'Framework :: aiohttp', + 'Framework :: cocotb', + 'Framework :: napari', + 'Framework :: tox', + 'Intended Audience :: Customer Service', + 'Intended Audience :: Developers', + 'Intended Audience :: Education', + 'Intended Audience :: End Users/Desktop', + 'Intended Audience :: Financial and Insurance Industry', + 'Intended Audience :: Healthcare Industry', + 'Intended Audience :: Information Technology', + 'Intended Audience :: Legal Industry', + 'Intended Audience :: Manufacturing', + 'Intended Audience :: Other Audience', + 'Intended Audience :: Religion', + 'Intended Audience :: Science/Research', + 'Intended Audience :: System Administrators', + 'Intended Audience :: Telecommunications Industry', + 'License :: Aladdin Free Public License (AFPL)', + 'License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', + 'License :: CeCILL-B Free Software License Agreement (CECILL-B)', + 'License :: CeCILL-C Free Software License Agreement (CECILL-C)', + 'License :: DFSG approved', + 'License :: Eiffel Forum License (EFL)', + 'License :: Free For Educational Use', + 'License :: Free For Home Use', + 'License :: Free To Use But Restricted', + 'License :: Free for non-commercial use', + 'License :: Freely Distributable', + 'License :: Freeware', + 'License :: GUST Font License 1.0', + 'License :: GUST Font License 2006-09-30', + 'License :: Netscape Public License (NPL)', + 'License :: Nokia Open Source License (NOKOS)', + 'License :: OSI Approved', + 'License :: OSI Approved :: Academic Free License (AFL)', + 'License :: OSI Approved :: Apache Software License', + 'License :: OSI Approved :: Apple Public Source License', + 'License :: OSI Approved :: Artistic License', + 'License :: OSI Approved :: Attribution Assurance License', + 'License :: OSI Approved :: BSD License', + 'License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)', + 'License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)', + 'License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)', + 'License :: OSI Approved :: Common Public License', + 'License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)', + 'License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)', + 'License :: OSI Approved :: Eiffel Forum License', + 'License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)', + 'License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)', + 'License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)', + 'License :: OSI Approved :: GNU Affero General Public License v3', + 'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)', + 'License :: OSI Approved :: GNU Free Documentation License (FDL)', + 'License :: OSI Approved :: GNU General Public License (GPL)', + 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)', + 'License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)', + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', + 'License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)', + 'License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)', + 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', + 'License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)', + 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', + 'License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)', + 'License :: OSI Approved :: IBM Public License', + 'License :: OSI Approved :: ISC License (ISCL)', + 'License :: OSI Approved :: Intel Open Source License', + 'License :: OSI Approved :: Jabber Open Source License', + 'License :: OSI Approved :: MIT License', + 'License :: OSI Approved :: MIT No Attribution License (MIT-0)', + 'License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)', + 'License :: OSI Approved :: MirOS License (MirOS)', + 'License :: OSI Approved :: Motosoto License', + 'License :: OSI Approved :: Mozilla Public License 1.0 (MPL)', + 'License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)', + 'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)', + 'License :: OSI Approved :: Mulan Permissive Software License v2 (MulanPSL-2.0)', + 'License :: OSI Approved :: Nethack General Public License', + 'License :: OSI Approved :: Nokia Open Source License', + 'License :: OSI Approved :: Open Group Test Suite License', + 'License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)', + 'License :: OSI Approved :: PostgreSQL License', + 'License :: OSI Approved :: Python License (CNRI Python License)', + 'License :: OSI Approved :: Python Software Foundation License', + 'License :: OSI Approved :: Qt Public License (QPL)', + 'License :: OSI Approved :: Ricoh Source Code Public License', + 'License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)', + 'License :: OSI Approved :: Sleepycat License', + 'License :: OSI Approved :: Sun Industry Standards Source License (SISSL)', + 'License :: OSI Approved :: Sun Public License', + 'License :: OSI Approved :: The Unlicense (Unlicense)', + 'License :: OSI Approved :: Universal Permissive License (UPL)', + 'License :: OSI Approved :: University of Illinois/NCSA Open Source License', + 'License :: OSI Approved :: Vovida Software License 1.0', + 'License :: OSI Approved :: W3C License', + 'License :: OSI Approved :: X.Net License', + 'License :: OSI Approved :: Zope Public License', + 'License :: OSI Approved :: zlib/libpng License', + 'License :: Other/Proprietary License', + 'License :: Public Domain', + 'License :: Repoze Public License', + 'Natural Language :: Afrikaans', + 'Natural Language :: Arabic', + 'Natural Language :: Basque', + 'Natural Language :: Bengali', + 'Natural Language :: Bosnian', + 'Natural Language :: Bulgarian', + 'Natural Language :: Cantonese', + 'Natural Language :: Catalan', + 'Natural Language :: Chinese (Simplified)', + 'Natural Language :: Chinese (Traditional)', + 'Natural Language :: Croatian', + 'Natural Language :: Czech', + 'Natural Language :: Danish', + 'Natural Language :: Dutch', + 'Natural Language :: English', + 'Natural Language :: Esperanto', + 'Natural Language :: Finnish', + 'Natural Language :: French', + 'Natural Language :: Galician', + 'Natural Language :: German', + 'Natural Language :: Greek', + 'Natural Language :: Hebrew', + 'Natural Language :: Hindi', + 'Natural Language :: Hungarian', + 'Natural Language :: Icelandic', + 'Natural Language :: Indonesian', + 'Natural Language :: Irish', + 'Natural Language :: Italian', + 'Natural Language :: Japanese', + 'Natural Language :: Javanese', + 'Natural Language :: Korean', + 'Natural Language :: Latin', + 'Natural Language :: Latvian', + 'Natural Language :: Lithuanian', + 'Natural Language :: Macedonian', + 'Natural Language :: Malay', + 'Natural Language :: Marathi', + 'Natural Language :: Nepali', + 'Natural Language :: Norwegian', + 'Natural Language :: Panjabi', + 'Natural Language :: Persian', + 'Natural Language :: Polish', + 'Natural Language :: Portuguese', + 'Natural Language :: Portuguese (Brazilian)', + 'Natural Language :: Romanian', + 'Natural Language :: Russian', + 'Natural Language :: Serbian', + 'Natural Language :: Slovak', + 'Natural Language :: Slovenian', + 'Natural Language :: Spanish', + 'Natural Language :: Swedish', + 'Natural Language :: Tamil', + 'Natural Language :: Telugu', + 'Natural Language :: Thai', + 'Natural Language :: Tibetan', + 'Natural Language :: Turkish', + 'Natural Language :: Ukrainian', + 'Natural Language :: Urdu', + 'Natural Language :: Vietnamese', + 'Operating System :: Android', + 'Operating System :: BeOS', + 'Operating System :: MacOS', + 'Operating System :: MacOS :: MacOS 9', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft', + 'Operating System :: Microsoft :: MS-DOS', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: Microsoft :: Windows :: Windows 3.1 or Earlier', + 'Operating System :: Microsoft :: Windows :: Windows 7', + 'Operating System :: Microsoft :: Windows :: Windows 8', + 'Operating System :: Microsoft :: Windows :: Windows 8.1', + 'Operating System :: Microsoft :: Windows :: Windows 10', + 'Operating System :: Microsoft :: Windows :: Windows 11', + 'Operating System :: Microsoft :: Windows :: Windows 95/98/2000', + 'Operating System :: Microsoft :: Windows :: Windows CE', + 'Operating System :: Microsoft :: Windows :: Windows NT/2000', + 'Operating System :: Microsoft :: Windows :: Windows Server 2003', + 'Operating System :: Microsoft :: Windows :: Windows Server 2008', + 'Operating System :: Microsoft :: Windows :: Windows Vista', + 'Operating System :: Microsoft :: Windows :: Windows XP', + 'Operating System :: OS Independent', + 'Operating System :: OS/2', + 'Operating System :: Other OS', + 'Operating System :: PDA Systems', + 'Operating System :: POSIX', + 'Operating System :: POSIX :: AIX', + 'Operating System :: POSIX :: BSD', + 'Operating System :: POSIX :: BSD :: BSD/OS', + 'Operating System :: POSIX :: BSD :: FreeBSD', + 'Operating System :: POSIX :: BSD :: NetBSD', + 'Operating System :: POSIX :: BSD :: OpenBSD', + 'Operating System :: POSIX :: GNU Hurd', + 'Operating System :: POSIX :: HP-UX', + 'Operating System :: POSIX :: IRIX', + 'Operating System :: POSIX :: Linux', + 'Operating System :: POSIX :: Other', + 'Operating System :: POSIX :: SCO', + 'Operating System :: POSIX :: SunOS/Solaris', + 'Operating System :: PalmOS', + 'Operating System :: RISC OS', + 'Operating System :: Unix', + 'Operating System :: iOS', + 'Programming Language :: APL', + 'Programming Language :: ASP', + 'Programming Language :: Ada', + 'Programming Language :: Assembly', + 'Programming Language :: Awk', + 'Programming Language :: Basic', + 'Programming Language :: C', + 'Programming Language :: C#', + 'Programming Language :: C++', + 'Programming Language :: Cold Fusion', + 'Programming Language :: Cython', + 'Programming Language :: D', + 'Programming Language :: Delphi/Kylix', + 'Programming Language :: Dylan', + 'Programming Language :: Eiffel', + 'Programming Language :: Emacs-Lisp', + 'Programming Language :: Erlang', + 'Programming Language :: Euler', + 'Programming Language :: Euphoria', + 'Programming Language :: F#', + 'Programming Language :: Forth', + 'Programming Language :: Fortran', + 'Programming Language :: Haskell', + 'Programming Language :: Java', + 'Programming Language :: JavaScript', + 'Programming Language :: Kotlin', + 'Programming Language :: Lisp', + 'Programming Language :: Logo', + 'Programming Language :: ML', + 'Programming Language :: Modula', + 'Programming Language :: OCaml', + 'Programming Language :: Object Pascal', + 'Programming Language :: Objective C', + 'Programming Language :: Other', + 'Programming Language :: Other Scripting Engines', + 'Programming Language :: PHP', + 'Programming Language :: PL/SQL', + 'Programming Language :: PROGRESS', + 'Programming Language :: Pascal', + 'Programming Language :: Perl', + 'Programming Language :: Pike', + 'Programming Language :: Pliant', + 'Programming Language :: Prolog', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2 :: Only', + 'Programming Language :: Python :: 2.3', + 'Programming Language :: Python :: 2.4', + 'Programming Language :: Python :: 2.5', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: Only', + 'Programming Language :: Python :: 3.0', + 'Programming Language :: Python :: 3.1', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: Implementation', + 'Programming Language :: Python :: Implementation :: CPython', + 'Programming Language :: Python :: Implementation :: IronPython', + 'Programming Language :: Python :: Implementation :: Jython', + 'Programming Language :: Python :: Implementation :: MicroPython', + 'Programming Language :: Python :: Implementation :: PyPy', + 'Programming Language :: Python :: Implementation :: Stackless', + 'Programming Language :: R', + 'Programming Language :: REBOL', + 'Programming Language :: Rexx', + 'Programming Language :: Ruby', + 'Programming Language :: Rust', + 'Programming Language :: SQL', + 'Programming Language :: Scheme', + 'Programming Language :: Simula', + 'Programming Language :: Smalltalk', + 'Programming Language :: Tcl', + 'Programming Language :: Unix Shell', + 'Programming Language :: Visual Basic', + 'Programming Language :: XBasic', + 'Programming Language :: YACC', + 'Programming Language :: Zope', + 'Topic :: Adaptive Technologies', + 'Topic :: Artistic Software', + 'Topic :: Communications', + 'Topic :: Communications :: BBS', + 'Topic :: Communications :: Chat', + 'Topic :: Communications :: Chat :: ICQ', + 'Topic :: Communications :: Chat :: Internet Relay Chat', + 'Topic :: Communications :: Chat :: Unix Talk', + 'Topic :: Communications :: Conferencing', + 'Topic :: Communications :: Email', + 'Topic :: Communications :: Email :: Address Book', + 'Topic :: Communications :: Email :: Email Clients (MUA)', + 'Topic :: Communications :: Email :: Filters', + 'Topic :: Communications :: Email :: Mail Transport Agents', + 'Topic :: Communications :: Email :: Mailing List Servers', + 'Topic :: Communications :: Email :: Post-Office', + 'Topic :: Communications :: Email :: Post-Office :: IMAP', + 'Topic :: Communications :: Email :: Post-Office :: POP3', + 'Topic :: Communications :: FIDO', + 'Topic :: Communications :: Fax', + 'Topic :: Communications :: File Sharing', + 'Topic :: Communications :: File Sharing :: Gnutella', + 'Topic :: Communications :: File Sharing :: Napster', + 'Topic :: Communications :: Ham Radio', + 'Topic :: Communications :: Internet Phone', + 'Topic :: Communications :: Telephony', + 'Topic :: Communications :: Usenet News', + 'Topic :: Database', + 'Topic :: Database :: Database Engines/Servers', + 'Topic :: Database :: Front-Ends', + 'Topic :: Desktop Environment', + 'Topic :: Desktop Environment :: File Managers', + 'Topic :: Desktop Environment :: GNUstep', + 'Topic :: Desktop Environment :: Gnome', + 'Topic :: Desktop Environment :: K Desktop Environment (KDE)', + 'Topic :: Desktop Environment :: K Desktop Environment (KDE) :: Themes', + 'Topic :: Desktop Environment :: PicoGUI', + 'Topic :: Desktop Environment :: PicoGUI :: Applications', + 'Topic :: Desktop Environment :: PicoGUI :: Themes', + 'Topic :: Desktop Environment :: Screen Savers', + 'Topic :: Desktop Environment :: Window Managers', + 'Topic :: Desktop Environment :: Window Managers :: Afterstep', + 'Topic :: Desktop Environment :: Window Managers :: Afterstep :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Applets', + 'Topic :: Desktop Environment :: Window Managers :: Blackbox', + 'Topic :: Desktop Environment :: Window Managers :: Blackbox :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: CTWM', + 'Topic :: Desktop Environment :: Window Managers :: CTWM :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Enlightenment', + 'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Epplets', + 'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR15', + 'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR16', + 'Topic :: Desktop Environment :: Window Managers :: Enlightenment :: Themes DR17', + 'Topic :: Desktop Environment :: Window Managers :: FVWM', + 'Topic :: Desktop Environment :: Window Managers :: FVWM :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Fluxbox', + 'Topic :: Desktop Environment :: Window Managers :: Fluxbox :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: IceWM', + 'Topic :: Desktop Environment :: Window Managers :: IceWM :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: MetaCity', + 'Topic :: Desktop Environment :: Window Managers :: MetaCity :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Oroborus', + 'Topic :: Desktop Environment :: Window Managers :: Oroborus :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Sawfish', + 'Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes 0.30', + 'Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes pre-0.30', + 'Topic :: Desktop Environment :: Window Managers :: Waimea', + 'Topic :: Desktop Environment :: Window Managers :: Waimea :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: Window Maker', + 'Topic :: Desktop Environment :: Window Managers :: Window Maker :: Applets', + 'Topic :: Desktop Environment :: Window Managers :: Window Maker :: Themes', + 'Topic :: Desktop Environment :: Window Managers :: XFCE', + 'Topic :: Desktop Environment :: Window Managers :: XFCE :: Themes', + 'Topic :: Documentation', + 'Topic :: Documentation :: Sphinx', + 'Topic :: Education', + 'Topic :: Education :: Computer Aided Instruction (CAI)', + 'Topic :: Education :: Testing', + 'Topic :: Games/Entertainment', + 'Topic :: Games/Entertainment :: Arcade', + 'Topic :: Games/Entertainment :: Board Games', + 'Topic :: Games/Entertainment :: First Person Shooters', + 'Topic :: Games/Entertainment :: Fortune Cookies', + 'Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)', + 'Topic :: Games/Entertainment :: Puzzle Games', + 'Topic :: Games/Entertainment :: Real Time Strategy', + 'Topic :: Games/Entertainment :: Role-Playing', + 'Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games', + 'Topic :: Games/Entertainment :: Simulation', + 'Topic :: Games/Entertainment :: Turn Based Strategy', + 'Topic :: Home Automation', + 'Topic :: Internet', + 'Topic :: Internet :: File Transfer Protocol (FTP)', + 'Topic :: Internet :: Finger', + 'Topic :: Internet :: Log Analysis', + 'Topic :: Internet :: Name Service (DNS)', + 'Topic :: Internet :: Proxy Servers', + 'Topic :: Internet :: WAP', + 'Topic :: Internet :: WWW/HTTP', + 'Topic :: Internet :: WWW/HTTP :: Browsers', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters', + 'Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Wiki', + 'Topic :: Internet :: WWW/HTTP :: HTTP Servers', + 'Topic :: Internet :: WWW/HTTP :: Indexing/Search', + 'Topic :: Internet :: WWW/HTTP :: Session', + 'Topic :: Internet :: WWW/HTTP :: Site Management', + 'Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking', + 'Topic :: Internet :: WWW/HTTP :: WSGI', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Application', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware', + 'Topic :: Internet :: WWW/HTTP :: WSGI :: Server', + 'Topic :: Internet :: XMPP', + 'Topic :: Internet :: Z39.50', + 'Topic :: Multimedia', + 'Topic :: Multimedia :: Graphics', + 'Topic :: Multimedia :: Graphics :: 3D Modeling', + 'Topic :: Multimedia :: Graphics :: 3D Rendering', + 'Topic :: Multimedia :: Graphics :: Capture', + 'Topic :: Multimedia :: Graphics :: Capture :: Digital Camera', + 'Topic :: Multimedia :: Graphics :: Capture :: Scanners', + 'Topic :: Multimedia :: Graphics :: Capture :: Screen Capture', + 'Topic :: Multimedia :: Graphics :: Editors', + 'Topic :: Multimedia :: Graphics :: Editors :: Raster-Based', + 'Topic :: Multimedia :: Graphics :: Editors :: Vector-Based', + 'Topic :: Multimedia :: Graphics :: Graphics Conversion', + 'Topic :: Multimedia :: Graphics :: Presentation', + 'Topic :: Multimedia :: Graphics :: Viewers', + 'Topic :: Multimedia :: Sound/Audio', + 'Topic :: Multimedia :: Sound/Audio :: Analysis', + 'Topic :: Multimedia :: Sound/Audio :: CD Audio', + 'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Playing', + 'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Ripping', + 'Topic :: Multimedia :: Sound/Audio :: CD Audio :: CD Writing', + 'Topic :: Multimedia :: Sound/Audio :: Capture/Recording', + 'Topic :: Multimedia :: Sound/Audio :: Conversion', + 'Topic :: Multimedia :: Sound/Audio :: Editors', + 'Topic :: Multimedia :: Sound/Audio :: MIDI', + 'Topic :: Multimedia :: Sound/Audio :: Mixers', + 'Topic :: Multimedia :: Sound/Audio :: Players', + 'Topic :: Multimedia :: Sound/Audio :: Players :: MP3', + 'Topic :: Multimedia :: Sound/Audio :: Sound Synthesis', + 'Topic :: Multimedia :: Sound/Audio :: Speech', + 'Topic :: Multimedia :: Video', + 'Topic :: Multimedia :: Video :: Capture', + 'Topic :: Multimedia :: Video :: Conversion', + 'Topic :: Multimedia :: Video :: Display', + 'Topic :: Multimedia :: Video :: Non-Linear Editor', + 'Topic :: Office/Business', + 'Topic :: Office/Business :: Financial', + 'Topic :: Office/Business :: Financial :: Accounting', + 'Topic :: Office/Business :: Financial :: Investment', + 'Topic :: Office/Business :: Financial :: Point-Of-Sale', + 'Topic :: Office/Business :: Financial :: Spreadsheet', + 'Topic :: Office/Business :: Groupware', + 'Topic :: Office/Business :: News/Diary', + 'Topic :: Office/Business :: Office Suites', + 'Topic :: Office/Business :: Scheduling', + 'Topic :: Other/Nonlisted Topic', + 'Topic :: Printing', + 'Topic :: Religion', + 'Topic :: Scientific/Engineering', + 'Topic :: Scientific/Engineering :: Artificial Intelligence', + 'Topic :: Scientific/Engineering :: Artificial Life', + 'Topic :: Scientific/Engineering :: Astronomy', + 'Topic :: Scientific/Engineering :: Atmospheric Science', + 'Topic :: Scientific/Engineering :: Bio-Informatics', + 'Topic :: Scientific/Engineering :: Chemistry', + 'Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)', + 'Topic :: Scientific/Engineering :: GIS', + 'Topic :: Scientific/Engineering :: Human Machine Interfaces', + 'Topic :: Scientific/Engineering :: Hydrology', + 'Topic :: Scientific/Engineering :: Image Processing', + 'Topic :: Scientific/Engineering :: Image Recognition', + 'Topic :: Scientific/Engineering :: Information Analysis', + 'Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Scientific/Engineering :: Medical Science Apps.', + 'Topic :: Scientific/Engineering :: Physics', + 'Topic :: Scientific/Engineering :: Visualization', + 'Topic :: Security', + 'Topic :: Security :: Cryptography', + 'Topic :: Sociology', + 'Topic :: Sociology :: Genealogy', + 'Topic :: Sociology :: History', + 'Topic :: Software Development', + 'Topic :: Software Development :: Assemblers', + 'Topic :: Software Development :: Bug Tracking', + 'Topic :: Software Development :: Build Tools', + 'Topic :: Software Development :: Code Generators', + 'Topic :: Software Development :: Compilers', + 'Topic :: Software Development :: Debuggers', + 'Topic :: Software Development :: Disassemblers', + 'Topic :: Software Development :: Documentation', + 'Topic :: Software Development :: Embedded Systems', + 'Topic :: Software Development :: Internationalization', + 'Topic :: Software Development :: Interpreters', + 'Topic :: Software Development :: Libraries', + 'Topic :: Software Development :: Libraries :: Application Frameworks', + 'Topic :: Software Development :: Libraries :: Java Libraries', + 'Topic :: Software Development :: Libraries :: PHP Classes', + 'Topic :: Software Development :: Libraries :: Perl Modules', + 'Topic :: Software Development :: Libraries :: Pike Modules', + 'Topic :: Software Development :: Libraries :: Python Modules', + 'Topic :: Software Development :: Libraries :: Ruby Modules', + 'Topic :: Software Development :: Libraries :: Tcl Extensions', + 'Topic :: Software Development :: Libraries :: pygame', + 'Topic :: Software Development :: Localization', + 'Topic :: Software Development :: Object Brokering', + 'Topic :: Software Development :: Object Brokering :: CORBA', + 'Topic :: Software Development :: Pre-processors', + 'Topic :: Software Development :: Quality Assurance', + 'Topic :: Software Development :: Testing', + 'Topic :: Software Development :: Testing :: Acceptance', + 'Topic :: Software Development :: Testing :: BDD', + 'Topic :: Software Development :: Testing :: Mocking', + 'Topic :: Software Development :: Testing :: Traffic Generation', + 'Topic :: Software Development :: Testing :: Unit', + 'Topic :: Software Development :: User Interfaces', + 'Topic :: Software Development :: Version Control', + 'Topic :: Software Development :: Version Control :: Bazaar', + 'Topic :: Software Development :: Version Control :: CVS', + 'Topic :: Software Development :: Version Control :: Git', + 'Topic :: Software Development :: Version Control :: Mercurial', + 'Topic :: Software Development :: Version Control :: RCS', + 'Topic :: Software Development :: Version Control :: SCCS', + 'Topic :: Software Development :: Widget Sets', + 'Topic :: System', + 'Topic :: System :: Archiving', + 'Topic :: System :: Archiving :: Backup', + 'Topic :: System :: Archiving :: Compression', + 'Topic :: System :: Archiving :: Mirroring', + 'Topic :: System :: Archiving :: Packaging', + 'Topic :: System :: Benchmark', + 'Topic :: System :: Boot', + 'Topic :: System :: Boot :: Init', + 'Topic :: System :: Clustering', + 'Topic :: System :: Console Fonts', + 'Topic :: System :: Distributed Computing', + 'Topic :: System :: Emulators', + 'Topic :: System :: Filesystems', + 'Topic :: System :: Hardware', + 'Topic :: System :: Hardware :: Hardware Drivers', + 'Topic :: System :: Hardware :: Mainframes', + 'Topic :: System :: Hardware :: Symmetric Multi-processing', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB)', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Audio', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Audio/Video (AV)', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Communications Device Class (CDC)', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Diagnostic Device', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Hub', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Human Interface Device (HID)', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Mass Storage', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Miscellaneous', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Printer', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Smart Card', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Vendor', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Video (UVC)', + 'Topic :: System :: Hardware :: Universal Serial Bus (USB) :: Wireless Controller', + 'Topic :: System :: Installation/Setup', + 'Topic :: System :: Logging', + 'Topic :: System :: Monitoring', + 'Topic :: System :: Networking', + 'Topic :: System :: Networking :: Firewalls', + 'Topic :: System :: Networking :: Monitoring', + 'Topic :: System :: Networking :: Monitoring :: Hardware Watchdog', + 'Topic :: System :: Networking :: Time Synchronization', + 'Topic :: System :: Operating System', + 'Topic :: System :: Operating System Kernels', + 'Topic :: System :: Operating System Kernels :: BSD', + 'Topic :: System :: Operating System Kernels :: GNU Hurd', + 'Topic :: System :: Operating System Kernels :: Linux', + 'Topic :: System :: Power (UPS)', + 'Topic :: System :: Recovery Tools', + 'Topic :: System :: Shells', + 'Topic :: System :: Software Distribution', + 'Topic :: System :: System Shells', + 'Topic :: System :: Systems Administration', + 'Topic :: System :: Systems Administration :: Authentication/Directory', + 'Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP', + 'Topic :: System :: Systems Administration :: Authentication/Directory :: NIS', + 'Topic :: Terminals', + 'Topic :: Terminals :: Serial', + 'Topic :: Terminals :: Telnet', + 'Topic :: Terminals :: Terminal Emulators/X Terminals', + 'Topic :: Text Editors', + 'Topic :: Text Editors :: Documentation', + 'Topic :: Text Editors :: Emacs', + 'Topic :: Text Editors :: Integrated Development Environments (IDE)', + 'Topic :: Text Editors :: Text Processing', + 'Topic :: Text Editors :: Word Processors', + 'Topic :: Text Processing', + 'Topic :: Text Processing :: Filters', + 'Topic :: Text Processing :: Fonts', + 'Topic :: Text Processing :: General', + 'Topic :: Text Processing :: Indexing', + 'Topic :: Text Processing :: Linguistic', + 'Topic :: Text Processing :: Markup', + 'Topic :: Text Processing :: Markup :: HTML', + 'Topic :: Text Processing :: Markup :: LaTeX', + 'Topic :: Text Processing :: Markup :: Markdown', + 'Topic :: Text Processing :: Markup :: SGML', + 'Topic :: Text Processing :: Markup :: VRML', + 'Topic :: Text Processing :: Markup :: XML', + 'Topic :: Text Processing :: Markup :: reStructuredText', + 'Topic :: Utilities', + 'Typing :: Stubs Only', + 'Typing :: Typed', +] +KNOWN_CLASSIFIERS = set(SORTED_CLASSIFIERS) + + +def is_private(classifier): + return classifier.lower().startswith('private ::') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/src/hatchling/metadata/core.py new/hatchling-1.7.1/src/hatchling/metadata/core.py --- old/hatchling-1.6.0/src/hatchling/metadata/core.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/src/hatchling/metadata/core.py 2020-02-02 01:00:00.000000000 +0100 @@ -799,6 +799,8 @@ https://peps.python.org/pep-0621/#classifiers """ if self._classifiers is None: + from hatchling.metadata.classifiers import KNOWN_CLASSIFIERS, SORTED_CLASSIFIERS, is_private + if 'classifiers' in self.config: classifiers = self.config['classifiers'] if 'classifiers' in self.dynamic: @@ -817,10 +819,12 @@ for i, classifier in enumerate(classifiers, 1): if not isinstance(classifier, str): raise TypeError(f'Classifier #{i} of field `project.classifiers` must be a string') + elif not is_private(classifier) and classifier not in KNOWN_CLASSIFIERS: + raise ValueError(f'Unknown classifier in field `project.classifiers`: {classifier}') unique_classifiers.add(classifier) - self._classifiers = sorted(unique_classifiers) + self._classifiers = sorted(unique_classifiers, key=lambda c: is_private(c) or SORTED_CLASSIFIERS.index(c)) return self._classifiers @@ -999,7 +1003,8 @@ else: if requirement.url and not self.hatch_metadata.allow_direct_references: raise ValueError( - f'Dependency #{i} of field `project.dependencies` cannot be a direct reference' + f'Dependency #{i} of field `project.dependencies` cannot be a direct reference unless ' + f'field `tool.hatch.metadata.allow-direct-references` is set to `true`' ) dependencies_complex[get_normalized_dependency(requirement)] = requirement @@ -1074,7 +1079,8 @@ if requirement.url and not self.hatch_metadata.allow_direct_references: raise ValueError( f'Dependency #{i} of option `{option}` of field `project.optional-dependencies` ' - f'cannot be a direct reference' + f'cannot be a direct reference unless field ' + f'`tool.hatch.metadata.allow-direct-references` is set to `true`' ) entries[get_normalized_dependency(requirement)] = requirement diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hatchling-1.6.0/tests/downstream/integrate.py new/hatchling-1.7.1/tests/downstream/integrate.py --- old/hatchling-1.6.0/tests/downstream/integrate.py 2020-02-02 01:00:00.000000000 +0100 +++ new/hatchling-1.7.1/tests/downstream/integrate.py 2020-02-02 01:00:00.000000000 +0100 @@ -78,6 +78,28 @@ shutil.rmtree(d, ignore_errors=False, onerror=handle_remove_readonly) +def get_venv_exe_dir(venv_dir): + exe_dir = os.path.join(venv_dir, 'Scripts' if ON_WINDOWS else 'bin') + if os.path.isdir(exe_dir): + return exe_dir + # PyPy + elif ON_WINDOWS: + exe_dir = os.path.join(venv_dir, 'bin') + if os.path.isdir(exe_dir): + return exe_dir + else: + raise OSError(f'Unable to locate executables directory within: {venv_dir}') + # Debian + elif os.path.isdir(os.path.join(venv_dir, 'local')): + exe_dir = os.path.join(venv_dir, 'local', 'bin') + if os.path.isdir(exe_dir): + return exe_dir + else: + raise OSError(f'Unable to locate executables directory within: {venv_dir}') + else: + raise OSError(f'Unable to locate executables directory within: {venv_dir}') + + def main(): original_backend_path = os.path.dirname(os.path.dirname(HERE)) with temp_dir() as links_dir, temp_dir() as build_dir: @@ -195,9 +217,7 @@ env_vars = dict(test_data.get('env_vars', {})) env_vars['VIRTUAL_ENV'] = venv_dir - env_vars[ - 'PATH' - ] = f'{os.path.join(venv_dir, "Scripts" if ON_WINDOWS else "bin")}{os.pathsep}{os.environ["PATH"]}' + env_vars['PATH'] = f'{get_venv_exe_dir(venv_dir)}{os.pathsep}{os.environ["PATH"]}' env_vars['PIP_CONSTRAINT'] = constraints_file with EnvVars(env_vars, ignore=('__PYVENV_LAUNCHER__', 'PYTHONHOME')): print('--> Installing project')