Imported Upstream version 2023.11.29 upstream/2023.11.29
authorTizenOpenSource <tizenopensrc@samsung.com>
Tue, 6 Feb 2024 04:12:15 +0000 (13:12 +0900)
committerTizenOpenSource <tizenopensrc@samsung.com>
Tue, 6 Feb 2024 04:12:15 +0000 (13:12 +0900)
22 files changed:
CONTRIBUTING.md [new file with mode: 0644]
LICENSE [new file with mode: 0644]
MANIFEST.in [new file with mode: 0644]
Makefile [new file with mode: 0644]
PKG-INFO [new file with mode: 0644]
README.md [new file with mode: 0644]
bin/sort.py [new file with mode: 0644]
pyproject.toml [new file with mode: 0644]
requirements/dev.txt [new file with mode: 0644]
setup.cfg [new file with mode: 0644]
setup.py [new file with mode: 0644]
src/trove_classifiers.egg-info/PKG-INFO [new file with mode: 0644]
src/trove_classifiers.egg-info/SOURCES.txt [new file with mode: 0644]
src/trove_classifiers.egg-info/dependency_links.txt [new file with mode: 0644]
src/trove_classifiers.egg-info/top_level.txt [new file with mode: 0644]
src/trove_classifiers/__init__.py [new file with mode: 0644]
src/trove_classifiers/__main__.py [new file with mode: 0644]
src/trove_classifiers/py.typed [new file with mode: 0644]
tests/__init__.py [new file with mode: 0644]
tests/lib/__init__.py [new file with mode: 0644]
tests/lib/__main__.py [new file with mode: 0644]
tests/test_classifiers.py [new file with mode: 0644]

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644 (file)
index 0000000..45a0ff5
--- /dev/null
@@ -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 (file)
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 (file)
index 0000000..3b644e1
--- /dev/null
@@ -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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..891c60a
--- /dev/null
@@ -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 (file)
index 0000000..05374a2
--- /dev/null
@@ -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 (file)
index 0000000..533f3b6
--- /dev/null
@@ -0,0 +1,5 @@
+black
+jinja2
+natsort
+pytest
+mypy
diff --git a/setup.cfg b/setup.cfg
new file mode 100644 (file)
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 (file)
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 (file)
index 0000000..d3e8286
--- /dev/null
@@ -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 (file)
index 0000000..dfb4d83
--- /dev/null
@@ -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 (file)
index 0000000..8b13789
--- /dev/null
@@ -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 (file)
index 0000000..9c98add
--- /dev/null
@@ -0,0 +1 @@
+trove_classifiers
diff --git a/src/trove_classifiers/__init__.py b/src/trove_classifiers/__init__.py
new file mode 100644 (file)
index 0000000..e81f417
--- /dev/null
@@ -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 (file)
index 0000000..e140469
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py
new file mode 100644 (file)
index 0000000..eb28aa6
--- /dev/null
@@ -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 (file)
index 0000000..83b8b45
--- /dev/null
@@ -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 (file)
index 0000000..2cbf721
--- /dev/null
@@ -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,)