cddl 0.8.14 → 0.8.19
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/bin/cddl +30 -12
- data/cddl.gemspec +2 -1
- data/lib/cddl.rb +52 -4
- data/test-data/abnf1.cddl +3 -0
- data/test-data/abnf2.cddl +37 -0
- data/test-data/abnf3.cddl +32 -0
- data/test-data/cat-re.cddl +2 -0
- data/test-data/sequence.cddl +1 -0
- metadata +22 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8e344aa8fcd67bc17cbeaba6c564ab2c3b6b9ce63b5df9acdffe060ac32628d3
         | 
| 4 | 
            +
              data.tar.gz: 32410cfe8d62729a6f05e1174871746af3be5998cc2a56fe50bdfc139b53252d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7fad1d715e3acbd3062c8aeb49518148de9a61c6385a09bd3baa7b384e398ce52bce13afa268209ff2fc0763ef1e07aea932857e0489a0c1e94d79429346418c
         | 
| 7 | 
            +
              data.tar.gz: ef603bb0dca1beceb0767e87210b4e3819533924c64014392b694e36a2cc9e41b00f1618484226c950aa804e5690e7c5e7451f527b9ad0379ecc5fda5bed389e
         | 
    
        data/bin/cddl
    CHANGED
    
    | @@ -14,8 +14,8 @@ def usage | |
| 14 14 | 
             
              warn "Usage:"
         | 
| 15 15 | 
             
              warn "#$0 spec.cddl generate [n]"
         | 
| 16 16 | 
             
              warn "#$0 spec.cddl json-generate [n]"
         | 
| 17 | 
            -
              warn "#$0 spec.cddl validate instance.cbor"
         | 
| 18 | 
            -
              warn "#$0 spec.cddl validate instance.json"
         | 
| 17 | 
            +
              warn "#$0 spec.cddl validate instance.cbor..."
         | 
| 18 | 
            +
              warn "#$0 spec.cddl validate instance.json..."
         | 
| 19 19 | 
             
              exit EX_USAGE
         | 
| 20 20 | 
             
            end
         | 
| 21 21 |  | 
| @@ -48,13 +48,19 @@ def my_diag(v) | |
| 48 48 | 
             
              end
         | 
| 49 49 | 
             
            end
         | 
| 50 50 |  | 
| 51 | 
            +
            retcode = 0
         | 
| 52 | 
            +
             | 
| 51 53 | 
             
            begin
         | 
| 52 54 | 
             
              case ARGV[1]
         | 
| 53 | 
            -
              when /\A | 
| 55 | 
            +
              when /\A..*p/
         | 
| 54 56 | 
             
                $annotate = true
         | 
| 55 57 | 
             
                require_relative '../lib/cbor-pp'
         | 
| 56 58 | 
             
              end
         | 
| 57 59 | 
             
              case ARGV[1]
         | 
| 60 | 
            +
              when /\A..*s/
         | 
| 61 | 
            +
                $sequence = true
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
              case ARGV[1]
         | 
| 58 64 | 
             
              when /\Ar/                      # secret
         | 
| 59 65 | 
             
                $advanced = true
         | 
| 60 66 | 
             
                my_pp parser.rules
         | 
| @@ -81,15 +87,25 @@ begin | |
| 81 87 | 
             
                  g = parser.generate
         | 
| 82 88 | 
             
                  puts JSON.pretty_generate(g)
         | 
| 83 89 | 
             
                end
         | 
| 84 | 
            -
              when /\Av | 
| 85 | 
            -
                 | 
| 86 | 
            -
                 | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 90 | 
            +
              when /\Av(v)?/
         | 
| 91 | 
            +
                verbose = $1
         | 
| 92 | 
            +
                ARGV[2..-1].each do |fn|
         | 
| 93 | 
            +
                  instance = read_arg(fn)
         | 
| 94 | 
            +
                  instance = if $sequence
         | 
| 95 | 
            +
                               CBOR.decode("\x9f".b << instance.b << "\xff".b)
         | 
| 96 | 
            +
                             else
         | 
| 97 | 
            +
                               CBOR.decode(instance.b) rescue JSON.load(instance)
         | 
| 98 | 
            +
                             end
         | 
| 99 | 
            +
                  instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
         | 
| 100 | 
            +
                  warn "#{fn}:" if verbose
         | 
