diff --git a/src/_packagedcode/pypi.py b/src/_packagedcode/pypi.py index 7d26be3e..c80247ed 100644 --- a/src/_packagedcode/pypi.py +++ b/src/_packagedcode/pypi.py @@ -9,19 +9,23 @@ # import ast +from configparser import ConfigParser import json import logging +from pathlib import Path import os import re import sys +from typing import NamedTuple +import tempfile import zipfile -from configparser import ConfigParser -from pathlib import Path import dparse2 +import packaging import pip_requirements_parser import pkginfo2 from commoncode import fileutils +from packaging.specifiers import SpecifierSet from packageurl import PackageURL from packaging import markers from packaging.requirements import Requirement @@ -453,7 +457,8 @@ def parse_metadata(location, datasource_id, package_type): primary_language='Python', name=name, version=version, - description=get_description(meta, location), + description=get_description(metainfo=meta, location=str(location)), + #TODO: https://github.com/nexB/scancode-toolkit/issues/3014 declared_license=get_declared_license(meta), keywords=get_keywords(meta), parties=get_parties(meta), @@ -645,6 +650,14 @@ def parse(cls, location): ) +class ResolvedPurl(NamedTuple): + """ + A resolved PURL + """ + purl: PackageURL + is_resolved: bool + + class BaseDependencyFileHandler(BasePypiHandler): """ Base class for a dependency files parsed with the same library @@ -684,10 +697,43 @@ def parse(cls, location): metadata = {} parser = ConfigParser() + dependent_packages = [] with open(location) as f: parser.read_file(f) - for section in parser.values(): + if section.name == 'options': + scope_by_sub_section = { + "install_requires": "install", + "tests_require": "test", + "setup_requires": "setup", + "python_requires": "python", + } + for sub_section, scope in scope_by_sub_section.items(): + if sub_section not in section: + continue + if scope != "python": + reqs = list(get_requirement_from_section(section=section, sub_section=sub_section)) + dependent_packages.extend(cls.parse_reqs(reqs, scope)) + continue + python_requires_specifier = section[sub_section] + purl = PackageURL( + type="generic", + name="python", + ) + resolved_purl = get_resolved_purl(purl=purl, specifiers=SpecifierSet(python_requires_specifier)) + dependent_packages.append(models.DependentPackage( + purl=str(resolved_purl.purl), + scope=scope, + is_runtime=True, + is_optional=False, + is_resolved=resolved_purl.is_resolved, + extracted_requirement=f"python_requires{python_requires_specifier}", + )) + + if section.name == "options.extras_require": + for sub_section in section: + reqs = list(get_requirement_from_section(section=section, sub_section=sub_section)) + dependent_packages.extend(cls.parse_reqs(reqs, sub_section)) if section.name == 'metadata': options = ( 'name', @@ -715,14 +761,7 @@ def parse(cls, location): ) ] - dependency_type = get_dparse2_supported_file_name(file_name) - if not dependency_type: - return - dependencies = parse_with_dparse2( - location=location, - file_name=dependency_type, - ) yield models.PackageData( datasource_id=cls.datasource_id, type=cls.default_package_type, @@ -731,9 +770,49 @@ def parse(cls, location): parties=parties, homepage_url=metadata.get('url'), primary_language=cls.default_primary_language, - dependencies=dependencies, + dependencies=dependent_packages, ) + @classmethod + def parse_reqs(cls, reqs, scope): + """ + Parse a list of requirements and return a list of dependencies + """ + dependent_packages = [] + for req in reqs: + req_parsed = packaging.requirements.Requirement(str(req)) + name = canonicalize_name(req_parsed.name) + purl = PackageURL(type="pypi", name=name) + specifiers = req_parsed.specifier._specs + resolved_purl = get_resolved_purl(purl=purl, specifiers=specifiers) + dependent_packages.append( + models.DependentPackage( + purl=str(resolved_purl.purl), + scope=scope, + is_runtime=True, + is_optional=False, + is_resolved=resolved_purl.is_resolved, + extracted_requirement=req + ) + ) + return dependent_packages + + +def get_resolved_purl(purl: PackageURL, specifiers: SpecifierSet): + """ + Check if the purl is resolved and return a ResolvedPurl. + If the purl is resolved, update its version to the pinned version + """ + is_resolved = False + if len(specifiers) == 1: + specifier = list(specifiers)[0] + if specifier.operator in ('==', '==='): + is_resolved = True + purl = purl._replace(version=specifier.version) + return ResolvedPurl( + purl=purl, + is_resolved=is_resolved, + ) class PipfileHandler(BaseDependencyFileHandler): datasource_id = 'pipfile' @@ -823,7 +902,7 @@ def get_requirements_txt_dependencies(location, include_nested=False): include_nested=include_nested, ) if not req_file or not req_file.requirements: - return [] + return [], {} # for now we ignore errors extra_data = {} @@ -1017,10 +1096,11 @@ def get_classifiers(metainfo): license_classifiers = [] other_classifiers = [] for classifier in classifiers: - if classifier.startswith('License'): - license_classifiers.append(classifier) - else: - other_classifiers.append(classifier) + if classifier: + if classifier.startswith('License'): + license_classifiers.append(classifier) + else: + other_classifiers.append(classifier) return license_classifiers, other_classifiers @@ -1248,7 +1328,6 @@ def get_dparse2_supported_file_name(file_name): 'Pipfile.lock', 'Pipfile', 'conda.yml', - 'setup.cfg', ) for dfile_name in dfile_names: @@ -1897,3 +1976,18 @@ def compute_normalized_license(declared_license): if detected_licenses: return combine_expressions(detected_licenses) + + +def get_requirement_from_section(section, sub_section): + """ + Yield extracted requirement from the ``sub_section`` key of of a ``section`` + mapping (from a setup.cfg) + """ + content = section.get(sub_section, "") + temp = tempfile.NamedTemporaryFile(delete=False) + location = temp.name + with open(location, "w") as f: + f.write(content) + packages, _ = get_requirements_txt_dependencies(location=location) + for req in packages: + yield req.extracted_requirement diff --git a/src/python_inspector/__init__.py b/src/python_inspector/__init__.py index 983aaf0b..b1a3a645 100644 --- a/src/python_inspector/__init__.py +++ b/src/python_inspector/__init__.py @@ -6,3 +6,5 @@ # See https://github.com/nexB/scancode-toolkit for support or download. # See https://aboutcode.org for more information about nexB OSS projects. # + +DEFAULT_PYTHON_VERSION = "3.8" diff --git a/src/python_inspector/resolution.py b/src/python_inspector/resolution.py index fb67aa94..acbf3986 100644 --- a/src/python_inspector/resolution.py +++ b/src/python_inspector/resolution.py @@ -7,11 +7,13 @@ # See https://aboutcode.org for more information about nexB OSS projects. # -import collections import operator import os +import tarfile from typing import List +from typing import NamedTuple from typing import Sequence +from zipfile import ZipFile import packaging.requirements import packaging.utils @@ -23,10 +25,22 @@ from resolvelib import Resolver from resolvelib.reporters import BaseReporter +from _packagedcode.pypi import PipRequirementsFileHandler from _packagedcode.pypi import PypiWheelHandler +from _packagedcode.pypi import PythonSdistPkgInfoFile +from _packagedcode.pypi import PythonSetupPyHandler +from _packagedcode.pypi import SetupCfgHandler from python_inspector import utils_pypi -Candidate = collections.namedtuple("Candidate", "name version extras") + +class Candidate(NamedTuple): + """ + A candidate is a package that can be installed. + """ + + name: str + version: str + extras: str def get_response(url): @@ -62,12 +76,63 @@ def get_python_version_from_env_tag(python_version: str): return python_version +def fetch_and_extract_sdist(repos, candidate, python_version): + """ + Fetch and extract the source distribution (sdist) for the ``candidate`` Candidate + from the `repos` list of PyPiRepository + and a required ``python_version`` Python version. + Return the directory location string where the sdist has been extracted. + Return None if the sdist was not fetched either + because does not exist in any of the ``repos`` or it does not work with + the required ``python_version``. + Raise an Exception if extraction fails. + """ + sdist = utils_pypi.download_sdist( + name=candidate.name, + version=str(candidate.version), + repos=repos, + python_version=python_version, + ) + + if not sdist: + return + + if sdist.endswith(".tar.gz"): + sdist_file = sdist.rstrip(".tar.gz") + with tarfile.open(os.path.join(utils_pypi.CACHE_THIRDPARTY_DIR, sdist)) as file: + file.extractall( + os.path.join(utils_pypi.CACHE_THIRDPARTY_DIR, "extracted_sdists", sdist_file) + ) + elif sdist.endswith(".zip"): + sdist_file = sdist.rstrip(".zip") + with ZipFile(os.path.join(utils_pypi.CACHE_THIRDPARTY_DIR, sdist)) as zip: + zip.extractall( + os.path.join(utils_pypi.CACHE_THIRDPARTY_DIR, "extracted_sdists", sdist_file) + ) + + else: + raise Exception(f"Unable to extract sdist {sdist}") + + return os.path.join(utils_pypi.CACHE_THIRDPARTY_DIR, "extracted_sdists", sdist_file, sdist_file) + + +def remove_extras(identifier): + """ + Return the identifier without extras. + >>> assert remove_extras("foo[bar]") == "foo" + """ + name, _, _ = identifier.partition("[") + return name + + class PythonInputProvider(AbstractProvider): - def __init__(self, environment=None, repos=tuple()): + def __init__(self, environment=None, repos=tuple(), resolved_requirements=tuple()): self.environment = environment self.repos = repos or [] self.versions_by_package = {} self.dependencies_by_purl = {} + self.wheel_or_sdist_by_package = {} + self.resolved_requirements = resolved_requirements def identify(self, requirement_or_candidate): """Given a requirement, return an identifier for it. Overridden.""" @@ -104,10 +169,21 @@ def get_versions_for_package_from_repo(self, name, repo): Return a list of versions for a package name from a repo """ versions = [] - for version, package in repo._get_package_versions_map(name).items(): - wheels = package.get_supported_wheels(environment=self.environment) - if list(wheels): - versions.append(version) + for version, package in repo.get_package_versions(name).items(): + python_version = packaging.version.parse( + get_python_version_from_env_tag(self.environment.python_version) + ) + wheels = list(package.get_supported_wheels(environment=self.environment)) + if wheels: + valid_wheel_present = False + for wheel in wheels: + if utils_pypi.valid_distribution(wheel, python_version): + valid_wheel_present = True + if valid_wheel_present: + versions.append(version) + if package.sdist: + if utils_pypi.valid_distribution(package.sdist, python_version): + versions.append(version) return versions def get_versions_for_package_from_pypi_json_api(self, name): @@ -134,11 +210,19 @@ def get_requirements_for_package(self, purl, candidate): return self.get_requirements_for_package_from_pypi_json_api(purl) def get_requirements_for_package_from_pypi_simple(self, candidate): + """ + Return requirements for a package from the simple repositories. + """ + python_version = packaging.version.parse( + get_python_version_from_env_tag(self.environment.python_version) + ) + wheels = utils_pypi.download_wheel( name=candidate.name, version=str(candidate.version), environment=self.environment, repos=self.repos, + python_version=python_version, ) for wheel in wheels: deps = list( @@ -150,8 +234,66 @@ def get_requirements_for_package_from_pypi_simple(self, candidate): if dep.scope == "install": yield packaging.requirements.Requirement(str(dep.extracted_requirement)) - def get_requirements_for_package_from_pypi_json_api(self, purl): + sdist_file = fetch_and_extract_sdist( + repos=self.repos, candidate=candidate, python_version=python_version + ) + + if sdist_file: + setup_py_path = os.path.join( + sdist_file, + "setup.py", + ) + setup_cfg_path = os.path.join( + sdist_file, + "setup.cfg", + ) + pkg_info_path = os.path.dirname(sdist_file) + requirement_path = os.path.join( + sdist_file, + "requirements.txt", + ) + + path_by_sdist_parser = { + PythonSdistPkgInfoFile: pkg_info_path, + PythonSetupPyHandler: setup_py_path, + SetupCfgHandler: setup_cfg_path, + PipRequirementsFileHandler: requirement_path, + } + + for handler, path in path_by_sdist_parser.items(): + if not os.path.exists(path): + continue + deps = list(handler.parse(path)) + assert len(deps) == 1 + + dependencies = deps[0].dependencies + for dep in dependencies: + if not dep.purl: + continue + + if dep.scope != "install": + continue + + dep_purl = PackageURL.from_string(dep.purl) + + if self.is_dep_resolved_and_in_resolved_requirements(dep, dep_purl): + continue + + if dep.is_resolved: + self.resolved_requirements.append(dep_purl) + # skip the requirement starting with -- like + # --editable, --requirement + if not dep.extracted_requirement.startswith("--"): + yield packaging.requirements.Requirement(str(dep.extracted_requirement)) + + def is_dep_resolved_and_in_resolved_requirements(self, dep, dep_purl): + return dep.is_resolved and dep_purl.name in self.resolved_requirements + + def get_requirements_for_package_from_pypi_json_api(self, purl): + """ + Return requirements for a package from the PyPI.org JSON API + """ # if no repos are provided use the incorrect but fast JSON API if str(purl) not in self.dependencies_by_purl: api_url = f"https://pypi.org/pypi/{purl.name}/{purl.version}/json" @@ -178,7 +320,7 @@ def _iter_matches(self, identifier, requirements, incompatibilities): """ Yield candidates for the given identifier, requirements and incompatibilities """ - name, _, _extras = identifier.partition("[") + name = remove_extras(identifier) bad_versions = {c.version for c in incompatibilities[identifier]} extras = {e for r in requirements[identifier] for e in r.extras} if not self.repos: @@ -323,8 +465,15 @@ def get_resolved_dependencies( Used the provided ``repos`` list of PypiSimpleRepository. If empty, use instead the PyPI.org JSON API exclusively instead """ + resolved_requirements = [ + packaging.utils.canonicalize_name(r.name) + for r in requirements + if getattr(r, "is_requirement_resolved", False) + ] resolver = Resolver( - provider=PythonInputProvider(environment=environment, repos=repos), + provider=PythonInputProvider( + environment=environment, repos=repos, resolved_requirements=resolved_requirements + ), reporter=BaseReporter(), ) results = resolver.resolve(requirements=requirements, max_rounds=max_rounds) diff --git a/src/python_inspector/resolve_cli.py b/src/python_inspector/resolve_cli.py index 502c844c..1c47595b 100644 --- a/src/python_inspector/resolve_cli.py +++ b/src/python_inspector/resolve_cli.py @@ -167,6 +167,9 @@ def resolve_dependencies( # TODO: deduplicate me direct_dependencies = [] + if PYPI_SIMPLE_URL not in index_urls: + index_urls = tuple([PYPI_SIMPLE_URL]) + tuple(index_urls) + for req_file in requirement_files: deps = dependencies.get_dependencies_from_requirements(requirements_file=req_file) for extra_data in dependencies.get_extra_data_from_requirements(requirements_file=req_file): @@ -274,9 +277,13 @@ def resolve(direct_dependencies, environment, repos=tuple(), as_tree=False, max_ If empty, use instead the PyPI.org JSON API exclusively. """ - requirements = [ - Requirement(requirement_string=d.extracted_requirement) for d in direct_dependencies - ] + requirements = [] + + for dependency in direct_dependencies: + requirement = Requirement(requirement_string=dependency.extracted_requirement) + requirement.is_requirement_resolved = dependency.is_resolved + requirements.append(requirement) + resolved_dependencies = get_resolved_dependencies( requirements=requirements, environment=environment, diff --git a/src/python_inspector/utils_pypi.py b/src/python_inspector/utils_pypi.py index 5719fa4a..9f4b10e1 100644 --- a/src/python_inspector/utils_pypi.py +++ b/src/python_inspector/utils_pypi.py @@ -16,16 +16,21 @@ import tempfile import time from collections import defaultdict +from typing import List +from typing import NamedTuple from urllib.parse import quote_plus import attr import packageurl import requests +from bs4 import BeautifulSoup from commoncode import fileutils from commoncode.hash import multi_checksums from packaging import tags as packaging_tags from packaging import version as packaging_version +from packaging.specifiers import SpecifierSet +from python_inspector import DEFAULT_PYTHON_VERSION from python_inspector import utils_pip_compatibility_tags """ @@ -197,6 +202,7 @@ def download_wheel( repos=tuple(), verbose=False, echo_func=None, + python_version=DEFAULT_PYTHON_VERSION, ): """ Download the wheels binary distribution(s) of package ``name`` and @@ -229,6 +235,8 @@ def download_wheel( continue for wheel in supported_wheels: + if not valid_distribution(wheel, python_version): + continue if TRACE_DEEP: print( f" download_wheel: Getting wheel from index (or cache): {wheel.download_url}" @@ -247,6 +255,15 @@ def download_wheel( return fetched_wheel_filenames +def valid_distribution(distribution, python_version): + """ + Return True if distribution is a valid distribution for the given Python version. + """ + if not distribution.python_requires: + return True + return python_version in SpecifierSet(distribution.python_requires) + + def download_sdist( name, version, @@ -254,6 +271,7 @@ def download_sdist( repos=tuple(), verbose=False, echo_func=None, + python_version=DEFAULT_PYTHON_VERSION, ): """ Download the sdist source distribution of package ``name`` and ``version`` @@ -282,7 +300,8 @@ def download_sdist( if TRACE_DEEP: print(f" download_sdist: No sdist for {name}=={version}") continue - + if not valid_distribution(sdist, python_version): + continue if TRACE_DEEP: print(f" download_sdist: Getting sdist from index (or cache): {sdist.download_url}") fetched_sdist_filename = package.sdist.download( @@ -341,6 +360,15 @@ def sorted(cls, namevers): return sorted(namevers or [], key=cls.sortable_name_version) +class Link(NamedTuple): + """ + A link to a sdist/wheel on PyPI. + """ + + url: str + python_requires: str + + @attr.attributes class Distribution(NameVer): @@ -499,6 +527,12 @@ class Distribution(NameVer): default=None, ) + python_requires = attr.ib( + type=str, + default="", + metadata=dict(help="Python 'specifier' required by this distribution."), + ) + @property def package_url(self): """ @@ -579,15 +613,18 @@ def download( return self.filename @classmethod - def from_path_or_url(cls, path_or_url): + def from_link(cls, link: Link): """ Return a distribution built from the data found in the filename of a ``path_or_url`` string. Raise an exception if this is not a valid filename. """ + requires_python = link.python_requires + path_or_url = link.url filename = os.path.basename(path_or_url.strip("/")) dist = cls.from_filename(filename) dist.path_or_url = path_or_url + dist.python_requires = requires_python return dist @classmethod @@ -1160,12 +1197,12 @@ def package_from_dists(cls, dists): return package @classmethod - def packages_from_many_paths_or_urls(cls, paths_or_urls): + def packages_from_links(cls, links: List[Link]): """ Yield PypiPackages built from a list of paths or URLs. These are sorted by name and then by version from oldest to newest. """ - dists = PypiPackage.dists_from_paths_or_urls(paths_or_urls) + dists = PypiPackage.dists_from_links(links) if TRACE_ULTRA_DEEP: print("packages_from_many_paths_or_urls: dists:", dists) @@ -1181,7 +1218,7 @@ def packages_from_many_paths_or_urls(cls, paths_or_urls): yield package @classmethod - def dists_from_paths_or_urls(cls, paths_or_urls): + def dists_from_links(cls, links: List[Link]): """ Return a list of Distribution given a list of ``paths_or_urls`` to wheels or source distributions. @@ -1191,14 +1228,15 @@ def dists_from_paths_or_urls(cls, paths_or_urls): - its filename For example: - >>> paths_or_urls =''' - ... /home/foo/bitarray-0.8.1-cp36-cp36m-linux_x86_64.whl - ... bitarray-0.8.1-cp36-cp36m-macosx_10_9_x86_64.macosx_10_10_x86_64.whl - ... bitarray-0.8.1-cp36-cp36m-win_amd64.whl - ... https://example.com/bar/bitarray-0.8.1.tar.gz - ... bitarray-0.8.1.tar.gz.ABOUT - ... bit.LICENSE'''.split() - >>> results = list(PypiPackage.dists_from_paths_or_urls(paths_or_urls)) + >>> links =[ + ... Link(url="/home/foo/bitarray-0.8.1-cp36-cp36m-linux_x86_64.whl", python_requires= ">=3.7"), + ... Link(url="bitarray-0.8.1-cp36-cp36m-macosx_10_9_x86_64.macosx_10_10_x86_64.whl", + ... python_requires= ">=3.7"), + ... Link(url="bitarray-0.8.1-cp36-cp36m-win_amd64.whl",python_requires= ">=3.7"), + ... Link(url="https://example.com/bar/bitarray-0.8.1.tar.gz",python_requires= ">=3.7"), + ... Link(url="bitarray-0.8.1.tar.gz.ABOUT",python_requires= ">=3.7"), + ... Link(url="bit.LICENSE", python_requires=">=3.7")] + >>> results = list(PypiPackage.dists_from_links(links)) >>> for r in results: ... print(r.__class__.__name__, r.name, r.version) ... if isinstance(r, Wheel): @@ -1213,11 +1251,11 @@ def dists_from_paths_or_urls(cls, paths_or_urls): """ dists = [] if TRACE_ULTRA_DEEP: - print(" ###paths_or_urls:", paths_or_urls) - installable = [f for f in paths_or_urls if f.endswith(EXTENSIONS)] - for path_or_url in installable: + print(" ###paths_or_urls:", links) + installable: List[Link] = [link for link in links if link.url.endswith(EXTENSIONS)] + for link in installable: try: - dist = Distribution.from_path_or_url(path_or_url) + dist = Distribution.from_link(link=link) dists.append(dist) if TRACE_DEEP: print( @@ -1228,11 +1266,11 @@ def dists_from_paths_or_urls(cls, paths_or_urls): dist.download_url, "\n ", "from URL:", - path_or_url, + link.url, ) except InvalidDistributionFilename: if TRACE_DEEP: - print(f" Skipping invalid distribution from: {path_or_url}") + print(f" Skipping invalid distribution from: {link.url}") continue return dists @@ -1419,7 +1457,7 @@ def _get_package_versions_map( # note that this is sorted so the mapping is also sorted versions = { package.version: package - for package in PypiPackage.packages_from_many_paths_or_urls(paths_or_urls=links) + for package in PypiPackage.packages_from_links(links=links) } self.packages[normalized_name] = versions except RemoteNotFetchedException as e: @@ -1497,10 +1535,16 @@ def fetch_links( verbose=verbose, echo_func=echo_func, ) - links = collect_urls(text) + soup = BeautifulSoup(text, features="html.parser") + anchor_tags = soup.find_all("a") + links = [] + for anchor_tag in anchor_tags: + python_requires = None + url, _, _sha256 = anchor_tag["href"].partition("#sha256=") + if "data-requires-python" in anchor_tag.attrs: + python_requires = anchor_tag.attrs["data-requires-python"] + links.append(Link(url=url, python_requires=python_requires)) # TODO: keep sha256 - links = [lnk.partition("#sha256=") for lnk in links] - links = [url for url, _, _sha256 in links] return links diff --git a/tests/data/parse-reqs-with-setup_requires-and-python-requires.json b/tests/data/parse-reqs-with-setup_requires-and-python-requires.json new file mode 100644 index 00000000..fe4e9cb4 --- /dev/null +++ b/tests/data/parse-reqs-with-setup_requires-and-python-requires.json @@ -0,0 +1,120 @@ +[ + { + "type": "pypi", + "namespace": null, + "name": null, + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "Python", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "license_expression": null, + "declared_license": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:pypi/setuptools", + "extracted_requirement": "setuptools>=42.0.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/qtpy", + "extracted_requirement": "QtPy~=1.9.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/setuptools", + "extracted_requirement": "setuptools>=42.0.2", + "scope": "setup", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:generic/python", + "extracted_requirement": "python_requires>=3.6.0,<3.8.0", + "scope": "python", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pyside2", + "extracted_requirement": "PySide2~=5.13.2", + "scope": "pyside", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pyqt5", + "extracted_requirement": "PyQt5~=5.13.2", + "scope": "pyqt", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/sphinx", + "extracted_requirement": "Sphinx>=3.2.1", + "scope": "doc", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/restructuredtext-lint", + "extracted_requirement": "restructuredtext-lint>=1.3.1", + "scope": "doc", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pyside2", + "extracted_requirement": "PySide2~=5.13.2", + "scope": "test", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "pypi_setup_cfg", + "purl": null + } +] \ No newline at end of file diff --git a/tests/data/parse-reqs.json b/tests/data/parse-reqs.json new file mode 100644 index 00000000..64285c2c --- /dev/null +++ b/tests/data/parse-reqs.json @@ -0,0 +1,192 @@ +[ + { + "type": "pypi", + "namespace": null, + "name": null, + "version": null, + "qualifiers": {}, + "subpath": null, + "primary_language": "Python", + "description": null, + "release_date": null, + "parties": [], + "keywords": [], + "homepage_url": null, + "download_url": null, + "size": null, + "sha1": null, + "md5": null, + "sha256": null, + "sha512": null, + "bug_tracking_url": null, + "code_view_url": null, + "vcs_url": null, + "copyright": null, + "license_expression": null, + "declared_license": null, + "notice_text": null, + "source_packages": [], + "file_references": [], + "extra_data": {}, + "dependencies": [ + { + "purl": "pkg:pypi/pytest-black", + "extracted_requirement": "pytest-black>=0.3.7; platform_python_implementation != \"PyPy\"", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/attrs", + "extracted_requirement": "attrs>=18.1,!=20.1.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/beautifulsoup4", + "extracted_requirement": "Beautifulsoup4>=4.0.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pip", + "extracted_requirement": "pip>=19.1", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/click", + "extracted_requirement": "click>=6.7,!=7.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/intbitset", + "extracted_requirement": "intbitset>=2.3.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/requests", + "extracted_requirement": "requests>=2.7.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/saneyaml", + "extracted_requirement": "saneyaml>=0.5.2", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/text-unidecode", + "extracted_requirement": "text_unidecode>=1.0", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/typing", + "extracted_requirement": "typing>=3.6,<3.7; python_version < \"3.7\"", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pytest", + "extracted_requirement": "pytest>=6,!=7.0.0", + "scope": "testing", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/pytest-xdist", + "extracted_requirement": "pytest-xdist>=2", + "scope": "testing", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/aboutcode-toolkit", + "extracted_requirement": "aboutcode-toolkit>=6.0.0", + "scope": "testing", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/black", + "extracted_requirement": "black", + "scope": "testing", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/sphinx", + "extracted_requirement": "Sphinx>=3.3.1", + "scope": "docs", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/sphinx-rtd-theme", + "extracted_requirement": "sphinx-rtd-theme>=0.5.0", + "scope": "docs", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + }, + { + "purl": "pkg:pypi/doc8", + "extracted_requirement": "doc8>=0.8.1", + "scope": "docs", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + } + ], + "repository_homepage_url": null, + "repository_download_url": null, + "api_data_url": null, + "datasource_id": "pypi_setup_cfg", + "purl": null + } +] \ No newline at end of file diff --git a/tests/data/pinned-requirements.txt-expected.json b/tests/data/pinned-requirements.txt-expected.json index ffb04c91..529c962f 100644 --- a/tests/data/pinned-requirements.txt-expected.json +++ b/tests/data/pinned-requirements.txt-expected.json @@ -273,6 +273,10 @@ "package": "pkg:pypi/certifi@2022.5.18.1", "dependencies": [] }, + { + "package": "pkg:pypi/chardet@4.0.0", + "dependencies": [] + }, { "package": "pkg:pypi/charset-normalizer@2.0.12", "dependencies": [] @@ -290,10 +294,12 @@ "dependencies": [ "pkg:pypi/attrs@21.4.0", "pkg:pypi/beautifulsoup4@4.11.1", + "pkg:pypi/chardet@4.0.0", "pkg:pypi/click@8.0.4", "pkg:pypi/intbitset@3.0.1", "pkg:pypi/requests@2.27.1", "pkg:pypi/saneyaml@0.5.2", + "pkg:pypi/six@1.16.0", "pkg:pypi/text-unidecode@1.3" ] }, @@ -366,6 +372,10 @@ "pkg:pypi/pyyaml@6.0" ] }, + { + "package": "pkg:pypi/six@1.16.0", + "dependencies": [] + }, { "package": "pkg:pypi/soupsieve@2.3.2.post1", "dependencies": [] diff --git a/tests/data/psycopg2-links-expected.json b/tests/data/psycopg2-links-expected.json new file mode 100644 index 00000000..237f5dde --- /dev/null +++ b/tests/data/psycopg2-links-expected.json @@ -0,0 +1,2046 @@ +[ + [ + "https://files.pythonhosted.org/packages/19/79/35c7596bab4456f3610c12ec542a94d51c6781ced587d1d85127210b879b/psycopg2-2.0.10.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/2d/d7/496da11d7c81971870ddd36800419c4f84e8f6208aac5eabedf9f7748729/psycopg2-2.0.11.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/6a/8d/ee5c330823d527a5cd14c833063f825211d7b5de6e4897f72e250c107d85/psycopg2-2.0.12.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/3a/7a/968afcb86b1958ae963a3aaa42c561e3ed2c2d4a8b773622b03856a16248/psycopg2-2.0.13.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/e0/1c/f0843f50a69fba3db880e9b267d36f6709bbf31a36fc46b82f75e8975ede/psycopg2-2.0.14.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/32/0c/2f4da04ae2a66d71eff37f19fce67506ad28f887851cd1c1cca35ba08b36/psycopg2-2.2.0.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/de/c4/fdfb801035bd7da9e1ce98169d48ca2d6dee5b4361e349afbba40b3d7a5d/psycopg2-2.2.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/63/3e/a4a35761eb4595fff89e63347b4f8e79c2095782fa5bc016a6dfb18b21ac/psycopg2-2.2.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/68/0a/459df8dcbcc118ca435e9567abceaab919706908d52139e503f6396c4935/psycopg2-2.3.0.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/cd/7c/6acf5aacd347f3dc1398eca0e2123c35a48efb07617d4d9578e9cd79a1a7/psycopg2-2.3.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/50/48/32927cbc99633613704950be5013fc144aa0f451a5e0616635a934d94a62/psycopg2-2.3.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/ce/2d/e9e65ee32ef2657028109bd5a1c1ece97e409ebf790b6ee286aae2c6b890/psycopg2-2.4.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/82/f8/6c80beb1b58f01f52dcdfa52bc1668caa4e3fc4927e9230edc40afa98c05/psycopg2-2.4.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/70/91/345f8eb32dc333331510e1adad858f7a1478d3a1e4aae05ee188985c6b17/psycopg2-2.4.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/1e/71/8929172068cbc3d3c7288bf888a7df5862a28d67ed61ad9b4c7aa5cf8be8/psycopg2-2.4.3.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/6f/91/890c6f954e2d09d26b266a24468570c6227de61ac6f64926c48000db0a6e/psycopg2-2.4.4.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/36/77/894a5dd9f3f55cfc85682d3e6473ee5103d8d418b95baf4019fad3ffa026/psycopg2-2.4.5.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/59/aa/4d74a5dc32a89d622c1fa896a86683b488ef255f06d4b27231e12e6076f7/psycopg2-2.4.6.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/84/7e/7256298bf7064238e63b9380cf424f776a4d2a87e387c9a9bd1bc5ea0fbc/psycopg2-2.5.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/22/09/63d5da7375c267e208bbadf56b51699d85cb7b3a9096817eeea500a27b3b/psycopg2-2.5.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/c3/f3/5519551f02ae70fc51f4e608e7b44d59a408fe3264fec4afeea37b8ea317/psycopg2-2.5.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/22/fa/5ddcafc7387c1534c59eb3ffcdb9ab2af106fd3b104e6df191b6c55718af/psycopg2-2.5.3.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/63/c3/802668cb3cfc2880c2a8364623e7105a0257724a2612bb66ec733aaddb8c/psycopg2-2.5.4.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/9b/60/f4c79e73a69ded145880bcf4f98eeed741af12c62c5ddc89b754602b1807/psycopg2-2.5.5.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/dd/c7/9016ff8ff69da269b1848276eebfb264af5badf6b38caad805426771f04d/psycopg2-2.6.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/47/ed/5bd02bf1a7f78823f8a708beb3656f7c3ad935fb013c7063ff5f67848a52/psycopg2-2.6.1-cp26-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2e/40/8ab9a8d99b7abd2b95858872fee6894a3eb4fc361692abc02e94091aa54b/psycopg2-2.6.1-cp26-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1f/84/a2fffb87348bc688d70bcdc24e761b06f48d958e1c1adfc3fa9eb3f4379c/psycopg2-2.6.1-cp27-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b5/37/b6e759f1f6a0fd32ad0e1b2576bf94cfa252710cad66e155f47fc04ba744/psycopg2-2.6.1-cp27-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/20/84/aaaf44c339a3b51196b8b1d0928899cbc02e1583ec455b6777011fdb63b0/psycopg2-2.6.1-cp32-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/84/50/ff71daf3e32a8bff56ac661eff9226d035abaf45fe1af007cfb2134970b3/psycopg2-2.6.1-cp32-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2c/5a/8334a55459289cf8d7485a42bcb2dbe0dab5162973ef66a96baee5107593/psycopg2-2.6.1-cp33-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7b/ed/82f31122dcc502d8f43c208a74eaa2b9ff39421aaab1ff8d61547639a474/psycopg2-2.6.1-cp33-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f0/34/894f8f486196fdb15d376f77a0102b25628ec0ac71538ed019b3ea93b907/psycopg2-2.6.1-cp34-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b7/90/23af1a90f06dfa012a4ae829821b3161344a9e447358841779d027f14bd7/psycopg2-2.6.1-cp34-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/86/fd/cc8315be63a41fe000cce20482a917e874cdc1151e62cb0141f5e55f711e/psycopg2-2.6.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/49/fe/edd5a96ece520bf6522e27360f0aa66305e8cafa177c3bf5d5418a6b0741/psycopg2-2.6.2-cp26-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/14/04/c449c231d35b1d26ebd902aea4f9237da744cd3a0bd9ff89caf616a6e6fc/psycopg2-2.6.2-cp26-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/30/b9/629418a0fdc84506cfb9005ac066bb409b40661d2bfde6fc083d93237b27/psycopg2-2.6.2-cp27-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a4/0e/29d29dceca6e465804ae612bc711a4741599ac849cf0a99acdbf53838581/psycopg2-2.6.2-cp27-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ba/29/bb6c465a38f6ba070ad4f4b17797ccc345dcd2cd42eb2f262aa75d86fa52/psycopg2-2.6.2-cp32-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d3/bd/f989a3be8cd9fa696471ca399c005c903c3a4b840c419784fb27c0c62ae8/psycopg2-2.6.2-cp32-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6c/b4/d5bf17145954a3c8e80e3601d8eaf486f058ae09688910f1f0a22cb6b1d2/psycopg2-2.6.2-cp33-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2a/34/849e0491130bf2f67d72826ad64cfe8d9dc4e322b42ba99ab77dd96d970f/psycopg2-2.6.2-cp33-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8f/80/20bdb48cfccaf31be57f7ae4b5165d7bb669cfaae5a42eaf00d55b2bf39b/psycopg2-2.6.2-cp34-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fe/23/c67030ab4a43655d10b62acc658829054a97a147819a81094b1e9673e592/psycopg2-2.6.2-cp34-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/85/bb/7ab5d5b040d6c8a26180acb864f50c1887f27e02e9fb4e94f1f730a4e01b/psycopg2-2.6.2-cp35-none-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5e/45/de485228f46a2487da8e774fa2dbd772e7e03e65a3c31a322a224806e734/psycopg2-2.6.2-cp35-none-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/66/97/e8922a18a142195cfdbdfc9ec84a8d1a46b09edae24a150d79ea90e6b55b/psycopg2-2.6.2-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b6/cb/b7ad5008df09b8392942db9a262435bda778457be4aaba5fc79ead1444b4/psycopg2-2.6.2-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7b/a8/dc2d50a6f37c157459cd18bab381c8e6134b9381b50fbe969997b2ae7dbc/psycopg2-2.6.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/f6/be/38418e3175f19c4b9194dec53a4fba2119ccdb095a97b1a7d2a503f5279a/psycopg2-2.7-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a0/33/5da723813a8190fc3c3463add4f6988fc95b4b48520777f455ef1c20a90b/psycopg2-2.7-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f8/cb/1a77f3700f9e705d4ddf9f7e43717c1c49ab9b94c39924baf660e77ae3fb/psycopg2-2.7-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f5/c2/78afdda5fdc198e9fa96dfb53aef11dd33db45c903d90d15d69c2d1fdf31/psycopg2-2.7-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9e/1b/3eab32f7afbc1a812e00d6f37ad12c539a50ca9be4979195aaf293f16e3c/psycopg2-2.7-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/90/76/5b38a743414873a6701dc99bf53ce663b5adf5129f5c7485cd9055bfbd48/psycopg2-2.7-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d6/e1/70e9bb67edf2e789799273245b415fa64bbacc517fead8ba2a7b7a8f38a2/psycopg2-2.7-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5a/49/a97dfaea57187974cbd8c5a754e071044cade90c5d20609300d54ea756e8/psycopg2-2.7-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/80/8b/fcdc6570c14486a78aa7d5df7ca09c7eafe30ee169b3cf7216dceac9aa16/psycopg2-2.7-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/44/63/98923b550ef8aa86efbe6335f4a97d91800bfd0854ff1753a2ea501dd5b9/psycopg2-2.7-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a2/23/078baaa57deea8a79185d718fe46a09ad7347735793d5f783fbf81a8a0b8/psycopg2-2.7-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d8/18/be393f1e7593f95cc085aa9a40f5a33f9873ff3a61b384d4ea3a8ea52a40/psycopg2-2.7-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f0/51/b52d478c281bc91c87dc7d01f41605630566dfb0977e21f8f8830e5e669f/psycopg2-2.7-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6b/10/e9210ad792ae180629e0b6efa992f1c9c33b743f7a0170760ea4212ad971/psycopg2-2.7-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/39/f8/6e979bec5e84b3604c094f1a797852aa066ed98655acf959904525979ac0/psycopg2-2.7-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/73/05/c314cd87e4b0ddcfe08d88c9ab58f3ded24415dcd32431e24e83dd4df01c/psycopg2-2.7-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/22/a6/5dde9e6f15aaa6e9606f4d030570f49fb8091f9850a40d70e5b47d3b7357/psycopg2-2.7-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/06/8b/52db2ae0bbefbc7391ef168bb77facdc8bbb437fa65c7254807d5fee3a46/psycopg2-2.7-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/bf/4a/01c3f60f3081741b22c13394989756569d7a46e21ba37aa6d19c03ed4b41/psycopg2-2.7-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7b/2b/e9bb4c68ed77316cd726580dd00b8fa8a49d03de70f535b59a949c3930ea/psycopg2-2.7-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/88/60/e0929c0fa895ef29be4f0b37f27839dd14e73069cbf1b8727b939d0f0dce/psycopg2-2.7-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9c/f0/a5772a4519d766ea58a21bdc2c3a3b8a6700af80e58a62ee401abdc8d514/psycopg2-2.7-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/44/4f/99e9e46c49041b6937fa1d6af34e1f1aeba1cdefc96ab2c9bf2cdd203f87/psycopg2-2.7-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/29/b3/75f19edd8e863c37374565d20040fa11145035544befb6bbe9b064a87452/psycopg2-2.7-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9d/c3/b69dc16691e8d899d6f528201e8319ff720e868dc565f2d5a0aa79f4c0fa/psycopg2-2.7-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/55/00/f2bfa7fbc4669a24aa104e6f1a2d87a533888456f6a0baf521a1f677df35/psycopg2-2.7-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/96/0f/26ab81b1c0f84bed676e5900beb0ec8ea0958ed23d0d260fbeb350f35a1b/psycopg2-2.7-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/42/f3/28afb80e5ac84cd16e33ee19acf3b839fb5ec23fd7baf7d8606eda2c8170/psycopg2-2.7-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/96/95/7a206cbd02c9ccdc1a22877681f09dbc709a2dff34eef0442ca7c947bdc1/psycopg2-2.7-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dc/8c/196353c4b298a985e6936349d2a4b681e699aa781700bb1b245a2113d23c/psycopg2-2.7-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/62/ca/0a479c9664526e86c2913a7ad593586eeb86b428b7e629e7c7b6b69e3cb7/psycopg2-2.7.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/5b/fe/a2baea84fd2c8fbc889648b7875625f46cecab1cbd5fad2aaa7d192a37c1/psycopg2-2.7.1-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/65/ad/9bad99ef84a3c87511526aa8f9e372b9d60921b255939e645401c85b2c33/psycopg2-2.7.1-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/65/7f/41d0dabcd7b28d92790963b29b48bd4651843007e64d1b93bf221d83565c/psycopg2-2.7.1-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/63/a2/926bbda404f4135bc999ecbe03097bcf40cabdb04ae0421085a6796268f4/psycopg2-2.7.1-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e4/64/f44c2b3e044412e6f3f6db2e4bf5300411168408c19a2cef62f49445ba5f/psycopg2-2.7.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f7/12/96191443eb506d6c644a509eee3ca7ac5d32f16d89f0a01a3497df30e9aa/psycopg2-2.7.1-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d4/a5/a6948a4a294818780333561096cd7196f48ce0760ef1464c251bf873892d/psycopg2-2.7.1-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/90/05/48eec5d86bf58f89eaea5c01cbf4c90e7bd953d423aa906981ba0490911b/psycopg2-2.7.1-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/56/42/373df2223b2c9c8a88b370c95ffc45f199b2cf7dcf02658ee2228a4de0ad/psycopg2-2.7.1-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8e/cd/242dc89d9ec7d067f55281b36bf0b63e5fc50dcfe2a85facca6c58808dc9/psycopg2-2.7.1-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6a/84/7289d6c2b26943b5d1e2e67dde3961babd62df8c742b243bc7c6bfc35230/psycopg2-2.7.1-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/45/0a/a06d1b2228ad805986e7e09d5f2e5b970ad84f98f79109669e5918d0f1db/psycopg2-2.7.1-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/42/6f/c3ebc383a336d635989ce8d0e7bba76085bb55155559dd63b41cc4727c3c/psycopg2-2.7.1-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/33/c7/bbdcbf936e802189c1d18f46640f04ea50ff246af136bd3eb6d65abb82df/psycopg2-2.7.1-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2c/9e/486e5b2abd4609d474bd5deb9a0206c067a4944fbf988e9147fadb70ddb8/psycopg2-2.7.1-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/47/99/345a33bd66d301fc37fd5503a4622251f458d980e023e840355d44a75f9b/psycopg2-2.7.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ca/8f/c817b9c9871fb853ecf0b12aea2a0382d0f6ad4441b913818aa6b7e24bba/psycopg2-2.7.1-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/13/63/b24b449c28bceafad7fbbcee6dddf9ab30c297173b9a36f8ca36ad261ca3/psycopg2-2.7.1-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/74/75/baf91610360ca92582042ab1c48e6ec762aa757fa7e99f35081864d80eb2/psycopg2-2.7.1-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/82/43/361c634d721e186903106cf48f4e2e591d0484dafbc44ae772c718cc1ec5/psycopg2-2.7.1-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d2/cb/40d392e1855b7a1806433d3ee675f343c6542419e38618412131d25028fa/psycopg2-2.7.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d9/bb/72cdfb15d4b06b5ff58f111f583e8c4cfabb1d37065737c49a36147ac342/psycopg2-2.7.1-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f6/40/2c46b72b4d78e7e9241426e6f60302ae1b38acac805f4c93346db64f6b70/psycopg2-2.7.1-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/33/b6/d1d0cb56bd7fd41f6fe6192afdf27111fade5afb65b6e762ca7f3545b6cf/psycopg2-2.7.1-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1c/0f/0a5887a288d58b5bcb01e611b9a8f37376f5db3b4eff5766724266a9ad06/psycopg2-2.7.1-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f4/4f/668d3afcb216a1bf639e95067342a89176a91f20672a5684f281a9ca0292/psycopg2-2.7.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/da/00/9c3b3940594f303595182942b707f67968898e9e21202108dfa78d5165e1/psycopg2-2.7.1-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/90/bb/fd1a81e1a51b2df2d825e778fd58d508a4fc9ab360684348222bda3ff704/psycopg2-2.7.1-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c9/77/cbe20f0ac2527b879a63eab1f9027e5236b4db76ca83321c00e8d4c8d669/psycopg2-2.7.1-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/10/12/dd2d3bd7bd9e2a728b709d19e4546ea258fa6bb4ed301c5d33ae0fb1323e/psycopg2-2.7.1-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f8/e9/5793369ce8a41bf5467623ded8d59a434dfef9c136351aca4e70c2657ba0/psycopg2-2.7.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/7f/57/fa1fb2cf5bb7e447c623d3f074675588c67bf446e149a665ec2d2249f000/psycopg2-2.7.2-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8c/40/7f110782c38739023c43b2644130407a70630754ba260ac9f8c2560fadc7/psycopg2-2.7.2-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/72/21/a8710991d3f14e63d57a7f177b366f51d0b78c6ca511117e34f3b0d78985/psycopg2-2.7.2-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/66/bf/01c838dd5a4a0916f1e12e9c58436b7894d6eeacbc831a297af1220634ca/psycopg2-2.7.2-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/10/86/1ee25f456c0bde2fc3d10365606371676f1e9192dda477dcfbe002c14363/psycopg2-2.7.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/52/f1/57717100bd2e6310744695a7e534b8e4bf3ef4b8be1390ef890b63a09210/psycopg2-2.7.2-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/15/f5/5fc3816bcb146da445d319cc6da14f10d98a486235d0cf13cd267b58603b/psycopg2-2.7.2-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d8/e1/6c21ed723eabc499913c63820bb44dbd4c51fa43d2b50053e133abbac542/psycopg2-2.7.2-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/73/8a/511de5073f97059891c82ffe182fdce503eb1004075e6aa29c7e9d118b24/psycopg2-2.7.2-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a3/9f/5f5c34ba015fc39108bddec730409646dffe5b526569a7be2b7dc4c7ea6d/psycopg2-2.7.2-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ba/f5/f9a2837126931712215752723fd8d4f638042f633954aac5ceabd8d2a6bd/psycopg2-2.7.2-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/92/5e/d64bef77bc548a5a69a5ecabb77efdc6e9c1d06ad9de2950b610cc738dd4/psycopg2-2.7.2-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/67/1b/9dbce0fbbae613f99736f1df657933608a103f54c4ccb0089d6212b81d12/psycopg2-2.7.2-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7d/57/27ed9194f74471f5ec9dfa8dda6dd217451123d4992250dc1dc661f89948/psycopg2-2.7.2-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5c/85/27a409ed64219cf7d63d6b1161c0548100c8bdeb0a6df96612a84592d38f/psycopg2-2.7.2-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/07/6a/99e0bd33a9038865030595485e309af8e64e326cbf796193293f504cb16c/psycopg2-2.7.2-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/87/4a/af2a7a3a08727f5a027cfc6d62b5c99f48fe7718fa872ef7604358d4711d/psycopg2-2.7.2-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ee/46/13957594107cf6ba464c1892f22fb586f55309a8f9843c4e6455456528de/psycopg2-2.7.2-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d4/40/7200494f0a4f923fb11f6542818af3b3f312bad5f34da736303ba738bd4f/psycopg2-2.7.2-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/21/a5/c61e5b7d454964f3164d5a2f187e5bae739bb1e81107871f520b023d1de3/psycopg2-2.7.2-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e8/ad/85a265cacce2b0f2d29659947d75297606f9e31edd456f400d0a26fe619f/psycopg2-2.7.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/95/8f/00ee691cf5ff9d8aa08347b3522a60bccea23d9437a16b82a37db6359aee/psycopg2-2.7.2-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a8/86/a74a78783c826f8a2d7420a2721b7f094da668eaf8b64e3059885f67c15c/psycopg2-2.7.2-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/33/75/56c76923e6fdba389e6a2084c29addcfdb1f1615e3d4ebce6be25717596d/psycopg2-2.7.2-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/98/6e/559bb37e19464f3824505cdcee9c6d11ecd4842538a3fac359da9deb3318/psycopg2-2.7.2-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/65/ac/606164494161d8349804ddddf60da3f4c18cedee38d2cbbe502bf4a0e817/psycopg2-2.7.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e0/d6/c39f57c5f539c05f6b7470386a4975a0d037ac461469b847a20208bd2c94/psycopg2-2.7.2-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d2/5a/6c2fe0b4671c81e7525c737d6600a5c82b7550a5f2dff8a01afb616dbbf4/psycopg2-2.7.2-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f2/fe/23e01d903dfac0336b08b7b91567440e136cf7bfd9bad85aec0c7aaa426f/psycopg2-2.7.2-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/10/e9/af7bfa5f3ca401ff0715a53cd23b79dcc604d13f2763cd839ec14ea2dd7b/psycopg2-2.7.2-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d0/66/61c1b34ea8da8f95d99676e6803ccad83abef3ac90df145b45033696f3d2/psycopg2-2.7.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/8c/bd/477acc9461ac1e32b119c70cb988ee68db8ab4c1b7984499a1522e991e8e/psycopg2-2.7.3-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2e/73/d72d0fcfdca03d3999ed534c35a20d34f290e714ddedd9af784bb40bf86d/psycopg2-2.7.3-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2d/76/9c4768728438f4a6023601bd05899d6df2aed336db1c49098d255dd8aa46/psycopg2-2.7.3-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0e/a2/d94973e0aacbdf3a44717e61855ca97eb3c5311ba5572d21c650640c64c3/psycopg2-2.7.3-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/47/ae/0292bfab3889d8d03a24c74bc934528be5e227ef6fdd90df32ab31fa6b59/psycopg2-2.7.3-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fa/c7/6db20810124710c7bee019703348adc430cb4ab780c33c52317cee3184f6/psycopg2-2.7.3-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d9/ad/a3f67a4accd22c36afb4fb3c0a9b8af69e3c0ad4e2ec05570f88ad887f81/psycopg2-2.7.3-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/23/5c/1af4478f316e62a8ec868615fa9747a5dde1d922d2e1a13ec404f2e1e38c/psycopg2-2.7.3-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0e/24/63dfe0294308febb9d364d760f9643f826ddbfdf30376c7ea17829d3a266/psycopg2-2.7.3-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c1/c5/4bcd596bb95498b3851f21e809143c924c50f334d7eb04950495277b725b/psycopg2-2.7.3-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/24/0e/d7d62943f9b09dbb10e3ae1ab9c6bd67dcc20f4eebe9c1b9ea2eb4d0c44f/psycopg2-2.7.3-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6a/80/5d4a4d085560099fb8a9acd93b5b58bc2011c33da1f9c8ebdb96706f2803/psycopg2-2.7.3-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fb/c1/9bc0f6ddb69e7b7ba227d282b53b4cb99dc20f3b378e85e7dbee6f5a4d75/psycopg2-2.7.3-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/05/ff/2e2dc7eea33aaff84cf63299cef5231f943a9399ae4cd3538cc3daa2ee94/psycopg2-2.7.3-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/84/81/8cf271a1ff2276fac62ecdd5c291cfec195904634a90c41445dcbb2f0abf/psycopg2-2.7.3-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/48/a4/d18eb708602a55f63939524a86a3e018fab0d8307ee1a3010caa54c52a6d/psycopg2-2.7.3-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1e/de/bf0f5d24c073e68821a2a5f4763887769b0a0f4effa0399f855cc60c68f7/psycopg2-2.7.3-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/93/54/78d05449901047b300de1fda9a964411cc48456839038a716f673bededd9/psycopg2-2.7.3-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/33/f1c6df19918a00450dbb4810e0a873ffe17fe2037dd88873630eb7568e92/psycopg2-2.7.3-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/03/5d/297f165e444b8d692b80395c4c5acad3f51933b217ccac352274c8d1ad97/psycopg2-2.7.3-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/98/d0/1b2130e7190f904e0f7acef86f03a2d268e3970490a52ba3e939379570e5/psycopg2-2.7.3-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a1/2e/469722e2d34b0dbdff833a4f0a223e06005fb2a73e5d101e87420648bebd/psycopg2-2.7.3-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1d/2a/ebd4ce574121bfc6a113da6aa776bbec693cd04deed8e03f03c385a2ab32/psycopg2-2.7.3-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/00/6e/334b30c880dfe72774abffad78518285533d85853bcd2af5ad7b4dfb51d6/psycopg2-2.7.3-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/22/9b/43dc658eb97289281e9603afe3b84eba99031733564c014a0b35d8ac6765/psycopg2-2.7.3-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a7/d1/28b5d3f3f71289a2027b3709ef4151bc7a45f1b103f6fe89348111f81689/psycopg2-2.7.3-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ab/33/ac2e1bf00649497eb82b37342fd1640ba707166808ceefe06966e81c2578/psycopg2-2.7.3-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/18/22/47780ed59c2806b8b0e765aad565776d1c0eb7f09502a7640785346bef03/psycopg2-2.7.3-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d5/33/6616525adb88cadcfb3589c39499849d124b64dcfa6334b69f64d8b99371/psycopg2-2.7.3-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a8/fd/829ff33ea3f818f5b034e826a9e7d1f5c05fcea32e5d3f734a8f3a4cf8fd/psycopg2-2.7.3-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/98/99/33ca02c4bc3ed1bd9ceab5614bda2e6d1d31e61ec58345b9feece238c38a/psycopg2-2.7.3.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/06/37/482f7bd821564497fb81841a8869ebeb83cc6f765f9d7d979fb09a2e311a/psycopg2-2.7.3.1-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/86/5e/9903b074e3c09e3e566e9bbeefb660e08c45e817d897526b05f18edc1e61/psycopg2-2.7.3.1-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/96/9a/ba8bc2220fb3a36dd1f8d2562e6c87b624f65efcea7cd7c3c20f29f8cad3/psycopg2-2.7.3.1-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/32/3f/fa18851319e70d4ee3935d2832158d88d85366e232bb4280564635fc6d3d/psycopg2-2.7.3.1-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c8/bc/8c641f6d5d886d210826fe0625ab0ce9bb731a50e264896a05b77a79ebf8/psycopg2-2.7.3.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1a/ac/be5d6bde73b332429f2bdd7eceafa673253600758ddc6e7c75722ca0a20b/psycopg2-2.7.3.1-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/3f/87/3a4568b0f7ffdf32b211a5c16f08ad31815bd505b6abb9006ae8b2412812/psycopg2-2.7.3.1-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/74/23/ad45eec052bcab9004e62cf028189582541c7274a4012aabda1ec4b84c7a/psycopg2-2.7.3.1-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/91/0c/2748bafb709121e537e5dd26d64d0564f99ff5347d572b19a360814fe017/psycopg2-2.7.3.1-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/89/3e/54120d228fa0808fc078c814b1d0f3c1cacda07c115756fbb9ac871e27a5/psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2e/8f/0dcae97762633916470a41b808a59cad7455d06b296f95f18adba606748f/psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6d/28/69cac9dff0e2bfa863edc2c289dc8e4651cd5d3bc90aed0a4877a7af59d2/psycopg2-2.7.3.1-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/68/cc/c8e18585b6a907a341f6e553424d0f8b886c63a6a5d3a7587f22641e558e/psycopg2-2.7.3.1-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8a/75/a6d51f5f76a4d65c851bb4efb6575873bf320dae2c72cfb96738bc679f2d/psycopg2-2.7.3.1-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/31/34/1c56a92982a7ed443455e73d4a23142f523ba5fd6df803f1fd87a7941692/psycopg2-2.7.3.1-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/61/4e/0c6b002179de00fd8aebf6ded404a45dc21ecc360cd101ad605b0aeb7a40/psycopg2-2.7.3.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ca/7e/f29537a442d22596553605f87ae5d1da2f6467b9beb83b894c2289166b71/psycopg2-2.7.3.1-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/2d/08ee1cad880f21cbd46797b4267f6e3979214788705fa8eeaba6328de32f/psycopg2-2.7.3.1-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/11/62/4a4d0ebd94d9c7b9700596034fe6fc94c1220216a6bbe563ce328a924f23/psycopg2-2.7.3.1-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/19/f8/53f229047bbe73af0a3c21008a9d11535c02ceb92a9371a118a34563a555/psycopg2-2.7.3.1-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/c8/9c9ac41bf1100e37700da62cb691be179cb4d120d0bdeb64159c7c86f818/psycopg2-2.7.3.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d8/76/7cf9e21c6697e028e85e4d54fcee21f2afc4c6b1834b13e7a07551738a77/psycopg2-2.7.3.1-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/44/3c/ee27949f3b1db38b515b206e47048142f0bf6ca89b2871edcef58d202b58/psycopg2-2.7.3.1-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d7/0a/1c6a01660d244aab7351606dea38287c67f51c07ca2ce21a7adb0da5be8e/psycopg2-2.7.3.1-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/4c/c1/7f730fb09df5e37dee2d09677806763546ffa1a9cf3b9a37626c54ba2738/psycopg2-2.7.3.1-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ac/3b/bff673f2b9a5fc40231a99e70a13b077a7b9f532e8ab87543010fc000a96/psycopg2-2.7.3.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/eb/462c0feffb78e541e8b3bb76beedca0880960bb560041378e253bfa8d817/psycopg2-2.7.3.1-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/21/44/159fe55329b6b94dd3077080fed6c2f77c0d6b858bc415a5784e9e885235/psycopg2-2.7.3.1-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/3e/20/e5b2326bad5bebbb733d29d2fe05845c7e6865f3c4ef629b333362d21d28/psycopg2-2.7.3.1-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/af/e0/87f4a4e49467e19ab2248c534b73982fb2e3d86b0c2d7232e2ff937c8c4d/psycopg2-2.7.3.1-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6b/fb/15c687eda2f925f0ff59373063fdb408471b4284714a7761daaa65c01f15/psycopg2-2.7.3.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/e2/db/48cae7582bc04b9fc092343d183fc485f21db7fb68f7c834ded3e29d4ec0/psycopg2-2.7.3.2-cp26-cp26m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a7/4a/82ec8b785ab96f7ff0f1029ff5bd962fbf1775a3b57e613800bd6c311ed7/psycopg2-2.7.3.2-cp26-cp26m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5c/13/d413d368ac957fb4932beaf94e9824ff805846ad688b1f92bf0bfb058631/psycopg2-2.7.3.2-cp26-cp26mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/04/3f/09afec2599dd3a81d372040a0c2c7a3e04cff09aa13ed81b94f7b0b3a887/psycopg2-2.7.3.2-cp26-cp26mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/af/143ebd81d5e1fbb6c908c33247e760a6596e1b88366650271ad69ec2d513/psycopg2-2.7.3.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0a/b2/75aa427ae26ff3bbf92c956f329a73c028e8654ecc9f31eafc59634a3536/psycopg2-2.7.3.2-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2a/24/60e5f887385c62e269b2342472c1eeec2fb88f622b0247bb784774b587a4/psycopg2-2.7.3.2-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5b/d7/766a4f60165a0f9cc047199fc46f1bc079053ffb7cec164b46aa1f029e1e/psycopg2-2.7.3.2-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2b/ac/5952dec96e11d8640918de5409fa5f683f11ed6db15d6af96af2f8272752/psycopg2-2.7.3.2-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/eb/5e/1cbb6ad794ec112fb55b2de70c76af9d108212f86fbcd6e9e8826f2b5a9b/psycopg2-2.7.3.2-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cb/d1/253c42d85af6b85a6857b6a414e7230d26a026236e3208c0bd9cb16cc118/psycopg2-2.7.3.2-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8d/3c/d075ed8e82c3bc75b3acabda7acc7b947f6a12a082b3460196a3d844a7ba/psycopg2-2.7.3.2-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/98/84/44ea2121fd1d118c4f00424a439ac96201baf0beb4e601a79835e516892a/psycopg2-2.7.3.2-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fa/51/26e4126bad439465b83de556e4f6f825bb633c5a008e38509af61dad2889/psycopg2-2.7.3.2-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/29/bb/4f6c441e38f7aa76283b70f6280fa5e73d576d91eebc4151cdb490430dc7/psycopg2-2.7.3.2-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b1/f4/9fc4c9ac08d052ec721055c92c5f9bd4b76acc6ee6184386803423edc71f/psycopg2-2.7.3.2-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/70/30/59adfd5a7757c879af533e3d4031e03aaab35c1aa60a0f1e14d80725443e/psycopg2-2.7.3.2-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/4a/91/b34340f466af9320f66c2797e5ecca108667b945335c119c15e744887eee/psycopg2-2.7.3.2-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fc/5f/ec44b52203972cb95381462ec31fd71790b7bc6140b08ed69813604d73da/psycopg2-2.7.3.2-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0c/26/50de12926c12cb44b32bb554ce8393c1baa7f0340479eb5a61a879cfabe0/psycopg2-2.7.3.2-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/05/2e/465cf2b3fe24526fe150ee6e7a5c9de010e346f13fb55d5fa1a91e659ed2/psycopg2-2.7.3.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c8/93/3a908c574487c075c7c62fe53fc21c5037ac82015e46e91a27eddfb4d5d6/psycopg2-2.7.3.2-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a7/4b/ca0763be01bd7084b0cc06c6c83cbcfc0ef8238063bfe6b3e2a974dd0f80/psycopg2-2.7.3.2-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/52/82/6f603e7241a8c5fae2d82529e8e0378b121d1918ebb7df588938aada9556/psycopg2-2.7.3.2-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/60/38/69666d1ea1e0403b79ca31d34896d85b66841f97c4cb4e926fd9662d8ea2/psycopg2-2.7.3.2-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/39/cf/76707dc80505b35482a9a8a24a35e326cd7453dda5dca9ff18df1ec29280/psycopg2-2.7.3.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/57/df/8349946da62c5c978ffb015fe8e55d298c4b8138f0a6ef29037b43d7f162/psycopg2-2.7.3.2-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/29/dc/bf65b06574324222e1a9fd2c80a3acdc0b77d5812ac3d0568dede83d6a50/psycopg2-2.7.3.2-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/72/5d/65f3a8e71e6b00919cdad83b77b7428f0b09babdcd913f0c990e288c2f2b/psycopg2-2.7.3.2-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f4/33/e2bd552008fdb49d063018a373fbd758b03092c743bcdc70b9c749bfc0f9/psycopg2-2.7.3.2-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dd/47/000b405d73ca22980684fd7bd3318690cc03cfa3b2ae1c5b7fff8050b28a/psycopg2-2.7.3.2.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/67/ee/668612acf12fecb8f8a19342517b8c4cf172b7bb9ff9fa1f86e7f95a4757/psycopg2-2.7.4-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/70/07/3ca5755bfef823dbdb1b582b76163ba3cea2a2d7f39eec48f18ad3a2f132/psycopg2-2.7.4-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/75/5c/ee9b236e34ffc595992a08f375a3f907ddb67ee2a59d429f9ea97a8f21b8/psycopg2-2.7.4-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/56/72/1824e1c95891266ce07e424e75355a66c1ea824c40dbe6ef4dd07cb5a933/psycopg2-2.7.4-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/3e/23/0162ee2c8aef91d75b44848a4203bb661207ba7d0ffa594db3968df250c5/psycopg2-2.7.4-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/99/18/5e56ffe76c499733b0bef59952877c21d257508c4165333a36c2f230f7b5/psycopg2-2.7.4-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/c8/7cf31d2fd64b5cfa3f4538ee47f6dac6cfcaf647956e10a0c1617e68248f/psycopg2-2.7.4-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/20/d8/0164450526030b68535db1007bb6080d8eb62cc6be90888740868105909d/psycopg2-2.7.4-cp33-cp33m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b2/5e/5709c7590f5c44a46a64501fe0a8c86fe13f8cd1d9974b804b654d13294e/psycopg2-2.7.4-cp33-cp33m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/fc/e1/198f42b46cd6218ccd8a07c3dcf5a37f5ad9e696ba898f3bde57140768dd/psycopg2-2.7.4-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/26/56/49faf643bea3916dce96d98313a4f60cdf79af3f6d79ff307ca6cbba0f99/psycopg2-2.7.4-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dd/29/fb5e60247714b076ae19d198ce660b5306f218d339c30cf8935299b634d4/psycopg2-2.7.4-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/4d/3e/088b6e6200f54811da33a3bc6bbdd14779a9e88941d5497b344e36ff4e0f/psycopg2-2.7.4-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/09/e3/d24dfd49b79813f3021116383fdd2f0380b8145ca0bfcb15c6a72072b8d3/psycopg2-2.7.4-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2a/b8/dce82ffc6222ab1854a2b91bfdce0e527d451715ee7d85de419981e2bec6/psycopg2-2.7.4-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1d/62/4b817f8546098d036f5eec016b62473644696b7c24ea6bf2545332d90f56/psycopg2-2.7.4-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6b/08/4f3f7982916ada6a1a15fad8ea5279cbaca22d5324b8ad0fb21f31925bd1/psycopg2-2.7.4-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cb/3e/39f98d73666bb6790567404141ba7eea82d7e61ba2ac44c6b1a2ca1e3ae8/psycopg2-2.7.4-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8a/86/97879021d5ca2e069ade58eb55da01a2ade6507bb31f565914f4df10a444/psycopg2-2.7.4-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ca/ab/49f8ebecd7d03084215c5e63ad36f14e981872809cad4e64aa27271ce1c9/psycopg2-2.7.4-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f8/b2/b02bbede43cf45844f3303dd9fdf5c8720ca04f811b07ec7489e0be42467/psycopg2-2.7.4-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8c/a5/0e61d6f4a140a6e06a9ba40266c4b49123d834f1f97fe9a5ae0b6e45112b/psycopg2-2.7.4-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/25/7e/eb6d6b1b5e99440def358f45f852f5ac62d26c59fef043770c1d7404c402/psycopg2-2.7.4-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/92/15/92b5c363243376ce9cb879bbec561bba196694eb663a6937b4cb967e230e/psycopg2-2.7.4-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/00/95/4c5d19affca312e1c06d4f88241ebc564bf5269addd191ec4962f0c93553/psycopg2-2.7.4-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f9/77/e29b792740ddec37a2d49431efa6c707cf3869c0cc7f28c7411bb6e96d91/psycopg2-2.7.4-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/19/ff/1a951684fc655767327a95f632a6c806b7ac24d239a04663a8e6bfef898c/psycopg2-2.7.5-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b5/b2/6d2500401196a5dd7a1f513d96775d9cb6036d5896bf3c86d91f80b95f49/psycopg2-2.7.5-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/82/3b/d917c4765ad5ff71dc863a238b870e4268d9d7f842ff09abbf6315953d90/psycopg2-2.7.5-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/76/a1/7ee6084ca8a98802b1bf91edfd69b688163a37c487a11e8aca582ddde59b/psycopg2-2.7.5-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c5/8e/8953744335a1e6863194b84387deeb5240100fe9977345d08ffbabab9dfa/psycopg2-2.7.5-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/71/db/0729d4e514fd0be12f9b8133ce815977326210379a0d9284834340ad9e6f/psycopg2-2.7.5-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/e6/d5161798a5e8900f24216cb730f2c2be5e4758a80d35c8588306831c0c99/psycopg2-2.7.5-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a6/b6/033ef03e87324b2d932d3cfba7473c2b381a352510eb7a3c3a37a55cbb2f/psycopg2-2.7.5-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/71/1f/e17d816a40a7adb1bcdc76846f86d26f466ed88fd2a0685b5126fd6be610/psycopg2-2.7.5-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/26/40/20ed2422fda186d78ae553b571045398be07e0c1c92b33ea8670fe5f1f8b/psycopg2-2.7.5-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a0/93/447c4caf0cfc789080478d80b7d2281823b4cb589c27943fe112b05b291f/psycopg2-2.7.5-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/74/ce/b032c5cb1ba7791066523a215600fae5e6dd759e8d1d9c458e43ba2c377c/psycopg2-2.7.5-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ee/44/978b38abc393c41798292fb52fef20478b5852e6df67ca52aaf511a116fa/psycopg2-2.7.5-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/42/77/40738fd650ff9fec66f0b7aadb7d355ead74c783ed242a6c054fc32d1bf6/psycopg2-2.7.5-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dd/f5/7177642e146d8df6b727bb440a9de3917635733b301a1e8eacc274631804/psycopg2-2.7.5-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/00/a4/ad27379651989735cec92d30ffd8d0c64a7fdb271276dbc7ccfb44969212/psycopg2-2.7.5-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/53/fc/dfc645d6b89cbc288b0d7b8bc9e83b8052ef263781562a89ec748e8ae008/psycopg2-2.7.5-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/67/87/507206d1ef16e6a959892823a1e94a956d977338b3b589182c53d48c7b3e/psycopg2-2.7.5-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/95/fb/12d4d39b08508cf002b2760c3ff9c01c28ab1985b6061462a08c8f6e9d40/psycopg2-2.7.5-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d0/dc/e9d17df9c66eb76b3ea997498a82291e19947e4733155b792de5ee684689/psycopg2-2.7.5-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a5/c7/cfeb6df15f52ee52c58d60686000230b4ba0656984f208731516400f9351/psycopg2-2.7.5-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5e/d0/9e2b3ed43001ebed45caf56d5bb9d44ed3ebd68e12b87845bfa7bcd46250/psycopg2-2.7.5-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9a/fe/4121591f1e3a0c1f1cb63feae6d5eb8c0d0bd85acccb9df0fcb088f071db/psycopg2-2.7.5-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/8c/fa1ede14d6687c6dd042ce9193f7dea8d76500cbb959fd053f99bcf691de/psycopg2-2.7.5-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5a/c9/ae5f8c10f33127164d083baaab5ccfb5b04b48226d2c7102d60b66dfb80c/psycopg2-2.7.5-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/be/5a/a8783ec97a9dde786008db2992f000f92fffe0ce0f428c31a9036f19fffe/psycopg2-2.7.5-cp37-cp37m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/88/40748331bf75d068a07bbea7dc658faceb0ce2e9fffdde550e76d5475e59/psycopg2-2.7.5-cp37-cp37m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/12/89/9bbcc4ab312be0e32abd268512fce75f13a015c4c6a6340b600d168f0dbd/psycopg2-2.7.5-cp37-cp37m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f1/2f/1f56ed6a899d911dc9c022e7ebf25cc0d7619d62a678a66bddddd7796b03/psycopg2-2.7.5-cp37-cp37m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/83/9f/113881586319c7f03e4a66378920cd123aac67ac8d7f8a9e215d9336e0ab/psycopg2-2.7.6-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/6d/8a/5fb5ce64c8825c9a9320b3e3d68e6b06905d9b5575977266964720eca984/psycopg2-2.7.6-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/09/4a/ad0b9813d5057f7e7afed4235a3a0c0cf031d09cf0439e0ccf959a9ea360/psycopg2-2.7.6-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8f/48/3ff493f67ddb40d1cb02f24d9ec6bb88e97dd09b8b380269f71f26397f09/psycopg2-2.7.6-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/45/97/ee5b87d90d9a0aa84d61237a6895c1e66b33111399f7517690497561b349/psycopg2-2.7.6-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/57/6d/fb25ef7658fa5200787adb2f276ae5e96a81d14719b462d065ec41c7b09e/psycopg2-2.7.6-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e3/62/6633cdcd06354942ee69af8ff97c93fc01de38147569f4b37a9c1cdec8b4/psycopg2-2.7.6-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/93/36/084146e1c13d17764a321678502398fee7921352334fa7c69da2c0bbe562/psycopg2-2.7.6-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1f/db/6ce10af54eff97d442ba1e07bdc084cd1a1d6b77b2d82c40abb2bd21a83d/psycopg2-2.7.6-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8e/42/28f27622938d7cbf4893ca73f7d11f7596b965a3be1197e82fe18c1232c9/psycopg2-2.7.6-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e7/73/1b3c18f575f11dcbe4ea10418e8dc88a1a76f2e32719e745018e431704d4/psycopg2-2.7.6-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e4/52/689e9a8704f8e14a527b5f532606febb8235f32d60d9f31a3d48492afbd8/psycopg2-2.7.6-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dc/c0/24efa144d2f17a61a00ac3fa7051e5e660a45f15fc172a24530776714833/psycopg2-2.7.6-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e2/d6/b6e57795b6ead5802901d87615975d705691067044a08c87aa0b4ba566d2/psycopg2-2.7.6-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cb/79/8ddb4222927e3bd2a4bf6b7e065a6f7f35aab72aae776a5ff1c465aafc28/psycopg2-2.7.6-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a1/60/97490c3c40892927487ef89b14db74934e86aa981286ff64baf88dee6bce/psycopg2-2.7.6-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/06/49/d3a46638f47aa57dc3ffae61a596d2e96852a689e7af17309215b1074dc5/psycopg2-2.7.6-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9b/bf/61018bc2626da1e0b8f0214f3e70367d60fb1c11452c5ca03d48f713d088/psycopg2-2.7.6-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/5d/34/ed435fd39b306021d93ddd3a23c66ff721a77a9aa7f75856f0c1bb7c1c84/psycopg2-2.7.6-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/27/2a/cc6db613ec185ab504a75669704ea2f5a212bfe6bf76695d250642604a35/psycopg2-2.7.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0f/b3/c6d5dc8cfd037243383181289ffc1721633e1cd7678a45b42bcbb6990847/psycopg2-2.7.6-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/57/b3/14686fc09abf13be0f98881c9784e02390a7814dfa3922781693fd5335f3/psycopg2-2.7.6-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/30/54/840a8217275569d3ed7201f17de0c055edaecacbbf4fe57d73c3bb347b12/psycopg2-2.7.6-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/98/da/ad1dd10f0c3e72c2404bc0f7ca4cdd48d814916d4dafb9ffa89a8b9462c9/psycopg2-2.7.6-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e6/ea/9e40d5c459c840b82d508c5ebc080de94d1d1f95f5fa0d3a441d25e094f8/psycopg2-2.7.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/30/73/8c25be0b006cab1119627bbfee1d0b98d018a21bfb78c3a5fb68a260290a/psycopg2-2.7.6-cp37-cp37m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/db/82/c45d4bc8897f9dc31f115f626c0ef0553b21bea5739e49c78e0ffacd65e6/psycopg2-2.7.6-cp37-cp37m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cc/a1/b675ac48c508b40bd8ecb4cba8f6182318c6923a8d8cbba1fc2e525929d3/psycopg2-2.7.6-cp37-cp37m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a1/44/7c5ae5386d50a3c37ab8ec7e1044af96f11456f39f40f1d923b82fd124cf/psycopg2-2.7.6-cp37-cp37m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/94/09/2f1fae36d83e2315b90ee91738d01baf8af8c945726bf4b4708fcec3256d/psycopg2-2.7.6.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/5c/c1/5e70da7f3ce144c5366e12d8b9c4d8659e803d03c8ec5057cb2eb0ee8077/psycopg2-2.7.6.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/22/9d/71ec24bdcc53b89aa01beec1e998cf99e678c4773ee049f8fed81c6aa7f4/psycopg2-2.7.6.1-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/34/a5/39f47ab93f85751def5814a8774470fee6e7a2f97fbfd3e685d53c9fbcf1/psycopg2-2.7.6.1-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cc/f9/01a42d11ff0977efaf7a575a2e3c7e2a70372e2a9ff36e9a6ec1c5f812d6/psycopg2-2.7.6.1-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/4e/8c/28a0cbce2af43bb0f0a1864c0efc4deb531fcd82bb457520e7f53b22efe0/psycopg2-2.7.6.1-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f6/43/6fcd2d6d71319f36e7abb1422847690967a9521ad1431cdc5667f4e38ebc/psycopg2-2.7.6.1-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ea/fb/d56c904a0cfc004f2e47bdfa104401924b6b8ce70cf01f8cd7b7c4499104/psycopg2-2.7.6.1-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/bd/d2/b5a6f6a4f4bc65e80d4247ce93c979e15a104ebc2b3891cd7c4e4889ca51/psycopg2-2.7.6.1-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/8f/ab/767721e76b8916b6264d42e8571b18f7dee1ecf9a8a5771935ae01374051/psycopg2-2.7.6.1-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/94/dd/cee42542cd652cefe2cdad78f972b210468de207c7a14bb270fc02c638f2/psycopg2-2.7.6.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0c/a6/73b7c91cbcc8e836bb2dae3c28d192a9009f793842330fdff2e17ee63190/psycopg2-2.7.6.1-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/bf/72/15f8d30eed55d985948aa9f7fa66915111a7aa671954131f250d02e680a2/psycopg2-2.7.6.1-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1c/24/88741bae3f6b0ca63284b2fc5b23e0425c5c81bf398910230f8a431fa3bd/psycopg2-2.7.6.1-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ca/92/d6eab7dc1d541f19a97fdd161502d85f28cde41e81a3c269fe01a9cd798a/psycopg2-2.7.6.1-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/21/a1/dbf8158f2ae575b2cf149ab5de4129d5a928d2846da54e667d3580704af2/psycopg2-2.7.6.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/d0/da/e1b745cc874f15d67427354a058fc8bcf1453aa8f17bc6464a03a5ed2e28/psycopg2-2.7.6.1-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2d/fd/a02208785ced497f4412ab77e2d5b07386adcd4517b7c37e14990bcaf949/psycopg2-2.7.6.1-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/7c/84/2fa38beb262f84539e429f2c45688f912b2c1200668a06cf9e1e790e96f8/psycopg2-2.7.6.1-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/43/a2/78344d1fdd5a722bea5144b07da3f9caf4cd7adf645d17bb389cd135ef0d/psycopg2-2.7.6.1-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a8/43/61f34c4d91370d239916f7f0fb989d841b9cfe70cd1e16b62c880cea093f/psycopg2-2.7.6.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1d/43/e1f50e17d4c9cd4817cbc9f5eada1410fa623f45e45404dc4504dc69bcf4/psycopg2-2.7.6.1-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/bc/2a/61a8f9719bd6df5b421abd91740cb0595fc3c17b28eaf89fe4f144472ca6/psycopg2-2.7.6.1-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0c/bf/b1d4af70436a974f3012a7ab33b48c357c5afb62a1c27df1bdc807317323/psycopg2-2.7.6.1-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f0/a8/70d934de23e70c68d233ff404f918aba309c43d35be0b25c5cb722eb844c/psycopg2-2.7.6.1-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ff/db/942f8e40e93b5fe060c8d3a736d8fdd134fa5308dba8484dc06ae46e3fbd/psycopg2-2.7.6.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/1b/c2/6d65fd8f26445974311efcc759d006f5ee704362a7af16598607b2962db1/psycopg2-2.7.6.1-cp37-cp37m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/90/aa/b033c170c9bd505c7e4d1560f5dbb35ca2a7e928ac03c384f93d0cdaf6a7/psycopg2-2.7.6.1-cp37-cp37m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/86/e9/3165d3f4023d9c91a116286bdba0aa2bdde72e787acf6161f4929d9fb626/psycopg2-2.7.6.1-cp37-cp37m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/12/c0/ddd4b3bde5b8012e262c5dcac570aac5cd934c643641f924fd10e3c7b27f/psycopg2-2.7.6.1-cp37-cp37m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/c0/07/93573b97ed61b6fb907c8439bf58f09957564cf7c39612cef36c547e68c6/psycopg2-2.7.6.1.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/c2/a0/ba2c28c13bce130f971158da8fc03c231ce7778a89935eb1c3e3e6437e7c/psycopg2-2.7.7-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/eb/76/c55b861902e49692f0f2b6482dd86abd0c8e6e32a538d4de31249f163282/psycopg2-2.7.7-cp27-cp27m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b1/8c/128c4f933caa12bdb91b5cb2e1244825b8e2f6575640261e556bbf2921a7/psycopg2-2.7.7-cp27-cp27m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/16/2a/4bce365a50d8593eba4cb1962d0019b04d1c29a60e5b3201c9946d2419cb/psycopg2-2.7.7-cp27-cp27m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2b/ff/13765546d50e17963570bc0e7e3ebf4bad44d18810d00ecb8e125bdfdd5b/psycopg2-2.7.7-cp27-cp27m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/71/1f/0fbc4586af279307a2d64381f33ed8df60b48aec6df07bd4e71e174629aa/psycopg2-2.7.7-cp27-cp27mu-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/51/89/7490c48abf2ea89b65140c3c77023f7ea623031389a8e0cd0788c1625b06/psycopg2-2.7.7-cp27-cp27mu-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/f8/db/0ced509cc969074fb469fdeca3801e494c1e8d80f98d482b7c47b5b06d22/psycopg2-2.7.7-cp33-cp33m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/74/9e/7f3e975de7a588ddbfbc33cea0525f965ad31a0a4fe6250506142187e126/psycopg2-2.7.7-cp33-cp33m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/a1/2a/f2374370ac4b9c4cf19c31eb703b9bdf4a3171b59d7036fe268c50eef5ee/psycopg2-2.7.7-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/cd/ef/c543661f0b545b8c1f7469ea40e11c41ec72da9e2f502b695bee297afd51/psycopg2-2.7.7-cp34-cp34m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/bf/9d/94563ffbad279f49f35b137c78449b478842e81e77492139f0cff08908ba/psycopg2-2.7.7-cp34-cp34m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/b4/bb/21176a4087fd0d07122775f58e0d31dd2b8af3d0e65c8390034859b8cb28/psycopg2-2.7.7-cp34-cp34m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9d/06/7b1c872303323e8d4024c880283fe1240a79dc163b9c175d0a9439c8ac2b/psycopg2-2.7.7-cp34-cp34m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/73/dd/1f4687b9a075d0488fa34f7471bc8c1c51758f2ab43d2151dda715df69c9/psycopg2-2.7.7-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/9c/60/7d0411d16d7f70e572d8122f4093857bcc8ac277cb39481aa0a9b5fad098/psycopg2-2.7.7-cp35-cp35m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/e2/ed/1c022748aee0d93a6c123c0739990b0ab32744314bc0752511106613b021/psycopg2-2.7.7-cp35-cp35m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/76/ae2febaa4473ccb3151381de5921968d0c0e251d8e8c6512ae63e1d87f06/psycopg2-2.7.7-cp35-cp35m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/88/6c/b04a134e983bc86e0d6cae9bc71104390a3bdbf0121990e28aa3f46b2c61/psycopg2-2.7.7-cp35-cp35m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/55/94/2e5f88ee63329196da39f1056595b7aa78f6e321f5c832c7946522c4f080/psycopg2-2.7.7-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/dd/e9/9abec7778215d25cc2deeae9a8c01f80d95e6c3a993ed04209576a01b784/psycopg2-2.7.7-cp36-cp36m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/37/25/53e8398975aa3323de46a5cc2745aeb4c9db11352ca905d3a15c53b6a816/psycopg2-2.7.7-cp36-cp36m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/4d/cc/a7f0e5f99a8c728fc69ce5f3af427351ba7f8a2b8d0c3283e3d40005a917/psycopg2-2.7.7-cp36-cp36m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/55/ee/bdf568adf30d125dfe638f16fa73675a5c588e180807eef1062adeb46eb2/psycopg2-2.7.7-cp36-cp36m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/af/b3/de7bf74e7692a5abd1de80d2a3a898bd4a2098630c3bf0c938318f149e5b/psycopg2-2.7.7-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/2c/31/1ad19729ec5ec6ce1f9347fdd2f422934f097af19545ee6196353bed369a/psycopg2-2.7.7-cp37-cp37m-manylinux1_i686.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/0c/ba/e521b9dfae78dc88d3e88be99c8d6f8737a69b65114c5e4979ca1209c99f/psycopg2-2.7.7-cp37-cp37m-manylinux1_x86_64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/ef/1e/285988e6a81ef6f001ce1ce0a523baa85c1c75a97c21a395a2bfa27a1605/psycopg2-2.7.7-cp37-cp37m-win32.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/40/30/b336d6ac72f91234cd6e2ec12e87c4a2d940112eda994a3f103faae26c15/psycopg2-2.7.7-cp37-cp37m-win_amd64.whl", + null + ], + [ + "https://files.pythonhosted.org/packages/63/54/c039eb0f46f9a9406b59a638415c2012ad7be9b4b97bfddb1f48c280df3a/psycopg2-2.7.7.tar.gz", + null + ], + [ + "https://files.pythonhosted.org/packages/49/4c/720abc4b5eb1ea049bc296fcad63de3ca0e612be54e82ea7a6c0850f3181/psycopg2-2.8-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/ad/4f/01dadaf523a044e80e51b3876e5a54e2a8dec293d1d80dd12279a11cc726/psycopg2-2.8-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/4c/ad/c6acf5a2594397b9817034dd35d01a7aebb3cd3863c73a08c862b2c4d08f/psycopg2-2.8-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/97/69/e639cb67fe97f88c1dd7cb04b2baf1c97d0ad3df27eb8b3427168dcb1235/psycopg2-2.8-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/ef/04/255084b61a96e312101770378a68c63f664b68f65e8285d02a40f653d318/psycopg2-2.8-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/f9/a3/ea368ba5ff69fddf6a056fd2bdc1fb604c7787c865d888194f178a8040ea/psycopg2-2.8-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e8/1a/05b47086fefbfc9b26358eec40468177082e7dcd793aed7aa8b2df7707b6/psycopg2-2.8-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/d4/11/6c1ed50a1ea955d7c42a673b7f658459a76f4e58b96c6984ab4b2a5e5111/psycopg2-2.8-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/07/61/d67e55269fba553efd6af89c7c2eea7fd97a472aa1708751108e3419715d/psycopg2-2.8-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/58/aa/57a5c0dbc12fdd6c8b1059c2bf504ac1d7db7c517c41352e14c32149be10/psycopg2-2.8-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/c7/ca/75236b17f1b951950ffc55d657c5aa408d3d0327a1b6c4c0f7cb16ef7e7b/psycopg2-2.8.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/98/95/f83b00d528c3a63e3cc4ce1fc78abe082caa2ef8963cb5d832145a41fb45/psycopg2-2.8.1-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/0c/69/3db8183421415a2d665e63a9b0ff8fbb8ad295c5646e0b31ede1f9ef57bd/psycopg2-2.8.1-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e0/be/352ff3f580a58bb744bf1c73bf73451168bba3a96bd70c83146cee9ce768/psycopg2-2.8.1-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e4/57/e6805e39af20260df058c7f7fece34685cc67367c8aca8fef3e59d499743/psycopg2-2.8.1-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/73/fb/ebba9026a7d34b2365582da682ada099a5662e5ab2ed4ac7d78d0216b519/psycopg2-2.8.1-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/b4/9f/c4518ecba7644c7582a5be89b2f64ac281c0d4bc6795ddfce07f5f1fe4c0/psycopg2-2.8.1-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/2e/de/343185c41af149dec3ef9f51ab282c4a142a26466891af39717d2575e65f/psycopg2-2.8.1-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/1b/cc/3fff8c75d882a50955311eaac9040615b7e699de3b9b8e45730ca653ce3b/psycopg2-2.8.1-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/9b/a9/fc9b0544135f219ae86f09dcd1ce8135c2f3aa7567a7b983e153c58bbf2d/psycopg2-2.8.1-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/a8/24/2fa013100f7983b8e5a311a5b8f67194761e86318d7e92b4edf17b84c225/psycopg2-2.8.1-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/52/be/f898e712f5f08131d651a62754fca82a1deb42e4e9889ad01932f770a2be/psycopg2-2.8.1.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/31/8d/0930a7fa14ff33d77f4b2a8771827c29b2775267f0ba498c697531d984e9/psycopg2-2.8.2-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/bb/92/b2316384cb2f194628b21cad5c185f09ec98777bad7bed3c1c8bb784959e/psycopg2-2.8.2-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/b4/26/dc220b8892f403d7fc3f0f8eb8094d0b482d6f127d16a06cf54a7073e1a6/psycopg2-2.8.2-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/5f/ee/d59b44d4ae8d8fbaad72843c6c8a2bb7f74004a2c5a3cf5afea75a9ff168/psycopg2-2.8.2-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/0d/da/853afebfd0ecaea88858b385a84b821ef031dc8c0b9f7cf8f8bec72bab98/psycopg2-2.8.2-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/fe/b5/ed2c89e94762cddbf0ddd94878c65e0809ec68df84c1fc5956a5aeb1eb87/psycopg2-2.8.2-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/df/03/ea164ef9d64c738bd84999a1a9cdeb4c138e923e8da56358bbe75c80d0bf/psycopg2-2.8.2-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/f3/35/1606d866014b4f9a2da2f57f5537b62d67ad3ef79842e61e474a9c7585d2/psycopg2-2.8.2-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/00/f3/afd8570a32712953c83e6ba2d3ce3c7cfaa6eeeebf8879da14731445b793/psycopg2-2.8.2-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/3e/91/2e9221309c4507a99048c76ce97b6daafe7ff507d8df0b66dbb8e94685b9/psycopg2-2.8.2-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/23/7e/93c325482c328619870b6cd09370f6dbe1148283daca65115cd63642e60f/psycopg2-2.8.2.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/2b/c7/8875bbe479ddd6f55764ba243abc4c348ee0924a90a48a6abe7620b2cb61/psycopg2-2.8.3-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/c7/67/6e6cc1ff49dc4a782b816f9f28904939dec5c97a4691d2b664d469c6772c/psycopg2-2.8.3-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/05/e9/1ca624f39b7264886c448651747671606c3331aee1d0185bd5452126c617/psycopg2-2.8.3-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/61/4e/9fe96e616730954dfc87d8d1f52cbe3e458484cbe7ac34f52cfec9da7c1c/psycopg2-2.8.3-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/fe/06/cbc1c1cf8704bdd1cf9e338c5740f58918992d89b42ad832feb5197666fd/psycopg2-2.8.3-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/1f/ee/5728d5bb8bf85e3c5f1dfacb8ebdd98119f8c0c61a4c4d4ed88cd7bd5210/psycopg2-2.8.3-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/68/f8/e11270d59030163fb849b0de8ead6d2ba380990491e77998dfd3d69663e0/psycopg2-2.8.3-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/b2/85/a8ea3d7d7d3ee07aa30c5d8d098022ed17fdba8d360c42d46069d72c9500/psycopg2-2.8.3-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/69/21/57e12f1c47d8a540e502f098f5ab5d54db099c95fbaa5791239ac4e8a86f/psycopg2-2.8.3-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/3b/b4/b6db75663e1c73bb6190cbcbb02f94a36c574b813a353446087cbdf43712/psycopg2-2.8.3-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/60/d2/c3a1b2a4da1dcb9e4884abdc6ef64dfb3d142600bf344ac2b1ea8115d5ab/psycopg2-2.8.4-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/65/af/b92009fe794af5753737cbd63190b174751c4b2220aa15f6d25939430480/psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/b1/d2/b61da4bfe058073ecf272bcbed08ab444c7a10465b6f700ab96b23ad5447/psycopg2-2.8.4-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/46/29/110f5328be7ea0a4fb61f6542c510d779abdb29040aca47749456193adf6/psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/6b/d1/47ff82871866a2a5e4ae22d905afc3df0d7992aba85f3c583affebc238ea/psycopg2-2.8.4-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/ac/1d/52662e81398f3affd71f683ab49351c7caf9415aede762f514d664766d5d/psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/d1/c0/89266a88ae31c3f61da761a2251560cdfa6fb627a7a33a8414a0786ae956/psycopg2-2.8.4-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/4a/d9/467aba4b587f97e4047b9ae8609f22dc01eea56eda92358089db89b729ef/psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e3/d1/4bdda027f2ad83189915e340d3ac01a589424d1b554809046b42d406a375/psycopg2-2.8.4-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/1a/85/853f11abfccfd581b099e5ae5f2dd807cc2919745b13d14e565022fd821c/psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/79/ad/327e9c1e09b91e57294eb9a38492fcb000f15c028a1b716714fee5be802e/psycopg2-2.8.4-cp38-cp38-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/5f/00/c2f699fd5848ffaf30affc82c5dc8966dd783eac58af70045aecf0facf13/psycopg2-2.8.4-cp38-cp38-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/84/d7/6a93c99b5ba4d4d22daa3928b983cec66df4536ca50b22ce5dcac65e4e71/psycopg2-2.8.4.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/15/f2/7f862048892db0c551b77f229cd9b8f752ac8b1442c646a3ba57bb2dff53/psycopg2-2.8.5-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e2/54/f9f0fcdade949bd08d56f86a4df4aa89fd09c3c865545ceaf9534eca0cfd/psycopg2-2.8.5-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/27/3c/be3f0aec408f29937f9f5575e58f2fd74cbf20204cdf06fe895a8f7a35f4/psycopg2-2.8.5-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/2b/df/062c84ce7fd1b3329b9b32dceb871d0972395b574e0f99852c3a95fd040c/psycopg2-2.8.5-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/c2/67/52d099cf3be9058c3f3221ef2263fff74aa25acf594a19f32186db3baaf2/psycopg2-2.8.5-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/31/54/4e0fad4eb8261cea2868d1e939713f41229862b2466c8179253127ba809a/psycopg2-2.8.5-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/5b/a8/b8278b6481687d08dea10bb743614ecfde1ee8c3afa0d03a4212f69559b5/psycopg2-2.8.5-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/fe/02/97368ac2fb122e576bd815508df4af9c5d6e10b2c92de4753fbfebd6575c/psycopg2-2.8.5-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/a1/f1/4698a5c036d2cda46981eb74b36bc6afd3c77e7904b2645a70bd849f99d9/psycopg2-2.8.5-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/83/8d/bbb2ca983f3939066e8d104fe7a7b0fce1fd3d0f706ddb6d8a86bb33f5da/psycopg2-2.8.5-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/0c/b6/59c9f4f8e470247776a97cc54fa7c6f34a63b6c32ed13721499b7e79cbcd/psycopg2-2.8.5-cp38-cp38-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/ee/b5/119d1ec416f1904129807478e6a20d9f1b45896bd06d1e436c04b5809ab6/psycopg2-2.8.5-cp38-cp38-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/a8/8f/1c5690eebf148d1d1554fc00ccf9101e134636553dbb75bdfef4f85d7647/psycopg2-2.8.5.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/f4/1f/ca233a88530fb2ad7b6fa291765a55ec9fb7573c454f576e55ac232b0252/psycopg2-2.8.6-cp27-cp27m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/bc/c1/0bf0150848f600be3839b1ea01b037d6355e191486f04c6f3af4e75d1b38/psycopg2-2.8.6-cp27-cp27m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/d5/14/cf8f9edb6aa1a7eea9587ee446276974b3096b5abed63e28323ede746397/psycopg2-2.8.6-cp34-cp34m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/ec/c0/72786579c3d8e87b9b602c32c633c36dc20e346bddbcc506b1085513f8f8/psycopg2-2.8.6-cp34-cp34m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/90/24/53f39fde488210c09869ac6bade7cfefa982fe542197716b190bac826733/psycopg2-2.8.6-cp35-cp35m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e3/a8/aa3d862173bfcc2f7d4a00516c293bc1c660933b35909c4373025636f508/psycopg2-2.8.6-cp35-cp35m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/9f/6f/ec0689612a630f2b34c734c3d8db40f9a385898dec14f49306ed73c2ecd5/psycopg2-2.8.6-cp36-cp36m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/fd/09/b6c3e8442db0342629d1c95e9c451d7ee0920f6c1152edcc0d4bd0ee7ade/psycopg2-2.8.6-cp36-cp36m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/e4/08/c0ad8002f69d4d31a656ed1a865f6cc6b3b781f03b6525455e3a79281a94/psycopg2-2.8.6-cp37-cp37m-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/44/1f/a6ae3527568bb9a3d49339beb630ede2dcb345c88cc3cdc2a6dfbb78110e/psycopg2-2.8.6-cp37-cp37m-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/6f/8f/89b52c494dfb7f4f4c251e310b78b49f204ce0386f28316a92413e0e60bf/psycopg2-2.8.6-cp38-cp38-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/18/35/4be44fc779e8c8a7aedc4b19bf91dcd476edabd471b4d7c82f216b5ba271/psycopg2-2.8.6-cp38-cp38-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/00/13/ce81fc492fb61f33e2dd247e638c4c8a2187c58864e61a04de8496429e6e/psycopg2-2.8.6-cp39-cp39-win32.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/d6/eb/ba556d3d642fedf220e2e7e4f16085d6f1f0363a1670fc4b72a26f497c5c/psycopg2-2.8.6-cp39-cp39-win_amd64.whl", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/fd/ae/98cb7a0cbb1d748ee547b058b14604bd0e9bf285a8e0cc5d148f8a8a952e/psycopg2-2.8.6.tar.gz", + ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" + ], + [ + "https://files.pythonhosted.org/packages/25/50/2dc3e459b7e96d92173f49b6de52016874133794ddceeb263ab46448d344/psycopg2-2.9-cp36-cp36m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/94/02/2c7004959ed4ec2c40acae409b42cb1c4ff982e34356f017489ecfb1b087/psycopg2-2.9-cp36-cp36m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/6a/97/a1f8343aa6363cee8f39503ad705cd16ea46445bcdc4a75433fadc7f062d/psycopg2-2.9-cp37-cp37m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/81/12/1b8730ac40fe00df8d05c01041f92a218930b061291c1255fde719f8da11/psycopg2-2.9-cp37-cp37m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/4f/c6/6eb71bf334a6f97e68b6ca16633cad1f46accf0be428db264efb2c57f878/psycopg2-2.9-cp38-cp38-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/d1/a1/756fcd30d06a3b013033104fd9ac0e64bf0658c40c0630e23560dd732160/psycopg2-2.9-cp38-cp38-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/65/00/7417e52499a1c3b5f5755a29e0cf6eb0851543366504ad6731825478fedf/psycopg2-2.9-cp39-cp39-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/fb/a1/a973f7b7498577a5243ab568776dbb8627724808779080295fde4ed066bc/psycopg2-2.9-cp39-cp39-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/6c/79/6df8af2405e2aa60732c47757453fc7fa4af5c90a1796b3392ef892d3a52/psycopg2-2.9.tar.gz", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/9d/ee/69cf31cf460b10ff3b9bfab87d5125bfecd77b1af4732b59c55d2e4666f3/psycopg2-2.9.1-cp310-cp310-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/db/0b/d77e1d1d39fafecbfa4c6c17e8f011076650bd6911925256978b7976a22e/psycopg2-2.9.1-cp310-cp310-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/13/d8/cdd0ed4a72d4283963b148bf719b939bd5550a8e94a22fc7593a857e6bea/psycopg2-2.9.1-cp36-cp36m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/d4/ab/c7cbb9aa73e3623a27e5c7762cf4a1ca6570b9c862aeb1b36ef5b9f17c68/psycopg2-2.9.1-cp36-cp36m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/c6/ae/3b17e2761abbe9832f220ca9f7d46d8072eb2407ac183efee4d69f8a83af/psycopg2-2.9.1-cp37-cp37m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/75/4a/3d5781fa2669851b756eab27d94c1c0d90bbdb2a40050dff0a993daf2c2c/psycopg2-2.9.1-cp37-cp37m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/58/24/c2b3cf300964e9f37349932364c0b00e3bb3613c7e14f05240b7eb38e278/psycopg2-2.9.1-cp38-cp38-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/71/72/5f9d608c0aa120f8ea21cac9bd4e9f5bd515444ab96af98bea47ffcd8c20/psycopg2-2.9.1-cp38-cp38-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/59/31/8f1e22dd2eb287fa48269763c902355552ee9b48ff606fab4683ed3e6e2c/psycopg2-2.9.1-cp39-cp39-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/f8/e0/d56285697799cc754fcfc42ed0d690b48cce67add623acce84b61b20f01a/psycopg2-2.9.1-cp39-cp39-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/aa/8a/7c80e7e44fb1b4277e89bd9ca509aefdd4dd1b2c547c6f293afe9f7ffd04/psycopg2-2.9.1.tar.gz", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/6f/47/a4c4f503a0b74e80747cdf769cc5df1d147eb945c6072c9359b8fdd7efa7/psycopg2-2.9.2-cp310-cp310-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/0c/ef/118fa3db352a1fe05b66b2ffda041817caa258a1af223a8cb8a2bf51d565/psycopg2-2.9.2-cp310-cp310-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/58/a2/4755d91ab657502ff4e2393ebc4a07ed2dbe15ead90ead4a1af2adc9a0d4/psycopg2-2.9.2-cp36-cp36m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/04/be/a3e919cf8ccf6258d70d8999acf178a980c3cd2cfa896f5466c9746ca441/psycopg2-2.9.2-cp36-cp36m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/85/c3/18898553fcd5a31aa38f3b8797d6697774a9913934ae49665cc9ecf0821f/psycopg2-2.9.2-cp37-cp37m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/37/24/3a05a64817bf33b333eed564d96e272a005e0e019d6287a38e6938b358e8/psycopg2-2.9.2-cp37-cp37m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/1d/83/cc07e4c889449bc385828bf0c540557bccf61554b31950d441b4ba902214/psycopg2-2.9.2-cp38-cp38-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/b9/44/01b2c2503607ad4e2885aa817e8b492aa7e538a4d33ea250504fae30f9aa/psycopg2-2.9.2-cp38-cp38-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/ed/69/beb6a64cf5f11209a950efa957427e6ca85e6e7b7308a6af4287f8fcc23d/psycopg2-2.9.2-cp39-cp39-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/39/c7/34b02adbcae31de7cc1540f93cf9d795833d87546ca937afd7dfc94f2579/psycopg2-2.9.2-cp39-cp39-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/33/ed/79434011d773e5ea4c51262f6ebfb86680c2908d7677f31ebccd5aa9f1b3/psycopg2-2.9.2.tar.gz", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/00/7f/a1e886c894385c731dd063dfc4bcc6b252c502222b8dbd58ca40bc970691/psycopg2-2.9.3-cp310-cp310-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/64/27/941e9b03814eb56345d5ea5f254752959418c4e2537853910e24b4def4a1/psycopg2-2.9.3-cp310-cp310-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/87/96/de1b4e1ed052d8fe7fff419e1f499930b87821625a46f8fd05dabf88009e/psycopg2-2.9.3-cp36-cp36m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/c1/51/925f13ce3251f242c07480e973ce016348bbdd885078e343e94251cf9e5e/psycopg2-2.9.3-cp36-cp36m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/2a/d9/6366ce51fcd963b1edb9f2420a645ee2664f2e0237a96ca20566cca67123/psycopg2-2.9.3-cp37-cp37m-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/ce/0e/7eb38164a100be0ddef6082b29f25d2e9ec84d695d13b6d85e9b99c6eeb1/psycopg2-2.9.3-cp37-cp37m-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/58/02/21acdeb9f69afd04006fd542383b5a47b886e7f2ec2ccd409c7a8a243b6d/psycopg2-2.9.3-cp38-cp38-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/57/0f/b17f51d21ece594452a70c50d5c153dd25aab182c88497f493b5afbf5820/psycopg2-2.9.3-cp38-cp38-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/51/d1/8026ce0069a4dea8bcc4ce3ddc88daa7fb1c7a1520e096a831982126e40e/psycopg2-2.9.3-cp39-cp39-win32.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/36/a6/e6ad8bbbecc6b8171fe4321377b8f74c0843720df99c868e63e4a6343e99/psycopg2-2.9.3-cp39-cp39-win_amd64.whl", + ">=3.6" + ], + [ + "https://files.pythonhosted.org/packages/d1/1e/b450599a27b1809bccbd4e369f397cb18dc56b875778d961f9ae180b54b7/psycopg2-2.9.3.tar.gz", + ">=3.6" + ] +] \ No newline at end of file diff --git a/tests/data/psycopg2.html b/tests/data/psycopg2.html new file mode 100644 index 00000000..73e7cb4a --- /dev/null +++ b/tests/data/psycopg2.html @@ -0,0 +1,523 @@ + + + + + + Links for psycopg2 + + +

