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
@@ -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