| 101 | 
            +
                  ann = parser.validate(instance)
         | 
| 102 | 
            +
                  # my_pp ann
         | 
| 103 | 
            +
                  instance.cbor_add_annotations_from(ann) rescue nil
         | 
| 104 | 
            +
                  my_diag(instance) if $annotate
         | 
| 105 | 
            +
                  unless ann
         | 
| 106 | 
            +
                    retcode = 1
         | 
| 107 | 
            +
                  end
         | 
| 108 | 
            +
                end
         | 
| 93 109 | 
             
              else
         | 
| 94 110 | 
             
                usage
         | 
| 95 111 | 
             
              end
         | 
| @@ -97,3 +113,5 @@ rescue CDDL::ParseError => e | |
| 97 113 | 
             
              warn e.message
         | 
| 98 114 | 
             
              exit EX_DATAERR
         | 
| 99 115 | 
             
            end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
            exit retcode
         | 
    
        data/cddl.gemspec
    CHANGED
    
    | @@ -1,11 +1,12 @@ | |
| 1 1 | 
             
            spec = Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.name = 'cddl'
         | 
| 3 | 
            -
              s.version = '0.8. | 
| 3 | 
            +
              s.version = '0.8.19'
         | 
| 4 4 | 
             
              s.summary = "CDDL generator and validator."
         | 
| 5 5 | 
             
              s.description = %{A parser, generator, and validator for CDDL}
         | 
| 6 6 | 
             
              s.add_dependency('cbor-diag')
         | 
| 7 7 | 
             
              s.add_dependency('abnc')
         | 
| 8 8 | 
             
              s.add_dependency('json')
         | 
| 9 | 
            +
              s.add_dependency('abnftt')
         | 
| 9 10 | 
             
              s.add_dependency('regexp-examples') # , '1.1.0')
         | 
| 10 11 | 
             
              s.add_dependency('colorize')
         | 
| 11 12 | 
             
              s.files = `git ls-files`.split("\n").grep(/^[a-z]/)
         | 
    
        data/lib/cddl.rb
    CHANGED
    
    | @@ -3,6 +3,7 @@ require 'pp' | |
| 3 3 | 
             
            require 'pathname'
         | 
| 4 4 | 
             
            require 'cbor-pure' unless defined?(CBOR::Tagged)
         | 
| 5 5 | 
             
            require 'regexp-examples'
         | 
| 6 | 
            +
            require 'abnftt'
         | 
| 6 7 | 
             
            require 'colorize'
         | 
| 7 8 | 
             
            require 'base64'
         | 
| 8 9 |  | 
| @@ -249,6 +250,16 @@ module CDDL | |
| 249 250 | 
             
                  h[k] = Regexp.new("\\A#{k}\\z")
         | 
| 250 251 | 
             
                }
         | 
| 251 252 |  | 
| 253 | 
            +
                ABNF_PARSER_FOR_STRING = Hash.new {|h, k|
         | 
| 254 | 
            +
                  grammar = "cddl-t0p--1eve1-f0r--abnf = " << k # XXX
         | 
| 255 | 
            +
                  h[k] = ABNF.from_abnf(grammar)
         | 
| 256 | 
            +
                }
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                ABNF_ENCODING_FOR_CONOP = {
         | 
| 259 | 
            +
                  abnf: Encoding::UTF_8,
         | 
| 260 | 
            +
                  abnfb: Encoding::BINARY
         | 
| 261 | 
            +
                }
         | 
| 262 | 
            +
             | 
| 252 263 | 
             
                def generate
         | 
| 253 264 | 
             
                  @recursion = 0
         | 
| 254 265 | 
             
                  generate1(rules)
         | 
| @@ -504,6 +515,19 @@ module CDDL | |
| 504 515 | 
             
                        fail "Don't know yet how to generate #{where}"
         | 
| 505 516 | 
             
                      end
         | 
| 506 517 | 
             
                      REGEXP_FOR_STRING[regexp].random_example(max_repeater_variance: 5)
         | 
| 518 | 
            +
                    when :abnf, :abnfb
         | 
| 519 | 
            +
                      grammar = generate1(control)
         | 
| 520 | 
            +
                      bytes = true if target == [:prim, 2]
         | 
| 521 | 
            +
                      bytes = false if target == [:prim, 3]
         | 
| 522 | 
            +
                      unless !bytes.nil? && String === grammar
         | 