Links for psycopg2

+ psycopg2-2.0.10.tar.gz
+ psycopg2-2.0.11.tar.gz
+ psycopg2-2.0.12.tar.gz
+ psycopg2-2.0.13.tar.gz
+ psycopg2-2.0.14.tar.gz
+ psycopg2-2.2.0.tar.gz
+ psycopg2-2.2.1.tar.gz
+ psycopg2-2.2.2.tar.gz
+ psycopg2-2.3.0.tar.gz
+ psycopg2-2.3.1.tar.gz
+ psycopg2-2.3.2.tar.gz
+ psycopg2-2.4.tar.gz
+ psycopg2-2.4.1.tar.gz
+ psycopg2-2.4.2.tar.gz
+ psycopg2-2.4.3.tar.gz
+ psycopg2-2.4.4.tar.gz
+ psycopg2-2.4.5.tar.gz
+ psycopg2-2.4.6.tar.gz
+ psycopg2-2.5.tar.gz
+ psycopg2-2.5.1.tar.gz
+ psycopg2-2.5.2.tar.gz
+ psycopg2-2.5.3.tar.gz
+ psycopg2-2.5.4.tar.gz
+ psycopg2-2.5.5.tar.gz
+ psycopg2-2.6.tar.gz
+ psycopg2-2.6.1-cp26-none-win32.whl
+ psycopg2-2.6.1-cp26-none-win_amd64.whl
+ psycopg2-2.6.1-cp27-none-win32.whl
+ psycopg2-2.6.1-cp27-none-win_amd64.whl
+ psycopg2-2.6.1-cp32-none-win32.whl
+ psycopg2-2.6.1-cp32-none-win_amd64.whl
+ psycopg2-2.6.1-cp33-none-win32.whl
+ psycopg2-2.6.1-cp33-none-win_amd64.whl
+ psycopg2-2.6.1-cp34-none-win32.whl
+ psycopg2-2.6.1-cp34-none-win_amd64.whl
+ psycopg2-2.6.1.tar.gz
+ psycopg2-2.6.2-cp26-none-win32.whl
+ psycopg2-2.6.2-cp26-none-win_amd64.whl
+ psycopg2-2.6.2-cp27-none-win32.whl
+ psycopg2-2.6.2-cp27-none-win_amd64.whl
+ psycopg2-2.6.2-cp32-none-win32.whl
+ psycopg2-2.6.2-cp32-none-win_amd64.whl
+ psycopg2-2.6.2-cp33-none-win32.whl
+ psycopg2-2.6.2-cp33-none-win_amd64.whl
+ psycopg2-2.6.2-cp34-none-win32.whl
+ psycopg2-2.6.2-cp34-none-win_amd64.whl
+ psycopg2-2.6.2-cp35-none-win32.whl
+ psycopg2-2.6.2-cp35-none-win_amd64.whl
+ psycopg2-2.6.2-cp36-cp36m-win32.whl
+ psycopg2-2.6.2-cp36-cp36m-win_amd64.whl
+ psycopg2-2.6.2.tar.gz
+ psycopg2-2.7-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp27-cp27m-win32.whl
+ psycopg2-2.7-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp33-cp33m-win32.whl
+ psycopg2-2.7-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp34-cp34m-win32.whl
+ psycopg2-2.7-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp35-cp35m-win32.whl
+ psycopg2-2.7-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7-cp36-cp36m-win32.whl
+ psycopg2-2.7-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.tar.gz
+ psycopg2-2.7.1-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7.1-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.1-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp27-cp27m-win32.whl
+ psycopg2-2.7.1-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.1-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.1-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp33-cp33m-win32.whl
+ psycopg2-2.7.1-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.1-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp34-cp34m-win32.whl
+ psycopg2-2.7.1-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.1-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp35-cp35m-win32.whl
+ psycopg2-2.7.1-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.1-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.1-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.1-cp36-cp36m-win32.whl
+ psycopg2-2.7.1-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.1.tar.gz
+ psycopg2-2.7.2-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7.2-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.2-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp27-cp27m-win32.whl
+ psycopg2-2.7.2-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.2-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.2-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp33-cp33m-win32.whl
+ psycopg2-2.7.2-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.2-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.2-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp34-cp34m-win32.whl
+ psycopg2-2.7.2-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.2-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp35-cp35m-win32.whl
+ psycopg2-2.7.2-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.2-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.2-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.2-cp36-cp36m-win32.whl
+ psycopg2-2.7.2-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.2.tar.gz
+ psycopg2-2.7.3-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7.3-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp27-cp27m-win32.whl
+ psycopg2-2.7.3-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.3-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.3-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp33-cp33m-win32.whl
+ psycopg2-2.7.3-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.3-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp34-cp34m-win32.whl
+ psycopg2-2.7.3-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.3-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp35-cp35m-win32.whl
+ psycopg2-2.7.3-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.3-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.3-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.3-cp36-cp36m-win32.whl
+ psycopg2-2.7.3-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.3.tar.gz
+ psycopg2-2.7.3.1-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.1-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp27-cp27m-win32.whl
+ psycopg2-2.7.3.1-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp33-cp33m-win32.whl
+ psycopg2-2.7.3.1-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.3.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.1-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp34-cp34m-win32.whl
+ psycopg2-2.7.3.1-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.3.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.1-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp35-cp35m-win32.whl
+ psycopg2-2.7.3.1-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.3.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.1-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.3.1-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.1-cp36-cp36m-win32.whl
+ psycopg2-2.7.3.1-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.3.1.tar.gz
+ psycopg2-2.7.3.2-cp26-cp26m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp26-cp26m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp26-cp26mu-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp26-cp26mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.2-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp27-cp27m-win32.whl
+ psycopg2-2.7.3.2-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.3.2-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp33-cp33m-win32.whl
+ psycopg2-2.7.3.2-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.3.2-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.2-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp34-cp34m-win32.whl
+ psycopg2-2.7.3.2-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.3.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.2-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp35-cp35m-win32.whl
+ psycopg2-2.7.3.2-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.3.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.3.2-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.3.2-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.3.2-cp36-cp36m-win32.whl
+ psycopg2-2.7.3.2-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.3.2.tar.gz
+ psycopg2-2.7.4-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.4-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.4-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp27-cp27m-win32.whl
+ psycopg2-2.7.4-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.4-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.4-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp33-cp33m-manylinux1_i686.whl
+ psycopg2-2.7.4-cp33-cp33m-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp33-cp33m-win32.whl
+ psycopg2-2.7.4-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.4-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.4-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.4-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp34-cp34m-win32.whl
+ psycopg2-2.7.4-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.4-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.4-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.4-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp35-cp35m-win32.whl
+ psycopg2-2.7.4-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.4-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.4-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.4-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.4-cp36-cp36m-win32.whl
+ psycopg2-2.7.4-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.4.tar.gz
+ psycopg2-2.7.5-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.5-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.5-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp27-cp27m-win32.whl
+ psycopg2-2.7.5-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.5-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.5-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp33-cp33m-win32.whl
+ psycopg2-2.7.5-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.5-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.5-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.5-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp34-cp34m-win32.whl
+ psycopg2-2.7.5-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.5-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.5-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.5-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp35-cp35m-win32.whl
+ psycopg2-2.7.5-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.5-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.5-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.5-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp36-cp36m-win32.whl
+ psycopg2-2.7.5-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.5-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.5-cp37-cp37m-manylinux1_i686.whl
+ psycopg2-2.7.5-cp37-cp37m-manylinux1_x86_64.whl
+ psycopg2-2.7.5-cp37-cp37m-win32.whl
+ psycopg2-2.7.5-cp37-cp37m-win_amd64.whl
+ psycopg2-2.7.5.tar.gz
+ psycopg2-2.7.6-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.6-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp27-cp27m-win32.whl
+ psycopg2-2.7.6-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.6-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.6-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp33-cp33m-win32.whl
+ psycopg2-2.7.6-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.6-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.6-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp34-cp34m-win32.whl
+ psycopg2-2.7.6-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.6-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.6-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp35-cp35m-win32.whl
+ psycopg2-2.7.6-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.6-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp36-cp36m-win32.whl
+ psycopg2-2.7.6-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6-cp37-cp37m-manylinux1_i686.whl
+ psycopg2-2.7.6-cp37-cp37m-manylinux1_x86_64.whl
+ psycopg2-2.7.6-cp37-cp37m-win32.whl
+ psycopg2-2.7.6-cp37-cp37m-win_amd64.whl
+ psycopg2-2.7.6.tar.gz
+ psycopg2-2.7.6.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6.1-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp27-cp27m-win32.whl
+ psycopg2-2.7.6.1-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.6.1-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp33-cp33m-win32.whl
+ psycopg2-2.7.6.1-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.6.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6.1-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp34-cp34m-win32.whl
+ psycopg2-2.7.6.1-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.6.1-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6.1-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp35-cp35m-win32.whl
+ psycopg2-2.7.6.1-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.6.1-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6.1-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp36-cp36m-win32.whl
+ psycopg2-2.7.6.1-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.6.1-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.6.1-cp37-cp37m-manylinux1_i686.whl
+ psycopg2-2.7.6.1-cp37-cp37m-manylinux1_x86_64.whl
+ psycopg2-2.7.6.1-cp37-cp37m-win32.whl
+ psycopg2-2.7.6.1-cp37-cp37m-win_amd64.whl
+ psycopg2-2.7.6.1.tar.gz
+ psycopg2-2.7.7-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.7-cp27-cp27m-manylinux1_i686.whl
+ psycopg2-2.7.7-cp27-cp27m-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp27-cp27m-win32.whl
+ psycopg2-2.7.7-cp27-cp27m-win_amd64.whl
+ psycopg2-2.7.7-cp27-cp27mu-manylinux1_i686.whl
+ psycopg2-2.7.7-cp27-cp27mu-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp33-cp33m-win32.whl
+ psycopg2-2.7.7-cp33-cp33m-win_amd64.whl
+ psycopg2-2.7.7-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.7-cp34-cp34m-manylinux1_i686.whl
+ psycopg2-2.7.7-cp34-cp34m-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp34-cp34m-win32.whl
+ psycopg2-2.7.7-cp34-cp34m-win_amd64.whl
+ psycopg2-2.7.7-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.7-cp35-cp35m-manylinux1_i686.whl
+ psycopg2-2.7.7-cp35-cp35m-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp35-cp35m-win32.whl
+ psycopg2-2.7.7-cp35-cp35m-win_amd64.whl
+ psycopg2-2.7.7-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.7-cp36-cp36m-manylinux1_i686.whl
+ psycopg2-2.7.7-cp36-cp36m-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp36-cp36m-win32.whl
+ psycopg2-2.7.7-cp36-cp36m-win_amd64.whl
+ psycopg2-2.7.7-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
+ psycopg2-2.7.7-cp37-cp37m-manylinux1_i686.whl
+ psycopg2-2.7.7-cp37-cp37m-manylinux1_x86_64.whl
+ psycopg2-2.7.7-cp37-cp37m-win32.whl
+ psycopg2-2.7.7-cp37-cp37m-win_amd64.whl
+ psycopg2-2.7.7.tar.gz
+ psycopg2-2.8-cp27-cp27m-win32.whl
+ psycopg2-2.8-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8-cp34-cp34m-win32.whl
+ psycopg2-2.8-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8-cp35-cp35m-win32.whl
+ psycopg2-2.8-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8-cp36-cp36m-win32.whl
+ psycopg2-2.8-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8-cp37-cp37m-win32.whl
+ psycopg2-2.8-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.tar.gz
+ psycopg2-2.8.1-cp27-cp27m-win32.whl
+ psycopg2-2.8.1-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.1-cp34-cp34m-win32.whl
+ psycopg2-2.8.1-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.1-cp35-cp35m-win32.whl
+ psycopg2-2.8.1-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.1-cp36-cp36m-win32.whl
+ psycopg2-2.8.1-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.1-cp37-cp37m-win32.whl
+ psycopg2-2.8.1-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.1.tar.gz
+ psycopg2-2.8.2-cp27-cp27m-win32.whl
+ psycopg2-2.8.2-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.2-cp34-cp34m-win32.whl
+ psycopg2-2.8.2-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.2-cp35-cp35m-win32.whl
+ psycopg2-2.8.2-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.2-cp36-cp36m-win32.whl
+ psycopg2-2.8.2-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.2-cp37-cp37m-win32.whl
+ psycopg2-2.8.2-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.2.tar.gz
+ psycopg2-2.8.3-cp27-cp27m-win32.whl
+ psycopg2-2.8.3-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.3-cp34-cp34m-win32.whl
+ psycopg2-2.8.3-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.3-cp35-cp35m-win32.whl
+ psycopg2-2.8.3-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.3-cp36-cp36m-win32.whl
+ psycopg2-2.8.3-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.3-cp37-cp37m-win32.whl
+ psycopg2-2.8.3-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.3.tar.gz
+ psycopg2-2.8.4-cp27-cp27m-win32.whl
+ psycopg2-2.8.4-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.4-cp34-cp34m-win32.whl
+ psycopg2-2.8.4-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.4-cp35-cp35m-win32.whl
+ psycopg2-2.8.4-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.4-cp36-cp36m-win32.whl
+ psycopg2-2.8.4-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.4-cp37-cp37m-win32.whl
+ psycopg2-2.8.4-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.4-cp38-cp38-win32.whl
+ psycopg2-2.8.4-cp38-cp38-win_amd64.whl
+ psycopg2-2.8.4.tar.gz
+ psycopg2-2.8.5-cp27-cp27m-win32.whl
+ psycopg2-2.8.5-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.5-cp34-cp34m-win32.whl
+ psycopg2-2.8.5-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.5-cp35-cp35m-win32.whl
+ psycopg2-2.8.5-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.5-cp36-cp36m-win32.whl
+ psycopg2-2.8.5-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.5-cp37-cp37m-win32.whl
+ psycopg2-2.8.5-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.5-cp38-cp38-win32.whl
+ psycopg2-2.8.5-cp38-cp38-win_amd64.whl
+ psycopg2-2.8.5.tar.gz
+ psycopg2-2.8.6-cp27-cp27m-win32.whl
+ psycopg2-2.8.6-cp27-cp27m-win_amd64.whl
+ psycopg2-2.8.6-cp34-cp34m-win32.whl
+ psycopg2-2.8.6-cp34-cp34m-win_amd64.whl
+ psycopg2-2.8.6-cp35-cp35m-win32.whl
+ psycopg2-2.8.6-cp35-cp35m-win_amd64.whl
+ psycopg2-2.8.6-cp36-cp36m-win32.whl
+ psycopg2-2.8.6-cp36-cp36m-win_amd64.whl
+ psycopg2-2.8.6-cp37-cp37m-win32.whl
+ psycopg2-2.8.6-cp37-cp37m-win_amd64.whl
+ psycopg2-2.8.6-cp38-cp38-win32.whl
+ psycopg2-2.8.6-cp38-cp38-win_amd64.whl
+ psycopg2-2.8.6-cp39-cp39-win32.whl
+ psycopg2-2.8.6-cp39-cp39-win_amd64.whl
+ psycopg2-2.8.6.tar.gz
+ psycopg2-2.9-cp36-cp36m-win32.whl
+ psycopg2-2.9-cp36-cp36m-win_amd64.whl
+ psycopg2-2.9-cp37-cp37m-win32.whl
+ psycopg2-2.9-cp37-cp37m-win_amd64.whl
+ psycopg2-2.9-cp38-cp38-win32.whl
+ psycopg2-2.9-cp38-cp38-win_amd64.whl
+ psycopg2-2.9-cp39-cp39-win32.whl
+ psycopg2-2.9-cp39-cp39-win_amd64.whl
+ psycopg2-2.9.tar.gz
+ psycopg2-2.9.1-cp310-cp310-win32.whl
+ psycopg2-2.9.1-cp310-cp310-win_amd64.whl
+ psycopg2-2.9.1-cp36-cp36m-win32.whl
+ psycopg2-2.9.1-cp36-cp36m-win_amd64.whl
+ psycopg2-2.9.1-cp37-cp37m-win32.whl
+ psycopg2-2.9.1-cp37-cp37m-win_amd64.whl
+ psycopg2-2.9.1-cp38-cp38-win32.whl
+ psycopg2-2.9.1-cp38-cp38-win_amd64.whl
+ psycopg2-2.9.1-cp39-cp39-win32.whl
+ psycopg2-2.9.1-cp39-cp39-win_amd64.whl
+ psycopg2-2.9.1.tar.gz
+ psycopg2-2.9.2-cp310-cp310-win32.whl
+ psycopg2-2.9.2-cp310-cp310-win_amd64.whl
+ psycopg2-2.9.2-cp36-cp36m-win32.whl
+ psycopg2-2.9.2-cp36-cp36m-win_amd64.whl
+ psycopg2-2.9.2-cp37-cp37m-win32.whl
+ psycopg2-2.9.2-cp37-cp37m-win_amd64.whl
+ psycopg2-2.9.2-cp38-cp38-win32.whl
+ psycopg2-2.9.2-cp38-cp38-win_amd64.whl
+ psycopg2-2.9.2-cp39-cp39-win32.whl
+ psycopg2-2.9.2-cp39-cp39-win_amd64.whl
+ psycopg2-2.9.2.tar.gz
+ psycopg2-2.9.3-cp310-cp310-win32.whl
+ psycopg2-2.9.3-cp310-cp310-win_amd64.whl
+ psycopg2-2.9.3-cp36-cp36m-win32.whl
+ psycopg2-2.9.3-cp36-cp36m-win_amd64.whl
+ psycopg2-2.9.3-cp37-cp37m-win32.whl
+ psycopg2-2.9.3-cp37-cp37m-win_amd64.whl
+ psycopg2-2.9.3-cp38-cp38-win32.whl
+ psycopg2-2.9.3-cp38-cp38-win_amd64.whl
+ psycopg2-2.9.3-cp39-cp39-win32.whl
+ psycopg2-2.9.3-cp39-cp39-win_amd64.whl
+ psycopg2-2.9.3.tar.gz
+ + + \ No newline at end of file diff --git a/tests/data/setup.cfg b/tests/data/setup.cfg new file mode 100644 index 00000000..c9d6a7b4 --- /dev/null +++ b/tests/data/setup.cfg @@ -0,0 +1,25 @@ +[options] +install_requires = + pytest-black >= 0.3.7; \ + python_implementation != "PyPy" + attrs >= 18.1, !=20.1.0 + Beautifulsoup4 >= 4.0.0 + pip>=19.1 # For proper file:// URLs support + click >= 6.7, !=7.0 + intbitset >= 2.3.0 + requests >= 2.7.0 + saneyaml >= 0.5.2 + text_unidecode >= 1.0 + pure-eval; black; tox; + typing >=3.6, < 3.7; python_version < "3.7" + +[options.extras_require] +testing = + pytest >= 6, != 7.0.0 + pytest-xdist >= 2 + aboutcode-toolkit >= 6.0.0 + black +docs = + Sphinx >= 3.3.1 + sphinx-rtd-theme >= 0.5.0 + doc8 >= 0.8.1 \ No newline at end of file diff --git a/tests/data/setup_with_setup_requires_and_python_requires.cfg b/tests/data/setup_with_setup_requires_and_python_requires.cfg new file mode 100644 index 00000000..9d36fde6 --- /dev/null +++ b/tests/data/setup_with_setup_requires_and_python_requires.cfg @@ -0,0 +1,159 @@ +# Copyright (c) 2012-2020 Adam Karpierz +# Licensed under the zlib/libpng License +# https://opensource.org/licenses/Zlib + +[metadata] +long_description = file: README.rst, CHANGES.rst +long_description_content_type = text/x-rst; charset=UTF-8 +project_urls = + Documentation=https://QQt.readthedocs.io/ + Source=https://github.com/karpierz/QQt + Issues=https://github.com/karpierz/QQt/issues +license_files = LICENSE +keywords = QQt, PySide2, PySide, PyQt5, PyQt4, PyQt, Qt +platforms = any +classifiers = + Development Status :: 5 - Production/Stable + Intended Audience :: Developers + License :: OSI Approved :: zlib/libpng License + Operating System :: OS Independent + Natural Language :: Polish + Programming Language :: Python + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.6 + Programming Language :: Python :: 3.7 + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: Implementation :: CPython + Programming Language :: Python :: Implementation :: Stackless + Topic :: Software Development :: Libraries :: Python Modules + +[options] +python_requires = >=3.6.0,<3.8.0 +setup_requires = + setuptools>=42.0.2 +install_requires = + setuptools>=42.0.2 + QtPy~=1.9.0 +test_requires = + pytest>=42.0.2 +packages = find: +package_dir = + = src + # QQt.tests = tests +zip_safe = True + +[options.packages.find] +where = src + +[options.extras_require] +PySide = + PySide2~=5.13.2 +PyQt = + PyQt5~=5.13.2 +doc = + Sphinx>=3.2.1 + restructuredtext-lint>=1.3.1 +test = + PySide2~=5.13.2 + +[sdist] +formats = zip + +[bdist_wheel] +universal = False + +[build_sphinx] +source-dir = docs +build-dir = build/docs +builder = html +all-files = True +warning-is-error = True + +# +# Configuration(s) for tox +# + +[tox:tox] +envlist = py{36,37}, docs +minversion = 3.13.2 +requires = + tox-venv>=0.4.0 + {[base]setup_requires} +skip_missing_interpreters = true + +[base] +setup_requires = + pip>=20.2.3 + setuptools>=50.3.0 + wheel>=0.35.1 +packagesubdir = QQt + +[testenv] +passenv = WINDIR +commands = + {envpython} --version + {envpython} -B -m tests {posargs} +extras = test +deps = + {[base]setup_requires} + +[testenv:prepare] +basepython = python3.7 +skip_install = true +whitelist_externals = + cmd + .build +commands = + cmd /C if exist .build.cmd .build.cmd + +[testenv:docs] +basepython = python3.7 +commands = + #{envpython} -m sphinx.apidoc -f {envsitepackagesdir}/{[base]packagesubdir} + {envpython} setup.py -v build_sphinx -b html -E + {envpython} setup.py -v build_sphinx -b linkcheck + {envpython} setup.py -v build_sphinx -b doctest +extras = doc + +[testenv:lint] +basepython = python3.7 +commands = + {envpython} -m flake8 {envsitepackagesdir}/{[base]packagesubdir}/ +extras = +deps = + {[testenv]deps} + flake8>=3.8.3 + flake8-docstrings>=1.5.0 + pep8-naming>=0.11.1 + flake8-builtins>=1.5.3 + +[testenv:publish] +basepython = python3.7 +commands = + {envpython} setup.py sdist + {envpython} -m twine check dist/* + {envpython} -m twine upload dist/* +extras = +deps = + {[testenv]deps} + twine>=3.2.0 + +[flake8] +filename = *.py,*.pyx +#include = tests +#exclude = .tox,*.egg,.git,_build,.hypothesis +max-line-length = 99 +ignore = E126,E203,E221,E251,E302,E701,E702,E731, + E122,E127,E128,E222,E272,E241,E266, E226,E704, + D100, D101, D102, D103, D104, D400, D401, D202, + N806, N802, N803, + I100 +# (e.g. E4,W) default: E121,E123, 126, 226,E24, 704 +#select = +#select = E,W,F,N,I +output-file = .tox/lint/flake8out.txt +count = True +#show-pep8, +#show-source +#verbose +#quiet \ No newline at end of file diff --git a/tests/data/single-url-except-simple-expected.json b/tests/data/single-url-except-simple-expected.json new file mode 100644 index 00000000..fc64acc5 --- /dev/null +++ b/tests/data/single-url-except-simple-expected.json @@ -0,0 +1,73 @@ +{ + "headers": { + "tool_name": "dad", + "tool_homepageurl": "https://github.com/nexB/python-inspector", + "tool_version": "0.5.0", + "options": [ + "--specifier flask", + "--index-url https://pypi.org/simple", + "--index-url https://thirdparty.aboutcode.org/pypi/simple/", + "--python-version 38", + "--operating-system linux", + "--json " + ], + "notice": "Dependency tree generated with python-inspector.\npython-inspector is a free software tool from nexB Inc. and others.\nVisit https://github.com/nexB/scancode-toolkit/ for support and download.", + "warnings": [], + "errors": [] + }, + "requirements": [ + { + "purl": "pkg:pypi/flask", + "extracted_requirement": "flask", + "scope": "install", + "is_runtime": true, + "is_optional": false, + "is_resolved": false, + "resolved_package": {} + } + ], + "resolved_dependencies": [ + { + "package": "pkg:pypi/click@8.1.3", + "dependencies": [] + }, + { + "package": "pkg:pypi/flask@2.1.3", + "dependencies": [ + "pkg:pypi/click@8.1.3", + "pkg:pypi/importlib-metadata@4.12.0", + "pkg:pypi/itsdangerous@2.1.2", + "pkg:pypi/jinja2@3.1.2", + "pkg:pypi/werkzeug@2.1.2" + ] + }, + { + "package": "pkg:pypi/importlib-metadata@4.12.0", + "dependencies": [ + "pkg:pypi/zipp@3.8.1" + ] + }, + { + "package": "pkg:pypi/itsdangerous@2.1.2", + "dependencies": [] + }, + { + "package": "pkg:pypi/jinja2@3.1.2", + "dependencies": [ + "pkg:pypi/markupsafe@2.1.1" + ] + }, + { + "package": "pkg:pypi/markupsafe@2.1.1", + "dependencies": [] + }, + { + "package": "pkg:pypi/werkzeug@2.1.2", + "dependencies": [] + }, + { + "package": "pkg:pypi/zipp@3.8.1", + "dependencies": [] + } + ] +} \ No newline at end of file diff --git a/tests/data/tilde_req-expected.json b/tests/data/tilde_req-expected.json index 7809e80f..d0b42735 100644 --- a/tests/data/tilde_req-expected.json +++ b/tests/data/tilde_req-expected.json @@ -28,7 +28,7 @@ ], "resolved_dependencies": [ { - "package": "pkg:pypi/zipp@3.8.0", + "package": "pkg:pypi/zipp@3.8.1", "dependencies": [] } ] diff --git a/tests/test_cli.py b/tests/test_cli.py index 753fa5b1..4739dc0e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -56,6 +56,25 @@ def test_cli_with_single_index_url(): ) +@pytest.mark.online +def test_cli_with_single_index_url_except_pypi_simple(): + expected_file = test_env.get_test_loc( + "single-url-except-simple-expected.json", must_exist=False + ) + # using flask since it's not present in thirdparty + specifier = "flask" + extra_options = [ + "--index-url", + "https://thirdparty.aboutcode.org/pypi/simple/", + ] + check_specs_resolution( + specifier=specifier, + expected_file=expected_file, + extra_options=extra_options, + regen=REGEN_TEST_FIXTURES, + ) + + @pytest.mark.online def test_cli_with_multiple_index_url_and_tilde_req(): expected_file = test_env.get_test_loc("tilde_req-expected.json", must_exist=False) diff --git a/tests/test_resolution.py b/tests/test_resolution.py index 1832947f..97bb1b68 100644 --- a/tests/test_resolution.py +++ b/tests/test_resolution.py @@ -20,9 +20,10 @@ @pytest.mark.online def test_get_resolved_dependencies_with_flask_and_python_310(): - req = [Requirement("flask==2.1.2")] + req = Requirement("flask==2.1.2") + req.is_requirement_resolved = True results = get_resolved_dependencies( - requirements=req, + requirements=[req], environment=Environment( python_version="310", operating_system="linux", @@ -43,9 +44,10 @@ def test_get_resolved_dependencies_with_flask_and_python_310(): @pytest.mark.online def test_get_resolved_dependencies_with_flask_and_python_310_windows(): - req = [Requirement("flask==2.1.2")] + req = Requirement("flask==2.1.2") + req.is_requirement_resolved = True results = get_resolved_dependencies( - requirements=req, + requirements=[req], environment=Environment( python_version="310", operating_system="windows", @@ -67,9 +69,10 @@ def test_get_resolved_dependencies_with_flask_and_python_310_windows(): @pytest.mark.online def test_get_resolved_dependencies_with_flask_and_python_36(): - req = [Requirement("flask==2.1.2")] + req = Requirement("flask") + req.is_requirement_resolved = False results = get_resolved_dependencies( - requirements=req, + requirements=[req], environment=Environment( python_version="36", operating_system="linux", @@ -80,23 +83,25 @@ def test_get_resolved_dependencies_with_flask_and_python_36(): as_list = [p["package"] for p in results] assert as_list == [ - "pkg:pypi/click@8.1.3", - "pkg:pypi/flask@2.1.2", - "pkg:pypi/importlib-metadata@4.12.0", - "pkg:pypi/itsdangerous@2.1.2", - "pkg:pypi/jinja2@3.1.2", + "pkg:pypi/click@8.0.4", + "pkg:pypi/dataclasses@0.8", + "pkg:pypi/flask@2.0.3", + "pkg:pypi/importlib-metadata@4.8.3", + "pkg:pypi/itsdangerous@2.0.1", + "pkg:pypi/jinja2@3.0.3", "pkg:pypi/markupsafe@2.0.1", - "pkg:pypi/typing-extensions@4.3.0", - "pkg:pypi/werkzeug@2.1.2", - "pkg:pypi/zipp@3.8.0", + "pkg:pypi/typing-extensions@4.1.1", + "pkg:pypi/werkzeug@2.0.3", + "pkg:pypi/zipp@3.6.0", ] @pytest.mark.online def test_get_resolved_dependencies_with_tilde_requirement_using_json_api(): - req = [Requirement("flask~=2.1.2")] + req = Requirement("flask~=2.1.2") + req.is_requirement_resolved = False results = get_resolved_dependencies( - requirements=req, + requirements=[req], as_tree=False, environment=Environment( python_version="38", @@ -106,13 +111,40 @@ def test_get_resolved_dependencies_with_tilde_requirement_using_json_api(): as_list = [p["package"] for p in results] assert as_list == [ "pkg:pypi/click@8.1.3", - "pkg:pypi/flask@2.1.2", + "pkg:pypi/flask@2.1.3", "pkg:pypi/importlib-metadata@4.12.0", "pkg:pypi/itsdangerous@2.1.2", "pkg:pypi/jinja2@3.1.2", "pkg:pypi/markupsafe@2.1.1", "pkg:pypi/werkzeug@2.1.2", - "pkg:pypi/zipp@3.8.0", + "pkg:pypi/zipp@3.8.1", + ] + + +@pytest.mark.online +def test_without_supported_wheels(): + req = Requirement("autobahn==22.3.2") + req.is_requirement_resolved = True + results = get_resolved_dependencies( + requirements=[req], + as_tree=False, + repos=[PYPI_PUBLIC_REPO], + environment=Environment( + python_version="38", + operating_system="linux", + ), + ) + as_list = [p["package"] for p in results] + + assert as_list == [ + "pkg:pypi/autobahn@22.3.2", + "pkg:pypi/cffi@1.15.1", + "pkg:pypi/cryptography@37.0.4", + "pkg:pypi/hyperlink@21.0.0", + "pkg:pypi/idna@3.3", + "pkg:pypi/pycparser@2.21", + "pkg:pypi/setuptools@63.2.0", + "pkg:pypi/txaio@22.2.1", ] diff --git a/tests/test_utils.py b/tests/test_utils.py index 0fae3e7e..a82b2555 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -8,16 +8,25 @@ # See https://github.com/nexB/python-inspector for support or download. # See https://aboutcode.org for more information about nexB OSS projects. # +import collections +import json import os +from unittest import mock from commoncode.testcase import FileDrivenTesting +from test_cli import check_json_results from tinynetrc import Netrc +from _packagedcode.pypi import SetupCfgHandler +from python_inspector.resolution import fetch_and_extract_sdist from python_inspector.utils import get_netrc_auth +from python_inspector.utils_pypi import PypiSimpleRepository test_env = FileDrivenTesting() test_env.test_data_dir = os.path.join(os.path.dirname(__file__), "data") +Candidate = collections.namedtuple("Candidate", "name version extras") + def test_get_netrc_auth(): netrc_file = test_env.get_test_loc("test.netrc") @@ -29,3 +38,52 @@ def test_get_netrc_auth_with_no_matching_url(): netrc_file = test_env.get_test_loc("test.netrc") netrc = Netrc(netrc_file) assert get_netrc_auth(url="https://pypi2.org/simple", netrc=netrc) == (None, None) + + +@mock.patch("python_inspector.utils_pypi.CACHE.get") +def test_fetch_links(mock_get): + file_name = test_env.get_test_loc("psycopg2.html") + with open(file_name) as file: + mock_get.return_value = file.read() + links = PypiSimpleRepository().fetch_links(normalized_name="psycopg2") + result_file = test_env.get_temp_file("json") + expected_file = test_env.get_test_loc("psycopg2-links-expected.json", must_exist=False) + with open(result_file, "w") as file: + json.dump(links, file, indent=4) + check_json_results(result_file, expected_file, clean=False) + + +def test_parse_reqs(): + results = [ + package.to_dict() for package in SetupCfgHandler.parse(test_env.get_test_loc("setup.cfg")) + ] + result_file = test_env.get_temp_file("json") + expected_file = test_env.get_test_loc("parse-reqs.json", must_exist=False) + with open(result_file, "w") as file: + json.dump(results, file, indent=4) + check_json_results(result_file, expected_file, clean=False) + + +def test_get_sdist_file(): + sdist_file = fetch_and_extract_sdist( + repos=tuple([PypiSimpleRepository()]), + candidate=Candidate(name="psycopg2", version="2.7.5", extras=None), + python_version="3.8", + ) + assert os.path.basename(os.path.normpath(sdist_file)) == "psycopg2-2.7.5" + + +def test_parse_reqs_with_setup_requires_and_python_requires(): + results = [ + package.to_dict() + for package in SetupCfgHandler.parse( + test_env.get_test_loc("setup_with_setup_requires_and_python_requires.cfg") + ) + ] + result_file = test_env.get_temp_file("json") + expected_file = test_env.get_test_loc( + "parse-reqs-with-setup_requires-and-python-requires.json", must_exist=False + ) + with open(result_file, "w") as file: + json.dump(results, file, indent=4) + check_json_results(result_file, expected_file, clean=False)