oscal 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/.docker/Dockerfile +19 -0
  3. data/.docker/Makefile +43 -0
  4. data/.docker/docker-compose.yml +14 -0
  5. data/.docker/readme.md +61 -0
  6. data/.github/workflows/rake.yml +15 -0
  7. data/.github/workflows/release.yml +24 -0
  8. data/.gitignore +13 -0
  9. data/.gitmodules +3 -0
  10. data/.hound.yml +5 -0
  11. data/.rspec +0 -1
  12. data/.rubocop.yml +10 -0
  13. data/.ruby-version +1 -0
  14. data/Gemfile +4 -0
  15. data/LICENSE +25 -0
  16. data/Makefile +1 -0
  17. data/README.adoc +66 -0
  18. data/Rakefile +13 -6
  19. data/bin/console +30 -0
  20. data/bin/rspec +27 -0
  21. data/bin/setup +8 -0
  22. data/docker-compose.yml +1 -0
  23. data/exe/convert2oscalyaml.rb +560 -0
  24. data/lib/oscal/add.rb +26 -0
  25. data/lib/oscal/address.rb +22 -0
  26. data/lib/oscal/address_line.rb +11 -0
  27. data/lib/oscal/alter.rb +22 -0
  28. data/lib/oscal/assembly.rb +119 -0
  29. data/lib/oscal/assessment_plan.rb +28 -0
  30. data/lib/oscal/assessment_result.rb +230 -0
  31. data/lib/oscal/attribute_type_hash.rb +80 -0
  32. data/lib/oscal/back_matter.rb +20 -0
  33. data/lib/oscal/base64_object.rb +11 -0
  34. data/lib/oscal/base_class.rb +50 -0
  35. data/lib/oscal/catalog.rb +51 -10
  36. data/lib/oscal/choice.rb +11 -0
  37. data/lib/oscal/citation.rb +22 -0
  38. data/lib/oscal/combine.rb +11 -0
  39. data/lib/oscal/common_utils.rb +35 -0
  40. data/lib/oscal/constraint.rb +20 -0
  41. data/lib/oscal/control.rb +20 -30
  42. data/lib/oscal/custom.rb +22 -0
  43. data/lib/oscal/datatypes.rb +50 -0
  44. data/lib/oscal/document_id.rb +11 -0
  45. data/lib/oscal/email_address.rb +11 -0
  46. data/lib/oscal/exclude_control.rb +22 -0
  47. data/lib/oscal/external_id.rb +11 -0
  48. data/lib/oscal/group.rb +26 -34
  49. data/lib/oscal/guideline.rb +11 -0
  50. data/lib/oscal/hash_object.rb +11 -0
  51. data/lib/oscal/import_object.rb +22 -0
  52. data/lib/oscal/include_control.rb +22 -0
  53. data/lib/oscal/insert_control.rb +22 -0
  54. data/lib/oscal/link.rb +11 -0
  55. data/lib/oscal/list.rb +160 -0
  56. data/lib/oscal/location.rb +31 -0
  57. data/lib/oscal/location_uuid.rb +11 -0
  58. data/lib/oscal/logger.rb +8 -0
  59. data/lib/oscal/matching.rb +11 -0
  60. data/lib/oscal/member_of_organization.rb +11 -0
  61. data/lib/oscal/merge.rb +20 -0
  62. data/lib/oscal/metadata_block.rb +28 -13
  63. data/lib/oscal/modify.rb +22 -0
  64. data/lib/oscal/parameter.rb +22 -19
  65. data/lib/oscal/parsing_functions.rb +19 -0
  66. data/lib/oscal/part.rb +14 -22
  67. data/lib/oscal/party.rb +36 -0
  68. data/lib/oscal/party_uuid.rb +11 -0
  69. data/lib/oscal/profile.rb +33 -7
  70. data/lib/oscal/property.rb +4 -25
  71. data/lib/oscal/remove.rb +11 -0
  72. data/lib/oscal/resource.rb +29 -0
  73. data/lib/oscal/responsible_party.rb +24 -0
  74. data/lib/oscal/revision.rb +23 -0
  75. data/lib/oscal/rlink.rb +20 -0
  76. data/lib/oscal/role.rb +22 -0
  77. data/lib/oscal/select.rb +20 -0
  78. data/lib/oscal/serializer.rb +17 -4
  79. data/lib/oscal/set_parameter.rb +31 -0
  80. data/lib/oscal/telephone_number.rb +11 -0
  81. data/lib/oscal/test.rb +11 -0
  82. data/lib/oscal/url.rb +11 -0
  83. data/lib/oscal/value.rb +37 -0
  84. data/lib/oscal/version.rb +1 -1
  85. data/lib/oscal/with_id.rb +40 -0
  86. data/lib/oscal.rb +1 -13
  87. data/oscal.gemspec +9 -11
  88. data/spec/oscal/catalog_spec.rb +40 -0
  89. data/spec/oscal_spec.rb +7 -0
  90. data/spec/sample_inputs/import-ap.json +4 -0
  91. data/spec/spec_helper.rb +15 -0
  92. metadata +84 -10
  93. data/lib/oscal/component.rb +0 -14
  94. data/lib/oscal/prose.rb +0 -13
  95. data/lib/oscal/statement.rb +0 -12
