cddl 0.8.8 → 0.12.14

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/bin/cddl +51 -15
  3. data/cddl.gemspec +11 -7
  4. data/data/cddl.abnf +30 -13
  5. data/lib/cbor-pp-play.rb +1 -0
  6. data/lib/cddl.rb +726 -74
  7. data/test/test-cddl.rb +53 -2
  8. data/test-data/7807.cddl +14 -0
  9. data/test-data/abignum.cddl +1 -0
  10. data/test-data/abnf1.cddl +3 -0
  11. data/test-data/abnf2.cddl +37 -0
  12. data/test-data/abnf3.cddl +32 -0
  13. data/test-data/b64c-sloppy.cddl +1 -0
  14. data/test-data/b64c.cddl +1 -0
  15. data/test-data/b64u-strict.cddl +12 -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 +4 -0
  24. data/test-data/catb64.cddl +8 -0
  25. data/test-data/complex-occ.cddl +11 -0
  26. data/test-data/coral.cddl +10 -0
  27. data/test-data/coral1.cddl +5 -0
  28. data/test-data/coral2.cddl +7 -0
  29. data/test-data/coral3.cddl +7 -0
  30. data/test-data/decimal-warn.cddl +1 -0
  31. data/test-data/decimal.cddl +1 -0
  32. data/test-data/decimal2.cddl +1 -0
  33. data/test-data/det1.cddl +12 -0
  34. data/test-data/dotplus1.cddl +3 -0
  35. data/test-data/dotplus2.cddl +3 -0
  36. data/test-data/dotplus3.cddl +3 -0
  37. data/test-data/dotplus4.cddl +3 -0
  38. data/test-data/enum.cddl +14 -0
  39. data/test-data/enum1.cddl +12 -0
  40. data/test-data/feat1.cddl +4 -0
  41. data/test-data/feature-controller.cddl +6 -0
  42. data/test-data/feature-detail.cddl +5 -0
  43. data/test-data/foo.cddl +1 -0
  44. data/test-data/hex.cddl +1 -0
  45. data/test-data/hexlc.cddl +1 -0
  46. data/test-data/hexuc.cddl +1 -0
  47. data/test-data/homenet-de.cddl +12 -0
  48. data/test-data/homenet-fe.cddl +12 -0
  49. data/test-data/jim-cut-2.cddl +11 -0
  50. data/test-data/jim-cut.cddl +12 -0
  51. data/test-data/join.cddl +1 -0
  52. data/test-data/joini.cddl +1 -0
  53. data/test-data/joinx.cddl +1 -0
  54. data/test-data/json.cddl +1 -0
  55. data/test-data/json1.cddl +15 -0
  56. data/test-data/json2.cddl +1 -0
  57. data/test-data/jsoniodef.cddl +719 -0
  58. data/test-data/jwt.cddl +15 -0
  59. data/test-data/lint1.cddl +9 -0
  60. data/test-data/mdl-ble.cddl +9 -0
  61. data/test-data/mdl-deve.cddl +54 -0
  62. data/test-data/mdl-dp.cddl +11 -0
  63. data/test-data/mdl-mso.cddl +20 -0
  64. data/test-data/mdl-request.cddl +26 -0
  65. data/test-data/mdl-response.cddl +66 -0
  66. data/test-data/mdl.cddl +11 -0
  67. data/test-data/mon-val.cddl +1 -0
  68. data/test-data/multipart-ct.cddl +2 -0
  69. data/test-data/named-group.cddl +7 -0
  70. data/test-data/non-empty.cddl +5 -0
  71. data/test-data/oid.cddl +8 -0
  72. data/test-data/oidbat.cddl +8 -0
  73. data/test-data/plus.cddl +3 -0
  74. data/test-data/prim.cddl +7 -0
  75. data/test-data/printf.cddl +2 -0
  76. data/test-data/printf0.cddl +1 -0
  77. data/test-data/printf1.cddl +2 -0
  78. data/test-data/printf2.cddl +2 -0
  79. data/test-data/printf3.cddl +2 -0
  80. data/test-data/sasl.cddl +24 -0
  81. data/test-data/sequence.cddl +1 -0
  82. data/test-data/sipos.cddl +8 -0
  83. data/test-data/star-edited.cddl +98 -0
  84. data/test-data/star.cddl +95 -0
  85. data/test-data/test-gen.cddl +3 -0
  86. data/test-data/time.cddl +11 -0
  87. data/test-data/valemb.cddl +16 -0
  88. data/test-data/yangid.cddl +1 -0
  89. data/test-data/yaron1.cddl +95 -0
  90. metadata +148 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c877883cb125426e061f527ba4375c0f021d70dfef060336fe0bb0f5e2ca3d4
