cddl 0.8.13 → 0.8.18
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 +87 -10
- data/test-data/abnf1.cddl +3 -0
- data/test-data/abnf2.cddl +37 -0
- data/test-data/cat-re.cddl +2 -0
- data/test-data/sequence.cddl +1 -0
- metadata +21 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea0383306d236be5fef58afc284e8129b9cd125bb0b8548e6bf76f3bd7b45ab9
|
4
|
+
data.tar.gz: 3e439913ec68a51c044a4215a72789a2e4f25dd05b5f9e864349ce7dc9f83113
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a2d7a09bbeedfb2a1d9884deb69e55c8ed889eec727d67fed6c74223981c6cea5aac9fc07a37dd9bd2e253f5942afdc3ac35effe7a9a8baab47baf375f88222e
|
7
|
+
data.tar.gz: dd32c4869a4d708863ba8ed1188ae1f98b784c6fc6d33ffab54d2db4a6254cbf2ea0490706d31ae2f4c53f21e64ce7a87b9bb0d81ec495765ffe19a2471c6470
|
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.18'
|
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,11 @@ 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
|
+
|
252
258
|
def generate
|
253
259
|
@recursion = 0
|
254
260
|
generate1(rules)
|
@@ -441,6 +447,29 @@ module CDDL
|
|
441
447
|
generate1(target, inmap)
|
442
448
|
when :feature
|
443
449
|
generate1(target, inmap)
|
450
|
+
when :cat
|
451
|
+
lhs = generate1(target, inmap)
|
452
|
+
rhs = generate1(control)
|
453
|
+
begin
|
454
|
+
lhs + rhs
|
455
|
+
rescue Exception => e
|
456
|
+
fail "Can't #{lhs.inspect} .cat #{rhs.inspect}: #{e.message}"
|
457
|
+
end
|
458
|
+
when :plus
|
459
|
+
lhs = generate1(target, inmap)
|
460
|
+
rhs = generate1(control)
|
461
|
+
begin
|
462
|
+
case lhs
|
463
|
+
when Integer
|
464
|
+
lhs + Integer(rhs)
|
465
|
+
when Numeric
|
466
|
+
lhs + rhs
|
467
|
+
else
|
468
|
+
fail "#{lhs.inspect}: Not a number"
|
469
|
+
end
|
470
|
+
rescue Exception => e
|
471
|
+
fail "Can't #{lhs.inspect} .plus #{rhs.inspect}: #{e.message}"
|
472
|
+
end
|
444
473
|
when :eq
|
445
474
|
content = generate1(control)
|
446
475
|
if validate1(content, where)
|
@@ -481,6 +510,12 @@ module CDDL
|
|
481
510
|
fail "Don't know yet how to generate #{where}"
|
482
511
|
end
|
483
512
|
REGEXP_FOR_STRING[regexp].random_example(max_repeater_variance: 5)
|
513
|
+
when :abnf
|
514
|
+
grammar = generate1(control)
|
515
|
+
unless target == [:prim, 3] && String === grammar
|
516
|
+
fail "Don't know yet how to generate #{where}"
|
517
|
+
end
|
518
|
+
ABNF_PARSER_FOR_STRING[grammar].generate
|
484
519
|
when :cbor, :cborseq
|
485
520
|
unless target == [:prim, 2]
|
486
521
|
fail "Don't know yet how to generate #{where}"
|
@@ -542,9 +577,24 @@ module CDDL
|
|
542
577
|
[true, t[1], vt]
|
543
578
|
elsif v = SIMPLE_VALUE[t]
|
544
579
|
v
|
545
|
-
|
546
|
-
|
547
|
-
|
580
|
+
elsif t[0] == :anno
|
581
|
+
_, conop, target, control = t
|
582
|
+
# warn ["EXV0", conop, target, control].inspect
|
583
|
+
if conop == :cat || conop == :plus
|
584
|
+
ok1, v1, vt1 = extract_value(target)
|
585
|
+
ok2, v2, vt2 = extract_value(control)
|
586
|
+
# warn ["EXV", ok1, v1, vt1, ok2, v2, vt2].inspect
|
587
|
+
if ok1 && ok2
|
588
|
+
if vt1 == Integer
|
589
|
+
[true, v1 + Integer(v2), Integer] if vt2 == Integer || vt2 == Float
|
590
|
+
elsif vt1 == Float
|
591
|
+
[true, v1 + v2, vt1] if vt2 == Integer || vt2 == Float
|
592
|
+
else
|
593
|
+
[true, v1 + v2, vt1] if vt1 == vt2
|
594
|
+
end
|
595
|
+
end rescue nil
|
596
|
+
end
|
597
|
+
end || [false]
|
548
598
|
end
|
549
599
|
|
550
600
|
def extract_array(t)
|
@@ -568,7 +618,10 @@ module CDDL
|
|
568
618
|
if warn
|
569
619
|
if result
|
570
620
|
if $features != {}
|
571
|
-
|
621
|
+
ok = ENV["CDDL_FEATURE_OK"] and ok = ok.split(/,\s*/) or ok = []
|
622
|
+
# warn([:OK, ok, $features].inspect)
|
623
|
+
features = $features.reject {|k, v| ok.include? k.to_s }
|
624
|
+
warn "** Features potentially used: #{features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}" if features != {}
|
572
625
|
end
|
573
626
|
else
|
574
627
|
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
@@ -772,10 +825,18 @@ module CDDL
|
|
772
825
|
when :range
|
773
826
|
[] if where[2] === d && where[1].include?(d)
|
774
827
|
when :anno
|
775
|
-
target = where
|
776
|
-
if
|
777
|
-
|
778
|
-
|
828
|
+
_, conop, target, control = where
|
829
|
+
if conop == :cat || conop == :plus
|
830
|
+
ok1, v1, vt1 = extract_value(target)
|
831
|
+
ok2, v2, vt2 = extract_value(control)
|
832
|
+
# warn ["ANNO0", ok1, v1, vt1, ok2, v2, vt2, d].inspect
|
833
|
+
if ok1 && ok2
|
834
|
+
v2 = Integer(v2) if vt1 == Integer
|
835
|
+
# warn ["ANNO", ok1, v1, vt1, ok2, v2, vt2, d].inspect
|
836
|
+
[] if d == v1 + v2 # XXX Focus ArgumentError
|
837
|
+
end
|
838
|
+
elsif ann = validate1a(d, target)
|
839
|
+
case conop
|
779
840
|
when :size
|
780
841
|
case d
|
781
842
|
when Integer
|
@@ -831,7 +892,7 @@ module CDDL
|
|
831
892
|
$features[nm][det] = true
|
832
893
|
ann
|
833
894
|
when :lt, :le, :gt, :ge, :eq, :ne
|
834
|
-
op = OPERATORS[
|
895
|
+
op = OPERATORS[conop]
|
835
896
|
ok, v, _vt = extract_value(control)
|
836
897
|
if ok
|
837
898
|
ann if d.send(op, v) rescue nil # XXX Focus ArgumentError
|
@@ -847,6 +908,22 @@ module CDDL
|
|
847
908
|
end
|
848
909
|
end
|
849
910
|
)
|
911
|
+
when :abnf # XXX .abnf vs. .abnfb
|
912
|
+
ann if (
|
913
|
+
if String === d
|
914
|
+
ok, v, vt = extract_value(control)
|
915
|
+
if ok && vt == String
|
916
|
+
begin
|
917
|
+
ABNF_PARSER_FOR_STRING[v].validate(d)
|
918
|
+
true
|
919
|
+
rescue => e
|
920
|
+
# warn "*** #{e}" # XXX
|
921
|
+
@last_message = e
|
922
|
+
nil
|
923
|
+
end
|
924
|
+
end
|
925
|
+
end
|
926
|
+
)
|
850
927
|
when :cbor
|
851
928
|
ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
|
852
929
|
when :cborseq
|
@@ -1201,7 +1278,7 @@ module CDDL
|
|
1201
1278
|
BRACE = {"{" => :map, "[" => :array}
|
1202
1279
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1203
1280
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1204
|
-
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
|
1281
|
+
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :abnf, :cat, :plus]
|
1205
1282
|
|
1206
1283
|
def type1(n, canbegroup = false)
|
1207
1284
|
# 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 @@
|
|
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.18
|
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-25 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,8 @@ 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
|
103
119
|
- test-data/ambig.cddl
|
104
120
|
- test-data/b.cddl
|
105
121
|
- test-data/badaddr.cddl
|
@@ -107,6 +123,7 @@ files:
|
|
107
123
|
- test-data/bpv7.cddl
|
108
124
|
- test-data/bpv7a.cddl
|
109
125
|
- test-data/bpv7b.cddl
|
126
|
+
- test-data/cat-re.cddl
|
110
127
|
- test-data/cdni-ct.cddl
|
111
128
|
- test-data/coral.cddl
|
112
129
|
- test-data/coral1.cddl
|
@@ -150,6 +167,7 @@ files:
|
|
150
167
|
- test-data/named-group.cddl
|
151
168
|
- test-data/patch1.cddl
|
152
169
|
- test-data/reused_named_group.cddl
|
170
|
+
- test-data/sequence.cddl
|
153
171
|
- test-data/structure.cddl
|
154
172
|
- test-data/test-gen.cddl
|
155
173
|
- test-data/toerless0.cddl
|
@@ -180,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
198
|
- !ruby/object:Gem::Version
|
181
199
|
version: '0'
|
182
200
|
requirements: []
|
183
|
-
rubygems_version: 3.
|
201
|
+
rubygems_version: 3.2.3
|
184
202
|
signing_key:
|
185
203
|
specification_version: 4
|
186
204
|
summary: CDDL generator and validator.
|