oscal 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,27 +1,29 @@
1
+ require_relative "base_class"
2
+
1
3
  module Oscal
2
- class Parameter
4
+ class Parameter < Oscal::BaseClass
5
+ KEY = %i(id klass depneds_on props links label usage
6
+ constraints guidelines values select remarks)
3
7
 
4
- KEY = %i(id label select)
5
8
  attr_accessor *KEY
9
+ attr_serializable *KEY
6
10
 
7
- def self.wrap(obj)
8
- return obj if obj.is_a? Parameter
9
- return Parameter.new(obj) unless obj.is_a? Array
10
-
11
- obj.map do |x|
12
- Parameter.wrap(x)
13
- end
14
- end
15
-
16
- def initialize(options={})
17
- options.each_pair.each do |key,val|
18
- key_name = key.gsub('-','_')
19
-
20
- unless KEY.include?(key_name.to_sym)
21
- raise UnknownAttributeError.new("Unknown key `#{key}` in Parameter")
22
- end
23
-
24
- self.send("#{key_name}=", val)
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when 'props'
14
+ Property.wrap(val)
15
+ when 'links'
16
+ Link.wrap(val)
17
+ when 'constraints'
18
+ Constraint.wrap(val)
19
+ when 'guidelines'
20
+ Guideline.wrap(val)
21
+ when 'values'
22
+ Value.wrap(val)
23
+ when 'select'
24
+ Select.wrap(val)
25
+ else
26
+ val
25
27
  end
26
28
  end
27
29
  end
data/lib/oscal/part.rb CHANGED
@@ -1,31 +1,22 @@
1
- require_relative "serializer"
1
+ require_relative "base_class"
2
2
 
3
3
  module Oscal
4
- class Part
5
- include Serializer
4
+ class Part < Oscal::BaseClass
5
+ KEY = %i(id name ns klass title props prose parts links)
6
6
 
7
- KEY = %i(id name prose)
8
7
  attr_accessor *KEY
9
8
  attr_serializable *KEY
10
9
 
11
- def self.wrap(obj)
12
- return obj if obj.is_a? Part
13
- return Part.new(obj) unless obj.is_a? Array
14
-
15
- obj.map do |x|
16
- Part.wrap(x)
17
- end
18
- end
19
-
20
- def initialize(options={})
21
- options.each_pair.each do |key,val|
22
- key_name = key.gsub('-','_')
23
-
24
- unless KEY.include?(key_name.to_sym)
25
- raise UnknownAttributeError.new("Unknown key `#{key}` in Part")
26
- end
27
-
28
- self.send("#{key_name}=", val)
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'props'
13
+ Property.wrap(val)
14
+ when 'parts'
15
+ Part.wrap(val)
16
+ when 'links'
17
+ Link.wrap(val)
18
+ else
19
+ val
29
20
  end
30
21
  end
31
22
  end
@@ -0,0 +1,35 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Party < Oscal::BaseClass
5
+ KEY = %i(uuid type name short_name external_ids props links
6
+ email_addresses telephone_numbers addresses location_uuids
7
+ member_of_organizations remakrs)
8
+
9
+ attr_accessor *KEY
10
+ attr_serializable *KEY
11
+
12
+ def set_value(key_name, val)
13
+ case key_name
14
+ when 'external_ids'
15
+ ExternalId.wrap(val)
16
+ when 'props'
17
+ Property.wrap(val)
18
+ when 'links'
19
+ Link.wrap(val)
20
+ when 'email_addresses'
21
+ EmailAddress.wrap(val)
22
+ when 'telephone_numbers'
23
+ TelephoneNumber.wrap(val)
24
+ when 'addresses'
25
+ Address.wrap(val)
26
+ when 'location_uuids'
27
+ LocationUuid.wrap(val)
28
+ when 'member_of_organizations'
29
+ MemberOfOrganization.wrap(val)
30
+ else
31
+ val
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class PartyUuid < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
data/lib/oscal/profile.rb CHANGED
@@ -1,11 +1,36 @@
1
+ require_relative "serializer"
2
+ require_relative "common_utils"
3
+
1
4
  module Oscal