4
- data.tar.gz: 7a3dc4065f3616bf57c229b410782b35140018ecada4418c0ef45056c62aef0b
3
+ metadata.gz: a4b5bfb31fd9b7fcf4cf66a1d0f2a76550c9682215c486d99a03997bab1ae30b
4
+ data.tar.gz: 97f11378fb18576f115ffb8cbd668fe9e14e33e91e4aac01d874c69e206f2fbd
5
5
  SHA512:
6
- metadata.gz: b3987fbe82e80dddba2f650b1a12941ed6092708297302cf1a78dfe45b20b79d08e85901cb8739b5fc79eab8cde70ca8efb88698f4340da72c722a7a461565c6
7
- data.tar.gz: 68c35688bac9b30411ee419e171860c463df28c3452bce1741399274e51295b609e0acc8df54e9876037f9d96ba02e369fd9465c2fe7c38bb9682d5ec19018cd
6
+ metadata.gz: 623f3945c3fff7c04dd2a4e1c77879d585d347092c87b54d5ead6b8fb3ed3c5ab68a58ae67b7f3f936437c8bc9f92dea6f8597509ba8913fbc5e2e47f43d398a
7
+ data.tar.gz: a04d3f282b0d42182f63dd66988fece8fb0ab7ddb4e159b2f8213705503cff0a97b622a172096b881dc4fe70f16bdcc48a51fa035413bc55421bb5e15d1bcda3
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'
@@ -7,29 +7,41 @@ require 'json'
7
7
 
8
8
  Encoding.default_external = "UTF-8" # wake up, smell the coffee
9
9
 
10
+ CDDL_VERSION = Gem.loaded_specs["cddl"].version rescue "unknown-version"
11
+
10
12
  EX_USAGE = 64
11
13
  EX_DATAERR = 65
12
14
 
13
15
  def usage
16
+ warn "cddl tool version #{CDDL_VERSION}"
14
17
  warn "Usage:"
15
18
  warn "#$0 spec.cddl generate [n]"
16
19
  warn "#$0 spec.cddl json-generate [n]"
17
- warn "#$0 spec.cddl validate instance.cbor"
18
- warn "#$0 spec.cddl validate instance.json"
20
+ warn "#$0 spec.cddl validate instance.cbor..."
21
+ warn "#$0 spec.cddl validate instance.json..."
19
22
  exit EX_USAGE
20
23
  end
21
24
 
22
- def read_arg(arg)
25
+ def utfify(s)
26
+ s.force_encoding(Encoding::UTF_8).scrub { |c|
27
+ warn "*** replaced invalid UTF-8 byte sequence #{c.inspect} by U+FFFD REPLACEMENT CHARACTER"
28
+ 0xFFFD.chr(Encoding::UTF_8)
29
+ }
30
+ end
31
+
32
+ def read_arg(arg, remember_fn = true)
23
33
  if arg == "-"
34
+ $fn = "(stdin)" if remember_fn
24
35
  STDIN.read
25
36
  else
26
37
  usage unless arg
38
+ $fn = arg if remember_fn
27
39
  File.read(arg, mode: "rb")
28
40
  end
29
41
  end
30
42
 
31
43
  def parser
32
- @parser ||= CDDL::Parser.new(read_arg(ARGV[0]))
44
+ @parser ||= CDDL::Parser.new(utfify(read_arg(ARGV[0], false)))
33
45
  end
34
46
 
35
47
  def my_pp(v)
@@ -48,13 +60,19 @@ def my_diag(v)
48
60
  end
49
61
  end
50
62
 
63
+ retcode = 0
64
+
51
65
  begin
52
66
  case ARGV[1]
53
- when /\A.p/
67
+ when /\A..*p/
54
68
  $annotate = true
