Class: Inferno::Repositories::Requirements

Inherits:
InMemoryRepository show all
Defined in:
lib/inferno/repositories/requirements.rb

Overview

Repository that deals with persistence for the Requirement entity.

Instance Method Summary collapse

Methods inherited from InMemoryRepository

all, #exists?, #find, #insert, #remove

Instance Method Details

#add_referenced_requirement_set_requirements(requirements_to_process, requirement_sets, processed_requirements = []) ⇒ Object

rubocop:disable Metrics/CyclomaticComplexity



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/inferno/repositories/requirements.rb', line 87

def add_referenced_requirement_set_requirements( # rubocop:disable Metrics/CyclomaticComplexity
  requirements_to_process,
  requirement_sets,
  processed_requirements = []
)
  return processed_requirements if requirements_to_process.blank?

  referenced_requirement_sets = requirement_sets.select(&:referenced?)

  referenced_requirement_ids =
    requirements_to_process
      .flat_map(&:sub_requirements)
      .select do |requirement_id|
        referenced_requirement_sets.any? do |set|
          requirement_id.start_with?("#{set.identifier}@") && (find(requirement_id).actor == set.actor)
        end
      end

  new_requirements =
    referenced_requirement_ids.map { |id| find(id) } - requirements_to_process - processed_requirements

  add_referenced_requirement_set_requirements(
    new_requirements,
    referenced_requirement_sets,
    (processed_requirements + requirements_to_process).uniq
  )
end

#complete_requirement_set_requirements(requirement_sets) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/inferno/repositories/requirements.rb', line 68

def complete_requirement_set_requirements(requirement_sets)
  requirement_sets.select(&:complete?)
    .flat_map do |requirement_set|
      all.select do |requirement|
        requirement.requirement_set == requirement_set.identifier && requirement.actor == requirement_set.actor
      end
    end
end

#filter_requirements_by_ids(ids) ⇒ Object



41
42
43
# File 'lib/inferno/repositories/requirements.rb', line 41

def filter_requirements_by_ids(ids)
  all.select { |requirement| ids.include?(requirement.id) }
end

#filtered_requirement_set_requirements(requirement_sets) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/inferno/repositories/requirements.rb', line 77

def filtered_requirement_set_requirements(requirement_sets)
  requirement_sets.select(&:filtered?)
    .flat_map do |requirement_set|
      requirement_set
        .expand_requirement_ids
        .map { |requirement_id| find(requirement_id) }
        .select { |requirement| requirement.actor == requirement_set.actor }
    end
end

#insert_from_file(path) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/inferno/repositories/requirements.rb', line 9

def insert_from_file(path)
  result = []

  CSV.foreach(path, headers: true, header_converters: :symbol) do |row|
    req_set = row[:req_set]
    id = row[:id]
    sub_requirements_field = row[:subrequirements]

    combined_id = "#{req_set}@#{id}"

    # Processing sub requirements: e.g. "170.315(g)(31)_hti-2-proposal@5,17,23,26,27,32,35,38-41"
    sub_requirements = Inferno::Entities::Requirement.expand_requirement_ids(sub_requirements_field)

    result << {
      requirement_set: req_set,
      id: combined_id,
      url: row[:url],
      requirement: row[:requirement],
      conformance: row[:conformance],
      actor: row[:actor],
      sub_requirements: sub_requirements,
      conditionality: row[:conditionality]&.downcase
    }
  end

  result.each do |raw_req|
    requirement = Entities::Requirement.new(raw_req)

    insert(requirement)
  end
end

#requirements_for_suite(test_suite_id, test_session_id = nil) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/inferno/repositories/requirements.rb', line 45

def requirements_for_suite(test_suite_id, test_session_id = nil)
  test_suite = Inferno::Repositories::TestSuites.new.find(test_suite_id)
  selected_suite_options =
    if test_session_id.present?
      Inferno::Repositories::TestSessions.new.find(test_session_id).suite_options
    else
      []
    end

  requirement_sets =
    test_suite
      .requirement_sets
      .select do |set|
        set.suite_options.all? { |set_option| selected_suite_options.include? set_option }
      end

  requirements =
    complete_requirement_set_requirements(requirement_sets) +
    filtered_requirement_set_requirements(requirement_sets)

  add_referenced_requirement_set_requirements(requirements, requirement_sets).uniq
end