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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +11 -0
- data/.gitmodules +3 -0
- data/.hound.yml +5 -0
- data/.rubocop.yml +10 -0
- data/Gemfile +2 -0
- data/README.adoc +63 -0
- data/bin/console +30 -0
- data/bin/setup +8 -0
- data/exe/convert2oscalyaml.rb +560 -0
- data/lib/oscal/add.rb +25 -0
- data/lib/oscal/address.rb +21 -0
- data/lib/oscal/address_line.rb +10 -0
- data/lib/oscal/alter.rb +21 -0
- data/lib/oscal/back_matter.rb +19 -0
- data/lib/oscal/base64_object.rb +10 -0
- data/lib/oscal/base_class.rb +49 -0
- data/lib/oscal/catalog.rb +50 -10
- data/lib/oscal/choice.rb +10 -0
- data/lib/oscal/citation.rb +21 -0
- data/lib/oscal/combine.rb +10 -0
- data/lib/oscal/common_utils.rb +35 -0
- data/lib/oscal/constraint.rb +19 -0
- data/lib/oscal/control.rb +20 -31
- data/lib/oscal/custom.rb +21 -0
- data/lib/oscal/document_id.rb +10 -0
- data/lib/oscal/email_address.rb +10 -0
- data/lib/oscal/exclude_control.rb +21 -0
- data/lib/oscal/external_id.rb +10 -0
- data/lib/oscal/group.rb +26 -35
- data/lib/oscal/guideline.rb +10 -0
- data/lib/oscal/hash_object.rb +10 -0
- data/lib/oscal/import_object.rb +21 -0
- data/lib/oscal/include_control.rb +21 -0
- data/lib/oscal/insert_control.rb +21 -0
- data/lib/oscal/link.rb +10 -0
- data/lib/oscal/location.rb +30 -0
- data/lib/oscal/location_uuid.rb +10 -0
- data/lib/oscal/matching.rb +10 -0
- data/lib/oscal/member_of_organization.rb +10 -0
- data/lib/oscal/merge.rb +19 -0
- data/lib/oscal/metadata_block.rb +28 -14
- data/lib/oscal/modify.rb +21 -0
- data/lib/oscal/parameter.rb +22 -20
- data/lib/oscal/part.rb +13 -22
- data/lib/oscal/party.rb +35 -0
- data/lib/oscal/party_uuid.rb +10 -0
- data/lib/oscal/profile.rb +32 -7
- data/lib/oscal/property.rb +3 -25
- data/lib/oscal/remove.rb +10 -0
- data/lib/oscal/resource.rb +28 -0
- data/lib/oscal/responsible_party.rb +23 -0
- data/lib/oscal/revision.rb +22 -0
- data/lib/oscal/rlink.rb +19 -0
- data/lib/oscal/role.rb +21 -0
- data/lib/oscal/select.rb +19 -0
- data/lib/oscal/serializer.rb +17 -4
- data/lib/oscal/set_parameter.rb +30 -0
- data/lib/oscal/telephone_number.rb +10 -0
- data/lib/oscal/test.rb +10 -0
- data/lib/oscal/url.rb +10 -0
- data/lib/oscal/value.rb +36 -0
- data/lib/oscal/version.rb +1 -1
- data/lib/oscal/with_id.rb +39 -0
- data/lib/oscal.rb +1 -13
- data/oscal.gemspec +9 -11
- data/spec/oscal/catalog_spec.rb +39 -0
- data/spec/oscal_spec.rb +7 -0
- data/spec/spec_helper.rb +15 -0
- metadata +65 -9
- data/lib/oscal/component.rb +0 -14
- data/lib/oscal/prose.rb +0 -13
- data/lib/oscal/statement.rb +0 -12
data/lib/oscal/parameter.rb
CHANGED
@@ -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
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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 "
|
1
|
+
require_relative "base_class"
|
2
2
|
|
3
3
|
module Oscal
|
4
|
-
class Part
|
5
|
-
|
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
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
Part.wrap(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
data/lib/oscal/party.rb
ADDED
@@ -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
|
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
|
-
|
3
|
-
|
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
|
-
|
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
|
data/lib/oscal/property.rb
CHANGED
@@ -1,32 +1,10 @@
|
|
1
|
-
require_relative "
|
1
|
+
require_relative "base_class"
|
2
2
|
|
3
3
|
module Oscal
|
4
|
-
class Property
|
5
|
-
|
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
|
data/lib/oscal/remove.rb
ADDED
@@ -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
|
data/lib/oscal/rlink.rb
ADDED
@@ -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
|
data/lib/oscal/select.rb
ADDED
@@ -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
|
data/lib/oscal/serializer.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
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.
|
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}=")
|
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
|
data/lib/oscal/test.rb
ADDED
data/lib/oscal/url.rb
ADDED
data/lib/oscal/value.rb
ADDED
@@ -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
@@ -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
|
-
|
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 = ["
|
9
|
-
spec.email = ["
|
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.
|
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
|
-
|
21
|
-
|
22
|
-
|
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
|
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
|