55
69
  require_relative '../lib/cbor-pp'
56
70
  end
57
71
  case ARGV[1]
72
+ when /\A..*s/
73
+ $sequence = true
74
+ end
75
+ case ARGV[1]
58
76
  when /\Ar/ # secret
59
77
  $advanced = true
60
78
  my_pp parser.rules
@@ -81,15 +99,31 @@ begin
81
99
  g = parser.generate
82
100
  puts JSON.pretty_generate(g)
83
101
  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
102
+ when /\Av(v)?/
103
+ verbose = $1
104
+ ARGV[2..-1].each do |fn|
105
+ instance = read_arg(fn)
106
+ instance = if $sequence
107
+ CBOR.decode("\x9f".b << instance.b << "\xff".b)
108
+ else
109
+ begin
110
+ CBOR.decode(instance.b)
111
+ rescue => e
112
+ warn e.inspect if verbose
113
+ JSON.load(utfify(instance))
114
+ end
115
+ end
116
+ instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
117
+ warn "#{fn}:" if verbose
118
+ ann = parser.validate(instance)
119
+ # my_pp ann
120
+ instance.cbor_add_annotations_from(ann) rescue nil
121
+ my_diag(instance) if $annotate
122
+ warn "ann: #{!!ann}" if verbose
123
+ unless ann
124
+ retcode = 1
125
+ end
126
+ end
93
127
  else
94
128
  usage
95
129
  end
@@ -97,3 +131,5 @@ rescue CDDL::ParseError => e
97
131
  warn e.message
98
132
  exit EX_DATAERR
99
133
  end
134
+
135
+ exit retcode
data/cddl.gemspec CHANGED
@@ -1,21 +1,25 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.8.8'
3
+ s.version = '0.12.14'
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
- s.add_dependency('abnc')
8
- s.add_dependency('json')
9
- s.add_dependency('regexp-examples') # , '1.1.0')
7
+ s.add_dependency('abnc', '~> 0.1.1')
8
+ s.add_dependency('json_pure')
9
+ s.add_dependency('abnftt')
10
+ s.add_dependency('regexp-examples', '~> 1.5.1') # , '1.1.0')
10
11
  s.add_dependency('colorize')
12
+ s.add_dependency('base32', '~> 0.3')
13
+ s.add_dependency('base45_lite', '~> 1.0')
14
+ s.add_dependency('scanf', '~> 1.0')
11
15
  s.files = `git ls-files`.split("\n").grep(/^[a-z]/)
12
16
  s.files = Dir['lib/**/*.rb'] + %w(cddl.gemspec) + Dir['data/**/*.abnf'] + Dir['data/**/*.cddl'] + Dir['test-data/**/*.cddl'] + Dir['test/**/*.rb']
13
17
  s.require_path = 'lib'
14
18
  s.executables = ['cddl']
15
- s.default_executable = 'cddl'
16
- s.required_ruby_version = '>= 2.0'
19
+ s.required_ruby_version = '>= 2.3'
17
20
  s.author = "Carsten Bormann"
18
21
  s.email = "cabo@tzi.org"
19
- s.homepage = "http://github.com/cabo/cddl"
22
+ s.homepage = "https://www.rfc-editor.org/rfc/rfc8610#appendix-F"
20
23
  s.license = 'MIT'
21
24
  end
25
+
data/data/cddl.abnf CHANGED
@@ -13,14 +13,18 @@ genericarg = "<" S type1 S *("," S type1 S ) ">"
13
13
  type = type1 S *("/" S type1 S)
14
14
 
15
15
  type1 = type2 [S (rangeop / annotator) S type2]
16
- / "#" "6" ["." uint] "(" S type S ")" ; note no space!
16
+ / "#" "6" ["." headnumber] "(" S type S ")" ; note no space!
17
+ / "#" "7" ["." headnumber] ; note no space!
17
18
  / "#" DIGIT ["." uint] ; major/ai
18
19
  / "#" ; any
20
+ / "~" S typename [genericarg]
19
21
  / "{" S group S "}"
20
22
  / "[" S group S "]"
21
23
  / "&" S "(" S group S ")"
22
24
  / "&" S groupname [genericarg]