2
- class Profile
3
- attr_accessor :metadata, :imports, :controls
5
+ class Profile
6
+ include Serializer
7
+ include CommonUtils
8
+
9
+ KEY = %i(uuid metadata imports merge modify back_matter)
10
+ attr_accessor *KEY
11
+ attr_serializable *KEY
12
+
13
+ def initialize(uuid, metadata, imports, merge, modify, back_matter)
14
+ @uuid = uuid
15
+ @metadata = MetadataBlock.new(metadata)
16
+ @imports = ImportObject.wrap(imports) if imports
17
+ @merge = Merge.wrap(merge) if merge
18
+ @modify = Modify.wrap(modify) if modify
19
+ @back_matter = BackMatter.wrap(back_matter) if back_matter
20
+ end
21
+
22
+ def self.load_from_yaml(path)
23
+ yaml_data = safe_load_yaml(path)
24
+ yaml_profile = yaml_data["profile"]
25
+
26
+ uuid = yaml_profile['uuid']
27
+ metadata = yaml_profile['metadata']
28
+ imports = yaml_profile['imports']
29
+ merge = yaml_profile['merge']
30
+ modify = yaml_profile['modify']
31
+ back_matter = yaml_profile['back-matter']
4
32
 
5
- def initialize(metadata, imports, controls)
6
- @metadata = metadata
7
- @imports = imports
8
- @controls = controls
33
+ Profile.new(uuid, metadata, imports, merge, modify, back_matter)
9
34
  end
10
35
  end
11
- end
36
+ end
@@ -1,32 +1,10 @@
1
- require_relative "serializer"
1
+ require_relative "base_class"
2
2
 
3
3
  module Oscal
4
- class Property
5
- include Serializer
4
+ class Property < Oscal::BaseClass
5
+ KEY = %i(name uuid ns value klass remarks)
6
6
 
7
- KEY = %i(name value)
8
7
  attr_accessor *KEY
9
8
  attr_serializable *KEY
10
-
11
- def self.wrap(obj)
12
- return obj if obj.is_a? Property
13
- return Property.new(obj) unless obj.is_a? Array
14
-
15
- obj.map do |x|
16
- Property.wrap(x)
17
- end
18
- end
19
-
20
- def initialize(options={})
21
- options.each_pair.each do |key,val|
22
- key_name = key.gsub('-','_')
23
-
24
- unless KEY.include?(key_name.to_sym)
25
- raise UnknownAttributeError.new("Unknown key `#{key}` in Property")
26
- end
27
-
28
- self.send("#{key_name}=", val)
29
- end
30
- end
31
9
  end
32
10
  end
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Remove < Oscal::BaseClass
5
+ KEY = %i(by_name by_class by_id by_item_name by_ns)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Resource < Oscal::BaseClass
5
+ KEY = %i(uuid title description props docuement_ids citation rlinks
6
+ base64 remarks)
7
+
8
+ attr_accessor *KEY
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when 'props'
14
+ Property.wrap(val)
15
+ when 'document_ids'
16
+ DocumentId.wrap(val)
17
+ when 'citation'
18
+ Citation.wrap(val)
19
+ when 'rlinks'
20
+ Rlink.wrap(val)
21
+ when 'base64'
22
+ Base64Object.wrap(val)
23
+ else
24
+ val
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class ResponsibleParty < Oscal::BaseClass
5
+ KEY = %i(role_id party_uuids props links remakrs)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'party_uuids'
13
+ PartyUuid.wrap(val)
14
+ when 'props'
15
+ Property.wrap(val)
16
+ when 'links'
17
+ Link.wrap(val)
18
+ else
19
+ val
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Revision < Oscal::BaseClass
5
+ KEY = %i(title published last_modified version oscal_version
6
+ props links remarks)
7
+
8
+ attr_accessor *KEY
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when 'props'
14
+ Property.wrap(val)
15
+ when 'links'
16
+ Link.wrap(val)
17
+ else
18
+ val
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Rlink < Oscal::BaseClass
5
+ KEY = %i(href media_type hashes)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'hashes'
13
+ HashObject.wrap(val)
14
+ else
15
+ val
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/oscal/role.rb ADDED
@@ -0,0 +1,21 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Role < Oscal::BaseClass
5
+ KEY = %i(id title short_name description props links remakrs)
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,19 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Select < Oscal::BaseClass
5
+ KEY = %i(how_many choice)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+
10
+ def set_value(key_name, val)
11
+ case key_name
12
+ when 'choice'
13
+ Choice.wrap(val)
14
+ else
15
+ val
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,10 +1,10 @@
1
- require 'yaml'
1
+ require "yaml"
2
2
 
