diff --git a/mach_nix/data/providers.py b/mach_nix/data/providers.py index ae31b9b..f6d290c 100644 --- a/mach_nix/data/providers.py +++ b/mach_nix/data/providers.py @@ -89,7 +89,7 @@ class DependencyProviderBase(ABC): @cached() def find_matches(self, req) -> List[Candidate]: all = list(self.all_candidates_sorted(req.key, req.extras, req.build)) - matching_versions = set(filter_versions((c.ver for c in all), req.specs)) + matching_versions = set(filter_versions([c.ver for c in all], req.specs)) matching_candidates = [c for c in all if c.ver in matching_versions] return matching_candidates diff --git a/mach_nix/nix/CONDA_CHANNELS.json b/mach_nix/nix/CONDA_CHANNELS.json index c257de5..479d18a 100644 --- a/mach_nix/nix/CONDA_CHANNELS.json +++ b/mach_nix/nix/CONDA_CHANNELS.json @@ -1,7 +1,7 @@ { "url": "https://github.com/davhau/conda-channels", - "rev": "1d4616868eb926c2908dbf6fcc376f66de89e102", - "date": "2020-10-31T15:59:29+00:00", - "sha256": "1lggwgwh6gpg0m31ll1x81bj14lpgdccmk31j2dcf57gcfwx8c5r", + "rev": "366d2706c153488c01ceb882674b04be5ea1d3d4", + "date": "2020-11-19T02:00:42+00:00", + "sha256": "1n8ggw709lk4qfynhcjpgz9l6wkrplhaays5f7588ikw9mmk6j8h", "fetchSubmodules": false } diff --git a/mach_nix/nix/NIXPKGS.json b/mach_nix/nix/NIXPKGS.json index 0bed1e7..598d6b9 100644 --- a/mach_nix/nix/NIXPKGS.json +++ b/mach_nix/nix/NIXPKGS.json @@ -1,7 +1,7 @@ { "url": "https://github.com/nixos/nixpkgs", - "rev": "2da96f3f9c44cf87e07387321f4ca406c1a8bb7e", - "date": "2020-10-31T10:14:50+00:00", - "sha256": "03d0iym6m5kbp11lz5jcaf2627cqvry0lzmrmf6gmqvvfcal9vdl", + "rev": "4f3475b113c93d204992838aecafa89b1b3ccfde", + "date": "2020-11-16T11:01:57+01:00", + "sha256": "158iik656ds6i6pc672w54cnph4d44d0a218dkq6npzrbhd3vvbg", "fetchSubmodules": false } diff --git a/mach_nix/nix/PYPI_DEPS_DB.json b/mach_nix/nix/PYPI_DEPS_DB.json index b62db5d..35b9eda 100644 --- a/mach_nix/nix/PYPI_DEPS_DB.json +++ b/mach_nix/nix/PYPI_DEPS_DB.json @@ -1,7 +1,7 @@ { "url": "https://github.com/davhau/pypi-deps-db", - "rev": "e6a98c8a6c2c9b759011fcb1b3f30734a510da39", - "date": "2020-10-31T08:21:13+00:00", - "sha256": "0cyiq0j42abibfr8zmmfmas13axbl80im4pgpqs9nd9j98g552mr", + "rev": "ae8b4b93e71245f954f73f5d1dc4597872be4e14", + "date": "2020-11-18T20:12:07+00:00", + "sha256": "085y8nnnk713h54cfix87sdzinf0vy6wy0d6dk2724b3m2drjsrx", "fetchSubmodules": false } diff --git a/mach_nix/resolver/resolvelib_resolver.py b/mach_nix/resolver/resolvelib_resolver.py index d1b229e..2d96ec2 100644 --- a/mach_nix/resolver/resolvelib_resolver.py +++ b/mach_nix/resolver/resolvelib_resolver.py @@ -1,4 +1,3 @@ -from dataclasses import dataclass from typing import Iterable, List import resolvelib @@ -8,7 +7,7 @@ from mach_nix.data.providers import DependencyProviderBase, Candidate from mach_nix.deptree import remove_circles_and_print from mach_nix.requirements import Requirement from mach_nix.resolver import Resolver, ResolvedPkg -from mach_nix.versions import filter_versions, Version +from mach_nix.versions import filter_versions # Implement logic so the resolver understands the requirement format. @@ -38,7 +37,6 @@ class Provider: if not set(requirement.extras).issubset(set(candidate.selected_extras)): res = False res = bool(len(list(filter_versions([candidate.ver], requirement.specs)))) - #print(f"{res} {requirement} satisfied by {candidate}") return res def get_dependencies(self, candidate): diff --git a/mach_nix/versions.py b/mach_nix/versions.py index b38d353..dc5523c 100644 --- a/mach_nix/versions.py +++ b/mach_nix/versions.py @@ -1,14 +1,13 @@ -import fnmatch import sys import traceback from typing import Iterable, Tuple, List +import packaging.version from conda.common.compat import with_metaclass -from packaging.version import LegacyVersion from conda.models.version import ver_eval, VersionOrder, SingleStrArgCachingType +from packaging.version import LegacyVersion from mach_nix.cache import cached -import packaging.version @with_metaclass(SingleStrArgCachingType) @@ -43,22 +42,11 @@ class PyVer(Version): def parse_ver(ver_str) -> Version: - #return packaging.version.parse(ver_str) return Version(ver_str) def ver_better_than_other(v: Version, o: Version) -> bool: return ver_eval(v, f">{o}") - # instability = {v: 0, o: 0} - # if v >= o: - # for ver in [v, o]: - # if ver.dev: - # instability[ver] += 2 - # if ver.pre: - # instability[ver] += 1 - # if instability[v] <= instability[o]: - # return True - # return False def ver_sort_key(ver: Version): @@ -79,34 +67,23 @@ def ver_sort_key(ver: Version): if elem.lower().islower(): is_pre = 1 break - # if isinstance(ver, LegacyVersion): - # return 0, 0, 0, ver - # is_dev = int(ver.is_devrelease) - # is_pre = int(ver.is_prerelease) return not is_dev, not is_pre, ver def best_version(versions: Iterable[Version]) -> Version: return sorted(versions)[-1] - # best = None - # for ver in versions: - # if best is None: - # best = ver - # continue - # if ver_better_than_other(ver, best): - # best = ver - # return best -#@cached(keyfunc=lambda args: tuple(args[0]) + tuple(args[1])) +@cached(keyfunc=lambda args: hash(tuple(args[0]) + tuple(args[1]))) def filter_versions( - versions: Iterable[Version], - specs: Iterable[Tuple[str, str]]) -> List[Version]: + versions: List[Version], + specs: List[Tuple[str, str]]) -> List[Version]: """ Reduces a given list of versions to contain only versions which are allowed according to the given specifiers """ versions = list(versions) + assert len(versions) > 0 for op, ver in specs: if op == '==': if str(ver) == "*": @@ -115,15 +92,5 @@ def filter_versions( op = '=' ver = parse_ver(ver) versions = list(filter(lambda v: ver_eval(v, f"{op}{ver}"), versions)) - # if op == '==': - # versions_str = (str(ver) for ver in versions) - # versions_str_filtered = list(ver_str for ver_str in fnmatch.filter(versions_str, str(ver))) - # versions = [ver for ver in versions if str(ver) in versions_str_filtered] - # elif op == '!=': - # versions_str = (str(ver) for ver in versions) - # bad_versions_str = set(fnmatch.filter(versions_str, str(ver))) - # versions = list(filter(lambda v: str(v) not in bad_versions_str, versions)) - # else: - # versions = list(filter(lambda v: eval(f'v {op} ver', dict(v=v, ver=ver)), versions)) return list(versions)