| 523 | 
            +
                        fail "Don't know yet how to generate #{where}"
         | 
| 524 | 
            +
                      end
         | 
| 525 | 
            +
                      out = ABNF_PARSER_FOR_STRING[grammar].generate
         | 
| 526 | 
            +
                      if where[1] == :abnfb
         | 
| 527 | 
            +
                        out = out.codepoints.pack("C*")
         | 
| 528 | 
            +
                      end
         | 
| 529 | 
            +
                      enc = bytes ? Encoding::BINARY : Encoding::UTF_8
         | 
| 530 | 
            +
                      out.force_encoding(enc)
         | 
| 507 531 | 
             
                    when :cbor, :cborseq
         | 
| 508 532 | 
             
                      unless target == [:prim, 2]
         | 
| 509 533 | 
             
                        fail "Don't know yet how to generate #{where}"
         | 
| @@ -606,7 +630,10 @@ module CDDL | |
| 606 630 | 
             
                  if warn
         | 
| 607 631 | 
             
                    if result
         | 
| 608 632 | 
             
                      if $features != {}
         | 
| 609 | 
            -
                         | 
| 633 | 
            +
                        ok = ENV["CDDL_FEATURE_OK"] and ok = ok.split(/,\s*/) or ok = []
         | 
| 634 | 
            +
                        # warn([:OK, ok, $features].inspect)
         | 
| 635 | 
            +
                        features = $features.reject {|k, v| ok.include? k.to_s }
         | 
| 636 | 
            +
                        warn "** Features potentially used: #{features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}" if features != {}
         | 
| 610 637 | 
             
                      end
         | 
| 611 638 | 
             
                    else
         | 
| 612 639 | 
             
                      warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
         | 
| @@ -619,7 +646,7 @@ module CDDL | |
| 619 646 |  | 
| 620 647 | 
             
                def validate_result(check)
         | 
| 621 648 | 
             
                  check || (
         | 
| 622 | 
            -
                    @last_message  | 
| 649 | 
            +
                    @last_message << yield
         | 
| 623 650 | 
             
                    false
         | 
| 624 651 | 
             
                  )
         | 
| 625 652 | 
             
                end
         | 
| @@ -652,7 +679,9 @@ module CDDL | |
| 652 679 | 
             
                        ann.concat(ann2)
         | 
| 653 680 | 
             
                      end
         | 
| 654 681 | 
             
                      if occ < s
         | 
| 655 | 
            -
                         | 
| 682 | 
            +
                        # warn "*** lme #{@last_message.encoding} #{@last_message}"
         | 
| 683 | 
            +
                        # warn "*** #{"\noccur #{occ} < #{s}, not reached at #{i} in array #{d} for #{where}".encoding}"
         | 
| 684 | 
            +
                        @last_message << "\noccur #{occ} < #{s}, not reached at #{i} in array #{d} for #{where}"
         | 
| 656 685 | 
             
                        return [false, ann]
         | 
| 657 686 | 
             
                      end
         | 
| 658 687 | 
             
                    end
         | 
| @@ -893,6 +922,24 @@ module CDDL | |
| 893 922 | 
             
                          end
         | 
| 894 923 | 
             
                        end
         | 
| 895 924 | 
             
                        )
         | 
| 925 | 
            +
                      when :abnf, :abnfb
         | 
| 926 | 
            +
                        ann if (
         | 
| 927 | 
            +
                        if String === d
         | 
| 928 | 
            +
                          ok, v, vt = extract_value(control)
         | 
| 929 | 
            +
                          if ok && vt == String
         | 
| 930 | 
            +
                            begin
         | 
| 931 | 
            +
                              ABNF_PARSER_FOR_STRING[v].validate(
         | 
| 932 | 
            +
                                d.dup.force_encoding(ABNF_ENCODING_FOR_CONOP[conop]).codepoints.pack("U*")
         | 
| 933 | 
            +
                              )
         | 
| 934 | 
            +
                              true
         | 
| 935 | 
            +
                            rescue => e
         | 
| 936 | 
            +
                              # warn "*** #{e}" # XXX
         | 
| 937 | 
            +
                              @last_message = e.to_s.force_encoding(Encoding::UTF_8)
         | 
| 938 | 
            +
                              nil
         | 
| 939 | 
            +
                            end
         | 
| 940 | 
            +
                          end
         | 
| 941 | 
            +
                        end
         | 
| 942 | 
            +
                        )
         | 
