oscal 0.1.0 → 0.1.1

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +15 -0
  3. data/.github/workflows/release.yml +24 -0
  4. data/.gitignore +11 -0
  5. data/.gitmodules +3 -0
  6. data/.hound.yml +5 -0
  7. data/.rubocop.yml +10 -0
  8. data/Gemfile +2 -0
  9. data/README.adoc +63 -0
  10. data/bin/console +30 -0
  11. data/bin/setup +8 -0
  12. data/exe/convert2oscalyaml.rb +560 -0
  13. data/lib/oscal/add.rb +25 -0
  14. data/lib/oscal/address.rb +21 -0
  15. data/lib/oscal/address_line.rb +10 -0
  16. data/lib/oscal/alter.rb +21 -0
  17. data/lib/oscal/back_matter.rb +19 -0
  18. data/lib/oscal/base64_object.rb +10 -0
  19. data/lib/oscal/base_class.rb +49 -0
  20. data/lib/oscal/catalog.rb +50 -10
  21. data/lib/oscal/choice.rb +10 -0
  22. data/lib/oscal/citation.rb +21 -0
  23. data/lib/oscal/combine.rb +10 -0
  24. data/lib/oscal/common_utils.rb +35 -0
  25. data/lib/oscal/constraint.rb +19 -0
  26. data/lib/oscal/control.rb +20 -31
  27. data/lib/oscal/custom.rb +21 -0
  28. data/lib/oscal/document_id.rb +10 -0
  29. data/lib/oscal/email_address.rb +10 -0
  30. data/lib/oscal/exclude_control.rb +21 -0
  31. data/lib/oscal/external_id.rb +10 -0
  32. data/lib/oscal/group.rb +26 -35
  33. data/lib/oscal/guideline.rb +10 -0
  34. data/lib/oscal/hash_object.rb +10 -0
  35. data/lib/oscal/import_object.rb +21 -0
  36. data/lib/oscal/include_control.rb +21 -0
  37. data/lib/oscal/insert_control.rb +21 -0
  38. data/lib/oscal/link.rb +10 -0
  39. data/lib/oscal/location.rb +30 -0
  40. data/lib/oscal/location_uuid.rb +10 -0
  41. data/lib/oscal/matching.rb +10 -0
  42. data/lib/oscal/member_of_organization.rb +10 -0
  43. data/lib/oscal/merge.rb +19 -0
  44. data/lib/oscal/metadata_block.rb +28 -14
  45. data/lib/oscal/modify.rb +21 -0
  46. data/lib/oscal/parameter.rb +22 -20
  47. data/lib/oscal/part.rb +13 -22
  48. data/lib/oscal/party.rb +35 -0
  49. data/lib/oscal/party_uuid.rb +10 -0
  50. data/lib/oscal/profile.rb +32 -7
  51. data/lib/oscal/property.rb +3 -25
  52. data/lib/oscal/remove.rb +10 -0
  53. data/lib/oscal/resource.rb +28 -0
  54. data/lib/oscal/responsible_party.rb +23 -0
  55. data/lib/oscal/revision.rb +22 -0
  56. data/lib/oscal/rlink.rb +19 -0
  57. data/lib/oscal/role.rb +21 -0
  58. data/lib/oscal/select.rb +19 -0
  59. data/lib/oscal/serializer.rb +17 -4
  60. data/lib/oscal/set_parameter.rb +30 -0
  61. data/lib/oscal/telephone_number.rb +10 -0
  62. data/lib/oscal/test.rb +10 -0
  63. data/lib/oscal/url.rb +10 -0
  64. data/lib/oscal/value.rb +36 -0
  65. data/lib/oscal/version.rb +1 -1
  66. data/lib/oscal/with_id.rb +39 -0
  67. data/lib/oscal.rb +1 -13
  68. data/oscal.gemspec +9 -11
  69. data/spec/oscal/catalog_spec.rb +39 -0
  70. data/spec/oscal_spec.rb +7 -0
  71. data/spec/spec_helper.rb +15 -0
  72. metadata +65 -9
  73. data/lib/oscal/component.rb +0 -14
  74. data/lib/oscal/prose.rb +0 -13
  75. data/lib/oscal/statement.rb +0 -12