23
25
 
26
+ headnumber = uint / ("<" type ">")
27
+
24
28
  type2 = value
25
29
  / typename [genericarg]
26
30
  / "(" type ")"
@@ -37,7 +41,7 @@ grpent = [occur S] [memberkey S] type optcom
37
41
  / [occur S] groupname [genericarg] optcom ; preempted by above
38
42
  / [occur S] "(" S group S ")" optcom
39
43
 
40
- memberkey = type1 S "=>"
44
+ memberkey = type1 S ["^" S] "=>"
41
45
  / bareword S ":"
42
46
  / value S ":"
43
47
 
@@ -61,32 +65,45 @@ value = number
61
65
  int = ["-"] uint
62
66
 
63
67
  ; This is a float if it has fraction or exponent; int otherwise
64
- number = int ["." fraction] ["e" exponent ]
68
+ number = hexfloat / (int ["." fraction] ["e" exponent ])
69
+ hexfloat = ["-"] "0x" 1*HEXDIG ["." 1*HEXDIG] "p" exponent
65
70
  fraction = 1*DIGIT
66
- exponent = int
71
+ exponent = ["+"/"-"] 1*DIGIT
67
72
 
68
73
  text = %x22 *SCHAR %x22
69
- SCHAR = %x20-21 / %x23-7E / SESC
70
- SESC = "\" %x20-7E
74
+ SCHAR = %x20-21 / %x23-5B / %x5D-7E / NONASCII / SESC
75
+
76
+ SESC = "\" ( %x22 / "/" / "\" / ; \" \/ \\
77
+ %x62 / %x66 / %x6E / %x72 / %x74 / ; \b \f \n \r \t
78
+ (%x75 hexchar) ) ; \uXXXX
79
+
80
+ hexchar = "{" (1*"0" [ hexscalar ] / hexscalar) "}" /
81
+ non-surrogate / (high-surrogate "\" %x75 low-surrogate)
82
+ non-surrogate = ((DIGIT / "A"/"B"/"C" / "E"/"F") HEXDIG HEXDIG HEXDIG) /
83
+ ("D" %x30-37 HEXDIG HEXDIG)
84
+ high-surrogate = "D" ("8"/"9"/"A"/"B") HEXDIG HEXDIG
85
+ low-surrogate = "D" ("C"/"D"/"E"/"F") HEXDIG HEXDIG
86
+ hexscalar = "10" HEXDIG HEXDIG HEXDIG HEXDIG / HEXDIG1 HEXDIG HEXDIG HEXDIG HEXDIG
87
+ / non-surrogate / HEXDIG [HEXDIG [HEXDIG]]
71
88
 
72
89
  bytes = [bsqual] %x27 *BCHAR %x27
73
- BCHAR = %x20-26 / %x28-7E / SESC / CRLF
74
- bsqual = %x68 ; "h"
75
- / %x62.36.34 ; "b64"
90
+ BCHAR = %x20-26 / %x28-5B / %x5D-7E / NONASCII / SESC / "\'" / CRLF
91
+ bsqual = "h" / "b64"
76
92
 
77
93
  id = EALPHA *(*("-" / ".") (EALPHA / DIGIT))
78
94
  ALPHA = %x41-5A / %x61-7A
79
- EALPHA = %x41-5A / %x61-7A / "@" / "_" / "$"
95
+ EALPHA = ALPHA / "@" / "_" / "$"
80
96
  DIGIT = %x30-39
81
97
  DIGIT1 = %x31-39
82
98
  HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
99
+ HEXDIG1 = DIGIT1 / "A" / "B" / "C" / "D" / "E" / "F"
83
100
  BINDIG = %x30-31
84
101
 
85
102
  S = *WS
86
103
  WS = SP / NL
87
104
  SP = %x20
88
105
  NL = COMMENT / CRLF
89
- COMMENT = ";" *(SP / VCHAR) CRLF
90
- VCHAR = %x21-7E
106
+ COMMENT = ";" *PCHAR CRLF
107
+ PCHAR = %x20-7E / NONASCII
108
+ NONASCII = %xA0-D7FF / %xE000-10FFFD
91
109
  CRLF = %x0A / %x0D.0A
92
-
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