| 896 943 | 
             
                      when :cbor
         | 
| 897 944 | 
             
                        ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
         | 
| 898 945 | 
             
                      when :cborseq
         | 
| @@ -1247,7 +1294,8 @@ module CDDL | |
| 1247 1294 | 
             
                BRACE = {"{" => :map, "[" => :array}
         | 
| 1248 1295 | 
             
                RANGE_EXCLUDE_END = {".." => false, "..." => true}
         | 
| 1249 1296 | 
             
                SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
         | 
| 1250 | 
            -
                                         :default, :lt, :le, :gt, :ge, :eq, :ne, | 
| 1297 | 
            +
                                         :default, :lt, :le, :gt, :ge, :eq, :ne,
         | 
| 1298 | 
            +
                                         :feature, :abnf, :abnfb, :cat, :plus]
         | 
| 1251 1299 |  | 
| 1252 1300 | 
             
                def type1(n, canbegroup = false)
         | 
| 1253 1301 | 
             
            #      puts "NVALUE #{n.value.inspect}"
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            start = [Tag0, Tag1004]
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ; for draft-ietf-cbor-date-tag
         | 
| 4 | 
            +
            Tag1004 = #6.1004(text .abnf full-date)
         | 
| 5 | 
            +
            ; for RFC 7049
         | 
| 6 | 
            +
            Tag0 = #6.0(text .abnf date-time)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            full-date = "full-date" .cat rfc3339
         | 
| 9 | 
            +
            date-time = "date-time" .cat rfc3339
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ; Note the trick of idiomatically starting with a newline, separating
         | 
| 12 | 
            +
            ;   off the element in the .cat from the rule-list
         | 
| 13 | 
            +
            rfc3339 = '
         | 
| 14 | 
            +
            date-fullyear   = 4DIGIT
         | 
| 15 | 
            +
            date-month      = 2DIGIT  ; 01-12
         | 
| 16 | 
            +
            date-mday       = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on
         | 
| 17 | 
            +
                                    ; month/year
         | 
| 18 | 
            +
            time-hour       = 2DIGIT  ; 00-23
         | 
| 19 | 
            +
            time-minute     = 2DIGIT  ; 00-59
         | 
| 20 | 
            +
            time-second     = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap sec
         | 
| 21 | 
            +
                                    ; rules
         | 
| 22 | 
            +
            time-secfrac    = "." 1*DIGIT
         | 
| 23 | 
            +
            time-numoffset  = ("+" / "-") time-hour ":" time-minute
         | 
| 24 | 
            +
            time-offset     = "Z" / time-numoffset
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            partial-time    = time-hour ":" time-minute ":" time-second
         | 
| 27 | 
            +
                            [time-secfrac]
         | 
| 28 | 
            +
            full-date       = date-fullyear "-" date-month "-" date-mday
         | 
| 29 | 
            +
            full-time       = partial-time time-offset
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            date-time       = full-date "T" full-time
         | 
| 32 | 
            +
            ' .cat rfc5234-core
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            rfc5234-core = '
         | 
| 35 | 
            +
            DIGIT          =  %x30-39 ; 0-9
         | 
| 36 | 
            +
            ; abbreviated here
         | 
| 37 | 
            +
            '
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            start = [tt, tb, bt, bb]
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             | 
| 4 | 
            +
            tt = text .abnf '4DIGIT 1FOO
         | 
| 5 | 
            +
            DIGIT          =  %x30-39 ; 0-9
         | 
| 6 | 
            +
            FOO = %xc0-cf
         | 
| 7 | 
            +
            '
         | 
| 8 | 
            +
            tb = text .abnfb '4DIGIT 1FOO
         | 
| 9 | 
            +
            DIGIT          =  %x30-39 ; 0-9
         | 
| 10 | 
            +
            FOO = %xc0-cf
         | 
| 11 | 
            +
            '
         | 
| 12 | 
            +
            bt = bytes .abnf '4DIGIT 1FOO
         | 
| 13 | 
            +
            DIGIT          =  %x30-39 ; 0-9
         | 
| 14 | 
            +
            FOO = %xc0-cf
         | 
| 15 | 
            +
            '
         | 
| 16 | 
            +
            bb = bytes .abnfb '4DIGIT 1FOO
         | 
