From: TizenOpenSource Date: Tue, 6 Feb 2024 04:12:15 +0000 (+0900) Subject: Imported Upstream version 2023.11.29 X-Git-Tag: upstream/2023.11.29^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dd3747e9c8bde23339ef790e358d54e65d30368e;p=platform%2Fupstream%2Fpython3-trove_classifiers.git Imported Upstream version 2023.11.29 --- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..45a0ff5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,18 @@ +# Contributing +How to contributing to this package. + +## Running tests +Run `make test`. This checks whether the auto-generated list of classifiers +matches the input source. + +## Running linting +Run `make lint`. + +## Adding a new classifier +To add a new classifier, add to the `classifiers` set in +`trove_classifiers/__init__.py`. + +## Deprecating a classifier +To deprecate a classifier, move it from `classifiers` to +`deprecated_classifiers` in `trove_classifiers/__init__.py`, and list any new +classifiers that may replace it. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..3b644e1 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +include CONTRIBUTING.md +include Makefile +recursive-include bin *.py +recursive-include tests *.py +recursive-include requirements * diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..81c0d1e --- /dev/null +++ b/Makefile @@ -0,0 +1,26 @@ +BINDIR = $(PWD)/.state/env/bin + +.state/env/pyvenv.cfg: requirements/dev.txt + rm -rf .state/env + python -m venv .state/env + + # install/upgrade general requirements + $(BINDIR)/python -m pip install --upgrade pip setuptools wheel + + # install various types of requirements + $(BINDIR)/python -m pip install -r requirements/dev.txt + +test: .state/env/pyvenv.cfg + $(BINDIR)/python -m pip install . + $(BINDIR)/pytest + $(BINDIR)/python -m tests.lib + +lint: .state/env/pyvenv.cfg + $(BINDIR)/black --check bin setup.py src tests + $(BINDIR)/python bin/sort.py src/trove_classifiers/__init__.py + $(BINDIR)/mypy src + +reformat: .state/env/pyvenv.cfg + $(BINDIR)/black tests src + +.PHONY: build test lint reformat diff --git a/PKG-INFO b/PKG-INFO new file mode 100644 index 0000000..d3e8286 --- /dev/null +++ b/PKG-INFO @@ -0,0 +1,73 @@ +Metadata-Version: 2.1 +Name: trove-classifiers +Version: 2023.11.29 +Summary: Canonical source for classifiers on PyPI (pypi.org). +Home-page: https://github.com/pypa/trove-classifiers +Author: The PyPI Admins +Author-email: admin@pypi.org +Keywords: classifiers +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Typing :: Typed +Description-Content-Type: text/markdown +License-File: LICENSE + +Canonical source for [classifiers][1] on [PyPI][2]. + +Classifiers [categorize projects][3] per [PEP 301][4]. Use this package to +validate classifiers in packages for PyPI upload or download. + +## Usage + +To install [from PyPI][5]: + +``` +$ pip install trove-classifiers +``` + +This package can be invoked as a module to print a list of classifiers: + +``` +$ python -m trove_classifiers | grep -Ei pyramid +Framework :: Pyramid +``` + +In addition, this package's API is two importable objects: + +### Classifiers (`trove_classifiers.classifiers`) +A `set` containing classifiers (as strings). Useful for determining membership. + +Example - determine if a classifier is valid: + +```python +>>> from trove_classifiers import classifiers +>>> 'License :: OSI Approved' in classifiers +True +>>> 'Fuzzy :: Wuzzy :: Was :: A :: Bear' in classifiers +False +>>> +``` + +### Deprecated classifiers (`trove_classifiers.deprecated_classifiers`) +A `dict`, mapping a deprecated classifier (string) to a list of classifiers +which replaces it (strings). + +Example - determine if a classifier is deprecated: + +```python +>>> from trove_classifiers import deprecated_classifiers +>>> 'License :: OSI Approved' in deprecated_classifiers +False +>>> 'Natural Language :: Ukranian' in deprecated_classifiers +True +>>> deprecated_classifiers["Natural Language :: Ukranian"] +['Natural Language :: Ukrainian'] +``` + +[1]: https://pypi.org/classifiers/ +[2]: https://pypi.org +[3]: https://packaging.python.org/specifications/core-metadata/#classifier-multiple-use +[4]: https://www.python.org/dev/peps/pep-0301/ +[5]: https://pypi.org/project/trove-classifiers/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..67f6c49 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +Canonical source for [classifiers][1] on [PyPI][2]. + +Classifiers [categorize projects][3] per [PEP 301][4]. Use this package to +validate classifiers in packages for PyPI upload or download. + +## Usage + +To install [from PyPI][5]: + +``` +$ pip install trove-classifiers +``` + +This package can be invoked as a module to print a list of classifiers: + +``` +$ python -m trove_classifiers | grep -Ei pyramid +Framework :: Pyramid +``` + +In addition, this package's API is two importable objects: + +### Classifiers (`trove_classifiers.classifiers`) +A `set` containing classifiers (as strings). Useful for determining membership. + +Example - determine if a classifier is valid: + +```python +>>> from trove_classifiers import classifiers +>>> 'License :: OSI Approved' in classifiers +True +>>> 'Fuzzy :: Wuzzy :: Was :: A :: Bear' in classifiers +False +>>> +``` + +### Deprecated classifiers (`trove_classifiers.deprecated_classifiers`) +A `dict`, mapping a deprecated classifier (string) to a list of classifiers +which replaces it (strings). + +Example - determine if a classifier is deprecated: + +```python +>>> from trove_classifiers import deprecated_classifiers +>>> 'License :: OSI Approved' in deprecated_classifiers +False +>>> 'Natural Language :: Ukranian' in deprecated_classifiers +True +>>> deprecated_classifiers["Natural Language :: Ukranian"] +['Natural Language :: Ukrainian'] +``` + +[1]: https://pypi.org/classifiers/ +[2]: https://pypi.org +[3]: https://packaging.python.org/specifications/core-metadata/#classifier-multiple-use +[4]: https://www.python.org/dev/peps/pep-0301/ +[5]: https://pypi.org/project/trove-classifiers/ diff --git a/bin/sort.py b/bin/sort.py new file mode 100644 index 0000000..891c60a --- /dev/null +++ b/bin/sort.py @@ -0,0 +1,34 @@ +import ast +import sys + +from natsort import natsorted + + +def _test_sort(elements, _type): + values = [e.value for e in elements] + for wrong, right in zip(values, natsorted(values)): + if wrong != right: + print(f"{_type} is not sorted, {right!r} should come before {wrong!r}") + return True + return False + + +if len(sys.argv) == 1: + print("Usage: sort.py [filename]") + sys.exit(1) + + +with open(sys.argv[1]) as f: + contents = f.read() + +fail = False + +for node in ast.walk(ast.parse(contents)): + if type(node) == ast.List: + fail = _test_sort(node.elts, "List") or fail + if type(node) == ast.Set: + fail = _test_sort(node.elts, "Set") or fail + if type(node) == ast.Dict: + fail = _test_sort(node.keys, "Dict") or fail + +sys.exit(fail) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..05374a2 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,7 @@ +[build-system] +requires = ["setuptools", "calver"] +build-backend = "setuptools.build_meta" + +[tool.mypy] +strict = true +warn_unreachable = true diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 0000000..533f3b6 --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,5 @@ +black +jinja2 +natsort +pytest +mypy diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..8bfd5a1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,4 @@ +[egg_info] +tag_build = +tag_date = 0 + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..826eac7 --- /dev/null +++ b/setup.py @@ -0,0 +1,33 @@ +from io import open +from os import path + +from setuptools import setup, find_packages + +here = path.abspath(path.dirname(__file__)) + +# Get the long description from the README file +with open(path.join(here, "README.md"), encoding="utf-8") as f: + long_description = f.read() + +setup( + name="trove-classifiers", + description="Canonical source for classifiers on PyPI (pypi.org).", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/pypa/trove-classifiers", + author="The PyPI Admins", + author_email="admin@pypi.org", + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python :: 3", + "Typing :: Typed", + ], + keywords="classifiers", + package_dir={"": "src"}, + packages=find_packages(where="src"), + package_data={"": ["py.typed"]}, + use_calver=True, + setup_requires=["calver"], +) diff --git a/src/trove_classifiers.egg-info/PKG-INFO b/src/trove_classifiers.egg-info/PKG-INFO new file mode 100644 index 0000000..d3e8286 --- /dev/null +++ b/src/trove_classifiers.egg-info/PKG-INFO @@ -0,0 +1,73 @@ +Metadata-Version: 2.1 +Name: trove-classifiers +Version: 2023.11.29 +Summary: Canonical source for classifiers on PyPI (pypi.org). +Home-page: https://github.com/pypa/trove-classifiers +Author: The PyPI Admins +Author-email: admin@pypi.org +Keywords: classifiers +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python :: 3 +Classifier: Typing :: Typed +Description-Content-Type: text/markdown +License-File: LICENSE + +Canonical source for [classifiers][1] on [PyPI][2]. + +Classifiers [categorize projects][3] per [PEP 301][4]. Use this package to +validate classifiers in packages for PyPI upload or download. + +## Usage + +To install [from PyPI][5]: + +``` +$ pip install trove-classifiers +``` + +This package can be invoked as a module to print a list of classifiers: + +``` +$ python -m trove_classifiers | grep -Ei pyramid +Framework :: Pyramid +``` + +In addition, this package's API is two importable objects: + +### Classifiers (`trove_classifiers.classifiers`) +A `set` containing classifiers (as strings). Useful for determining membership. + +Example - determine if a classifier is valid: + +```python +>>> from trove_classifiers import classifiers +>>> 'License :: OSI Approved' in classifiers +True +>>> 'Fuzzy :: Wuzzy :: Was :: A :: Bear' in classifiers +False +>>> +``` + +### Deprecated classifiers (`trove_classifiers.deprecated_classifiers`) +A `dict`, mapping a deprecated classifier (string) to a list of classifiers +which replaces it (strings). + +Example - determine if a classifier is deprecated: + +```python +>>> from trove_classifiers import deprecated_classifiers +>>> 'License :: OSI Approved' in deprecated_classifiers +False +>>> 'Natural Language :: Ukranian' in deprecated_classifiers +True +>>> deprecated_classifiers["Natural Language :: Ukranian"] +['Natural Language :: Ukrainian'] +``` + +[1]: https://pypi.org/classifiers/ +[2]: https://pypi.org +[3]: https://packaging.python.org/specifications/core-metadata/#classifier-multiple-use +[4]: https://www.python.org/dev/peps/pep-0301/ +[5]: https://pypi.org/project/trove-classifiers/ diff --git a/src/trove_classifiers.egg-info/SOURCES.txt b/src/trove_classifiers.egg-info/SOURCES.txt new file mode 100644 index 0000000..dfb4d83 --- /dev/null +++ b/src/trove_classifiers.egg-info/SOURCES.txt @@ -0,0 +1,20 @@ +CONTRIBUTING.md +LICENSE +MANIFEST.in +Makefile +README.md +pyproject.toml +setup.py +bin/sort.py +requirements/dev.txt +src/trove_classifiers/__init__.py +src/trove_classifiers/__main__.py +src/trove_classifiers/py.typed +src/trove_classifiers.egg-info/PKG-INFO +src/trove_classifiers.egg-info/SOURCES.txt +src/trove_classifiers.egg-info/dependency_links.txt +src/trove_classifiers.egg-info/top_level.txt +tests/__init__.py +tests/test_classifiers.py +tests/lib/__init__.py +tests/lib/__main__.py \ No newline at end of file diff --git a/src/trove_classifiers.egg-info/dependency_links.txt b/src/trove_classifiers.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/trove_classifiers.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/trove_classifiers.egg-info/top_level.txt b/src/trove_classifiers.egg-info/top_level.txt new file mode 100644 index 0000000..9c98add --- /dev/null +++ b/src/trove_classifiers.egg-info/top_level.txt @@ -0,0 +1 @@ +trove_classifiers diff --git a/src/trove_classifiers/__init__.py b/src/trove_classifiers/__init__.py new file mode 100644 index 0000000..e81f417 --- /dev/null +++ b/src/trove_classifiers/__init__.py @@ -0,0 +1,863 @@ +from typing import Dict, List, Set + +# A set of classifier names +sorted_classifiers: List[str] = [ + "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", + "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 :: GPU :: NVIDIA CUDA :: 11.8", + "Environment :: GPU :: NVIDIA CUDA :: 12", + "Environment :: GPU :: NVIDIA CUDA :: 12 :: 12.0", + "Environment :: GPU :: NVIDIA CUDA :: 12 :: 12.1", + "Environment :: GPU :: NVIDIA CUDA :: 12 :: 12.2", + "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 :: WebAssembly", + "Environment :: WebAssembly :: Emscripten", + "Environment :: WebAssembly :: WASI", + "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 :: 4.2", + "Framework :: Django :: 5.0", + "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 :: Django CMS :: 3.11", + "Framework :: Django CMS :: 4.0", + "Framework :: Django CMS :: 4.1", + "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 :: MkDocs", + "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 :: Odoo :: 16.0", + "Framework :: Odoo :: 17.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 :: 6.1", + "Framework :: Plone :: Addon", + "Framework :: Plone :: Core", + "Framework :: Plone :: Distribution", + "Framework :: Plone :: Theme", + "Framework :: PySimpleGUI", + "Framework :: PySimpleGUI :: 4", + "Framework :: PySimpleGUI :: 5", + "Framework :: Pycsou", + "Framework :: Pydantic", + "Framework :: Pydantic :: 1", + "Framework :: Pydantic :: 2", + "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 :: Domain", + "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 :: Wagtail :: 4", + "Framework :: Wagtail :: 5", + "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 :: Zero-Clause BSD (0BSD)", + "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 :: Go", + "Programming Language :: Haskell", + "Programming Language :: Java", + "Programming Language :: JavaScript", + "Programming Language :: Kotlin", + "Programming Language :: Lisp", + "Programming Language :: Logo", + "Programming Language :: Lua", + "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 :: 3.13", + "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 :: File Formats", + "Topic :: File Formats :: JSON", + "Topic :: File Formats :: JSON :: JSON Schema", + "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 :: Oceanography", + "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", +] + +classifiers: Set[str] = set(sorted_classifiers) + + +# A mapping from the deprecated classifier name to a list of zero or more valid +# classifiers that should replace it +deprecated_classifiers: Dict[str, List[str]] = { + "Natural Language :: Ukranian": ["Natural Language :: Ukrainian"], + "Topic :: Communications :: Chat :: AOL Instant Messenger": [], +} + + +# All classifiers, including deprecated classifiers +all_classifiers: List[str] = sorted( + sorted_classifiers + list(deprecated_classifiers.keys()) +) diff --git a/src/trove_classifiers/__main__.py b/src/trove_classifiers/__main__.py new file mode 100644 index 0000000..e140469 --- /dev/null +++ b/src/trove_classifiers/__main__.py @@ -0,0 +1,4 @@ +from trove_classifiers import sorted_classifiers + +for classifier in sorted_classifiers: + print(classifier) diff --git a/src/trove_classifiers/py.typed b/src/trove_classifiers/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py new file mode 100644 index 0000000..eb28aa6 --- /dev/null +++ b/tests/lib/__init__.py @@ -0,0 +1,51 @@ +class InvalidClassifier(Exception): + pass + + +def trove_tester(classifiers, deprecated_classifiers): + # Check the classifiers + for classifier in classifiers: + split = classifier.split(" :: ") + + # Check if this is an invalid top-level classifier + if len(split) == 1: + raise InvalidClassifier(f"Top-level classifier {classifier!r} is invalid") + + # Check if all parent classifiers are specified + for i in range(2, len(split)): + parent = " :: ".join(split[:i]) + if parent not in classifiers: + raise InvalidClassifier(f"Classifier {parent!r} is missing") + + # Check the sub-classifiers + for sub in split: + # Check for whitespace + if sub.strip().rstrip() != sub: + raise InvalidClassifier( + "Classifiers starting or ending with whitespace are invalid" + ) + + # Check for private classifiers + if sub.lower().startswith("private"): + raise InvalidClassifier( + "Classifiers starting with 'Private' are invalid" + ) + + # Check for stray colons + if ":" in sub: + raise InvalidClassifier("Classifiers containing ':' are invalid") + + # Check the deprecated classifiers + for deprecated_classifier, deprecated_by in deprecated_classifiers.items(): + # Check if the classifier is in both lists + if deprecated_classifier in classifiers: + raise InvalidClassifier( + f"Classifier {deprecated_classifier!r} in both valid and deprecated classifiers" + ) + + # Check if all deprecated_by classifiers exist + for new_classifier in deprecated_by: + if new_classifier not in classifiers: + raise InvalidClassifier(f"Classifier {new_classifier!r} does not exist") + + print("All classifiers passed :)") diff --git a/tests/lib/__main__.py b/tests/lib/__main__.py new file mode 100644 index 0000000..83b8b45 --- /dev/null +++ b/tests/lib/__main__.py @@ -0,0 +1,4 @@ +from tests.lib import trove_tester +from trove_classifiers import classifiers, deprecated_classifiers + +trove_tester(classifiers, deprecated_classifiers) diff --git a/tests/test_classifiers.py b/tests/test_classifiers.py new file mode 100644 index 0000000..2cbf721 --- /dev/null +++ b/tests/test_classifiers.py @@ -0,0 +1,81 @@ +import pytest + +from tests.lib import trove_tester, InvalidClassifier + + +@pytest.mark.parametrize( + "classifiers, deprecated_classifiers", + [ + ( + { + "Foo :: Bar", + "Foo :: Bar :: Baz", + }, + {}, + ), + ({"Foo :: Bar"}, {"Biz :: Baz": ["Foo :: Bar"]}), + ], +) +def test_success(classifiers, deprecated_classifiers): + trove_tester(classifiers, deprecated_classifiers) + + +@pytest.mark.parametrize( + "classifiers, deprecated_classifiers, expected", + [ + ( + {"Foo", "Foo :: Bar"}, + {}, + "Top-level classifier 'Foo' is invalid", + ), + ({"Foo :: Bar :: Baz"}, {}, "Classifier 'Foo :: Bar' is missing"), + ( + { + "Foo :: Bar", + }, + {"Biz :: Baz": ["Bing :: Bang"]}, + "Classifier 'Bing :: Bang' does not exist", + ), + ( + { + "Foo :: Bar", + }, + {"Foo :: Bar": []}, + "Classifier 'Foo :: Bar' in both valid and deprecated classifiers", + ), + ({"Private :: Foo"}, {}, "Classifiers starting with 'Private' are invalid"), + ({"private :: Foo"}, {}, "Classifiers starting with 'Private' are invalid"), + ({"Foo :: Private"}, {}, "Classifiers starting with 'Private' are invalid"), + ({"Foo :: private"}, {}, "Classifiers starting with 'Private' are invalid"), + ( + {" Foo :: Bar"}, + {}, + "Classifiers starting or ending with whitespace are invalid", + ), + ( + {"Foo :: Bar "}, + {}, + "Classifiers starting or ending with whitespace are invalid", + ), + ( + {"Foo: :: Bar"}, + {}, + "Classifiers containing ':' are invalid", + ), + ( + {"Foo :: B:ar"}, + {}, + "Classifiers containing ':' are invalid", + ), + ( + {"Foo :: Bar: Baz"}, + {}, + "Classifiers containing ':' are invalid", + ), + ], +) +def test_failure(classifiers, deprecated_classifiers, expected): + with pytest.raises(InvalidClassifier) as excinfo: + trove_tester(classifiers, deprecated_classifiers) + + assert excinfo.value.args == (expected,)