oscal 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|