redup 0.4.3__tar.gz → 0.4.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {redup-0.4.3 → redup-0.4.5}/PKG-INFO +2 -2
- {redup-0.4.3 → redup-0.4.5}/README.md +1 -1
- {redup-0.4.3 → redup-0.4.5}/pyproject.toml +1 -1
- {redup-0.4.3 → redup-0.4.5}/src/redup/__init__.py +1 -1
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/main.py +12 -11
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/output_writer.py +11 -11
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/scan_commands.py +4 -3
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/PKG-INFO +2 -2
- {redup-0.4.3 → redup-0.4.5}/tests/test_e2e.py +1 -1
- {redup-0.4.3 → redup-0.4.5}/LICENSE +0 -0
- {redup-0.4.3 → redup-0.4.5}/setup.cfg +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/__main__.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/__init__.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/config_builder.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/fuzzy_similarity.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/cli_app/scan_helpers.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/__init__.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/cache.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/config.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/differ.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/fuzzy_similarity.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/hash_cache.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/hasher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/lazy_grouper.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/lsh_matcher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/matcher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/models.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/pipeline.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/planner.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/python_parser.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/scanner.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/semantic.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/ts_extractor.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/universal_fuzzy.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/__init__.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/diff_helpers.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/duplicate_finders.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/function_extractor.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/hash_utils.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/core/utils/language_dispatcher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/mcp_server.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/__init__.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/code2llm_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/enhanced_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/json_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/markdown_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/toon_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup/reporters/yaml_reporter.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/SOURCES.txt +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/dependency_links.txt +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/entry_points.txt +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/requires.txt +0 -0
- {redup-0.4.3 → redup-0.4.5}/src/redup.egg-info/top_level.txt +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_hasher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_matcher.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_mcp_server.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_models.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_pipeline.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_planner.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_reporters.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_scanner.py +0 -0
- {redup-0.4.3 → redup-0.4.5}/tests/test_ts_extractor.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redup
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Code duplication analyzer and refactoring planner for LLMs
|
|
5
5
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -92,7 +92,7 @@ Dynamic: license-file
|
|
|
92
92
|
[](https://pypi.org/project/redup/)
|
|
93
93
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
94
94
|
[](https://python.org)
|
|
95
|
-
[](https://pypi.org/project/redup/)
|
|
96
96
|
|
|
97
97
|
reDUP scans codebases for duplicated functions, blocks, and structural patterns — then builds a prioritized refactoring map that LLMs can consume to eliminate redundancy systematically.
|
|
98
98
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
[](https://pypi.org/project/redup/)
|
|
6
6
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
7
7
|
[](https://python.org)
|
|
8
|
-
[](https://pypi.org/project/redup/)
|
|
9
9
|
|
|
10
10
|
reDUP scans codebases for duplicated functions, blocks, and structural patterns — then builds a prioritized refactoring map that LLMs can consume to eliminate redundancy systematically.
|
|
11
11
|
|
|
@@ -78,14 +78,15 @@ def scan(
|
|
|
78
78
|
"--include-tests",
|
|
79
79
|
help="Include test files. Overrides config.",
|
|
80
80
|
),
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"--
|
|
84
|
-
help="
|
|
81
|
+
no_functions_only: bool = typer.Option(
|
|
82
|
+
False,
|
|
83
|
+
"--no-functions-only",
|
|
84
|
+
help="Analyze all code, not just functions (default: functions-only for speed).",
|
|
85
85
|
),
|
|
86
86
|
parallel: bool = typer.Option(
|
|
87
87
|
False,
|
|
88
|
-
"--parallel
|
|
88
|
+
"--parallel",
|
|
89
|
+
"--no-parallel",
|
|
89
90
|
help="Use parallel scanning for large projects (default: disabled due to issues).",
|
|
90
91
|
),
|
|
91
92
|
max_workers: int | None = typer.Option(
|
|
@@ -98,10 +99,10 @@ def scan(
|
|
|
98
99
|
"--incremental",
|
|
99
100
|
help="Use incremental scanning with caching.",
|
|
100
101
|
),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
"--
|
|
104
|
-
help="
|
|
102
|
+
no_memory_cache: bool = typer.Option(
|
|
103
|
+
False,
|
|
104
|
+
"--no-memory-cache",
|
|
105
|
+
help="Disable memory cache for scanning.",
|
|
105
106
|
),
|
|
106
107
|
max_cache_mb: int = typer.Option(
|
|
107
108
|
512,
|
|
@@ -122,8 +123,8 @@ def scan(
|
|
|
122
123
|
"""Scan a project for code duplicates."""
|
|
123
124
|
return scan_command(
|
|
124
125
|
path, format, output, extensions, min_lines, min_similarity,
|
|
125
|
-
include_tests,
|
|
126
|
-
incremental,
|
|
126
|
+
include_tests, not no_functions_only, parallel, max_workers,
|
|
127
|
+
incremental, not no_memory_cache, max_cache_mb, fuzzy, fuzzy_threshold
|
|
127
128
|
)
|
|
128
129
|
|
|
129
130
|
|
|
@@ -61,18 +61,18 @@ def write_results(dup_map: DuplicationMap, format: str, output: Any, path: Path)
|
|
|
61
61
|
"markdown": to_markdown(dup_map),
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
# Determine and create output directory
|
|
65
|
+
if output:
|
|
66
|
+
# Create output directory if it doesn't exist
|
|
67
|
+
output.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
base_dir = output
|
|
69
69
|
else:
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
70
|
+
base_dir = path
|
|
71
|
+
|
|
72
|
+
for fmt, content in formats.items():
|
|
73
|
+
target = base_dir / f"duplication.{fmt}"
|
|
74
|
+
target.write_text(content, encoding="utf-8")
|
|
75
|
+
typer.echo(f" → {target}")
|
|
76
76
|
else:
|
|
77
77
|
typer.echo(f"❌ Unknown format: {format}", err=True)
|
|
78
78
|
raise typer.Exit(1)
|
|
@@ -21,11 +21,11 @@ def scan_command(
|
|
|
21
21
|
min_lines: Any = typer.Option(None, "--min-lines", help="Minimum block size (lines). Overrides config."),
|
|
22
22
|
min_similarity: Any = typer.Option(None, "--min-sim", help="Minimum similarity score (0.0-1.0). Overrides config."),
|
|
23
23
|
include_tests: bool = typer.Option(False, "--include-tests", help="Include test files in analysis."),
|
|
24
|
-
functions_only: bool = typer.Option(True, "--functions-only
|
|
24
|
+
functions_only: bool = typer.Option(True, "--functions-only", help="Only analyze function-level duplicates (default: enabled for speed)."),
|
|
25
25
|
parallel: bool = typer.Option(False, "--parallel", help="Use parallel processing for faster analysis."),
|
|
26
26
|
max_workers: Any = typer.Option(None, "--max-workers", help="Maximum number of parallel workers."),
|
|
27
27
|
incremental: bool = typer.Option(False, "--incremental", help="Use incremental scanning (cache-based)."),
|
|
28
|
-
memory_cache: bool = typer.Option(True, "--memory-cache
|
|
28
|
+
memory_cache: bool = typer.Option(True, "--memory-cache", help="Use memory cache for faster processing."),
|
|
29
29
|
max_cache_mb: int = typer.Option(512, "--max-cache-mb", help="Maximum memory cache size in MB."),
|
|
30
30
|
fuzzy: bool = typer.Option(False, "--fuzzy", help="Enable fuzzy similarity detection."),
|
|
31
31
|
fuzzy_threshold: float = typer.Option(0.8, "--fuzzy-threshold", help="Fuzzy similarity threshold (0.0-1.0)."),
|
|
@@ -150,8 +150,9 @@ def info_command() -> None:
|
|
|
150
150
|
# Check optional dependencies
|
|
151
151
|
deps = {
|
|
152
152
|
"tree-sitter": "tree_sitter",
|
|
153
|
-
"datasketch": "datasketch",
|
|
153
|
+
"datasketch": "datasketch",
|
|
154
154
|
"rapidfuzz": "rapidfuzz",
|
|
155
|
+
"pyyaml": "yaml",
|
|
155
156
|
}
|
|
156
157
|
|
|
157
158
|
typer.echo("\nOptional dependencies:")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: redup
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Code duplication analyzer and refactoring planner for LLMs
|
|
5
5
|
Author-email: Tom Sapletta <tom@sapletta.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -92,7 +92,7 @@ Dynamic: license-file
|
|
|
92
92
|
[](https://pypi.org/project/redup/)
|
|
93
93
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
94
94
|
[](https://python.org)
|
|
95
|
-
[](https://pypi.org/project/redup/)
|
|
96
96
|
|
|
97
97
|
reDUP scans codebases for duplicated functions, blocks, and structural patterns — then builds a prioritized refactoring map that LLMs can consume to eliminate redundancy systematically.
|
|
98
98
|
|
|
@@ -398,7 +398,7 @@ class TestFullRoundtrip:
|
|
|
398
398
|
assert tax["occurrences"] == 3
|
|
399
399
|
assert tax["saved_lines_potential"] > 0
|
|
400
400
|
|
|
401
|
-
files_in_frags = {f["file"] for f in tax["fragments"]}
|
|
401
|
+
files_in_frags = {Path(f["file"]).name for f in tax["fragments"]}
|
|
402
402
|
assert "billing.py" in files_in_frags
|
|
403
403
|
assert "shipping.py" in files_in_frags
|
|
404
404
|
assert "returns.py" in files_in_frags
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|