Class: Henitai::SubjectSelection

Inherits:
Object
  • Object
show all
Defined in:
lib/henitai/subject_selection.rb,
sig/henitai.rbs

Overview

Turns a list of source files into the subjects a run mutates, applying any CLI subject patterns.

With no patterns every resolved subject is kept. With patterns, each is applied independently and the results concatenated, so overlapping patterns can name the same subject twice — hence the de-duplication on [expression, source_file] rather than on object identity. Expression alone is not enough: the same expression can legitimately appear in two files.

Instance Method Summary collapse

Constructor Details

#initialize(subject_resolver:, patterns:) ⇒ SubjectSelection

Returns a new instance of SubjectSelection.

Parameters:

  • subject_resolver: (Object)
  • patterns: (Array[untyped], nil)


13
14
15
16
# File 'lib/henitai/subject_selection.rb', line 13

def initialize(subject_resolver:, patterns:)
  @subject_resolver = subject_resolver
  @patterns = patterns
end

Instance Method Details

#pattern_expressionsArray[String]

Returns:

  • (Array[String])


31
# File 'lib/henitai/subject_selection.rb', line 31

def pattern_expressions = Array(@patterns).map(&:expression)

#resolve(source_files) ⇒ Array[Subject]

Parameters:

  • (Array[String])

Returns:



18
19
20
21
22
23
# File 'lib/henitai/subject_selection.rb', line 18

def resolve(source_files)
  subjects = @subject_resolver.resolve_from_files(source_files)
  return subjects if pattern_expressions.empty?

  unique(pattern_expressions.flat_map { |expression| @subject_resolver.apply_pattern(subjects, expression) })
end

#unique(subjects) ⇒ Array[Subject]

Parameters:

Returns:



25
26
27
# File 'lib/henitai/subject_selection.rb', line 25

def unique(subjects)
  subjects.uniq { |subject| [subject.expression, subject.source_file] }
end