New Upstream Release - pyroma

Ready changes

Summary

Merged new upstream version: 4.2 (was: 2.6b2).

Diff

diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000..c19730e
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,25 @@
+# Run the linting suite for the pyroma package
+# Based on https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
+
+name: Lint package
+
+on: [pull_request, push]
+
+env:
+  FORCE_COLOR: 1
+
+jobs:
+  build:
+    name: Run pre-commit
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+      - name: Set up Python
+        uses: actions/setup-python@v4
+        with:
+          python-version: '3.x'
+      - name: Run pre-commit hooks
+        uses: pre-commit/action@v3.0.0
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..804480b
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,33 @@
+# Runs the unit tests for the pyroma package
+# Based on https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
+
+name: Test package
+
+on: [pull_request, push]
+
+env:
+  FORCE_COLOR: 1
+
+jobs:
+  build:
+    name: Run package tests
+
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest, macos-latest, windows-latest]
+        python-version: ['3.7', '3.11', 'pypy-3.7']
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v3
+      - name: Set up Python ${{ matrix.python-version }}
+        uses: actions/setup-python@v4
+        with:
+          python-version: ${{ matrix.python-version }}
+      - name: Upgrade pip
+        run: python -m pip install --upgrade pip
+      - name: Install package
+        run: pip install -e .[test]
+      - name: Run tests
+        run: python -bb -X dev -W ignore::UserWarning:setuptools.dist -m unittest -v pyroma.tests
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6565084
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+syntax: glob
+*.pyc
+*.egg-info
+*.egg
+EGG-INFO
+dist
+build
+py2*
+py3*
+.tox
+*.wpr
+*.wpu
+*.bak
+*.class
+.venv
+.env
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..954df82
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,19 @@
+repos:
+-   repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.3.0
+    hooks:
+    -   id: check-yaml
+    -   id: end-of-file-fixer
+    -   id: trailing-whitespace
+-   repo: https://github.com/psf/black
+    rev: 22.6.0
+    hooks:
+    -   id: black
+-   repo: https://github.com/pycqa/flake8
+    rev: 5.0.4
+    hooks:
+    -   id: flake8
+-   repo: https://github.com/regebro/pyroma
+    rev: '4.0'
+    hooks:
+    -   id: pyroma
diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml
new file mode 100644
index 0000000..a2cd79f
--- /dev/null
+++ b/.pre-commit-hooks.yaml
@@ -0,0 +1,8 @@
+-   id: pyroma
+    name: Check package with Pyroma
+    description: Check how well a Python package conforms to best practices.
+    entry: pyroma
+    args: ["-d", "--min=10", "."]
+    language: python
+    pass_filenames: false
+    always_run: true
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 7f4a163..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-language: python
-os:
-  - linux
-matrix:
-  fast_finish: true
-  include:
-  - python: 2.7
-  - python: 3.6
-  - python: 3.7
-    dist: xenial
-  - python: pypy
-  - python: pypy3
-install:
-  - pip install -U setuptools>=39.2.0
-  - python setup.py develop
-script: python setup.py test
-
diff --git a/HISTORY.txt b/CHANGES.txt
similarity index 64%
rename from HISTORY.txt
rename to CHANGES.txt
index 0e3cdfe..31089da 100644
--- a/HISTORY.txt
+++ b/CHANGES.txt
@@ -1,18 +1,135 @@
 Changelog
 =========
 
-2.6b2 (2019-10-26)
+4.2 (2023-02-25)
+----------------
+
+- Fall back to installing project's build backend in an isolated environment
+  if a compatible version isn't installed in the current env [CAM-Gerlach]
+
+- Fix metadata extraction failure when project ``long_description`` is included
+  as a header rather than a payload in the ``METADTA`` file [CAM-Gerlach]
+
+- Add a fallback to restore compatibility with Setuptools <61 [CAM-Gerlach]
+
+- Fix tests failing due to invalid versions on Setuptools >=66 [CAM-Gerlach]
+
+- Add ``python_requires``, update classifiers, add implicit dependencies
+  and remove unused deps in Pyroma's own packaging metadata [CAM-Gerlach]
+
+
+4.1 (2022-11-24)
+----------------
+
+- Moved from a custom trove classifiers list to using the trove-classifiers
+  package [hugovk]
+
+- Support checking the Requires-Python metadata [davidandreoletti]
+
+- Silence noisy build backend output when building metadata
+  [CAM-Gerlach, wesleybl]
+
+- Official support for Python 3.11 [hugovk, radarhere]
+
+- Some string formatting bugs [hugovk, CAM-Gerlach]
+
+- Now follows black and flake8 rules
+
+- Check if author_email field contains author name [bessman]
+
+
+4.0 (2022-04-14)
+----------------
+
+- No changes from 4.0b2.
+
+
+4.0b2 (2022-03-29)
 ------------------
 
-- Ran flake8 and black on the code, better formatting for 
-  classifiers.py generation.
-  
-- Support for PEP 517, setup.cfg-only packages. [Max Tyulin]
+- The deprecation test for test_suite is no longer needed, as the patched
+  setuptools method of gathering metadata as a whole is deprecated.
+
+- `description_content_type` also needs a mapping in the metadata map.
+
+
+4.0b1 (2022-03-28)
+------------------
+
+- Added support for PEP517 by using `build` to build the metadata as a
+  preferred build method over the old patched setuptools method.
+  The old way is depracated and will be removed in 5.0, which also is
+  planned to support PEP621.
+  Thanks to Christopher A.M. Gerlach for valuable insight into the
+  modern packaging systems.
+
+
+3.3 (2022-03-28)
+----------------
+
+- Add a deprecation for `test_suite`
 
 
-2.6b1 (2019-07-17)
+3.2.1 (2022-03-27)
 ------------------
 
+- Fixed __getattr__-related crash in tests with python3.7 [Robert T. McGibbon]
+
+
+3.2 (2021-06-22)
+----------------
+
+- Added support for pre-commit [CAM Gerlach]
+
+- Rewrote parts of the PyPI support, to avoid using the xmlrpc API,
+  since it's being heavily rate-limited at the moment. Only one call
+  is using it now, which seems to work fine.
+
+- Backwards incompatible change: As a result of the above change, when
+  looking for packages on PyPI, the package name must now be spelled
+  exactly correct, including capitalization.
+
+- Some more code cleanup/modernization [CAM Gerlach]
+
+- Added --quiet option to output only the rating [Hugo van Kemenade]
+
+- Pyroma is now an executable module, and can be called with `python -m pyroma` [RuRo]
+
+
+3.1 (2021-03-06)
+----------------
+
+- Added correct detection of setup.py encoding
+
+- Code cleanup [CAM Gerlach]
+
+
+3.0.1 (2021-03-02)
+------------------
+
+- Drop support for Python 2 [Florian Bruhin]
+
+- Add back official support for Python 3.6, I didn't realize it was still officially supported
+
+
+2.6.1 (2021-02-16)
+------------------
+
+- Update to the current list of Trove classifiers.
+
+- Officially support Python 3.8 and 3.9
+
+- Drop official support for Python 3.5 and 3.6 (still works though).
+
+
+2.6 (2019-11-02)
+----------------
+
+- Ran flake8 and black on the code, better formatting for
+  classifiers.py generation.
+
+- Support for PEP 517, setup.cfg-only packages. [Max Tyulin]
+
 - Adds support for Markdown long_descriptions, if you set
   long_description_content_type to 'text/markdown'
 
diff --git a/DEVELOPMENT.rst b/DEVELOPMENT.rst
index 80c0e2e..fa15823 100644
--- a/DEVELOPMENT.rst
+++ b/DEVELOPMENT.rst
@@ -14,8 +14,8 @@ For each Python version supported by Pyroma you need to make sure the
 "complete" package that is used for testing also supports that version of
 Python. The complete data supports both Python 2 and Python 3 and depends on
 the "six" package. As such it's highly unlikely you'll have to change any
-code. However, you have to mark the package as supporting the Python 
-version. 
+code. However, you have to mark the package as supporting the Python
+version.
 
 This is most easily done by searching the code for "Python :: 3.2" and
 adding the Python version that you want to support to the lists of
diff --git a/MANIFEST.in b/MANIFEST.in
index 3209df1..785a02d 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,7 +1,8 @@
 include *.txt