@@ -0,0 +1,35 @@
1
+ module Oscal
2
+ module CommonUtils
3
+ def find_object_by_id(id, obj = self, attribute_name = :id)
4
+ if obj.respond_to?(attribute_name) && obj.send(attribute_name) == id
5
+ return obj
6
+ end
7
+
8
+ res = nil
9
+
10
+ obj.instance_variables.each do |ins_var|
11
+ val = obj.send(ins_var.to_s.delete("@").to_sym)
12
+
13
+ if val.is_a? Array
14
+ val.each do |v|
15
+ res = find_object_by_id(id, v, attribute_name.to_sym)
16
+ break unless res.nil?
17
+ end
18
+ else
19
+ res = find_object_by_id(id, val, attribute_name.to_sym)
20
+ end
21
+
22
+ break unless res.nil?
23
+ end
24
+
25
+ res
26
+ end
27
+
28
+ def self.included(klass)
29
+ klass.extend(ClassMethods)
30
+ end
31
+
32
+ module ClassMethods
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Constraint < Oscal::BaseClass
5
+ KEY = %i(description tests)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "test"
14
+ Test.wrap(val)
15
+ else
16
+ val
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/oscal/control.rb CHANGED
@@ -1,37 +1,27 @@
1
- module Oscal
2
- class Control
3
- KEY = %i(id title params props parts)
4
- attr_accessor *KEY
5
-
6
- def self.wrap(obj)
7
- return obj if obj.is_a? Control
8
- return Control.new(obj) unless obj.is_a? Array
9
-
10
- obj.map do |x|
11
- Control.wrap(x)
12
- end
13
- end
1
+ require_relative "base_class"
14
2
 
15
- def initialize(options={})
16
- options.each_pair.each do |key,val|
17
- key_name = key.gsub('-','_')
3
+ module Oscal
4
+ class Control < Oscal::BaseClass
5
+ KEY = %i(id klass title params props links parts controls)
18
6
 
19
- unless KEY.include?(key_name.to_sym)
20
- raise UnknownAttributeError.new("Unknown key `#{key}` in Control")
21
- end
7
+ attr_accessor *KEY
22
8
 
23
- val = case key_name
24
- when 'params'
25
- Parameter.wrap(val)
26
- when 'props'
27
- Property.wrap(val)
28
- when 'parts'
29
- Part.wrap(val)
30
- else
31
- val
32
- end
9
+ attr_serializable *KEY
33
10
 
34
- self.send("#{key_name}=", val)
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "params"
14
+ Parameter.wrap(val)
15
+ when "props"
16
+ Property.wrap(val)
17
+ when "links"
18
+ Link.wrap(val)
19
+ when "parts"
20
+ Part.wrap(val)
21
+ when "controls"
22
+ Control.wrap(val)
23
+ else
24
+ val
35
25
  end
36
26
  end
37
27
  end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Custom < Oscal::BaseClass
