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
         |