oscal 0.2.2 → 0.4.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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/lib/oscal/v1_2_1/all_models.rb +16379 -0
  3. data/lib/oscal/v1_2_1.rb +109 -0
  4. data/lib/oscal/version.rb +1 -1
  5. data/lib/oscal/version_registry.rb +183 -0
  6. data/lib/oscal/versioned.rb +88 -0
  7. data/lib/oscal.rb +93 -3
  8. metadata +38 -110
  9. data/.docker/Dockerfile +0 -19
  10. data/.docker/Makefile +0 -43
  11. data/.docker/docker-compose.yml +0 -14
  12. data/.docker/readme.md +0 -61
  13. data/.github/workflows/rake.yml +0 -15
  14. data/.github/workflows/release.yml +0 -24
  15. data/.gitignore +0 -13
  16. data/.gitmodules +0 -3
  17. data/.hound.yml +0 -5
  18. data/.rspec +0 -2
  19. data/.rubocop.yml +0 -10
  20. data/.ruby-version +0 -1
  21. data/CODE_OF_CONDUCT.md +0 -84
  22. data/Gemfile +0 -16
  23. data/LICENSE +0 -25
  24. data/Makefile +0 -1
  25. data/README.adoc +0 -115
  26. data/Rakefile +0 -19
  27. data/bin/console +0 -30
  28. data/bin/rspec +0 -27
  29. data/bin/setup +0 -8
  30. data/docker-compose.yml +0 -1
  31. data/exe/convert2oscalyaml.rb +0 -560
  32. data/lib/oscal/add.rb +0 -26
  33. data/lib/oscal/address.rb +0 -22
  34. data/lib/oscal/address_line.rb +0 -11
  35. data/lib/oscal/alter.rb +0 -22
  36. data/lib/oscal/assembly.rb +0 -119
  37. data/lib/oscal/assessment_plan.rb +0 -28
  38. data/lib/oscal/assessment_result.rb +0 -230
  39. data/lib/oscal/attribute_type_hash.rb +0 -81
  40. data/lib/oscal/back_matter.rb +0 -20
  41. data/lib/oscal/base64_object.rb +0 -11
  42. data/lib/oscal/base_class.rb +0 -50
  43. data/lib/oscal/catalog.rb +0 -63
  44. data/lib/oscal/choice.rb +0 -11
  45. data/lib/oscal/citation.rb +0 -22
  46. data/lib/oscal/combine.rb +0 -11
  47. data/lib/oscal/common_utils.rb +0 -35
  48. data/lib/oscal/constraint.rb +0 -20
  49. data/lib/oscal/control.rb +0 -28
  50. data/lib/oscal/custom.rb +0 -22
  51. data/lib/oscal/datatypes.rb +0 -50
  52. data/lib/oscal/document_id.rb +0 -11
  53. data/lib/oscal/email_address.rb +0 -11
  54. data/lib/oscal/exclude_control.rb +0 -22
  55. data/lib/oscal/external_id.rb +0 -11
  56. data/lib/oscal/group.rb +0 -33
  57. data/lib/oscal/guideline.rb +0 -11
  58. data/lib/oscal/hash_object.rb +0 -11
  59. data/lib/oscal/import_object.rb +0 -22
  60. data/lib/oscal/include_control.rb +0 -22
  61. data/lib/oscal/insert_control.rb +0 -22
  62. data/lib/oscal/link.rb +0 -11
  63. data/lib/oscal/list.rb +0 -160
  64. data/lib/oscal/location.rb +0 -31
  65. data/lib/oscal/location_uuid.rb +0 -11
  66. data/lib/oscal/logger.rb +0 -12
  67. data/lib/oscal/matching.rb +0 -11
  68. data/lib/oscal/member_of_organization.rb +0 -11
  69. data/lib/oscal/merge.rb +0 -20
  70. data/lib/oscal/metadata_block.rb +0 -36
  71. data/lib/oscal/modify.rb +0 -22
  72. data/lib/oscal/parameter.rb +0 -31
  73. data/lib/oscal/parsing_functions.rb +0 -19
  74. data/lib/oscal/part.rb +0 -24
  75. data/lib/oscal/party.rb +0 -36
  76. data/lib/oscal/party_uuid.rb +0 -11
  77. data/lib/oscal/profile.rb +0 -37
  78. data/lib/oscal/property.rb +0 -11
  79. data/lib/oscal/remove.rb +0 -11
  80. data/lib/oscal/resource.rb +0 -29
  81. data/lib/oscal/responsible_party.rb +0 -24
  82. data/lib/oscal/revision.rb +0 -23
  83. data/lib/oscal/rlink.rb +0 -20
  84. data/lib/oscal/role.rb +0 -22
  85. data/lib/oscal/select.rb +0 -20
  86. data/lib/oscal/serializer.rb +0 -75
  87. data/lib/oscal/set_parameter.rb +0 -31
  88. data/lib/oscal/telephone_number.rb +0 -11
  89. data/lib/oscal/test.rb +0 -11
  90. data/lib/oscal/url.rb +0 -11
  91. data/lib/oscal/value.rb +0 -37
  92. data/lib/oscal/with_id.rb +0 -40
  93. data/oscal.gemspec +0 -30
  94. data/sig/oscal.rbs +0 -4
  95. data/spec/oscal/catalog_spec.rb +0 -40
  96. data/spec/oscal_spec.rb +0 -18
  97. data/spec/sample_inputs/import-ap.json +0 -4
  98. data/spec/spec_helper.rb +0 -15
