From ad636667492d8249f9b9340b9a7409d68d23d7ed Mon Sep 17 00:00:00 2001 From: Pradyun Gedam Date: Sun, 21 Mar 2021 11:55:07 +0000 Subject: [PATCH] Drop YAML tests for the resolver We've created a fairly capable setup with the new resolver tests, which has now rendered this logic redundant and generally unnecessary. --- .pre-commit-config.yaml | 2 - .../html/development/architecture/anatomy.rst | 1 - setup.cfg | 1 - tests/functional/test_yaml.py | 203 --- tests/yaml/ERRORS.md | 60 - tests/yaml/README.md | 74 - tests/yaml/backtrack.yml | 40 - tests/yaml/circular.yml | 45 - tests/yaml/conflict_1.yml | 77 - tests/yaml/conflict_2.yml | 28 - tests/yaml/conflict_3.yml | 22 - tests/yaml/conflicting_diamond.yml | 19 - tests/yaml/conflicting_triangle.yml | 18 - tests/yaml/extras.yml | 49 - tests/yaml/fallback.yml | 20 - tests/yaml/huge.yml | 1260 ----------------- tests/yaml/large.yml | 295 ---- tests/yaml/linter.py | 108 -- tests/yaml/non_pinned.yml | 24 - tests/yaml/overlap1.yml | 44 - tests/yaml/pinned.yml | 29 - tests/yaml/pip988.yml | 37 - tests/yaml/poetry2298.yml | 24 - tests/yaml/simple.yml | 47 - tests/yaml/trivial.yml | 24 - tools/requirements/tests.txt | 1 - 26 files changed, 2552 deletions(-) delete mode 100644 tests/functional/test_yaml.py delete mode 100644 tests/yaml/ERRORS.md delete mode 100644 tests/yaml/README.md delete mode 100644 tests/yaml/backtrack.yml delete mode 100644 tests/yaml/circular.yml delete mode 100644 tests/yaml/conflict_1.yml delete mode 100644 tests/yaml/conflict_2.yml delete mode 100644 tests/yaml/conflict_3.yml delete mode 100644 tests/yaml/conflicting_diamond.yml delete mode 100644 tests/yaml/conflicting_triangle.yml delete mode 100644 tests/yaml/extras.yml delete mode 100644 tests/yaml/fallback.yml delete mode 100644 tests/yaml/huge.yml delete mode 100644 tests/yaml/large.yml delete mode 100644 tests/yaml/linter.py delete mode 100644 tests/yaml/non_pinned.yml delete mode 100644 tests/yaml/overlap1.yml delete mode 100644 tests/yaml/pinned.yml delete mode 100644 tests/yaml/pip988.yml delete mode 100644 tests/yaml/poetry2298.yml delete mode 100644 tests/yaml/simple.yml delete mode 100644 tests/yaml/trivial.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0521f261f..5b470e36f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,7 +34,6 @@ repos: ^tools/| # Tests ^tests/conftest.py| - ^tests/yaml| ^tests/lib| ^tests/data| ^tests/unit| @@ -45,7 +44,6 @@ repos: # A blank ignore, to avoid merge conflicts later. ^$ - - repo: https://gitlab.com/pycqa/flake8 rev: 3.8.4 hooks: diff --git a/docs/html/development/architecture/anatomy.rst b/docs/html/development/architecture/anatomy.rst index 46bba4489..e30e03e21 100644 --- a/docs/html/development/architecture/anatomy.rst +++ b/docs/html/development/architecture/anatomy.rst @@ -51,7 +51,6 @@ The ``README``, license, ``pyproject.toml``, ``setup.py``, and so on are in the * ``functional/`` *[functional tests of pip’s CLI -- end-to-end, invoke pip in subprocess & check results of execution against desired result. This also is what makes test suite slow]* * ``lib/`` *[helpers for tests]* * ``unit/`` *[unit tests -- fast and small and nice!]* - * ``yaml/`` *[resolver tests! They’re written in YAML. This folder just contains .yaml files -- actual code for reading/running them is in lib/yaml.py . This is fine!]* * ``tools`` *[misc development workflow tools, like requirements files & Travis CI files & helpers for tox]* * ``.azure-pipelines`` diff --git a/setup.cfg b/setup.cfg index 1d851d949..aab1807f4 100644 --- a/setup.cfg +++ b/setup.cfg @@ -53,7 +53,6 @@ markers = svn: VCS: Subversion mercurial: VCS: Mercurial git: VCS: git - yaml: yaml based tests search: tests for 'pip search' [coverage:run] diff --git a/tests/functional/test_yaml.py b/tests/functional/test_yaml.py deleted file mode 100644 index ba7b17531..000000000 --- a/tests/functional/test_yaml.py +++ /dev/null @@ -1,203 +0,0 @@ -""" -Tests for the resolver -""" - -import os -import re -import sys - -import pytest -import yaml - -from tests.lib import DATA_DIR, create_basic_wheel_for_package, path_to_url - - -def generate_yaml_tests(directory): - """ - Generate yaml test cases from the yaml files in the given directory - """ - for yml_file in directory.glob("*.yml"): - data = yaml.safe_load(yml_file.read_text()) - assert "cases" in data, "A fixture needs cases to be used in testing" - - # Strip the parts of the directory to only get a name without - # extension and resolver directory - base_name = str(yml_file)[len(str(directory)) + 1:-4] - - base = data.get("base", {}) - cases = data["cases"] - - for resolver in 'legacy', '2020-resolver': - for i, case_template in enumerate(cases): - case = base.copy() - case.update(case_template) - - case[":name:"] = base_name - if len(cases) > 1: - case[":name:"] += "-" + str(i) - case[":name:"] += "*" + resolver - case[":resolver:"] = resolver - - skip = case.pop("skip", False) - assert skip in [False, True, 'legacy', '2020-resolver'] - if skip is True or skip == resolver: - case = pytest.param(case, marks=pytest.mark.xfail) - - yield case - - -def id_func(param): - """ - Give a nice parameter name to the generated function parameters - """ - if isinstance(param, dict) and ":name:" in param: - return param[":name:"] - - retval = str(param) - if len(retval) > 25: - retval = retval[:20] + "..." + retval[-2:] - return retval - - -def convert_to_dict(string): - - def stripping_split(my_str, splitwith, count=None): - if count is None: - return [x.strip() for x in my_str.strip().split(splitwith)] - else: - return [x.strip() for x in my_str.strip().split(splitwith, count)] - - parts = stripping_split(string, ";") - - retval = {} - retval["depends"] = [] - retval["extras"] = {} - - retval["name"], retval["version"] = stripping_split(parts[0], " ") - - for part in parts[1:]: - verb, args_str = stripping_split(part, " ", 1) - assert verb in ["depends"], f"Unknown verb {verb!r}" - - retval[verb] = stripping_split(args_str, ",") - - return retval - - -def handle_request(script, action, requirement, options, resolver_variant): - if action == 'install': - args = ['install'] - if resolver_variant == "legacy": - args.append("--use-deprecated=legacy-resolver") - args.extend(["--no-index", "--find-links", - path_to_url(script.scratch_path)]) - elif action == 'uninstall': - args = ['uninstall', '--yes'] - else: - raise f"Did not excpet action: {action!r}" - - if isinstance(requirement, str): - args.append(requirement) - elif isinstance(requirement, list): - args.extend(requirement) - else: - raise f"requirement neither str nor list {requirement!r}" - - args.extend(options) - args.append("--verbose") - - result = script.pip(*args, - allow_stderr_error=True, - allow_stderr_warning=True, - allow_error=True) - - # Check which packages got installed - state = [] - for path in os.listdir(script.site_packages_path): - if path.endswith(".dist-info"): - name, version = ( - os.path.basename(path)[:-len(".dist-info")] - ).rsplit("-", 1) - # TODO: information about extras. - state.append(" ".join((name, version))) - - return {"result": result, "state": sorted(state)} - - -def check_error(error, result): - return_code = error.get('code') - if return_code: - assert result.returncode == return_code - - stderr = error.get('stderr') - if not stderr: - return - - if isinstance(stderr, str): - patters = [stderr] - elif isinstance(stderr, list): - patters = stderr - else: - raise "string or list expected, found %r" % stderr - - for patter in patters: - match = re.search(patter, result.stderr, re.I) - assert match, 'regex %r not found in stderr: %r' % ( - stderr, result.stderr) - - -@pytest.mark.yaml -@pytest.mark.parametrize( - "case", generate_yaml_tests(DATA_DIR.parent / "yaml"), ids=id_func -) -def test_yaml_based(script, case): - available = case.get("available", []) - requests = case.get("request", []) - responses = case.get("response", []) - - assert len(requests) == len(responses), ( - "Expected requests and responses counts to be same" - ) - - # Create a custom index of all the packages that are supposed to be - # available - # XXX: This doesn't work because this isn't making an index of files. - for package in available: - if isinstance(package, str): - package = convert_to_dict(package) - - assert isinstance(package, dict), "Needs to be a dictionary" - - create_basic_wheel_for_package(script, **package) - - # use scratch path for index - for request, response in zip(requests, responses): - - for action in 'install', 'uninstall': - if action in request: - break - else: - raise f"Unsupported request {request!r}" - - # Perform the requested action - effect = handle_request(script, action, - request[action], - request.get('options', '').split(), - resolver_variant=case[':resolver:']) - result = effect['result'] - - if 0: # for analyzing output easier - with open(DATA_DIR.parent / "yaml" / - case[':name:'].replace('*', '-'), 'w') as fo: - fo.write("=== RETURNCODE = %d\n" % result.returncode) - fo.write("=== STDERR ===:\n%s\n" % result.stderr) - - if 'state' in response: - assert effect['state'] == (response['state'] or []), str(result) - - error = response.get('error') - if error and case[":resolver:"] == 'new' and sys.platform != 'win32': - # Note: we currently skip running these tests on Windows, as they - # were failing due to different error codes. There should not - # be a reason for not running these this check on Windows. - check_error(error, result) diff --git a/tests/yaml/ERRORS.md b/tests/yaml/ERRORS.md deleted file mode 100644 index 700e3d4ea..000000000 --- a/tests/yaml/ERRORS.md +++ /dev/null @@ -1,60 +0,0 @@ -# New resolver error messages - - -## Incompatible requirements - -Most resolver error messages are due to incompatible requirements. -That is, the dependency tree contains conflicting versions of the same -package. Take the example: - - base: - available: - - A 1.0.0; depends B == 1.0.0, C == 2.0.0 - - B 1.0.0; depends C == 1.0.0 - - C 1.0.0 - - C 2.0.0 - -Here, `A` cannot be installed because it depends on `B` (which depends on -a different version of `C` than `A` itself. In real world examples, the -conflicting version are not so easy to spot. I'm suggesting an error -message which looks something like this: - - A 1.0.0 -> B 1.0.0 -> C 1.0.0 - A 1.0.0 -> C 2.0.0 - -That is, for the conflicting package, we show the user where exactly the -requirement came from. - - -## Double requirement - -I've noticed that in many cases the old resolver messages are more -informative. For example, in the simple example: - - base: - available: - - B 1.0.0 - - B 2.0.0 - -Now if we want to install both version of `B` at the same time, -i.e. the requirement `B==1.0.0 B==2.0.0`, we get: - - ERROR: Could not find a version that satisfies the requirement B==1.0.0 - ERROR: Could not find a version that satisfies the requirement B==2.0.0 - No matching distribution found for b, b - -Even though both version are actually available and satisfy each requirement, -just not at once. When trying to install a version of `B` which does not -exist, say requirement `B==1.5.0`, you get the same type of error message: - - Could not find a version that satisfies the requirement B==1.5.0 - No matching distribution found for b - -For this case, the old error message was: - - Could not find a version that satisfies the requirement B==1.5.0 (from versions: 1.0.0, 2.0.0) - No matching distribution found for B==1.5.0 - -And the old error message for the requirement `B==1.0.0 B==2.0.0`: - - Double requirement given: B==2.0.0 (already in B==1.0.0, name='B') diff --git a/tests/yaml/README.md b/tests/yaml/README.md deleted file mode 100644 index 1a379fdcb..000000000 --- a/tests/yaml/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# YAML tests for pip's resolver - -This directory contains fixtures for testing pip's resolver. -The fixtures are written as `.yml` files, with a convenient format -that allows for specifying a custom index for temporary use. - -The `.yml` files are typically organized in the following way. Here, we are -going to take a closer look at the `simple.yml` file and step through the -test cases. A `base` section defines which packages are available upstream: - - base: - available: - - simple 0.1.0 - - simple 0.2.0 - - base 0.1.0; depends dep - - dep 0.1.0 - -Each package has a name and version number. Here, there are two -packages `simple` (with versoin `0.1.0` and `0.2.0`). The package -`base 0.1.0` depends on the requirement `dep` (which simply means it -depends on any version of `dep`. More generally, a package can also -depend on a specific version of another package, or a range of versions. - -Next, in our yaml file, we have the `cases:` section which is a list of -test cases. Each test case has a request and a response. The request -is what the user would want to do: - - cases: - - - request: - - install: simple - - uninstall: simple - response: - - state: - - simple 0.2.0 - - state: null - -Here the first request is to install the package simple, this would -basically be equivalent to typing `pip install simple`, and the corresponding -first response is that the state of installed packages is `simple 0.2.0`. -Note that by default the highest version of an available package will be -installed. - -The second request is to uninstall simple again, which will result in the -state `null` (basically an empty list of installed packages). - -When the yaml tests are run, each response is verified by checking which -packages got actually installed. Note that this is check is done in -alphabetical order. - - - -The linter is very useful for initally checking `.yml` files, e.g.: - - $ python linter.py -v simple.yml - -To run only the yaml tests, use (from the root of the source tree): - - $ tox -e py38 -- -m yaml -vv - -Or, in order to avoid collecting all the test cases: - - $ tox -e py38 -- tests/functional/test_yaml.py - -Or, only a specific test: - - $ tox -e py38 -- tests/functional/test_yaml.py -k simple - -Or, just a specific test case: - - $ tox -e py38 -- tests/functional/test_yaml.py -k simple-0 - - - diff --git a/tests/yaml/backtrack.yml b/tests/yaml/backtrack.yml deleted file mode 100644 index ffcb722b8..000000000 --- a/tests/yaml/backtrack.yml +++ /dev/null @@ -1,40 +0,0 @@ -# Pradyun's backtracking example -base: - available: - - A 1.0.0; depends B == 1.0.0 - - A 2.0.0; depends B == 2.0.0, C == 1.0.0 - - A 3.0.0; depends B == 3.0.0, C == 2.0.0 - - A 4.0.0; depends B == 4.0.0, C == 3.0.0 - - A 5.0.0; depends B == 5.0.0, C == 4.0.0 - - A 6.0.0; depends B == 6.0.0, C == 5.0.0 - - A 7.0.0; depends B == 7.0.0, C == 6.0.0 - - A 8.0.0; depends B == 8.0.0, C == 7.0.0 - - - B 1.0.0; depends C == 1.0.0 - - B 2.0.0; depends C == 2.0.0 - - B 3.0.0; depends C == 3.0.0 - - B 4.0.0; depends C == 4.0.0 - - B 5.0.0; depends C == 5.0.0 - - B 6.0.0; depends C == 6.0.0 - - B 7.0.0; depends C == 7.0.0 - - B 8.0.0; depends C == 8.0.0 - - - C 1.0.0 - - C 2.0.0 - - C 3.0.0 - - C 4.0.0 - - C 5.0.0 - - C 6.0.0 - - C 7.0.0 - - C 8.0.0 - -cases: -- - request: - - install: A - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - skip: legacy diff --git a/tests/yaml/circular.yml b/tests/yaml/circular.yml deleted file mode 100644 index 95c535454..000000000 --- a/tests/yaml/circular.yml +++ /dev/null @@ -1,45 +0,0 @@ -base: - available: - - A 1.0.0; depends B == 1.0.0 - - B 1.0.0; depends C == 1.0.0 - - C 1.0.0; depends D == 1.0.0 - - D 1.0.0; depends A == 1.0.0 - -cases: -# NOTE: Do we want to check the order? -- - request: - - install: A - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - D 1.0.0 -- - request: - - install: B - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - D 1.0.0 -- - request: - - install: C - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - D 1.0.0 -- - request: - - install: D - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - D 1.0.0 diff --git a/tests/yaml/conflict_1.yml b/tests/yaml/conflict_1.yml deleted file mode 100644 index dc18be32a..000000000 --- a/tests/yaml/conflict_1.yml +++ /dev/null @@ -1,77 +0,0 @@ -base: - available: - - A 1.0.0; depends B == 1.0.0, B == 2.0.0 - - B 1.0.0 - - B 2.0.0 - -cases: -- - request: - - install: A - response: - - error: - code: 0 - stderr: ['incompatible'] - skip: legacy - # -- a good error message would be: - # A 1.0.0 has incompatible requirements B==1.0.0, B==2.0.0 - -- - request: - - install: ['B==1.0.0', 'B'] - response: - - state: - - B 1.0.0 - skip: legacy - # -- old error: - # Double requirement given: B (already in B==1.0.0, name='B') - -- - request: - - install: ['B==1.0.0', 'B==2.0.0'] - response: - - state: null - error: - code: 1 - stderr: >- - Cannot install B==1.0.0 and B==2.0.0 because these - package versions have conflicting dependencies. - skip: legacy - # -- currently the (new resolver) error message is: - # Could not find a version that satisfies the requirement B==1.0.0 - # Could not find a version that satisfies the requirement B==2.0.0 - # No matching distribution found for b, b - # -- better would be: - # cannot install different version (1.0.0, 2.0.0) of package B at the - # same time. - # -- the old error message was actually better here: - # Double requirement given: B==2.0.0 (already in B==1.0.0, name='B') - -- - request: - - install: B==1.5.0 - response: - - state: null - error: - code: 1 - stderr: 'no\s+matching\s+distribution' - skip: legacy - # -- currently (new resolver) error message is: - # Could not find a version that satisfies the requirement B==1.5.0 - # No matching distribution found for b - # -- the old error message was actually better here: - # Could not find a version that satisfies the requirement B==1.5.0 (from versions: 1.0.0, 2.0.0) - # No matching distribution found for B==1.5.0 - -- - request: - - install: A==2.0 - response: - - state: null - error: - code: 1 - stderr: 'no\s+matching\s+distribution' - skip: legacy - # -- currently the error message is: - # Could not find a version that satisfies the requirement A==2.0 - # No matching distribution found for a diff --git a/tests/yaml/conflict_2.yml b/tests/yaml/conflict_2.yml deleted file mode 100644 index 7ec5848ed..000000000 --- a/tests/yaml/conflict_2.yml +++ /dev/null @@ -1,28 +0,0 @@ -# Tzu-ping mentioned this example -base: - available: - - name: virtualenv - version: 20.0.2 - depends: ['six>=1.12.0,<2'] - - six 1.11 - - six 1.12 - - six 1.13 - -cases: -- - request: - - install: virtualenv - response: - - state: - - six 1.13 - - virtualenv 20.0.2 -- - request: - - install: ['six<1.12', 'virtualenv==20.0.2'] - response: - - state: null - error: - stderr: >- - Cannot install six<1.12 and virtualenv 20.0.2 because these - package versions have conflicting dependencies. - skip: legacy diff --git a/tests/yaml/conflict_3.yml b/tests/yaml/conflict_3.yml deleted file mode 100644 index 53f2b4a98..000000000 --- a/tests/yaml/conflict_3.yml +++ /dev/null @@ -1,22 +0,0 @@ -base: - available: - - A 1.0.0; depends B == 1.0.0, C == 2.0.0 - - B 1.0.0; depends C == 1.0.0 - - C 1.0.0 - - C 2.0.0 - -cases: -- - request: - - install: A - response: - - state: null - skip: legacy - # -- currently the error message is: - # Could not find a version that satisfies the requirement C==2.0.0 (from a) - # Could not find a version that satisfies the requirement C==1.0.0 (from b) - # No matching distribution found for c, c - # -- This is a bit confusing, as both versions of C are available. - # -- better would be something like: - # A 1.0.0 -> B 1.0.0 -> C 1.0.0 - # A 1.0.0 -> C 2.0.0 diff --git a/tests/yaml/conflicting_diamond.yml b/tests/yaml/conflicting_diamond.yml deleted file mode 100644 index c28b667ac..000000000 --- a/tests/yaml/conflicting_diamond.yml +++ /dev/null @@ -1,19 +0,0 @@ -cases: -- - available: - - A 1.0.0; depends B == 1.0.0, C == 1.0.0 - - B 1.0.0; depends D == 1.0.0 - - C 1.0.0; depends D == 2.0.0 - - D 1.0.0 - - D 2.0.0 - request: - - install: A - response: - - error: - code: 1 - stderr: >- - Cannot install A and A because these package - versions have conflicting dependencies. - # TODO: Tweak this error message to make sense. - # https://github.com/pypa/pip/issues/8495 - skip: legacy diff --git a/tests/yaml/conflicting_triangle.yml b/tests/yaml/conflicting_triangle.yml deleted file mode 100644 index 02b348ca2..000000000 --- a/tests/yaml/conflicting_triangle.yml +++ /dev/null @@ -1,18 +0,0 @@ -cases: -- - available: - - A 1.0.0; depends C == 1.0.0 - - B 1.0.0; depends C == 2.0.0 - - C 1.0.0 - - C 2.0.0 - request: - - install: A - - install: B - response: - - state: - - A 1.0.0 - - C 1.0.0 - - error: - code: 0 - stderr: ['c==1\.0\.0', 'incompatible'] - skip: legacy diff --git a/tests/yaml/extras.yml b/tests/yaml/extras.yml deleted file mode 100644 index b0f4e992c..000000000 --- a/tests/yaml/extras.yml +++ /dev/null @@ -1,49 +0,0 @@ -base: - available: - - A 1.0.0; depends B == 1.0.0, C == 1.0.0, D == 1.0.0 - - B 1.0.0; depends D[extra_1] == 1.0.0 - - C 1.0.0; depends D[extra_2] == 1.0.0 - - name: D - version: 1.0.0 - depends: [] - extras: - extra_1: [E == 1.0.0] - extra_2: [F == 1.0.0] - - E 1.0.0 - - F 1.0.0 -cases: -- - request: - - install: B - response: - - state: - - B 1.0.0 - - D 1.0.0 - - E 1.0.0 -- - request: - - install: C - response: - - state: - - C 1.0.0 - - D 1.0.0 - - F 1.0.0 -- - request: - - install: A - response: - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - D 1.0.0 - - E 1.0.0 - - F 1.0.0 - skip: legacy -- - request: - - install: D[extra_1] - options: --no-deps - response: - - state: - - D 1.0.0 diff --git a/tests/yaml/fallback.yml b/tests/yaml/fallback.yml deleted file mode 100644 index 86925398a..000000000 --- a/tests/yaml/fallback.yml +++ /dev/null @@ -1,20 +0,0 @@ -base: - available: - - A 1.0.0; depends B == 1.0.0, C == 1.0.0 - - A 0.8.0 - - B 1.0.0; depends D == 1.0.0 - - C 1.0.0; depends D == 2.0.0 - - D 1.0.0 - - D 2.0.0 - -cases: -- - request: - - install: A - response: - - state: - - A 0.8.0 - # the old resolver tries to install A 1.0.0 (which fails), but the new - # resolver realises that A 1.0.0 cannot be installed and falls back to - # installing the older version A 0.8.0 instead. - skip: legacy diff --git a/tests/yaml/huge.yml b/tests/yaml/huge.yml deleted file mode 100644 index 01bfdf26f..000000000 --- a/tests/yaml/huge.yml +++ /dev/null @@ -1,1260 +0,0 @@ -base: - available: - - alabaster 0.7.10 - - alabaster 0.7.11 - - appdirs 1.4.3 - - asn1crypto 0.22.0 - - asn1crypto 0.23.0 - - asn1crypto 0.24.0 - - name: astroid - version: 1.5.3 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.0 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.1 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.2 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.3 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.4 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 1.6.5 - depends: ['lazy-object-proxy', 'setuptools', 'six', 'wrapt'] - - name: astroid - version: 2.0.2 - depends: ['lazy-object-proxy', 'six', 'wrapt'] - - name: astroid - version: 2.0.4 - depends: ['lazy-object-proxy', 'six', 'wrapt'] - - name: attrs - version: 17.2.0 - depends: ['hypothesis', 'pympler', 'zope', 'zope.interface'] - - name: attrs - version: 17.3.0 - depends: ['hypothesis', 'pympler', 'zope', 'zope.interface'] - - attrs 17.4.0 - - attrs 18.1.0 - - name: automat - version: 0.6.0 - depends: ['attrs', 'six'] - - name: automat - version: 0.7.0 - depends: ['attrs', 'six'] - - name: babel - version: 2.5.0 - depends: ['pytz'] - - name: babel - version: 2.5.1 - depends: ['pytz'] - - name: babel - version: 2.5.3 - depends: ['pytz'] - - name: babel - version: 2.6.0 - depends: ['pytz'] - - backcall 0.1.0 - - backports 1.0 - - name: backports.functools_lru_cache - version: '1.4' - depends: ['backports', 'setuptools'] - - name: backports.functools_lru_cache - version: '1.5' - depends: ['backports', 'setuptools'] - - name: backports.shutil_get_terminal_size - version: 1.0.0 - depends: ['backports'] - - backports_abc 0.5 - - beautifulsoup4 4.6.0 - - beautifulsoup4 4.6.1 - - beautifulsoup4 4.6.3 - - bitarray 0.8.1 - - bitarray 0.8.2 - - bitarray 0.8.3 - - name: bkcharts - version: '0.2' - depends: ['numpy >=1.7.1', 'pandas', 'six >=1.5.2'] - - name: bleach - version: 2.0.0 - depends: ['html5lib >=0.99999999', 'six'] - - name: bleach - version: 2.1.1 - depends: ['html5lib >=0.99999999', 'setuptools', 'six'] - - name: bleach - version: 2.1.2 - depends: ['html5lib >=0.99999999', 'setuptools', 'six'] - - name: bleach - version: 2.1.3 - depends: ['html5lib >=0.99999999', 'setuptools', 'six'] - - name: bokeh - version: 0.12.10 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.11 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.13 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.14 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'packaging >=16.8', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.15 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'packaging >=16.8', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.16 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'packaging >=16.8', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.7 - depends: ['bkcharts >=0.2', 'jinja2 >=2.7', 'matplotlib', 'numpy >=1.7.1', 'pandas', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'requests >=1.2.3', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.12.9 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: bokeh - version: 0.13.0 - depends: ['jinja2 >=2.7', 'numpy >=1.7.1', 'packaging >=16.8', 'python-dateutil >=2.1', 'pyyaml >=3.10', 'six >=1.5.2', 'tornado >=4.3'] - - name: boto3 - version: 1.4.7 - depends: ['botocore >=1.7.0,<1.8.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.4.8 - depends: ['botocore >=1.8.0,<1.9.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.5.32 - depends: ['botocore >=1.8.46,<1.9.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.6.18 - depends: ['botocore >=1.9.18,<1.10.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.7.24 - depends: ['botocore >=1.10.24,<1.11.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.7.32 - depends: ['botocore >=1.10.32,<1.11.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.7.4 - depends: ['botocore >=1.10.4,<1.11.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.7.45 - depends: ['botocore >=1.10.45,<1.11.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: boto3 - version: 1.7.62 - depends: ['botocore >=1.10.62,<1.11.0', 'jmespath >=0.7.1,<1.0.0', 's3transfer >=0.1.10,<0.2.0'] - - name: botocore - version: 1.10.12 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.10.24 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.10.32 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.10.4 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<2.7.0'] - - name: botocore - version: 1.10.45 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.10.62 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.5.78 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.7.14 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.7.20 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.7.40 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.7.5 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.8.21 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.8.46 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.8.5 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<3.0.0'] - - name: botocore - version: 1.9.18 - depends: ['docutils >=0.10', 'jmespath >=0.7.1,<1.0.0', 'python-dateutil >=2.1,<2.7.0'] - - certifi 2017.11.5 - - certifi 2017.7.27.1 - - certifi 2018.1.18 - - certifi 2018.4.16 - - certifi 2018.8.13 - # cffi is a bundled module in PyPy and causes resolution errors if pip - # tries to installed it. Give it a different name since we are simply - # checking the graph anyway and the identifier doesn't really matter. - - name: cffi_not_really - version: 1.10.0 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.2 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.4 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.5 - depends: ['pycparser'] - - chardet 3.0.4 - - click 6.7 - - cloudpickle 0.4.0 - - cloudpickle 0.4.2 - - cloudpickle 0.5.2 - - cloudpickle 0.5.3 - - colorama 0.3.9 - - configparser 3.5.0 - - constantly 15.1.0 - - contextlib2 0.5.5 - - coverage 4.4.2 - - coverage 4.5.1 - - name: cryptography - version: 2.0.3 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'openssl 1.0.*', 'six >=1.4.1'] - - name: cryptography - version: 2.1.3 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'openssl 1.0.*', 'openssl >=1.0.2m,<1.0.3a', 'six >=1.4.1'] - - name: cryptography - version: 2.1.4 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'openssl 1.0.*', 'openssl >=1.0.2m,<1.0.3a', 'six >=1.4.1'] - - name: cryptography - version: 2.2.1 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'openssl 1.0.*', 'openssl >=1.0.2n,<1.0.3a', 'six >=1.4.1'] - - name: cryptography - version: 2.2.2 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'openssl 1.0.*', 'openssl >=1.0.2o,<1.0.3a', 'six >=1.4.1'] - - name: cryptography - version: '2.3' - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'cryptography-vectors 2.3.*', 'idna >=2.1', 'openssl >=1.0.2o,<1.0.3a', 'six >=1.4.1'] - - cryptography-vectors 2.0.3 - - cryptography-vectors 2.1.3 - - cryptography-vectors 2.1.4 - - cryptography-vectors 2.2.1 - - cryptography-vectors 2.2.2 - - cryptography-vectors 2.3 - - name: cycler - version: 0.10.0 - depends: ['six'] - - name: cytoolz - version: 0.8.2 - depends: ['toolz >=0.8.0'] - - name: cytoolz - version: 0.9.0 - depends: ['toolz >=0.8.0'] - - name: cytoolz - version: 0.9.0.1 - depends: ['toolz >=0.8.0'] - - name: dask - version: 0.15.2 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.15.2.*', 'distributed >=1.16.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.15.3 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.15.3.*', 'distributed >=1.19.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.15.4 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.15.4.*', 'distributed >=1.19.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.16.0 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.16.0.*', 'distributed >=1.20.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.16.1 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.16.1.*', 'distributed >=1.20.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.0 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.17.0.*', 'distributed >=1.21.0', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.1 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'dask-core 0.17.1.*', 'distributed >=1.21.1', 'numpy >=1.10', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.2 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.17.2.*', 'distributed >=1.21.0', 'numpy >=1.10.4', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.3 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.17.3.*', 'distributed >=1.21.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.4 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.17.4.*', 'distributed >=1.21.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.17.5 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.17.5.*', 'distributed >=1.21.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.18.0 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.18.0.*', 'distributed >=1.22.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.18.1 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.18.1.*', 'distributed >=1.22.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - name: dask - version: 0.18.2 - depends: ['bokeh', 'cloudpickle >=0.2.1', 'cytoolz >=0.7.3', 'dask-core 0.18.2.*', 'distributed >=1.22.0', 'numpy >=1.11.0', 'pandas >=0.19.0', 'partd >=0.3.8', 'toolz >=0.7.3'] - - dask-core 0.15.2 - - dask-core 0.15.3 - - dask-core 0.15.4 - - dask-core 0.16.0 - - dask-core 0.16.1 - - dask-core 0.17.0 - - dask-core 0.17.1 - - dask-core 0.17.2 - - dask-core 0.17.3 - - dask-core 0.17.4 - - dask-core 0.17.5 - - dask-core 0.18.0 - - dask-core 0.18.1 - - dask-core 0.18.2 - - decorator 4.1.2 - - decorator 4.2.1 - - decorator 4.3.0 - - dill 0.2.7.1 - - dill 0.2.8.2 - - name: distributed - version: 1.18.3 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.15.2', 'msgpack-python', 'psutil', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.2'] - - name: distributed - version: 1.19.1 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.15.2', 'msgpack-python', 'psutil', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.20.0 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.16.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.20.1 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.16.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.20.2 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.16.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.0 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.1 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.2 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.3 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.4 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.5 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.6 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.21.8 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.17.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.22.0 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.18.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - name: distributed - version: 1.22.1 - depends: ['click >=6.6', 'cloudpickle >=0.2.2', 'cytoolz >=0.7.4', 'dask-core >=0.18.0', 'msgpack-python', 'psutil', 'pyyaml', 'six', 'sortedcontainers', 'tblib', 'toolz >=0.7.4', 'tornado >=4.5.1', 'zict >=0.1.3'] - - docutils 0.14 - - entrypoints 0.2.3 - - enum34 1.1.6 - - expat 2.2.4 - - expat 2.2.5 - - filelock 2.0.12 - - filelock 2.0.13 - - filelock 3.0.4 - - name: flask - version: 0.12.2 - depends: ['click >=2.0', 'itsdangerous >=0.21', 'jinja2 >=2.4', 'werkzeug >=0.7'] - - name: flask - version: 1.0.2 - depends: ['click >=5.1', 'itsdangerous >=0.24', 'jinja2 >=2.10', 'werkzeug >=0.14'] - - fribidi 1.0.2 - - fribidi 1.0.4 - - funcsigs 1.0.2 - - functools32 3.2.3.2 - - future 0.16.0 - - futures 3.1.1 - - futures 3.2.0 - - name: gevent - version: 1.2.2 - depends: ['cffi_not_really >=1.3.0', 'greenlet >=0.4.10'] - - name: gevent - version: 1.3.0 - depends: ['cffi_not_really >=1.11.5', 'greenlet >=0.4.10'] - - name: gevent - version: 1.3.2.post0 - depends: ['cffi_not_really >=1.11.5', 'greenlet >=0.4.13'] - - name: gevent - version: 1.3.3 - depends: ['cffi_not_really >=1.11.5', 'greenlet >=0.4.13'] - - name: gevent - version: 1.3.4 - depends: ['cffi_not_really >=1.11.5', 'greenlet >=0.4.13'] - - name: gevent - version: 1.3.5 - depends: ['cffi_not_really >=1.11.5', 'greenlet >=0.4.13'] - - glob2 0.5 - - glob2 0.6 - - gmp 6.1.2 - - graphite2 1.3.10 - - graphite2 1.3.11 - - greenlet 0.4.12 - - greenlet 0.4.13 - - greenlet 0.4.14 - - name: html5lib - version: '0.999999999' - depends: ['six >=1.9', 'webencodings'] - - name: html5lib - version: 1.0.1 - depends: ['six >=1.9', 'webencodings'] - - name: hyperlink - version: 18.0.0 - depends: ['idna >=2.5'] - - hypothesis 3.23.0 - - name: hypothesis - version: 3.37.0 - depends: ['attrs', 'coverage'] - - name: hypothesis - version: 3.38.5 - depends: ['attrs', 'coverage'] - - name: hypothesis - version: 3.46.0 - depends: ['attrs', 'coverage'] - - name: hypothesis - version: 3.52.0 - depends: ['attrs >=16.0.0', 'coverage'] - - name: hypothesis - version: 3.53.0 - depends: ['attrs >=16.0.0', 'coverage'] - - name: hypothesis - version: 3.56.0 - depends: ['attrs >=16.0.0', 'coverage'] - - name: hypothesis - version: 3.57.0 - depends: ['attrs >=16.0.0', 'coverage'] - - name: hypothesis - version: 3.59.1 - depends: ['attrs >=16.0.0', 'coverage'] - - name: ibis-framework - version: 0.12.0 - depends: ['impyla >=0.14.0', 'multipledispatch', 'numpy >=1.10.0', 'pandas >=0.18.1', 'psycopg2', 'python-graphviz', 'setuptools', 'six', 'sqlalchemy >=1.0.0', 'thrift', 'thriftpy <=0.3.9', 'toolz'] - - name: ibis-framework - version: 0.13.0 - depends: ['impyla >=0.14.0', 'multipledispatch', 'numpy >=1.10.0', 'pandas >=0.18.1', 'psycopg2', 'python-graphviz', 'setuptools', 'six', 'sqlalchemy >=1.0.0', 'thrift', 'thriftpy <=0.3.9', 'toolz'] - - icu 58.2 - - idna 2.6 - - idna 2.7 - - imagesize 0.7.1 - - imagesize 1.0.0 - - name: impyla - version: 0.14.0 - depends: ['bitarray', 'setuptools', 'six', 'thriftpy >=0.3.5'] - - name: impyla - version: 0.14.1 - depends: ['bitarray', 'setuptools', 'six', 'thriftpy >=0.3.5'] - - incremental 17.5.0 - - ipaddress 1.0.18 - - ipaddress 1.0.19 - - ipaddress 1.0.22 - - name: ipykernel - version: 4.6.1 - depends: ['ipython', 'jupyter_client', 'tornado >=4.0', 'traitlets >=4.1'] - - name: ipykernel - version: 4.7.0 - depends: ['ipython', 'jupyter_client', 'tornado >=4.0', 'traitlets >=4.1'] - - name: ipykernel - version: 4.8.0 - depends: ['ipython >=4.0.0', 'jupyter_client', 'tornado >=4.0', 'traitlets >=4.1'] - - name: ipykernel - version: 4.8.2 - depends: ['ipython >=4.0.0', 'jupyter_client', 'tornado >=4.0', 'traitlets >=4.1'] - - name: ipython - version: 5.4.1 - depends: ['decorator', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 5.5.0 - depends: ['decorator', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 5.6.0 - depends: ['decorator', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 5.7.0 - depends: ['backports.shutil_get_terminal_size', 'decorator', 'pathlib2', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 5.8.0 - depends: ['decorator', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 6.1.0 - depends: ['decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 6.2.1 - depends: ['decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets'] - - name: ipython - version: 6.3.0 - depends: ['backcall', 'decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets >=4.2'] - - name: ipython - version: 6.3.1 - depends: ['backcall', 'decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets >=4.2'] - - name: ipython - version: 6.4.0 - depends: ['backcall', 'decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets >=4.2'] - - name: ipython - version: 6.5.0 - depends: ['backcall', 'decorator', 'jedi >=0.10', 'pexpect', 'pickleshare', 'prompt_toolkit >=1.0.4,<2.0.0', 'pygments', 'simplegeneric >0.8', 'traitlets >=4.2'] - - name: ipython-notebook - version: 0.13.2 - depends: ['ipython 0.13.2', 'pyzmq 2.2.0.1', 'tornado'] - - name: ipython-notebook - version: 1.0.0 - depends: ['ipython 1.0.0', 'pyzmq 2.2.0.1', 'tornado'] - - name: ipython-notebook - version: 1.1.0 - depends: ['ipython 1.1.0', 'jinja2', 'pyzmq 2.2.0.1', 'tornado'] - - name: ipython-notebook - version: 2.0.0 - depends: ['ipython 2.0.0', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 2.1.0 - depends: ['ipython 2.1.0', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 2.2.0 - depends: ['ipython 2.2.0', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 2.3.0 - depends: ['ipython 2.3.0', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 2.3.1 - depends: ['ipython 2.3.1', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 2.4.1 - depends: ['ipython 2.4.1', 'jinja2', 'pyzmq 14.*', 'tornado'] - - name: ipython-notebook - version: 3.0.0 - depends: ['ipython 3.0.0', 'jinja2', 'jsonschema 2.4.0', 'mistune', 'pygments', 'pyzmq 14.*', 'terminado 0.5', 'tornado'] - - name: ipython-notebook - version: 3.1.0 - depends: ['ipython 3.1.0', 'jinja2', 'jsonschema 2.4.0', 'mistune', 'pygments', 'pyzmq 14.*', 'terminado 0.5', 'tornado'] - - name: ipython-notebook - version: 3.2.0 - depends: ['ipython 3.2.0', 'jinja2', 'jsonschema 2.4.0', 'mistune', 'pygments', 'pyzmq 14.*', 'terminado 0.5', 'tornado'] - - name: ipython-notebook - version: 3.2.1 - depends: ['ipython 3.2.1', 'jinja2', 'jsonschema 2.4.0', 'mistune', 'pygments', 'pyzmq 14.*', 'terminado 0.5', 'tornado'] - - name: ipython-notebook - version: 4.0.4 - depends: ['notebook'] - - ipython_genutils 0.2.0 - - name: ipywidgets - version: 7.0.0 - depends: ['ipykernel >=4.5.1', 'ipython', 'nbformat >=4.2.0', 'traitlets >=4.3.1', 'widgetsnbextension >=3.0.0'] - - name: ipywidgets - version: 7.0.5 - depends: ['ipykernel >=4.5.1', 'ipython', 'nbformat >=4.2.0', 'traitlets >=4.3.1', 'widgetsnbextension >=3.0.0'] - - name: ipywidgets - version: 7.1.0 - depends: ['ipykernel >=4.5.1', 'ipython', 'nbformat >=4.2.0', 'traitlets >=4.3.1', 'widgetsnbextension >=3.0.0'] - - name: ipywidgets - version: 7.1.1 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.1.0,<4.0'] - - name: ipywidgets - version: 7.1.2 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.1.0,<4.0'] - - name: ipywidgets - version: 7.2.0 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.2.0,<4.0.0'] - - name: ipywidgets - version: 7.2.1 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.2.0,<4.0.0'] - - name: ipywidgets - version: 7.3.0 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.3.0,<3.4.0'] - - name: ipywidgets - version: 7.3.1 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.3.0,<3.4.0'] - - name: ipywidgets - version: 7.4.0 - depends: ['ipykernel >=4.5.1', 'ipython >=4.0.0', 'nbformat >=4.2.0', 'traitlets >=4.3.1,<5.0.0', 'widgetsnbextension >=3.4.0,<3.5.0'] - - itsdangerous 0.24 - - jedi 0.10.2 - - name: jedi - version: 0.11.0 - depends: ['parso ==0.1.0'] - - name: jedi - version: 0.11.1 - depends: ['numpydoc', 'parso >=0.1.0,<0.2'] - - name: jedi - version: 0.12.0 - depends: ['parso >=0.2.0'] - - name: jedi - version: 0.12.1 - depends: ['parso >=0.3.0'] - - name: jinja2 - version: '2.10' - depends: ['markupsafe >=0.23', 'setuptools'] - - name: jinja2 - version: 2.9.6 - depends: ['markupsafe >=0.23', 'setuptools'] - - jmespath 0.9.3 - - jpeg 9b - - name: jsonschema - version: 2.6.0 - depends: ['setuptools'] - - name: jupyter - version: 1.0.0 - depends: ['ipykernel', 'ipywidgets', 'jupyter_console', 'nbconvert', 'notebook', 'qtconsole'] - - name: jupyter_client - version: 5.1.0 - depends: ['jupyter_core', 'python-dateutil >=2.1', 'pyzmq >=13', 'traitlets'] - - name: jupyter_client - version: 5.2.1 - depends: ['jupyter_core', 'python-dateutil >=2.1', 'pyzmq >=13', 'traitlets'] - - name: jupyter_client - version: 5.2.2 - depends: ['jupyter_core', 'python-dateutil >=2.1', 'pyzmq >=13', 'tornado', 'traitlets'] - - name: jupyter_client - version: 5.2.3 - depends: ['jupyter_core', 'python-dateutil >=2.1', 'pyzmq >=13', 'tornado', 'traitlets'] - - name: jupyter_console - version: 5.2.0 - depends: ['ipykernel', 'ipython', 'jupyter_client', 'pexpect', 'prompt_toolkit', 'pygments'] - - name: jupyter_core - version: 4.3.0 - depends: ['traitlets'] - - name: jupyter_core - version: 4.4.0 - depends: ['traitlets'] - - kiwisolver 1.0.0 - - kiwisolver 1.0.1 - - lazy-object-proxy 1.3.1 - - llvmlite 0.20.0 - - llvmlite 0.21.0 - - llvmlite 0.22.0 - - locket 0.2.0 - - name: logilab-common - version: 1.4.1 - depends: ['setuptools', 'six >=1.4.0'] - - make 4.2.1 - - markupsafe 1.0 - - name: matplotlib - version: 2.0.2 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.6.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.1.0 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.6.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.1.1 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.6.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.1.2 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.6.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.2.0 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.6.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.2.2 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt >=5.6,<6.0a0', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - name: matplotlib - version: 2.2.3 - depends: ['cycler >=0.10', 'numpy', 'pyparsing', 'pyqt 5.9.*', 'python-dateutil', 'pytz', 'setuptools', 'tornado'] - - mistune 0.7.4 - - mistune 0.8.1 - - mistune 0.8.3 - - msgpack-python 0.4.8 - - msgpack-python 0.5.1 - - msgpack-python 0.5.5 - - msgpack-python 0.5.6 - - multipledispatch 0.4.9 - - multipledispatch 0.5.0 - - name: multipledispatch - version: 0.6.0 - depends: ['six'] - - name: nbconvert - version: 5.3.1 - depends: ['bleach', 'entrypoints >=0.2.2', 'jinja2', 'jupyter_client >=4.2', 'jupyter_core', 'mistune >0.6', 'nbformat', 'pandoc', 'pandocfilters >=1.4.1', 'pygments', 'testpath', 'traitlets'] - - name: nbformat - version: 4.4.0 - depends: ['ipython_genutils', 'jsonschema >=2.4,!=2.5.0', 'jupyter_core', 'traitlets >=4.1'] - - ncurses 6.0 - - ncurses 6.1 - - name: nose - version: 1.3.7 - depends: ['setuptools'] - - name: notebook - version: 5.0.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client', 'jupyter_core', 'nbconvert', 'nbformat', 'terminado >=0.3.3', 'tornado >=4', 'traitlets >=4.3'] - - name: notebook - version: 5.1.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client', 'jupyter_core', 'nbconvert', 'nbformat', 'terminado >=0.3.3', 'tornado >=4', 'traitlets >=4.3'] - - name: notebook - version: 5.2.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client', 'jupyter_core', 'nbconvert', 'nbformat', 'terminado >=0.3.3', 'tornado >=4', 'traitlets >=4.3'] - - name: notebook - version: 5.2.1 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client', 'jupyter_core', 'nbconvert', 'nbformat', 'terminado >=0.3.3', 'tornado >=4', 'traitlets >=4.3'] - - name: notebook - version: 5.2.2 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client', 'jupyter_core', 'nbconvert', 'nbformat', 'terminado >=0.3.3', 'tornado >=4', 'traitlets >=4.3'] - - name: notebook - version: 5.3.1 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client >=5.2.0', 'jupyter_core >=4.4.0', 'nbconvert', 'nbformat', 'send2trash', 'terminado >=0.8.1', 'tornado >=4', 'traitlets >=4.2.1'] - - name: notebook - version: 5.4.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client >=5.2.0', 'jupyter_core >=4.4.0', 'nbconvert', 'nbformat', 'send2trash', 'terminado >=0.8.1', 'tornado >=4', 'traitlets >=4.2.1'] - - name: notebook - version: 5.4.1 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client >=5.2.0', 'jupyter_core >=4.4.0', 'nbconvert', 'nbformat', 'send2trash', 'terminado >=0.8.1', 'tornado >=4', 'traitlets >=4.2.1'] - - name: notebook - version: 5.5.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client >=5.2.0', 'jupyter_core >=4.4.0', 'nbconvert', 'nbformat', 'pyzmq >=17', 'send2trash', 'terminado >=0.8.1', 'tornado >=4', 'traitlets >=4.2.1'] - - name: notebook - version: 5.6.0 - depends: ['ipykernel', 'ipython_genutils', 'jinja2', 'jupyter_client >=5.2.0', 'jupyter_core >=4.4.0', 'nbconvert', 'nbformat', 'prometheus_client', 'pyzmq >=17', 'send2trash', 'terminado >=0.8.1', 'tornado >=4', 'traitlets >=4.2.1'] - - numpy 1.11.3 - - numpy 1.12.1 - - numpy 1.13.1 - - numpy 1.13.3 - - numpy 1.14.0 - - numpy 1.14.1 - - numpy 1.14.2 - - numpy 1.14.3 - - numpy 1.14.4 - - numpy 1.14.5 - - numpy 1.15.0 - - numpy 1.9.3 - - name: numpydoc - version: 0.7.0 - depends: ['sphinx'] - - name: numpydoc - version: 0.8.0 - depends: ['sphinx'] - - name: openssl - version: 1.0.2l - depends: ['ca-certificates'] - - name: openssl - version: 1.0.2m - depends: ['ca-certificates'] - - name: openssl - version: 1.0.2n - depends: ['ca-certificates'] - - name: openssl - version: 1.0.2o - depends: ['ca-certificates'] - - name: openssl - version: 1.0.2p - depends: ['ca-certificates'] - - name: packaging - version: '16.8' - depends: ['pyparsing', 'six'] - - name: packaging - version: '17.1' - depends: ['pyparsing', 'six'] - - name: pandas - version: 0.20.3 - depends: ['numpy >=1.9', 'python-dateutil', 'pytz'] - - name: pandas - version: 0.21.0 - depends: ['numpy >=1.9.3,<2.0a0', 'python-dateutil', 'pytz'] - - name: pandas - version: 0.21.1 - depends: ['numpy >=1.9.3,<2.0a0', 'python-dateutil', 'pytz'] - - name: pandas - version: 0.22.0 - depends: ['numpy >=1.9.3,<2.0a0', 'python-dateutil', 'pytz'] - - name: pandas - version: 0.23.0 - depends: ['numpy >=1.9.3,<2.0a0', 'python-dateutil', 'pytz'] - - name: pandas - version: 0.23.1 - depends: ['numpy >=1.9.3,<2.0a0', 'python-dateutil >=2.5.*', 'pytz'] - - name: pandas - version: 0.23.2 - depends: ['numpy >=1.11.3,<2.0a0', 'python-dateutil >=2.5.*', 'pytz'] - - name: pandas - version: 0.23.3 - depends: ['numpy >=1.11.3,<2.0a0', 'python-dateutil >=2.5.*', 'pytz'] - - name: pandas - version: 0.23.4 - depends: ['numpy >=1.11.3,<2.0a0', 'python-dateutil >=2.5.*', 'pytz'] - - pandocfilters 1.4.2 - - parso 0.1.0 - - parso 0.1.1 - - parso 0.2.0 - - parso 0.2.1 - - parso 0.3.0 - - parso 0.3.1 - - name: partd - version: 0.3.8 - depends: ['locket', 'toolz'] - - patchelf 0.9 - - path.py 10.3.1 - - path.py 10.5 - - path.py 11.0 - - path.py 11.0.1 - - name: pathlib2 - version: 2.3.0 - depends: ['six'] - - name: pathlib2 - version: 2.3.2 - depends: ['six'] - - pcre 8.41 - - pcre 8.42 - - perl 5.26.2 - - name: perl-app-cpanminus - version: '1.7039' - depends: ['perl 5.22.0*'] - - name: perl-encode-locale - version: '1.05' - depends: ['perl >=5.26.2,<5.27.0a0'] - - name: pexpect - version: 4.2.1 - depends: ['ptyprocess >=0.5'] - - name: pexpect - version: 4.3.0 - depends: ['ptyprocess >=0.5'] - - name: pexpect - version: 4.3.1 - depends: ['ptyprocess >=0.5'] - - name: pexpect - version: 4.4.0 - depends: ['ptyprocess >=0.5'] - - name: pexpect - version: 4.5.0 - depends: ['ptyprocess >=0.5'] - - name: pexpect - version: 4.6.0 - depends: ['ptyprocess >=0.5'] - - pickleshare 0.7.4 - - name: pip - version: 10.0.1 - depends: ['setuptools', 'wheel'] - - name: pip - version: 9.0.1 - depends: ['setuptools', 'wheel'] - - name: pip - version: 9.0.3 - depends: ['setuptools', 'wheel'] - - pixman 0.34.0 - - pkginfo 1.4.1 - - pkginfo 1.4.2 - - ply 3.10 - - ply 3.11 - - name: prometheus_client - version: 0.2.0 - depends: ['twisted'] - - name: prometheus_client - version: 0.3.0 - depends: ['twisted'] - - name: prometheus_client - version: 0.3.1 - depends: ['twisted'] - - name: prompt_toolkit - version: 1.0.15 - depends: ['pygments', 'six >=1.9.0', 'wcwidth'] - - name: prompt_toolkit - version: 2.0.2 - depends: ['pygments', 'six >=1.9.0', 'wcwidth'] - - name: prompt_toolkit - version: 2.0.3 - depends: ['pygments', 'six >=1.9.0', 'wcwidth'] - - name: prompt_toolkit - version: 2.0.4 - depends: ['pygments', 'six >=1.9.0', 'wcwidth'] - - psutil 5.2.2 - - psutil 5.3.1 - - psutil 5.4.0 - - psutil 5.4.1 - - psutil 5.4.3 - - psutil 5.4.5 - - psutil 5.4.6 - - psycopg2 2.7.3.1 - - psycopg2 2.7.3.2 - - psycopg2 2.7.4 - - psycopg2 2.7.5 - - ptyprocess 0.5.2 - - ptyprocess 0.6.0 - - pyasn1 0.3.7 - - pyasn1 0.4.2 - - pyasn1 0.4.3 - - pyasn1 0.4.4 - - name: pyasn1-modules - version: 0.2.1 - depends: ['pyasn1 >=0.4.1,<0.5.0'] - - name: pyasn1-modules - version: 0.2.2 - depends: ['pyasn1 >=0.4.1,<0.5.0'] - - pycosat 0.6.2 - - pycosat 0.6.3 - - pycparser 2.18 - - name: pygments - version: 2.2.0 - depends: ['setuptools'] - - pympler 0.5 - - name: pyopenssl - version: 17.2.0 - depends: ['cryptography >=1.9', 'six >=1.5.2'] - - name: pyopenssl - version: 17.4.0 - depends: ['cryptography >=1.9', 'six >=1.5.2'] - - name: pyopenssl - version: 17.5.0 - depends: ['cryptography >=2.1.4', 'six >=1.5.2'] - - name: pyopenssl - version: 18.0.0 - depends: ['cryptography >=2.2.1', 'six >=1.5.2'] - - pyparsing 2.2.0 - - name: pyqt - version: 5.6.0 - depends: ['qt 5.6.*', 'sip 4.18.*'] - - name: pyqt - version: 5.9.2 - depends: ['dbus >=1.13.2,<2.0a0', 'qt 5.9.*', 'qt >=5.9.6,<5.10.0a0', 'sip >=4.19.4'] - - pysocks 1.6.7 - - pysocks 1.6.8 - - name: python-dateutil - version: 2.6.1 - depends: ['six'] - - name: python-dateutil - version: 2.7.0 - depends: ['six >=1.5'] - - name: python-dateutil - version: 2.7.2 - depends: ['six >=1.5'] - - name: python-dateutil - version: 2.7.3 - depends: ['six >=1.5'] - - name: python-digest - version: 1.1.1 - depends: ['cryptography <2.2'] - - python-graphviz 0.8.2 - - python-graphviz 0.8.3 - - python-graphviz 0.8.4 - - pytz 2017.2 - - pytz 2017.3 - - pytz 2018.3 - - pytz 2018.4 - - pytz 2018.5 - - pyyaml 3.12 - - pyyaml 3.13 - - pyzmq 16.0.2 - - pyzmq 16.0.3 - - pyzmq 17.0.0 - - pyzmq 17.1.0 - - pyzmq 17.1.2 - - name: qtconsole - version: 4.3.1 - depends: ['ipykernel >=4.1', 'jupyter_client >=4.1', 'jupyter_core', 'pygments', 'pyqt', 'traitlets'] - - name: qtconsole - version: 4.4.0 - depends: ['ipykernel >=4.1', 'jupyter_client >=4.1', 'jupyter_core', 'pygments', 'pyqt >=5.9.2,<5.10.0a0', 'traitlets'] - - redis 4.0.10 - - redis 4.0.2 - - redis 4.0.8 - - redis 4.0.9 - - redis-py 2.10.6 - - name: requests - version: 2.18.4 - depends: ['certifi >=2017.4.17', 'chardet >=3.0.2,<3.1.0', 'idna >=2.5,<2.7', 'urllib3 >=1.21.1,<1.23'] - - name: requests - version: 2.19.1 - depends: ['certifi >=2017.4.17', 'chardet >=3.0.2,<3.1.0', 'idna >=2.5,<2.8', 'urllib3 >=1.21.1,<1.24'] - - name: ruamel_yaml - version: 0.11.14 - depends: ['yaml'] - - name: ruamel_yaml - version: 0.15.35 - depends: ['yaml', 'yaml >=0.1.7,<0.2.0a0'] - - name: ruamel_yaml - version: 0.15.37 - depends: ['yaml >=0.1.7,<0.2.0a0'] - - name: ruamel_yaml - version: 0.15.40 - depends: ['yaml >=0.1.7,<0.2.0a0'] - - name: ruamel_yaml - version: 0.15.42 - depends: ['yaml >=0.1.7,<0.2.0a0'] - - name: ruamel_yaml - version: 0.15.46 - depends: ['yaml >=0.1.7,<0.2.0a0'] - - name: s3fs - version: 0.1.3 - depends: ['boto3'] - - name: s3fs - version: 0.1.4 - depends: ['boto3'] - - name: s3fs - version: 0.1.5 - depends: ['boto3'] - - name: s3transfer - version: 0.1.10 - depends: ['botocore >=1.3.0,<2.0.0'] - - name: s3transfer - version: 0.1.11 - depends: ['botocore >=1.3.0,<2.0.0'] - - name: s3transfer - version: 0.1.13 - depends: ['botocore >=1.3.0,<2.0.0'] - - scandir 1.5 - - scandir 1.6 - - scandir 1.7 - - scandir 1.8 - - scandir 1.9.0 - - name: scipy - version: 0.19.1 - depends: ['numpy >=1.9.3,<2.0a0'] - - name: scipy - version: 1.0.0 - depends: ['numpy >=1.9.3,<2.0a0'] - - name: scipy - version: 1.0.1 - depends: ['numpy >=1.9.3,<2.0a0'] - - name: scipy - version: 1.1.0 - depends: ['numpy >=1.11.3,<2.0a0'] - - send2trash 1.4.2 - - send2trash 1.5.0 - - name: service_identity - version: 17.0.0 - depends: ['attrs >=16.0.0', 'pyasn1', 'pyasn1-modules', 'pyopenssl >=0.12'] - - name: setuptools - version: 36.5.0 - depends: ['certifi'] - - name: setuptools - version: 38.4.0 - depends: ['certifi >=2016.09'] - - name: setuptools - version: 38.5.1 - depends: ['certifi >=2016.09'] - - name: setuptools - version: 39.0.1 - depends: ['certifi >=2016.09'] - - name: setuptools - version: 39.1.0 - depends: ['certifi >=2016.09'] - - name: setuptools - version: 39.2.0 - depends: ['certifi >=2016.09'] - - name: setuptools - version: 40.0.0 - depends: ['certifi >=2016.09'] - - simplegeneric 0.8.1 - - name: singledispatch - version: 3.4.0.3 - depends: ['six'] - - sip 4.18.1 - - sip 4.19.8 - - six 1.10.0 - - six 1.11.0 - - snowballstemmer 1.2.1 - - name: sortedcollections - version: 0.5.3 - depends: ['sortedcontainers'] - - name: sortedcollections - version: 0.6.1 - depends: ['sortedcontainers'] - - name: sortedcollections - version: 1.0.1 - depends: ['sortedcontainers >=2.0'] - - sortedcontainers 1.5.10 - - sortedcontainers 1.5.7 - - sortedcontainers 1.5.9 - - sortedcontainers 2.0.2 - - sortedcontainers 2.0.3 - - sortedcontainers 2.0.4 - - name: sphinx - version: 1.6.3 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.6.6 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.0 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'packaging', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.1 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'packaging', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.2 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'packaging', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.3 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'packaging', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.4 - depends: ['alabaster', 'babel', 'docutils', 'imagesize', 'jinja2', 'packaging', 'pygments', 'requests', 'six', 'snowballstemmer', 'sphinxcontrib-websupport', 'typing'] - - name: sphinx - version: 1.7.5 - depends: ['alabaster >=0.7,<0.8', 'babel >=1.3,!=2.0', 'docutils >=0.11', 'imagesize', 'jinja2 >=2.3', 'packaging', 'pygments >2.0', 'requests >2.0.0', 'six >=1.5', 'snowballstemmer >=1.1', 'sphinxcontrib-websupport'] - - name: sphinx - version: 1.7.6 - depends: ['alabaster >=0.7,<0.8', 'babel >=1.3,!=2.0', 'docutils >=0.11', 'imagesize', 'jinja2 >=2.3', 'packaging', 'pygments >2.0', 'requests >2.0.0', 'six >=1.5', 'snowballstemmer >=1.1', 'sphinxcontrib-websupport'] - - sphinxcontrib 1.0 - - name: sphinxcontrib-websupport - version: 1.0.1 - depends: ['sphinxcontrib'] - - name: sphinxcontrib-websupport - version: 1.1.0 - depends: ['sphinxcontrib'] - - sqlalchemy 1.1.13 - - sqlalchemy 1.2.0 - - sqlalchemy 1.2.1 - - sqlalchemy 1.2.10 - - sqlalchemy 1.2.3 - - sqlalchemy 1.2.4 - - sqlalchemy 1.2.5 - - sqlalchemy 1.2.6 - - sqlalchemy 1.2.7 - - sqlalchemy 1.2.8 - - name: ssl_match_hostname - version: 3.5.0.1 - depends: ['backports'] - - subprocess32 3.2.7 - - subprocess32 3.5.0 - - subprocess32 3.5.1 - - subprocess32 3.5.2 - - tblib 1.3.2 - - name: terminado - version: '0.6' - depends: ['ptyprocess', 'tornado >=4'] - - name: terminado - version: 0.8.1 - depends: ['ptyprocess', 'tornado >=4'] - - testpath 0.3.1 - - name: thrift - version: 0.11.0 - depends: ['six >=1.7.2'] - - thrift 0.9.3 - - name: thriftpy - version: 0.3.9 - depends: ['ply >=3.4,<4.0'] - - toolz 0.8.2 - - toolz 0.9.0 - - tornado 4.5.2 - - tornado 4.5.3 - - tornado 5.0 - - tornado 5.0.1 - - tornado 5.0.2 - - tornado 5.1 - - name: traitlets - version: 4.3.2 - depends: ['decorator', 'ipython_genutils', 'six'] - - name: twisted - version: 17.9.0 - depends: ['appdirs >=1.4.0', 'automat >=0.3.0', 'constantly >=15.1', 'cryptography >=1.5', 'hyperlink >=17.1.1', 'idna >=0.6,!=2.3', 'incremental >=16.10.1', 'pyasn1', 'pyopenssl >=16.0.0', 'service_identity', 'zope.interface >=4.0.2'] - - name: twisted - version: 18.4.0 - depends: ['appdirs >=1.4.0', 'automat >=0.3.0', 'constantly >=15.1', 'cryptography >=1.5', 'hyperlink >=17.1.1', 'idna >=0.6,!=2.3', 'incremental >=16.10.1', 'pyasn1', 'pyopenssl >=16.0.0', 'service_identity', 'zope.interface >=4.0.2'] - - name: twisted - version: 18.7.0 - depends: ['appdirs >=1.4.0', 'automat >=0.3.0', 'constantly >=15.1', 'cryptography >=1.5', 'hyperlink >=17.1.1', 'idna >=0.6,!=2.3', 'incremental >=16.10.1', 'pyasn1', 'pyopenssl >=16.0.0', 'service_identity', 'zope.interface >=4.0.2'] - - typed-ast 1.1.0 - - typing 3.6.2 - - typing 3.6.4 - - ujson 1.35 - - name: urllib3 - version: '1.22' - depends: ['certifi', 'cryptography >=1.3.4', 'idna >=2.0.0', 'pyopenssl >=0.14', 'pysocks >=1.5.6,<2.0,!=1.5.7'] - - name: urllib3 - version: '1.23' - depends: ['certifi', 'cryptography >=1.3.4', 'idna >=2.0.0', 'pyopenssl >=0.14', 'pysocks >=1.5.6,<2.0,!=1.5.7'] - - wcwidth 0.1.7 - - webencodings 0.5.1 - - werkzeug 0.12.2 - - werkzeug 0.14.1 - - name: wheel - version: 0.29.0 - depends: ['setuptools'] - - name: wheel - version: 0.30.0 - depends: ['setuptools'] - - name: wheel - version: 0.31.0 - depends: ['setuptools'] - - name: wheel - version: 0.31.1 - depends: ['setuptools'] - - name: widgetsnbextension - version: 3.0.2 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.0.8 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.1.0 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.1.4 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.2.0 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.2.1 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.3.0 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.3.1 - depends: ['notebook >=4.4.1'] - - name: widgetsnbextension - version: 3.4.0 - depends: ['notebook >=4.4.1'] - - wrapt 1.10.11 - - xz 5.2.3 - - xz 5.2.4 - - yaml 0.1.7 - - zeromq 4.2.2 - - zeromq 4.2.3 - - zeromq 4.2.5 - - name: zict - version: 0.1.2 - depends: ['heapdict'] - - name: zict - version: 0.1.3 - depends: ['heapdict'] - - zope 1.0 - - name: zope.interface - version: 4.4.3 - depends: ['zope'] - - name: zope.interface - version: 4.5.0 - depends: ['zope'] - -cases: -- - request: - - install: alabaster - response: - - state: - - alabaster 0.7.11 -- - request: - - install: ipython==6.3.1 - response: - - state: - - backcall 0.1.0 - - decorator 4.3.0 - - ipython 6.3.1 - - ipython_genutils 0.2.0 - - jedi 0.12.1 - - parso 0.3.1 - - pexpect 4.6.0 - - pickleshare 0.7.4 - - prompt_toolkit 1.0.15 - - ptyprocess 0.6.0 - - pygments 2.2.0 - - simplegeneric 0.8.1 - - six 1.11.0 - - traitlets 4.3.2 - - wcwidth 0.1.7 diff --git a/tests/yaml/large.yml b/tests/yaml/large.yml deleted file mode 100644 index fbb1c737e..000000000 --- a/tests/yaml/large.yml +++ /dev/null @@ -1,295 +0,0 @@ -# The 129 available packages have been obtained by transforming a -# conda repodata.json, and doing some manual fixes. -base: - available: - - affine 2.2.0 - - affine 2.2.1 - - asn1crypto 0.22.0 - - asn1crypto 0.23.0 - - asn1crypto 0.24.0 - - backports 1.0 - - name: backports.functools_lru_cache - version: '1.4' - depends: ['backports', 'setuptools'] - - name: backports.functools_lru_cache - version: '1.5' - depends: ['backports', 'setuptools'] - - beautifulsoup4 4.6.0 - - beautifulsoup4 4.6.1 - - beautifulsoup4 4.6.3 - - name: cachecontrol - version: 0.12.3 - depends: ['msgpack_python', 'requests'] - - name: cachecontrol - version: 0.12.4 - depends: ['msgpack_python', 'requests'] - - name: cachecontrol - version: 0.12.5 - depends: ['msgpack_python', 'requests'] - - certifi 2017.11.5 - - certifi 2017.7.27.1 - - certifi 2018.1.18 - - certifi 2018.4.16 - - certifi 2018.8.13 - # cffi is a bundled module in PyPy and causes resolution errors if pip - # tries to installed it. Give it a different name since we are simply - # checking the graph anyway and the identifier doesn't really matter. - - name: cffi_not_really - version: 1.10.0 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.2 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.4 - depends: ['pycparser'] - - name: cffi_not_really - version: 1.11.5 - depends: ['pycparser'] - - chardet 3.0.4 - - click 6.7 - - colorama 0.3.9 - - colour 0.1.4 - - colour 0.1.5 - - contextlib2 0.5.5 - - name: cryptography - version: 2.0.3 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'six >=1.4.1'] - - name: cryptography - version: 2.1.3 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'six >=1.4.1'] - - name: cryptography - version: 2.1.4 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'six >=1.4.1'] - - name: cryptography - version: 2.2.1 - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'idna >=2.1', 'six >=1.4.1'] - - name: cryptography - version: '2.3' - depends: ['asn1crypto >=0.21.0', 'cffi_not_really >=1.7', 'cryptography_vectors ~=2.3', 'idna >=2.1', 'six >=1.4.1'] - - cryptography_vectors 2.0.3 - - cryptography_vectors 2.1.3 - - cryptography_vectors 2.1.4 - - cryptography_vectors 2.2.1 - - cryptography_vectors 2.2.2 - - cryptography_vectors 2.3.0 - - name: cytoolz - version: 0.8.2 - depends: ['toolz >=0.8.0'] - - name: cytoolz - version: 0.9.0 - depends: ['toolz >=0.8.0'] - - name: cytoolz - version: 0.9.0.1 - depends: ['toolz >=0.8.0'] - - distlib 0.2.5 - - distlib 0.2.6 - - distlib 0.2.7 - - enum34 1.1.6 - - filelock 2.0.12 - - filelock 2.0.13 - - filelock 3.0.4 - - future 0.16.0 - - futures 3.1.1 - - futures 3.2.0 - - glob2 0.5 - - glob2 0.6 - - name: html5lib - version: '0.999999999' - depends: ['six >=1.9', 'webencodings'] - - name: html5lib - version: 1.0.1 - depends: ['six >=1.9', 'webencodings'] - - idna 2.6 - - idna 2.7 - - ipaddress 1.0.18 - - ipaddress 1.0.19 - - ipaddress 1.0.22 - - name: jinja2 - version: '2.10' - depends: ['markupsafe >=0.23', 'setuptools'] - - name: jinja2 - version: 2.9.6 - depends: ['markupsafe >=0.23', 'setuptools'] - - lockfile 0.12.2 - - markupsafe 1.0 - - msgpack_python 0.4.8 - - msgpack_python 0.5.1 - - msgpack_python 0.5.5 - - msgpack_python 0.5.6 - - name: packaging - version: '16.8' - depends: ['pyparsing', 'six'] - - name: packaging - version: '17.1' - depends: ['pyparsing', 'six'] - - name: pip - version: 10.0.1 - depends: ['setuptools', 'wheel'] - - name: pip - version: 9.0.1 - depends: ['cachecontrol', 'colorama', 'distlib', 'html5lib', 'lockfile', 'packaging', 'progress', 'requests', 'setuptools', 'webencodings', 'wheel'] - - name: pip - version: 9.0.3 - depends: ['setuptools', 'wheel'] - - pkginfo 1.4.1 - - pkginfo 1.4.2 - - progress 1.3 - - progress 1.4 - - psutil 5.2.2 - - psutil 5.3.1 - - psutil 5.4.0 - - psutil 5.4.1 - - psutil 5.4.3 - - psutil 5.4.5 - - psutil 5.4.6 - - pycosat 0.6.2 - - pycosat 0.6.3 - - pycparser 2.18 - - name: pyopenssl - version: 17.2.0 - depends: ['cryptography >=1.9', 'six >=1.5.2'] - - name: pyopenssl - version: 17.4.0 - depends: ['cryptography >=1.9', 'six >=1.5.2'] - - name: pyopenssl - version: 17.5.0 - depends: ['cryptography >=2.1.4', 'six >=1.5.2'] - - name: pyopenssl - version: 18.0.0 - depends: ['cryptography >=2.2.1', 'six >=1.5.2'] - - pyparsing 2.2.0 - - name: pysocks - version: 1.6.7 - depends: ['win_inet_pton'] - - name: pysocks - version: 1.6.8 - depends: ['win_inet_pton'] - - pywin32 221 - - pywin32 222 - - pywin32 223 - - pyyaml 3.12 - - pyyaml 3.13 - - name: requests - version: 2.18.4 - depends: ['certifi >=2017.4.17', 'chardet >=3.0.2,<3.1.0', 'idna >=2.5,<2.7', 'urllib3 >=1.21.1,<1.23'] - - name: requests - version: 2.19.1 - depends: ['certifi >=2017.4.17', 'chardet >=3.0.2,<3.1.0', 'idna >=2.5,<2.8', 'urllib3 >=1.21.1,<1.24'] - - scandir 1.5 - - scandir 1.6 - - scandir 1.7 - - scandir 1.8 - - scandir 1.9.0 - - name: setuptools - version: 36.2.2 - depends: ['certifi', 'wincertstore'] - - name: setuptools - version: 36.5.0 - depends: ['certifi', 'wincertstore'] - - name: setuptools - version: 38.4.0 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - name: setuptools - version: 38.5.1 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - name: setuptools - version: 39.0.1 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - name: setuptools - version: 39.1.0 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - name: setuptools - version: 39.2.0 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - name: setuptools - version: 40.0.0 - depends: ['certifi >=2016.09', 'wincertstore >=0.2'] - - six 1.8.2 - - six 1.10.0 - - six 1.11.0 - - toolz 0.8.2 - - toolz 0.9.0 - - name: urllib3 - version: '1.22' - depends: ['certifi', 'cryptography >=1.3.4', 'idna >=2.0.0', 'pyopenssl >=0.14', 'pysocks >=1.5.6,<2.0,!=1.5.7'] - - name: urllib3 - version: '1.23' - depends: ['certifi', 'cryptography >=1.3.4', 'idna >=2.0.0', 'pyopenssl >=0.14', 'pysocks >=1.5.6,<2.0,!=1.5.7'] - - webencodings 0.5.1 - - name: wheel - version: 0.29.0 - depends: ['setuptools'] - - name: wheel - version: 0.30.0 - depends: ['setuptools'] - - name: wheel - version: 0.31.0 - depends: ['setuptools'] - - name: wheel - version: 0.31.1 - depends: ['setuptools'] - - win_inet_pton 1.0.1 - - wincertstore 0.2 - -cases: -- - request: - - install: affine - response: - - state: - - affine 2.2.1 -- - request: - - install: cryptography - response: - - state: - - asn1crypto 0.24.0 - - cffi_not_really 1.11.5 - - cryptography 2.3 - - cryptography_vectors 2.3.0 - - idna 2.7 - - pycparser 2.18 - - six 1.11.0 - skip: legacy -- - request: - - install: cachecontrol - response: - - state: - - asn1crypto 0.24.0 - - cachecontrol 0.12.5 - - certifi 2018.8.13 - - cffi_not_really 1.11.5 - - chardet 3.0.4 - - cryptography 2.3 - - cryptography_vectors 2.3.0 - - idna 2.7 - - msgpack_python 0.5.6 - - pycparser 2.18 - - pyopenssl 18.0.0 - - pysocks 1.6.8 - - requests 2.19.1 - - six 1.11.0 - - urllib3 1.23 - - win_inet_pton 1.0.1 -- - request: - - install: cytoolz - response: - - state: - - cytoolz 0.9.0.1 - - toolz 0.9.0 -- - request: - - install: ['html5lib', 'six ==1.8.2'] - response: - - state: null - error: - code: 1 - stderr: >- - Cannot install six==1.8.2, html5lib 1.0.1, six==1.8.2 and - html5lib 0.999999999 because these package versions have - conflicting dependencies. - - skip: legacy diff --git a/tests/yaml/linter.py b/tests/yaml/linter.py deleted file mode 100644 index ac17bbc41..000000000 --- a/tests/yaml/linter.py +++ /dev/null @@ -1,108 +0,0 @@ -import re -import sys -from pprint import pprint - -import yaml - -sys.path.insert(0, '../../src') -sys.path.insert(0, '../..') - - -def check_dict(d, required=None, optional=None): - assert isinstance(d, dict) - if required is None: - required = [] - if optional is None: - optional = [] - for key in required: - if key not in d: - sys.exit("key %r is required" % key) - allowed_keys = set(required) - allowed_keys.update(optional) - for key in d.keys(): - if key not in allowed_keys: - sys.exit("key %r is not allowed. Allowed keys are: %r" % - (key, allowed_keys)) - - -def lint_case(case, verbose=False): - from tests.functional.test_yaml import convert_to_dict - - if verbose: - print("--- linting case ---") - pprint(case) - - check_dict(case, optional=['available', 'request', 'response', 'skip']) - available = case.get("available", []) - requests = case.get("request", []) - responses = case.get("response", []) - assert isinstance(available, list) - assert isinstance(requests, list) - assert isinstance(responses, list) - assert len(requests) == len(responses) - - for package in available: - if isinstance(package, str): - package = convert_to_dict(package) - if verbose: - pprint(package) - check_dict(package, - required=['name', 'version'], - optional=['depends', 'extras']) - version = package['version'] - assert isinstance(version, str), repr(version) - - for request, response in zip(requests, responses): - check_dict(request, optional=['install', 'uninstall', 'options']) - check_dict(response, optional=['state', 'error']) - assert len(response) >= 1 - assert isinstance(response.get('state') or [], list) - error = response.get('error') - if error: - check_dict(error, optional=['code', 'stderr']) - stderr = error.get('stderr') - if stderr: - if isinstance(stderr, str): - patters = [stderr] - elif isinstance(stderr, list): - patters = stderr - else: - raise "string or list expected, found %r" % stderr - for patter in patters: - re.compile(patter, re.I) - - -def lint_yml(yml_file, verbose=False): - if verbose: - print("=== linting: %s ===" % yml_file) - assert yml_file.endswith(".yml") - with open(yml_file) as fi: - data = yaml.safe_load(fi) - if verbose: - pprint(data) - - check_dict(data, required=['cases'], optional=['base']) - base = data.get("base", {}) - cases = data["cases"] - for _, case_template in enumerate(cases): - case = base.copy() - case.update(case_template) - lint_case(case, verbose) - - -if __name__ == '__main__': - from optparse import OptionParser - - p = OptionParser(usage="usage: %prog [options] FILE ...", - description="linter for pip's yaml test FILE(s)") - - p.add_option('-v', '--verbose', - action="store_true") - - opts, args = p.parse_args() - - if len(args) < 1: - p.error('at least one argument required, try -h') - - for yml_file in args: - lint_yml(yml_file, opts.verbose) diff --git a/tests/yaml/non_pinned.yml b/tests/yaml/non_pinned.yml deleted file mode 100644 index 6e9b26c4c..000000000 --- a/tests/yaml/non_pinned.yml +++ /dev/null @@ -1,24 +0,0 @@ -base: - available: - - A 1.0.0; depends B < 2.0.0 - - A 2.0.0; depends B < 3.0.0 - - B 1.0.0 - - B 2.0.0 - - B 2.1.0 - - B 3.0.0 - -cases: -- - request: - - install: A >= 2.0.0 - response: - - state: - - A 2.0.0 - - B 2.1.0 -- - request: - - install: A < 2.0.0 - response: - - state: - - A 1.0.0 - - B 1.0.0 diff --git a/tests/yaml/overlap1.yml b/tests/yaml/overlap1.yml deleted file mode 100644 index 9afbb04c3..000000000 --- a/tests/yaml/overlap1.yml +++ /dev/null @@ -1,44 +0,0 @@ -# https://medium.com/knerd/the-nine-circles-of-python-dependency-hell-481d53e3e025 -# Circle 4: Overlapping transitive dependencies -base: - available: - - myapp 0.2.4; depends fussy, capridous - - name: fussy - version: 3.8.0 - depends: ['requests >=1.2.0,<3'] - - name: capridous - version: 1.1.0 - depends: ['requests >=1.0.3,<2'] - - requests 1.0.1 - - requests 1.0.3 - - requests 1.1.0 - - requests 1.2.0 - - requests 1.3.0 - - requests 2.1.0 - - requests 3.2.0 - -cases: -- - request: - - install: myapp - response: - - state: - - capridous 1.1.0 - - fussy 3.8.0 - - myapp 0.2.4 - - requests 1.3.0 - skip: legacy -- - request: - - install: fussy - response: - - state: - - fussy 3.8.0 - - requests 2.1.0 -- - request: - - install: capridous - response: - - state: - - capridous 1.1.0 - - requests 1.3.0 diff --git a/tests/yaml/pinned.yml b/tests/yaml/pinned.yml deleted file mode 100644 index c8bd3f35d..000000000 --- a/tests/yaml/pinned.yml +++ /dev/null @@ -1,29 +0,0 @@ -base: - available: - - A 1.0.0 - - A 2.0.0 - - B 1.0.0; depends A == 1.0.0 - - B 2.0.0; depends A == 2.0.0 - -cases: -- - request: - - install: B - response: - - state: - - A 2.0.0 - - B 2.0.0 -- - request: - - install: B == 2.0.0 - response: - - state: - - A 2.0.0 - - B 2.0.0 -- - request: - - install: B == 1.0.0 - response: - - state: - - A 1.0.0 - - B 1.0.0 diff --git a/tests/yaml/pip988.yml b/tests/yaml/pip988.yml deleted file mode 100644 index 1190d2a4e..000000000 --- a/tests/yaml/pip988.yml +++ /dev/null @@ -1,37 +0,0 @@ -# https://github.com/pypa/pip/issues/988#issuecomment-606967707 -base: - available: - - A 1.0.0; depends B >= 1.0.0, C >= 1.0.0 - - A 2.0.0; depends B >= 2.0.0, C >= 1.0.0 - - B 1.0.0; depends C >= 1.0.0 - - B 2.0.0; depends C >= 2.0.0 - - C 1.0.0 - - C 2.0.0 - -cases: -- - request: - - install: C==1.0.0 - - install: B==1.0.0 - - install: A==1.0.0 - - install: A==2.0.0 - response: - - state: - - C 1.0.0 - - state: - - B 1.0.0 - - C 1.0.0 - - state: - - A 1.0.0 - - B 1.0.0 - - C 1.0.0 - - state: - - A 2.0.0 - - B 2.0.0 - - C 2.0.0 - # for the last install (A==2.0.0) the old resolver gives - # - A 2.0.0 - # - B 2.0.0 - # - C 1.0.0 - # but because B 2.0.0 depends on C >=2.0.0 this is wrong - skip: legacy diff --git a/tests/yaml/poetry2298.yml b/tests/yaml/poetry2298.yml deleted file mode 100644 index 8b0670896..000000000 --- a/tests/yaml/poetry2298.yml +++ /dev/null @@ -1,24 +0,0 @@ -# see: https://github.com/python-poetry/poetry/issues/2298 -base: - available: - - poetry 1.0.5; depends zappa == 0.51.0, sphinx == 3.0.1 - - zappa 0.51.0; depends boto3 - - sphinx 3.0.1; depends docutils - - boto3 1.4.5; depends botocore ~=1.5.0 - - botocore 1.5.92; depends docutils <0.16 - - docutils 0.16.0 - - docutils 0.15.0 - -cases: -- - request: - - install: poetry - response: - - state: - - boto3 1.4.5 - - botocore 1.5.92 - - docutils 0.15.0 - - poetry 1.0.5 - - sphinx 3.0.1 - - zappa 0.51.0 - skip: legacy diff --git a/tests/yaml/simple.yml b/tests/yaml/simple.yml deleted file mode 100644 index 8e90e605d..000000000 --- a/tests/yaml/simple.yml +++ /dev/null @@ -1,47 +0,0 @@ -base: - available: - - simple 0.1.0 - - simple 0.2.0 - - base 0.1.0; depends dep - - dep 0.1.0 - -cases: -- - request: - - install: simple - - uninstall: simple - response: - - state: - - simple 0.2.0 - - state: null -- - request: - - install: simple - - install: dep - response: - - state: - - simple 0.2.0 - - state: - - dep 0.1.0 - - simple 0.2.0 -- - request: - - install: base - response: - - state: - - base 0.1.0 - - dep 0.1.0 -- - request: - - install: base - options: --no-deps - response: - - state: - - base 0.1.0 -- - request: - - install: ['dep', 'simple==0.1.0'] - response: - - state: - - dep 0.1.0 - - simple 0.1.0 diff --git a/tests/yaml/trivial.yml b/tests/yaml/trivial.yml deleted file mode 100644 index 418422044..000000000 --- a/tests/yaml/trivial.yml +++ /dev/null @@ -1,24 +0,0 @@ -base: - available: - - a 0.1.0 - - b 0.2.0 - - c 0.3.0 - -cases: -- - request: - - install: ['a', 'b'] - - install: c - - uninstall: ['b', 'c'] - - uninstall: a - response: - - state: - - a 0.1.0 - - b 0.2.0 - - state: - - a 0.1.0 - - b 0.2.0 - - c 0.3.0 - - state: - - a 0.1.0 - - state: null diff --git a/tools/requirements/tests.txt b/tools/requirements/tests.txt index 608d5d9f4..601cff2ab 100644 --- a/tools/requirements/tests.txt +++ b/tools/requirements/tests.txt @@ -7,7 +7,6 @@ pytest-cov pytest-rerunfailures pytest-timeout pytest-xdist -pyyaml scripttest setuptools>=39.2.0 # Needed for `setuptools.wheel.Wheel` support. https://github.com/pypa/virtualenv/archive/legacy.zip#egg=virtualenv