Class: Ace::Bundle::Molecules::BundleMerger

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/bundle/molecules/bundle_merger.rb

Overview

BundleMerger merges multiple bundle results into a single combined result

Instance Method Summary collapse

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