On Tue, Jan 29, 2019, 06:59 Donald Stufft <donald@stufft.io wrote:
On Jan 29, 2019, at 9:48 AM, Xavier Fernandez <xav.fernandez@gmail.com> wrote:

I disagree that it *needs* the name: since the link is declared as a dependency, the installer will necessarily need to check/download it at some point to install it and could discover the package name at that point, just like it will discover the version at the same point.
Providing the name in the direct reference is an optimization that ease the work of the installer and allowing to provide a version specifier could be an other one. 
It needs the name to do that without downloading, which is ideally the direction we’re heading towards, that we can do as much work prior to downloading files as possible.

This confused me too, but after thinking about it I think maybe I get it.

The thing is, there actually is no way for a resolver to know for certain whether it wants to download a direct URL like this until after it has downloaded it. Because, you could have a situation where after you download it, you discover that it has a version, or its own requirements, that are inconsistent with the other requirements we've gathered, and then the resolver has to backtrack. And in backtracking it might decide not to use that exact URL after all.

But, we can imagine a resolver that works in phases: first, it uses all the information it can get without downloading/building anything to construct an optimist candidate solution: "assuming everything I haven't downloaded yet cooperates, this will work". And then we download/build until either everything works out, or else we discover some conflict and go back to phase 1 with more information in our database.

If package A depends on B and C, and if package B depends on "C @ some-url"... well, we don't know until we download it whether there different C requirements are going to match up, it's true. But because the package name is present in the URL requirement, we at least know that we don't need to go find C somewhere *else*. If all we had was the URL without the name, then in this case we might end up downloading C from PyPI, spending time building it, and only after that download the URL and discover that it was also package C.

-n