Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions src/sync_pre_commit_lock/actions/sync_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from typing import TYPE_CHECKING, NamedTuple, Sequence

from packaging.requirements import InvalidRequirement, Requirement
from packaging.specifiers import SpecifierSet
from packaging.utils import canonicalize_name

from sync_pre_commit_lock.db import DEPENDENCY_MAPPING, REPOSITORY_ALIASES, PackageRepoMapping
Expand All @@ -21,9 +22,6 @@ class GenericLockedPackage(NamedTuple):
version: str
# Add original data here?

def __str__(self) -> str:
return f"{self.name}=={self.version}"


class SyncPreCommitHooksVersion:
def __init__(
Expand Down Expand Up @@ -162,7 +160,8 @@ def get_pre_commit_repo_hook_new_dependency(self, dependency: str) -> str:
if not (locked_version := self.locked_packages.get(normalized_name)):
self.printer.debug(f"Additional dependency {dependency} not found in the lockfile. Ignoring.")
return dependency
return str(locked_version).replace(normalized_name, requirement.name)
requirement.specifier = SpecifierSet(f"=={locked_version.version}")
return str(requirement)

def analyze_repos(
self,
Expand Down
27 changes: 27 additions & 0 deletions tests/test_actions/test_sync_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,33 @@ def test_analyze_repos_additional_dependencies() -> None:
}


def test_analyze_repos_additional_dependencies_preserve_extras() -> None:
printer = MagicMock(spec=Printer)
pre_commit_config_file_path = MagicMock(spec=Path)
locked_packages: dict[str, GenericLockedPackage] = {"lib-name": GenericLockedPackage("lib-name", "2.0.0")}
plugin_config = SyncPreCommitLockConfig()

syncer = SyncPreCommitHooksVersion(
printer=printer,
pre_commit_config_file_path=pre_commit_config_file_path,
locked_packages=locked_packages,
plugin_config=plugin_config,
)
pre_commit_repo = PreCommitRepo(
"https://repo_url", "1.2.3", [PreCommitHook("hook", ["lib-name[with,extras]==1.2.2"])]
)
pre_commit_repos = {pre_commit_repo}
syncer.mapping = {"lib-name": {"repo": "https://repo_url", "rev": "${rev}"}}

to_fix, _ = syncer.analyze_repos(pre_commit_repos)

assert to_fix == {
pre_commit_repo: PreCommitRepo(
"https://repo_url", "2.0.0", [PreCommitHook("hook", ["lib-name[extras,with]==2.0.0"])]
)
}


def test_analyze_repos_not_in_lock_but_additional_dependencies() -> None:
printer = MagicMock(spec=Printer)
pre_commit_config_file_path = MagicMock(spec=Path)
Expand Down