oscal 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.docker/Dockerfile +19 -0
- data/.docker/Makefile +43 -0
- data/.docker/docker-compose.yml +14 -0
- data/.docker/readme.md +61 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +24 -0
- data/.gitignore +13 -0
- data/.gitmodules +3 -0
- data/.hound.yml +5 -0
- data/.rspec +0 -1
- data/.rubocop.yml +10 -0
- data/.ruby-version +1 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/Makefile +1 -0
- data/README.adoc +66 -0
- data/Rakefile +13 -6
- data/bin/console +30 -0
- data/bin/rspec +27 -0
- data/bin/setup +8 -0
- data/docker-compose.yml +1 -0
- data/exe/convert2oscalyaml.rb +560 -0
- data/lib/oscal/add.rb +26 -0
- data/lib/oscal/address.rb +22 -0
- data/lib/oscal/address_line.rb +11 -0
- data/lib/oscal/alter.rb +22 -0
- data/lib/oscal/assembly.rb +119 -0
- data/lib/oscal/assessment_plan.rb +28 -0
- data/lib/oscal/assessment_result.rb +230 -0
- data/lib/oscal/attribute_type_hash.rb +80 -0
- data/lib/oscal/back_matter.rb +20 -0
- data/lib/oscal/base64_object.rb +11 -0
- data/lib/oscal/base_class.rb +50 -0
- data/lib/oscal/catalog.rb +51 -10
- data/lib/oscal/choice.rb +11 -0
- data/lib/oscal/citation.rb +22 -0
- data/lib/oscal/combine.rb +11 -0
- data/lib/oscal/common_utils.rb +35 -0
- data/lib/oscal/constraint.rb +20 -0
- data/lib/oscal/control.rb +20 -30
- data/lib/oscal/custom.rb +22 -0
- data/lib/oscal/datatypes.rb +50 -0
- data/lib/oscal/document_id.rb +11 -0
- data/lib/oscal/email_address.rb +11 -0
- data/lib/oscal/exclude_control.rb +22 -0
- data/lib/oscal/external_id.rb +11 -0
- data/lib/oscal/group.rb +26 -34
- data/lib/oscal/guideline.rb +11 -0
- data/lib/oscal/hash_object.rb +11 -0
- data/lib/oscal/import_object.rb +22 -0
- data/lib/oscal/include_control.rb +22 -0
- data/lib/oscal/insert_control.rb +22 -0
- data/lib/oscal/link.rb +11 -0
- data/lib/oscal/list.rb +160 -0
- data/lib/oscal/location.rb +31 -0
- data/lib/oscal/location_uuid.rb +11 -0
- data/lib/oscal/logger.rb +8 -0
- data/lib/oscal/matching.rb +11 -0
- data/lib/oscal/member_of_organization.rb +11 -0
- data/lib/oscal/merge.rb +20 -0
- data/lib/oscal/metadata_block.rb +28 -13
- data/lib/oscal/modify.rb +22 -0
- data/lib/oscal/parameter.rb +22 -19
- data/lib/oscal/parsing_functions.rb +19 -0
- data/lib/oscal/part.rb +14 -22
- data/lib/oscal/party.rb +36 -0
- data/lib/oscal/party_uuid.rb +11 -0
- data/lib/oscal/profile.rb +33 -7
- data/lib/oscal/property.rb +4 -25
- data/lib/oscal/remove.rb +11 -0
- data/lib/oscal/resource.rb +29 -0
- data/lib/oscal/responsible_party.rb +24 -0
- data/lib/oscal/revision.rb +23 -0
- data/lib/oscal/rlink.rb +20 -0
- data/lib/oscal/role.rb +22 -0
- data/lib/oscal/select.rb +20 -0
- data/lib/oscal/serializer.rb +17 -4
- data/lib/oscal/set_parameter.rb +31 -0
- data/lib/oscal/telephone_number.rb +11 -0
- data/lib/oscal/test.rb +11 -0
- data/lib/oscal/url.rb +11 -0
- data/lib/oscal/value.rb +37 -0
- data/lib/oscal/version.rb +1 -1
- data/lib/oscal/with_id.rb +40 -0
- data/lib/oscal.rb +1 -13
- data/oscal.gemspec +9 -11
- data/spec/oscal/catalog_spec.rb +40 -0
- data/spec/oscal_spec.rb +7 -0
- data/spec/sample_inputs/import-ap.json +4 -0
- data/spec/spec_helper.rb +15 -0
- metadata +84 -10
- data/lib/oscal/component.rb +0 -14
- data/lib/oscal/prose.rb +0 -13
- data/lib/oscal/statement.rb +0 -12
data/lib/oscal/metadata_block.rb
CHANGED
@@ -1,21 +1,36 @@
|
|
1
|
-
|
2
|
-
class MetadataBlock
|
1
|
+
require_relative "base_class"
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
module Oscal
|
4
|
+
class MetadataBlock < Oscal::BaseClass
|
5
|
+
KEY = %i(title published last_modified version
|
6
|
+
oscal_version revisions document_ids props links roles
|
7
|
+
locations parties responsible_parties remarks)
|
6
8
|
|
7
|
-
attr_accessor *
|
9
|
+
attr_accessor *KEY
|
8
10
|
|
9
|
-
|
10
|
-
options.each_pair.each do |key,val|
|
11
|
-
key_name = key.gsub('-','_')
|
11
|
+
attr_serializable *KEY
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def set_value(key_name, val)
|
14
|
+
case key_name
|
15
|
+
when "revisions"
|
16
|
+
Revision.wrap(val)
|
17
|
+
when "docuement_ids"
|
18
|
+
DocumentId.wrap(val)
|
19
|
+
when "props"
|
20
|
+
Property.wrap(val)
|
21
|
+
when "links"
|
22
|
+
Link.wrap(val)
|
23
|
+
when "roles"
|
24
|
+
Role.wrap(val)
|
25
|
+
when "locations"
|
26
|
+
Location.wrap(val)
|
27
|
+
when "parties"
|
28
|
+
Party.wrap(val)
|
29
|
+
when "responsible_parties"
|
30
|
+
ResponsibleParty.wrap(val)
|
31
|
+
else
|
32
|
+
val
|
17
33
|
end
|
18
34
|
end
|
19
|
-
|
20
35
|
end
|
21
36
|
end
|
data/lib/oscal/modify.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "base_class"
|
2
|
+
|
3
|
+
module Oscal
|
4
|
+
class Modify < Oscal::BaseClass
|
5
|
+
KEY = %i(set_parameters alters)
|
6
|
+
|
7
|
+
attr_accessor *KEY
|
8
|
+
|
9
|
+
attr_serializable *KEY
|
10
|
+
|
11
|
+
def set_value(key_name, val)
|
12
|
+
case key_name
|
13
|
+
when "set_parameters"
|
14
|
+
SetParameter.wrap(val)
|
15
|
+
when "alters"
|
16
|
+
Alter.wrap(val)
|
17
|
+
else
|
18
|
+
val
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/oscal/parameter.rb
CHANGED
@@ -1,27 +1,30 @@
|
|
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
|
6
9
|
|
7
|
-
|
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
|
10
|
+
attr_serializable *KEY
|
23
11
|
|
24
|
-
|
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
|
25
28
|
end
|
26
29
|
end
|
27
30
|
end
|
@@ -0,0 +1,19 @@
|
|
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
CHANGED
@@ -1,31 +1,23 @@
|
|
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
|
-
attr_serializable *KEY
|
10
|
-
|
11
|
-
def self.wrap(obj)
|
12
|
-
return obj if obj.is_a? Part
|
13
|
-
return Part.new(obj) unless obj.is_a? Array
|
14
8
|
|
15
|
-
|
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
|
9
|
+
attr_serializable *KEY
|
27
10
|
|
28
|
-
|
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
|
29
21
|
end
|
30
22
|
end
|
31
23
|
end
|
data/lib/oscal/party.rb
ADDED
@@ -0,0 +1,36 @@
|
|
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
|
data/lib/oscal/profile.rb
CHANGED
@@ -1,11 +1,37 @@
|
|
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
|
+
|
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"]
|
4
33
|
|
5
|
-
|
6
|
-
@metadata = metadata
|
7
|
-
@imports = imports
|
8
|
-
@controls = controls
|
34
|
+
Profile.new(uuid, metadata, imports, merge, modify, back_matter)
|
9
35
|
end
|
10
36
|
end
|
11
|
-
end
|
37
|
+
end
|
data/lib/oscal/property.rb
CHANGED
@@ -1,32 +1,11 @@
|
|
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
|
-
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
8
|
|
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 Property")
|
26
|
-
end
|
27
|
-
|
28
|
-
self.send("#{key_name}=", val)
|
29
|
-
end
|
30
|
-
end
|
9
|
+
attr_serializable *KEY
|
31
10
|
end
|
32
11
|
end
|
data/lib/oscal/remove.rb
ADDED
@@ -0,0 +1,29 @@
|
|
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
|
@@ -0,0 +1,24 @@
|
|
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
|
@@ -0,0 +1,23 @@
|
|
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
ADDED
@@ -0,0 +1,20 @@
|
|
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
ADDED
@@ -0,0 +1,22 @@
|
|
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
ADDED
@@ -0,0 +1,20 @@
|
|
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
|
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,31 @@
|
|
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
|
data/lib/oscal/test.rb
ADDED
data/lib/oscal/url.rb
ADDED
data/lib/oscal/value.rb
ADDED
@@ -0,0 +1,37 @@
|
|
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/version.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
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
|