@@ -0,0 +1,49 @@
1
+ require_relative "serializer"
2
+
3
+ module Oscal
4
+ class BaseClass
5
+ include Serializer
6
+
7
+ KEY = %i(val)
8
+
9
+ attr_accessor *KEY
10
+ attr_serializable *KEY
11
+
12
+ def self.wrap(obj)
13
+ klass = self
14
+ return obj if obj.is_a? klass
15
+ return klass.new(obj) unless obj.is_a? Array
16
+
17
+ obj.map do |x|
18
+ klass.wrap(x)
19
+ end
20
+ end
21
+
22
+ def initialize(options = {})
23
+ klass = self.class
24
+
25
+ unless options.is_a? Hash
26
+ options = {klass::KEY.first.to_s => options}
27
+ end
28
+
29
+ options.each_pair.each do |key, val|
30
+ key_name = key.gsub("-", "_")
31
+ key_name = 'klass' if key == 'class'
32
+
33
+ unless klass::KEY.include?(key_name.to_sym)
34
+ raise UnknownAttributeError.new(
35
+ "Unknown key `#{key}` in #{klass.name}"
36
+ )
37
+ end
38
+
39
+ val = set_value(key_name, val)
40
+
41
+ send("#{key_name}=", val)
42
+ end
43
+ end
44
+
45
+ def set_value(key_name, val)
46
+ val
47
+ end
48
+ end
49
+ end
data/lib/oscal/catalog.rb CHANGED
@@ -1,22 +1,62 @@
1
+ require "date"
2
+ require_relative "serializer"
3
+ require_relative "common_utils"
4
+
1
5
  module Oscal
2
6
  class Catalog
3
- attr_accessor :uuid, :metadata, :groups
7
+ include Serializer
8
+ include CommonUtils
9
+
10
+ KEY = %i(uuid metadata params controls groups back_matter)
11
+ attr_accessor *KEY
12
+ attr_serializable *KEY
13
+
14
+ def initialize(uuid, metadata, params, controls, groups, back_matter)
15
+ @uuid = uuid
16
+ @metadata = MetadataBlock.new(metadata)
17
+ @params = Parameter.wrap(params) if params
18
+ @controls = Control.wrap(controls) if controls
19
+ @groups = Group.wrap(groups) if groups
20
+ @back_matter = BackMatter.wrap(back_matter) if back_matter
4
21
 
5
- def initialize(metadata, groups)
6
- @metadata = MetadataBlock.new(metadata)
7
- @groups = Group.wrap(groups)
22
+ @all_controls = []
8
23
  end
9
24
 
10
25
  def self.load_from_yaml(path)
11
- yaml_data = YAML.load_file(path, permitted_classes: [Time, Date, DateTime])
26
+ yaml_data = safe_load_yaml(path)
27
+ yaml_catalog = yaml_data["catalog"]
12
28
 
13
- yaml_catalog = yaml_data['catalog']
29
+ uuid = yaml_catalog['uuid']
30
+ metadata = yaml_catalog['metadata']
31
+ params = yaml_catalog['params']
32
+ controls = yaml_catalog['controls']
33
+ groups = yaml_catalog['groups']
34
+ back_matter = yaml_catalog['back-matter']
14
35
 
15
- metadata = yaml_catalog['metadata']
16
- group_data = yaml_catalog['groups']
36
+ Catalog.new(uuid, metadata, params, controls, groups, back_matter)
37
+ end
17
38
 
18
- Catalog.new(metadata, group_data)
39
+ def get_all_controls
40
+ append_all_control_group(self)
41
+ @all_controls.uniq
19
42
  end
20
- end
21
43
 
44
+ def append_all_control_group(obj)
45
+ if obj.to_s.match(/Oscal::Control/)
46
+ @all_controls << obj
47
+ end
48
+
49
+ if obj.respond_to?(:controls) && !obj.controls.nil?
50
+ obj.controls.each do |c|
51
+ append_all_control_group(c)
52
+ end
53
+ end
54
+
55
+ if obj.respond_to?(:groups) && !obj.groups.nil?
56
+ obj.groups.each do |g|
57
+ append_all_control_group(g)
58
+ end
59
+ end
60
+ end
61
+ end
22
62
  end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Choice < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Citation < Oscal::BaseClass
5
+ KEY = %i(text props links)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'props'
13
+ Property.wrap(val)
14
+ when 'links'
15
+ Link.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Combine < Oscal::BaseClass
5
+ KEY = %i(method)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -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,19 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'test'
13
+ Test.wrap(val)
14
+ else
15
+ val
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/oscal/control.rb CHANGED
@@ -1,37 +1,26 @@
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
1
+ require_relative "base_class"
9
2
 
10
- obj.map do |x|
11
- Control.wrap(x)
12
- end
13
- end
14
-
15
- def initialize(options={})
16
- options.each_pair.each do |key,val|
17
- key_name = key.gsub('-','_')
18
-
19
- unless KEY.include?(key_name.to_sym)
20
- raise UnknownAttributeError.new("Unknown key `#{key}` in Control")
21
- end
3
+ module Oscal
4
+ class Control < Oscal::BaseClass
5
+ KEY = %i(id klass title params props links parts controls)
22
6
 
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
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
33
9
 
