From a6bd913b13a5a0fd0e2e730b3b6be63b5bb89e00 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 29 Jan 2026 15:42:17 +0000 Subject: [PATCH] Initial upload: gitignore-cli-generator v1.0.0 --- src/gitignore_cli/pattern_merger.py | 66 +++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/gitignore_cli/pattern_merger.py diff --git a/src/gitignore_cli/pattern_merger.py b/src/gitignore_cli/pattern_merger.py new file mode 100644 index 0000000..1f4ff39 --- /dev/null +++ b/src/gitignore_cli/pattern_merger.py @@ -0,0 +1,66 @@ +"""Pattern merger module for combining and deduplicating .gitignore patterns.""" + +from typing import List, Set + + +class PatternMerger: + """Merges multiple sets of patterns with deduplication.""" + + def __init__(self) -> None: + self._seen_patterns: Set[str] = set() + + def merge_patterns(self, patterns_list: List[str]) -> str: + """Merge multiple pattern strings into a single .gitignore content.""" + merged_lines: List[str] = [] + self._seen_patterns.clear() + + for patterns in patterns_list: + if patterns: + for line in patterns.splitlines(): + normalized = self._normalize_pattern(line) + if normalized and normalized not in self._seen_patterns: + self._seen_patterns.add(normalized) + merged_lines.append(line) + + return "\n".join(merged_lines) + "\n" + + def _normalize_pattern(self, pattern: str) -> str: + """Normalize a pattern for deduplication.""" + stripped = pattern.strip() + if not stripped: + return "" + if stripped.startswith("#"): + return "" + if stripped.startswith("!"): + return stripped + return stripped + + def deduplicate_patterns(self, patterns: str) -> str: + """Remove duplicate patterns from a single pattern string.""" + self._seen_patterns.clear() + unique_lines: List[str] = [] + + for line in patterns.splitlines(): + normalized = self._normalize_pattern(line) + if normalized and normalized not in self._seen_patterns: + self._seen_patterns.add(normalized) + unique_lines.append(line) + + return "\n".join(unique_lines) + "\n" + + def filter_comments(self, patterns: str) -> str: + """Filter out comment lines from patterns.""" + lines = [line for line in patterns.splitlines() if not line.strip().startswith("#")] + return "\n".join(lines) + "\n" + + +def merge_templates(patterns_list: List[str]) -> str: + """Convenience function to merge multiple pattern strings.""" + merger = PatternMerger() + return merger.merge_patterns(patterns_list) + + +def deduplicate_patterns(patterns: str) -> str: + """Convenience function to deduplicate patterns.""" + merger = PatternMerger() + return merger.deduplicate_patterns(patterns)