5
+ KEY = %i(groups insert_controls)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "groups"
14
+ Group.wrap(val)
15
+ when "insert_controls"
16
+ InsertControl.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,50 @@
1
+ module Oscal
2
+ class OscalDatatype < String
3
+ include ParsingLogger
4
+
5
+ def validate(value)
6
+ @logger.debug("validating against pattern #{self.class::PATTERN}")
7
+ unless self.class::PATTERN.match?(value)
8
+ raise Oscal::InvalidTypeError,
9
+ "#{value.to_s[0, 25]} does not match Pattern for #{self.class}"
10
+ end
11
+ end
12
+
13
+ def initialize(input)
14
+ super
15
+ @logger = get_logger
16
+ @logger.debug("#{self.class}.new called with #{input.to_s[0, 25]}")
17
+ validate(input) # Will raise an Error if invalid
18
+ @logger.debug("validation successful.")
19
+ end
20
+
21
+ def to_s
22
+ @value
23
+ end
24
+ end
25
+
26
+ class DateTimeWithTimezoneDataType < OscalDatatype
27
+ PATTERN = /(((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)|(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))|(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))|(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30)))T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|(-((0[0-9]|1[0-2]):00|0[39]:30)|\+((0[0-9]|1[0-4]):00|(0[34569]|10):30|(0[58]|12):45)))/
28
+ end
29
+
30
+ class MarkupMultilineDataType < OscalDatatype
31
+ # Note that there are complex rules for MarkupMultilineDataType that we are ignoring
32
+ PATTERN = /.*/
33
+ end
34
+
35
+ class StringDataType < OscalDatatype
36
+ PATTERN = /\S(.*\S)?/
37
+ end
38
+
39
+ class TokenDataType < OscalDatatype
40
+ PATTERN = /(\p{L}|_)(\p{L}|\p{N}|[.\-_])*/
41
+ end
42
+
43
+ class UriReference < OscalDatatype
44
+ PATTERN = %r{^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?}
45
+ end
46
+
47
+ class Uuid < OscalDatatype
48
+ PATTERN = /^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[45][0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}$/
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class DocumentId < Oscal::BaseClass
5
+ KEY = %i(schema identifier)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class EmailAddress < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class ExcludeControl < Oscal::BaseClass
5
+ KEY = %i(with_child_controls with_ids matching)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "with_ids"
14
+ WithId.wrap(val)
15
+ when "matching"
16
+ Matching.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class ExternalId < Oscal::BaseClass
5
+ KEY = %i(schema id)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
data/lib/oscal/group.rb CHANGED
@@ -1,41 +1,33 @@
1
- module Oscal
2
- class Group
3
- KEYS = %i(id class title controls props parts groups)
4
- attr_accessor *KEYS
5
-
6
- def self.wrap(obj)
7
- return obj if obj.is_a? Group
8
- return Group.new(obj) unless obj.is_a? Array
1
+ require_relative "base_class"
9
2
 
10
- obj.map do |x|
11
- Group.wrap(x)
12
- end
13
- end
14
-
15
- def initialize(options={})
16
- options.each_pair.each do |key,val|
17
- key_name = key.gsub('-','_')
3
+ module Oscal
4
+ class Group < Oscal::BaseClass
5
+ KEY = %i(id klass title params props links parts groups
6
+ controls insert_controls)
18
7
 
19
- unless KEYS.include?(key_name.to_sym)
20
- raise UnknownAttributeError.new("Unknown key `#{key}` in Group")
21
- end
8
+ attr_accessor *KEY
22
9
 
23
- val = case key_name
24
- when 'groups'
25
- Group.wrap(val)
26
- when 'params'
27
- Parameter.wrap(val)
28
- when 'props'
29
- Property.wrap(val)
30
- when 'parts'
31
- Part.wrap(val)
32
- else
33
- val
34
- end
10
+ attr_serializable *KEY
35
11
 