| 17 | 
            +
            DIGIT          =  %x30-39 ; 0-9
         | 
| 18 | 
            +
            FOO = %xc0-cf
         | 
| 19 | 
            +
            '
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ; ["7408\xC6", "7073\xC3", h'30383131CD', h'32363738CD']
         | 
| 22 | 
            +
            ; ["5892\u00ca", "2145\u00c6", h'33333338C38B', h'31343033C388']
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
            ; ** ENCOED UTF-8
         | 
| 26 | 
            +
            ; ** ENCOED UTF-8
         | 
| 27 | 
            +
            ; ** ENCOED UTF-8
         | 
| 28 | 
            +
            ; ** ENCOED UTF-8
         | 
| 29 | 
            +
            ; ["5845\u00c6", "9329\u00cb", h'38393538C389', h'33343230C386']
         | 
| 30 | 
            +
             | 
| 31 | 
            +
             | 
| 32 | 
            +
            ; ["1066\u00cc", "9253\xC9", h'38333533C38A', h'32373337C4']
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            a = [tstr, tstr, tstr]
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: cddl
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.8. | 
| 4 | 
            +
              version: 0.8.19
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Carsten Bormann
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-02-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: cbor-diag
         | 
| @@ -52,6 +52,20 @@ dependencies: | |
| 52 52 | 
             
                - - ">="
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 54 | 
             
                    version: '0'
         | 
| 55 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 56 | 
            +
              name: abnftt
         | 
| 57 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 | 
            +
                requirements:
         | 
| 59 | 
            +
                - - ">="
         | 
| 60 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            +
                    version: '0'
         | 
| 62 | 
            +
              type: :runtime
         | 
| 63 | 
            +
              prerelease: false
         | 
| 64 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 | 
            +
                requirements:
         | 
| 66 | 
            +
                - - ">="
         | 
| 67 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            +
                    version: '0'
         | 
| 55 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 70 | 
             
              name: regexp-examples
         | 
| 57 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -100,6 +114,9 @@ files: | |
| 100 114 | 
             
            - test-data/7807.cddl
         | 
| 101 115 | 
             
            - test-data/a.cddl
         | 
| 102 116 | 
             
            - test-data/abignum.cddl
         | 
| 117 | 
            +
            - test-data/abnf1.cddl
         | 
| 118 | 
            +
            - test-data/abnf2.cddl
         | 
| 119 | 
            +
            - test-data/abnf3.cddl
         | 
| 103 120 | 
             
            - test-data/ambig.cddl
         | 
| 104 121 | 
             
            - test-data/b.cddl
         | 
| 105 122 | 
             
            - test-data/badaddr.cddl
         | 
| @@ -107,6 +124,7 @@ files: | |
| 107 124 | 
             
            - test-data/bpv7.cddl
         | 
| 108 125 | 
             
            - test-data/bpv7a.cddl
         | 
| 109 126 | 
             
            - test-data/bpv7b.cddl
         | 
| 127 | 
            +
            - test-data/cat-re.cddl
         | 
| 110 128 | 
             
            - test-data/cdni-ct.cddl
         | 
| 111 129 | 
             
            - test-data/coral.cddl
         | 
| 112 130 | 
             
            - test-data/coral1.cddl
         | 
| @@ -150,6 +168,7 @@ files: | |
| 150 168 | 
             
            - test-data/named-group.cddl
         | 
| 151 169 | 
             
            - test-data/patch1.cddl
         | 
| 152 170 | 
             
            - test-data/reused_named_group.cddl
         | 
| 171 | 
            +
            - test-data/sequence.cddl
         | 
| 153 172 | 
             
            - test-data/structure.cddl
         | 
| 154 173 | 
             
            - test-data/test-gen.cddl
         | 
| 155 174 | 
             
            - test-data/toerless0.cddl
         | 
| @@ -180,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 180 199 | 
             
                - !ruby/object:Gem::Version
         | 
| 181 200 | 
             
                  version: '0'
         | 
| 182 201 | 
             
            requirements: []
         | 
| 183 | 
            -
            rubygems_version: 3. | 
| 202 | 
            +
            rubygems_version: 3.2.3
         | 
| 184 203 | 
             
            signing_key:
         | 
| 185 204 | 
             
            specification_version: 4
         | 
| 186 205 | 
             
            summary: CDDL generator and validator.
         |