cddl 0.8.12 → 0.8.17
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 +10 -2
- data/cddl.gemspec +2 -1
- data/lib/cddl.rb +110 -11
- data/test-data/abnf1.cddl +3 -0
- data/test-data/cat-re.cddl +2 -0
- data/test-data/feature-detail.cddl +5 -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: e57d91298d6da2ed2f30060754b3c54f36ebdbf967e6e4e5f3e164fd8dfe2004
|
4
|
+
data.tar.gz: c1f33e309cee195a2438d4e840fcef8748de4f50625f55ec15dbb154e1b43994
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 871fba7d4ec1b1d94a28149c3c9f9c9cdc4e60ddadb9d503f9ada96b35809534ed576865133f5a78c8645f1cce67f03ef04c799528c5dfa18752398d7e193302
|
7
|
+
data.tar.gz: df38f1006d6c36782609681c994fd09c8b0eb8a23d35d8de57dcd6b252a18d97d05ef42b776b276b56359e8ee212b25e923e6b337c0944a7646e7770d36b6696
|
data/bin/cddl
CHANGED
@@ -50,11 +50,15 @@ end
|
|
50
50
|
|
51
51
|
begin
|
52
52
|
case ARGV[1]
|
53
|
-
when /\A
|
53
|
+
when /\A..*p/
|
54
54
|
$annotate = true
|
55
55
|
require_relative '../lib/cbor-pp'
|
56
56
|
end
|
57
57
|
case ARGV[1]
|
58
|
+
when /\A..*s/
|
59
|
+
$sequence = true
|
60
|
+
end
|
61
|
+
case ARGV[1]
|
58
62
|
when /\Ar/ # secret
|
59
63
|
$advanced = true
|
60
64
|
my_pp parser.rules
|
@@ -83,7 +87,11 @@ begin
|
|
83
87
|
end
|
84
88
|
when /\Av/
|
85
89
|
instance = read_arg(ARGV[2])
|
86
|
-
instance =
|
90
|
+
instance = if $sequence
|
91
|
+
CBOR.decode("\x9f".b << instance.b << "\xff".b)
|
92
|
+
else
|
93
|
+
CBOR.decode(instance.b) rescue JSON.load(instance)
|
94
|
+
end
|
87
95
|
instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
|
88
96
|
ann = parser.validate(instance)
|
89
97
|
# my_pp ann
|
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.17'
|
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,34 @@ 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]
|
598
|
+
end
|
599
|
+
|
600
|
+
def extract_array(t)
|
601
|
+
return [false] unless t[0] == :array
|
602
|
+
[true, *t[1..-1].map { |el|
|
603
|
+
return [false] unless el[0..3] == [:member, 1, 1, nil]
|
604
|
+
ok, v, vt = extract_value(el[4])
|
605
|
+
return [false] unless ok
|
606
|
+
[v, vt]
|
607
|
+
}]
|
548
608
|
end
|
549
609
|
|
550
610
|
def validate_diag
|
@@ -558,7 +618,10 @@ module CDDL
|
|
558
618
|
if warn
|
559
619
|
if result
|
560
620
|
if $features != {}
|
561
|
-
|
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 != {}
|
562
625
|
end
|
563
626
|
else
|
564
627
|
warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
|
@@ -762,10 +825,18 @@ module CDDL
|
|
762
825
|
when :range
|
763
826
|
[] if where[2] === d && where[1].include?(d)
|
764
827
|
when :anno
|
765
|
-
target = where
|
766
|
-
if
|
767
|
-
|
768
|
-
|
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
|
769
840
|
when :size
|
770
841
|
case d
|
771
842
|
when Integer
|
@@ -806,10 +877,22 @@ module CDDL
|
|
806
877
|
ann
|
807
878
|
when :feature
|
808
879
|
ok, v, vt = extract_value(control)
|
809
|
-
|
880
|
+
if ok
|
881
|
+
nm = v
|
882
|
+
det = d
|
883
|
+
else
|
884
|
+
ok, *v = extract_array(control)
|
885
|
+
if ok && v.size == 2
|
886
|
+
nm = v[0][0]
|
887
|
+
det = v[1][0]
|
888
|
+
else
|
889
|
+
warn "*** feature controller not implemented: #{control.inspect}"
|
890
|
+
end
|
891
|
+
end
|
892
|
+
$features[nm][det] = true
|
810
893
|
ann
|
811
894
|
when :lt, :le, :gt, :ge, :eq, :ne
|
812
|
-
op = OPERATORS[
|
895
|
+
op = OPERATORS[conop]
|
813
896
|
ok, v, _vt = extract_value(control)
|
814
897
|
if ok
|
815
898
|
ann if d.send(op, v) rescue nil # XXX Focus ArgumentError
|
@@ -825,6 +908,22 @@ module CDDL
|
|
825
908
|
end
|
826
909
|
end
|
827
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
|
+
)
|
828
927
|
when :cbor
|
829
928
|
ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
|
830
929
|
when :cborseq
|
@@ -1179,7 +1278,7 @@ module CDDL
|
|
1179
1278
|
BRACE = {"{" => :map, "[" => :array}
|
1180
1279
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1181
1280
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1182
|
-
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
|
1281
|
+
:default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :abnf, :cat, :plus]
|
1183
1282
|
|
1184
1283
|
def type1(n, canbegroup = false)
|
1185
1284
|
# puts "NVALUE #{n.value.inspect}"
|
@@ -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.17
|
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,7 @@ files:
|
|
100
114
|
- test-data/7807.cddl
|
101
115
|
- test-data/a.cddl
|
102
116
|
- test-data/abignum.cddl
|
117
|
+
- test-data/abnf1.cddl
|
103
118
|
- test-data/ambig.cddl
|
104
119
|
- test-data/b.cddl
|
105
120
|
- test-data/badaddr.cddl
|
@@ -107,6 +122,7 @@ files:
|
|
107
122
|
- test-data/bpv7.cddl
|
108
123
|
- test-data/bpv7a.cddl
|
109
124
|
- test-data/bpv7b.cddl
|
125
|
+
- test-data/cat-re.cddl
|
110
126
|
- test-data/cdni-ct.cddl
|
111
127
|
- test-data/coral.cddl
|
112
128
|
- test-data/coral1.cddl
|
@@ -118,6 +134,7 @@ files:
|
|
118
134
|
- test-data/dotsize.cddl
|
119
135
|
- test-data/extractor-demo.cddl
|
120
136
|
- test-data/feat1.cddl
|
137
|
+
- test-data/feature-detail.cddl
|
121
138
|
- test-data/foo.cddl
|
122
139
|
- test-data/grasp-01-extract.cddl
|
123
140
|
- test-data/grasp-01-test.cddl
|
@@ -149,6 +166,7 @@ files:
|
|
149
166
|
- test-data/named-group.cddl
|
150
167
|
- test-data/patch1.cddl
|
151
168
|
- test-data/reused_named_group.cddl
|
169
|
+
- test-data/sequence.cddl
|
152
170
|
- test-data/structure.cddl
|
153
171
|
- test-data/test-gen.cddl
|
154
172
|
- test-data/toerless0.cddl
|
@@ -179,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
197
|
- !ruby/object:Gem::Version
|
180
198
|
version: '0'
|
181
199
|
requirements: []
|
182
|
-
rubygems_version: 3.
|
200
|
+
rubygems_version: 3.2.3
|
183
201
|
signing_key:
|
184
202
|
specification_version: 4
|
185
203
|
summary: CDDL generator and validator.
|