Class: Ace::Review::Molecules::SubjectExtractor

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/review/molecules/subject_extractor.rb

Overview

Parses review subjects and returns ace-bundle configuration Delegates actual content extraction to ace-bundle

Config Passthrough API

The primary API returns ace-bundle config hashes that ReviewManager passes directly to ace-bundle via user.context.md:

This avoids extracting content only to save it to a file and re-read it.

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ SubjectExtractor

Returns a new instance of SubjectExtractor.

Parameters:

  • options (Hash) (defaults to: {})

    Configuration options

Options Hash (options):

  • :taskflow_timeout (Integer)

    Timeout for ace-task subprocess (default: 10s)



30
31
32
# File 'lib/ace/review/molecules/subject_extractor.rb', line 30

def initialize(options = {})
  @taskflow_timeout = options[:taskflow_timeout] || TASKFLOW_TIMEOUT
end

Instance Method Details

#extract(subject_config) ⇒ String

Note:

Prefer parse_typed_subject_config or merge_typed_subject_configs for new code

Extract subject from configuration

Parameters:

  • subject_config (String, Hash)

    subject configuration

Returns:

  • (String)

    extracted subject content



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ace/review/molecules/subject_extractor.rb', line 38

def extract(subject_config)
  return "" unless subject_config

  case subject_config
  when String
    extract_from_string(subject_config)
  when Hash
    extract_from_hash(subject_config)
  else
    ""
  end
end

#merge_typed_subject_configs(subjects) ⇒ Hash?

Merge multiple subjects into unified ace-bundle config Does NOT extract content - returns merged config for direct use with ace-bundle Uses Config.merge() with :coerce_union strategy for consistent merge behavior

Parameters:

  • subjects (Array<String, Hash>)

    array of subject configurations

Returns:

  • (Hash, nil)

    merged ace-bundle config hash or nil if empty



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/ace/review/molecules/subject_extractor.rb', line 66

def merge_typed_subject_configs(subjects)
  return nil unless subjects.is_a?(Array) && subjects.any?

  # Use Config objects with :coerce_union strategy to progressively merge subjects
  # This enables future per-key merge strategies via _merge directive
  initial_config = Ace::Support::Config::Models::Config.new({}, merge_strategy: :coerce_union)

  merged_config = subjects.reduce(initial_config) do |acc, subject|
    config_hash = resolve_single_subject(subject)
    acc.merge(config_hash)
  end

  merged_config.empty? ? nil : merged_config.to_h
end

#parse_typed_subject_config(input) ⇒ Hash?

Parse typed subject string and return ace-bundle config Does NOT extract content - returns config for direct use with ace-bundle

Parameters:

  • input (String)

    typed subject like “pr:77”, “files:*.rb”, “diff:HEAD~3”

Returns:

  • (Hash, nil)

    ace-bundle config hash or nil if not a typed subject



55
56
57
58
59
# File 'lib/ace/review/molecules/subject_extractor.rb', line 55

def parse_typed_subject_config(input)
  return nil unless input.is_a?(String)

  parse_typed_subject(input)
end