3
3
  module Oscal
4
4
  module Serializer
5
5
  def to_h
6
6
  instance_variables.each_with_object({}) do |var, hash|
7
- var_name = var.to_s.delete('@')
7
+ var_name = var.to_s.delete("@")
8
8
  hash[var_name] = instance_variable_get(var)
9
9
  end
10
10
  end
@@ -36,7 +36,7 @@ module Oscal
36
36
  end
37
37
 
38
38
  def from_yaml(yaml_string)
39
- data = YAML.load(yaml_string)
39
+ data = YAML.safe_load(yaml_string)
40
40
  from_h(data)
41
41
  end
42
42
 
@@ -44,6 +44,17 @@ module Oscal
44
44
  raise NotImplementedError, "#{self}#from_xml not implemented!"
45
45
  end
46
46
 
47
+ # Psych >= 4 requires permitted_classes to load such classes
48
+ # https://github.com/ruby/psych/issues/533
49
+ def safe_load_yaml(path)
50
+ YAML.load_file(
51
+ path,
52
+ permitted_classes: [::Time, ::Date, ::DateTime],
53
+ )
54
+ rescue ArgumentError
55
+ YAML.load_file(path)
56
+ end
57
+
47
58
  private
48
59
 
49
60
  def attribute_names
@@ -54,7 +65,9 @@ module Oscal
54
65
  attrs.each do |attr|
55
66
  attribute_names << attr.to_sym
56
67
  define_method(attr) { instance_variable_get("@#{attr}") }
57
- define_method("#{attr}=") { |value| instance_variable_set("@#{attr}", value) }
68
+ define_method("#{attr}=") do |value|
69
+ instance_variable_set("@#{attr}", value)
70
+ end
58
71
  end
59
72
  end
60
73
  end
@@ -0,0 +1,30 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class SetParameter < Oscal::BaseClass
5
+ KEY = %i(param_id klass depneds_on props links label usage
6
+ constraints guidelines values select)
7
+
8
+ attr_accessor *KEY
9
+ attr_serializable *KEY
10
+
11
+ def set_value(key_name, val)
12
+ case key_name
13
+ when 'props'
14
+ Property.wrap(val)
15
+ when 'links'
16
+ Link.wrap(val)
17
+ when 'constraints'
18
+ Constraint.wrap(val)
19
+ when 'guidelines'
20
+ Guideline.wrap(val)
21
+ when 'values'
22
+ Value.wrap(val)
23
+ when 'select'
24
+ Select.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 TelephoneNumber < Oscal::BaseClass
5
+ KEY = %i(type number)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
data/lib/oscal/test.rb ADDED
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Test < Oscal::BaseClass
5
+ KEY = %i(expression remarks)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
data/lib/oscal/url.rb ADDED
@@ -0,0 +1,10 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Url < Oscal::BaseClass
5
+ KEY = %i(val)
6
+
7
+ attr_accessor *KEY
8
+ attr_serializable *KEY
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class Value < Oscal::BaseClass
5
+ include Serializer
6
+
7
+ KEY = %i(val)
8
+ attr_accessor *KEY
9
+ attr_serializable *KEY
10
+
11
+ def self.wrap(obj)
12
+ return obj if obj.is_a? Value
13
+ return Value.new(obj) unless obj.is_a? Array
14
+
15
+ obj.map do |x|
16
+ Value.wrap(x)
17
+ end
18
+ end
19
+
20
+ def initialize(options={})
21
+ unless options.is_a? Hash
22
+ options = {'val' => options}
23
+ end
24
+
25
+ options.each_pair.each do |key,val|
26
+ key_name = key.gsub('-','_')
27
+
28
+ unless KEY.include?(key_name.to_sym)
29
+ raise UnknownAttributeError.new("Unknown key `#{key}` in Value")
30
+ end
31
+
32
+ self.send("#{key_name}=", val)
33
+ end
34
+ end
35
+ end
36
+ end
data/lib/oscal/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Oscal
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
@@ -0,0 +1,39 @@
1
+ require_relative "base_class"
2
+
3
+ module Oscal
4
+ class WithId < Oscal::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
+ return obj if obj.is_a? WithId
14
+ return WithId.new(obj) unless obj.is_a? Array
15
+
16
+ obj.map do |x|
17
+ WithId.wrap(x)
18
+ end
19
+ end
20
+
21
+ def initialize(options = {})
22
+ klass = self.class
23
+
24
+ unless options.is_a? Hash
25
+ options = {KEY.first.to_s => options}
26
+ end
27
+
28
+ options.each_pair.each do |key, val|
29
+ key_name = key.gsub("-", "_")
30
+
31
+ unless KEY.include?(key_name.to_sym)
32
+ raise UnknownAttributeError.new("Unknown key `#{key}` in #{klass.name}")
33
+ end
34
+
35
+ send("#{key_name}=", val)
36
+ end
37
+ end
38
+ end
39
+ end
data/lib/oscal.rb CHANGED
@@ -1,18 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "oscal/version"
4
- require_relative "oscal/serializer"
5
- require_relative "oscal/catalog"
6
- require_relative "oscal/component"
7
- require_relative "oscal/control"
8
- require_relative "oscal/group"
9
- require_relative "oscal/part"
10
- require_relative "oscal/parameter"
11
- require_relative "oscal/metadata_block"
12
- require_relative "oscal/profile"
13
- require_relative "oscal/property"
14
- require_relative "oscal/prose"
15
- require_relative "oscal/statement"
3
+ Dir[File.join(__dir__, 'oscal', '*.rb')].each { |file| require file }
16
4
 
