Class: Oscal::Assembly

Inherits:
Object
  • Object
show all
Includes:
ParsingFunctions, ParsingLogger
Defined in:
lib/oscal/assembly.rb

Direct Known Subclasses

Oscal::AssessmentPlan::AssessmentPlan, Oscal::AssessmentPlan::ImportSSP, Oscal::AssessmentPlan::ReviewedControls, Oscal::AssessmentResult::Activity, Oscal::AssessmentResult::AssessmentAssets, Oscal::AssessmentResult::AssessmentPlatform, Oscal::AssessmentResult::AssessmentResult, Oscal::AssessmentResult::AssessmentTask, Oscal::AssessmentResult::AssociatedActivity, Oscal::AssessmentResult::AssociatedRisk, Oscal::AssessmentResult::Attestation, Oscal::AssessmentResult::Attestations, Oscal::AssessmentResult::Component, Oscal::AssessmentResult::ControlObjectiveSelection, Oscal::AssessmentResult::ControlSelection, Oscal::AssessmentResult::Entry, Oscal::AssessmentResult::ExcludeObjective, Oscal::AssessmentResult::Finding, Oscal::AssessmentResult::ImportAP, Oscal::AssessmentResult::IncludeAll, Oscal::AssessmentResult::IncludeControl, Oscal::AssessmentResult::IncludeObjective, Oscal::AssessmentResult::InventoryItem, Oscal::AssessmentResult::LocalDefinitions, Oscal::AssessmentResult::ObjectivesAndMethods, Oscal::AssessmentResult::Observation, Oscal::AssessmentResult::RelatedControls, Oscal::AssessmentResult::RelatedObservation, Oscal::AssessmentResult::ResponsibleRole, Oscal::AssessmentResult::Result, Oscal::AssessmentResult::ReviewedControls, Oscal::AssessmentResult::Risk, Oscal::AssessmentResult::StatusAssembly, Oscal::AssessmentResult::Step, Oscal::AssessmentResult::Subject, Oscal::AssessmentResult::Target, Oscal::AssessmentResult::Task, Oscal::AssessmentResult::User

Instance Method Summary collapse

Methods included from ParsingLogger

#get_logger, logger=

Methods included from ParsingFunctions

#str2sym, #sym2str

Constructor Details

#initialize(input) ⇒ Assembly

Returns a new instance of Assembly.



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/oscal/assembly.rb', line 104

def initialize(input)
  @logger = get_logger
  @logger.debug("#{self.class}.new called with #{input.to_s[0, 25]}")

  # covert String:String to Symbol:String
  sym_hash = check_and_normalize_input(input)

  # Make sure all required and no extra keys are provided
  validate_input(sym_hash)

  # Attempt to convert each value to it's registered type
  sym_hash.each do |key, value|
    method("#{key}=".to_sym).call(validate_content(key, value))
  end
end

Instance Method Details

#allowed_attributesObject



28
29
30
31
32
33
34
# File 'lib/oscal/assembly.rb', line 28

def allowed_attributes
  if self.class.constants.include?(:OPTIONAL)
    mandatory_attributes + self.class::OPTIONAL
  else
    mandatory_attributes
  end
end

#check_and_normalize_input(input) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/oscal/assembly.rb', line 55

def check_and_normalize_input(input)
  @logger.debug("Checking to see if input is a Hash")
  unless input.is_a? Hash
    raise Oscal::InvalidTypeError,
          "Assemblies can only be created from Hash types"
  end
  @logger.debug("Assembly is hash with keys #{input.keys}")

  @logger.debug("Attempting to transform strings to symbols.")
  # Transform the keys from Strings to Symbols
  input.transform_keys { |key| str2sym(key) }
end

#extra_values?(allowed, provided) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
86
87
88
89
90
# File 'lib/oscal/assembly.rb', line 83

def extra_values?(allowed, provided)
  @logger.debug("Checking allowed values: #{allowed}")
  extra_values = provided.keys - provided.keys.intersection(allowed)
  if extra_values.length.positive?
    raise Oscal::InvalidTypeError,
          "Extra attributes provided #{extra_values}"
  end
end

#mandatory_attributesObject



20
21
22
23
24
25
26
# File 'lib/oscal/assembly.rb', line 20

def mandatory_attributes
  if self.class.constants.include?(:MANDATORY)
    self.class::MANDATORY
  else
    []
  end
end

#missing_values?(mandatory, provided) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
77
78
79
80
81
# File 'lib/oscal/assembly.rb', line 74

def missing_values?(mandatory, provided)
  @logger.debug("Checking mandatory values: #{mandatory}")
  missing_values = mandatory - provided.keys.intersection(mandatory)
  if missing_values.length.positive?
    raise Oscal::InvalidTypeError,
          "Missing mandatory values: #{missing_values}"
  end
end

#to_hObject



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/oscal/assembly.rb', line 40

def to_h
  allowed_attributes.each_with_object({}) do |var, hash|
    attr_value = method(var).call
    hash[sym2str(var)] = if attr_value == nil
                           next
                         elsif attr_value.class <= OscalArray
                           attr_value.each(&:to_h)
                         elsif attr_value.class <= OscalDatatype
                           attr_value
                         else
                           attr_value.to_h
                         end
  end
end

#to_json(*args) ⇒ Object



36
37
38
# File 'lib/oscal/assembly.rb', line 36

def to_json(*args)
  to_h.to_json(*args)
end

#validate_content(key, value) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/oscal/assembly.rb', line 92

def validate_content(key, value)
  @logger.info("Validating #{value}")
  expected_class = Oscal::get_type_of_attribute(key)
  @logger.debug("Attempting to instiate #{key} as #{expected_class}")
  instantiated = expected_class.new(value)
rescue Oscal::InvalidTypeError
  raise Oscal::InvalidTypeError,
        "Value #{value.to_s[0, 25]} not a valid #{key}"
else
  instantiated # Return the valid class
end

#validate_input(input) ⇒ Object



68
69
70
71
72
# File 'lib/oscal/assembly.rb', line 68

def validate_input(input)
  @logger.debug("Checking mandatory and optional values.")
  missing_values?(mandatory_attributes, input)
  extra_values?(allowed_attributes, input)
end