cddl 0.8.8 → 0.10.3

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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/bin/cddl +35 -15
  3. data/cddl.gemspec +5 -2
  4. data/data/cddl.abnf +2 -1
  5. data/lib/base45_lite.rb +71 -0
  6. data/lib/cbor-pp-play.rb +1 -0
  7. data/lib/cddl.rb +406 -50
  8. data/test/test-cddl.rb +53 -2
  9. data/test-data/7807.cddl +14 -0
  10. data/test-data/abignum.cddl +1 -0
  11. data/test-data/abnf1.cddl +3 -0
  12. data/test-data/abnf2.cddl +37 -0
  13. data/test-data/abnf3.cddl +32 -0
  14. data/test-data/b64c-sloppy.cddl +1 -0
  15. data/test-data/b64c.cddl +1 -0
  16. data/test-data/b64u.cddl +1 -0
  17. data/test-data/base32.cddl +1 -0
  18. data/test-data/base32hex.cddl +1 -0
  19. data/test-data/bat.cddl +16 -0
  20. data/test-data/bpv7.cddl +136 -0
  21. data/test-data/bpv7a.cddl +181 -0
  22. data/test-data/bpv7b.cddl +167 -0
  23. data/test-data/cat-re.cddl +2 -0
  24. data/test-data/complex-occ.cddl +11 -0
  25. data/test-data/coral.cddl +10 -0
  26. data/test-data/coral1.cddl +5 -0
  27. data/test-data/coral2.cddl +7 -0
  28. data/test-data/coral3.cddl +7 -0
  29. data/test-data/decimal.cddl +1 -0
  30. data/test-data/decimal2.cddl +1 -0
  31. data/test-data/det1.cddl +12 -0
  32. data/test-data/feat1.cddl +4 -0
  33. data/test-data/feature-controller.cddl +6 -0
  34. data/test-data/feature-detail.cddl +5 -0
  35. data/test-data/foo.cddl +1 -0
  36. data/test-data/hex.cddl +1 -0
  37. data/test-data/hexlc.cddl +1 -0
  38. data/test-data/hexuc.cddl +1 -0
  39. data/test-data/homenet-de.cddl +12 -0
  40. data/test-data/homenet-fe.cddl +12 -0
  41. data/test-data/jim-cut-2.cddl +11 -0
  42. data/test-data/jim-cut.cddl +12 -0
  43. data/test-data/join.cddl +1 -0
  44. data/test-data/joini.cddl +1 -0
  45. data/test-data/joinx.cddl +1 -0
  46. data/test-data/json.cddl +1 -0
  47. data/test-data/json2.cddl +1 -0
  48. data/test-data/jsoniodef.cddl +719 -0
  49. data/test-data/lint1.cddl +9 -0
  50. data/test-data/mdl-ble.cddl +9 -0
  51. data/test-data/mdl-deve.cddl +54 -0
  52. data/test-data/mdl-dp.cddl +11 -0
  53. data/test-data/mdl-mso.cddl +20 -0
  54. data/test-data/mdl-request.cddl +26 -0
  55. data/test-data/mdl-response.cddl +66 -0
  56. data/test-data/mdl.cddl +11 -0
  57. data/test-data/mon-val.cddl +1 -0
  58. data/test-data/multipart-ct.cddl +2 -0
  59. data/test-data/named-group.cddl +7 -0
  60. data/test-data/non-empty.cddl +5 -0
  61. data/test-data/oid.cddl +8 -0
  62. data/test-data/oidbat.cddl +8 -0
  63. data/test-data/plus.cddl +3 -0
  64. data/test-data/sasl.cddl +24 -0
  65. data/test-data/sequence.cddl +1 -0
  66. data/test-data/sipos.cddl +8 -0
  67. data/test-data/star-edited.cddl +98 -0
  68. data/test-data/star.cddl +95 -0
  69. data/test-data/test-gen.cddl +3 -0
  70. data/test-data/time.cddl +11 -0
  71. data/test-data/yangid.cddl +1 -0
  72. data/test-data/yaron1.cddl +95 -0
  73. metadata +100 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c877883cb125426e061f527ba4375c0f021d70dfef060336fe0bb0f5e2ca3d4
4
- data.tar.gz: 7a3dc4065f3616bf57c229b410782b35140018ecada4418c0ef45056c62aef0b
3
+ metadata.gz: 9e60b48882767d7e76926473b44c79369891e4203326d4e31f5693a3819f391d
4
+ data.tar.gz: 6ed2f45e7fa8468557e73c96a4dbfdd142d65fdebeeb362efeebec8007b7948f
5
5
  SHA512:
