Skip to content

Commit 546fc5b

Browse files
committed
fix(dependencies): do not display unchanged additional dependencies
1 parent dada960 commit 546fc5b

File tree

4 files changed

+85
-37
lines changed

4 files changed

+85
-37
lines changed

src/sync_pre_commit_lock/pdm_plugin.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def _format_repo(self, package: str, old: PreCommitRepo, new: PreCommitRepo) ->
9191
return [repo, *hooks] if hooks else [repo]
9292

9393
def _format_hook(self, old: PreCommitHook, new: PreCommitHook, last: bool) -> Sequence[Sequence[str]]:
94-
if not (nb_deps := len(old.additional_dependencies)):
94+
if not len(old.additional_dependencies):
9595
return []
9696
hook = (
9797
f"[info]{self.plugin_prefix}[/info]",
@@ -100,9 +100,14 @@ def _format_hook(self, old: PreCommitHook, new: PreCommitHook, last: bool) -> Se
100100
"",
101101
"",
102102
)
103+
pairs = [
104+
(old_dep, new_dep)
105+
for old_dep, new_dep in zip(old.additional_dependencies, new.additional_dependencies)
106+
if old_dep != new_dep
107+
]
103108
dependencies = [
104-
self._format_additional_dependency(old_dep, new_dep, " " if last else "│", idx + 1 == nb_deps)
105-
for idx, (old_dep, new_dep) in enumerate(zip(old.additional_dependencies, new.additional_dependencies))
109+
self._format_additional_dependency(old_dep, new_dep, " " if last else "│", idx + 1 == len(pairs))
110+
for idx, (old_dep, new_dep) in enumerate(pairs)
106111
]
107112
return (hook, *dependencies)
108113

src/sync_pre_commit_lock/poetry_plugin.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from cleo.exceptions import CleoValueError
1010
from cleo.helpers import option
1111
from cleo.io.outputs.output import Verbosity
12+
from cleo.ui.table_style import TableStyle
1213
from packaging.requirements import Requirement
1314
from poetry.__version__ import __version__ as poetry_version
1415
from poetry.console.application import Application
@@ -35,6 +36,16 @@
3536
from sync_pre_commit_lock.pre_commit_config import PreCommitHook, PreCommitRepo
3637

3738

39+
very_compact_style = (
40+
TableStyle()
41+
.set_horizontal_border_chars("")
42+
.set_vertical_border_chars("", " ")
43+
.set_default_crossing_char("")
44+
.set_cell_row_content_format("{}")
45+
)
46+
"""A compact style without outside borders"""
47+
48+
3849
class PoetryPrinter(Printer):
3950
success_list_token: str = "<fg=green;options=bold>•</>" # noqa: S105
4051

@@ -60,7 +71,7 @@ def success(self, msg: str) -> None:
6071
def list_updated_packages(self, packages: dict[str, tuple[PreCommitRepo, PreCommitRepo]]) -> None:
6172
from cleo.ui.table import Table
6273

63-
table = Table(self.io, style="compact")
74+
table = Table(self.io, style=very_compact_style)
6475

