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.
- checksums.yaml +4 -4
- data/bin/cddl +51 -15
- data/cddl.gemspec +11 -7
- data/data/cddl.abnf +30 -13
- data/lib/cbor-pp-play.rb +1 -0
- data/lib/cddl.rb +726 -74
- data/test/test-cddl.rb +53 -2
- data/test-data/7807.cddl +14 -0
- data/test-data/abignum.cddl +1 -0
- data/test-data/abnf1.cddl +3 -0
- data/test-data/abnf2.cddl +37 -0
- data/test-data/abnf3.cddl +32 -0
- data/test-data/b64c-sloppy.cddl +1 -0
- data/test-data/b64c.cddl +1 -0
- data/test-data/b64u-strict.cddl +12 -0
- data/test-data/b64u.cddl +1 -0
- data/test-data/base32.cddl +1 -0
- data/test-data/base32hex.cddl +1 -0
- data/test-data/bat.cddl +16 -0
- data/test-data/bpv7.cddl +136 -0
- data/test-data/bpv7a.cddl +181 -0
- data/test-data/bpv7b.cddl +167 -0
- data/test-data/cat-re.cddl +4 -0
- data/test-data/catb64.cddl +8 -0
- data/test-data/complex-occ.cddl +11 -0
- data/test-data/coral.cddl +10 -0
- data/test-data/coral1.cddl +5 -0
- data/test-data/coral2.cddl +7 -0
- data/test-data/coral3.cddl +7 -0
- data/test-data/decimal-warn.cddl +1 -0
- data/test-data/decimal.cddl +1 -0
- data/test-data/decimal2.cddl +1 -0
- data/test-data/det1.cddl +12 -0
- data/test-data/dotplus1.cddl +3 -0
- data/test-data/dotplus2.cddl +3 -0
- data/test-data/dotplus3.cddl +3 -0
- data/test-data/dotplus4.cddl +3 -0
- data/test-data/enum.cddl +14 -0
- data/test-data/enum1.cddl +12 -0
- data/test-data/feat1.cddl +4 -0
- data/test-data/feature-controller.cddl +6 -0
- data/test-data/feature-detail.cddl +5 -0
- data/test-data/foo.cddl +1 -0
- data/test-data/hex.cddl +1 -0
- data/test-data/hexlc.cddl +1 -0
- data/test-data/hexuc.cddl +1 -0
- data/test-data/homenet-de.cddl +12 -0
- data/test-data/homenet-fe.cddl +12 -0
- data/test-data/jim-cut-2.cddl +11 -0
- data/test-data/jim-cut.cddl +12 -0
- data/test-data/join.cddl +1 -0
- data/test-data/joini.cddl +1 -0
- data/test-data/joinx.cddl +1 -0
- data/test-data/json.cddl +1 -0
- data/test-data/json1.cddl +15 -0
- data/test-data/json2.cddl +1 -0
- data/test-data/jsoniodef.cddl +719 -0
- data/test-data/jwt.cddl +15 -0
- data/test-data/lint1.cddl +9 -0
- data/test-data/mdl-ble.cddl +9 -0
- data/test-data/mdl-deve.cddl +54 -0
- data/test-data/mdl-dp.cddl +11 -0
- data/test-data/mdl-mso.cddl +20 -0
- data/test-data/mdl-request.cddl +26 -0
- data/test-data/mdl-response.cddl +66 -0
- data/test-data/mdl.cddl +11 -0
- data/test-data/mon-val.cddl +1 -0
- data/test-data/multipart-ct.cddl +2 -0
- data/test-data/named-group.cddl +7 -0
- data/test-data/non-empty.cddl +5 -0
- data/test-data/oid.cddl +8 -0
- data/test-data/oidbat.cddl +8 -0
- data/test-data/plus.cddl +3 -0
- data/test-data/prim.cddl +7 -0
- data/test-data/printf.cddl +2 -0
- data/test-data/printf0.cddl +1 -0
- data/test-data/printf1.cddl +2 -0
- data/test-data/printf2.cddl +2 -0
- data/test-data/printf3.cddl +2 -0
- data/test-data/sasl.cddl +24 -0
- data/test-data/sequence.cddl +1 -0
- data/test-data/sipos.cddl +8 -0
- data/test-data/star-edited.cddl +98 -0
- data/test-data/star.cddl +95 -0
- data/test-data/test-gen.cddl +3 -0
- data/test-data/time.cddl +11 -0
- data/test-data/valemb.cddl +16 -0
- data/test-data/yangid.cddl +1 -0
- data/test-data/yaron1.cddl +95 -0
- metadata +148 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a4b5bfb31fd9b7fcf4cf66a1d0f2a76550c9682215c486d99a03997bab1ae30b
|
|
4
|
+
data.tar.gz: 97f11378fb18576f115ffb8cbd668fe9e14e33e91e4aac01d874c69e206f2fbd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
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
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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.
|
|
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('
|
|
9
|
-
s.add_dependency('
|
|
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.
|
|
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 = "
|
|
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" ["."
|
|
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 =
|
|
71
|
+
exponent = ["+"/"-"] 1*DIGIT
|
|
67
72
|
|
|
68
73
|
text = %x22 *SCHAR %x22
|
|
69
|
-
SCHAR = %x20-21 / %x23-7E / SESC
|
|
70
|
-
|
|
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 =
|
|
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 =
|
|
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 = ";" *
|
|
90
|
-
|
|
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
|
|