From 0d8bfaeb893126ea484ad7ccd9d782e04df0dde8 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 2 Sep 2025 11:54:22 +0000 Subject: [PATCH 01/12] start with process label checks --- nf_core/components/nfcore_component.py | 8 ++--- nf_core/modules/lint/main_nf.py | 9 +++-- tests/modules/lint/test_main_nf.py | 48 ++++++++++++++++++++------ 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/nf_core/components/nfcore_component.py b/nf_core/components/nfcore_component.py index 0acd2fafad..5d9d195eca 100644 --- a/nf_core/components/nfcore_component.py +++ b/nf_core/components/nfcore_component.py @@ -7,6 +7,8 @@ from pathlib import Path from typing import Any, Optional, Union +from reftrace import Module + log = logging.getLogger(__name__) @@ -179,11 +181,7 @@ def _get_included_components_in_chained_tests(self, main_nf_test: Union[Path, st return included_components def _get_process_name(self): - with open(self.main_nf) as fh: - for line in fh: - if re.search(r"^\s*process\s*\w*\s*{", line): - return re.search(r"^\s*process\s*(\w*)\s*{.*", line).group(1) or "" - return "" + return Module.from_file(str(self.main_nf)).processes[0].name def get_inputs_from_main_nf(self) -> None: """Collect all inputs from the main.nf file.""" diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 063fc354fa..162bd768e9 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -448,7 +448,7 @@ def check_process_section(self, lines, registry, fix_version, progress_bar): return docker_tag == singularity_tag -def check_process_labels(self, lines): +def check_process_labels(self, mod): correct_process_labels = [ "process_single", "process_low", @@ -457,14 +457,13 @@ def check_process_labels(self, lines): "process_long", "process_high_memory", ] - all_labels = [line.strip() for line in lines if line.lstrip().startswith("label ")] + label = mod.processes[0].labels[0] + all_labels = label.split() bad_labels = [] good_labels = [] if len(all_labels) > 0: for label in all_labels: - try: - label = re.match(r"^label\s+'?\"?([a-zA-Z0-9_-]+)'?\"?$", label).group(1) - except AttributeError: + if not label.replace("_", "").isalnum(): self.warned.append( ( "process_standard_label", diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index d4327f50f5..04f7649c7c 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -1,4 +1,7 @@ +from pathlib import Path + import pytest +from reftrace import Module, ParseError import nf_core.modules.lint import nf_core.modules.patch @@ -7,33 +10,58 @@ from ...test_modules import TestModules from .test_lint_utils import MockModuleLint +# @pytest.mark.parametrize( +# "content,passed,warned,failed", +# [ +# # Valid process label +# ("label 'process_high'\ncpus 12", 1, 0, 0), +# # Non-alphanumeric characters in label +# ("label 'a:label:with:colons'\ncpus 12", 0, 2, 0), +# # Conflicting labels +# ("label 'process_high'\nlabel 'process_low'\ncpus 12", 0, 1, 0), +# # Duplicate labels +# ("label 'process_high'\nlabel 'process_high'\ncpus 12", 0, 2, 0), +# # Valid and non-standard labels +# ("label 'process_high'\nlabel 'process_extra_label'\ncpus 12", 1, 1, 0), +# # Non-standard label only +# ("label 'process_extra_label'\ncpus 12", 0, 2, 0), +# # Non-standard duplicates without quotes +# ("label process_extra_label\nlabel process_extra_label\ncpus 12", 0, 3, 0), +# # No label found +# ("cpus 12", 0, 1, 0), +# ], +# ) + @pytest.mark.parametrize( "content,passed,warned,failed", [ # Valid process label - ("label 'process_high'\ncpus 12", 1, 0, 0), + ("process_high", 1, 0, 0), # Non-alphanumeric characters in label - ("label 'a:label:with:colons'\ncpus 12", 0, 2, 0), + ("a:label:with:colons", 0, 2, 0), # Conflicting labels - ("label 'process_high'\nlabel 'process_low'\ncpus 12", 0, 1, 0), + ("process_high process_low", 0, 1, 0), # Duplicate labels - ("label 'process_high'\nlabel 'process_high'\ncpus 12", 0, 2, 0), + ("process_high process_high", 0, 2, 0), # Valid and non-standard labels - ("label 'process_high'\nlabel 'process_extra_label'\ncpus 12", 1, 1, 0), + ("process_high process_extra_label", 1, 1, 0), # Non-standard label only - ("label 'process_extra_label'\ncpus 12", 0, 2, 0), + ("process_extra_label", 0, 2, 0), # Non-standard duplicates without quotes - ("label process_extra_label\nlabel process_extra_label\ncpus 12", 0, 3, 0), + ("process_extra_label process_extra_label", 0, 3, 0), # No label found - ("cpus 12", 0, 1, 0), + (" ", 0, 1, 0), ], ) def test_process_labels(content, passed, warned, failed): """Test process label validation""" mock_lint = MockModuleLint() - check_process_labels(mock_lint, content.splitlines()) - + module = Module.from_file(str(Path(mock_lint.main_nf))) + assert not isinstance(module, ParseError) + assert len(module.processes) == 1 + module.processes[0].labels[0] = content + check_process_labels(mock_lint, module) assert len(mock_lint.passed) == passed assert len(mock_lint.warned) == warned assert len(mock_lint.failed) == failed From bbdfb1bfc7711c95909d879e683ba86e1f808872 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 2 Sep 2025 11:59:28 +0000 Subject: [PATCH 02/12] [automated] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7eaac6d521..04e81cfeba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Support modules with `exec:` blocks ([#3633](https://github.com/nf-core/tools/pull/3633)) - feat: nf-core modules bump-version supports specifying the toolkit ([#3608](https://github.com/nf-core/tools/pull/3608)) +- Testing out Reftrace for regex replacement in modules ([#3745](https://github.com/nf-core/tools/pull/3745)) ### Subworkflows From 5cb0d4fc1bbff356458efaa69a7f3b50aa8fe412 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Wed, 3 Sep 2025 17:07:28 -0500 Subject: [PATCH 03/12] feat: replace regex with Reftrace for process label parsing in module linting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace regex-based process label validation with structured parsing using the Reftrace library. This provides more accurate parsing of Nextflow syntax and better error handling. Key changes: - Enhanced MockModuleLint to create temporary files for Reftrace compatibility - Updated check_process_labels to use Reftrace Module objects instead of raw lines - Modified integration to parse modules with Reftrace and handle parse errors - Updated unit tests to create proper Nextflow syntax files for testing Addresses Yuxin's challenge with integrating Reftrace into the testing infrastructure while maintaining the existing linting functionality. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- nf_core/modules/lint/main_nf.py | 45 ++++++++++++-- tests/modules/lint/test_lint_utils.py | 30 ++++++++- tests/modules/lint/test_main_nf.py | 88 ++++++++++++++++++++------- 3 files changed, 135 insertions(+), 28 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index 162bd768e9..ed6954a0b5 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -268,8 +268,16 @@ def check_process_section(self, lines, registry, fix_version, progress_bar): else: self.failed.append(("process_capitals", "Process name is not in capital letters", self.main_nf)) - # Check that process labels are correct - check_process_labels(self, lines) + # Check that process labels are correct using Reftrace + from reftrace import Module, ParseError + + reftrace_mod = Module.from_file(str(self.main_nf)) + if not isinstance(reftrace_mod, ParseError): + check_process_labels(self, reftrace_mod) + else: + self.failed.append( + ("process_standard_label", f"Failed to parse module with Reftrace: {reftrace_mod.error}", self.main_nf) + ) # Deprecated enable_conda for i, raw_line in enumerate(lines): @@ -449,6 +457,16 @@ def check_process_section(self, lines, registry, fix_version, progress_bar): def check_process_labels(self, mod): + """ + Check process labels using Reftrace parsing. + + This function validates that process labels conform to nf-core standards using + structured parsing via the Reftrace library. + + Args: + self: ModuleLint object with passed/warned/failed lists and main_nf path + mod: Reftrace Module object containing parsed Nextflow processes + """ correct_process_labels = [ "process_single", "process_low", @@ -457,10 +475,27 @@ def check_process_labels(self, mod): "process_long", "process_high_memory", ] - label = mod.processes[0].labels[0] - all_labels = label.split() + + # Defensive checks for Reftrace module structure + if not mod.processes: + self.warned.append(("process_standard_label", "No processes found in module", self.main_nf)) + return + + process = mod.processes[0] + if not process.labels: + self.warned.append(("process_standard_label", "Process label not specified", self.main_nf)) + return + + # Extract label values from all label directives + all_labels = [] + for label_directive in process.labels: + # Get the label value from Reftrace Label objects + if hasattr(label_directive, "value") and label_directive.value: + label_value = label_directive.value + all_labels.append(label_value) bad_labels = [] good_labels = [] + invalid_labels_count = 0 if len(all_labels) > 0: for label in all_labels: if not label.replace("_", "").isalnum(): @@ -471,11 +506,13 @@ def check_process_labels(self, mod): self.main_nf, ) ) + invalid_labels_count += 1 continue if label not in correct_process_labels: bad_labels.append(label) else: good_labels.append(label) + if len(good_labels) > 1: self.warned.append( ( diff --git a/tests/modules/lint/test_lint_utils.py b/tests/modules/lint/test_lint_utils.py index 006bec978a..8cbb078b26 100644 --- a/tests/modules/lint/test_lint_utils.py +++ b/tests/modules/lint/test_lint_utils.py @@ -1,3 +1,6 @@ +import os +import tempfile + import nf_core.modules.lint from ...test_modules import TestModules @@ -12,7 +15,32 @@ def __init__(self): self.warned = [] self.failed = [] - self.main_nf = "main_nf" + # Create a temporary file with basic Nextflow process structure + # that Reftrace can parse + self._temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".nf", delete=False) + basic_process = """process TEST_PROCESS { + label 'process_high' + + input: + path input_file + + output: + path "output.txt" + + script: + ''' + echo "test" > output.txt + ''' +} +""" + self._temp_file.write(basic_process) + self._temp_file.close() + self.main_nf = self._temp_file.name + + def cleanup(self): + """Clean up the temporary file""" + if hasattr(self, "_temp_file") and os.path.exists(self._temp_file.name): + os.unlink(self._temp_file.name) class TestModulesLint(TestModules): diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index 04f7649c7c..748dcf8ed4 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -1,5 +1,3 @@ -from pathlib import Path - import pytest from reftrace import Module, ParseError @@ -34,37 +32,81 @@ @pytest.mark.parametrize( - "content,passed,warned,failed", + "label_content,passed,warned,failed", [ # Valid process label - ("process_high", 1, 0, 0), + ("label 'process_high'", 1, 0, 0), # Non-alphanumeric characters in label - ("a:label:with:colons", 0, 2, 0), - # Conflicting labels - ("process_high process_low", 0, 1, 0), + ("label 'a:label:with:colons'", 0, 2, 0), + # Conflicting labels (multiple label lines) + ("label 'process_high'\\n label 'process_low'", 0, 1, 0), # Duplicate labels - ("process_high process_high", 0, 2, 0), + ("label 'process_high'\\n label 'process_high'", 0, 2, 0), # Valid and non-standard labels - ("process_high process_extra_label", 1, 1, 0), + ("label 'process_high'\\n label 'process_extra_label'", 1, 1, 0), # Non-standard label only - ("process_extra_label", 0, 2, 0), - # Non-standard duplicates without quotes - ("process_extra_label process_extra_label", 0, 3, 0), + ("label 'process_extra_label'", 0, 2, 0), + # Duplicate non-standard labels + ("label 'process_extra_label'\\n label 'process_extra_label'", 0, 3, 0), # No label found - (" ", 0, 1, 0), + ("cpus 2", 0, 1, 0), ], ) -def test_process_labels(content, passed, warned, failed): +def test_process_labels(label_content, passed, warned, failed): """Test process label validation""" - mock_lint = MockModuleLint() - module = Module.from_file(str(Path(mock_lint.main_nf))) - assert not isinstance(module, ParseError) - assert len(module.processes) == 1 - module.processes[0].labels[0] = content - check_process_labels(mock_lint, module) - assert len(mock_lint.passed) == passed - assert len(mock_lint.warned) == warned - assert len(mock_lint.failed) == failed + # Create a temporary file with the specific label content + import os + import tempfile + + # Create proper Nextflow content with the label + process_content = f"""process TEST_PROCESS {{ + {label_content} + + input: + path input_file + + output: + path "output.txt" + + script: + ''' + echo "test" > output.txt + ''' +}} +""" + + temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".nf", delete=False) + temp_file.write(process_content) + temp_file.close() + + try: + # Create MockModuleLint but override with our specific test file + mock_lint = MockModuleLint() + mock_lint.cleanup() # Clean up the default temp file + mock_lint.main_nf = temp_file.name + + # Parse with Reftrace + module = Module.from_file(temp_file.name) + assert not isinstance(module, ParseError), f"Failed to parse test file: {module}" + + # Run the check_process_labels function + check_process_labels(mock_lint, module) + + # Verify results + assert len(mock_lint.passed) == passed, ( + f"Expected {passed} passed tests, got {len(mock_lint.passed)}: {mock_lint.passed}" + ) + assert len(mock_lint.warned) == warned, ( + f"Expected {warned} warned tests, got {len(mock_lint.warned)}: {mock_lint.warned}" + ) + assert len(mock_lint.failed) == failed, ( + f"Expected {failed} failed tests, got {len(mock_lint.failed)}: {mock_lint.failed}" + ) + + finally: + # Clean up the temporary file + if os.path.exists(temp_file.name): + os.unlink(temp_file.name) @pytest.mark.parametrize( From 21c9eb753881e6eed85bff6f2ca693694b45cfa5 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Mon, 8 Sep 2025 15:44:39 +0000 Subject: [PATCH 04/12] fix test --- nf_core/modules/lint/main_nf.py | 2 +- tests/modules/lint/test_main_nf.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index ed6954a0b5..a887b19ea4 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -483,7 +483,7 @@ def check_process_labels(self, mod): process = mod.processes[0] if not process.labels: - self.warned.append(("process_standard_label", "Process label not specified", self.main_nf)) + self.warned.append(("process_standard_label", "No label found for process", self.main_nf)) return # Extract label values from all label directives diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index 748dcf8ed4..b84b50b431 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -39,15 +39,15 @@ # Non-alphanumeric characters in label ("label 'a:label:with:colons'", 0, 2, 0), # Conflicting labels (multiple label lines) - ("label 'process_high'\\n label 'process_low'", 0, 1, 0), + ("label 'process_low'\nlabel 'process_high'", 0, 1, 0), # Duplicate labels - ("label 'process_high'\\n label 'process_high'", 0, 2, 0), + ("label 'process_high'\nlabel 'process_high'", 0, 2, 0), # Valid and non-standard labels - ("label 'process_high'\\n label 'process_extra_label'", 1, 1, 0), + ("label 'process_high'\nlabel 'process_extra_label'", 1, 1, 0), # Non-standard label only ("label 'process_extra_label'", 0, 2, 0), # Duplicate non-standard labels - ("label 'process_extra_label'\\n label 'process_extra_label'", 0, 3, 0), + ("label 'process_extra_label'\nlabel 'process_extra_label'", 0, 3, 0), # No label found ("cpus 2", 0, 1, 0), ], @@ -88,7 +88,6 @@ def test_process_labels(label_content, passed, warned, failed): # Parse with Reftrace module = Module.from_file(temp_file.name) assert not isinstance(module, ParseError), f"Failed to parse test file: {module}" - # Run the check_process_labels function check_process_labels(mock_lint, module) From a9a0b5e9ba2c7ec8ef2b1bf3dffc4de2be69df9f Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 23 Sep 2025 09:41:13 +0000 Subject: [PATCH 05/12] update requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 15ae184b2d..d8245a79f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,3 +24,4 @@ textual==5.1.1 trogon pdiff ruamel.yaml +reftrace From d88d9136268a42a824b465cab17b0f3c817d57b0 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 23 Sep 2025 10:24:43 +0000 Subject: [PATCH 06/12] tempfile --- tests/modules/lint/test_lint_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/modules/lint/test_lint_utils.py b/tests/modules/lint/test_lint_utils.py index 8cbb078b26..4f3a4ad3f6 100644 --- a/tests/modules/lint/test_lint_utils.py +++ b/tests/modules/lint/test_lint_utils.py @@ -60,4 +60,4 @@ def test_mock_module_lint(self): assert isinstance(mock_lint.passed, list) assert isinstance(mock_lint.warned, list) assert isinstance(mock_lint.failed, list) - assert mock_lint.main_nf == "main_nf" + assert mock_lint.main_nf == mock_lint._temp_file.name From 4de14dc6dab053b5f0b0add106bd54dea0d50c6f Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 23 Sep 2025 12:24:22 +0000 Subject: [PATCH 07/12] debug --- nf_core/components/nfcore_component.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nf_core/components/nfcore_component.py b/nf_core/components/nfcore_component.py index 5d9d195eca..b4c54ccd8a 100644 --- a/nf_core/components/nfcore_component.py +++ b/nf_core/components/nfcore_component.py @@ -181,8 +181,11 @@ def _get_included_components_in_chained_tests(self, main_nf_test: Union[Path, st return included_components def _get_process_name(self): - return Module.from_file(str(self.main_nf)).processes[0].name - + try: + return Module.from_file(str(self.main_nf)).processes[0].name + except IndexError: + return "" + def get_inputs_from_main_nf(self) -> None: """Collect all inputs from the main.nf file.""" inputs: Any = [] # Can be 'list[list[dict[str, dict[str, str]]]]' or 'list[str]' From 1c57ed9ae2c68698d94137fa458dd433d571978d Mon Sep 17 00:00:00 2001 From: yuxinNing Date: Mon, 27 Oct 2025 13:45:50 +0100 Subject: [PATCH 08/12] removing requirement --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index fb16a9d518..c19a8183e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,6 +22,5 @@ repo2rocrate tabulate textual==6.2.1 trogon -pdiff +ipdiff ruamel.yaml -reftrace From 4829bef37ab93566d266930a0645c0568e1aac16 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:10:28 +0000 Subject: [PATCH 09/12] Pathlib --- .vscode/settings.json | 5 ++++- nf_core/modules/lint/main_nf.py | 6 ++---- tests/modules/lint/test_main_nf.py | 7 ++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5651d52e08..30972c9c3b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,8 @@ "source.fixAll": "explicit", "source.organizeImports": "explicit" } - } + }, + "python-envs.defaultEnvManager": "ms-python.python:conda", + "python-envs.defaultPackageManager": "ms-python.python:conda", + "python-envs.pythonProjects": [] } diff --git a/nf_core/modules/lint/main_nf.py b/nf_core/modules/lint/main_nf.py index a4631d9dd7..8e5b923f7b 100644 --- a/nf_core/modules/lint/main_nf.py +++ b/nf_core/modules/lint/main_nf.py @@ -10,6 +10,7 @@ import requests import yaml +from reftrace import Module, ParseError from rich.progress import Progress import nf_core @@ -308,9 +309,6 @@ def check_process_section(self, lines, registry, fix_version, progress_bar): else: self.failed.append(("main_nf", "process_capitals", "Process name is not in capital letters", self.main_nf)) - # Check that process labels are correct using Reftrace - from reftrace import Module, ParseError - reftrace_mod = Module.from_file(str(self.main_nf)) if not isinstance(reftrace_mod, ParseError): check_process_labels(self, reftrace_mod) @@ -532,7 +530,7 @@ def check_process_section(self, lines, registry, fix_version, progress_bar): return docker_tag == singularity_tag -def check_process_labels(self, mod): +def check_process_labels(self, mod:Module): """ Check process labels using Reftrace parsing. diff --git a/tests/modules/lint/test_main_nf.py b/tests/modules/lint/test_main_nf.py index b5a2abdd62..da0569b95b 100644 --- a/tests/modules/lint/test_main_nf.py +++ b/tests/modules/lint/test_main_nf.py @@ -1,3 +1,5 @@ +from pathlib import Path + import pytest from reftrace import Module, ParseError @@ -55,7 +57,6 @@ def test_process_labels(label_content, passed, warned, failed): """Test process label validation""" # Create a temporary file with the specific label content - import os import tempfile # Create proper Nextflow content with the label @@ -104,8 +105,8 @@ def test_process_labels(label_content, passed, warned, failed): finally: # Clean up the temporary file - if os.path.exists(temp_file.name): - os.unlink(temp_file.name) + if Path(temp_file.name).exists(): + Path(temp_file.name).unlink() @pytest.mark.parametrize( From f5c7e5702c8548d4a72feef7ac8919b3b94efb3e Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:29:24 +0000 Subject: [PATCH 10/12] requirement --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c19a8183e9..00de9ad08a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -24,3 +24,4 @@ textual==6.2.1 trogon ipdiff ruamel.yaml +reftrace \ No newline at end of file From 64a99ba237a0bbf04f37c93e16172a3bdfbcdd15 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:50:19 +0000 Subject: [PATCH 11/12] test --- .vscode/settings.json | 5 +---- tests/modules/lint/test_lint_utils.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 30972c9c3b..5651d52e08 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,8 +12,5 @@ "source.fixAll": "explicit", "source.organizeImports": "explicit" } - }, - "python-envs.defaultEnvManager": "ms-python.python:conda", - "python-envs.defaultPackageManager": "ms-python.python:conda", - "python-envs.pythonProjects": [] + } } diff --git a/tests/modules/lint/test_lint_utils.py b/tests/modules/lint/test_lint_utils.py index 4f3a4ad3f6..3cab90d33b 100644 --- a/tests/modules/lint/test_lint_utils.py +++ b/tests/modules/lint/test_lint_utils.py @@ -24,7 +24,7 @@ def __init__(self): input: path input_file - output: + output: path "output.txt" script: From 2b358f489b1ba40b5d72c5433116c055ed297121 Mon Sep 17 00:00:00 2001 From: yuxinNing <92061677+ningyuxin1999@users.noreply.github.com> Date: Tue, 28 Oct 2025 10:33:07 +0000 Subject: [PATCH 12/12] fix typo --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 00de9ad08a..4af22b2294 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,6 +22,6 @@ repo2rocrate tabulate textual==6.2.1 trogon -ipdiff +pdiff ruamel.yaml reftrace \ No newline at end of file