6
- metadata.gz: b3987fbe82e80dddba2f650b1a12941ed6092708297302cf1a78dfe45b20b79d08e85901cb8739b5fc79eab8cde70ca8efb88698f4340da72c722a7a461565c6
7
- data.tar.gz: 68c35688bac9b30411ee419e171860c463df28c3452bce1741399274e51295b609e0acc8df54e9876037f9d96ba02e369fd9465c2fe7c38bb9682d5ec19018cd
6
+ metadata.gz: 2124a4fc046c3dc03d007ca949e4f9191497b359fe19fafe307ed2227c4b5654d909815575504e452add310dfc8487bfc13db94794d4b6c06a7af0bb2701e55f
7
+ data.tar.gz: 8a223332d81282eb9ad651dad887579ceb7b44a01d05ccff6458e271ea999a3c5fad5f81c87a6a2ccf927307b3bb9c4e06075361b0f8fc8b02005926a3d9a5b7
data/bin/cddl CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/env RUBY_THREAD_VM_STACK_SIZE=5000000 ruby
2
2
  # -*- coding: utf-8 -*-
3
3
  # require_relative '../lib/cddl'
4
4
  require 'cddl'
@@ -14,22 +14,24 @@ 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
 
22
- def read_arg(arg)
22
+ def read_arg(arg, remember_fn = true)
23
23
  if arg == "-"
24
+ $fn = "(stdin)" if remember_fn
24
25
  STDIN.read
25
26
  else
26
27
  usage unless arg
28
+ $fn = arg if remember_fn
27
29
  File.read(arg, mode: "rb")
28
30
  end
29
31
  end
30
32
 
31
33
  def parser
32
- @parser ||= CDDL::Parser.new(read_arg(ARGV[0]))
34
+ @parser ||= CDDL::Parser.new(read_arg(ARGV[0], false))
33
35
  end
34
36
 
35
37
  def my_pp(v)
@@ -48,13 +50,19 @@ def my_diag(v)
48
50
  end
49
51
  end
50
52
 
53
+ retcode = 0
54
+
51
55
  begin
52
56
  case ARGV[1]
53
- when /\A.p/
57
+ when /\A..*p/
54
58
  $annotate = true
55
59
  require_relative '../lib/cbor-pp'
56
60
  end
57
61
  case ARGV[1]
62
+ when /\A..*s/
63
+ $sequence = true
64
+ end
65
+ case ARGV[1]
58
66
  when /\Ar/ # secret
59
67
  $advanced = true
60
68
  my_pp parser.rules
@@ -81,15 +89,25 @@ begin
81
89
  g = parser.generate
82
90
  puts JSON.pretty_generate(g)
83
91
  end
84
- when /\Av/
85
- instance = read_arg(ARGV[2])
86
- instance = CBOR.decode(instance.b) rescue JSON.load(instance)
87
- instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
88
- ann = parser.validate(instance)
89
- # my_pp ann
90
- instance.cbor_add_annotations_from(ann) rescue nil
91
- my_diag(instance) if $annotate
92
- exit 1 unless ann
92
+ when /\Av(v)?/
93
+ verbose = $1
94
+ ARGV[2..-1].each do |fn|
95
+ instance = read_arg(fn)
96
+ instance = if $sequence
97
+ CBOR.decode("\x9f".b << instance.b << "\xff".b)
98
+ else
99
+ CBOR.decode(instance.b) rescue JSON.load(instance)
100
+ end
101
+ instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
102
+ warn "#{fn}:" if verbose
103
+ ann = parser.validate(instance)
104
+ # my_pp ann
105
+ instance.cbor_add_annotations_from(ann) rescue nil
106
+ my_diag(instance) if $annotate
107
+ unless ann
108
+ retcode = 1
109
+ end
110
+ end
93
111
  else
94
112
  usage
95
113
  end
@@ -97,3 +115,5 @@ rescue CDDL::ParseError => e
97
115
  warn e.message
98
116
  exit EX_DATAERR
99
117
  end
118
+
119
+ exit retcode
data/cddl.gemspec CHANGED
@@ -1,13 +1,15 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.8.8'
3
+ s.version = '0.10.3'
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
- s.add_dependency('json')
8
+ s.add_dependency('json_pure')
9
+ s.add_dependency('abnftt')
9
10
  s.add_dependency('regexp-examples') # , '1.1.0')