6576
table.set_rows(
6677
[list(row) for package, (old, new) in packages.items() for row in self._format_repo(package, old, new)]
@@ -91,7 +102,7 @@ def _format_repo_url(self, old_repo_url: str, new_repo_url: str, package_name: s
91102
return url.replace(package_name, f"<c1>{package_name}</>")
92103

93104
def _format_hook(self, old: PreCommitHook, new: PreCommitHook, last: bool) -> Sequence[Sequence[str]]:
94-
if not (nb_deps := len(old.additional_dependencies)):
105+
if not len(old.additional_dependencies):
95106
return []
96107
hook = (
97108
f"<info>{self.plugin_prefix}</>",
@@ -100,9 +111,14 @@ def _format_hook(self, old: PreCommitHook, new: PreCommitHook, last: bool) -> Se
100111
"",
101112
"",
102113
)
114+
pairs = [
115+
(old_dep, new_dep)
116+
for old_dep, new_dep in zip(old.additional_dependencies, new.additional_dependencies)
117+
if old_dep != new_dep
118+
]
103119
dependencies = [
104-
self._format_additional_dependency(old_dep, new_dep, " " if last else "│", idx + 1 == nb_deps)
105-
for idx, (old_dep, new_dep) in enumerate(zip(old.additional_dependencies, new.additional_dependencies))
120+
self._format_additional_dependency(old_dep, new_dep, " " if last else "│", idx + 1 == len(pairs))
121+
for idx, (old_dep, new_dep) in enumerate(pairs)
106122
]
107123
return (hook, *dependencies)
108124

tests/test_pdm/test_pdm_plugin.py

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from pathlib import Path
4+
from textwrap import dedent
45
from unittest import mock
56

67
import pytest
@@ -78,6 +79,15 @@ def test_on_pdm_install_setup_pre_commit_success(project: Project) -> None:
7879
action_mock.execute.assert_called_once()
7980

8081

82+
def assert_output(out: str, expected: str):
83+
__tracebackhide__ = True
84+
85+
# Invisible whitespace enfinf lines (table side effect)
86+
out = "\n".join(line.rstrip() for line in out.splitlines())
87+
88+
assert out.strip() == dedent(expected).strip()
89+
90+
8191
def test_pdm_printer_list_success(capsys: pytest.CaptureFixture[str]) -> None:
8292
printer = PDMPrinter(UI())
8393

@@ -91,7 +101,7 @@ def test_pdm_printer_list_success(capsys: pytest.CaptureFixture[str]) -> None:
91101
)
92102
captured = capsys.readouterr()
93103

94-
assert "[sync-pre-commit-lock] ✔ https://repo1.local/test rev1 -> rev2" in captured.out
104+
assert_output(captured.out, "[sync-pre-commit-lock] ✔ https://repo1.local/test rev1 -> rev2")
95105

96106

97107
def test_pdm_printer_list_success_additional_dependency(capsys: pytest.CaptureFixture[str]) -> None:
@@ -107,9 +117,12 @@ def test_pdm_printer_list_success_additional_dependency(capsys: pytest.CaptureFi
107117
)
108118
captured = capsys.readouterr()
109119

110-
assert "[sync-pre-commit-lock] ✔ https://repo1.local/test" in captured.out
111-
assert "[sync-pre-commit-lock] └ hook" in captured.out
112-
assert "[sync-pre-commit-lock] └ dep * -> 0.1.2" in captured.out
120+
expected = """
121+
[sync-pre-commit-lock] ✔ https://repo1.local/test
122+
[sync-pre-commit-lock] └ hook
123+
[sync-pre-commit-lock] └ dep * -> 0.1.2
124+
"""
125+
assert_output(captured.out, expected)
113126

114127

115128
def test_pdm_printer_list_success_repo_with_multiple_hooks_and_additional_dependency(
@@ -141,12 +154,15 @@ def test_pdm_printer_list_success_repo_with_multiple_hooks_and_additional_depend
141154
)
142155
captured = capsys.readouterr()
143156

144-
assert "[sync-pre-commit-lock] ✔ https://repo1.local/test rev1 -> rev2" in captured.out
145-
assert "[sync-pre-commit-lock] ├ 1st-hook" in captured.out
146-
assert "[sync-pre-commit-lock] │ └ other 0.42 -> 3.4.5" in captured.out
147-
assert "[sync-pre-commit-lock] └ 2nd-hook" in captured.out
148-
assert "[sync-pre-commit-lock] ├ dep * -> 0.1.2" in captured.out
149-
assert "[sync-pre-commit-lock] └ other >=0.42 -> 3.4.5" in captured.out
157+
expected = """
158+
[sync-pre-commit-lock] ✔ https://repo1.local/test rev1 -> rev2
159+
[sync-pre-commit-lock] ├ 1st-hook
160+
[sync-pre-commit-lock] │ └ other 0.42 -> 3.4.5
161+
[sync-pre-commit-lock] └ 2nd-hook
162+
[sync-pre-commit-lock] ├ dep * -> 0.1.2
163+
[sync-pre-commit-lock] └ other >=0.42 -> 3.4.5
164+
"""
165+
assert_output(captured.out, expected)
150166

151167

152168
def test_pdm_printer_list_success_renamed_repository(capsys: pytest.CaptureFixture[str]) -> None:
@@ -162,4 +178,4 @@ def test_pdm_printer_list_success_renamed_repository(capsys: pytest.CaptureFixtu
162178
)
163179
captured = capsys.readouterr()
164180

165-
assert "[sync-pre-commit-lock] ✔ https://{old -> new}.repo.local/test rev1 -> rev2" in captured.out
181+
assert_output(captured.out, "[sync-pre-commit-lock] ✔ https://{old -> new}.repo.local/test rev1 -> rev2")

tests/test_poetry/test_poetry_plugin.py

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import re
2+
from textwrap import dedent
23
from unittest.mock import MagicMock, patch
34

45
import pytest
@@ -107,6 +108,18 @@ def test_handle_post_command_application_none() -> None:
107108
pytest.fail("RuntimeError not raised")
108109

109110

111+
def assert_output(out: str, expected: str):
112+
__tracebackhide__ = True
113+
114+
# Remove all <..> tags, as we don't have the real parser
115+
out = re.sub(r"<[^>]*>", "", out)
116+
117+
# Invisible whitespace enfinf lines (table side effect)
118+
out = "\n".join(line.rstrip() for line in out.splitlines())
119+
120+
assert out.strip() == dedent(expected).strip()
121+
122+
110123
def test_poetry_printer_list_success(capsys: pytest.CaptureFixture[str]) -> None:
111124
from cleo.io.inputs.input import Input
112125
from cleo.io.io import IO
@@ -131,10 +144,8 @@ def _write(message: str, new_line: bool = False):
131144
}
132145
)
133146
captured = capsys.readouterr()
134-
# Remove all <..> tags, as we don't have the real parser
135-
out = re.sub(r"<[^>]*>", "", captured.out)
136147

