oscal 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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