10
11
  s.add_dependency('colorize')
12
+ s.add_dependency('base32', '~> 0.3')
11
13
  s.files = `git ls-files`.split("\n").grep(/^[a-z]/)
12
14
  s.files = Dir['lib/**/*.rb'] + %w(cddl.gemspec) + Dir['data/**/*.abnf'] + Dir['data/**/*.cddl'] + Dir['test-data/**/*.cddl'] + Dir['test/**/*.rb']
13
15
  s.require_path = 'lib'
@@ -19,3 +21,4 @@ spec = Gem::Specification.new do |s|
19
21
  s.homepage = "http://github.com/cabo/cddl"
20
22
  s.license = 'MIT'
21
23
  end
24
+
data/data/cddl.abnf CHANGED
@@ -16,6 +16,7 @@ type1 = type2 [S (rangeop / annotator) S type2]
16
16
  / "#" "6" ["." uint] "(" S type S ")" ; note no space!
17
17
  / "#" DIGIT ["." uint] ; major/ai
18
18
  / "#" ; any
19
+ / "~" S typename [genericarg]
19
20
  / "{" S group S "}"
20
21
  / "[" S group S "]"
21
22
  / "&" S "(" S group S ")"
@@ -70,7 +71,7 @@ SCHAR = %x20-21 / %x23-7E / SESC
70
71
  SESC = "\" %x20-7E
71
72
 
72
73
  bytes = [bsqual] %x27 *BCHAR %x27
73
- BCHAR = %x20-26 / %x28-7E / SESC / CRLF
74
+ BCHAR = %x20-26 / %x28-5B / %x5D-7E / SESC / CRLF
74
75
  bsqual = %x68 ; "h"
75
76
  / %x62.36.34 ; "b64"
76
77
 
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2022 Weihang Jian <https://tonytonyjan.net>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ # An implementation of draft-faltstrom-base45-10, see
24
+ # https://datatracker.ietf.org/doc/draft-faltstrom-base45/
25
+ module Base45Lite
26
+ class Error < ::StandardError; end
27
+ class OverflowError < Error; end
28
+ class InvalidCharacterError < Error; end
29
+ class ForbiddenLengthError < Error; end
30
+
31
+ MAX_UINT18 = 2**16 - 1
32
+ SQUARED_45 = 45**2
33
+ MAPPING = [
34
+ *'0'..'9',
35
+ *'A'..'Z',
36
+ ' ', '$', '%', '*', '+', '-', '.', '/', ':'
37
+ ].map!.with_index { |x, i| [i, x] }.to_h.freeze
38
+ REVERSE_MAPPING = MAPPING.invert.freeze
39
+
40
+ def self.encode(input)
41
+ sequence = []
42
+ input.unpack('n*').map! do |uint16|
43
+ i, c = uint16.divmod(45)
44
+ i, d = i.divmod(45)
45
+ _, e = i.divmod(45)
46
+ sequence.push(c, d, e)
47
+ end
48
+ if input.bytesize.odd?
49
+ i, c = input.getbyte(-1).divmod(45)
50
+ _, d = i.divmod(45)
51
+ sequence.push(c, d)
52
+ end
53
+ sequence.map!{ |n| MAPPING[n] }.join
54
+ end
55
+
56
+ def self.decode(input)
57
+ input
58
+ .chars.map! { |c| REVERSE_MAPPING[c] || raise(InvalidCharacterError) }
59
+ .each_slice(3).map do |slice|
60
+ c, d, e = slice
61
+ raise ForbiddenLengthError if d.nil?
62
+
63
+ sum = c + d * 45
64
+ sum += e * SQUARED_45 if e
65
+ raise OverflowError if sum > MAX_UINT18
66
+
67
+ sum
68
+ end
69
+ .pack((input.length % 3).zero? ? 'n*' : "n#{input.length / 3}C")
70
+ end
71
+ end
data/lib/cbor-pp-play.rb CHANGED
@@ -2,6 +2,7 @@ require_relative "cbor-pp"
2
2
 
3
3
  a = [1, {foo: "bar", busel: "basel", baz: "bass", ant: "cat", bat: "dog", eel: "fox"},
4
4
  2, 3, 4, [3]*55, "foo".b, 0.00006103515625, 0.0000099, 1e-7, nil]
5
+ a[0].cbor_annotation_add "flurp"
5
6
  a[1].cbor_annotation_add "fasel"
6
7
  CBOR::PP.pp a
7
8