137-
assert "[sync-pre-commit-lock] • https://repo1.local/test rev1 -> rev2" in out
148+
assert_output(captured.out, "[sync-pre-commit-lock] • https://repo1.local/test rev1 -> rev2")
138149

139150

140151
def test_poetry_printer_list_success_additional_dependency(capsys: pytest.CaptureFixture[str]) -> None:
@@ -161,12 +172,13 @@ def _write(message: str, new_line: bool = False):
161172
}
162173
)
163174
captured = capsys.readouterr()
164-
# Remove all <..> tags, as we don't have the real parser
165-
out = re.sub(r"<[^>]*>", "", captured.out)
166175

167-
assert "[sync-pre-commit-lock] • https://repo1.local/test" in out
168-
assert "[sync-pre-commit-lock] └ hook" in out
169-
assert "[sync-pre-commit-lock] └ dep * -> 0.1.2" in out
176+
expected = """
177+
[sync-pre-commit-lock] • https://repo1.local/test
178+
[sync-pre-commit-lock] └ hook
179+
[sync-pre-commit-lock] └ dep * -> 0.1.2
180+
"""
181+
assert_output(captured.out, expected)
170182

171183

172184
def test_poetry_printer_list_success_with_multiple_hooks_and_additional_dependency(
@@ -209,15 +221,16 @@ def _write(message: str, new_line: bool = False):
209221
}
210222
)
211223
captured = capsys.readouterr()
212-
# Remove all <..> tags, as we don't have the real parser
213-
out = re.sub(r"<[^>]*>", "", captured.out)
214224

215-
assert "[sync-pre-commit-lock] • https://repo1.local/test rev1 -> rev2" in out
216-
assert "[sync-pre-commit-lock] ├ 1st-hook" in out
217-
assert "[sync-pre-commit-lock] │ └ other 0.42 -> 3.4.5" in out
218-
assert "[sync-pre-commit-lock] └ 2nd-hook" in out
219-
assert "[sync-pre-commit-lock] ├ dep * -> 0.1.2" in out
220-
assert "[sync-pre-commit-lock] └ other >=0.42 -> 3.4.5" in out
225+
expected = """
226+
[sync-pre-commit-lock] • https://repo1.local/test rev1 -> rev2
227+
[sync-pre-commit-lock] ├ 1st-hook
228+
[sync-pre-commit-lock] │ └ other 0.42 -> 3.4.5
229+
[sync-pre-commit-lock] └ 2nd-hook
230+
[sync-pre-commit-lock] ├ dep * -> 0.1.2
231+
[sync-pre-commit-lock] └ other >=0.42 -> 3.4.5
232+
"""
233+
assert_output(captured.out, expected)
221234

222235

223236
def test_poetry_printer_list_success_renamed_repository(capsys: pytest.CaptureFixture[str]) -> None:
@@ -244,10 +257,8 @@ def _write(message: str, new_line: bool = False):
244257
}
245258
)
246259
captured = capsys.readouterr()
247-
# Remove all <..> tags, as we don't have the real parser
248-
out = re.sub(r"<[^>]*>", "", captured.out)
249260

250-
assert "[sync-pre-commit-lock] • https://{old -> new}.repo.local/test rev1 -> rev2" in out
261+
assert_output(captured.out, "[sync-pre-commit-lock] • https://{old -> new}.repo.local/test rev1 -> rev2")
251262

252263

253264
def test_direct_command_invocation():

0 commit comments

Comments
 (0)