17
5
  module Oscal
18
6
  class Error < StandardError; end
data/oscal.gemspec CHANGED
@@ -5,28 +5,26 @@ require_relative "lib/oscal/version"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "oscal"
7
7
  spec.version = Oscal::VERSION
8
- spec.authors = ["Ronald Tse"]
9
- spec.email = ["ronald.tse@ribose.com"]
8
+ spec.authors = ["Ribose Inc."]
9
+ spec.email = ["open.source@ribose.com"]
10
10
 
11
11
  spec.summary = "Interact with OSCAL models"
12
12
  spec.description = "Ruby library and parser for OSCAL models"
13
13
  spec.homepage = "https://github.com/metanorma/oscal-ruby/"
14
- spec.required_ruby_version = ">= 2.7.0"
14
+ spec.license = "BSD-2-Clause"
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = "https://github.com/metanorma/oscal-ruby/"
18
18
  spec.metadata["changelog_uri"] = "https://github.com/metanorma/oscal-ruby/CHANGELOG"
19
19
 
20
- # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(__dir__) do
23
- `git ls-files -z`.split("\x0").reject do |f|
24
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
25
- end
20
+ spec.files = `git ls-files`.split("\n")
21
+ spec.executables = `git ls-files -- exe/*`.split("\n").map do |f|
22
+ File.basename(f)
26
23
  end
27
- spec.bindir = "exe"
28
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
24
+ spec.bindir = "exe"
29
25
  spec.require_paths = ["lib"]
26
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
30
27
 
31
28
  spec.add_dependency "yaml"
29
+ spec.metadata["rubygems_mfa_required"] = "true"
32
30
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Oscal::Catalog do
4
+ let(:subject) do
5
+ Oscal::Catalog.load_from_yaml(
6
+ "spec/oscal-content/examples/catalog/yaml/basic-catalog.yaml",
7
+ )
8
+ end
9
+
10
+ it "parses oscal-content YAML" do
11
+ expect(subject.class).to be Oscal::Catalog
12
+ expect(subject.groups.first.groups.first.parts.first.prose).to eq(
13
+ "To establish a management framework to initiate and " \
14
+ "control the implementation and operation of information security " \
15
+ "within the organization.",
16
+ )
17
+ end
18
+
19
+ it "gets all controls" do
20
+ expect(subject.class).to be Oscal::Catalog
21
+ expect(subject.get_all_controls.count).to eq(4)
22
+ end
23
+
24
+ it "find object by id" do
25
+ obj = subject.find_object_by_id('s2.1_smt')
26
+ expect(obj.to_s).to match(/Oscal::Part/)
27
+ expect(obj.prose).to eq(
28
+ "To limit access to information and information processing facilities.")
29
+ end
30
+
31
+ it "find object by uuid" do
32
+ uuid = '74c8ba1e-5cd4-4ad1-bbfd-d888e2f6c724'
33
+ obj = subject.find_object_by_id(
34
+ uuid, subject, :uuid
35
+ )
36
+ expect(obj.to_s).to match(/Oscal::Catalog/)
37
+ expect(obj.uuid).to eq(uuid)
38
+ end
39
+ end