@@ -1,19 +0,0 @@
1
- module Oscal
2
- module ParsingFunctions
3
- def sym2str(key)
4
- if key.is_a?(Symbol)
5
- key.to_s.gsub("-", "_").gsub("class", "klass")
6
- elsif key.is_a?(String)
7
- key
8
- end
9
- end
10
-
11
- def str2sym(var)
12
- if var.is_a?(String)
13
- var.gsub("-", "_").gsub("class", "klass").to_sym
14
- elsif var.is_a?(Symbol)
15
- var
16
- end
17
- end
18
- end
19
- end
data/lib/oscal/part.rb DELETED
@@ -1,24 +0,0 @@
1
- require_relative "base_class"
2
-
3
- module Oscal
4
- class Part < Oscal::BaseClass
5
- KEY = %i(id name ns klass title props prose parts links)
6
-
7
- attr_accessor *KEY
8
-
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 "parts"
16
- Part.wrap(val)
17
- when "links"
18
- Link.wrap(val)
19
- else
20
- val
21
- end
22
- end
23
- end
24
- end
data/lib/oscal/party.rb DELETED
@@ -1,36 +0,0 @@
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
-
11
- attr_serializable *KEY
12
-
13
- def set_value(key_name, val)
14
- case key_name
15
- when "external_ids"
16
- ExternalId.wrap(val)
17
- when "props"
18
- Property.wrap(val)
19
- when "links"
20
- Link.wrap(val)
21
- when "email_addresses"
22
- EmailAddress.wrap(val)
23
- when "telephone_numbers"
24
- TelephoneNumber.wrap(val)
25
- when "addresses"
26
- Address.wrap(val)
27
- when "location_uuids"
28
- LocationUuid.wrap(val)
29
- when "member_of_organizations"
30
- MemberOfOrganization.wrap(val)
31
- else
32
- val
33
- end
34
- end
35
- end
36
- end
@@ -1,11 +0,0 @@
1
- require_relative "base_class"
2
-
3
- module Oscal
4
- class PartyUuid < Oscal::BaseClass
5
- KEY = %i(val)
6
-
7
- attr_accessor *KEY
8
-
9
- attr_serializable *KEY
10
- end
11
- end
data/lib/oscal/profile.rb DELETED
@@ -1,37 +0,0 @@
1
- require_relative "serializer"
2
- require_relative "common_utils"
3
-
4
- module Oscal
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
-
12
- attr_serializable *KEY
13
-
14
- def initialize(uuid, metadata, imports, merge, modify, back_matter)
15
- @uuid = uuid
16
- @metadata = MetadataBlock.new(metadata)
17
- @imports = ImportObject.wrap(imports) if imports
18
- @merge = Merge.wrap(merge) if merge
19
- @modify = Modify.wrap(modify) if modify
20
- @back_matter = BackMatter.wrap(back_matter) if back_matter
21
- end
22
-
23
- def self.load_from_yaml(path)
24
- yaml_data = safe_load_yaml(path)
25
- yaml_profile = yaml_data["profile"]
26
-
27
- uuid = yaml_profile["uuid"]
28
- metadata = yaml_profile["metadata"]
29
- imports = yaml_profile["imports"]
30
- merge = yaml_profile["merge"]
31
- modify = yaml_profile["modify"]
32
- back_matter = yaml_profile["back-matter"]
33
-
34
- Profile.new(uuid, metadata, imports, merge, modify, back_matter)
35
- end
36
- end
37
- end
@@ -1,11 +0,0 @@
1
- require_relative "base_class"
2
-
3
- module Oscal
4
- class Property < Oscal::BaseClass
5
- KEY = %i(name uuid ns value klass remarks)
6
-
7
- attr_accessor *KEY
8
-
9
- attr_serializable *KEY
10
- end
11
- end
data/lib/oscal/remove.rb DELETED
@@ -1,11 +0,0 @@
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
-
9
- attr_serializable *KEY
10
- end
11
- end
@@ -1,29 +0,0 @@
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
-
10
- attr_serializable *KEY
11
-
12
- def set_value(key_name, val)
13
- case key_name
14
- when "props"
15
- Property.wrap(val)
16
- when "document_ids"
17
- DocumentId.wrap(val)
18
- when "citation"
19
- Citation.wrap(val)
20
- when "rlinks"
21
- Rlink.wrap(val)
22
- when "base64"
23
- Base64Object.wrap(val)
24
- else
25
- val
26
- end
27
- end
28
- end
29
- end
@@ -1,24 +0,0 @@
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
-
9
- attr_serializable *KEY
10
-
11
- def set_value(key_name, val)
12
- case key_name
13
- when "party_uuids"
14
- PartyUuid.wrap(val)
15
- when "props"
16
- Property.wrap(val)
17
- when "links"
18
- Link.wrap(val)
19
- else
20
- val
21
- end
22
- end
23
- end
24
- end
@@ -1,23 +0,0 @@
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
-
10
- attr_serializable *KEY
11
-
12
- def set_value(key_name, val)
13
- case key_name
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
data/lib/oscal/rlink.rb DELETED
@@ -1,20 +0,0 @@
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
-
9
- attr_serializable *KEY
10
-
11
- def set_value(key_name, val)
12
- case key_name
13
- when "hashes"
14
- HashObject.wrap(val)
15
- else
16
- val
17
- end
18
- end
19
- end
20
- end
data/lib/oscal/role.rb DELETED
@@ -1,22 +0,0 @@
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
-
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
data/lib/oscal/select.rb DELETED
@@ -1,20 +0,0 @@
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
-
9
- attr_serializable *KEY
10
-
11
- def set_value(key_name, val)
12
- case key_name
13
- when "choice"
14
- Choice.wrap(val)
15
- else
16
- val
17
- end
18
- end
19
- end
20
- end
@@ -1,75 +0,0 @@
1
- require "yaml"
2
-
3
- module Oscal
4
- module Serializer
5
- def to_h
6
- instance_variables.each_with_object({}) do |var, hash|
7
- var_name = var.to_s.delete("@")
8
- hash[var_name] = instance_variable_get(var)
9
- end
10
- end
11
-
12
- def to_json(*args)
13
- to_h.to_json(*args)
14
- end
15
-
16
- def to_yaml
17
- to_h.to_yaml
18
- end
19
-
20
- def to_xml(builder)
21
- raise NotImplementedError, "#{self.class}#to_xml not implemented!"
22
- end
23
-
24
- def self.included(klass)
25
- klass.extend(ClassMethods)
26
- end
27
-
28
- module ClassMethods
29
- def from_h(data)
30
- new(*data.values_at(*attribute_names))
31
- end
32
-
33
- def from_json(json_string)
34
- data = JSON.parse(json_string)
35
- from_h(data)
36
- end
37
-
38
- def from_yaml(yaml_string)
39
- data = YAML.safe_load(yaml_string)
40
- from_h(data)
41
- end
42
-
43
- def from_xml(xml_element)
44
- raise NotImplementedError, "#{self}#from_xml not implemented!"
45
- end
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
-
58
- private
59
-
60
- def attribute_names
61
- @attribute_names ||= []
62
- end
63
-
64
- def attr_serializable(*attrs)
65
- attrs.each do |attr|
66
- attribute_names << attr.to_sym
67
- define_method(attr) { instance_variable_get("@#{attr}") }
68
- define_method("#{attr}=") do |value|
69
- instance_variable_set("@#{attr}", value)
70
- end
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,31 +0,0 @@
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
-
10
- attr_serializable *KEY
11
-
12
- def set_value(key_name, val)
13
- case key_name
14
- when "props"
15
- Property.wrap(val)
16
- when "links"
17
- Link.wrap(val)
18
- when "constraints"
19
- Constraint.wrap(val)
20
- when "guidelines"
21
- Guideline.wrap(val)
22
- when "values"
23
- Value.wrap(val)
24
- when "select"
25
- Select.wrap(val)
26
- else
27
- val
28
- end
29
- end
30
- end
31
- end
@@ -1,11 +0,0 @@
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
-
9
- attr_serializable *KEY
10
- end
11
- end
data/lib/oscal/test.rb DELETED
@@ -1,11 +0,0 @@
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
-
9
- attr_serializable *KEY
10
- end
11
- end
data/lib/oscal/url.rb DELETED
@@ -1,11 +0,0 @@
1
- require_relative "base_class"
2
-
3
- module Oscal
4
- class Url < Oscal::BaseClass
5
- KEY = %i(val)
6
-
7
- attr_accessor *KEY
8
-
9
- attr_serializable *KEY
10
- end
11
- end
data/lib/oscal/value.rb DELETED
@@ -1,37 +0,0 @@
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
-
10
- attr_serializable *KEY
11
-
12
- def self.wrap(obj)
13
- return obj if obj.is_a? Value
14
- return Value.new(obj) unless obj.is_a? Array
15
-
16
- obj.map do |x|
17
- Value.wrap(x)
18
- end
19
- end
20
-
21
- def initialize(options = {})
22
- unless options.is_a? Hash
23
- options = { "val" => options }
24
- end
25
-
26
- options.each_pair.each do |key, val|
27
- key_name = key.gsub("-", "_")
28
-
29
- unless KEY.include?(key_name.to_sym)
30
- raise UnknownAttributeError.new("Unknown key `#{key}` in Value")
31
- end
32
-
33
- self.send("#{key_name}=", val)
34
- end
35
- end
36
- end
37
- end
data/lib/oscal/with_id.rb DELETED
@@ -1,40 +0,0 @@
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
-
11
- attr_serializable *KEY
12
-
13
- def self.wrap(obj)
14
- return obj if obj.is_a? WithId
15
- return WithId.new(obj) unless obj.is_a? Array
16
-
17
- obj.map do |x|
18
- WithId.wrap(x)
19
- end
20
- end
21
-
22
- def initialize(options = {})
23
- klass = self.class
24
-
25
- unless options.is_a? Hash
26
- options = { KEY.first.to_s => options }
27
- end
28
-
29
- options.each_pair.each do |key, val|
30
- key_name = key.gsub("-", "_")
31
-
32
- unless KEY.include?(key_name.to_sym)
33
- raise UnknownAttributeError.new("Unknown key `#{key}` in #{klass.name}")
34
- end
35
-
36
- send("#{key_name}=", val)
37
- end
38
- end
39
- end
40
- end
data/oscal.gemspec DELETED
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/oscal/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "oscal"
7
- spec.version = Oscal::VERSION
8
- spec.authors = ["Ribose Inc."]
9
- spec.email = ["open.source@ribose.com"]
10
-
11
- spec.summary = "Interact with OSCAL models"
12
- spec.description = "Ruby library and parser for OSCAL models"
13
- spec.homepage = "https://github.com/metanorma/oscal-ruby/"
14
- spec.license = "BSD-2-Clause"
15
-
16
- spec.metadata["homepage_uri"] = spec.homepage
17
- spec.metadata["source_code_uri"] = "https://github.com/metanorma/oscal-ruby/"
18
- spec.metadata["changelog_uri"] = "https://github.com/metanorma/oscal-ruby/CHANGELOG"
19
-
20
- spec.files = `git ls-files`.split("\n")
21
- spec.executables = `git ls-files -- exe/*`.split("\n").map do |f|
22
- File.basename(f)
23
- end
24
- spec.bindir = "exe"
25
- spec.require_paths = ["lib"]
26
- spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
27
-
28
- spec.add_dependency "yaml"
29
- spec.metadata["rubygems_mfa_required"] = "true"
30
- end
data/sig/oscal.rbs DELETED
@@ -1,4 +0,0 @@
1
- module Oscal
2
- VERSION: String
3
- # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
- end
@@ -1,40 +0,0 @@
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.controls.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
- )
30
- end
31
-
32
- it "find object by uuid" do
33
- uuid = "74c8ba1e-5cd4-4ad1-bbfd-d888e2f6c724"
34
- obj = subject.find_object_by_id(
35
- uuid, subject, :uuid
36
- )
37
- expect(obj.to_s).to match(/Oscal::Catalog/)
38
- expect(obj.uuid).to eq(uuid)
39
- end
40
- end
data/spec/oscal_spec.rb DELETED
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Oscal do
4
- it "has a version number" do
5
- expect(Oscal::VERSION).not_to be nil
6
- end
7
-
8
- it "allows setting a new logger" do
9
- logger = double(Logger)
10
- Oscal::ParsingLogger.logger = logger
11
-
12
- class LoggerTest
13
- include Oscal::ParsingLogger
14
- end
15
-
16
- expect(LoggerTest.new.get_logger).to eq logger
17
- end
18
- end
@@ -1,4 +0,0 @@
1
- {
2
- "href": "../3-implementation/ssp.oscal.xml",
3
- "remarks": "These are valid remarks."
4
- }
data/spec/spec_helper.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "oscal"
4
-
5
- RSpec.configure do |config|
6
- # Enable flags like --only-failures and --next-failure
7
- config.example_status_persistence_file_path = ".rspec_status"
8
-
9
- # Disable RSpec exposing methods globally on `Module` and `main`
10
- config.disable_monkey_patching!
11
-
12
- config.expect_with :rspec do |c|
13
- c.syntax = :expect
14
- end
15
- end