Class: Ace::Bundle::Molecules::BundleMerger
- Inherits:
-
Object
- Object
- Ace::Bundle::Molecules::BundleMerger
- Defined in:
- lib/ace/bundle/molecules/bundle_merger.rb
Overview
BundleMerger merges multiple bundle results into a single combined result
Instance Method Summary collapse
-
#merge_bundles(bundles) ⇒ Object
Merge multiple bundle results into one.
-
#merge_with_attribution(bundles, source_key = nil) ⇒ Object
Merge data structures with source attribution.
-
#resolve_output_path(presets, command_output = nil) ⇒ Object
Determine output path from multiple presets.
Instance Method Details
#merge_bundles(bundles) ⇒ Object
Merge multiple bundle results into one
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/ace/bundle/molecules/bundle_merger.rb', line 11 def merge_bundles(bundles) return empty_merge_result if bundles.nil? || bundles.empty? return bundles.first if bundles.size == 1 { success: true, files: merge_files(bundles), commands: merge_commands(bundles), errors: merge_errors(bundles), sources: extract_sources(bundles), metadata: (bundles), merged: true, total_bundles: bundles.size, total_files: bundles.sum { |c| c[:total_files] || c[:files]&.size || 0 }, total_commands: bundles.sum { |c| c[:total_commands] || c[:commands]&.size || 0 }, total_errors: bundles.sum { |c| c[:total_errors] || c[:errors]&.size || 0 }, total_size: bundles.sum { |c| c[:total_size] || 0 } } end |
#merge_with_attribution(bundles, source_key = nil) ⇒ Object
Merge data structures with source attribution
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/ace/bundle/molecules/bundle_merger.rb', line 50 def merge_with_attribution(bundles, source_key = nil) merged_data = { files: [], commands: [], errors: [], metadata: {} } bundles.each do |bundle| source = extract_source(bundle, source_key) # Add files with source if bundle[:files] bundle[:files].each do |file| file_with_source = file.dup file_with_source[:source] = source if source merged_data[:files] << file_with_source end end # Add commands with source if bundle[:commands] bundle[:commands].each do |cmd| cmd_with_source = cmd.dup cmd_with_source[:source] = source if source merged_data[:commands] << cmd_with_source end end # Collect errors if bundle[:errors] merged_data[:errors].concat(bundle[:errors]) end # Merge metadata if bundle[:metadata] merged_data[:metadata] = deep_merge(merged_data[:metadata], bundle[:metadata]) end end merged_data end |
#resolve_output_path(presets, command_output = nil) ⇒ Object
Determine output path from multiple presets
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/ace/bundle/molecules/bundle_merger.rb', line 32 def resolve_output_path(presets, command_output = nil) # Command-line flag has highest priority return command_output if command_output # Extract output paths from presets output_paths = presets.map { |p| p[:output] }.compact # If any preset wants stdout (no output), use stdout return nil if output_paths.size < presets.size # If all presets have the same output path, use it return output_paths.first if output_paths.uniq.size == 1 # Different output paths = conflict, default to stdout nil end |