AggregatingLocator fails if one source provides ANY version of a dist, but ALL are incompatible with the requirement
given a dep finder like:
finder = DependencyFinder(AggregatingLocator( DirectoryLocator('/abs/path/to/sdists', recursive=False), JSONLocator(), SimpleScrapingLocator('https://pypi.python.org/simple/', timeout=3.0), scheme='legacy', merge=False, ))
...the finder will fail to resolve 'wheel (== 0.18.0)' via JSONLocator if DirectoryLocator returns appropriate -- but incompatible!!! -- results. in my case, 'wheel-0.17.0.tar.gz' was found by DirectoryLocator, and the dict returned from _get_project immediately (since merge=False)... however since this Locator does not fulfill the requirement, an exception is thrown.
i can see from the code/interface that _get_project cannot [currently] determine if a given Locator actually fulfills the requirement until after it returns... unfortunately this makes the AggregatingLocator much less useful (eg. return the first Locator that MEETS THE GIVEN REQUIREMENT, not just matches the key [any requirement])
i propose changing _get_project to a generator that returns the solutuion set from each locator, one at a time, and allow the locate() method to exhaust the sets... note: i did not test this (or look too closely at ramifications -- just an initial guess).
other options may be to implement locate() in AggregatingLocator, add a "greedy" arg (or similar) to Locator.locate... or a new kind of Locator altogether?