Skip to content

Commit

Permalink
Calculate reverse dependencies for editables too
Browse files Browse the repository at this point in the history
This makes the "via pkg" comments to be generated even if pkg is
editable.
  • Loading branch information
suutari committed Oct 8, 2017
1 parent e119bec commit 634ef5c
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 14 deletions.
8 changes: 8 additions & 0 deletions ChangeLog.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
Unreleased
----------

General Changes
~~~~~~~~~~~~~~~

- Make "via package" comments work for editable requirers too

1.2.2
-----

Expand Down
20 changes: 19 additions & 1 deletion prequ/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ def as_cache_key(self, ireq):
extras_string = ""
else:
extras_string = "[{}]".format(",".join(extras))
if ireq.editable:
# Make sure that editables don't end up into the cache with
# a version of a real non-editable package
extras_string += ':EDITABLE:{}'.format(ireq.link)
return name, "{}{}".format(version, extras_string)

def read_cache(self):
Expand All @@ -99,7 +103,7 @@ def write_cache(self):
"""Writes the cache to disk as JSON."""
doc = {
'__format__': 1,
'dependencies': self._cache,
'dependencies': self._strip_editables(self._cache),
}
with open(self._cache_file, 'w') as f:
json.dump(doc, f, sort_keys=True)
Expand Down Expand Up @@ -162,3 +166,17 @@ def _reverse_dependencies(self, cache_keys):
return lookup_table((key_from_req(Requirement.parse(dep_name)), name)
for name, version_and_extras in cache_keys
for dep_name in self.cache[name][version_and_extras])

@classmethod
def _strip_editables(cls, cache):
"""
Strip out editable dependencies from given dependency cache map.
"""
stripped = type(cache)()
for (name, dep_map) in cache.items():
stripped_dep_map = type(dep_map)()
for (version, deps) in dep_map.items():
if ':EDITABLE:' not in version:
stripped_dep_map[version] = deps
stripped[name] = stripped_dep_map
return stripped
9 changes: 2 additions & 7 deletions prequ/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,7 @@ def _iter_dependencies(self, ireq):
Editable requirements will never be looked up, as they may have
changed at any time.
"""
if ireq.editable:
for dependency in self.repository.get_dependencies(ireq):
yield dependency
return
elif not is_pinned_requirement(ireq):
if not is_pinned_requirement(ireq) and not ireq.editable:
raise TypeError('Expected pinned or editable requirement, got {}'.format(ireq))

# Now, either get the dependencies from the dependency cache (for
Expand All @@ -305,5 +301,4 @@ def _iter_dependencies(self, ireq):
yield InstallRequirement.from_line(dependency_string, constraint=ireq.constraint)

def reverse_dependencies(self, ireqs):
non_editable = [ireq for ireq in ireqs if not ireq.editable]
return self.dependency_cache.reverse_dependencies(non_editable)
return self.dependency_cache.reverse_dependencies(ireqs)
11 changes: 6 additions & 5 deletions prequ/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,12 +240,13 @@ def is_vcs_link(ireq):
def as_tuple(ireq):
"""
Pulls out the (name: str, version:str, extras:(str)) tuple from the pinned InstallRequirement.
"""
if not is_pinned_requirement(ireq):
raise TypeError('Expected a pinned InstallRequirement, got {}'.format(ireq))
name = key_from_ireq(ireq)
version = first(ireq.specifier._specs)._spec[1]
:type ireq: InstallRequirement
"""
name = key_from_ireq(ireq) # Runs also egg_info if needed
version = get_ireq_version(ireq)
if not version:
raise TypeError('Not pinned: {!r}'.format(ireq))
extras = tuple(sorted(ireq.extras))
return name, version, extras

Expand Down
2 changes: 1 addition & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ def test_editable_package_vcs(tmpdir):
vcs_package = (
'git+git://github.com/pytest-dev/pytest-django'
'@21492afc88a19d4ca01cd0ac392a5325b14f95c7'
'#egg=pytest-django'
'#egg=pytest-django==3.1.3.dev32+g21492af'
)
runner = CliRunner()
with runner.isolated_filesystem():
Expand Down

0 comments on commit 634ef5c

Please sign in to comment.