-recursive-include pyroma/testdata *.py *.txt *.cfg *.html
+recursive-include pyroma/testdata *.py *.txt *.cfg *.html *.json *.toml
 prune pyroma/testdata/complete/*.egg
 graft pyroma/testdata/distributions
 include tox.ini
 include DEVELOPMENT.rst
 include Makefile
+exclude .pre-commit-config.yaml
diff --git a/Makefile b/Makefile
index 6934c56..1d53eb3 100644
--- a/Makefile
+++ b/Makefile
@@ -34,5 +34,3 @@ clean-pyc: ## remove Python file artifacts
 
 prepare-release:
 	python fetch_classifiers.py
-
-
diff --git a/README.rst b/README.rst
index a09b402..5fb9ace 100644
--- a/README.rst
+++ b/README.rst
@@ -40,6 +40,7 @@ In all cases the output is similar::
     Cottage Cheese
     ------------------------------
 
+
 Tests
 -----
 
@@ -71,6 +72,9 @@ This is the list of checks that are currently performed:
 
 * You should have classifiers specifying the supported Python versions.
 
+* You should have ``requires-python``/``python_requires``
+  specifying the Python versions you support.
+
 * You should have a classifier specifying the project license.
 
 * If you are checking on a PyPI package, and not a local directory or
@@ -82,6 +86,22 @@ This is the list of checks that are currently performed:
   local package, pyroma will check that you have uploaded a source
   distribution, and not just binary distributions.
 
+
+Version control integration
+---------------------------
+
+With `pre-commit <https://pre-commit.com>`_, pyroma can be run whenever you
+commit your work by adding the following to your ``.pre-commit-config.yaml``:
+
+.. code-block:: yaml
+
+    repos:
+    -   repo: https://github.com/regebro/pyroma
+        rev: "3.2"
+        hooks:
+        -   id: pyroma
+
+
 Credits
 -------
 
@@ -91,9 +111,10 @@ The name "Pyroma" was coined by Wichert Akkerman, wichert@wiggy.net
 
 Contributors:
 
+  * David Andreoletti
   * Godefroid Chapelle
   * Dmitry Vakhrushev
-  * hugovk
+  * Hugo van Kemenade
   * Jeff Quast
   * Maurits van Rees
   * Hervé Beraud
@@ -105,3 +126,9 @@ Contributors:
   * Nikita Sobolev
   * Charles Tapley Hoyt
   * Max Tyulin
+  * Michael Howitz
+  * Florian Bruhin
+  * Christopher A.M. Gerlach
+  * RuRo
+  * Wesley Barroso Lopes
+  * Alexander Bessman
diff --git a/debian/changelog b/debian/changelog
index 98eee89..8fa8ac4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+pyroma (4.2-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 28 Jan 2024 14:26:39 -0000
+
 pyroma (2.6b2-1) unstable; urgency=medium
 
   [ Ondřej Nový ]
diff --git a/fetch_classifiers.py b/fetch_classifiers.py
deleted file mode 100644
index 6b5b2f1..0000000
--- a/fetch_classifiers.py
+++ /dev/null
@@ -1,68 +0,0 @@
-import os
-import re
-
-from collections import defaultdict
-
-try:
-    from urllib.request import urlopen
-except ImportError:
-    from urllib import urlopen
-
-CLASSIFIER_URL = "https://pypi.org/pypi?%3Aaction=list_classifiers"
-CLASSIFIER_FILE = "pyroma/classifiers.py"
-SHORT_NAME_RE = re.compile(br"\(.*?\)")
-
-
-def update_classifiers():
-    source = urlopen(CLASSIFIER_URL).read()
-    classifiers = [each.strip() for each in source.splitlines()]
-    licenses = [each for each in classifiers if each.startswith(b"License")]
-    license_map = defaultdict(set)
-    code_map = defaultdict(set)
-    for license in licenses:
-        short_name = SHORT_NAME_RE.findall(license)
-        if short_name:
-            short_name = short_name[0][1:-1]
-            code_map[short_name].add(license)
-            license_map[license].add(short_name)
-            if short_name.startswith(b"GPL"):
-                code_map[b"GPL"].add(license)
-                license_map[license].add(b"GPL")
-            elif short_name.startswith(b"LGPL"):
-                code_map[b"LGPL"].add(license)
-                license_map[license].add(b"LGPL")
-        elif b"Zope" in license:
-            code_map[b"ZPL"].add(license)
-            license_map[license].add(b"ZPL")
-        elif b"MIT License" in license:
-            code_map[b"MIT"].add(license)
-            license_map[license].add(b"MIT")
-
-    with open(CLASSIFIER_FILE, "wb") as out:
-        out.write(b"""CLASSIFIERS = {\n""")
-        for classifier in classifiers:
-            out.write(b'    "%s",\n' % classifier)
-        out.write(b"""}\n\n""")
-
-        out.write(b"""LICENSE_CODES = {\n""")
-        for license, codes in license_map.items():
-            out.write(b'    "%s": {"' % license)
-            out.write(b'", "'.join(codes))
-            out.write(b'"},\n')
-        out.write(b"""}\n\n""")
-
-        out.write(b"""CODE_LICENSES = {\n""")
-        for code, licenses in code_map.items():
-            out.write(b'    "%s": {\n        "' % code)
-            out.write(b'",\n        "'.join(licenses))
-            out.write(b'"},\n')
-        out.write(b"""}\n\n""")
-
-
-if __name__ == "__main__":
-    # Verify that we are in the right directory
-    if not os.path.exists(CLASSIFIER_FILE):
-        raise RuntimeError(
-            "You must run this script from the root directory of " "a Pyroma checkout."
-        )
-    update_classifiers()
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..55ec8d7
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,2 @@
+[tool.black]
+line-length = 120
diff --git a/pyroma/__init__.py b/pyroma/__init__.py
index 3afea82..6f9970e 100644
--- a/pyroma/__init__.py
+++ b/pyroma/__init__.py
@@ -1,16 +1,19 @@
+import logging
 import os
 import sys
 from optparse import OptionParser
 from pyroma import projectdata, distributiondata, pypidata, ratings
 
-import logging
-
 logging.basicConfig(level=logging.DEBUG, stream=sys.stdout, format="%(message)s")
 
 
 def zester(data):
-    main_files = os.listdir(data["workingdir"])
-    if "setup.py" not in main_files and "setup.cfg" not in main_files:
+    main_files = set(os.listdir(data["workingdir"]))
+    config_files = {"setup.py", "setup.cfg", "pyproject.toml"}
+
+    # If there are no standard Python config files in the main files
+    # it's likely not a Python project, so just return.
+    if not config_files & main_files:
         return
 
     from zest.releaser.utils import ask
@@ -23,10 +26,7 @@ def zester(data):
 
 
 def main():
-    usage = (
-        "usage: %prog [-n N] [-a|-d|-f|-p] <project directory|"
-        "distribution file|pypi package name>"
-    )
+    usage = "usage: %prog [-n N] [-a|-d|-f|-p] <project directory|distribution file|pypi package name>"
     parser = OptionParser(usage)
     parser.add_option(
         "-n",
@@ -69,6 +69,14 @@ def main():
         default=False,
         help="Run pyroma on a package on PyPI",
     )
+    parser.add_option(
+        "-q",
+        "--quiet",
+        dest="quiet",
+        action="store_true",
+        default=False,
+        help="Output only the rating",
+    )
 
     (options, args) = parser.parse_args()
 
@@ -81,7 +89,7 @@ def main():
         sys.exit(1)
 
     modes = (options.auto, options.directory, options.file, options.pypi)
-    if sum([1 if x else 0 for x in modes]) > 1:
+    if sum(1 if x else 0 for x in modes) > 1:
         print("You can only select one of the options -a, -d, -f and -p")
         sys.exit(1)
 
@@ -98,13 +106,17 @@ def main():
     elif options.file:
         mode = "file"
 
-    rating = run(mode, argument)
+    rating = run(mode, argument, options.quiet)
     if rating < options.min:
         sys.exit(2)
     sys.exit(0)
 
 
-def run(mode, argument):
+def run(mode, argument, quiet=False):
+
+    if quiet:
+        logger = logging.getLogger()
+        logger.disabled = True
 
     logging.info("-" * 30)
     logging.info("Checking " + argument)
@@ -134,4 +146,8 @@ def run(mode, argument):
     logging.info(ratings.LEVELS[rating[0]])
     logging.info("-" * 30)
 
+    if quiet:
+        logger.disabled = False
+        logging.info(rating[0])
+
     return rating[0]
diff --git a/pyroma/__main__.py b/pyroma/__main__.py
new file mode 100644
index 0000000..29c2e0a
--- /dev/null
+++ b/pyroma/__main__.py
@@ -0,0 +1,5 @@
+from . import main
+
+
+if __name__ == "__main__":
+    main()
diff --git a/pyroma/classifiers.py b/pyroma/classifiers.py
deleted file mode 100644
index 031489c..0000000
--- a/pyroma/classifiers.py
+++ /dev/null
@@ -1,875 +0,0 @@
-CLASSIFIERS = {
-    "Development Status :: 1 - Planning",
-    "Development Status :: 2 - Pre-Alpha",
-    "Development Status :: 3 - Alpha",
-    "Development Status :: 4 - Beta",
-    "Development Status :: 5 - Production/Stable",
-    "Development Status :: 6 - Mature",
-    "Development Status :: 7 - Inactive",
-    "Environment :: Console",
-    "Environment :: Console :: Curses",
-    "Environment :: Console :: Framebuffer",
-    "Environment :: Console :: Newt",
-    "Environment :: Console :: svgalib",
-    "Environment :: Handhelds/PDA's",
-    "Environment :: MacOS X",
-    "Environment :: MacOS X :: Aqua",
-    "Environment :: MacOS X :: Carbon",
-    "Environment :: MacOS X :: Cocoa",
-    "Environment :: No Input/Output (Daemon)",
-    "Environment :: OpenStack",
-    "Environment :: Other Environment",
-    "Environment :: Plugins",
-    "Environment :: Web Environment",
-    "Environment :: Web Environment :: Buffet",
-    "Environment :: Web Environment :: Mozilla",
-    "Environment :: Web Environment :: ToscaWidgets",
-    "Environment :: Win32 (MS Windows)",
-    "Environment :: X11 Applications",
-    "Environment :: X11 Applications :: Gnome",
-    "Environment :: X11 Applications :: GTK",
-    "Environment :: X11 Applications :: KDE",
-    "Environment :: X11 Applications :: Qt",
-    "Framework :: AiiDA",
-    "Framework :: AsyncIO",
-    "Framework :: BEAT",
-    "Framework :: BFG",
-    "Framework :: Bob",
-    "Framework :: Bottle",
-    "Framework :: Buildout",
-    "Framework :: Buildout :: Extension",
-    "Framework :: Buildout :: Recipe",
-    "Framework :: CastleCMS",
-    "Framework :: CastleCMS :: Theme",
-    "Framework :: Chandler",
-    "Framework :: CherryPy",
-    "Framework :: CubicWeb",
-    "Framework :: Django",
-    "Framework :: Django :: 1.10",
-    "Framework :: Django :: 1.11",
-    "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 :: 2.0",
-    "Framework :: Django :: 2.1",
-    "Framework :: Django :: 2.2",
-    "Framework :: Django :: 3.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 :: Flake8",
-    "Framework :: Flask",
-    "Framework :: Hypothesis",
-    "Framework :: IDLE",
-    "Framework :: IPython",
-    "Framework :: Jupyter",
-    "Framework :: Lektor",
-    "Framework :: Masonite",
-    "Framework :: Nengo",
-    "Framework :: Odoo",
-    "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 :: Addon",
-    "Framework :: Plone :: Core",
-    "Framework :: Plone :: Theme",
-    "Framework :: Pylons",
-    "Framework :: Pyramid",
-    "Framework :: Pytest",
-    "Framework :: Review Board",
-    "Framework :: Robot Framework",
-    "Framework :: Robot Framework :: Library",
-    "Framework :: Robot Framework :: Tool",
-    "Framework :: Scrapy",
-    "Framework :: Setuptools Plugin",
-    "Framework :: Sphinx",
-    "Framework :: Sphinx :: Extension",
-    "Framework :: Sphinx :: Theme",
-    "Framework :: tox",
-    "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 :: ZODB",
-    "Framework :: Zope",
-    "Framework :: Zope2",
-    "Framework :: Zope :: 2",
-    "Framework :: Zope3",
-    "Framework :: Zope :: 3",
-    "Framework :: Zope :: 4",
-    "Framework :: Zope :: 5",
-    "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 for non-commercial use",
-    "License :: Freely Distributable",
-    "License :: Free To Use But Restricted",
-    "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 :: Boost Software License 1.0 (BSL-1.0)",
-    "License :: OSI Approved :: BSD License",
-    "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 :: Intel Open Source License",
-    "License :: OSI Approved :: ISC License (ISCL)",
-    "License :: OSI Approved :: Jabber Open Source License",
-    "License :: OSI Approved :: MirOS License (MirOS)",
-    "License :: OSI Approved :: MIT License",
-    "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)",
-    "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 :: 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 :: 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 :: zlib/libpng License",
-    "License :: OSI Approved :: Zope Public License",
-    "License :: Other/Proprietary License",
-    "License :: Public Domain",
-    "License :: Repoze Public License",
-    "Natural Language :: Afrikaans",
-    "Natural Language :: Arabic",
-    "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 :: Italian",
-    "Natural Language :: Japanese",
-    "Natural Language :: Javanese",
-    "Natural Language :: Korean",
-    "Natural Language :: Latin",
-    "Natural Language :: Latvian",
-    "Natural Language :: Macedonian",
-    "Natural Language :: Malay",
-    "Natural Language :: Marathi",
-    "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 :: iOS",
-    "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 10",
-    "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 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/2",
-    "Operating System :: OS Independent",
-    "Operating System :: Other OS",
-    "Operating System :: PalmOS",
-    "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 :: Unix",
-    "Programming Language :: Ada",
-    "Programming Language :: APL",
-    "Programming Language :: ASP",
-    "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 :: Delphi/Kylix",
-    "Programming Language :: Dylan",
-    "Programming Language :: Eiffel",
-    "Programming Language :: Emacs-Lisp",
-    "Programming Language :: Erlang",
-    "Programming Language :: Euler",
-    "Programming Language :: Euphoria",
-    "Programming Language :: F#",
-    "Programming Language :: Forth",
-    "Programming Language :: Fortran",
-    "Programming Language :: Haskell",
-    "Programming Language :: Java",
-    "Programming Language :: JavaScript",
-    "Programming Language :: Lisp",
-    "Programming Language :: Logo",
-    "Programming Language :: ML",
-    "Programming Language :: Modula",
-    "Programming Language :: Objective C",
-    "Programming Language :: Object Pascal",
-    "Programming Language :: OCaml",
-    "Programming Language :: Other",
-    "Programming Language :: Other Scripting Engines",
-    "Programming Language :: Pascal",
-    "Programming Language :: Perl",
-    "Programming Language :: PHP",
-    "Programming Language :: Pike",
-    "Programming Language :: Pliant",
-    "Programming Language :: PL/SQL",
-    "Programming Language :: PROGRESS",
-    "Programming Language :: Prolog",
-    "Programming Language :: Python",
-    "Programming Language :: Python :: 2",
-    "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 :: 2 :: Only",
-    "Programming Language :: Python :: 3",
-    "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 :: Only",
-    "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 :: Scheme",
-    "Programming Language :: Simula",
-    "Programming Language :: Smalltalk",
-    "Programming Language :: SQL",
-    "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 :: Mailing List Servers",
-    "Topic :: Communications :: Email :: Mail Transport Agents",
-    "Topic :: Communications :: Email :: Post-Office",
-    "Topic :: Communications :: Email :: Post-Office :: IMAP",
-    "Topic :: Communications :: Email :: Post-Office :: POP3",
-    "Topic :: Communications :: Fax",
-    "Topic :: Communications :: FIDO",
-    "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 :: Gnome",
-    "Topic :: Desktop Environment :: GNUstep",
-    "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 :: Fluxbox",
-    "Topic :: Desktop Environment :: Window Managers :: Fluxbox :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: FVWM",
-    "Topic :: Desktop Environment :: Window Managers :: FVWM :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: IceWM",
-    "Topic :: Desktop Environment :: Window Managers :: IceWM :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: MetaCity",
-    "Topic :: Desktop Environment :: Window Managers :: MetaCity :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: Oroborus",
-    "Topic :: Desktop Environment :: Window Managers :: Oroborus :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: Sawfish",
-    "Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes 0.30",
-    "Topic :: Desktop Environment :: Window Managers :: Sawfish :: Themes pre-0.30",
-    "Topic :: Desktop Environment :: Window Managers :: Waimea",
-    "Topic :: Desktop Environment :: Window Managers :: Waimea :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: Window Maker",
-    "Topic :: Desktop Environment :: Window Managers :: Window Maker :: Applets",
-    "Topic :: Desktop Environment :: Window Managers :: Window Maker :: Themes",
-    "Topic :: Desktop Environment :: Window Managers :: XFCE",
-    "Topic :: Desktop Environment :: Window Managers :: XFCE :: Themes",
-    "Topic :: Documentation",
-    "Topic :: Documentation :: Sphinx",
-    "Topic :: Education",
-    "Topic :: Education :: Computer Aided Instruction (CAI)",
-    "Topic :: Education :: Testing",
-    "Topic :: Games/Entertainment",
-    "Topic :: Games/Entertainment :: Arcade",
-    "Topic :: Games/Entertainment :: Board Games",
-    "Topic :: Games/Entertainment :: First Person Shooters",
-    "Topic :: Games/Entertainment :: Fortune Cookies",
-    "Topic :: Games/Entertainment :: Multi-User Dungeons (MUD)",
-    "Topic :: Games/Entertainment :: Puzzle Games",
-    "Topic :: Games/Entertainment :: Real Time Strategy",
-    "Topic :: Games/Entertainment :: Role-Playing",
-    "Topic :: Games/Entertainment :: Side-Scrolling/Arcade Games",
-    "Topic :: Games/Entertainment :: Simulation",
-    "Topic :: Games/Entertainment :: Turn Based Strategy",
-    "Topic :: Home Automation",
-    "Topic :: Internet",
-    "Topic :: Internet :: File Transfer Protocol (FTP)",
-    "Topic :: Internet :: Finger",
-    "Topic :: Internet :: Log Analysis",
-    "Topic :: Internet :: Name Service (DNS)",
-    "Topic :: Internet :: Proxy Servers",
-    "Topic :: Internet :: WAP",
-    "Topic :: Internet :: WWW/HTTP",
-    "Topic :: Internet :: WWW/HTTP :: Browsers",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: CGI Tools/Libraries",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Content Management System",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Message Boards",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: News/Diary",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Page Counters",
-    "Topic :: Internet :: WWW/HTTP :: Dynamic Content :: Wiki",
-    "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
-    "Topic :: Internet :: WWW/HTTP :: Indexing/Search",
-    "Topic :: Internet :: WWW/HTTP :: Session",
-    "Topic :: Internet :: WWW/HTTP :: Site Management",
-    "Topic :: Internet :: WWW/HTTP :: Site Management :: Link Checking",
-    "Topic :: Internet :: WWW/HTTP :: WSGI",
-    "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
-    "Topic :: Internet :: WWW/HTTP :: WSGI :: Middleware",
-    "Topic :: Internet :: WWW/HTTP :: WSGI :: Server",
-    "Topic :: Internet :: XMPP",
-    "Topic :: Internet :: Z39.50",
-    "Topic :: Multimedia",
-    "Topic :: Multimedia :: Graphics",
-    "Topic :: Multimedia :: Graphics :: 3D Modeling",
-    "Topic :: Multimedia :: Graphics :: 3D Rendering",
-    "Topic :: Multimedia :: Graphics :: Capture",
-    "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera",
-    "Topic :: Multimedia :: Graphics :: Capture :: Scanners",
-    "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture",
-    "Topic :: Multimedia :: Graphics :: Editors",
-    "Topic :: Multimedia :: Graphics :: Editors :: Raster-Based",
-    "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based",
-    "Topic :: Multimedia :: Graphics :: Graphics Conversion",
-    "Topic :: Multimedia :: Graphics :: Presentation",
-    "Topic :: Multimedia :: Graphics :: Viewers",
-    "Topic :: Multimedia :: Sound/Audio",
-    "Topic :: Multimedia :: Sound/Audio :: Analysis",
-    "Topic :: Multimedia :: Sound/Audio :: Capture/Recording",
-    "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 :: 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 Recognition",
-    "Topic :: Scientific/Engineering :: Information Analysis",
-    "Topic :: Scientific/Engineering :: Interface Engine/Protocol Translator",
-    "Topic :: Scientific/Engineering :: Mathematics",
-    "Topic :: Scientific/Engineering :: Medical Science Apps.",
-    "Topic :: Scientific/Engineering :: Physics",
-    "Topic :: Scientific/Engineering :: Visualization",
-    "Topic :: Security",
-    "Topic :: Security :: Cryptography",
-    "Topic :: Sociology",
-    "Topic :: Sociology :: Genealogy",
-    "Topic :: Sociology :: History",
-    "Topic :: Software Development",
-    "Topic :: Software Development :: Assemblers",
-    "Topic :: Software Development :: Bug Tracking",
-    "Topic :: Software Development :: Build Tools",
-    "Topic :: Software Development :: Code Generators",
-    "Topic :: Software Development :: Compilers",
-    "Topic :: Software Development :: Debuggers",
-    "Topic :: Software Development :: Disassemblers",
-    "Topic :: Software Development :: Documentation",
-    "Topic :: Software Development :: Embedded Systems",
-    "Topic :: Software Development :: Internationalization",
-    "Topic :: Software Development :: Interpreters",
-    "Topic :: Software Development :: Libraries",
-    "Topic :: Software Development :: Libraries :: Application Frameworks",
-    "Topic :: Software Development :: Libraries :: Java Libraries",
-    "Topic :: Software Development :: Libraries :: Perl Modules",
-    "Topic :: Software Development :: Libraries :: PHP Classes",
-    "Topic :: Software Development :: Libraries :: Pike Modules",
-    "Topic :: Software Development :: Libraries :: pygame",
-    "Topic :: Software Development :: Libraries :: Python Modules",
-    "Topic :: Software Development :: Libraries :: Ruby Modules",
-    "Topic :: Software Development :: Libraries :: Tcl Extensions",
-    "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 :: 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 :: Systems Administration",
-    "Topic :: System :: Systems Administration :: Authentication/Directory",
-    "Topic :: System :: Systems Administration :: Authentication/Directory :: LDAP",
-    "Topic :: System :: Systems Administration :: Authentication/Directory :: NIS",
-    "Topic :: System :: System Shells",
-    "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 :: SGML",
-    "Topic :: Text Processing :: Markup :: VRML",
-    "Topic :: Text Processing :: Markup :: XML",
-    "Topic :: Utilities",
-    "Typing :: Typed",
-}
-
-LICENSE_CODES = {
-    "License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)": {"EPL-2.0"},
-    "License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication": {"CC0 1.0"},
-    "License :: OSI Approved :: Sun Industry Standards Source License (SISSL)": {
-        "SISSL"
-    },
-    "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)": {
-        "GPLv2+",
-        "GPL",
-    },
-    "License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)": {"EPL-1.0"},
-    "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)": {
-        "LGPL",
-        "LGPLv3",
-    },
-    "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)": {"MPL 2.0"},
-    "License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)": {
-        "EUPL 1.0"
-    },
-    "License :: CeCILL-C Free Software License Agreement (CECILL-C)": {"CECILL-C"},
-    "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)": {
-        "LGPL",
-        "LGPLv2+",
-    },
-    "License :: OSI Approved :: GNU General Public License v3 (GPLv3)": {
-        "GPL",
-        "GPLv3",
-    },
-    "License :: CeCILL-B Free Software License Agreement (CECILL-B)": {"CECILL-B"},
-    "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)": {
-        "AGPLv3+"
-    },
-    "License :: OSI Approved :: MirOS License (MirOS)": {"MirOS"},
-    "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)": {
-        "CeCILL-2.1"
-    },
-    "License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)": {
-        "EUPL 1.2"
-    },
-    "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)": {
-        "CVW"
-    },
-    "License :: OSI Approved :: GNU Free Documentation License (FDL)": {"FDL"},
-    "License :: Aladdin Free Public License (AFPL)": {"AFPL"},
-    "License :: OSI Approved :: GNU General Public License (GPL)": {"GPL"},
-    "License :: Eiffel Forum License (EFL)": {"EFL"},
-    "License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)": {"MPL 1.1"},
-    "License :: OSI Approved :: Python License (CNRI Python License)": {
-        "CNRI Python License"
-    },
-    "License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)": {"OSL-3.0"},
-    "License :: Nokia Open Source License (NOKOS)": {"NOKOS"},
-    "License :: OSI Approved :: Mozilla Public License 1.0 (MPL)": {"MPL"},
-    "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)": {
-        "LGPLv3+",
-        "LGPL",
-    },
-    "License :: OSI Approved :: Qt Public License (QPL)": {"QPL"},
-    "License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)": {
-        "LGPL"
-    },
-    "License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)": {"OFL-1.1"},
-    "License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)": {
-        "CDDL-1.0"
-    },
-    "License :: OSI Approved :: GNU General Public License v2 (GPLv2)": {
-        "GPL",
-        "GPLv2",
-    },
-    "License :: OSI Approved :: MIT License": {"MIT"},
-    "License :: OSI Approved :: Zope Public License": {"ZPL"},
-    "License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)": {
-        "HPND"
-    },
-    "License :: Netscape Public License (NPL)": {"NPL"},
-    "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)": {
-        "GPL",
-        "GPLv3+",
-    },
-    "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)": {
-        "LGPL",
-        "LGPLv2",
-    },
-    "License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)": {"BSL-1.0"},
-    "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)": {
-        "EUPL 1.1"
-    },
-    "License :: OSI Approved :: ISC License (ISCL)": {"ISCL"},
-    "License :: OSI Approved :: Academic Free License (AFL)": {"AFL"},
-    "License :: OSI Approved :: Universal Permissive License (UPL)": {"UPL"},
-}
-
-CODE_LICENSES = {
-    "GPLv2+": {
-        "License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)"
-    },
-    "MirOS": {"License :: OSI Approved :: MirOS License (MirOS)"},
-    "GPLv3+": {
-        "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)"
-    },
-    "CECILL-C": {"License :: CeCILL-C Free Software License Agreement (CECILL-C)"},
-    "CECILL-B": {"License :: CeCILL-B Free Software License Agreement (CECILL-B)"},
-    "GPLv2": {"License :: OSI Approved :: GNU General Public License v2 (GPLv2)"},
-    "GPLv3": {"License :: OSI Approved :: GNU General Public License v3 (GPLv3)"},
-    "BSL-1.0": {"License :: OSI Approved :: Boost Software License 1.0 (BSL-1.0)"},
-    "FDL": {"License :: OSI Approved :: GNU Free Documentation License (FDL)"},
-    "AFPL": {"License :: Aladdin Free Public License (AFPL)"},
-    "CDDL-1.0": {
-        "License :: OSI Approved :: Common Development and Distribution License 1.0 (CDDL-1.0)"
-    },
-    "MPL 1.1": {"License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)"},
-    "LGPLv2+": {
-        "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)"
-    },
-    "MPL 2.0": {"License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)"},
-    "CNRI Python License": {
-        "License :: OSI Approved :: Python License (CNRI Python License)"
-    },
-    "QPL": {"License :: OSI Approved :: Qt Public License (QPL)"},
-    "OSL-3.0": {"License :: OSI Approved :: Open Software License 3.0 (OSL-3.0)"},
-    "MIT": {"License :: OSI Approved :: MIT License"},
-    "EPL-2.0": {"License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)"},
-    "CVW": {
-        "License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)"
-    },
-    "EUPL 1.1": {
-        "License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)"
-    },
-    "EUPL 1.0": {
-        "License :: OSI Approved :: European Union Public Licence 1.0 (EUPL 1.0)"
-    },
-    "EPL-1.0": {"License :: OSI Approved :: Eclipse Public License 1.0 (EPL-1.0)"},
-    "EUPL 1.2": {
-        "License :: OSI Approved :: European Union Public Licence 1.2 (EUPL 1.2)"
-    },
-    "CC0 1.0": {"License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication"},
-    "NOKOS": {"License :: Nokia Open Source License (NOKOS)"},
-    "AFL": {"License :: OSI Approved :: Academic Free License (AFL)"},
-    "LGPLv3+": {
-        "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)"
-    },
-    "SISSL": {
-        "License :: OSI Approved :: Sun Industry Standards Source License (SISSL)"
-    },
-    "EFL": {"License :: Eiffel Forum License (EFL)"},
-    "ZPL": {"License :: OSI Approved :: Zope Public License"},
-    "ISCL": {"License :: OSI Approved :: ISC License (ISCL)"},
-    "HPND": {
-        "License :: OSI Approved :: Historical Permission Notice and Disclaimer (HPND)"
-    },
-    "OFL-1.1": {"License :: OSI Approved :: SIL Open Font License 1.1 (OFL-1.1)"},
-    "NPL": {"License :: Netscape Public License (NPL)"},
-    "LGPL": {
-        "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 :: GNU Lesser General Public License v2 (LGPLv2)",
-        "License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)",
-    },
-    "GPL": {
-        "License :: OSI Approved :: GNU General Public License (GPL)",
-        "License :: OSI Approved :: GNU General Public License v2 (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 General Public License v2 or later (GPLv2+)",
-    },
-    "MPL": {"License :: OSI Approved :: Mozilla Public License 1.0 (MPL)"},
-    "CeCILL-2.1": {
-        "License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)"
-    },
-    "AGPLv3+": {
-        "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)"
-    },
-    "UPL": {"License :: OSI Approved :: Universal Permissive License (UPL)"},
-    "LGPLv3": {
-        "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)"
-    },
-    "LGPLv2": {
-        "License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)"
-    },
-}
diff --git a/pyroma/distributiondata.py b/pyroma/distributiondata.py
index d9a2d83..6827fa6 100644
--- a/pyroma/distributiondata.py
+++ b/pyroma/distributiondata.py
@@ -1,36 +1,50 @@
-# Extracts information from a distribution file by unpacking in a temporary
-# directory and then using projectdata on that.
+"""
+Extract information from a distribution file by unpacking in a temporary
+directory and then using projectdata on that.
+"""
+
 import os
+import pathlib
 import shutil
+import tarfile
 import tempfile
 import zipfile
-import tarfile
 
 from pyroma import projectdata
 
 
+def _safe_extract_tar(tar, path=".", members=None, numeric_owner=False):
+    """Safely extract a tar w/o traversing parent dirs to fix CVE-2007-4559."""
+    root = pathlib.Path(path).resolve()
+    for member in tar.getmembers():
+        member_path = (root / member.name).resolve()
+        if root not in member_path.parents:
+            raise Exception(f"Attempted path traversal in tar file {tar.name!r}")
+    tar.extractall(path, members, numeric_owner=numeric_owner)
+
+
 def get_data(path):
     filename = os.path.split(path)[-1]
     basename, ext = os.path.splitext(filename)
     if basename.endswith(".tar"):
         basename, ignored = os.path.splitext(basename)
 
+    tempdir = tempfile.mkdtemp()
     try:
-        tempdir = tempfile.mkdtemp()
-
         if ext in (".bz2", ".tbz", "tb2", ".gz", ".tgz", ".tar"):
-            tarfile.open(name=path, mode="r:*").extractall(tempdir)
+            with tarfile.open(name=path, mode="r:*") as tar_file:
+                _safe_extract_tar(tar_file, path=tempdir)
 
         elif ext in (".zip", ".egg"):
-            zipfile.ZipFile(path, mode="r").extractall(tempdir)
+            with zipfile.ZipFile(path, mode="r") as zip_file:
+                zip_file.extractall(tempdir)
 
         else:
             raise ValueError("Unknown file type: " + ext)
 
         projectpath = os.path.join(tempdir, basename)
         data = projectdata.get_data(projectpath)
-
     finally:
-        shutil.rmtree(tempdir)
+        shutil.rmtree(tempdir, ignore_errors=True)
 
     return data
diff --git a/pyroma/projectdata.py b/pyroma/projectdata.py
index 0412506..4039683 100644
--- a/pyroma/projectdata.py
+++ b/pyroma/projectdata.py
@@ -1,13 +1,102 @@
 # Extracts information from a project that has a distutils setup.py file.
+import build
+import build.util
+import logging
 import os
+import pathlib
 import sys
-import logging
-
+import tokenize
 from copy import copy
 from distutils import core
 
+try:  # config renamed to config.setupcfg on Setuptools >=61 adding pyproject.toml support
+    from setuptools.config.setupcfg import read_configuration
+except ModuleNotFoundError:
+    from setuptools.config import read_configuration
+
+METADATA_MAP = {
+    "summary": "description",
+    "classifier": "classifiers",
+    "project_url": "project_urls",
+    "home_page": "url",
+    "description": "long_description",
+    "description_content_type": "long_description_content_type",
+    "requires_python": "python_requires",
+}
+
+
+def build_metadata(path, isolated=None):
+    # If explictly specified whether to use isolation, pass it directly
+    if isolated is not None:
+        return build.util.project_wheel_metadata(path, isolated=isolated)
 
-class FakeContext(object):
+    # Otherwise, try without build isolation first for efficiency
+    try:
+        return build.util.project_wheel_metadata(path, isolated=False)
+    # If building with build isolation fails, e.g. missing build deps, try with it
+    except build.BuildBackendException:
+        return build.util.project_wheel_metadata(path, isolated=True)
+
+
+def map_metadata_keys(metadata):
+    data = {}
+    if "Description" not in metadata.keys():
+        # Having the description as a payload tends to add two newlines, we clean that up here:
+        long_description = metadata.get_payload().strip() + "\n"
+        data["long_description"] = long_description
+
+    for key in set(metadata.keys()):
+        value = metadata.get_all(key)
+        if len(value) == 1:
+            value = value[0]
+            if value.strip() == "UNKNOWN":
+                continue
+        key = key.lower().replace("-", "_")
+        if key in METADATA_MAP:
+            key = METADATA_MAP[key]
+        data[key] = value
+    return data
+
+
+def get_build_data(path, isolated=None):
+    metadata = build_metadata(path, isolated=isolated)
+    return map_metadata_keys(metadata)
+
+
+def get_setupcfg_data(path):
+    # Note: By default, setup.cfg will read the pyroma.git/setup.cfg - forcing explicit setup.cfg under test's file path
+    data = read_configuration(str(pathlib.Path(path) / "setup.cfg"))
+    metadata = data["metadata"]
+    return metadata
+
+
+def get_data(path):
+    try:
+        return get_build_data(path)
+    except build.BuildException as e:
+        if "no pyproject.toml or setup.py" in e.args[0]:
+            # It couldn't build the package, because there is no setup.py or pyproject.toml.
+            # Let's see if there is a setup.cfg:
+            try:
+
+                metadata = get_setupcfg_data(path)
+                # Yes, there's a setup.cfg. Pyroma accepted this earlier, but that was probably
+                # a mistake. For the time being, warn for it, but in a future version just fail.
+                metadata["_missing_build_system"] = True
+                return metadata
+            except Exception:
+                # No, that didn't work. Hide this second exception and raise the first:
+                pass
+        raise e
+
+    except Exception:
+        logging.exception("Exception raised during metadata preparation")
+        metadata = get_setuppy_data(path)
+        metadata["_stoneage_setuppy"] = True
+        return metadata
+
+
+class FakeContext:
     def __init__(self, path):
         self._path = path
 
@@ -31,7 +120,7 @@ class FakeContext(object):
         os.chdir(self._old_path)
 
 
-class SetupMonkey(object):
+class SetupMonkey:
 
     used_setuptools = False
 
@@ -106,7 +195,7 @@ def run_setup(script_name, script_args=None, stop_after="run"):
     used to drive the Distutils.
     """
     if stop_after not in ("init", "config", "commandline", "run"):
-        raise ValueError("invalid value for 'stop_after': %r" % stop_after)
+        raise ValueError(f"invalid value for 'stop_after': {stop_after!r}")
 
     core._setup_stop_after = stop_after
 
@@ -119,21 +208,17 @@ def run_setup(script_name, script_args=None, stop_after="run"):
             sys.argv[0] = script_name
             if script_args is not None:
                 sys.argv[1:] = script_args
-            f = open(script_name)
-            try:
+            with tokenize.open(script_name) as f:
                 exec(f.read(), glocals, glocals)
-            finally:
-                f.close()
         finally:
             sys.argv = save_argv
             core._setup_stop_after = None
     except Exception:
-        logging.warn("Exception when running setup.", exc_info=True)
+        logging.warning("Exception when running setup.", exc_info=True)
 
     if core._setup_distribution is None:
         raise RuntimeError(
-            "'distutils.core.setup()' was never called -- "
-            "perhaps '%s' is not a Distutils setup script?" % script_name
+            f"'distutils.core.setup()' was never called -- perhaps '{script_name}' is not a Distutils setup script?"
         )
 
     # I wonder if the setup script's namespace -- g and l -- would be of
@@ -141,7 +226,7 @@ def run_setup(script_name, script_args=None, stop_after="run"):
     return core._setup_distribution
 
 
-def get_data(path):
+def get_setuppy_data(path):
     """
     Returns data from a package directory.
     'path' should be an absolute path.
@@ -154,7 +239,7 @@ def get_data(path):
                 try:
                     distro = run_setup("setup.py", stop_after="config")
 
-                    metadata = {"_setuptools": sm.used_setuptools}
+                    metadata = {}
 
                     for k, v in distro.metadata.__dict__.items():
                         if k[0] == "_" or not v:
@@ -175,8 +260,7 @@ def get_data(path):
 
             elif os.path.isfile("setup.cfg"):
                 try:
-                    from setuptools import config
-                    data = config.read_configuration("setup.cfg")
+                    data = read_configuration("setup.cfg")
                     metadata = data["metadata"]
                     metadata["_setuptools"] = True
                 except Exception as e:
diff --git a/pyroma/pypidata.py b/pyroma/pypidata.py
index 54fdd8a..f2d7fc1 100644
--- a/pyroma/pypidata.py
+++ b/pyroma/pypidata.py
@@ -1,56 +1,47 @@
-import tempfile
-import os
 import logging
-from pyroma import distributiondata
+import os
+import requests
+import tempfile
+import xmlrpc.client
 
-try:
-    from xmlrpc import client as xmlrpclib
-    from urllib import request as urllib
-except ImportError:
-    import xmlrpclib
-    import urllib
+from pyroma import distributiondata
 
 
-def _get_client():
+def _get_project_data(project):
     # I think I should be able to monkeypatch a mock-thingy here... I think.
-    return xmlrpclib.ServerProxy("https://pypi.org/pypi")
+    response = requests.get(f"https://pypi.org/pypi/{project}/json")
+    if response.status_code == 404:
+        raise ValueError(f"Did not find '{project}' on PyPI. Did you misspell it?")
+    if not response.ok:
+        raise ValueError(f"Unknown http error: {response.status_code} {response.reason}")
+
+    return response.json()
 
 
 def get_data(project):
-    client = _get_client()
     # Pick the latest release.
-    releases = client.package_releases(project)
-    if not releases:
-        # Try to find project by case-insensitive name
-        project_name = project.lower()
-        projects = client.search({"name": project_name})
-        projects = [p for p in projects if p["name"].lower() == project_name]
-        if not projects:
-            raise ValueError(
-                "Did not find '%s' on PyPI. Did you misspell it?" % project
-            )
-        project = projects[0]["name"]
-        releases = [p["version"] for p in reversed(projects)]
-    release = releases[0]
-    # Get the metadata:
-    logging.debug("Found %s version %s" % (project, release))
-    data = client.release_data(project, release)
+    project_data = _get_project_data(project)
+    releases = project_data["releases"]
+    data = project_data["info"]
+    release = data["version"]
+    logging.debug(f"Found {project} version {release}")
 
     # Map things around:
     data["long_description"] = data["description"]
     data["description"] = data["summary"]
 
-    roles = client.package_roles(project)
+    with xmlrpc.client.ServerProxy("https://pypi.org/pypi") as xmlrpc_client:
+        roles = xmlrpc_client.package_roles(project)
+
     data["_owners"] = [user for (role, user) in roles if role == "Owner"]
 
     # Get download_urls:
-    urls = client.release_urls(project, release)
+    urls = releases[release]
     data["_pypi_downloads"] = bool(urls)
 
     # If there is a source download, download it, and get that data.
     # This is done mostly to do the imports check.
     data["_source_download"] = False
-    data["_setuptools"] = None  # Mark as unknown, in case no sdist is found.
     data["_has_sdist"] = False
 
     for download in urls:
@@ -60,10 +51,10 @@ def get_data(project):
             tempdir = tempfile.gettempdir()
             filename = download["url"].split("/")[-1]
             tmp = os.path.join(tempdir, filename)
-            logging.debug("Downloading %s to verify distribution" % filename)
+            logging.debug(f"Downloading {filename} to verify distribution")
             try:
                 with open(tmp, "wb") as outfile:
-                    outfile.write(urllib.urlopen(download["url"]).read())
+                    outfile.write(requests.get(download["url"]).content)
                 ddata = distributiondata.get_data(tmp)
             except Exception:
                 # Clean up the file
diff --git a/pyroma/ratings.py b/pyroma/ratings.py
index 660f27c..b77f276 100644
--- a/pyroma/ratings.py
+++ b/pyroma/ratings.py
@@ -1,4 +1,3 @@
-# -*- coding: UTF-8 -*-
 # This is a collection of "tests" done on the package data. The resut of the
 # tests is used to give the package a rating.
 #
@@ -17,31 +16,54 @@
 #                 not be counted).
 import io
 import re
+from collections import defaultdict
+
 from docutils.core import publish_parts
 from docutils.utils import SystemMessage
-from pyroma.classifiers import CLASSIFIERS, CODE_LICENSES
-
-try:
-    stringtypes = (basestring,)
-except NameError:
-    stringtypes = (str,)
+from trove_classifiers import classifiers as CLASSIFIERS
+from packaging.specifiers import InvalidSpecifier, SpecifierSet
 
 LEVELS = [
-    u"This cheese seems to contain no dairy products",
-    u"Vieux Bologne",
-    u"Limburger",
-    u"Gorgonzola",
-    u"Stilton",
-    u"Brie",
-    u"Comté",
-    u"Jarlsberg",
-    u"Philadelphia",
-    u"Cottage Cheese",
-    u"Your cheese is so fresh most people think it's a cream: Mascarpone",
+    "This cheese seems to contain no dairy products",
+    "Vieux Bologne",
+    "Limburger",
+    "Gorgonzola",
+    "Stilton",
+    "Brie",
+    "Comté",
+    "Jarlsberg",
+    "Philadelphia",
+    "Cottage Cheese",
+    "Your cheese is so fresh most people think it's a cream: Mascarpone",
 ]
 
+SHORT_NAME_RE = re.compile(r"\(.*?\)")
+
+
+def get_code_licenses():
+    licenses = [each for each in list(CLASSIFIERS) if each.startswith("License")]
+    code_map = defaultdict(set)
+    for license in licenses:
+        short_name = SHORT_NAME_RE.findall(license)
+        if short_name:
+            short_name = short_name[0][1:-1]
+            code_map[short_name].add(license)
+            if short_name.startswith("GPL"):
+                code_map["GPL"].add(license)
+            elif short_name.startswith("LGPL"):
+                code_map["LGPL"].add(license)
+        elif "Zope" in license:
+            code_map["ZPL"].add(license)
+        elif "MIT License" in license:
+            code_map["MIT"].add(license)
+
+    return code_map
+
 
-class BaseTest(object):
+CODE_LICENSES = get_code_licenses()
+
+
+class BaseTest:
     fatal = False
 
 
@@ -52,9 +74,7 @@ class FieldTest(BaseTest):
         return bool(data.get(self.field))
 
     def message(self):
-        return ("Your package does not have %s data" % self.field) + (
-            self.fatal and "!" or "."
-        )
+        return (f"Your package does not have {self.field} data") + (self.fatal and "!" or ".")
 
 
 class Name(FieldTest):
@@ -73,7 +93,7 @@ class VersionIsString(BaseTest):
     def test(self, data):
         # Check that the version is a string
         version = data.get("version")
-        return isinstance(version, stringtypes)
+        return isinstance(version, str)
 
     def message(self):
         return "The version number should be a string."
@@ -167,7 +187,7 @@ class Description(BaseTest):
         if self.fatal:
             return "The package had no description!"
         else:
-            return "The package's description should be longer than " "10 characters."
+            return "The package's description should be longer than 10 characters."
 
 
 class LongDescription(BaseTest):
@@ -175,7 +195,7 @@ class LongDescription(BaseTest):
 
     def test(self, data):
         long_description = data.get("long_description", "")
-        if not isinstance(long_description, stringtypes):
+        if not isinstance(long_description, str):
             long_description = ""
         return len(long_description) > 100
 
@@ -206,7 +226,7 @@ class ClassifierVerification(BaseTest):
         return "Some of your classifiers are not standard classifiers:\n" + err
 
 
-class PythonVersion(BaseTest):
+class PythonClassifierVersion(BaseTest):
     def test(self, data):
         self._major_version_specified = False
 
@@ -251,7 +271,31 @@ class PythonVersion(BaseTest):
                 "The classifiers should specify what minor versions of "
                 "Python you support as well as what major version."
             )
-        return "You should specify what Python versions you support."
+        return "The classifiers should specify what Python versions you support."
+
+
+class PythonRequiresVersion(BaseTest):
+    weight = 100
+
+    def test(self, data):
+        # https://github.com/regebro/pyroma/pull/83#discussion_r955611236
+        python_requires = data.get("python_requires", None)
+
+        if not python_requires:
+            return False
+
+        try:
+            SpecifierSet(python_requires)
+        except InvalidSpecifier:
+            return False
+
+        return True
+
+    def message(self):
+        return (
+            "You should specify what Python versions you support with "
+            "the 'requires-python'/'python_requires' metadata."
+        )
 
 
 class Keywords(FieldTest):
@@ -263,6 +307,12 @@ class Author(FieldTest):
     weight = 100
     field = "author"
 
+    def test(self, data):
+        """Check if author_email field contains author name."""
+        email = data.get("author_email")
+        # Pass if author name in email, e.g. "Author Name <author@example.com>"
+        return True if email and "<" in email else super().test(data)
+
 
 class AuthorEmail(FieldTest):
     weight = 100
@@ -297,18 +347,12 @@ class Licensing(BaseTest):
                 licenses.add(classifier)
 
         if not license and not licenses:
-            self._message = (
-                "Your package does neither have a license field "
-                "nor any license classifiers."
-            )
+            self._message = "Your package does neither have a license field nor any license classifiers."
             return False
 
         if license in CODE_LICENSES:
             if not CODE_LICENSES[license].intersection(licenses):
-                self._message = (
-                    "The license '%s' specified is not listed in "
-                    "your classifiers." % license
-                )
+                self._message = f"The license '{license}' specified is not listed in your classifiers."
                 return False
 
         return True
@@ -330,10 +374,7 @@ class DevStatusClassifier(BaseTest):
         return False
 
     def message(self):
-        return (
-            "Specifying a development status in the classifiers gives "
-            "users a hint of how stable your software is."
-        )
+        return "Specifying a development status in the classifiers gives users a hint of how stable your software is."
 
 
 class SDist(BaseTest):
@@ -371,9 +412,7 @@ class ValidREST(BaseTest):
         settings = {"warning_stream": stream}
 
         try:
-            publish_parts(
-                source=source, writer_name="html4css1", settings_overrides=settings
-            )
+            publish_parts(source=source, writer_name="html4css1", settings_overrides=settings)
         except SystemMessage as e:
             self._message = e.args[0]
         errors = stream.getvalue().strip()
@@ -409,6 +448,41 @@ class BusFactor(BaseTest):
         return "You should have three or more owners of the project on PyPI."
 
 
+class MissingBuildSystem(BaseTest):
+    def test(self, data):
+        if "_missing_build_system" in data:
+            # These sort of "negative only/deprecation" ratings only give you negative weight
+            self.weight = 200
+            return False
+
+    def message(self):
+        return (
+            "You seem to have a setup.cfg, but neither a setup.py, nor a build-system defined. This makes "
+            "it unclear how your project should be built. You probably want to have a pyproject.toml file "
+            "with the following configuration:\n\n"
+            "    [build-system]\n"
+            '    requires = ["setuptools>=42"]\n'
+            '    build-backend = "setuptools.build_meta"\n\n'
+            'In the future this will become a hard failure and your package will be rated as "not cheese".'
+        )
+
+
+class StoneAgeSetupPy(BaseTest):
+    def test(self, data):
+        if "_stoneage_setuppy" in data:
+            # These sort of "negative only/deprecation" ratings only give you negative weight
+            self.weight = 200
+            return False
+
+    def message(self):
+        return (
+            "Your Cheese may have spoiled!! The only way to gather metadata from your package was to execute "
+            "a patched setup.py. This indicates that your package is using very old packaging techniques, "
+            "(or that your setup.py isn't executable at all), and Pyroma will soon regard that as a complete "
+            "failure!\nPlease modernize your packaging! If it is already modern, this is a bug."
+        )
+
+
 ALL_TESTS = [
     Name(),
     Version(),
@@ -418,7 +492,8 @@ ALL_TESTS = [
     LongDescription(),
     Classifiers(),
     ClassifierVerification(),
-    PythonVersion(),
+    PythonClassifierVersion(),
+    PythonRequiresVersion(),
     Keywords(),
     Author(),
     AuthorEmail(),
@@ -428,6 +503,8 @@ ALL_TESTS = [
     ValidREST(),
     BusFactor(),
     DevStatusClassifier(),
+    MissingBuildSystem(),
+    StoneAgeSetupPy(),
 ]
 
 
diff --git a/pyroma/testdata/complete/setup.py b/pyroma/testdata/complete/setup.py
index 94b7ac8..f4d84ba 100644
--- a/pyroma/testdata/complete/setup.py
+++ b/pyroma/testdata/complete/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
 
 version = "1.0"
 
-with open("README.txt", "rt") as readme:
+with open("README.txt", encoding="UTF-8") as readme:
     long_description = readme.read()
 
 setup(
@@ -10,6 +10,7 @@ setup(
     version=version,
     description="This is a test package for pyroma.",
     long_description=long_description,
+    python_requires=">=2.6",
     classifiers=[
         "Development Status :: 6 - Mature",
         "Operating System :: OS Independent",
@@ -32,5 +33,4 @@ setup(
     tests_require=["six"],
     setup_requires=["setuptools"],
     zip_safe=True,
-    test_suite="complete",
 )
diff --git a/pyroma/testdata/custom_test/setup.py b/pyroma/testdata/custom_test/setup.py
index 532092d..5b7d60e 100644
--- a/pyroma/testdata/custom_test/setup.py
+++ b/pyroma/testdata/custom_test/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 from setuptools.command.test import test
 
-version = "0.0foo"
+version = "0.0.1"
 
 
 class CustomTest(test):
diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar b/pyroma/testdata/distributions/complete-1.0.dev1.tar
index 8888442..560f945 100644
Binary files a/pyroma/testdata/distributions/complete-1.0.dev1.tar and b/pyroma/testdata/distributions/complete-1.0.dev1.tar differ
diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2 b/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2
index 684baaa..d0bc7ee 100644
Binary files a/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2 and b/pyroma/testdata/distributions/complete-1.0.dev1.tar.bz2 differ
diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz b/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz
index c89f508..6d03ecf 100644
Binary files a/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz and b/pyroma/testdata/distributions/complete-1.0.dev1.tar.gz differ
diff --git a/pyroma/testdata/distributions/complete-1.0.dev1.zip b/pyroma/testdata/distributions/complete-1.0.dev1.zip
index f5a4c29..200ceb9 100644
Binary files a/pyroma/testdata/distributions/complete-1.0.dev1.zip and b/pyroma/testdata/distributions/complete-1.0.dev1.zip differ
diff --git a/pyroma/testdata/distributions/distribute-0.6.15.tar.gz b/pyroma/testdata/distributions/distribute-0.6.15.tar.gz
deleted file mode 100644
index 74c1207..0000000
Binary files a/pyroma/testdata/distributions/distribute-0.6.15.tar.gz and /dev/null differ
diff --git a/pyroma/testdata/jsondata/complete.json b/pyroma/testdata/jsondata/complete.json
new file mode 100644
index 0000000..dd63b1c
--- /dev/null
+++ b/pyroma/testdata/jsondata/complete.json
@@ -0,0 +1 @@
+{"info":{"author":"Logilab and Shoobx Team","author_email":"dev@shoobx.com","bugtrack_url":null,"classifiers":["Development Status :: 3 - Alpha","Framework :: ZODB","Intended Audience :: Developers","License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)","Natural Language :: English","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 2","Programming Language :: Python :: 2.7","Programming Language :: Python :: 3","Programming Language :: Python :: 3.5","Programming Language :: Python :: 3.6"],"description":"========\nXML Diff\n========\n\n.. image:: https://travis-ci.org/Shoobx/xmldiff.png?branch=master\n   :target: https://travis-ci.org/Shoobx/xmldiff\n\n.. image:: https://coveralls.io/repos/github/Shoobx/xmldiff/badge.svg?branch=master\n   :target: https://coveralls.io/github/Shoobx/xmldiff?branch=master\n\n.. image:: https://img.shields.io/pypi/v/xmldiff.svg\n    :target: https://pypi.python.org/pypi/xmldiff\n\n.. image:: https://img.shields.io/pypi/pyversions/xmldiff.svg\n    :target: https://pypi.python.org/pypi/xmldiff/\n\n\nXmldiff is a utility for extracting differences between two xml files. It\nreturns a set of primitives to apply on source tree to obtain the destination\ntree.\n\nThe implementation is based on `Change detection in hierarchically structured\ninformation`, by S. Chawathe, A. Rajaraman, H. Garcia-Molina and J. Widom,\nStanford University, 1996\n\nInstallation\n------------\n\nTo install the latest release:\n\n.. code:: bash\n\n    pip install xmldiff\n\n\nTo install the development version:\n\n.. code:: bash\n\n    git clone https://github.com/Shoobx/xmldiff.git\n    cd xmldiff\n    virtualenv ./.venv\n    ./.venv/bin/python setup.py install\n\nThen to compare two given XML files:\n\n.. code:: bash\n\n    ./.venv/bin/xmldiff 1.xml 2.xml\n\n\nRunning tests\n-------------\n\nTo run the test suite for all python versions:\n\n.. code:: bash\n\n    tox\n\n\nCHANGES\n=======\n\n1.1.0 (2018-06-15)\n------------------\n\n- When using namespaces, the returned xpaths are now in the form ns_prefix:tag\n  instead of the earlier {ns_uri}tag, which isn't correct xpaths.\n\n\n1.0.0 (2018-04-13)\n------------------\n\n- pep8 cleanup, added flake8 checking to tox\n\n\n1.0.0a6 (2018-04-12)\n--------------------\n\n- Removed encoding, because python does unicode just fine\n\n- Switched on namespace handling for XML input\n\n\n1.0.0a5 (2018-04-11)\n--------------------\n\n- Brownbag release to make up for bad previous ones.\n\n1.0.0a2 (2018-04-11)\n--------------------\n\n- Temporary disabling of encoding text (hopefully permanent).\n\n- Reverted bug fix: Do not remove newlines from text while parsing\n  the XML.\n\n\n1.0.0a1 (2018-04-10)\n--------------------\n\n- Bug: Fix a off-by-one issue with `insert-after` action.\n\n- Bug: Do not rename children on text node updates.\n\n- Bug: Text moves were not recorded as part of the fmes edit script.\n\n- Remove only partially implemented xmlrev script.\n\n- Removed support for xupdate, which never became a standard.\n\n- Removed deprecated ezs optional algorithm.\n\n- Removed support for Debian and RedHat packaging.\n\n- Removed Windows support\n\n- LOTS of package cleanup (setup.py, MANIFEST, proper console script, etc)\n\n- tests moved to py.test and cleaned, added tox, travis, coverage support\n\n\n0.6.10 (2010-08-27)\n-------------------\n\n- apply Daiki Ueno patch: fails when comparing minimal trees on i386\n\n\n0.6.9 (2009-04-02)\n------------------\n\n- Fixed xmldiff-xmlrev compilation error\n\n\n0.6.8 (2006-06-15)\n------------------\n\n- Fixed 64bit cleanness issues\n\n\n0.6.7 (2005-05-04)\n------------------\n\n- WARNING: xmldiff is no longer a logilab subpackage. Users may have to\n  manually remove the old logilab/xmldiff directory.\n\n- fixed debian bug #275750, also reported by Christopher R Newman on the\n  xml-projects mailing list\n\n- fixed --profile option, wrap function from maplookup when profiling so that\n  they appear in the profile information\n\n- fixed setup.py to ignore the xmlrev shell script under windows platforms\n\n- small improvements (remove recursion in object.py, minor enhancement in\n  mydifflib.py, rewrite of lcs4 in C)\n\n\n0.6.6 (2004-12-23)\n------------------\n\n- Applied patch by Bastian Kleineidam <calvin@debian.org> which\n\n  - corrects the typo in  ML_DIR\n\n  - fixes the TMPFILE_XSLT/TMPFILE_XSL typo\n\n  - makes sure the files are XML or SGML files, else prints an error\n\n  - adds various missing quotes around filenames which could have\n    spaces or begin with a hyphen\n\n  - fixes typos in the usage() function\n\n  Thanks a lot, Bastian.\n\n- Fixed some problems in the xmlrev.xslt stylesheet\n\n- Fixed problems in xmlrev caused by the exit status of xmldiff when\n  successful\n\n- Added a man page for xmldiff and xmlrev\n\n\n0.6.5 (2004-09-02)\n------------------\n\n- xmlrev bugfixes\n\n- Fixed packaging problems (missing xsl stylesheets and MANIFEST file)\n\n\n0.6.4 (2003-10-02)\n------------------\n\n- fix recursive mode\n\n- rewrite regression test, add test for the recursive mode\n\n- add --help option to xlmrev\n\n- packaging fixes\n\n- turn API.txt and HELP.txt to correct ReST\n\n\n0.6.3 (2002-11-06)\n------------------\n\n- fix wrong xpath for attributes\n\n- fix bug with temporary duplicate attribute node\n\n- fix for xupdate\n\n- fix ext_pes option bug\n\n- update changelog to new format\n\n\n0.6.2 (2002-09-23)\n------------------\n\n- return number of differences on command line\n\n- reintroduce misc.list_print which caused recursive mode\n  to fail\n\n- use psyco if available (http://psyco.sf.net)\n\n- little changes in C extension\n\n\n0.6.1 (2002-08-29)\n------------------\n\n- fix packaging problems\n\n\n0.6.0 (2002-08-23)\n------------------\n\n- change of the internal representation\n\n- remove support for the EZS algorithm (no more maintened\n  for the moment)\n\n- add command line options to parse html and to control\n  entities inclusion and output encoding\n\n- fixing coalescing text nodes bug\n\n- many other bugs fixes\n\n- great speed improvement\n\n\n0.5.3 (2002-01-31)\n------------------\n\n- add __init__.py in \"logilab\" directory\n\n\n0.5.2 (2001-10-29)\n------------------\n\n- bug fixes in xupdate formatting and in the dom interface.\n\n\n0.5.1 (2001-09-07)\n------------------\n\n- Fast Match / Edit Scritp algorithm, now fully usable\n\n- fixes Unicode problem\n\n\n0.2.1 (2001-08-10)\n------------------\n\n- bug fixes, optimizations for ezs algorithm\n\n\n0.1.1 (2001-08-04)\n------------------\n\n- original revision","description_content_type":"","docs_url":null,"download_url":"","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page":"https://github.com/Shoobx/xmldiff","keywords":"xml,diff,xmldiff,tree 2 tree","license":"LGPL","maintainer":"","maintainer_email":"","name":"xmldiff","package_url":"https://pypi.org/project/xmldiff/","platform":"","project_url":"https://pypi.org/project/xmldiff/","project_urls":{"Homepage":"https://github.com/Shoobx/xmldiff"},"release_url":"https://pypi.org/project/xmldiff/1.1.0/","requires_dist":null,"requires_python":"","python_requires": ">=2.7","summary":"Tree 2 tree correction between xml documents. Extract differences between two xml files. It returns a set of primitives to apply on source tree to obtain the destination tree.","version":"1.1.0","yanked":false,"yanked_reason":null},"last_serial":5948813,"releases":{"0.6.10":[{"comment_text":"","digests":{"md5":"9ab11f838f7e0b1dcadc94bb81eb1539","sha256":"edeb13ae5d2cc1de72b58bc989f10dc006db5acc19d42f4b05309b14bc99bbe0"},"downloads":-1,"filename":"xmldiff-0.6.10.zip","has_sig":false,"md5_digest":"9ab11f838f7e0b1dcadc94bb81eb1539","packagetype":"sdist","python_version":"source","requires_python":null,"size":44447,"upload_time":"2015-04-02T16:07:22","upload_time_iso_8601":"2015-04-02T16:07:22.450850Z","url":"https://files.pythonhosted.org/packages/01/5c/e10197f6b699497bbbb32baa73a7b85b4be4f0117c8dae3d525ff5451987/xmldiff-0.6.10.zip","yanked":false,"yanked_reason":null}],"0.6.4":[{"comment_text":"","digests":{"md5":"65c173fb5adcdce1008ab3a9a39ae6bd","sha256":"678042e7d8fc249f6ae78bc5f26847b1da7705ec887dce63e01a2348bfab0664"},"downloads":-1,"filename":"xmldiff-0.6.4.tar.gz","has_sig":false,"md5_digest":"65c173fb5adcdce1008ab3a9a39ae6bd","packagetype":"sdist","python_version":"source","requires_python":null,"size":28540,"upload_time":"2015-04-02T15:37:18","upload_time_iso_8601":"2015-04-02T15:37:18.791051Z","url":"https://files.pythonhosted.org/packages/78/be/25e4c3b6e295205adcc102c72d3c182366e9adc0a42c9c641b14a710dc3c/xmldiff-0.6.4.tar.gz","yanked":false,"yanked_reason":null}],"0.6.6":[{"comment_text":"","digests":{"md5":"b4461fcf85dbcef9d2dc3f712445f1ae","sha256":"a1d4f928c955d072afcf86bc5d67e1d901a4825fc028f05a30e957693f8369ec"},"downloads":-1,"filename":"xmldiff-0.6.6.tar.gz","has_sig":false,"md5_digest":"b4461fcf85dbcef9d2dc3f712445f1ae","packagetype":"sdist","python_version":"source","requires_python":null,"size":30589,"upload_time":"2015-04-02T15:34:58","upload_time_iso_8601":"2015-04-02T15:34:58.448942Z","url":"https://files.pythonhosted.org/packages/b0/77/222543b1aa3687f4ded31948019a61ffc0e6e1713e5c7116d32a434663ff/xmldiff-0.6.6.tar.gz","yanked":false,"yanked_reason":null}],"0.6.7":[{"comment_text":"","digests":{"md5":"495afb1b4e059af9099ca90cd619e0d3","sha256":"8fa3dce3f000ed5ac97023b4a2d4e0d4aa3cd1db3885c6d0480e63617a5073d9"},"downloads":-1,"filename":"xmldiff-0.6.7.zip","has_sig":false,"md5_digest":"495afb1b4e059af9099ca90cd619e0d3","packagetype":"sdist","python_version":"source","requires_python":null,"size":44737,"upload_time":"2015-04-02T16:06:22","upload_time_iso_8601":"2015-04-02T16:06:22.122578Z","url":"https://files.pythonhosted.org/packages/2a/c1/1a009a72a524974480996e572cdad6eee1fb9c5c51c291111b1b8e240623/xmldiff-0.6.7.zip","yanked":false,"yanked_reason":null}],"0.6.8":[{"comment_text":"","digests":{"md5":"02a6192bb2bb4196077fcf66aaf67129","sha256":"7e2d1e13a991dc490d0ea70b13528b78f6a7e44d0317536d1f54950a90ae8525"},"downloads":-1,"filename":"xmldiff-0.6.8.zip","has_sig":false,"md5_digest":"02a6192bb2bb4196077fcf66aaf67129","packagetype":"sdist","python_version":"source","requires_python":null,"size":44988,"upload_time":"2015-04-02T16:06:45","upload_time_iso_8601":"2015-04-02T16:06:45.550281Z","url":"https://files.pythonhosted.org/packages/01/eb/4395ef31da4129fc1ade423d0728aee0865f85b1dc5cc58d083d805cd220/xmldiff-0.6.8.zip","yanked":false,"yanked_reason":null}],"0.6.9":[{"comment_text":"","digests":{"md5":"57b6b3f0e3c21163744b1abede196749","sha256":"7ea0451330d9e57633c0ae389cedcf30efc3925ab0c2763563bb28c558b47981"},"downloads":-1,"filename":"xmldiff-0.6.9.zip","has_sig":false,"md5_digest":"57b6b3f0e3c21163744b1abede196749","packagetype":"sdist","python_version":"source","requires_python":null,"size":44179,"upload_time":"2015-04-02T16:07:07","upload_time_iso_8601":"2015-04-02T16:07:07.388937Z","url":"https://files.pythonhosted.org/packages/bb/db/df65a8a5a09aa6fd391c2e52edf3d4ab75396f961e36a425aadc3a50dc75/xmldiff-0.6.9.zip","yanked":false,"yanked_reason":null}],"1.0.0":[{"comment_text":"","digests":{"md5":"3d7c20a999963b8f3d8651bb8a18f577","sha256":"81394752277427af4e3783846716a4780d4100724628668e6153eb3c899fa01d"},"downloads":-1,"filename":"xmldiff-1.0.0.tar.gz","has_sig":false,"md5_digest":"3d7c20a999963b8f3d8651bb8a18f577","packagetype":"sdist","python_version":"source","requires_python":null,"size":39642,"upload_time":"2018-04-13T13:22:51","upload_time_iso_8601":"2018-04-13T13:22:51.840164Z","url":"https://files.pythonhosted.org/packages/6b/d3/376909843cdb112f0ce50173fbcfcd9204efde27e1797de99706c95cde55/xmldiff-1.0.0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a1":[{"comment_text":"","digests":{"md5":"669a8bc7160c3de61b6f8a9f4005ae53","sha256":"e882b8fb68e07c5e483b9b1395b41324ca46632c5875c61e725e8bdb9a0b97e9"},"downloads":-1,"filename":"xmldiff-1.0.0a1.tar.gz","has_sig":false,"md5_digest":"669a8bc7160c3de61b6f8a9f4005ae53","packagetype":"sdist","python_version":"source","requires_python":null,"size":37723,"upload_time":"2018-04-10T13:22:53","upload_time_iso_8601":"2018-04-10T13:22:53.589597Z","url":"https://files.pythonhosted.org/packages/5d/f3/b3de2527aaeb8d5d8c4c9c8b49fa5fb9b30463c3568fdb04c4891010d3d4/xmldiff-1.0.0a1.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a2":[{"comment_text":"","digests":{"md5":"8ca07eb4bbb09cce4b07b64e56c7d7d6","sha256":"8bb91f15ecd2a0efa11bcaf8be013df16629af7ab0c909ca4ff1330d0aacae73"},"downloads":-1,"filename":"xmldiff-1.0.0a2.tar.gz","has_sig":false,"md5_digest":"8ca07eb4bbb09cce4b07b64e56c7d7d6","packagetype":"sdist","python_version":"source","requires_python":null,"size":36836,"upload_time":"2018-04-10T15:48:43","upload_time_iso_8601":"2018-04-10T15:48:43.658000Z","url":"https://files.pythonhosted.org/packages/8b/22/88e32c7999c85a6aa97b2c36e4b366bd5e6631f03c14988124b93564bdb1/xmldiff-1.0.0a2.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a3.dev0":[{"comment_text":"","digests":{"md5":"65c035101c40d30dc0838acaa135ec41","sha256":"79a4955f3585dc8f05d07494a2a35ad41fe26192e831b6fbd062188226bd42f6"},"downloads":-1,"filename":"xmldiff-1.0.0a3.dev0.tar.gz","has_sig":false,"md5_digest":"65c035101c40d30dc0838acaa135ec41","packagetype":"sdist","python_version":"source","requires_python":null,"size":36846,"upload_time":"2018-04-10T15:56:31","upload_time_iso_8601":"2018-04-10T15:56:31.070448Z","url":"https://files.pythonhosted.org/packages/80/70/df743f6777b4a43689aaa6dfad3f8ca96c041d4f959607cb067e7903019a/xmldiff-1.0.0a3.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a4.dev0":[{"comment_text":"","digests":{"md5":"f5034450dcd8df3abe0759a62251bc65","sha256":"2ee7f0f4a86e68e537d77e6922ebc79bb3bb1b316c3a7c2e50bc8f61774ca506"},"downloads":-1,"filename":"xmldiff-1.0.0a4.dev0.tar.gz","has_sig":false,"md5_digest":"f5034450dcd8df3abe0759a62251bc65","packagetype":"sdist","python_version":"source","requires_python":null,"size":36899,"upload_time":"2018-04-10T16:02:36","upload_time_iso_8601":"2018-04-10T16:02:36.150652Z","url":"https://files.pythonhosted.org/packages/02/80/86b6e9a5fc6267e1e945734228073a42f40398ff78537d1e17c0f6f11b93/xmldiff-1.0.0a4.dev0.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a5":[{"comment_text":"","digests":{"md5":"19bbc60ebbf9d290069649f1e24e7d55","sha256":"5a38bc0e7a5daf89c0a960643fcdabbd8b24b0913c94ff1ef0de06321b4bdbbd"},"downloads":-1,"filename":"xmldiff-1.0.0a5.tar.gz","has_sig":false,"md5_digest":"19bbc60ebbf9d290069649f1e24e7d55","packagetype":"sdist","python_version":"source","requires_python":null,"size":37417,"upload_time":"2018-04-11T13:02:26","upload_time_iso_8601":"2018-04-11T13:02:26.425291Z","url":"https://files.pythonhosted.org/packages/0a/e7/d0889a2a39d214ca883873fa1547eda0672b1ef2bd6d7f5d1bb8bb1e3351/xmldiff-1.0.0a5.tar.gz","yanked":false,"yanked_reason":null}],"1.0.0a6":[{"comment_text":"","digests":{"md5":"1785ee59afdf2ff4c634276f33767302","sha256":"02a3ce91aa39a42146e7dae240cb16a6da529f8c725e53939afe1df736ea4475"},"downloads":-1,"filename":"xmldiff-1.0.0a6.tar.gz","has_sig":false,"md5_digest":"1785ee59afdf2ff4c634276f33767302","packagetype":"sdist","python_version":"source","requires_python":null,"size":38050,"upload_time":"2018-04-12T12:48:52","upload_time_iso_8601":"2018-04-12T12:48:52.719912Z","url":"https://files.pythonhosted.org/packages/4e/b4/50f65f8e77da28899e31945ae5719535e9a9e67bea961ecfba77c39399fe/xmldiff-1.0.0a6.tar.gz","yanked":false,"yanked_reason":null}],"1.1.0":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"xmldiff-1.1.0.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/xmldiff-1.1.0.tar.gz","yanked":false,"yanked_reason":null}],"1.1.1":[{"comment_text":"","digests":{"md5":"dd17d5d775b9433df64513265502cdb8","sha256":"b8dc6c36a3499e752cf5b5d2704d961be37fcf2ea5be2e4187572e18f674d053"},"downloads":-1,"filename":"xmldiff-1.1.1.tar.gz","has_sig":false,"md5_digest":"dd17d5d775b9433df64513265502cdb8","packagetype":"sdist","python_version":"source","requires_python":null,"size":39523,"upload_time":"2018-06-20T18:38:14","upload_time_iso_8601":"2018-06-20T18:38:14.221847Z","url":"https://files.pythonhosted.org/packages/35/cc/ae210f70dac681a7566f25f43740a0cbdc53a77e23684f7b9b1d71e4d918/xmldiff-1.1.1.tar.gz","yanked":false,"yanked_reason":null}],"2.0":[{"comment_text":"","digests":{"md5":"dacf1d5fe5e94e0b656e8985e2e81faa","sha256":"31f83117e38d78670e1994e7160b1463adb04ffa34ff267700b2ca61bada5e57"},"downloads":-1,"filename":"xmldiff-2.0-py2.py3-none-any.whl","has_sig":false,"md5_digest":"dacf1d5fe5e94e0b656e8985e2e81faa","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55479,"upload_time":"2018-09-25T07:05:49","upload_time_iso_8601":"2018-09-25T07:05:49.423913Z","url":"https://files.pythonhosted.org/packages/ce/dc/7caf3ada02afcab68c7330c207f0b05b54dd5ef6ac96fb18e2fa85f1038a/xmldiff-2.0-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"982c288a450198b414363a9388631c26","sha256":"221733cfbfafff1d90756834f1f2bc8a3cfa097a57ad6ab11e83db308c1b486e"},"downloads":-1,"filename":"xmldiff-2.0.tar.gz","has_sig":false,"md5_digest":"982c288a450198b414363a9388631c26","packagetype":"sdist","python_version":"source","requires_python":null,"size":86965,"upload_time":"2018-09-25T07:05:51","upload_time_iso_8601":"2018-09-25T07:05:51.301648Z","url":"https://files.pythonhosted.org/packages/41/80/5c6ef6fc423fb7902cc7fe6d5784545559d11dc157b1dbe50de59192bd08/xmldiff-2.0.tar.gz","yanked":false,"yanked_reason":null}],"2.0b1":[{"comment_text":"","digests":{"md5":"0003996e2c8b62541743c80f1367925f","sha256":"9a15649073d795f2a742f0c46f44ebc732727ae201cf92e796ffb7b31eaebf59"},"downloads":-1,"filename":"xmldiff-2.0b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"0003996e2c8b62541743c80f1367925f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53036,"upload_time":"2018-09-03T12:49:24","upload_time_iso_8601":"2018-09-03T12:49:24.676079Z","url":"https://files.pythonhosted.org/packages/65/35/0820f8a49e5812dbcdb2aee651f19df8bf7c67d379e449699ed4ede5df51/xmldiff-2.0b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5f60ea9a2bc0109d1828ae753c332ed2","sha256":"173ad39aa5c95e9deeb563e94174c944ffd814441b2587f5645f0119c192220c"},"downloads":-1,"filename":"xmldiff-2.0b1.tar.gz","has_sig":false,"md5_digest":"5f60ea9a2bc0109d1828ae753c332ed2","packagetype":"sdist","python_version":"source","requires_python":null,"size":70341,"upload_time":"2018-09-03T12:49:27","upload_time_iso_8601":"2018-09-03T12:49:27.080969Z","url":"https://files.pythonhosted.org/packages/54/45/006a8a3068f261dfbb543e4a4905ea1495a9deaa6b880af881e7112fe590/xmldiff-2.0b1.tar.gz","yanked":false,"yanked_reason":null}],"2.0b2":[{"comment_text":"","digests":{"md5":"e2431ed70e7c940e72b065b3c2fc4d66","sha256":"0ea1eabb994a10160cdeb3b3a93e80e09191bc971ddf10213ec4618e890a79a1"},"downloads":-1,"filename":"xmldiff-2.0b2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e2431ed70e7c940e72b065b3c2fc4d66","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":53862,"upload_time":"2018-09-06T14:41:53","upload_time_iso_8601":"2018-09-06T14:41:53.157424Z","url":"https://files.pythonhosted.org/packages/10/db/b5e9c37e5e66e86b5f87220db5e18d4f6b79f5b57037fcb251ca1116d9d0/xmldiff-2.0b2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0199ffb374b5378b5b3f03b23008ee31","sha256":"4d95ddf206f4c440fcace43c0a9f4d26fb704b1fd5087c6c9b903e04a008bf05"},"downloads":-1,"filename":"xmldiff-2.0b2.tar.gz","has_sig":false,"md5_digest":"0199ffb374b5378b5b3f03b23008ee31","packagetype":"sdist","python_version":"source","requires_python":null,"size":85397,"upload_time":"2018-09-06T14:41:55","upload_time_iso_8601":"2018-09-06T14:41:55.709235Z","url":"https://files.pythonhosted.org/packages/e6/ec/5c92cdd29d86e05b0938c56af54e06962a822689c5c70b5fa4eba727d799/xmldiff-2.0b2.tar.gz","yanked":false,"yanked_reason":null}],"2.0b3":[{"comment_text":"","digests":{"md5":"810ffd544e5de013bbc0ad49258d017c","sha256":"a7c2efc42f6b2e47af36d905521a0e97c5f469d3d8c4243b87db9281c056c5de"},"downloads":-1,"filename":"xmldiff-2.0b3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"810ffd544e5de013bbc0ad49258d017c","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54110,"upload_time":"2018-09-11T19:48:45","upload_time_iso_8601":"2018-09-11T19:48:45.470945Z","url":"https://files.pythonhosted.org/packages/0a/0c/fa7d475d3be9c376bb46fa7d0db1f70ee7cbce8d7328de750d06c72c1f8a/xmldiff-2.0b3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"116600a8ebf81955bbdde9716dcb8a70","sha256":"77e234d9e9e2f274e9bd86380f2fd0bb58ad3071278ab4c9df801ff54caead01"},"downloads":-1,"filename":"xmldiff-2.0b3.tar.gz","has_sig":false,"md5_digest":"116600a8ebf81955bbdde9716dcb8a70","packagetype":"sdist","python_version":"source","requires_python":null,"size":85573,"upload_time":"2018-09-11T19:48:47","upload_time_iso_8601":"2018-09-11T19:48:47.787379Z","url":"https://files.pythonhosted.org/packages/a7/2d/22d2e86b795f85aa80676c7668a5e375b44d3239664d72b0b1c32e7291ed/xmldiff-2.0b3.tar.gz","yanked":false,"yanked_reason":null}],"2.0b4":[{"comment_text":"","digests":{"md5":"e238130940a149c44927e30216bc0f74","sha256":"88ba6fb733677579a9bd6b1b1e99808d47d17ba20038075f8731ee12d40efb41"},"downloads":-1,"filename":"xmldiff-2.0b4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"e238130940a149c44927e30216bc0f74","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54166,"upload_time":"2018-09-12T12:58:38","upload_time_iso_8601":"2018-09-12T12:58:38.798219Z","url":"https://files.pythonhosted.org/packages/f2/99/891565815619416a411b6a43dca887c575035c0dd2da374e7c87df5d9263/xmldiff-2.0b4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"14f8369167928c97140e55af20438d95","sha256":"63bdf6265dac0213e71001b03c81171b7fb1bf2fab06cd0ea8c9d2ffd4c0cd0c"},"downloads":-1,"filename":"xmldiff-2.0b4.tar.gz","has_sig":false,"md5_digest":"14f8369167928c97140e55af20438d95","packagetype":"sdist","python_version":"source","requires_python":null,"size":87043,"upload_time":"2018-09-12T12:58:41","upload_time_iso_8601":"2018-09-12T12:58:41.083128Z","url":"https://files.pythonhosted.org/packages/eb/ca/24ff95b2da5a77f167e2113b6861f879f04629a5b1834ca221b790b36481/xmldiff-2.0b4.tar.gz","yanked":false,"yanked_reason":null}],"2.0b5":[{"comment_text":"","digests":{"md5":"8660d1531dda6f79bd48a49fbf3d5888","sha256":"01b00bcf84e8f9692215ef1f3d4cb350d076add26b70f29e4f31ac85e5f66a28"},"downloads":-1,"filename":"xmldiff-2.0b5-py2.py3-none-any.whl","has_sig":false,"md5_digest":"8660d1531dda6f79bd48a49fbf3d5888","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":54240,"upload_time":"2018-09-13T19:12:05","upload_time_iso_8601":"2018-09-13T19:12:05.832300Z","url":"https://files.pythonhosted.org/packages/ac/69/3a53d4aeb73dc20d140bdab53036572706e4cfc063d58d43cb73264b86ed/xmldiff-2.0b5-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"c8a97de8115ab5ee9c0d5e1f70ed9060","sha256":"308bff344aed37aa04aae552e9d54d0d8ba625386bd5b8817282ef75c66de407"},"downloads":-1,"filename":"xmldiff-2.0b5.tar.gz","has_sig":false,"md5_digest":"c8a97de8115ab5ee9c0d5e1f70ed9060","packagetype":"sdist","python_version":"source","requires_python":null,"size":87210,"upload_time":"2018-09-13T19:12:09","upload_time_iso_8601":"2018-09-13T19:12:09.026887Z","url":"https://files.pythonhosted.org/packages/55/83/cbd13288511af6f8c55ea340935cf17b244c485f6f776214fbc6bc41d7c4/xmldiff-2.0b5.tar.gz","yanked":false,"yanked_reason":null}],"2.0b6":[{"comment_text":"","digests":{"md5":"6e64c656bd3b495bc2d9f357c6f8901f","sha256":"9e6d41a6ebfe71a90a288ea7f3a5c8efa2b7fe313c3e1aa026fa97f345e07745"},"downloads":-1,"filename":"xmldiff-2.0b6-py2.py3-none-any.whl","has_sig":false,"md5_digest":"6e64c656bd3b495bc2d9f357c6f8901f","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":55113,"upload_time":"2018-09-13T19:14:55","upload_time_iso_8601":"2018-09-13T19:14:55.356378Z","url":"https://files.pythonhosted.org/packages/aa/39/115e4fa64aebf2c57a71c29c53740504f658b1447650a1473edb0c3ebb00/xmldiff-2.0b6-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5c2d8fafcf16fd0fa9220da91205f696","sha256":"fa4cb24351e678dd56c9b46350cd54b1f39209e03517532a5e8fa8db9adbda56"},"downloads":-1,"filename":"xmldiff-2.0b6.tar.gz","has_sig":false,"md5_digest":"5c2d8fafcf16fd0fa9220da91205f696","packagetype":"sdist","python_version":"source","requires_python":null,"size":88205,"upload_time":"2018-09-13T19:14:58","upload_time_iso_8601":"2018-09-13T19:14:58.034821Z","url":"https://files.pythonhosted.org/packages/2c/59/c47466d69a1293a7e1587a8af04d15c875415967527e9be6b4241723d96b/xmldiff-2.0b6.tar.gz","yanked":false,"yanked_reason":null}],"2.0b7":[{"comment_text":"","digests":{"md5":"7c1beaed9081f6dca0cce01ab4957c6b","sha256":"8dbfdf93bd9d91c07ab5494d316c6083c3d71f673fd66ba497ce2b6a2011dd18"},"downloads":-1,"filename":"xmldiff-2.0b7-py2.py3-none-any.whl","has_sig":false,"md5_digest":"7c1beaed9081f6dca0cce01ab4957c6b","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56045,"upload_time":"2018-09-14T13:31:42","upload_time_iso_8601":"2018-09-14T13:31:42.874915Z","url":"https://files.pythonhosted.org/packages/bc/6c/e71ecb88f2308d7528c687ce2982fa4dba85cdaa9ac46604af59d844ace7/xmldiff-2.0b7-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"bdc27299ae90128c3bbee2f833be2171","sha256":"e6ba88f2c2b8329d62b3aadfcb30dd782497087759673257e0f688df728a1694"},"downloads":-1,"filename":"xmldiff-2.0b7.tar.gz","has_sig":false,"md5_digest":"bdc27299ae90128c3bbee2f833be2171","packagetype":"sdist","python_version":"source","requires_python":null,"size":89558,"upload_time":"2018-09-14T13:31:45","upload_time_iso_8601":"2018-09-14T13:31:45.969375Z","url":"https://files.pythonhosted.org/packages/4b/7a/349fde975c7b6b7331da2542d0e2cf9f0b7d30054bb5684d94d90f48e12b/xmldiff-2.0b7.tar.gz","yanked":false,"yanked_reason":null}],"2.0rc1":[{"comment_text":"","digests":{"md5":"ff0d9ff18f6ad6b6951aa7f933782280","sha256":"582270dc62708af5ee2b649abde1ee1d6f0374f642f6b0b8771e203f2d4922ed"},"downloads":-1,"filename":"xmldiff-2.0rc1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"ff0d9ff18f6ad6b6951aa7f933782280","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56194,"upload_time":"2018-09-24T20:19:16","upload_time_iso_8601":"2018-09-24T20:19:16.377778Z","url":"https://files.pythonhosted.org/packages/e6/55/1c65e555d1e952644428da85662ef9c0448becfae5487ab321048b57d339/xmldiff-2.0rc1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"eaef8d536ee4faedb15b5b6e77c84378","sha256":"e6044d6cf2bb283ad72e7fae3200d275950cbdc7245751c62c51c3a6b12391d6"},"downloads":-1,"filename":"xmldiff-2.0rc1.tar.gz","has_sig":false,"md5_digest":"eaef8d536ee4faedb15b5b6e77c84378","packagetype":"sdist","python_version":"source","requires_python":null,"size":87563,"upload_time":"2018-09-24T20:19:18","upload_time_iso_8601":"2018-09-24T20:19:18.508231Z","url":"https://files.pythonhosted.org/packages/1f/f3/31351b897f110ac00cb5a13b0ea4ca5f272602ee0db46f0f810d8a1baa69/xmldiff-2.0rc1.tar.gz","yanked":false,"yanked_reason":null}],"2.1":[{"comment_text":"","digests":{"md5":"4881924e6245797451bd27c644d5b569","sha256":"62aed6f2d1779a7f934454a897c61a1bc704f7f04d6fb533e6bfe54c17d22224"},"downloads":-1,"filename":"xmldiff-2.1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"4881924e6245797451bd27c644d5b569","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57198,"upload_time":"2018-10-03T11:05:00","upload_time_iso_8601":"2018-10-03T11:05:00.909986Z","url":"https://files.pythonhosted.org/packages/27/23/91f3184390c709be6ce9419f2dd4e6b5bb2fd1b7a06579ea1625f8898d0b/xmldiff-2.1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"cc6b38495b180f0d1d852dd1794fef42","sha256":"528aaeff5b12aa7c1fe5909111fd7b46c14bf25f1a5ed759d6b422d45f10b40c"},"downloads":-1,"filename":"xmldiff-2.1.tar.gz","has_sig":false,"md5_digest":"cc6b38495b180f0d1d852dd1794fef42","packagetype":"sdist","python_version":"source","requires_python":null,"size":91935,"upload_time":"2018-10-03T11:05:03","upload_time_iso_8601":"2018-10-03T11:05:03.023229Z","url":"https://files.pythonhosted.org/packages/65/57/604980e6223c09e8b428c128d480ae516548f7d2bd8ad580e72f2b5dfc09/xmldiff-2.1.tar.gz","yanked":false,"yanked_reason":null}],"2.1b1":[{"comment_text":"","digests":{"md5":"3fb0bd3f94cce78d9fdf8838c8aa0313","sha256":"d58675740ed81b6f1397f3adb1fa30cc92d47a96a9e000c0b636772a20ea307c"},"downloads":-1,"filename":"xmldiff-2.1b1-py2.py3-none-any.whl","has_sig":false,"md5_digest":"3fb0bd3f94cce78d9fdf8838c8aa0313","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":56695,"upload_time":"2018-10-01T19:58:52","upload_time_iso_8601":"2018-10-01T19:58:52.535754Z","url":"https://files.pythonhosted.org/packages/a6/5a/ca949df720ed4e8754c61137c0f073452954ff32b2f50791f4a4fdc0e77a/xmldiff-2.1b1-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"a300ab4179a1b744a80d69d02997a453","sha256":"3e7180b09ad27439c295d022be6ef45e8aa3bdd00681b9556afbc8617cb31917"},"downloads":-1,"filename":"xmldiff-2.1b1.tar.gz","has_sig":false,"md5_digest":"a300ab4179a1b744a80d69d02997a453","packagetype":"sdist","python_version":"source","requires_python":null,"size":90728,"upload_time":"2018-10-01T19:58:54","upload_time_iso_8601":"2018-10-01T19:58:54.596506Z","url":"https://files.pythonhosted.org/packages/46/69/30fa7d24f48e0f77fcd4f3c811dc72127b997bb8149488123890bfb42baf/xmldiff-2.1b1.tar.gz","yanked":false,"yanked_reason":null}],"2.2":[{"comment_text":"","digests":{"md5":"381ae9b409adc01109fb4f48a15353e6","sha256":"35e688c7295ce389641bce37cd92fc3482d7d67874a67a9d0cc61a9ccc0f20ac"},"downloads":-1,"filename":"xmldiff-2.2-py2.py3-none-any.whl","has_sig":false,"md5_digest":"381ae9b409adc01109fb4f48a15353e6","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57344,"upload_time":"2018-10-12T16:21:34","upload_time_iso_8601":"2018-10-12T16:21:34.840456Z","url":"https://files.pythonhosted.org/packages/15/b5/3e4434f95cf68e1acb398dd9c596d07cc881c2fa45ab78659689615989d1/xmldiff-2.2-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"4c5811798dbb0164e075e4026d410633","sha256":"aad7b8b00a49eeef7cd69757b2c548b88d4d7c584b95ac4ea9c0f08e167bc5a0"},"downloads":-1,"filename":"xmldiff-2.2.tar.gz","has_sig":false,"md5_digest":"4c5811798dbb0164e075e4026d410633","packagetype":"sdist","python_version":"source","requires_python":null,"size":92135,"upload_time":"2018-10-12T16:21:36","upload_time_iso_8601":"2018-10-12T16:21:36.870458Z","url":"https://files.pythonhosted.org/packages/46/20/041ec087b8288b86aa71cea6f89c9aed9fc931d543d620d383556f646366/xmldiff-2.2.tar.gz","yanked":false,"yanked_reason":null}],"2.3":[{"comment_text":"","digests":{"md5":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","sha256":"4930ac8c01c5b5c94ae24ee5d26e42d537a3281291b06928529bb97cc11844e8"},"downloads":-1,"filename":"xmldiff-2.3-py2.py3-none-any.whl","has_sig":false,"md5_digest":"44c51fb9141dc9c2cb2d4a4bdbcc1acb","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":59466,"upload_time":"2019-02-27T11:49:48","upload_time_iso_8601":"2019-02-27T11:49:48.609906Z","url":"https://files.pythonhosted.org/packages/ff/37/ed2d26f5f196b6db5a7a53de1ab96c961ab0c0e42d7677ea302cc817ed7f/xmldiff-2.3-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0510299dba157df2cbfea40426465bf5","sha256":"2727f62ab590c1fc834e86033988a76a86a67f5a78196584049b7a722bd94466"},"downloads":-1,"filename":"xmldiff-2.3.tar.gz","has_sig":false,"md5_digest":"0510299dba157df2cbfea40426465bf5","packagetype":"sdist","python_version":"source","requires_python":null,"size":95947,"upload_time":"2019-02-27T11:49:51","upload_time_iso_8601":"2019-02-27T11:49:51.261375Z","url":"https://files.pythonhosted.org/packages/e6/1c/3dd86bec66fad3a21ac9d093610f83f6e20ad1d835ebf4079af53e65ed6b/xmldiff-2.3.tar.gz","yanked":false,"yanked_reason":null}],"2.4":[{"comment_text":"","digests":{"md5":"d676c724f7e13838edd8a7dcc8cbe3e7","sha256":"213c2f4c39ed71811a9ceeec1c8bdf2e673e5527261ea11708b3acfa6c2bdb00"},"downloads":-1,"filename":"xmldiff-2.4-py2.py3-none-any.whl","has_sig":false,"md5_digest":"d676c724f7e13838edd8a7dcc8cbe3e7","packagetype":"bdist_wheel","python_version":"py2.py3","requires_python":null,"size":57463,"upload_time":"2019-10-09T09:41:14","upload_time_iso_8601":"2019-10-09T09:41:14.821316Z","url":"https://files.pythonhosted.org/packages/36/95/7d9271ae617b6c448fa244b347e4fd43ed5ad1bb35cea282f1c0fa82ea2b/xmldiff-2.4-py2.py3-none-any.whl","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1728f65d01c5cb1f3c3838d489a1569d","sha256":"05bea20ce1f2c9678683bcce0c3ba9981f87d92b709d190e018bcbf047eccf63"},"downloads":-1,"filename":"xmldiff-2.4.tar.gz","has_sig":false,"md5_digest":"1728f65d01c5cb1f3c3838d489a1569d","packagetype":"sdist","python_version":"source","requires_python":null,"size":94826,"upload_time":"2019-10-09T09:41:17","upload_time_iso_8601":"2019-10-09T09:41:17.883138Z","url":"https://files.pythonhosted.org/packages/76/36/a3e41bf7c01f1110d7b5589ca74d2927d3736a5b43ee63053faf3483b991/xmldiff-2.4.tar.gz","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"md5":"ee08b66cae5d77364f6deee252638b3b","sha256":"462c76c145403eb5e9a8358dc402a53b264ab202ebabf83cdc660ed2cf72c89b"},"downloads":-1,"filename":"xmldiff-1.1.0.tar.gz","has_sig":false,"md5_digest":"ee08b66cae5d77364f6deee252638b3b","packagetype":"sdist","python_version":"source","requires_python":null,"size":39258,"upload_time":"2018-06-15T12:24:36","upload_time_iso_8601":"2018-06-15T12:24:36.191454Z","url":"https://files.pythonhosted.org/packages/ab/4a/cab33ec593f433b7cded3cec85d1f7c900261fd503bd894e16782f7c0d09/xmldiff-1.1.0.tar.gz","yanked":false,"yanked_reason":null}]}
diff --git a/pyroma/testdata/jsondata/distribute.json b/pyroma/testdata/jsondata/distribute.json
new file mode 100644
index 0000000..09c7a01
--- /dev/null
+++ b/pyroma/testdata/jsondata/distribute.json
@@ -0,0 +1 @@
+{"info":{"author":"The fellowship of the packaging","author_email":"distutils-sig@python.org","bugtrack_url":null,"classifiers":["Development Status :: 5 - Production/Stable","Intended Audience :: Developers","License :: OSI Approved :: Python Software Foundation License","License :: OSI Approved :: Zope Public License","Operating System :: OS Independent","Programming Language :: Python","Programming Language :: Python :: 3","Topic :: Software Development :: Libraries :: Python Modules","Topic :: System :: Archiving :: Packaging","Topic :: System :: Systems Administration","Topic :: Utilities"],"description":"===============================\nInstalling and Using Distribute\n===============================\n\n.. contents:: **Table of Contents**\n\n-----------\nDisclaimers\n-----------\n\nAbout the fork\n==============\n\n`Distribute` is a fork of the `Setuptools` project.\n\nDistribute is intended to replace Setuptools as the standard method\nfor working with Python module distributions.\n\nThe fork has two goals:\n\n- Providing a backward compatible version to replace Setuptools\n  and make all distributions that depend on Setuptools work as\n  before, but with less bugs and behaviorial issues.\n\n  This work is done in the 0.6.x series.\n\n  Starting with version 0.6.2, Distribute supports Python 3.\n  Installing and using distribute for Python 3 code works exactly\n  the same as for Python 2 code, but Distribute also helps you to support\n  Python 2 and Python 3 from the same source code by letting you run 2to3\n  on the code as a part of the build process, by setting the keyword parameter\n  ``use_2to3`` to True. See http://packages.python.org/distribute for more\n  information.\n\n- Refactoring the code, and releasing it in several distributions.\n  This work is being done in the 0.7.x series but not yet released.\n\nThe roadmap is still evolving, and the page that is up-to-date is\nlocated at : `http://packages.python.org/distribute/roadmap`.\n\nIf you install `Distribute` and want to switch back for any reason to\n`Setuptools`, get to the `Uninstallation instructions`_ section.\n\nMore documentation\n==================\n\nYou can get more information in the Sphinx-based documentation, located\nat http://packages.python.org/distribute. This documentation includes the old\nSetuptools documentation that is slowly replaced, and brand new content.\n\nAbout the installation process\n==============================\n\nThe `Distribute` installer modifies your installation by de-activating an\nexisting installation of `Setuptools` in a bootstrap process. This process\nhas been tested in various installation schemes and contexts but in case of a\nbug during this process your Python installation might be left in a broken\nstate. Since all modified files and directories are copied before the\ninstallation starts, you will be able to get back to a normal state by reading\nthe instructions in the `Uninstallation instructions`_ section.\n\nIn any case, it is recommended to save you `site-packages` directory before\nyou start the installation of `Distribute`.\n\n-------------------------\nInstallation Instructions\n-------------------------\n\nDistribute is only released as a source distribution.\n\nIt can be installed using pip, and can be done so with the source tarball,\nor by using the ``distribute_setup.py`` script provided online.\n\n``distribute_setup.py`` is the simplest and preferred way on all systems.\n\ndistribute_setup.py\n===================\n\nDownload\n`distribute_setup.py <http://python-distribute.org/distribute_setup.py>`_\nand execute it, using the Python interpreter of your choice.\n\nIf your shell has the ``curl`` program you can do::\n\n    $ curl -O http://python-distribute.org/distribute_setup.py\n    $ python distribute_setup.py\n\nNotice this file is also provided in the source release.\n\npip\n===\n\nRun easy_install or pip::\n\n    $ pip install distribute\n\nSource installation\n===================\n\nDownload the source tarball, uncompress it, then run the install command::\n\n    $ curl -O http://pypi.python.org/packages/source/d/distribute/distribute-0.6.15.tar.gz\n    $ tar -xzvf distribute-0.6.15.tar.gz\n    $ cd distribute-0.6.15\n    $ python setup.py install\n\n---------------------------\nUninstallation Instructions\n---------------------------\n\nLike other distutils-based distributions, Distribute doesn't provide an\nuninstaller yet. It's all done manually! We are all waiting for PEP 376\nsupport in Python.\n\nDistribute is installed in three steps:\n\n1. it gets out of the way an existing installation of Setuptools\n2. it installs a `fake` setuptools installation\n3. it installs distribute\n\nDistribute can be removed like this:\n\n- remove the ``distribute*.egg`` file located in your site-packages directory\n- remove the ``setuptools.pth`` file located in you site-packages directory\n- remove the easy_install script located in you ``sys.prefix/bin`` directory\n- remove the ``setuptools*.egg`` directory located in your site-packages directory,\n  if any.\n\nIf you want to get back to setuptools:\n\n- reinstall setuptools using its instruction.\n\nLastly:\n\n- remove the *.OLD.* directory located in your site-packages directory if any,\n  **once you have checked everything was working correctly again**.\n\n-------------------------\nQuick help for developers\n-------------------------\n\nTo create an egg which is compatible with Distribute, use the same\npractice as with Setuptools, e.g.::\n\n    from setuptools import setup\n\n    setup(...\n    )\n\nTo use `pkg_resources` to access data files in the egg, you should\nrequire the Setuptools distribution explicitly::\n\n    from setuptools import setup\n\n    setup(...\n        install_requires=['setuptools']\n    )\n\nOnly if you need Distribute-specific functionality should you depend\non it explicitly. In this case, replace the Setuptools dependency::\n\n    from setuptools import setup\n\n    setup(...\n        install_requires=['distribute']\n    )\n\n-----------\nInstall FAQ\n-----------\n\n- **Why is Distribute wrapping my Setuptools installation?**\n\n   Since Distribute is a fork, and since it provides the same package\n   and modules, it renames the existing Setuptools egg and inserts a\n   new one which merely wraps the Distribute code. This way, full\n   backwards compatibility is kept for packages which rely on the\n   Setuptools modules.\n\n   At the same time, packages can meet their dependency on Setuptools\n   without actually installing it (which would disable Distribute).\n\n- **How does Distribute interact with virtualenv?**\n\n  Everytime you create a virtualenv it will install setuptools by default.\n  You either need to re-install Distribute in it right after or pass the\n  ``--distribute`` option when creating it.\n\n  Once installed, your virtualenv will use Distribute transparently.\n\n  Although, if you have Setuptools installed in your system-wide Python,\n  and if the virtualenv you are in was generated without the `--no-site-packages`\n  option, the Distribute installation will stop.\n\n  You need in this case to build a virtualenv with the `--no-site-packages`\n  option or to install `Distribute` globally.\n\n- **How does Distribute interacts with zc.buildout?**\n\n  You can use Distribute in your zc.buildout, with the --distribute option,\n  starting at zc.buildout 1.4.2::\n\n  $ python bootstrap.py --distribute\n\n  For previous zc.buildout versions, *the only thing* you need to do\n  is use the bootstrap at `http://python-distribute.org/bootstrap.py`.  Run\n  that bootstrap and ``bin/buildout`` (and all other buildout-generated\n  scripts) will transparently use distribute instead of setuptools.  You do\n  not need a specific buildout release.\n\n  A shared eggs directory is no problem (since 0.6.6): the setuptools egg is\n  left in place unmodified.  So other buildouts that do not yet use the new\n  bootstrap continue to work just fine.  And there is no need to list\n  ``distribute`` somewhere in your eggs: using the bootstrap is enough.\n\n  The source code for the bootstrap script is located at\n  `http://bitbucket.org/tarek/buildout-distribute`.\n\n\n\n-----------------------------\nFeedback and getting involved\n-----------------------------\n\n- Mailing list: http://mail.python.org/mailman/listinfo/distutils-sig\n- Issue tracker: http://bitbucket.org/tarek/distribute/issues/\n- Code Repository: http://bitbucket.org/tarek/distribute\n\n=======\nCHANGES\n=======\n\n------\n0.6.15\n------\n\n* Fixed typo in bdist_egg\n* Several issues under Python 3 has been solved.\n* Issue 146: Fixed missing DLL files after easy_install of windows exe package.\n\n------\n0.6.14\n------\n\n* Issue 170: Fixed unittest failure. Thanks to Toshio.\n* Issue 171: Fixed race condition in unittests cause deadlocks in test suite.\n* Issue 143: Fixed a lookup issue with easy_install.\n  Thanks to David and Zooko.\n* Issue 174: Fixed the edit mode when its used with setuptools itself\n\n------\n0.6.13\n------\n\n* Issue 160: 2.7 gives ValueError(\"Invalid IPv6 URL\")\n* Issue 150: Fixed using ~/.local even in a --no-site-packages virtualenv\n* Issue 163: scan index links before external links, and don't use the md5 when\n  comparing two distributions\n\n------\n0.6.12\n------\n\n* Issue 149: Fixed various failures on 2.3/2.4\n\n------\n0.6.11\n------\n\n* Found another case of SandboxViolation - fixed\n* Issue 15 and 48: Introduced a socket timeout of 15 seconds on url openings\n* Added indexsidebar.html into MANIFEST.in\n* Issue 108: Fixed TypeError with Python3.1\n* Issue 121: Fixed --help install command trying to actually install.\n* Issue 112: Added an os.makedirs so that Tarek's solution will work.\n* Issue 133: Added --no-find-links to easy_install\n* Added easy_install --user\n* Issue 100: Fixed develop --user not taking '.' in PYTHONPATH into account\n* Issue 134: removed spurious UserWarnings. Patch by VanLindberg\n* Issue 138: cant_write_to_target error when setup_requires is used.\n* Issue 147: respect the sys.dont_write_bytecode flag\n\n------\n0.6.10\n------\n\n* Reverted change made for the DistributionNotFound exception because\n  zc.buildout uses the exception message to get the name of the\n  distribution.\n\n-----\n0.6.9\n-----\n\n* Issue 90: unknown setuptools version can be added in the working set\n* Issue 87: setupt.py doesn't try to convert distribute_setup.py anymore\n  Initial Patch by arfrever.\n* Issue 89: added a side bar with a download link to the doc.\n* Issue 86: fixed missing sentence in pkg_resources doc.\n* Added a nicer error message when a DistributionNotFound is raised.\n* Issue 80: test_develop now works with Python 3.1\n* Issue 93: upload_docs now works if there is an empty sub-directory.\n* Issue 70: exec bit on non-exec files\n* Issue 99: now the standalone easy_install command doesn't uses a\n  \"setup.cfg\" if any exists in the working directory. It will use it\n  only if triggered by ``install_requires`` from a setup.py call\n  (install, develop, etc).\n* Issue 101: Allowing ``os.devnull`` in Sandbox\n* Issue 92: Fixed the \"no eggs\" found error with MacPort\n  (platform.mac_ver() fails)\n* Issue 103: test_get_script_header_jython_workaround not run\n  anymore under py3 with C or POSIX local. Contributed by Arfrever.\n* Issue 104: remvoved the assertion when the installation fails,\n  with a nicer message for the end user.\n* Issue 100: making sure there's no SandboxViolation when\n  the setup script patches setuptools.\n\n-----\n0.6.8\n-----\n\n* Added \"check_packages\" in dist. (added in Setuptools 0.6c11)\n* Fixed the DONT_PATCH_SETUPTOOLS state.\n\n-----\n0.6.7\n-----\n\n* Issue 58: Added --user support to the develop command\n* Issue 11: Generated scripts now wrap their call to the script entry point\n  in the standard \"if name == 'main'\"\n* Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv\n  can drive an installation that doesn't patch a global setuptools.\n* Reviewed unladen-swallow specific change from\n  http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719\n  and determined that it no longer applies. Distribute should work fine with\n  Unladen Swallow 2009Q3.\n* Issue 21: Allow PackageIndex.open_url to gracefully handle all cases of a\n  httplib.HTTPException instead of just InvalidURL and BadStatusLine.\n* Removed virtual-python.py from this distribution and updated documentation\n  to point to the actively maintained virtualenv instead.\n* Issue 64: use_setuptools no longer rebuilds the distribute egg every\n  time it is run\n* use_setuptools now properly respects the requested version\n* use_setuptools will no longer try to import a distribute egg for the\n  wrong Python version\n* Issue 74: no_fake should be True by default.\n* Issue 72: avoid a bootstrapping issue with easy_install -U\n\n-----\n0.6.6\n-----\n\n* Unified the bootstrap file so it works on both py2.x and py3k without 2to3\n  (patch by Holger Krekel)\n\n-----\n0.6.5\n-----\n\n* Issue 65: cli.exe and gui.exe are now generated at build time,\n  depending on the platform in use.\n\n* Issue 67: Fixed doc typo (PEP 381/382)\n\n* Distribute no longer shadows setuptools if we require a 0.7-series\n  setuptools.  And an error is raised when installing a 0.7 setuptools with\n  distribute.\n\n* When run from within buildout, no attempt is made to modify an existing\n  setuptools egg, whether in a shared egg directory or a system setuptools.\n\n* Fixed a hole in sandboxing allowing builtin file to write outside of\n  the sandbox.\n\n-----\n0.6.4\n-----\n\n* Added the generation of `distribute_setup_3k.py` during the release.\n  This close http://bitbucket.org/tarek/distribute/issue/52.\n\n* Added an upload_docs command to easily upload project documentation to\n  PyPI's http://packages.python.org.\n  This close http://bitbucket.org/tarek/distribute/issue/56.\n\n* Fixed a bootstrap bug on the use_setuptools() API.\n\n-----\n0.6.3\n-----\n\nsetuptools\n==========\n\n* Fixed a bunch of calls to file() that caused crashes on Python 3.\n\nbootstrapping\n=============\n\n* Fixed a bug in sorting that caused bootstrap to fail on Python 3.\n\n-----\n0.6.2\n-----\n\nsetuptools\n==========\n\n* Added Python 3 support; see docs/python3.txt.\n  This closes http://bugs.python.org/setuptools/issue39.\n\n* Added option to run 2to3 automatically when installing on Python 3.\n  This closes http://bitbucket.org/tarek/distribute/issue/31.\n\n* Fixed invalid usage of requirement.parse, that broke develop -d.\n  This closes http://bugs.python.org/setuptools/issue44.\n\n* Fixed script launcher for 64-bit Windows.\n  This closes http://bugs.python.org/setuptools/issue2.\n\n* KeyError when compiling extensions.\n  This closes http://bugs.python.org/setuptools/issue41.\n\nbootstrapping\n=============\n\n* Fixed bootstrap not working on Windows.\n  This closes http://bitbucket.org/tarek/distribute/issue/49.\n\n* Fixed 2.6 dependencies.\n  This closes http://bitbucket.org/tarek/distribute/issue/50.\n\n* Make sure setuptools is patched when running through easy_install\n  This closes http://bugs.python.org/setuptools/issue40.\n\n-----\n0.6.1\n-----\n\nsetuptools\n==========\n\n* package_index.urlopen now catches BadStatusLine and malformed url errors.\n  This closes http://bitbucket.org/tarek/distribute/issue/16 and\n  http://bitbucket.org/tarek/distribute/issue/18.\n\n* zip_ok is now False by default. This closes\n  http://bugs.python.org/setuptools/issue33.\n\n* Fixed invalid URL error catching. http://bugs.python.org/setuptools/issue20.\n\n* Fixed invalid bootstraping with easy_install installation\n  http://bitbucket.org/tarek/distribute/issue/40.\n  Thanks to Florian Schulze for the help.\n\n* Removed buildout/bootstrap.py. A new repository will create a specific\n  bootstrap.py script.\n\n\nbootstrapping\n=============\n\n* The boostrap process leave setuptools alone if detected in the system\n  and --root or --prefix is provided, but is not in the same location.\n  This closes http://bitbucket.org/tarek/distribute/issue/10.\n\n---\n0.6\n---\n\nsetuptools\n==========\n\n* Packages required at build time where not fully present at install time.\n  This closes http://bitbucket.org/tarek/distribute/issue/12.\n\n* Protected against failures in tarfile extraction. This closes\n  http://bitbucket.org/tarek/distribute/issue/10.\n\n* Made Jython api_tests.txt doctest compatible. This closes\n  http://bitbucket.org/tarek/distribute/issue/7.\n\n* sandbox.py replaced builtin type file with builtin function open. This\n  closes http://bitbucket.org/tarek/distribute/issue/6.\n\n* Immediately close all file handles. This closes\n  http://bitbucket.org/tarek/distribute/issue/3.\n\n* Added compatibility with Subversion 1.6. This references\n  http://bitbucket.org/tarek/distribute/issue/1.\n\npkg_resources\n=============\n\n* Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API\n  instead. Based on a patch from ronaldoussoren. This closes\n  http://bitbucket.org/tarek/distribute/issue/5.\n\n* Fixed a SandboxViolation for mkdir that could occur in certain cases.\n  This closes http://bitbucket.org/tarek/distribute/issue/13.\n\n* Allow to find_on_path on systems with tight permissions to fail gracefully.\n  This closes http://bitbucket.org/tarek/distribute/issue/9.\n\n* Corrected inconsistency between documentation and code of add_entry.\n  This closes http://bitbucket.org/tarek/distribute/issue/8.\n\n* Immediately close all file handles. This closes\n  http://bitbucket.org/tarek/distribute/issue/3.\n\neasy_install\n============\n\n* Immediately close all file handles. This closes\n  http://bitbucket.org/tarek/distribute/issue/3.","description_content_type":null,"docs_url":null,"download_url":"UNKNOWN","downloads":{"last_day":-1,"last_month":-1,"last_week":-1},"home_page":"http://packages.python.org/distribute","keywords":"CPAN PyPI distutils eggs package management","license":"PSF or ZPL","maintainer":null,"maintainer_email":null,"name":"distribute","package_url":"https://pypi.org/project/distribute/","platform":"UNKNOWN","project_url":"https://pypi.org/project/distribute/","project_urls":{"Download":"UNKNOWN","Homepage":"http://packages.python.org/distribute"},"release_url":"https://pypi.org/project/distribute/0.6.15/","requires_dist":null,"requires_python":null,"python_requires":">=3.0","summary":"Easily download, build, install, upgrade, and uninstall Python packages","version":"0.6.15","yanked":false,"yanked_reason":null},"last_serial":2525930,"releases":{"0.6":[{"comment_text":"","digests":{"md5":"49b936db5d9d7fd87a5eac2d55964134","sha256":"0520df7dd20b84233dce5f8c1b284cf88a75621eb7c9b84e0358e77a6ffde68c"},"downloads":-1,"filename":"distribute-0.6.tar.gz","has_sig":false,"md5_digest":"49b936db5d9d7fd87a5eac2d55964134","packagetype":"sdist","python_version":"source","requires_python":null,"size":365198,"upload_time":"2011-09-22T18:27:32","upload_time_iso_8601":"2011-09-22T18:27:32.964060Z","url":"https://files.pythonhosted.org/packages/2b/37/8468dd6c136d01adbd031f58b62fc6a8dbd1aedcfbeca2b86f298a960849/distribute-0.6.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"ad25841e6df0c45208a1b4ffc13cac61","sha256":"2f3f6c44d398c91238658cf831773b9f8b0927c4eef694879b95b0e784e588df"},"downloads":-1,"filename":"distribute-0.6.zip","has_sig":false,"md5_digest":"ad25841e6df0c45208a1b4ffc13cac61","packagetype":"sdist","python_version":"source","requires_python":null,"size":400632,"upload_time":"2016-01-19T00:00:12","upload_time_iso_8601":"2016-01-19T00:00:12.771591Z","url":"https://files.pythonhosted.org/packages/f5/a1/5d176b200da15f6a1cbd50115d7218ddcbd8764c4ea300768b37ca123a69/distribute-0.6.zip","yanked":false,"yanked_reason":null}],"0.6.1":[{"comment_text":"","digests":{"md5":"5fb8cdfe8dc70485aa1d00a7bbb220fc","sha256":"4e2d26047c7ca7cea83d178de04ca44c40e137f412252ac59878759e37fc60ff"},"downloads":-1,"filename":"distribute-0.6.1.tar.gz","has_sig":false,"md5_digest":"5fb8cdfe8dc70485aa1d00a7bbb220fc","packagetype":"sdist","python_version":"source","requires_python":null,"size":361619,"upload_time":"2011-09-22T18:28:08","upload_time_iso_8601":"2011-09-22T18:28:08.064062Z","url":"https://files.pythonhosted.org/packages/42/2f/77365178cb4567987d0248f05d7c5adfad2b04bacfbfbc9bc6320b2575dc/distribute-0.6.1.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"c25c33e733e0a2159fcf102ac8ebcba6","sha256":"fe57c7ab40f5a8e0764f0b737a4df08dd3818f123b008e50f7493adbda7426b5"},"downloads":-1,"filename":"distribute-0.6.1.zip","has_sig":false,"md5_digest":"c25c33e733e0a2159fcf102ac8ebcba6","packagetype":"sdist","python_version":"source","requires_python":null,"size":396247,"upload_time":"2016-01-19T00:00:32","upload_time_iso_8601":"2016-01-19T00:00:32.046038Z","url":"https://files.pythonhosted.org/packages/4f/5a/2c01b3bb9fef9e6fc4673925c974f18ff9d3c6a7513208a5513d6dc2298e/distribute-0.6.1.zip","yanked":false,"yanked_reason":null}],"0.6.10":[{"comment_text":"","digests":{"md5":"0e2c14f2ec152f6454297870fc1cf499","sha256":"0c291a31248376ca76b5662c6ff4e33e7d3eba6d91b4c0a5ca663c9c954e8a1a"},"downloads":-1,"filename":"distribute-0.6.10.tar.gz","has_sig":false,"md5_digest":"0e2c14f2ec152f6454297870fc1cf499","packagetype":"sdist","python_version":"source","requires_python":null,"size":389668,"upload_time":"2011-09-22T18:30:29","upload_time_iso_8601":"2011-09-22T18:30:29.954437Z","url":"https://files.pythonhosted.org/packages/07/9d/2af576b8b199c69d839a8dfd6025b6721a18a0b771a051b2b62b3c866d0f/distribute-0.6.10.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1fa1c316ad8f73f0620a64cf03297c2a","sha256":"ccaec91646cd6a57eae7aecc9c819fd8300c8d0005019a2ce7485e572ab485dd"},"downloads":-1,"filename":"distribute-0.6.10.zip","has_sig":false,"md5_digest":"1fa1c316ad8f73f0620a64cf03297c2a","packagetype":"sdist","python_version":"source","requires_python":null,"size":425477,"upload_time":"2016-01-19T00:01:56","upload_time_iso_8601":"2016-01-19T00:01:56.581573Z","url":"https://files.pythonhosted.org/packages/39/19/dae27189d9c1758e3db9bf27930e88cc05b0ca60c3eb5668ca6e329a6fca/distribute-0.6.10.zip","yanked":false,"yanked_reason":null}],"0.6.11":[{"comment_text":"","digests":{"md5":"6ac0431bce33d0e67b23029064ee3446","sha256":"d04390637087e25dfc0851d0c352900b64c0cf9b831d40e89de5636ec3df8bee"},"downloads":-1,"filename":"distribute-0.6.11.tar.gz","has_sig":false,"md5_digest":"6ac0431bce33d0e67b23029064ee3446","packagetype":"sdist","python_version":"source","requires_python":null,"size":393425,"upload_time":"2011-09-22T18:30:42","upload_time_iso_8601":"2011-09-22T18:30:42.159594Z","url":"https://files.pythonhosted.org/packages/60/6b/a6b6a5bfd5a04ba71a458fe50c86d10855cf3ccc04ec11a3f2b94681c67b/distribute-0.6.11.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"a0b115eff03e2086e26a9361c370a98e","sha256":"e35c3554fa5f66013ab5be1f3387146c565ec028514733d571cc6f42e1af0e1f"},"downloads":-1,"filename":"distribute-0.6.11.zip","has_sig":false,"md5_digest":"a0b115eff03e2086e26a9361c370a98e","packagetype":"sdist","python_version":"source","requires_python":null,"size":430439,"upload_time":"2016-01-19T00:02:03","upload_time_iso_8601":"2016-01-19T00:02:03.464331Z","url":"https://files.pythonhosted.org/packages/aa/37/86c4925d9fd77500599d29325f07e0c1ccd6b6bf9150a06144e7604b5c9e/distribute-0.6.11.zip","yanked":false,"yanked_reason":null}],"0.6.12":[{"comment_text":"","digests":{"md5":"d4713d07bccd48892e455fe30230f8bc","sha256":"a519e9e6a402be4d206d934885bf263f47adf1e88084eeffc3fa00fe64133a45"},"downloads":-1,"filename":"distribute-0.6.12.tar.gz","has_sig":false,"md5_digest":"d4713d07bccd48892e455fe30230f8bc","packagetype":"sdist","python_version":"source","requires_python":null,"size":393570,"upload_time":"2011-09-22T18:30:54","upload_time_iso_8601":"2011-09-22T18:30:54.440941Z","url":"https://files.pythonhosted.org/packages/cd/fb/efc926f7231e011d2abedf7cb3835dfccf2d5e08fa115a30fe9225244bb3/distribute-0.6.12.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"97186a81c6ed32f8a4c63dde930d9222","sha256":"06382930f84acc74d8dd9d15c30bdfa378532b0e6c65f391dff4d310dd0b14ea"},"downloads":-1,"filename":"distribute-0.6.12.zip","has_sig":false,"md5_digest":"97186a81c6ed32f8a4c63dde930d9222","packagetype":"sdist","python_version":"source","requires_python":null,"size":430588,"upload_time":"2016-01-19T00:02:15","upload_time_iso_8601":"2016-01-19T00:02:15.313666Z","url":"https://files.pythonhosted.org/packages/42/71/9dfd846af8d66f94ef3b32fa9c36de7d2303e6080ec21f12d9a38c72287a/distribute-0.6.12.zip","yanked":false,"yanked_reason":null}],"0.6.13":[{"comment_text":"","digests":{"md5":"e41f26aeb1f24abcc89382d4ff6881bd","sha256":"a4acfcbd37741ea5ae9510ec72a8e8c482d7d4a504cba3d72ecd3971165d7e85"},"downloads":-1,"filename":"distribute-0.6.13.tar.gz","has_sig":false,"md5_digest":"e41f26aeb1f24abcc89382d4ff6881bd","packagetype":"sdist","python_version":"source","requires_python":null,"size":395617,"upload_time":"2011-09-22T18:31:05","upload_time_iso_8601":"2011-09-22T18:31:05.994782Z","url":"https://files.pythonhosted.org/packages/0b/89/94f3ecf6767ee521962c3b128ef832d452f9b857b244bebfb0b8426d909f/distribute-0.6.13.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"3b0098545f556edc94cf69dc1da3d2ce","sha256":"4b935edc3bd049cc4c597c123e515d428619a8c8b0b477cbe95343cb479ba3a8"},"downloads":-1,"filename":"distribute-0.6.13.zip","has_sig":false,"md5_digest":"3b0098545f556edc94cf69dc1da3d2ce","packagetype":"sdist","python_version":"source","requires_python":null,"size":432855,"upload_time":"2016-01-19T00:02:27","upload_time_iso_8601":"2016-01-19T00:02:27.466194Z","url":"https://files.pythonhosted.org/packages/c6/4c/0ba3f3d7075381526f15a47ce7835e5d1577caec569cc29653dfa0231350/distribute-0.6.13.zip","yanked":false,"yanked_reason":null}],"0.6.14":[{"comment_text":"","digests":{"md5":"83ada58a83d99b28c806703597323b80","sha256":"44c92b7edbc0ff9cd5847291e7dcb4cc75e24247a306bd4b8a139abd355b0db0"},"downloads":-1,"filename":"distribute-0.6.14.tar.gz","has_sig":false,"md5_digest":"83ada58a83d99b28c806703597323b80","packagetype":"sdist","python_version":"source","requires_python":null,"size":396609,"upload_time":"2011-09-22T18:31:46","upload_time_iso_8601":"2011-09-22T18:31:46.046582Z","url":"https://files.pythonhosted.org/packages/95/f1/6128255a94f3d57e0f7ec2767c1893d1ab769bef48e847173f923d977e1d/distribute-0.6.14.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"38282c754d136a66bfdad3932f3ed33a","sha256":"4ceec6b1ec8300fe4e1a60a9781c7bc1956feee0d6a87a002254aca080a9126d"},"downloads":-1,"filename":"distribute-0.6.14.zip","has_sig":false,"md5_digest":"38282c754d136a66bfdad3932f3ed33a","packagetype":"sdist","python_version":"source","requires_python":null,"size":435162,"upload_time":"2016-01-19T00:02:41","upload_time_iso_8601":"2016-01-19T00:02:41.727306Z","url":"https://files.pythonhosted.org/packages/0b/f7/c564907eacadc3cbace0174a95c9176e5a371e19ddc38baf1919d2d8cb3d/distribute-0.6.14.zip","yanked":false,"yanked_reason":null}],"0.6.15":[{"comment_text":"","digests":{"md5":"8a5c36afe934ef90ce2da15a1c557128","sha256":"85b05942f84146d8f0ed17906b90af7662d649b922fe77a8c402da5da258a481"},"downloads":-1,"filename":"distribute-0.6.15.tar.gz","has_sig":false,"md5_digest":"8a5c36afe934ef90ce2da15a1c557128","packagetype":"sdist","python_version":"source","requires_python":null,"size":397027,"upload_time":"2011-09-22T18:32:37","upload_time_iso_8601":"2011-09-22T18:32:37.570852Z","url":"https://files.pythonhosted.org/packages/07/a6/8f6b270b7e6a1be3df78b174e2437fdb631cfcce16f82c2f8b7affb50ee2/distribute-0.6.15.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"86ca2e0a13621a9b742246b2509602a2","sha256":"a6cba0f43a70dceab680ba475df2a451b53257e5dc3267323c2a666c1673a31b"},"downloads":-1,"filename":"distribute-0.6.15.zip","has_sig":false,"md5_digest":"86ca2e0a13621a9b742246b2509602a2","packagetype":"sdist","python_version":"source","requires_python":null,"size":435492,"upload_time":"2016-01-19T00:02:50","upload_time_iso_8601":"2016-01-19T00:02:50.500500Z","url":"https://files.pythonhosted.org/packages/7f/00/9219235d4222c3da6729e6e2afa4a9080b987169bab3b2ec6cbb7c2e86da/distribute-0.6.15.zip","yanked":false,"yanked_reason":null}],"0.6.16":[{"comment_text":"","digests":{"md5":"c650a6bd418bb781f8dc90c78f36967a","sha256":"cb2de242f3af2d1aa225e514e5b8ed7d41cdb4c505d3cf5cc6e3ca0646b4dd9b"},"downloads":-1,"filename":"distribute-0.6.16.tar.gz","has_sig":false,"md5_digest":"c650a6bd418bb781f8dc90c78f36967a","packagetype":"sdist","python_version":"source","requires_python":null,"size":397684,"upload_time":"2011-09-22T18:32:56","upload_time_iso_8601":"2011-09-22T18:32:56.021001Z","url":"https://files.pythonhosted.org/packages/20/e0/6c03055f8520384b0050bb97757ab58afae5f35adb8b9a26bba2cd4de8bd/distribute-0.6.16.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"f1a91231991e26364fd3fb7d950c65c5","sha256":"5ba2f101f32861c5aa87cc50037b1c7d30a2b225c8c324afbc0b89a8660b8dbe"},"downloads":-1,"filename":"distribute-0.6.16.zip","has_sig":false,"md5_digest":"f1a91231991e26364fd3fb7d950c65c5","packagetype":"sdist","python_version":"source","requires_python":null,"size":436134,"upload_time":"2016-01-19T00:02:57","upload_time_iso_8601":"2016-01-19T00:02:57.480103Z","url":"https://files.pythonhosted.org/packages/de/f0/13745a2a99391522cd6d8eb493c0fff54754c669de5988efab80573d382d/distribute-0.6.16.zip","yanked":false,"yanked_reason":null}],"0.6.17":[{"comment_text":"","digests":{"md5":"5e9c933b84ecf1488d3a8a00ae11e82d","sha256":"8052d922eaf542e336593822c15e753248373c88ce4a1a94674952698ab7c5ac"},"downloads":-1,"filename":"distribute-0.6.17.tar.gz","has_sig":false,"md5_digest":"5e9c933b84ecf1488d3a8a00ae11e82d","packagetype":"sdist","python_version":"source","requires_python":null,"size":399075,"upload_time":"2011-09-22T18:33:15","upload_time_iso_8601":"2011-09-22T18:33:15.896157Z","url":"https://files.pythonhosted.org/packages/7f/1c/37153c8248bd510bfd573c26d5fd2b91bcf39ebc513ab8f7883294d0625b/distribute-0.6.17.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"b0e6bad948b389ac1bc8cdcb1960fea5","sha256":"5c138bca2e17c730089a1120864472c3c659fbe87d7ba65dd7a1c089c759bfa9"},"downloads":-1,"filename":"distribute-0.6.17.zip","has_sig":false,"md5_digest":"b0e6bad948b389ac1bc8cdcb1960fea5","packagetype":"sdist","python_version":"source","requires_python":null,"size":437675,"upload_time":"2016-01-19T00:03:09","upload_time_iso_8601":"2016-01-19T00:03:09.903631Z","url":"https://files.pythonhosted.org/packages/5f/d0/2c0c6142f91f75e3f3cfefe869757226742fd21db00e935b6cb9052a01bf/distribute-0.6.17.zip","yanked":false,"yanked_reason":null}],"0.6.18":[{"comment_text":"","digests":{"md5":"58ab2e41e0604be84fbfb06c46bd70e8","sha256":"160f74cd7b4125b373604b8ce84c6fa5153d46416b85aae2469255f679d6362a"},"downloads":-1,"filename":"distribute-0.6.18.tar.gz","has_sig":false,"md5_digest":"58ab2e41e0604be84fbfb06c46bd70e8","packagetype":"sdist","python_version":"source","requires_python":null,"size":399410,"upload_time":"2011-09-22T18:33:29","upload_time_iso_8601":"2011-09-22T18:33:29.113354Z","url":"https://files.pythonhosted.org/packages/b3/93/cc5e6ff77a060b5a28e3e0d8db907f4b69a546ce75ff6fd653319461cdf1/distribute-0.6.18.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"734f016b260855489532745f72b00316","sha256":"89fb195fdc09527e1d21758272ec67cad5304390aeb3ff6fe45821687aa93577"},"downloads":-1,"filename":"distribute-0.6.18.zip","has_sig":false,"md5_digest":"734f016b260855489532745f72b00316","packagetype":"sdist","python_version":"source","requires_python":null,"size":438039,"upload_time":"2016-01-19T00:03:21","upload_time_iso_8601":"2016-01-19T00:03:21.680067Z","url":"https://files.pythonhosted.org/packages/35/4f/b0564981f9dd220a6db88be661a8331523a2524caf3d01e976a0c87a6942/distribute-0.6.18.zip","yanked":false,"yanked_reason":null}],"0.6.19":[{"comment_text":"","digests":{"md5":"21e7a442c4d8f0cb0223f2ed5e4569ad","sha256":"a1c4f65170ae95c4078ca5c3e24f1df018fe6ea2d4f3a702eed0d74d70cd6722"},"downloads":-1,"filename":"distribute-0.6.19.tar.gz","has_sig":false,"md5_digest":"21e7a442c4d8f0cb0223f2ed5e4569ad","packagetype":"sdist","python_version":"source","requires_python":null,"size":399518,"upload_time":"2011-09-22T18:33:40","upload_time_iso_8601":"2011-09-22T18:33:40.623416Z","url":"https://files.pythonhosted.org/packages/86/74/d6862980635b0827a9564646fbab7386c91d46b5dc177deb7a4d5a4a74df/distribute-0.6.19.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"6236355ecade133a8def830f579d4ef6","sha256":"5ce5d0e067de948136c61b24ffc943bf01f25da22e672acf698ad17581dfdacd"},"downloads":-1,"filename":"distribute-0.6.19.zip","has_sig":false,"md5_digest":"6236355ecade133a8def830f579d4ef6","packagetype":"sdist","python_version":"source","requires_python":null,"size":438159,"upload_time":"2016-01-19T00:03:31","upload_time_iso_8601":"2016-01-19T00:03:31.753597Z","url":"https://files.pythonhosted.org/packages/e2/f5/64dedcfd63da54b05372dcf0688b9ab6dd27ac64acac40f260f96d561519/distribute-0.6.19.zip","yanked":false,"yanked_reason":null}],"0.6.2":[{"comment_text":"","digests":{"md5":"b95ed5d73a9a0e316de5a702efcd055f","sha256":"dd04265d390db326a60de73c24e50468edb7048198d43bb2a5fa74525e35d294"},"downloads":-1,"filename":"distribute-0.6.2.tar.gz","has_sig":false,"md5_digest":"b95ed5d73a9a0e316de5a702efcd055f","packagetype":"sdist","python_version":"source","requires_python":null,"size":518316,"upload_time":"2011-09-22T18:28:25","upload_time_iso_8601":"2011-09-22T18:28:25.043336Z","url":"https://files.pythonhosted.org/packages/c6/c0/e422bfe70ea4c087a3a4b10d9ca249196394fd7c7bd97d37f1c30e184cbf/distribute-0.6.2.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"75b312e41e179b70bb30296febe5010e","sha256":"5bd8ebc58dea3659ded73f1b8fd070b09e6e22acb1b5745686c743e2782d53ee"},"downloads":-1,"filename":"distribute-0.6.2.zip","has_sig":false,"md5_digest":"75b312e41e179b70bb30296febe5010e","packagetype":"sdist","python_version":"source","requires_python":null,"size":549844,"upload_time":"2016-01-19T00:00:42","upload_time_iso_8601":"2016-01-19T00:00:42.244136Z","url":"https://files.pythonhosted.org/packages/88/59/82c73ff573b7ed1b7a831cd51f81cff351fa53514bcd1851e522deb2a9ec/distribute-0.6.2.zip","yanked":false,"yanked_reason":null}],"0.6.20":[{"comment_text":"","digests":{"md5":"1909dc5bbb89793860ff9a2a23457c64","sha256":"8314683ad7cadfeb5918ff0bf7d410782a0b7f1615173c72d761cc8b43f7520e"},"downloads":-1,"filename":"distribute-0.6.20.tar.gz","has_sig":false,"md5_digest":"1909dc5bbb89793860ff9a2a23457c64","packagetype":"sdist","python_version":"source","requires_python":null,"size":400030,"upload_time":"2011-09-22T18:33:51","upload_time_iso_8601":"2011-09-22T18:33:51.968879Z","url":"https://files.pythonhosted.org/packages/ff/1b/ea2ba1b02f2ed1f80d81db35335f14480648f1f0d20be3094dbf75ff68e1/distribute-0.6.20.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"026654e2620d213f66b24324ec2d8590","sha256":"c9975d1e6ec2c73fc84440586989bf62c29ea0f8c0cade30b8b840590deb6696"},"downloads":-1,"filename":"distribute-0.6.20.zip","has_sig":false,"md5_digest":"026654e2620d213f66b24324ec2d8590","packagetype":"sdist","python_version":"source","requires_python":null,"size":438601,"upload_time":"2016-01-19T00:03:39","upload_time_iso_8601":"2016-01-19T00:03:39.528282Z","url":"https://files.pythonhosted.org/packages/fd/38/c1df29e89485ed854db98cbf89cae131244ae5624da622425f59c2fc1b7a/distribute-0.6.20.zip","yanked":false,"yanked_reason":null}],"0.6.21":[{"comment_text":"","digests":{"md5":"f783444754861f9b33e9f4083bd97b60","sha256":"5701c39864ac17d17b66aceca4ea3c92a8b9ab63d593ac491a2455d3de3e53b9"},"downloads":-1,"filename":"distribute-0.6.21.tar.gz","has_sig":false,"md5_digest":"f783444754861f9b33e9f4083bd97b60","packagetype":"sdist","python_version":"source","requires_python":null,"size":400092,"upload_time":"2011-09-22T18:34:06","upload_time_iso_8601":"2011-09-22T18:34:06.809918Z","url":"https://files.pythonhosted.org/packages/77/b5/c12c3b72749402550bbfdbc7865c6e9fee3293379096305029ee8be34126/distribute-0.6.21.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"320dc5fd46fae3ece7555a0e6550edff","sha256":"66cfd8f068da36fa5fb932968ab0378fe5716a7bd7c84016273a160fb07fa3e3"},"downloads":-1,"filename":"distribute-0.6.21.zip","has_sig":false,"md5_digest":"320dc5fd46fae3ece7555a0e6550edff","packagetype":"sdist","python_version":"source","requires_python":null,"size":438657,"upload_time":"2016-01-19T00:03:46","upload_time_iso_8601":"2016-01-19T00:03:46.305648Z","url":"https://files.pythonhosted.org/packages/64/4d/2e651f25c2feda7bbde61ce8584055a41d3a4d38fd0a83a2ec1a0ed4662c/distribute-0.6.21.zip","yanked":false,"yanked_reason":null}],"0.6.24":[{"comment_text":"","digests":{"md5":"17722b22141aba8235787f79800cc452","sha256":"c61fde9f388c9600eb8ee54bd7168039c5fb74fa334138bc49cdf6a6c1341627"},"downloads":-1,"filename":"distribute-0.6.24.tar.gz","has_sig":false,"md5_digest":"17722b22141aba8235787f79800cc452","packagetype":"sdist","python_version":"source","requires_python":null,"size":620771,"upload_time":"2011-10-16T15:09:53","upload_time_iso_8601":"2011-10-16T15:09:53.185592Z","url":"https://files.pythonhosted.org/packages/8a/4f/49f801acde031de47223a7541763b2f5ccedf88cb001694b0d3570e9dc15/distribute-0.6.24.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d221d832a6504a263e3b392b3c4a09dd","sha256":"2f172188e1d50ed9f541b6317ba08e3028a1bdb286c55a1d36fedc717c0b4695"},"downloads":-1,"filename":"distribute-0.6.24.zip","has_sig":false,"md5_digest":"d221d832a6504a263e3b392b3c4a09dd","packagetype":"sdist","python_version":"source","requires_python":null,"size":660752,"upload_time":"2016-01-19T00:03:54","upload_time_iso_8601":"2016-01-19T00:03:54.506134Z","url":"https://files.pythonhosted.org/packages/af/1e/ebca61f90d9edb8088e5c4363a05279e572ac42ffae20229ce6af303cb8f/distribute-0.6.24.zip","yanked":false,"yanked_reason":null}],"0.6.25":[{"comment_text":"","digests":{"md5":"a690874b9964d958a3200485eb827b1d","sha256":"ed11ff44b68b8dd274f11d7d5ca1659620be0620fb7dc305b3d39b0742788c31"},"downloads":-1,"filename":"distribute-0.6.25.tar.gz","has_sig":false,"md5_digest":"a690874b9964d958a3200485eb827b1d","packagetype":"sdist","python_version":"source","requires_python":null,"size":629502,"upload_time":"2012-03-10T08:08:02","upload_time_iso_8601":"2012-03-10T08:08:02.117769Z","url":"https://files.pythonhosted.org/packages/60/63/3ed8905bef060a1654000d19d4d55ea56a87fb895bbad83d9c52cb024a50/distribute-0.6.25.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"ed5e0c4942f828fbd00790894756a555","sha256":"865a99ed213301c83396bc111c659ce6ffcd870417a6115d7e59271c74df1f2d"},"downloads":-1,"filename":"distribute-0.6.25.zip","has_sig":false,"md5_digest":"ed5e0c4942f828fbd00790894756a555","packagetype":"sdist","python_version":"source","requires_python":null,"size":671234,"upload_time":"2016-01-19T00:04:01","upload_time_iso_8601":"2016-01-19T00:04:01.531014Z","url":"https://files.pythonhosted.org/packages/2a/e5/a20bb4e1abdf71985e9a67d56136b973b41ea295ba3e756f47ad1c54953d/distribute-0.6.25.zip","yanked":false,"yanked_reason":null}],"0.6.26":[{"comment_text":"","digests":{"md5":"841f4262a70107f85260362f5def8206","sha256":"9c29c56dcbb0e88a12714071d0b64e1be2da805b650f9394e8c7c719b7675030"},"downloads":-1,"filename":"distribute-0.6.26.tar.gz","has_sig":false,"md5_digest":"841f4262a70107f85260362f5def8206","packagetype":"sdist","python_version":"source","requires_python":null,"size":621193,"upload_time":"2012-04-08T04:23:49","upload_time_iso_8601":"2012-04-08T04:23:49.904632Z","url":"https://files.pythonhosted.org/packages/03/08/16815ba1e7d7dc21289c0ea89bffea4c34cc4d10979d2f3f64837ee51087/distribute-0.6.26.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"399d086acc01d78a59537dc39a4da119","sha256":"2f3551943f8a18ece8948711a6340fafc2e57c29d921e1e3ec0caf78878ff343"},"downloads":-1,"filename":"distribute-0.6.26.zip","has_sig":false,"md5_digest":"399d086acc01d78a59537dc39a4da119","packagetype":"sdist","python_version":"source","requires_python":null,"size":661781,"upload_time":"2016-01-19T00:04:16","upload_time_iso_8601":"2016-01-19T00:04:16.549984Z","url":"https://files.pythonhosted.org/packages/2c/be/b67877f2b48db5bbcf7b5e131a69c401753c9af9b4968254ff8bfc9e1ca7/distribute-0.6.26.zip","yanked":false,"yanked_reason":null}],"0.6.27":[{"comment_text":"","digests":{"md5":"ecd75ea629fee6d59d26f88c39b2d291","sha256":"5d79e472ba49e5de17318a9c59b9adf5790ba6b186c6edc1657acd9afe55de00"},"downloads":-1,"filename":"distribute-0.6.27.tar.gz","has_sig":false,"md5_digest":"ecd75ea629fee6d59d26f88c39b2d291","packagetype":"sdist","python_version":"source","requires_python":null,"size":624016,"upload_time":"2012-05-18T21:46:16","upload_time_iso_8601":"2012-05-18T21:46:16.374366Z","url":"https://files.pythonhosted.org/packages/33/cd/b81641625955e7f13d3a02b13176f7cc7becf96da5607c3283d14e2fa0a6/distribute-0.6.27.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5dc46141f05eff0d85e46252028392fe","sha256":"fd98fb9a36237271809533334535c369fe78a689f22ceedf8d6778f3b05a19ff"},"downloads":-1,"filename":"distribute-0.6.27.zip","has_sig":false,"md5_digest":"5dc46141f05eff0d85e46252028392fe","packagetype":"sdist","python_version":"source","requires_python":null,"size":664472,"upload_time":"2016-01-19T00:04:25","upload_time_iso_8601":"2016-01-19T00:04:25.950475Z","url":"https://files.pythonhosted.org/packages/8c/ce/7e1d6c0bb82683b74960f09651de2a536bc7b48ac74b54675bfb79cc27e2/distribute-0.6.27.zip","yanked":false,"yanked_reason":null}],"0.6.28":[{"comment_text":"","digests":{"md5":"b400b532e33f78551e6847c1f5965e56","sha256":"a42e897551aeb7600708f4aa6a0c02acb4458613976234b7d4fad7ae841a8d63"},"downloads":-1,"filename":"distribute-0.6.28.tar.gz","has_sig":false,"md5_digest":"b400b532e33f78551e6847c1f5965e56","packagetype":"sdist","python_version":"source","requires_python":null,"size":627530,"upload_time":"2012-07-22T22:58:11","upload_time_iso_8601":"2012-07-22T22:58:11.324319Z","url":"https://files.pythonhosted.org/packages/2f/f5/0ac674dd39ea80db147230362cff5e9cbe3b1e893fde9aeab5d2f72da83c/distribute-0.6.28.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"63e53db83e439afe3e5ee07816fc2f6a","sha256":"d754b7b21be61816dfddbbda234b1039a7e4f5e921201cc7bfde2d2985ef72e4"},"downloads":-1,"filename":"distribute-0.6.28.zip","has_sig":false,"md5_digest":"63e53db83e439afe3e5ee07816fc2f6a","packagetype":"sdist","python_version":"source","requires_python":null,"size":669561,"upload_time":"2016-01-19T00:04:37","upload_time_iso_8601":"2016-01-19T00:04:37.462818Z","url":"https://files.pythonhosted.org/packages/cb/0e/a58066fc4059f5b0d7dafa484aac0fcf45180800059eaf69528857237f64/distribute-0.6.28.zip","yanked":false,"yanked_reason":null}],"0.6.29":[{"comment_text":"","digests":{"md5":"1aad767bfca8bebaccafee25f85696cf","sha256":"2d74ee0360907f87e7125fe847ba541866777a1bc5315b4578bda06a4604544d"},"downloads":-1,"filename":"distribute-0.6.29.tar.gz","has_sig":false,"md5_digest":"1aad767bfca8bebaccafee25f85696cf","packagetype":"sdist","python_version":"source","requires_python":null,"size":638051,"upload_time":"2012-10-20T07:59:56","upload_time_iso_8601":"2012-10-20T07:59:56.063891Z","url":"https://files.pythonhosted.org/packages/1d/72/fe1c1eb05445595be6b653d5b282d4687528d437d6f038bfb8e69f3afd01/distribute-0.6.29.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5a00307a5776cbc80a8d459a1b8f0c0f","sha256":"fe32fe888ea39e8f8efae20b5a47880b52b1647c2d9b7b3031d12e7461764327"},"downloads":-1,"filename":"distribute-0.6.29.zip","has_sig":false,"md5_digest":"5a00307a5776cbc80a8d459a1b8f0c0f","packagetype":"sdist","python_version":"source","requires_python":null,"size":680431,"upload_time":"2016-01-19T00:04:48","upload_time_iso_8601":"2016-01-19T00:04:48.181311Z","url":"https://files.pythonhosted.org/packages/a5/9f/54f0d4cf1a29308ea6b64c4cc8b3f5a3378fc51420c4d66e6b6485e628e9/distribute-0.6.29.zip","yanked":false,"yanked_reason":null}],"0.6.3":[{"comment_text":"","digests":{"md5":"9fee15948c9b508102b26d49653ebbec","sha256":"dc097ed5f75ed141cfe27c2c9718447b39c2c1d659bcca041302efb6384d4c41"},"downloads":-1,"filename":"distribute-0.6.3.tar.gz","has_sig":false,"md5_digest":"9fee15948c9b508102b26d49653ebbec","packagetype":"sdist","python_version":"source","requires_python":null,"size":518470,"upload_time":"2011-09-22T18:28:39","upload_time_iso_8601":"2011-09-22T18:28:39.754602Z","url":"https://files.pythonhosted.org/packages/81/a2/b6371ad2b865656293ad9d064b0bca6c32283a9acc35ec455b05d820da0f/distribute-0.6.3.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"f47d015f0a675158fa6cec3c29174cbb","sha256":"a121a30700cd2f6bb1613f71bd8a44de1fe434ca50f7b316b97d8a5b2b535914"},"downloads":-1,"filename":"distribute-0.6.3.zip","has_sig":false,"md5_digest":"f47d015f0a675158fa6cec3c29174cbb","packagetype":"sdist","python_version":"source","requires_python":null,"size":550047,"upload_time":"2016-01-19T00:00:48","upload_time_iso_8601":"2016-01-19T00:00:48.964130Z","url":"https://files.pythonhosted.org/packages/ac/c2/d271d54e5dd82d5727cac67bfe0b84ce508120082073a989943740008394/distribute-0.6.3.zip","yanked":false,"yanked_reason":null}],"0.6.30":[{"comment_text":"","digests":{"md5":"d239a2c7d40e126274dab3e2aa89d591","sha256":"7ff34c3a9a844ee881ff28efc5d1f74603b72e0a5235a9d6dc76e603149e8eab"},"downloads":-1,"filename":"distribute-0.6.30.tar.gz","has_sig":false,"md5_digest":"d239a2c7d40e126274dab3e2aa89d591","packagetype":"sdist","python_version":"source","requires_python":null,"size":638335,"upload_time":"2012-10-22T10:02:36","upload_time_iso_8601":"2012-10-22T10:02:36.332394Z","url":"https://files.pythonhosted.org/packages/d7/4b/a08384fdde2b86d0f88aa16df7b31326d90b7b3a9ff55acfa1c1c6b2c5be/distribute-0.6.30.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"b966ddad57596da71e580f115343f05f","sha256":"07a68008c9321369ea33136e9547bf330f1797764583226456e1511a32127527"},"downloads":-1,"filename":"distribute-0.6.30.zip","has_sig":false,"md5_digest":"b966ddad57596da71e580f115343f05f","packagetype":"sdist","python_version":"source","requires_python":null,"size":680582,"upload_time":"2016-01-19T00:04:55","upload_time_iso_8601":"2016-01-19T00:04:55.001883Z","url":"https://files.pythonhosted.org/packages/e7/23/507064c9ee19ecab8783248273473cff1291bce2411f51459eba5109551a/distribute-0.6.30.zip","yanked":false,"yanked_reason":null}],"0.6.31":[{"comment_text":"","digests":{"md5":"71e96d533b3b9041fcc6a9d9da34a8f4","sha256":"9716293effc8d68068ce41e287b6903cf355641d0642b44e69dd92e9699dcbcf"},"downloads":-1,"filename":"distribute-0.6.31.tar.gz","has_sig":false,"md5_digest":"71e96d533b3b9041fcc6a9d9da34a8f4","packagetype":"sdist","python_version":"source","requires_python":null,"size":643910,"upload_time":"2012-11-25T04:03:44","upload_time_iso_8601":"2012-11-25T04:03:44.865269Z","url":"https://files.pythonhosted.org/packages/e7/da/2e0f7670f9f7dbe440f5673b5b18e896d7b85b4303d4281925176a12e6bc/distribute-0.6.31.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"419e9c2108f2e22372a3358806328419","sha256":"c07d115808a76d0edb93842ac6e1015216990f21125c8f0120daeac22951a2d7"},"downloads":-1,"filename":"distribute-0.6.31.zip","has_sig":false,"md5_digest":"419e9c2108f2e22372a3358806328419","packagetype":"sdist","python_version":"source","requires_python":null,"size":686098,"upload_time":"2016-01-19T00:05:04","upload_time_iso_8601":"2016-01-19T00:05:04.312229Z","url":"https://files.pythonhosted.org/packages/73/51/21de5f4ae97310e2d34e60e7f3100929e9c461776599fb7ff527fb3ecb47/distribute-0.6.31.zip","yanked":false,"yanked_reason":null}],"0.6.32":[{"comment_text":"","digests":{"md5":"acb7a2da81e3612bfb1608abe4f0e568","sha256":"8970cd1e148b5d1fea9430584aea66c45ea22d80e0933393ec49ebc388f718df"},"downloads":-1,"filename":"distribute-0.6.32.tar.gz","has_sig":false,"md5_digest":"acb7a2da81e3612bfb1608abe4f0e568","packagetype":"sdist","python_version":"source","requires_python":null,"size":643362,"upload_time":"2012-11-26T17:18:26","upload_time_iso_8601":"2012-11-26T17:18:26.341106Z","url":"https://files.pythonhosted.org/packages/49/3f/d747add39a5fe4ceb910813c48d1c1564e40ab66f43ea41fd4ded884169a/distribute-0.6.32.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"e3d89425541c5e9a1018a4df04351685","sha256":"64b73cd34379eff02ef08c2c398677916f66b93ca5bb13f5f6a49e5031e58ad2"},"downloads":-1,"filename":"distribute-0.6.32.zip","has_sig":false,"md5_digest":"e3d89425541c5e9a1018a4df04351685","packagetype":"sdist","python_version":"source","requires_python":null,"size":685593,"upload_time":"2016-01-19T00:05:12","upload_time_iso_8601":"2016-01-19T00:05:12.306776Z","url":"https://files.pythonhosted.org/packages/8d/a6/f82b8038bf9bf36e6a565891c596bcdd5c55ff6cbb32c2e3becc6d94080b/distribute-0.6.32.zip","yanked":false,"yanked_reason":null}],"0.6.33":[{"comment_text":"","digests":{"md5":"9bc1cf2688590ffc1e20fd153babf239","sha256":"52d9bf08ddd7598fea591434188577e59f06cbaa0fbd9cf31dd09b455c18433a"},"downloads":-1,"filename":"distribute-0.6.33.tar.gz","has_sig":false,"md5_digest":"9bc1cf2688590ffc1e20fd153babf239","packagetype":"sdist","python_version":"source","requires_python":null,"size":644203,"upload_time":"2012-12-29T22:10:17","upload_time_iso_8601":"2012-12-29T22:10:17.413199Z","url":"https://files.pythonhosted.org/packages/81/a1/cc2f93e485bda7132136ffb1874068a20e6e0aad77d6063b5a17efc2383a/distribute-0.6.33.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"cf55172e00fc2e080646fed166551d68","sha256":"da0bd1a5f89549e324ad24f5050e3a992a4ba676bf7fa4abd0e3eaa896079990"},"downloads":-1,"filename":"distribute-0.6.33.zip","has_sig":false,"md5_digest":"cf55172e00fc2e080646fed166551d68","packagetype":"sdist","python_version":"source","requires_python":null,"size":686604,"upload_time":"2016-01-19T00:05:22","upload_time_iso_8601":"2016-01-19T00:05:22.988384Z","url":"https://files.pythonhosted.org/packages/2f/f9/ed567c3db5635145b672e6e6b1021e64936028dee9460e520025d5185f80/distribute-0.6.33.zip","yanked":false,"yanked_reason":null}],"0.6.34":[{"comment_text":"","digests":{"md5":"4576ab843a6db5100fb22a72deadf56d","sha256":"1a82a50f448fd963c1efade437b9ace3c47bfdd9b168fcdba7fca140df4b364e"},"downloads":-1,"filename":"distribute-0.6.34.tar.gz","has_sig":false,"md5_digest":"4576ab843a6db5100fb22a72deadf56d","packagetype":"sdist","python_version":"source","requires_python":null,"size":644358,"upload_time":"2012-12-31T15:27:12","upload_time_iso_8601":"2012-12-31T15:27:12.470300Z","url":"https://files.pythonhosted.org/packages/a2/f0/0d76f4f1e677509b5c09de2e86b7e98925730321779519eba924fa1b5199/distribute-0.6.34.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"b9729f289723f8d100e599769a5fc034","sha256":"8ffe1be0cde1d3d3a00823ff654d6c04b27d795693d59761bc7d5f6ea3de3f95"},"downloads":-1,"filename":"distribute-0.6.34.zip","has_sig":false,"md5_digest":"b9729f289723f8d100e599769a5fc034","packagetype":"sdist","python_version":"source","requires_python":null,"size":686709,"upload_time":"2016-01-19T00:05:31","upload_time_iso_8601":"2016-01-19T00:05:31.750692Z","url":"https://files.pythonhosted.org/packages/f6/29/2e1d82c8859b0330be3aa6cae1040587768506c153742ef7b8feeb4e09cd/distribute-0.6.34.zip","yanked":false,"yanked_reason":null}],"0.6.35":[{"comment_text":"","digests":{"md5":"e55298c7e3a233df1a47a4881a0c9800","sha256":"7ee7ce926e15b0066c6d241e1ff271c30ff99b9ec7648699263d36967409e804"},"downloads":-1,"filename":"distribute-0.6.35.tar.gz","has_sig":false,"md5_digest":"e55298c7e3a233df1a47a4881a0c9800","packagetype":"sdist","python_version":"source","requires_python":null,"size":644308,"upload_time":"2013-02-16T08:11:57","upload_time_iso_8601":"2013-02-16T08:11:57.777425Z","url":"https://files.pythonhosted.org/packages/e1/15/e61fd2df870382666ca800908b686932a3e1f603a9e80e93c2da7c71b2f0/distribute-0.6.35.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"ff7404870d66b74af01bfde8f182f045","sha256":"2c0a4ff54b51c2b6679400f8cbbb766e2d236eb9886acf526691a7c0cce368fe"},"downloads":-1,"filename":"distribute-0.6.35.zip","has_sig":false,"md5_digest":"ff7404870d66b74af01bfde8f182f045","packagetype":"sdist","python_version":"source","requires_python":null,"size":686580,"upload_time":"2016-01-19T00:05:39","upload_time_iso_8601":"2016-01-19T00:05:39.637079Z","url":"https://files.pythonhosted.org/packages/54/23/cdf26d55a4d5af062c49ea3d524729270452e23b726b007f11608539f3ae/distribute-0.6.35.zip","yanked":false,"yanked_reason":null}],"0.6.36":[{"comment_text":"","digests":{"md5":"a923385de72dcdca68cd4ac2b9dc1148","sha256":"2474f9d0706b476ce0e139195cc35b360adb665df968d74d3bab022003d54bc2"},"downloads":-1,"filename":"distribute-0.6.36.tar.gz","has_sig":false,"md5_digest":"a923385de72dcdca68cd4ac2b9dc1148","packagetype":"sdist","python_version":"source","requires_python":null,"size":644713,"upload_time":"2013-04-05T21:14:30","upload_time_iso_8601":"2013-04-05T21:14:30.530516Z","url":"https://files.pythonhosted.org/packages/52/ae/96f7e82c38a5517dae71ae244e3cdcfadfdb3895987a1591b2d19d6f7a9b/distribute-0.6.36.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"bae51e44b82e7d9eca568caaaa997414","sha256":"32b66b45daaf7a8e68895dbfb5457cf8d76b18ed14f0e92123ffdb4f56e70c65"},"downloads":-1,"filename":"distribute-0.6.36.zip","has_sig":false,"md5_digest":"bae51e44b82e7d9eca568caaaa997414","packagetype":"sdist","python_version":"source","requires_python":null,"size":687072,"upload_time":"2016-01-19T00:05:46","upload_time_iso_8601":"2016-01-19T00:05:46.646007Z","url":"https://files.pythonhosted.org/packages/b7/18/1faa307038d6a25a1e05ba1adfe9c67217e456bbacef5a9f0cc567da4ef3/distribute-0.6.36.zip","yanked":false,"yanked_reason":null}],"0.6.37":[{"comment_text":"","digests":{"md5":"be693b2b1888f2eae639dd0becfb2e84","sha256":"5ad9d50eaf871ddda55f68165924124ad81bfd19fc4f0730f0a3a8ca190d58c6"},"downloads":-1,"filename":"distribute-0.6.37.tar.gz","has_sig":false,"md5_digest":"be693b2b1888f2eae639dd0becfb2e84","packagetype":"sdist","python_version":"source","requires_python":null,"size":645766,"upload_time":"2013-05-05T02:17:02","upload_time_iso_8601":"2013-05-05T02:17:02.993913Z","url":"https://files.pythonhosted.org/packages/f3/36/3878909df1720f45ee0b9902e85a24db14542bde438523de10192421e582/distribute-0.6.37.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"80981f866b8ec1d751fb3284af8afb81","sha256":"d6670be471d8158ceff28cfdfa5af77aeae38d0618c5eb0d8710eb8798a1372d"},"downloads":-1,"filename":"distribute-0.6.37.zip","has_sig":false,"md5_digest":"80981f866b8ec1d751fb3284af8afb81","packagetype":"sdist","python_version":"source","requires_python":null,"size":688301,"upload_time":"2016-01-19T00:05:54","upload_time_iso_8601":"2016-01-19T00:05:54.063725Z","url":"https://files.pythonhosted.org/packages/a9/1d/f8b2d90b9deb6072cd6af885b0d006bea3cc0749cbb45b6d6da9b4a8b682/distribute-0.6.37.zip","yanked":false,"yanked_reason":null}],"0.6.38":[{"comment_text":"","digests":{"md5":"a0bc8fdb8b7b36234dcb1ff3d1fc702d","sha256":"e4805005a1983610aa86bf3affd034631163cf9f3caa7f958ae2705b26658229"},"downloads":-1,"filename":"distribute-0.6.38.tar.gz","has_sig":false,"md5_digest":"a0bc8fdb8b7b36234dcb1ff3d1fc702d","packagetype":"sdist","python_version":"source","requires_python":null,"size":645857,"upload_time":"2013-05-05T12:45:30","upload_time_iso_8601":"2013-05-05T12:45:30.555031Z","url":"https://files.pythonhosted.org/packages/44/24/f43cbc3b122aeb27405b4cb4e294535c1bab4c60c86d4846ab5657bfd528/distribute-0.6.38.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"c0ef20833051c0b7e30bbc032960af14","sha256":"122d45874a4cda46273c22031dc937f07eb850a9b882996261521427a8e8f1c2"},"downloads":-1,"filename":"distribute-0.6.38.zip","has_sig":false,"md5_digest":"c0ef20833051c0b7e30bbc032960af14","packagetype":"sdist","python_version":"source","requires_python":null,"size":688398,"upload_time":"2016-01-19T00:06:02","upload_time_iso_8601":"2016-01-19T00:06:02.238436Z","url":"https://files.pythonhosted.org/packages/56/26/745b893435e3c34fa39ca40bec216b1eef82dfef2df2e155f8b56b6603d0/distribute-0.6.38.zip","yanked":false,"yanked_reason":null}],"0.6.39":[{"comment_text":"","digests":{"md5":"b7569b356600d3347828998d55e76fea","sha256":"77d0ca76247ab9217212a0c5c3062cac4002cdeb9e02ce6b39e8a3f5b7c296b4"},"downloads":-1,"filename":"distribute-0.6.39.tar.gz","has_sig":false,"md5_digest":"b7569b356600d3347828998d55e76fea","packagetype":"sdist","python_version":"source","requires_python":null,"size":648136,"upload_time":"2013-05-12T18:32:24","upload_time_iso_8601":"2013-05-12T18:32:24.289851Z","url":"https://files.pythonhosted.org/packages/9a/6c/11f4686ac4305d23b43be59b4ce2cc2c10e00c639472300b13893a754bc7/distribute-0.6.39.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"621f7de8b41ce7a370bc7e996779f901","sha256":"132a373c6ee22054011c9d7a869c6f3e7cfc95b06168d2a04416357b331a2def"},"downloads":-1,"filename":"distribute-0.6.39.zip","has_sig":false,"md5_digest":"621f7de8b41ce7a370bc7e996779f901","packagetype":"sdist","python_version":"source","requires_python":null,"size":696200,"upload_time":"2016-01-19T00:06:17","upload_time_iso_8601":"2016-01-19T00:06:17.488833Z","url":"https://files.pythonhosted.org/packages/f8/4e/3ca573ae5d3baf4e44fa98e5b9ec3c96bf09c869fd8e4a1ab1b47c7c6f32/distribute-0.6.39.zip","yanked":false,"yanked_reason":null}],"0.6.4":[{"comment_text":"","digests":{"md5":"d3f8a22488a798fafc151b906b9bde1c","sha256":"12945da48fb1857c0ef27ba351fa76a1975c11b0d5bc4832895282fcdc4352a2"},"downloads":-1,"filename":"distribute-0.6.4.tar.gz","has_sig":false,"md5_digest":"d3f8a22488a798fafc151b906b9bde1c","packagetype":"sdist","python_version":"source","requires_python":null,"size":523079,"upload_time":"2011-09-22T18:29:00","upload_time_iso_8601":"2011-09-22T18:29:00.091781Z","url":"https://files.pythonhosted.org/packages/dc/b6/95cf18e73df8fc85ddad57ba3b49ab40104267c26edddc28bb5075b4476f/distribute-0.6.4.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"5e70cd25c41c9be559d887731020c2be","sha256":"ce60933f17febe26528b62609b922db4301d4c8d25f02fac155cae339dd1eb12"},"downloads":-1,"filename":"distribute-0.6.4.zip","has_sig":false,"md5_digest":"5e70cd25c41c9be559d887731020c2be","packagetype":"sdist","python_version":"source","requires_python":null,"size":556449,"upload_time":"2016-01-19T00:00:58","upload_time_iso_8601":"2016-01-19T00:00:58.975608Z","url":"https://files.pythonhosted.org/packages/bd/98/111ba95670f9786ba7ef9bb600f250c927335a8cc4033cd54e56762e2979/distribute-0.6.4.zip","yanked":false,"yanked_reason":null}],"0.6.40":[{"comment_text":"","digests":{"md5":"7a2dd4033999af22fe9591fa84f3e599","sha256":"5e06a3097f4150b26e4de0d4f57dbe7425ac3645ce7a337abffab8489bc80daa"},"downloads":-1,"filename":"distribute-0.6.40.tar.gz","has_sig":false,"md5_digest":"7a2dd4033999af22fe9591fa84f3e599","packagetype":"sdist","python_version":"source","requires_python":null,"size":718084,"upload_time":"2013-05-14T08:13:13","upload_time_iso_8601":"2013-05-14T08:13:13.606927Z","url":"https://files.pythonhosted.org/packages/bc/a4/df58ee742593190e4c613f15f1457be7e8408d5c9432fb41e061e0e785f0/distribute-0.6.40.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"254bc9516b8ac4b8c50b32b46d639be0","sha256":"6e1454702a1e2311cf6654b702828a0eecf73afea22e02aefde05c92f15e7280"},"downloads":-1,"filename":"distribute-0.6.40.zip","has_sig":false,"md5_digest":"254bc9516b8ac4b8c50b32b46d639be0","packagetype":"sdist","python_version":"source","requires_python":null,"size":768554,"upload_time":"2016-01-19T00:06:26","upload_time_iso_8601":"2016-01-19T00:06:26.325985Z","url":"https://files.pythonhosted.org/packages/4c/a8/9306aee26830e151e78bbfa44f0fa6d03e79c2ee76270840f05f89171e7f/distribute-0.6.40.zip","yanked":false,"yanked_reason":null}],"0.6.41":[{"comment_text":"","digests":{"md5":"a27bb04f85fd966a0b46b616dfe8b472","sha256":"7ca6e0ca3c76be3c37a9340170e531045700a5db778c5849066e24622e7f9f4b"},"downloads":-1,"filename":"distribute-0.6.41.tar.gz","has_sig":false,"md5_digest":"a27bb04f85fd966a0b46b616dfe8b472","packagetype":"sdist","python_version":"source","requires_python":null,"size":722643,"upload_time":"2013-05-24T13:58:39","upload_time_iso_8601":"2013-05-24T13:58:39.744087Z","url":"https://files.pythonhosted.org/packages/2d/d7/8a90509f92b3fcf9b0b4ea35e5f520b073814ce15d3294360f85761e3f88/distribute-0.6.41.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d2c3de0d64ab9c36047d3cd095b6ba81","sha256":"41a6c67a5769dd522420534126af8970e9f662f22526b62fe8fed54d426f130a"},"downloads":-1,"filename":"distribute-0.6.41.zip","has_sig":false,"md5_digest":"d2c3de0d64ab9c36047d3cd095b6ba81","packagetype":"sdist","python_version":"source","requires_python":null,"size":770140,"upload_time":"2016-01-19T00:06:36","upload_time_iso_8601":"2016-01-19T00:06:36.101065Z","url":"https://files.pythonhosted.org/packages/9b/df/e30c4a713d145a3b03c4c55abb2bba44026d52a5f30deae7cd0705d6c638/distribute-0.6.41.zip","yanked":false,"yanked_reason":null}],"0.6.42":[{"comment_text":"","digests":{"md5":"53642a6e4a08d99309f1f695b02386bc","sha256":"097e6b62154966b2831f8d5d52a4106708d41f17e0074dc95b456516305b4508"},"downloads":-1,"filename":"distribute-0.6.42.tar.gz","has_sig":false,"md5_digest":"53642a6e4a08d99309f1f695b02386bc","packagetype":"sdist","python_version":"source","requires_python":null,"size":723459,"upload_time":"2013-05-24T20:04:05","upload_time_iso_8601":"2013-05-24T20:04:05.685338Z","url":"https://files.pythonhosted.org/packages/c8/52/c87242dc7f211b0ad4513772a77e9f917933eb3e80c63c3fe5a887c9f62d/distribute-0.6.42.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d0424741f5aceea13a4e2d11fbeff05d","sha256":"881896b5d895819d6bb894de85a7e6cbd90b3d1f3894441d09d805c4c069ef3c"},"downloads":-1,"filename":"distribute-0.6.42.zip","has_sig":false,"md5_digest":"d0424741f5aceea13a4e2d11fbeff05d","packagetype":"sdist","python_version":"source","requires_python":null,"size":771266,"upload_time":"2016-01-19T00:06:46","upload_time_iso_8601":"2016-01-19T00:06:46.548560Z","url":"https://files.pythonhosted.org/packages/f6/20/ea4efea35549719673ca24987de97339961409f00f26ee04025fd032f2da/distribute-0.6.42.zip","yanked":false,"yanked_reason":null}],"0.6.43":[{"comment_text":"","digests":{"md5":"a216a46dc9bec5835fa3c6041f1c77c2","sha256":"6f9de4b0dc8120180141dd7980057eb7968dad04457ff294efae2fe6e9376fd3"},"downloads":-1,"filename":"distribute-0.6.43.tar.gz","has_sig":false,"md5_digest":"a216a46dc9bec5835fa3c6041f1c77c2","packagetype":"sdist","python_version":"source","requires_python":null,"size":723082,"upload_time":"2013-05-25T00:43:35","upload_time_iso_8601":"2013-05-25T00:43:35.796135Z","url":"https://files.pythonhosted.org/packages/71/df/0fa0a5a64ac62c1fc8f94130795c0f8841a0103c431ea30f0450a4af3b8d/distribute-0.6.43.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"b1451c8c9671fa1751bc4dcefd7a8a65","sha256":"a8a92e9fb14367cea2f2bc4723b3710d7df6be3d0c12c5ae0253f65845ccac5e"},"downloads":-1,"filename":"distribute-0.6.43.zip","has_sig":false,"md5_digest":"b1451c8c9671fa1751bc4dcefd7a8a65","packagetype":"sdist","python_version":"source","requires_python":null,"size":771503,"upload_time":"2016-01-19T00:06:55","upload_time_iso_8601":"2016-01-19T00:06:55.679517Z","url":"https://files.pythonhosted.org/packages/8b/04/0bde724600729d8a2c5df48b04a90c98f5cd366a249629cb54541648df3e/distribute-0.6.43.zip","yanked":false,"yanked_reason":null}],"0.6.44":[{"comment_text":"","digests":{"md5":"3abed5dfa036e6d8bfdbb4ccd272d553","sha256":"1a7de57e6d95c08836ba644b012ace19515824567647e81a3c105b35b6982805"},"downloads":-1,"filename":"distribute-0.6.44.tar.gz","has_sig":false,"md5_digest":"3abed5dfa036e6d8bfdbb4ccd272d553","packagetype":"sdist","python_version":"source","requires_python":null,"size":723244,"upload_time":"2013-05-28T15:19:49","upload_time_iso_8601":"2013-05-28T15:19:49.868834Z","url":"https://files.pythonhosted.org/packages/94/f1/53fee5ab8ee3bd360e30188be3a0f0e277e46c6e1927085985ae37e0cfd1/distribute-0.6.44.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"0ffc600410808e907b57744ad87129fa","sha256":"75dc4e98662c6d0cdb6752d0344c9aab1835284c58188eb374115c17221cbedd"},"downloads":-1,"filename":"distribute-0.6.44.zip","has_sig":false,"md5_digest":"0ffc600410808e907b57744ad87129fa","packagetype":"sdist","python_version":"source","requires_python":null,"size":771662,"upload_time":"2016-01-19T00:07:06","upload_time_iso_8601":"2016-01-19T00:07:06.937062Z","url":"https://files.pythonhosted.org/packages/a0/0b/29fa375b60678ead8d63c33e66001ea4625eca089ddeddc1a998c13dc97d/distribute-0.6.44.zip","yanked":false,"yanked_reason":null}],"0.6.45":[{"comment_text":"","digests":{"md5":"8953f2c07e6700dabf2ec150129b8c31","sha256":"7c0b21329bbd087410ce4be4bf64058c1085a27e5ae5886a52950ff46ab9eb66"},"downloads":-1,"filename":"distribute-0.6.45.tar.gz","has_sig":false,"md5_digest":"8953f2c07e6700dabf2ec150129b8c31","packagetype":"sdist","python_version":"source","requires_python":null,"size":723456,"upload_time":"2013-05-29T11:36:49","upload_time_iso_8601":"2013-05-29T11:36:49.203494Z","url":"https://files.pythonhosted.org/packages/ae/e2/71b808010e2cd5e627706344d0d65df2e2d31d2b52d259f0bcb7b1827bf4/distribute-0.6.45.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"f1d411325db169b5c47b0c6f285c758d","sha256":"d5e510cd44531aed207ea039455a486f2d8291dbf4b0bc7c57deef691586dd85"},"downloads":-1,"filename":"distribute-0.6.45.zip","has_sig":false,"md5_digest":"f1d411325db169b5c47b0c6f285c758d","packagetype":"sdist","python_version":"source","requires_python":null,"size":771943,"upload_time":"2016-01-19T00:07:13","upload_time_iso_8601":"2016-01-19T00:07:13.796507Z","url":"https://files.pythonhosted.org/packages/38/46/63a32f9ccc8724a5e36b6bcde2c2429ead90edbc646f7481a5357a3e1d1c/distribute-0.6.45.zip","yanked":false,"yanked_reason":null}],"0.6.46":[{"comment_text":"","digests":{"md5":"73d21ec34a683af697ceeb5199bf4bef","sha256":"6eed4e5ec5369d91e90c3d16713728b619423b8b02c2526cefb0602c086236c7"},"downloads":-1,"filename":"distribute-0.6.46.tar.gz","has_sig":false,"md5_digest":"73d21ec34a683af697ceeb5199bf4bef","packagetype":"sdist","python_version":"source","requires_python":null,"size":723786,"upload_time":"2013-06-29T14:26:43","upload_time_iso_8601":"2013-06-29T14:26:43.310381Z","url":"https://files.pythonhosted.org/packages/e2/af/422a5b1ebfe6d8f54dcd1d846eaed1c71c85ebaa87d7ed8c22bcc974be99/distribute-0.6.46.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"d9586bbfc029154d4cc1e087d2de2bdd","sha256":"08feb3fb8dc22cd610ecc9674eb014e91bc89fcc6e7156443dbafb6b49d96477"},"downloads":-1,"filename":"distribute-0.6.46.zip","has_sig":false,"md5_digest":"d9586bbfc029154d4cc1e087d2de2bdd","packagetype":"sdist","python_version":"source","requires_python":null,"size":771747,"upload_time":"2016-01-19T00:07:22","upload_time_iso_8601":"2016-01-19T00:07:22.272767Z","url":"https://files.pythonhosted.org/packages/06/b9/74d0d48befa2bd9c32e06b5e69cda4ca5c8293ccb76ad862eaca1657518d/distribute-0.6.46.zip","yanked":false,"yanked_reason":null}],"0.6.47":[{"comment_text":"","digests":{"md5":"bfa191de8c0578eb65212436b73f72c2","sha256":"89bb51db38a69bdd6099a8b487f8365d45e786596076f3f9fe17caa07a846774"},"downloads":-1,"filename":"distribute-0.6.47.tar.gz","has_sig":false,"md5_digest":"bfa191de8c0578eb65212436b73f72c2","packagetype":"sdist","python_version":"source","requires_python":null,"size":723849,"upload_time":"2013-07-02T12:27:25","upload_time_iso_8601":"2013-07-02T12:27:25.573448Z","url":"https://files.pythonhosted.org/packages/b4/f8/92222dccdb72d3b6f43b18ebcb93aa7f46849c44d23a5e98efe53c5eff55/distribute-0.6.47.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"554f9aa8efe56f1d94a607c0ff27d74e","sha256":"22d4920651da97ce023c3ac22b32464b9c6dd2d8d22d447534cfaf41fb2faac0"},"downloads":-1,"filename":"distribute-0.6.47.zip","has_sig":false,"md5_digest":"554f9aa8efe56f1d94a607c0ff27d74e","packagetype":"sdist","python_version":"source","requires_python":null,"size":771853,"upload_time":"2016-01-19T00:07:34","upload_time_iso_8601":"2016-01-19T00:07:34.555378Z","url":"https://files.pythonhosted.org/packages/5d/5f/3938baf3c82179d1850a9ea2c5939377a81d644acccb094d64d1e1118f75/distribute-0.6.47.zip","yanked":false,"yanked_reason":null}],"0.6.48":[{"comment_text":"","digests":{"md5":"8043b862d69b7c553c8899276babd602","sha256":"3b88a8b7eb585718f4647360f2ed80a2eed3c544ec59c641dea4ff29310cd6bc"},"downloads":-1,"filename":"distribute-0.6.48.tar.gz","has_sig":false,"md5_digest":"8043b862d69b7c553c8899276babd602","packagetype":"sdist","python_version":"source","requires_python":null,"size":723799,"upload_time":"2013-07-02T15:42:40","upload_time_iso_8601":"2013-07-02T15:42:40.563075Z","url":"https://files.pythonhosted.org/packages/80/c0/c97660e5e4b13d999d150b1f55d88e3bf7e103a8eebd9d24ef7a2307741c/distribute-0.6.48.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"1da627bccbb1b51b1aee94b3e64de341","sha256":"89d9f1e9c8f9ff3c96c1292f5e4511b3b30462caabafcf7cc1ee7264c6df755f"},"downloads":-1,"filename":"distribute-0.6.48.zip","has_sig":false,"md5_digest":"1da627bccbb1b51b1aee94b3e64de341","packagetype":"sdist","python_version":"source","requires_python":null,"size":771897,"upload_time":"2016-01-19T00:07:47","upload_time_iso_8601":"2016-01-19T00:07:47.855562Z","url":"https://files.pythonhosted.org/packages/8e/5d/a47e0d4891cd8aff83e331440732972661541320e92dbb05e38dd17c29e2/distribute-0.6.48.zip","yanked":false,"yanked_reason":null}],"0.6.49":[{"comment_text":"","digests":{"md5":"89e68df89faf1966bcbd99a0033fbf8e","sha256":"b877a9f155fc13cbf409d4fdbf709d25c24f28dfe3531ecb419eb069bd80e878"},"downloads":-1,"filename":"distribute-0.6.49.tar.gz","has_sig":false,"md5_digest":"89e68df89faf1966bcbd99a0033fbf8e","packagetype":"sdist","python_version":"source","requires_python":null,"size":724005,"upload_time":"2013-07-05T01:59:40","upload_time_iso_8601":"2013-07-05T01:59:40.819770Z","url":"https://files.pythonhosted.org/packages/f3/2b/e97c01487b7636ba3fcff5e73db995c66c524d54d0907d238311524f67c8/distribute-0.6.49.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"2b65b6881f064e9f54d427c8e1f555e7","sha256":"2e6ef91d00784f9680b413e2a2f4d7c1456927cd9a34ebce99448cd4fbf6fbb8"},"downloads":-1,"filename":"distribute-0.6.49.zip","has_sig":false,"md5_digest":"2b65b6881f064e9f54d427c8e1f555e7","packagetype":"sdist","python_version":"source","requires_python":null,"size":772156,"upload_time":"2016-01-19T00:08:08","upload_time_iso_8601":"2016-01-19T00:08:08.054628Z","url":"https://files.pythonhosted.org/packages/67/58/fb1902ce3aee9d868648bb1bb44ca6fdeac04726a6053741bf0485390ec4/distribute-0.6.49.zip","yanked":false,"yanked_reason":null}],"0.6.5":[{"comment_text":"","digests":{"md5":"2545856b22598749581ef8647d352e58","sha256":"e97fea8207f09ef729f21ae2be49a0692d5e0f169945ee89113dbcc0efcd8c4d"},"downloads":-1,"filename":"distribute-0.6.5.tar.gz","has_sig":false,"md5_digest":"2545856b22598749581ef8647d352e58","packagetype":"sdist","python_version":"source","requires_python":null,"size":526528,"upload_time":"2011-09-22T18:29:11","upload_time_iso_8601":"2011-09-22T18:29:11.597775Z","url":"https://files.pythonhosted.org/packages/2a/cd/71002045b4ba17c96e5965459216962bf0a1d2e11262b0831e0abb021d23/distribute-0.6.5.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"be0dad9bd3619dbe818a70e786f41cdc","sha256":"659461027e71c0e501c033a6dd07fd3eda2e68bf4211af8c38ac3062d5f5c6a4"},"downloads":-1,"filename":"distribute-0.6.5.zip","has_sig":false,"md5_digest":"be0dad9bd3619dbe818a70e786f41cdc","packagetype":"sdist","python_version":"source","requires_python":null,"size":561022,"upload_time":"2016-01-19T00:01:15","upload_time_iso_8601":"2016-01-19T00:01:15.341067Z","url":"https://files.pythonhosted.org/packages/b1/de/0332e445bdbb7022852d5a2435c064c167fc4943b76383ad4e30a9d7ca07/distribute-0.6.5.zip","yanked":false,"yanked_reason":null}],"0.6.6":[{"comment_text":"","digests":{"md5":"b7ba298108026fd71f87874be5256d20","sha256":"ca9fcf7477d655f4e72ddbe1a15d1aacb066462e77ff5af0654eeda2c777c922"},"downloads":-1,"filename":"distribute-0.6.6.tar.gz","has_sig":false,"md5_digest":"b7ba298108026fd71f87874be5256d20","packagetype":"sdist","python_version":"source","requires_python":null,"size":526682,"upload_time":"2011-09-22T18:29:28","upload_time_iso_8601":"2011-09-22T18:29:28.860840Z","url":"https://files.pythonhosted.org/packages/f0/f3/f020debdcd692437d235a93194c649273d6a46d815254c366cbf4ed9e029/distribute-0.6.6.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"e10dbc789c34d89e1d57901915e43645","sha256":"b6c545bf6d1ac79ad73ff8d3fb8a6e9cf25bd7393f1cd93d617128cef3d08ecd"},"downloads":-1,"filename":"distribute-0.6.6.zip","has_sig":false,"md5_digest":"e10dbc789c34d89e1d57901915e43645","packagetype":"sdist","python_version":"source","requires_python":null,"size":561258,"upload_time":"2016-01-19T00:01:24","upload_time_iso_8601":"2016-01-19T00:01:24.486155Z","url":"https://files.pythonhosted.org/packages/dd/34/01ceefc58caf5e1b4be0fc917b539bf456c78b77005d201a10306372dddf/distribute-0.6.6.zip","yanked":false,"yanked_reason":null}],"0.6.7":[{"comment_text":"","digests":{"md5":"32f1e942d0186605756e386171c92429","sha256":"0ad2916d5821a2b8adecee3bd2ff03399f7ebe69a7eab2341528089c1e4b77ca"},"downloads":-1,"filename":"distribute-0.6.7.tar.gz","has_sig":false,"md5_digest":"32f1e942d0186605756e386171c92429","packagetype":"sdist","python_version":"source","requires_python":null,"size":381232,"upload_time":"2011-09-22T18:29:40","upload_time_iso_8601":"2011-09-22T18:29:40.157129Z","url":"https://files.pythonhosted.org/packages/c9/db/1c44a07d77ea84886f666a6201db043e979f94c990e6e796e0cf4d57c63d/distribute-0.6.7.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"df9da54c7515f37bbb988c0d74d3cdf2","sha256":"c8ea44c881a0a0c2f29e506800abfa236ea0704dc565ce19c436fd7912952025"},"downloads":-1,"filename":"distribute-0.6.7.zip","has_sig":false,"md5_digest":"df9da54c7515f37bbb988c0d74d3cdf2","packagetype":"sdist","python_version":"source","requires_python":null,"size":420341,"upload_time":"2016-01-19T00:01:32","upload_time_iso_8601":"2016-01-19T00:01:32.026655Z","url":"https://files.pythonhosted.org/packages/0d/7e/82122b2b6371655491ec668737daf5b278efaab082de13adbd100207f6b9/distribute-0.6.7.zip","yanked":false,"yanked_reason":null}],"0.6.8":[{"comment_text":"","digests":{"md5":"f8caf091fbc2d581274bca0c87ec5ea8","sha256":"f75b3a011be311186d1bddfb3cc1767537eb35332fbf1fc19309dd36ebc737bf"},"downloads":-1,"filename":"distribute-0.6.8.tar.gz","has_sig":false,"md5_digest":"f8caf091fbc2d581274bca0c87ec5ea8","packagetype":"sdist","python_version":"source","requires_python":null,"size":381421,"upload_time":"2011-09-22T18:30:01","upload_time_iso_8601":"2011-09-22T18:30:01.075794Z","url":"https://files.pythonhosted.org/packages/f3/ae/7a31bd7a09548f3fc57408837b4a183ff48e60085b5d0f08026e375ebbd0/distribute-0.6.8.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"8da017dc10e48e51310c235f5584b126","sha256":"781a6f1ba19d85d7067b919a6b31b8fff6d0f513581f7586eac60480be0277ce"},"downloads":-1,"filename":"distribute-0.6.8.zip","has_sig":false,"md5_digest":"8da017dc10e48e51310c235f5584b126","packagetype":"sdist","python_version":"source","requires_python":null,"size":420599,"upload_time":"2016-01-19T00:01:38","upload_time_iso_8601":"2016-01-19T00:01:38.872052Z","url":"https://files.pythonhosted.org/packages/f2/ea/f708dba54ba7ad36d6b032554cc45d2ded60df8f806387aff7ea89dfa028/distribute-0.6.8.zip","yanked":false,"yanked_reason":null}],"0.6.9":[{"comment_text":"","digests":{"md5":"2e8bea1ef6f7b972387715cc465d56a9","sha256":"aa59755d040a466fc0bb5b15f5a7ae711994a39723ab23a3b75fa4dcc4986543"},"downloads":-1,"filename":"distribute-0.6.9.tar.gz","has_sig":false,"md5_digest":"2e8bea1ef6f7b972387715cc465d56a9","packagetype":"sdist","python_version":"source","requires_python":null,"size":389380,"upload_time":"2011-09-22T18:30:14","upload_time_iso_8601":"2011-09-22T18:30:14.580650Z","url":"https://files.pythonhosted.org/packages/a9/a1/06b34f4fa52e35059f582572f7de5592744897f88ac488c97a715bfa71c9/distribute-0.6.9.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"ef70bb0efc48cb1d6689cf32e0312c4c","sha256":"e2f411eda7535eb7af0cc032c6e104733c3d3afbd7d79de25b925d740eb9cbd4"},"downloads":-1,"filename":"distribute-0.6.9.zip","has_sig":false,"md5_digest":"ef70bb0efc48cb1d6689cf32e0312c4c","packagetype":"sdist","python_version":"source","requires_python":null,"size":424999,"upload_time":"2016-01-19T00:01:48","upload_time_iso_8601":"2016-01-19T00:01:48.635990Z","url":"https://files.pythonhosted.org/packages/e8/1f/746778ad7044fe4767a3e3122ad75d0487441342ae00940d2b333f53c03f/distribute-0.6.9.zip","yanked":false,"yanked_reason":null}],"0.7.3":[{"comment_text":"","digests":{"md5":"c6c59594a7b180af57af8a0cc0cf5b4a","sha256":"3dc7a8d059dcf72f0ead2fa2144a24ee0ef07dce816e8c3545d7345767138c5e"},"downloads":-1,"filename":"distribute-0.7.3.zip","has_sig":false,"md5_digest":"c6c59594a7b180af57af8a0cc0cf5b4a","packagetype":"sdist","python_version":"source","requires_python":null,"size":145378,"upload_time":"2013-07-05T18:19:57","upload_time_iso_8601":"2013-07-05T18:19:57.876141Z","url":"https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60eff7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip","yanked":false,"yanked_reason":null}]},"urls":[{"comment_text":"","digests":{"md5":"8a5c36afe934ef90ce2da15a1c557128","sha256":"85b05942f84146d8f0ed17906b90af7662d649b922fe77a8c402da5da258a481"},"downloads":-1,"filename":"distribute-0.6.15.tar.gz","has_sig":false,"md5_digest":"8a5c36afe934ef90ce2da15a1c557128","packagetype":"sdist","python_version":"source","requires_python":null,"size":397027,"upload_time":"2011-09-22T18:32:37","upload_time_iso_8601":"2011-09-22T18:32:37.570852Z","url":"https://files.pythonhosted.org/packages/07/a6/8f6b270b7e6a1be3df78b174e2437fdb631cfcce16f82c2f8b7affb50ee2/distribute-0.6.15.tar.gz","yanked":false,"yanked_reason":null},{"comment_text":"","digests":{"md5":"86ca2e0a13621a9b742246b2509602a2","sha256":"a6cba0f43a70dceab680ba475df2a451b53257e5dc3267323c2a666c1673a31b"},"downloads":-1,"filename":"distribute-0.6.15.zip","has_sig":false,"md5_digest":"86ca2e0a13621a9b742246b2509602a2","packagetype":"sdist","python_version":"source","requires_python":null,"size":435492,"upload_time":"2016-01-19T00:02:50","upload_time_iso_8601":"2016-01-19T00:02:50.500500Z","url":"https://files.pythonhosted.org/packages/7f/00/9219235d4222c3da6729e6e2afa4a9080b987169bab3b2ec6cbb7c2e86da/distribute-0.6.15.zip","yanked":false,"yanked_reason":null}]}
diff --git a/pyroma/testdata/minimal/setup.py b/pyroma/testdata/minimal/setup.py
index 3e336a9..ba098ae 100644
--- a/pyroma/testdata/minimal/setup.py
+++ b/pyroma/testdata/minimal/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup, find_packages
 
-version = "0.0foo"
+version = "0.0.1"
 
 setup(
     name="minimal",
diff --git a/pyroma/testdata/only_config/setup.cfg b/pyroma/testdata/only_config/setup.cfg
index 9c35142..3775388 100644
--- a/pyroma/testdata/only_config/setup.cfg
+++ b/pyroma/testdata/only_config/setup.cfg
@@ -19,3 +19,5 @@ keywords =
     pypi
     quality
     example
+[options]
+python_requires = >=2.6
diff --git a/pyroma/testdata/pep517/README.txt b/pyroma/testdata/pep517/README.txt
new file mode 100644
index 0000000..7edd7ae
--- /dev/null
+++ b/pyroma/testdata/pep517/README.txt
@@ -0,0 +1,22 @@
+Complete
+========
+
+This is a test package for pyroma that is supposed to have a complete
+set of metadata and also runnable tests. It should score the maximum possible
+on package tests.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
+dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
+velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
+nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
+nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
+orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
+velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
+ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
+nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
+interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
+ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
+dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
+dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
+ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
+posuere id dignissim massa molestie.
diff --git a/pyroma/testdata/pep517/only_config/__init__.py b/pyroma/testdata/pep517/only_config/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/pyroma/testdata/pep517/pyproject.toml b/pyroma/testdata/pep517/pyproject.toml
new file mode 100644
index 0000000..b0f0765
--- /dev/null
+++ b/pyroma/testdata/pep517/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["setuptools>=42"]
+build-backend = "setuptools.build_meta"
diff --git a/pyroma/testdata/pep517/setup.cfg b/pyroma/testdata/pep517/setup.cfg
new file mode 100644
index 0000000..213aebb
--- /dev/null
+++ b/pyroma/testdata/pep517/setup.cfg
@@ -0,0 +1,23 @@
+[metadata]
+name = pep517
+version = 1.0
+description = This is a test package for pyroma
+long_description = file: README.txt
+author = Lennart Regebro
+author_email = regebro@gmail.com
+url = https://github.com/regebro/pyroma
+classifiers =
+    Development Status :: 6 - Mature
+    Operating System :: OS Independent
+    Programming Language :: Python :: 2.6
+    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 3.1
+    Programming Language :: Python :: 3.2
+    Programming Language :: Python :: 3.3
+    License :: OSI Approved :: MIT License
+keywords =
+    pypi
+    quality
+    example
+[options]
+python_requires = >=2.6
diff --git a/pyroma/testdata/pep621/README.txt b/pyroma/testdata/pep621/README.txt
new file mode 100644
index 0000000..7edd7ae
--- /dev/null
+++ b/pyroma/testdata/pep621/README.txt
@@ -0,0 +1,22 @@
+Complete
+========
+
+This is a test package for pyroma that is supposed to have a complete
+set of metadata and also runnable tests. It should score the maximum possible
+on package tests.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed porttitor, neque at
+dignissim condimentum, libero est dictum dolor, sit amet tempor urna diam eget
+velit. Suspendisse at odio quam, ut vestibulum ipsum. Nulla facilisi. Nullam
+nunc dolor, tempus in vulputate id, fringilla eget metus. Pellentesque nulla
+nisl, imperdiet ac vulputate non, commodo tincidunt purus. Aenean sollicitudin
+orci eget diam dignissim scelerisque. Donec quis neque nisl, eu adipiscing
+velit. Aenean convallis ante sapien. Etiam vitae viverra libero. Nullam ac
+ligula erat. Aliquam pellentesque, est eget faucibus pharetra, urna orci rhoncus
+nisi, adipiscing elementum libero lectus ut odio. Duis tincidunt mi quam, quis
+interdum enim. Nunc sed urna urna, id lacinia turpis. Quisque malesuada, velit
+ut tincidunt lacinia, dolor augue varius velit, in ultrices lectus enim et
+dolor. Fusce augue eros, aliquet ac dapibus at, tincidunt vitae leo. Lorem ipsum
+dolor sit amet, consectetur adipiscing elit. Vivamus sapien neque, fermentum sed
+ultrices sit amet, fermentum nec est. Pellentesque imperdiet enim nec velit
+posuere id dignissim massa molestie.
diff --git a/pyroma/testdata/pep621/pyproject.toml b/pyroma/testdata/pep621/pyproject.toml
new file mode 100644
index 0000000..fd4b832
--- /dev/null
+++ b/pyroma/testdata/pep621/pyproject.toml
@@ -0,0 +1,30 @@
+[build-system]
+requires = ["flit_core >=3.4,<4"]
+build-backend = "flit_core.buildapi"
+
+[project]
+name = "pyroma_pep621_test_pkg"
+version = "1.0"
+description = "This is a test package for pyroma"
+readme = "README.txt"
+authors = [{name = "Lennart Regebro", email = "regebro@gmail.com"}]
+classifiers = [
+    "Development Status :: 6 - Mature",
+    "Operating System :: OS Independent",
+    "Programming Language :: Python :: 2.6",
+    "Programming Language :: Python :: 2.7",
+    "Programming Language :: Python :: 3.1",
+    "Programming Language :: Python :: 3.2",
+    "Programming Language :: Python :: 3.3",
+    "License :: OSI Approved :: MIT License",
+]
+keywords = [
+    "pypi",
+    "quality",
+    "example",
+]
+urls = {Homepage = "https://github.com/regebro/pyroma"}
+requires-python = ">3.8"
+
+[tool.setuptools]
+include-package-data = false
diff --git a/pyroma/testdata/pep621/pyroma_pep621_test_pkg/__init__.py b/pyroma/testdata/pep621/pyroma_pep621_test_pkg/__init__.py
new file mode 100644
index 0000000..a7e9a2a
--- /dev/null
+++ b/pyroma/testdata/pep621/pyroma_pep621_test_pkg/__init__.py
@@ -0,0 +1,3 @@
+"""This is a test package for pyroma."""
+
+__version__ = "1.0.0"
diff --git a/pyroma/testdata/setup_config/setup.cfg b/pyroma/testdata/setup_config/setup.cfg
index 9c35142..0b21207 100644
--- a/pyroma/testdata/setup_config/setup.cfg
+++ b/pyroma/testdata/setup_config/setup.cfg
@@ -19,3 +19,5 @@ keywords =
     pypi
     quality
     example
+[options]
+python_requires = >=2.6, !=3.1.*
diff --git a/pyroma/testdata/xmlrpcdata/completedata.py b/pyroma/testdata/xmlrpcdata/completedata.py
index f386798..13a4d59 100644
--- a/pyroma/testdata/xmlrpcdata/completedata.py
+++ b/pyroma/testdata/xmlrpcdata/completedata.py
@@ -68,8 +68,7 @@ imperdiet enim nec velit posuere id dignissim massa molestie.""",
                 "upload_time": datetime(2011, 3, 16, 16, 31, 39),
                 "comment_text": "",
                 "python_version": "source",
-                "url": "http://pypi.python.org/packages/source/c/complete/"
-                "complete-1.0.dev1.tar.gz",
+                "url": "http://pypi.python.org/packages/source/c/complete/complete-1.0.dev1.tar.gz",
                 "md5_digest": "ea52e1412e7ff560c290266ed400e216",
                 "downloads": 0,
                 "filename": "complete-1.0.dev1.tar.gz",
@@ -78,7 +77,5 @@ imperdiet enim nec velit posuere id dignissim massa molestie.""",
             }
         ]
     },
-    "package_roles": {
-        ("complete",): [["Owner", "someone"], ["Owner", "me"], ["Owner", "other"]]
-    },
+    "package_roles": {("complete",): [["Owner", "someone"], ["Owner", "me"], ["Owner", "other"]]},
 }
diff --git a/pyroma/testdata/xmlrpcdata/distribute/0.6.15.html b/pyroma/testdata/xmlrpcdata/distribute/0.6.15.html
index 4776b72..a933ef8 100644
--- a/pyroma/testdata/xmlrpcdata/distribute/0.6.15.html
+++ b/pyroma/testdata/xmlrpcdata/distribute/0.6.15.html
@@ -1149,4 +1149,4 @@ This closes <a class="reference external" href="http://bitbucket.org/tarek/distr
         </div>
       </div>
     </body>
-  </html>
\ No newline at end of file
+  </html>
diff --git a/pyroma/testdata/xmlrpcdata/distributedata.py b/pyroma/testdata/xmlrpcdata/distributedata.py
index 382a859..6ef225f 100644
--- a/pyroma/testdata/xmlrpcdata/distributedata.py
+++ b/pyroma/testdata/xmlrpcdata/distributedata.py
@@ -39,20 +39,19 @@ It doesn't need to be much longer than this, I think.
             "classifiers": [
                 "Development Status :: 5 - Production/Stable",
                 "Intended Audience :: Developers",
-                "License :: OSI Approved :: " "Python Software Foundation License",
+                "License :: OSI Approved :: Python Software Foundation License",
                 "License :: OSI Approved :: Zope Public License",
                 "Operating System :: OS Independent",
                 "Programming Language :: Python",
                 "Programming Language :: Python :: 3",
-                "Topic :: Software Development :: " "Libraries :: Python Modules",
+                "Topic :: Software Development :: Libraries :: Python Modules",
                 "Topic :: System :: Archiving :: Packaging",
                 "Topic :: System :: Systems Administration",
                 "Topic :: Utilities",
             ],
             "name": "distribute",
             "license": "PSF or ZPL",
-            "summary": "Easily download, build, install, upgrade, and "
-            "uninstall Python packages",
+            "summary": "Easily download, build, install, upgrade, and uninstall Python packages",
             "home_page": "http://packages.python.org/distribute",
             "stable_version": None,
             "cheesecake_installability_id": None,
@@ -65,8 +64,7 @@ It doesn't need to be much longer than this, I think.
                 "upload_time": datetime(2011, 3, 16, 16, 31, 39),
                 "comment_text": "",
                 "python_version": "source",
-                "url": "http://pypi.python.org/packages/source/d/"
-                "distribute/distribute-0.6.15.tar.gz",
+                "url": "http://pypi.python.org/packages/source/d/distribute/distribute-0.6.15.tar.gz",
                 "md5_digest": "ea52e1412e7ff560c290266ed400e216",
                 "downloads": 0,
                 "filename": "distribute-0.6.15.tar.gz",
diff --git a/pyroma/tests.py b/pyroma/tests.py
index ed55eef..6c13329 100644
--- a/pyroma/tests.py
+++ b/pyroma/tests.py
@@ -1,29 +1,24 @@
-from __future__ import print_function
-import unittest
+import io
+import json
 import os
-import collections
-
-try:
-    from xmlrpc import client as xmlrpclib
-    from urllib import request as urllib
-except ImportError:
-    import xmlrpclib
-    import urllib
+import unittest
+import unittest.mock
+from pkg_resources import resource_filename, resource_string
+from xmlrpc import client as xmlrpclib
 
 from pyroma import projectdata, distributiondata, pypidata
 from pyroma.ratings import rate
-from pkg_resources import resource_filename, resource_string
 
-long_description = resource_string(
-    __name__, os.path.join("testdata", "complete", "README.txt")
-)
+long_description = resource_string(__name__, os.path.join("testdata", "complete", "README.txt"))
 if not isinstance(long_description, str):
     long_description = long_description.decode()
+# Translate newlines to universal format
+long_description = io.StringIO(long_description, newline=None).read()
 
 COMPLETE = {
-    "_setuptools": True,
+    "metadata_version": "2.1",
     "name": "complete",
-    "version": "1.0",
+    "version": "1.0.dev1",
     "description": "This is a test package for pyroma.",
     "long_description": long_description,
     "classifiers": [
@@ -36,64 +31,23 @@ COMPLETE = {
         "Programming Language :: Python :: 3.3",
         "License :: OSI Approved :: MIT License",
     ],
-    "keywords": ["pypi", "quality", "example"],
+    "keywords": "pypi,quality,example",
     "author": "Lennart Regebro",
     "author_email": "regebro@gmail.com",
     "url": "https://github.com/regebro/pyroma",
-    "project_urls": {"Source Code": "https://github.com/regebro/pyroma"},
+    "project_urls": "Source Code, https://github.com/regebro/pyroma",
+    "requires_dist": "zope.event",
+    "python_requires": ">=2.6",
     "license": "MIT",
-    "zip_safe": True,
-    "test_suite": "complete",
 }
 
 
-class FakeResponse(object):
-    def __init__(self, responsecode, filename=None):
-        self.filename = filename
-        self.headers = collections.defaultdict(lambda: None)
-        self.code = responsecode
-
-    def read(self):
-        return open(self.filename, "rb").read()
-
-
-def urlopenstub(url):
-    if url.find("readthedocs.org") != -1:
-        host = url.split("/")[2]
-        package = host.split(".")[0]
-        # Faking the docs:
-        if package in ("distribute", "complete"):
-            return FakeResponse(200)
-        else:
-            # This package doesn't have docs on pythonhosted.org:
-            return FakeResponse(404)
-
-    if url.startswith("http://pypi.org/project"):
-        filename = url[len("http://pypi.org/project/") :]
-        # Faking PyPI package
-        datafile = resource_filename(
-            __name__, os.path.join("testdata", "xmlrpcdata", filename + ".html")
-        )
-        return FakeResponse(200, datafile)
-
-    if url.startswith("http://pypi.python.org/packages"):
-        filename = [x for x in url.split("/") if x][-1]
-        # Faking PyPI file downloads
-        datafile = resource_filename(
-            __name__, os.path.join("testdata", "distributions", filename)
-        )
-        return FakeResponse(200, datafile)
-
-    raise ValueError("Don't know how to stub " + url)
-
-
-class ProxyStub(object):
-    def __init__(self, dataname, real_class, developmode):
-        filename = resource_filename(
-            __name__, os.path.join("testdata", "xmlrpcdata", dataname)
-        )
+class ProxyStub:
+    def set_debug_context(self, dataname, real_class, developmode):
+        filename = resource_filename(__name__, os.path.join("testdata", "xmlrpcdata", dataname))
         data = {}
-        exec(open(filename, "rt").read(), None, data)
+        with open(filename, encoding="UTF-8") as f:
+            exec(f.read(), None, data)
         self.args = data["args"]
         self.kw = data["kw"]
         self._data = data["data"]
@@ -129,12 +83,26 @@ class ProxyStub(object):
         return _proxy_method
 
     def __getattr__(self, attr):
+        if attr in ("_data", "_make_proxy", "_make_unknown_proxy"):
+            raise AttributeError("Break infinite recursion chain")
         if attr in self._data:
             return self._make_proxy(attr)
         return self._make_unknown_proxy(attr)
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        return
+
+
+proxystub = ProxyStub()
+
 
 class RatingsTest(unittest.TestCase):
+
+    maxDiff = None
+
     def _get_file_rating(self, dirname):
         directory = resource_filename(__name__, os.path.join("testdata", dirname))
         data = projectdata.get_data(directory)
@@ -151,7 +119,47 @@ class RatingsTest(unittest.TestCase):
 
     def test_only_config(self):
         rating = self._get_file_rating("only_config")
-        self.assertEqual(rating, (10, []))
+
+        self.assertEqual(
+            rating,
+            (
+                7,
+                [
+                    (
+                        "You should specify what Python versions you support with "
+                        "the 'requires-python'/'python_requires' metadata."
+                    ),
+                    "You seem to have a setup.cfg, but neither a setup.py, nor a build-system defined. "
+                    "This makes it unclear how your project should be built. You probably want to "
+                    "have a pyproject.toml file with the following configuration:\n\n"
+                    "    [build-system]\n"
+                    '    requires = ["setuptools>=42"]\n'
+                    '    build-backend = "setuptools.build_meta"\n\n'
+                    "In the future this will become a hard failure and your package will be "
+                    'rated as "not cheese".',
+                ],
+            ),
+        )
+
+    def test_pep517(self):
+        rating = self._get_file_rating("pep517")
+        self.assertEqual(
+            rating,
+            (
+                10,
+                [],
+            ),
+        )
+
+    def test_pep621(self):
+        rating = self._get_file_rating("pep621")
+        self.assertEqual(
+            rating,
+            (
+                10,
+                [],
+            ),
+        )
 
     def test_minimal(self):
         rating = self._get_file_rating("minimal")
@@ -161,15 +169,19 @@ class RatingsTest(unittest.TestCase):
             (
                 2,
                 [
-                    "The package's version number does not comply with PEP-386 or PEP-440.",
                     "The package's description should be longer than 10 characters.",
                     "The package's long_description is quite short.",
                     "Your package does not have classifiers data.",
-                    "You should specify what Python versions you support.",
+                    "The classifiers should specify what Python versions you support.",
+                    (
+                        "You should specify what Python versions you support with "
+                        "the 'requires-python'/'python_requires' metadata."
+                    ),
                     "Your package does not have keywords data.",
                     "Your package does not have author data.",
                     "Your package does not have author_email data.",
-                    "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.",
+                    "Your package should have a 'url' field with a link to the project home page, or a "
+                    "'project_urls' field, with a dictionary of links, or both.",
                     "Your package does neither have a license field nor any license classifiers.",
                     "Specifying a development status in the classifiers gives users "
                     "a hint of how stable your software is.",
@@ -188,13 +200,19 @@ class RatingsTest(unittest.TestCase):
                     "The package had no description!",
                     "The package's long_description is quite short.",
                     "Your package does not have classifiers data.",
-                    "You should specify what Python versions you support.",
+                    "The classifiers should specify what Python versions you support.",
+                    (
+                        "You should specify what Python versions you support with "
+                        "the 'requires-python'/'python_requires' metadata."
+                    ),
                     "Your package does not have keywords data.",
                     "Your package does not have author data.",
                     "Your package does not have author_email data.",
-                    "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.",
+                    "Your package should have a 'url' field with a link to the project home page, or a "
+                    "'project_urls' field, with a dictionary of links, or both.",
                     "Your package does neither have a license field nor any license classifiers.",
-                    "Your long_description is not valid ReST: \n<string>:1: (WARNING/2) Inline literal start-string without end-string.",
+                    "Your long_description is not valid ReST: \n<string>:1: (WARNING/2) Inline literal "
+                    "start-string without end-string.",
                     "Specifying a development status in the classifiers gives users "
                     "a hint of how stable your software is.",
                 ],
@@ -209,15 +227,19 @@ class RatingsTest(unittest.TestCase):
             (
                 2,
                 [
-                    "The package's version number does not comply with PEP-386 or PEP-440.",
                     "The package's description should be longer than 10 characters.",
                     "The package's long_description is quite short.",
                     "Your package does not have classifiers data.",
-                    "You should specify what Python versions you support.",
+                    "The classifiers should specify what Python versions you support.",
+                    (
+                        "You should specify what Python versions you support with "
+                        "the 'requires-python'/'python_requires' metadata."
+                    ),
                     "Your package does not have keywords data.",
                     "Your package does not have author data.",
                     "Your package does not have author_email data.",
-                    "Your package should have a 'url' field with a link to the project home page, or a 'project_urls' field, with a dictionary of links, or both.",
+                    "Your package should have a 'url' field with a link to the project home page, or a "
+                    "'project_urls' field, with a dictionary of links, or both.",
                     "Your package does neither have a license field nor any license classifiers.",
                     "Specifying a development status in the classifiers gives users "
                     "a hint of how stable your software is.",
@@ -231,59 +253,60 @@ class RatingsTest(unittest.TestCase):
         testdata["long_description"] = "# Broken ReST\n\n``Valid  Markdown\n"
         testdata["long_description_content_type"] = "text/markdown"
         rating = rate(testdata)
-        self.assertEqual(
-            rating, (9, ["The package's long_description is quite short."])
-        )
+        self.assertEqual(rating, (9, ["The package's long_description is quite short."]))
 
         testdata["long_description_content_type"] = "text/plain"
         rating = rate(testdata)
+        self.assertEqual(rating, (9, ["The package's long_description is quite short."]))
+
+
+class PyPITest(unittest.TestCase):
+
+    maxDiff = None
+
+    @unittest.mock.patch("xmlrpc.client.ServerProxy", proxystub)
+    @unittest.mock.patch("pyroma.pypidata._get_project_data")
+    def test_distribute(self, projectdatamock):
+        datafile = resource_filename(__name__, os.path.join("testdata", "jsondata", "distribute.json"))
+        with open(datafile, "rt", encoding="UTF-8") as file:
+            projectdatamock.return_value = json.load(file)
+
+        proxystub.set_debug_context("distributedata.py", xmlrpclib.ServerProxy, False)
+
+        data = pypidata.get_data("distribute")
+        rating = rate(data)
+
+        # build + older versions of setuptools works, later setuptools does not, so
+        # we can get two different results here:
         self.assertEqual(
-            rating, (9, ["The package's long_description is quite short."])
+            rating,
+            (
+                7,
+                [
+                    "The classifiers should specify what minor versions of Python "
+                    "you support as well as what major version.",
+                    "You should have three or more owners of the project on PyPI.",
+                    "Your Cheese may have spoiled!! The only way to gather metadata from your package was to execute "
+                    "a patched setup.py. This indicates that your package is using very old packaging techniques, "
+                    "(or that your setup.py isn't executable at all), and Pyroma will soon regard that as a "
+                    "complete failure!\nPlease modernize your packaging! If it is already modern, this is a bug.",
+                ],
+            ),
         )
 
+    @unittest.mock.patch("xmlrpc.client.ServerProxy", proxystub)
+    @unittest.mock.patch("pyroma.pypidata._get_project_data")
+    def test_complete(self, projectdatamock):
+        datafile = resource_filename(__name__, os.path.join("testdata", "jsondata", "complete.json"))
+        with open(datafile, "rt", encoding="UTF-8") as file:
+            projectdatamock.return_value = json.load(file)
 
-class PyPITest(unittest.TestCase):
-    def test_distribute(self):
-        real_urlopen = urllib.urlopen
-        real_server_proxy = xmlrpclib.ServerProxy
-        try:
-            xmlrpclib.ServerProxy = ProxyStub(
-                "distributedata.py", xmlrpclib.ServerProxy, False
-            )
-            urllib.urlopen = urlopenstub
-            data = pypidata.get_data("distribute")
-            rating = rate(data)
-
-            self.assertEqual(
-                rating,
-                (
-                    9,
-                    [
-                        "The classifiers should specify what minor versions of Python "
-                        "you support as well as what major version.",
-                        "You should have three or more owners of the project on PyPI.",
-                    ],
-                ),
-            )
-        finally:
-            xmlrpclib.ServerProxy = real_server_proxy
-            urllib.urlopen = real_urlopen
+        proxystub.set_debug_context("completedata.py", xmlrpclib.ServerProxy, False)
 
-    def test_complete(self):
-        real_urlopen = urllib.urlopen
-        real_server_proxy = xmlrpclib.ServerProxy
-        try:
-            xmlrpclib.ServerProxy = ProxyStub(
-                "completedata.py", xmlrpclib.ServerProxy, False
-            )
-            urllib.urlopen = urlopenstub
-            data = pypidata.get_data("complete")
-            rating = rate(data)
-
-            self.assertEqual(rating, (10, []))
-        finally:
-            xmlrpclib.ServerProxy = real_server_proxy
-            urllib.urlopen = real_urlopen
+        data = pypidata.get_data("complete")
+        rating = rate(data)
+
+        self.assertEqual(rating, (10, []))
 
 
 class ProjectDataTest(unittest.TestCase):
@@ -298,10 +321,11 @@ class ProjectDataTest(unittest.TestCase):
 
 
 class DistroDataTest(unittest.TestCase):
+
+    maxDiff = None
+
     def test_complete(self):
-        directory = resource_filename(
-            __name__, os.path.join("testdata", "distributions")
-        )
+        directory = resource_filename(__name__, os.path.join("testdata", "distributions"))
 
         for filename in os.listdir(directory):
             if filename.startswith("complete"):
diff --git a/setup.cfg b/setup.cfg
index 3c6e79c..a78aa37 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,2 +1,72 @@
-[bdist_wheel]
-universal=1
+[metadata]
+name = pyroma
+version = 4.2
+description = Test your project's packaging friendliness
+long_description = file: README.rst, CHANGES.txt
+classifiers =
+    Development Status :: 5 - Production/Stable
+    Intended Audience :: Developers
+    License :: OSI Approved :: MIT License
+    Operating System :: OS Independent
+    Programming Language :: Python
+    Programming Language :: Python :: 3
+    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 :: Only
+    Programming Language :: Python :: Implementation :: CPython
+    Programming Language :: Python :: Implementation :: PyPy
+keywords = pypi, quality, testing
+author = Lennart Regebro
+author_email = regebro@gmail.com
+url = https://github.com/regebro/pyroma
+license = MIT
+project_urls =
+    Source Code = https://github.com/regebro/pyroma
+
+[options]
+zip_safe = True
+include_package_data = True
+packages = find:
+package_dir =
+    = .
+python_requires = >=3.7
+install_requires =
+    build>=0.7.0
+    docutils
+    packaging
+    pygments
+    requests
+    setuptools>=42
+    trove-classifiers>=2022.6.26
+
+[options.packages.find]
+where = .
+
+[options.extras_require]
+test =
+    setuptools>=60
+    zest.releaser[recommended]
+
+[options.entry_points]
+console_scripts =
+    pyroma = pyroma:main
+
+zest.releaser.prereleaser.before =
+    pyroma = pyroma:zester
+
+[flake8]
+max-line-length=120
+
+[tool:pytest]
+testpaths =
+    pyroma/tests.py
+
+[check-manifest]
+ignore =
+  .pre-commit-hooks.yaml
+
+[zest.releaser]
+create-wheel = yes
diff --git a/setup.py b/setup.py
index 18fca28..6068493 100644
--- a/setup.py
+++ b/setup.py
@@ -1,44 +1,3 @@
-from setuptools import setup, find_packages
-from io import open
+from setuptools import setup
 
-version = "2.6b2"
-
-with open("README.rst", "rt", encoding="UTF-8") as file:
-    long_description = file.read() + "\n"
-
-with open("HISTORY.txt", "rt", encoding="UTF-8") as file:
-    long_description += file.read()
-
-setup(
-    name="pyroma",
-    version=version,
-    description="Test your project's packaging friendliness",
-    long_description=long_description,
-    python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
-    classifiers=[
-        "Programming Language :: Python :: 2",
-        "Programming Language :: Python :: 2.7",
-        "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.5",
-        "Programming Language :: Python :: 3.6",
-        "Programming Language :: Python :: 3.7",
-        "Programming Language :: Python :: Implementation :: PyPy",
-        "License :: OSI Approved :: MIT License",
-        "Development Status :: 5 - Production/Stable",
-    ],
-    keywords=["pypi", "quality", "testing"],
-    author="Lennart Regebro",
-    author_email="regebro@gmail.com",
-    url="https://github.com/regebro/pyroma",
-    project_urls={"Source Code": "https://github.com/regebro/pyroma"},
-    license="MIT",
-    packages=find_packages(exclude=["ez_setup"]),
-    include_package_data=True,
-    zip_safe=False,
-    install_requires=["setuptools", "docutils", "pygments"],
-    entry_points={
-        "console_scripts": ["pyroma = pyroma:main"],
-        "zest.releaser.prereleaser.before": ["pyroma = pyroma:zester"],
-    },
-    test_suite="pyroma",
-)
+setup()

More details

Full run details

Historical runs