Class: Ace::Git::Molecules::DiffFilter
- Inherits:
-
Object
- Object
- Ace::Git::Molecules::DiffFilter
- Defined in:
- lib/ace/git/molecules/diff_filter.rb
Overview
Apply filtering to diff output based on configuration Migrated from ace-git-diff
Class Method Summary collapse
-
.filter(diff, config) ⇒ String
Filter diff content based on configuration.
-
.filter_by_includes(diff, include_patterns) ⇒ String
Apply include patterns (only show matching files).
-
.filter_by_patterns(diff, exclude_patterns) ⇒ String
Apply only path-based filtering (no size limits).
-
.stats(original, filtered) ⇒ Hash
Get filtering statistics.
-
.truncate(diff, max_lines) ⇒ String
Truncate diff to maximum number of lines.
Class Method Details
.filter(diff, config) ⇒ String
Filter diff content based on configuration
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/ace/git/molecules/diff_filter.rb', line 14 def filter(diff, config) return "" if diff.nil? || diff.empty? return diff if config.exclude_patterns.empty? # Convert glob patterns to regex regex_patterns = Atoms::PatternFilter.glob_to_regex(config.exclude_patterns) # Apply pattern filtering filtered = Atoms::PatternFilter.filter_diff_by_patterns(diff, regex_patterns) # Check if exceeds max lines if config.max_lines && Atoms::DiffParser.exceeds_limit?(filtered, config.max_lines) truncate(filtered, config.max_lines) else filtered end end |
.filter_by_includes(diff, include_patterns) ⇒ String
Apply include patterns (only show matching files)
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/ace/git/molecules/diff_filter.rb', line 47 def filter_by_includes(diff, include_patterns) return diff if diff.nil? || diff.empty? || include_patterns.nil? || include_patterns.empty? lines = diff.split("\n") filtered_lines = [] include_current_file = false lines.each do |line| # Check if this is a file header if Atoms::PatternFilter.file_header?(line) file_path = Atoms::PatternFilter.extract_file_path(line) # Include file if it matches any include pattern include_current_file = Atoms::PatternFilter.matches_include?(file_path, include_patterns) filtered_lines << line if include_current_file elsif include_current_file filtered_lines << line end end filtered_lines.join("\n") end |
.filter_by_patterns(diff, exclude_patterns) ⇒ String
Apply only path-based filtering (no size limits)
36 37 38 39 40 41 |
# File 'lib/ace/git/molecules/diff_filter.rb', line 36 def filter_by_patterns(diff, exclude_patterns) return diff if diff.nil? || diff.empty? || exclude_patterns.empty? regex_patterns = Atoms::PatternFilter.glob_to_regex(exclude_patterns) Atoms::PatternFilter.filter_diff_by_patterns(diff, regex_patterns) end |
.stats(original, filtered) ⇒ Hash
Get filtering statistics
87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/ace/git/molecules/diff_filter.rb', line 87 def stats(original, filtered) original_stats = Atoms::DiffParser.count_changes(original) filtered_stats = Atoms::DiffParser.count_changes(filtered) { original: original_stats, filtered: filtered_stats, files_removed: original_stats[:files] - filtered_stats[:files], lines_removed: Atoms::DiffParser.count_lines(original) - Atoms::DiffParser.count_lines(filtered) } end |
.truncate(diff, max_lines) ⇒ String
Truncate diff to maximum number of lines
73 74 75 76 77 78 79 80 81 |
# File 'lib/ace/git/molecules/diff_filter.rb', line 73 def truncate(diff, max_lines) return diff if diff.nil? || diff.empty? lines = diff.split("\n") return diff if lines.length <= max_lines truncated = lines[0...max_lines].join("\n") truncated + "\n\n... (diff truncated at #{max_lines} lines)" end |