34
- self.send("#{key_name}=", val)
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'params'
13
+ Parameter.wrap(val)
14
+ when 'props'
15
+ Property.wrap(val)
16
+ when 'links'
17
+ Link.wrap(val)
18
+ when 'parts'
19
+ Part.wrap(val)
20
+ when 'controls'
21
+ Control.wrap(val)
22
+ else
23
+ val
35
24
  end
36
25
  end
37
26
  end
@@ -0,0 +1,21 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'groups'
13
+ Group.wrap(val)
14
+ when 'insert_controls'
15
+ InsertControl.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
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
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class EmailAddress < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,21 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'with_ids'
13
+ WithId.wrap(val)
14
+ when 'matching'
15
+ Matching.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
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
+ attr_serializable *KEY
9
+ end
10
+ end
data/lib/oscal/group.rb CHANGED
@@ -1,41 +1,32 @@
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
9
-
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('-','_')
1
+ require_relative "base_class"
18
2
 
19
- unless KEYS.include?(key_name.to_sym)
20
- raise UnknownAttributeError.new("Unknown key `#{key}` in Group")
21
- end
3
+ module Oscal
4
+ class Group < Oscal::BaseClass
5
+ KEY = %i(id klass title params props links parts groups
6
+ controls insert_controls)
22
7
 
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
8
+ attr_accessor *KEY
9
+ attr_serializable *KEY
35
10
 
36
- 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 'groups'
22
+ Group.wrap(val)
23
+ when 'controls'
24
+ Control.wrap(val)
25
+ when 'insert_controls'
26
+ InsertControl.wrap(val)
27
+ else
28
+ val
37
29
  end
38
30
  end
39
-
40
31
  end
41
- end
32
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Guideline < Oscal::BaseClass
5
+ KEY = %i(prose)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,10 @@
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
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,21 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'include_controls'
13
+ IncludeControl.wrap(val)
14
+ when 'exclude_controls'
15
+ ExcludeControl.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'with_ids'
13
+ WithId.wrap(val)
14
+ when 'matching'
15
+ Matching.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'include_controls'
13
+ IncludeControl.wrap(val)
14
+ when 'exclude_controls'
15
+ ExcludeControls.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end
data/lib/oscal/link.rb ADDED
@@ -0,0 +1,10 @@
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
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,30 @@
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
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when 'address'
14
+ Address.wrap(val)
15
+ when 'email_addresses'
16
+ EmailAddress.wrap(val)
17
+ when 'telephone_numbers'
18
+ TelephoneNumber.wrap(val)
19
+ when 'urls'
20
+ Url.wrap(val)
21
+ when 'props'
22
+ Property.wrap(val)
23
+ when 'links'
24
+ Link.wrap(val)
25
+ else
26
+ val
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class LocationUuid < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Matching < Oscal::BaseClass
5
+ KEY = %i(pattern)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class MemberOfOrganization < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,19 @@
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
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'custom'
13
+ Custom.wrap(val)
14
+ else
15
+ val
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,21 +1,35 @@
1
- module Oscal
2
- class MetadataBlock
3
-
4
- METADATA_VALUES = %i(title published last_modified version
5
- oscal_version remarks)
1
+ require_relative "base_class"
6
2
 
7
- attr_accessor *METADATA_VALUES
3
+ module Oscal
4
+ class MetadataBlock < Oscal::BaseClass
5
+ KEY = %i(title published last_modified version
6
+ oscal_version revisions document_ids props links roles
7
+ locations parties responsible_parties remarks)
8
8
 
9
- def initialize(options={})
10
- options.each_pair.each do |key,val|
11
- key_name = key.gsub('-','_')
9
+ attr_accessor *KEY
10
+ attr_serializable *KEY
12
11
 
13
- unless METADATA_VALUES.include?(key_name.to_sym)
14
- raise UnknownAttributeError.new("Unknown key `#{key}` in MetadataBlock")
15
- end
16
- self.send("#{key_name}=", val)
12
+ def set_value(key_name, val)
13
+ case key_name
14
+ when 'revisions'
15
+ Revision.wrap(val)
16
+ when 'docuement_ids'
17
+ DocumentId.wrap(val)
18
+ when 'props'
19
+ Property.wrap(val)
20
+ when 'links'
21
+ Link.wrap(val)
22
+ when 'roles'
23
+ Role.wrap(val)
24
+ when 'locations'
25
+ Location.wrap(val)
26
+ when 'parties'
27
+ Party.wrap(val)
28
+ when 'responsible_parties'
29
+ ResponsibleParty.wrap(val)
30
+ else
31
+ val
17
32
  end
18
33
  end
19
-
20
34
  end
21
35
  end
@@ -0,0 +1,21 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Modify < Oscal::BaseClass
5
+ KEY = %i(set_parameters alters)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'set_parameters'
13
+ SetParameter.wrap(val)
14
+ when 'alters'
15
+ Alter.wrap(val)
16
+ else
17
+ val
18
+ end
19
+ end
20
+ end
21
+ end