Commit Graph

198 Commits

Author SHA1 Message Date
Paul Moore c258a1f517 Fix some test failures related to message differences 2020-05-15 14:17:47 +01:00
Paul Moore a56376b20f req.specifier is always a SpecifierSet 2020-05-15 13:58:12 +01:00
Paul Moore 96b3377cd7 Type annotations 2020-05-15 10:57:07 +01:00
Paul Moore 0bcae1e964 Add a deprecation warning for undocumented constraint forms 2020-05-15 09:54:40 +01:00
Paul Moore 6fcaf49cb0 Tidy up handling of unexpected forms of constraint 2020-05-14 17:04:18 +01:00
Paul Moore 9cf1bed78d Address review comments 2020-05-14 11:33:30 +01:00
Paul Moore 0db022fc42 Remove left-over print from debugging 2020-05-13 18:04:20 +01:00
Paul Moore ddbc8fd7c1 Split find_matches into generation and sorting 2020-05-13 17:52:09 +01:00
Tzu-ping Chung 1ea42caf1f Allow prereleases in Requires-Python check 2020-05-07 21:15:43 +08:00
Paul Moore 94f2dc435b
Merge pull request #8170 from pfmoore/nr_constraints2
New Resolver: Second try at implementing constraints
2020-05-07 12:40:49 +01:00
Paul Moore c7c319c4ed Fix type declarations. Mypy let me down :-( 2020-05-07 11:55:56 +01:00
Paul Moore 64b3d1b278 Merge constraints into a single SpecifierSet 2020-05-06 11:30:25 +01:00
Paul Moore ee4830b5ec Move constraints from factory to provider 2020-05-06 10:56:50 +01:00
Tzu-ping Chung d8062791dd Implement use-user-site 2020-05-06 03:48:34 +08:00
Paul Moore 8664218164 Merge branch 'master' into nr_constraints2 2020-05-05 11:41:09 +01:00
Tzu-ping Chung 6b34b39b7e Build ireq line from parent for installed dist 2020-05-04 02:19:12 +08:00
Tzu-ping Chung 647dc6e128 Include prereleases in specifier check 2020-05-04 02:08:27 +08:00
Paul Moore 1599cc2a36 Merge branch 'master' into nr_upgrade_strategy 2020-05-03 11:01:27 +01:00
Paul Moore 218e7d830d
Merge pull request #8146 from uranusjr/new-resolver-extra-in-explicit-requirement
New resolver: Carry extras info in ExplicitRequirement
2020-05-03 10:57:48 +01:00
Paul Moore 79a0afb79a
Merge pull request #8005 from uranusjr/candidate-from-link-retains-specifier
New resolver: Use requirement line to populate LinkCandidate._ireq
2020-05-03 09:59:50 +01:00
Paul Moore c92f55f9fc Implement constraints 2020-04-29 13:03:25 +01:00
Paul Moore 1eb7011da4 Add an assertion that upgrade_strategy is valid 2020-04-28 10:39:53 +01:00
Tzu-ping Chung 06d9ea0952 Mark local install as xfail 2020-04-27 14:36:59 +08:00
Tzu-ping Chung d8aede42d1 Correctly pass extras to explicit requirement
Local source directory is still not working due to some other reasons.
Need to investigate.
2020-04-27 14:23:15 +08:00
Pradyun Gedam 58e2057f1a
Optimize "in path" lookups
O(n) list lookups to O(1) set lookups
2020-04-25 04:20:20 +05:30
Pradyun Gedam d236004138
Rewrite `get_topological_weights` to allow cycles
We take the length for the longest path to any node from root, ignoring
any paths that contain any node twice (i.e. cycles).
2020-04-25 04:09:14 +05:30
Paul Moore bdf56a0303 Fix really, really dumb mistake 2020-04-24 17:52:51 +01:00
Paul Moore 2a66ad1e2d Add an assertion to ensure we don't reuse the factory 2020-04-24 16:44:02 +01:00
Pradyun Gedam e6853336fe
Revert "Drop code for nicer diffs later"
This reverts commit f927f9ae39.
2020-04-24 19:57:58 +05:30
Paul Moore 7a54b2b3a8 Use is_direct rather than an explicit root parameter 2020-04-24 14:30:34 +01:00
Paul Moore 04bf571521 Ensure root requirement name is canonicalised 2020-04-24 14:30:34 +01:00
Pradyun Gedam 746f47cc3a
Factor out logic for getting weights 2020-04-24 17:27:40 +05:30
Tzu-ping Chung e03614fe6d Use req to populate candidate line instead of link
This ensures a candidate built from a "found" link (from e.g. index) is
categorized as specifier-based, not URL-based. This is important to
avoid a specifier-based candidate to be 'pip freeze'-ed in the direct
URL form due to PEP 610 (direct-url.json).
2020-04-24 19:14:00 +08:00
Paul Moore d605530b44 Implement upgrade strategies for the new resolver 2020-04-24 11:08:06 +01:00
Pradyun Gedam f927f9ae39
Drop code for nicer diffs later 2020-04-23 07:04:28 +05:30
Pradyun Gedam 3fe1eab593
Reword get_installation_order docstring 2020-04-23 07:02:53 +05:30
Tzu-ping Chung 572d03b25b Always allow prereleases in is_satisfied_by() 2020-04-18 23:08:30 +08:00
Pradyun Gedam 97f639057e
Merge pull request #8014 from uranusjr/always-return-installed-candidate 2020-04-18 16:15:14 +05:30
Tzu-ping Chung 9c97b285b9 Rename variable for clarity 2020-04-16 13:44:13 +08:00
Paul Moore ea391b2aab Merge with master 2020-04-14 11:27:10 +01:00
Pradyun Gedam 92c9f8136a
Merge pull request #8004 from uranusjr/requires-python-error
New Resolver: Raise UnsupportedPythonVersion for Requires-Python mismatch
2020-04-13 19:42:51 +05:30
Tzu-ping Chung f4f0a34053 Block user from unfinished parts of the resolver 2020-04-13 21:32:20 +08:00
Paul Moore 3642589903 Make message more user friendly when unable to resolve 2020-04-13 11:32:21 +01:00
Tzu-ping Chung 84b99c20b8 Canonicalize installed distribution keys 2020-04-13 18:05:24 +08:00
Tzu-ping Chung d2028e9538 Implement RequiresPythonRequirement with context
This specialized class is able to carry more context information than
the previous implementation (which reuses ExplicitRequirement). Error
reports can thus provide better messages by introspecting.
2020-04-10 23:17:29 +08:00
Pradyun Gedam 8cca170ceb
Merge pull request #7976 from uranusjr/installed-candidate-equal
New Resolver: Implement equality on candidate classes
2020-04-10 18:57:56 +05:30
Tzu-ping Chung cfac6aebdd Always return an install candidate last if matches
This rewrites how a SpecifierRequirement generates candidates, so it

* Always return an AlreadyInstalledCandidate (as long as the version
  satisfies the specifier), even if PackageFinder does not return a
  candidate for the same version.
* Always put the AlreadyInstalledCandidate last, so it's preferred over
  LinkCandidate, preventing version changes if possible.
2020-04-10 20:51:06 +08:00
Paul Moore 6c97645e2f
Merge pull request #8000 from uranusjr/new-resolver-normal-test-progress
New Resolver: Make sure candidates are prepared after resolution
2020-04-10 11:56:56 +01:00
Tzu-ping Chung 56e065f956 Move dist preparation to its own method 2020-04-09 02:27:37 +08:00
Tzu-ping Chung a7d17f8da6 Make sure candidates are prepared after resolution 2020-04-08 23:38:10 +08:00
Tzu-ping Chung be60eaaa4f Uninstall existing dist before reinstallation 2020-04-08 17:17:25 +08:00
Tzu-ping Chung 90ce7c9edd Refactor to prepare for upgrade procedures 2020-04-08 17:17:25 +08:00
Tzu-ping Chung 591d476fca Note on why we don't implement equality 2020-04-08 16:38:47 +08:00
Tzu-ping Chung 018c051a8e Implement equality on candidate classes 2020-04-08 16:38:47 +08:00
Paul Moore bd912cf0de
Merge pull request #7993 from uranusjr/new-resolver-normal-test-progress
Canonicalise project name from InstallationCandidate
2020-04-08 09:12:50 +01:00
Tzu-ping Chung 6d40804b12 Add __repr__ to requirement/candidate models 2020-04-07 20:53:25 +08:00
Tzu-ping Chung b89e1c2fb4 Canonicalize InstallationCandidate name
Caught by test_single_download_from_requirements_file etc.
2020-04-07 19:05:26 +08:00
Tzu-ping Chung 2f36ac7587 Add assertion message for easier debugging 2020-04-07 19:02:17 +08:00
Tzu-ping Chung 74c5042052 Accept InsatllRequirement as comes_from 2020-04-05 12:17:25 +08:00
Tzu-ping Chung aead201fda No need to think about editable for installed dist 2020-04-04 21:53:04 +08:00
Tzu-ping Chung 05f7dbd0c8 Type hint hacks 2020-04-04 18:15:26 +08:00
Tzu-ping Chung 2430aba879 Implement editable candidate 2020-04-04 17:51:43 +08:00
Tzu-ping Chung 3b06cb6b53 Refactor ireq-related operations to base class 2020-04-03 21:33:16 +08:00
Paul Moore d53d3d6b24 Use the name/version from the InstallationCandidate 2020-04-03 11:23:35 +01:00
Tzu-ping Chung 7511737ee7 AlreadyInstalledCandidate 2020-04-03 01:27:34 +08:00
Tzu-ping Chung f061f3f691 Fetch install dist for a candidate if available
The candidate creation logic is further moved into the factory. The
factory would use pkg_resources.get_distribution() to find a matching
distribution for a givan InstallationCandidate. If found, the Candidate
would be created based on that found distribution, instead of the link.

--ignore-installed is implemented as to always use the link to create
candidates, even if an installed distribution is found.
2020-04-03 00:36:26 +08:00
Tzu-ping Chung 9ca2240530 More clarification on the name 2020-04-02 21:42:29 +08:00
Tzu-ping Chung 65ffd338f4 Explain how Requires-Python matching works 2020-04-02 19:02:20 +08:00
Tzu-ping Chung 190c424b1e Implement Python as a dependency
If a dist contains Requires-Python metadata, it is converted into a
Requirement for the resolver based on whether the Requires-Python
is compatible or not.

If it is compatible, an ExplicitRequirement is returned to hold the
Python information (either sys.version_info, or the user-supplied
--python-version).

If it is incompatible, a special NoMatchRequirement is returned, which
never matches to anything, generating a ResolutionImpossible to report
the Python version incompatibility.

The --ignore-requires-python flag is implemented as to not return a
Requirement for Requires-Python at all.
2020-04-02 18:36:08 +08:00
Tzu-ping Chung d29c86af98 Add method to create requirement from spec 2020-04-01 16:53:39 +08:00
Tzu-ping Chung 4491f38047 Return Requirement directly from get_dependencies
This is possible now we have the factory construct.
2020-04-01 15:31:52 +08:00
Tzu-ping Chung e06048cb8b Aggregate helper usages into factory object
This prevents us from having to hold multiple references of
finder/preparer/make_install_req in each requirement/candidate class.
Instead we just pass around the factory object, and let others use the
instances on it.
2020-04-01 15:31:52 +08:00
Tzu-ping Chung 6db0df928c Move wheel cache out of InstallRequirment 2020-03-30 17:36:03 +08:00
Tzu-ping Chung 4ae50f9af7 Remove unused preparer from SpecifierRequirement 2020-03-27 19:00:27 +08:00
Tzu-ping Chung 07563847b0 Decouple candidate and requirement modules
This introduces a new module "factory" that contains all methods dealing
with producing candidates/requirements from an input
requirement/candidate. This allows both models to know nothing about
each other, and simply rely on the intermediate to produce the other.

I *believe* this also helps us reduce merge conflicts due to adding
arguments to those producer functions, since now we only need to modify
the factory, and exactly one of candidate/requirement.

This is only part of a big scheme--the plan is to also move
Candidate.get_dependencies() and Requirement.find_matches() into the
factory class, so they can avoid holding and passing around finder,
preparer, and make_install_req. This is also necessary to change the
return type of Candidate.get_dependencies() to Requirement without
hard-coupling.
2020-03-27 03:14:51 +08:00
Paul Moore fea9766fa2 Merge branch 'master' into new_resolver_extras 2020-03-26 15:49:43 +00:00
Paul Moore a68345e81c Warn if invalid extras are given 2020-03-26 14:53:24 +00:00
Paul Moore 7e97cf6426 Ignore invalid extras 2020-03-26 11:57:34 +00:00
Paul Moore 67bf5890ea Document the ExtrasCandidate class 2020-03-26 11:56:46 +00:00
Paul Moore ffb56db5dd Allow candidates to not have an associated install requirement 2020-03-26 11:19:10 +00:00
Paul Moore d79aacc61c Forgot to run lint before pushing again :-( 2020-03-25 12:39:21 +00:00
Paul Moore bd0f7fe346 Add an ExtrasCandidate class 2020-03-25 12:27:24 +00:00
Paul Moore 76de49bc24 Make a proper get_install_requirement method for candidates 2020-03-25 12:27:24 +00:00
Tzu-ping Chung 3cb7a08f0d Implement ignore_dependencies in new resolver
If this flag is set, simply report every candidate has no dependencies.
2020-03-24 02:02:36 +08:00
Tzu-ping Chung 5af542ccac Use named arguments for clarity 2020-03-24 02:00:08 +08:00
Tzu-ping Chung ff35f7f26a Remove stale TODO comment 2020-03-23 17:15:55 +08:00
Paul Moore c83505b848 Remove an obsolete comment 2020-03-20 13:57:45 +00:00
Paul Moore ffe553638c Address review requirements 2020-03-19 10:55:33 +00:00
Paul Moore a23e936bc7 Ensure candidate name is canonicalised 2020-03-18 14:54:15 +00:00
Paul Moore f1b4be892a Fix bug in get_dependencies() passing Requirement object rather than string 2020-03-18 14:53:04 +00:00
Paul Moore 1ebe1e0935 Integrate the new provider with --unstable-feature=resolver 2020-03-18 14:49:49 +00:00
Paul Moore 7d2eb544b5 Implement PipProvider 2020-03-18 14:42:16 +00:00
Tzu-ping Chung dad77a9e4d Better handle root vetices in graph
ResolveLib *should* always produce a graph with only one root vertice,
which is None. But we don't really need to rely on that implementation
detail. Vertices without any parents can be assigned 0 in all cases.
2020-03-15 23:01:58 +08:00
Tzu-ping Chung ffb3692e00 Add simple tests for get_installation_order()
The implementation is improved a bit to make the sorting result more
predictable for easier testing.
2020-03-15 23:01:57 +08:00
Tzu-ping Chung 53775279c4 Fix graph-walking terminal condition
The weight mapping should have size `len(packages) + 1` because it needs
to contain a "sentinel" node (None).
2020-03-15 22:25:26 +08:00
Tzu-ping Chung a3f6c17d36 Implement resolver methods on provider interface
This is using a temporary PipProvider class, which should be replaced by
the actual implementation after it is merged.
2020-03-15 15:25:38 +08:00
Paul Moore 9b10b93503 Implement the resolvelib Requirement class 2020-03-11 11:37:56 +00:00
Tzu-ping Chung fc810d7353 Add --unstable-feature=resolver
This introduces a new general option --unstable-feature that can be used
to opt into "preview" features in pip not enabled by default. Currently
the only available feature is "resolver".

A stub resolver interface (which would fail on invocation) is provided
to respond to the flag.

The --unstable-feature option is hidden from --help since the resolver
does not yet work. This suppression should be removed when we release
the resolver for general/public testing.
2020-03-11 18:51:01 +08:00