36
- self.send("#{key_name}=", val)
12
+ def set_value(key_name, val)
13
+ case key_name
14
+ when "params"
15
+ Parameter.wrap(val)
16
+ when "props"
17
+ Property.wrap(val)
18
+ when "links"
19
+ Link.wrap(val)
20
+ when "parts"
21
+ Part.wrap(val)
22
+ when "groups"
23
+ Group.wrap(val)
24
+ when "controls"
25
+ Control.wrap(val)
26
+ when "insert_controls"
27
+ InsertControl.wrap(val)
28
+ else
29
+ val
37
30
  end
38
31
  end
39
-
40
32
  end
41
- end
33
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Guideline < Oscal::BaseClass
5
+ KEY = %i(prose)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class HashObject < Oscal::BaseClass
5
+ KEY = %i(algorithm value)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class ImportObject < Oscal::BaseClass
5
+ KEY = %i(href include_all include_controls exclude_controls)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "include_controls"
14
+ IncludeControl.wrap(val)
15
+ when "exclude_controls"
16
+ ExcludeControl.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class IncludeControl < Oscal::BaseClass
5
+ KEY = %i(with_child_controls with_ids matching)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "with_ids"
14
+ WithId.wrap(val)
15
+ when "matching"
16
+ Matching.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class InsertControl < Oscal::BaseClass
5
+ KEY = %i(order include_all include_controls exclude_controls)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "include_controls"
14
+ IncludeControl.wrap(val)
15
+ when "exclude_controls"
16
+ ExcludeControls.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
data/lib/oscal/link.rb ADDED
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Link < Oscal::BaseClass
5
+ KEY = %i(href rel media_type text)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
data/lib/oscal/list.rb ADDED
@@ -0,0 +1,160 @@
1
+ require_relative("link")
2
+ require_relative("property")
3
+ require_relative("logger")
4
+
5
+ module Oscal
6
+ class OscalArray < Array
7
+ include ParsingLogger
8
+
9
+ def validate_member_type(input)
10
+ @logger.debug("Validating array members are #{self.class::MEMBER_TYPE}")
11
+ input.map do |item|
12
+ self.class::MEMBER_TYPE.new(item)
13
+ end
14
+ end
15
+
16
+ def initialize(input)
17
+ super
18
+ @logger = get_logger
19
+ @logger.debug("#{self.class}.new called with #{input.to_s[0, 25]}")
20
+ validate_member_type(input)
21
+ end
22
+ end
23
+
24
+ # These classes define generic arrays of basic DataTypes,
25
+ # They appear in several different places in the Oscal specs
26
+ # and can be subclassed with a different name
27
+ class StringDataTypeArray < Oscal::OscalArray
28
+ MEMBER_TYPE = StringDataType
29
+ end
30
+
31
+ class TokenDataTypeArray < Oscal::OscalArray
32
+ MEMBER_TYPE = TokenDataType
33
+ end
34
+
35
+ class UuidArray < Oscal::OscalArray
36
+ MEMBER_TYPE = Uuid
37
+ end
38
+
39
+ module AssessmentResult
40
+ class ActivityArray < Oscal::OscalArray
41
+ MEMBER_TYPE = Activity
42
+ end
43
+
44
+ class AssessmentPlatformArray < Oscal::OscalArray
45
+ MEMBER_TYPE = AssessmentPlatform
46
+ end
47
+
48
+ class AssessmentTaskArray < Oscal::OscalArray
49
+ MEMBER_TYPE = AssessmentTask
50
+ end
51
+
52
+ class AssociatedActivityArray < Oscal::OscalArray
53
+ MEMBER_TYPE = AssociatedActivity
54
+ end
55
+
56
+ class AttestationArray < Oscal::OscalArray
57
+ MEMBER_TYPE = Attestation
58
+ end
59
+
60
+ class ComponentArray < Oscal::OscalArray
61
+ MEMBER_TYPE = Component
62
+ end
63
+
64
+ class ControlObjectiveSelectionArray < Oscal::OscalArray
65
+ MEMBER_TYPE = ControlObjectiveSelection
66
+ end
67
+
68
+ class ControlSelectionArray < Oscal::OscalArray
69
+ MEMBER_TYPE = ControlSelection
70
+ end
71
+
72
+ class EntryArray < Oscal::OscalArray
73
+ MEMBER_TYPE = Entry
74
+ end
75
+
76
+ class ExcludeControlArray < Oscal::OscalArray
77
+ MEMBER_TYPE = ExcludeControl
78
+ end
79
+
80
+ class ExcludeObjectiveArray < Oscal::OscalArray
81
+ MEMBER_TYPE = ExcludeObjective
82
+ end
83
+
84
+ class FindingArray < Oscal::OscalArray
85
+ MEMBER_TYPE = Finding
86
+ end
87
+
88
+ class IncludeControlArray < Oscal::OscalArray
89
+ MEMBER_TYPE = IncludeControl
90
+ end
91
+
92
+ class InventoryItemArray < Oscal::OscalArray
93
+ MEMBER_TYPE = InventoryItem
94
+ end
95
+
96
+ class LinkArray < Oscal::OscalArray
97
+ MEMBER_TYPE = Oscal::Link
98
+ end
99
+
100
+ class MethodArray < StringDataTypeArray
101
+ end
102
+
103
+ class ObjectivesAndMethodsArray < Oscal::OscalArray
104
+ MEMBER_TYPE = ObjectivesAndMethods
105
+ end
106
+
107
+ class ObservationArray < Oscal::OscalArray
108
+ MEMBER_TYPE = Observation
109
+ end
110
+
111
+ class PartArray < Oscal::OscalArray
112
+ MEMBER_TYPE = Link
113
+ end
114
+
115
+ class PartyUuidArray < UuidArray
116
+ end
117
+
118
+ class PropArray < Oscal::OscalArray
119
+ MEMBER_TYPE = Property
120
+ end
121
+
122
+ class RelatedObservationArray < Oscal::OscalArray
123
+ MEMBER_TYPE = RelatedObservation
124
+ end
125
+
126
+ class RelatedRiskArray < Oscal::OscalArray
127
+ MEMBER_TYPE = AssociatedRisk
128
+ end
129
+
130
+ class ResponsibleRoleArray < Oscal::OscalArray
131
+ MEMBER_TYPE = ResponsibleRole
132
+ end
133
+
134
+ class ResultArray < Oscal::OscalArray
135
+ MEMBER_TYPE = Result
136
+ end
137
+
138
+ class RiskArray < Oscal::OscalArray
139
+ MEMBER_TYPE = Risk
140
+ end
141
+
142
+ class StatementIdArray < TokenDataTypeArray
143
+ end
144
+
145
+ class StepArray < Oscal::OscalArray
146
+ MEMBER_TYPE = Step
147
+ end
148
+
149
+ class SubjectArray < Oscal::OscalArray
150
+ MEMBER_TYPE = Subject
151
+ end
152
+
153
+ class TypeArray < TokenDataTypeArray
154
+ end
155
+
156
+ class UserArray < Oscal::OscalArray
157
+ MEMBER_TYPE = User
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Location < Oscal::BaseClass
5
+ KEY = %i(uuid title address email_addresses telephone_numbers urls
6
+ props links remakrs)
7
+
8
+ attr_accessor *KEY
9
+
10
+ attr_serializable *KEY
11
+
12
+ def set_value(key_name, val)
13
+ case key_name
14
+ when "address"
15
+ Address.wrap(val)
16
+ when "email_addresses"
17
+ EmailAddress.wrap(val)
18
+ when "telephone_numbers"
19
+ TelephoneNumber.wrap(val)
20
+ when "urls"
21
+ Url.wrap(val)
22
+ when "props"
23
+ Property.wrap(val)
24
+ when "links"
25
+ Link.wrap(val)
26
+ else
27
+ val
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class LocationUuid < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module Oscal
2
+ module ParsingLogger
3
+ require "logger"
4
+ def get_logger
5
+ Logger.new($stdout)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Matching < Oscal::BaseClass
5
+ KEY = %i(pattern)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class MemberOfOrganization < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Merge < Oscal::BaseClass
5
+ KEY = %i(combine flat as_is custom)
6
+
7
+ attr_accessor *KEY
8
+
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when "custom"
14
+ Custom.wrap(val)
15
+ else
16
+ val
17
+ end
18
+ end
19
+ end
20
+ end