@@ -42,18 +42,37 @@ module PythonPackage
42
42
sys.stderr.write('The python_package resource requires pip >= 6.1.0, currently '+pip.__version__+'\\ n')
43
43
sys.exit(1)
44
44
45
+ # pip has shuffled around it's internals over the years so we gotta test where things are
45
46
try:
46
47
from pip.commands import InstallCommand
48
+ cmd = InstallCommand()
49
+ except ImportError:
50
+ try:
51
+ from pip._internal.commands import InstallCommand
52
+ cmd = InstallCommand()
53
+ except ImportError:
54
+ from pip._internal.commands import create_command
55
+ cmd = create_command("install")
56
+
57
+ try:
47
58
from pip.index import PackageFinder
48
- from pip.req import InstallRequirement
49
59
except ImportError:
50
- # Pip 10 moved all internals to their own package.
51
- from pip._internal.commands import InstallCommand
52
- from pip._internal.index import PackageFinder
60
+ try:
61
+ from pip._internal.index import PackageFinder
62
+ except ImportError:
63
+ from pip._internal.index.package_finder import PackageFinder
53
64
65
+ try:
66
+ from pip.req import InstallRequirement
67
+ install_req_from_line = InstallRequirement.from_line
68
+ except ImportError:
69
+ try:
70
+ from pip._internal.req import InstallRequirement
71
+ install_req_from_line = InstallRequirement.from_line
72
+ except ImportError:
73
+ from pip._internal.req.constructors import install_req_from_line
54
74
55
75
packages = {}
56
- cmd = InstallCommand()
57
76
options, args = cmd.parse_args(sys.argv[1:])
58
77
with cmd._build_session(options) as session:
59
78
if options.no_index:
@@ -71,20 +90,45 @@ module PythonPackage
71
90
finder_options['process_dependency_links'] = options.process_dependency_links
72
91
if getattr(options, 'format_control', None):
73
92
finder_options['format_control'] = options.format_control
74
- finder = PackageFinder(**finder_options)
75
- find_all = getattr(finder, 'find_all_candidates', getattr(finder, '_find_all_versions', None))
76
- for arg in args:
93
+ try:
94
+ finder = PackageFinder(**finder_options)
95
+ except TypeError:
96
+ # need to use LinkCollector
77
97
try:
78
- from pip._internal.req.constructors import install_req_from_line
79
- req = install_req_from_line(arg)
98
+ from pip._internal.collector import LinkCollector
80
99
except ImportError:
81
- from pip._internal.req import InstallRequirement
82
- req = InstallRequirement.from_line(arg)
100
+ from pip._internal.index.collector import LinkCollector
101
+
102
+ from pip._internal.models.search_scope import SearchScope
103
+ from pip._internal.models.selection_prefs import SelectionPreferences
104
+
105
+ search_scope = SearchScope.create(
106
+ finder_options['find_links'], finder_options['index_urls']
107
+ )
108
+ collector = LinkCollector(session, search_scope)
109
+ selection_prefs = SelectionPreferences(
110
+ allow_yanked=False,
111
+ allow_all_prereleases=options.pre,
112
+ format_control=finder_options.get('format_control')
113
+ )
114
+ finder = PackageFinder.create(collector, selection_prefs)
115
+ find_all = getattr(finder, 'find_all_candidates', getattr(finder, '_find_all_versions', None))
116
+
117
+ def candidate_link(c, default=None):
118
+ return getattr(c, 'location', getattr(c, 'link', default))
119
+
120
+ for arg in args:
121
+ req = install_req_from_line(arg)
83
122
found = finder.find_requirement(req, True)
84
123
all_candidates = find_all(req.name)
85
- candidate = [c for c in all_candidates if c.location == found]
124
+ candidate = [
125
+ c for c in all_candidates
126
+ if candidate_link(c) == candidate_link(found, default=found)
127
+ ]
86
128
if candidate:
87
- packages[candidate[0].project.lower()] = str(candidate[0].version)
129
+ c = candidate[0]
130
+ candidate_name = getattr(c, 'project', getattr(c, 'name', None)).lower()
131
+ packages[candidate_name] = str(c.version)
88
132
json.dump(packages, sys.stdout)
89
133
EOH
90
134
0 commit comments