cddl 0.9.3 → 0.10.2
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/cddl.gemspec +2 -1
- data/lib/cddl.rb +141 -22
- data/test/test-cddl.rb +2 -2
- data/test-data/b64c.cddl +1 -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/decimal.cddl +1 -0
- data/test-data/decimal2.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/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/json2.cddl +1 -0
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33adef2ddb191ca70e7ad3742684cea679e675fe0169a139c9fa5bcc59abfaa6
|
4
|
+
data.tar.gz: 7b7b7d2cd0623645d6dca87c5c7a8a3d40540e7eec390411e9cbf3adcc6f7c9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b4a8ccd11e9dbf1b0ebf2541c03691a94a8430538fbe81db3bd178a2fab1732626114689d305048e88fb54c3336f0e95853c86f8336586d722df90639f82efa6
|
7
|
+
data.tar.gz: 1c6494a0fa4ead8ea548f61f3af5595dde99707359ce8aa8695c074288248334849f2452cae52620541bb762c9cf3979b159f415a1b787009d1061df54d849b5
|
data/cddl.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'cddl'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.10.2'
|
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')
|
@@ -9,6 +9,7 @@ spec = Gem::Specification.new do |s|
|
|
9
9
|
s.add_dependency('abnftt')
|
10
10
|
s.add_dependency('regexp-examples') # , '1.1.0')
|
11
11
|
s.add_dependency('colorize')
|
12
|
+
s.add_dependency('base32', '~> 0.3')
|
12
13
|
s.files = `git ls-files`.split("\n").grep(/^[a-z]/)
|
13
14
|
s.files = Dir['lib/**/*.rb'] + %w(cddl.gemspec) + Dir['data/**/*.abnf'] + Dir['data/**/*.cddl'] + Dir['test-data/**/*.cddl'] + Dir['test/**/*.rb']
|
14
15
|
s.require_path = 'lib'
|
data/lib/cddl.rb
CHANGED
@@ -6,6 +6,7 @@ require 'regexp-examples'
|
|
6
6
|
require 'abnftt'
|
7
7
|
require 'colorize'
|
8
8
|
require 'base64'
|
9
|
+
require 'base32'
|
9
10
|
|
10
11
|
module CDDL
|
11
12
|
|
@@ -22,6 +23,20 @@ module CDDL
|
|
22
23
|
|
23
24
|
class Parser
|
24
25
|
|
26
|
+
FEATURE_REJECT_RE = /\A\^/
|
27
|
+
# CDDL_FEATURE_OK=cbor,^json
|
28
|
+
CDDL_FEATURE_OK, CDDL_FEATURE_REJECT =
|
29
|
+
if ok = ENV["CDDL_FEATURE_OK"]
|
30
|
+
ok.split(/,\s*/)
|
31
|
+
.partition{|s| s[0] !~ FEATURE_REJECT_RE}
|
32
|
+
.map {|l| Hash[l.map {|feature|
|
33
|
+
[feature.sub(FEATURE_REJECT_RE, ''),
|
34
|
+
true]}]}
|
35
|
+
else
|
36
|
+
[{}, {}]
|
37
|
+
end
|
38
|
+
|
39
|
+
|
25
40
|
class BackTrack < Exception; end
|
26
41
|
|
27
42
|
def initialize(source_text)
|
@@ -130,7 +145,7 @@ module CDDL
|
|
130
145
|
if subtree[0] == :type1 && subtree[1..-1].all? {|x| x[0] == :int}
|
131
146
|
if enumname = subtree.cbor_annotations rescue nil
|
132
147
|
enumname = cname(enumname.first)
|
133
|
-
subtree[1..-1].each do |x|
|
148
|
+
subtree[1..-1].each do |x|
|
134
149
|
if memname = x.cbor_annotations
|
135
150
|
memname = "#{enumname}_#{cname(memname.first)}"
|
136
151
|
add.(memname, x[1].to_s)
|
@@ -459,6 +474,11 @@ module CDDL
|
|
459
474
|
end
|
460
475
|
generate1(target, inmap)
|
461
476
|
when :feature
|
477
|
+
feature, = extract_feature(control, nil)
|
478
|
+
# warn "@@@ GENFEAT #{feature.inspect} #{CDDL_FEATURE_REJECT[feature].inspect}"
|
479
|
+
if CDDL_FEATURE_REJECT[feature]
|
480
|
+
fail BackTrack.new("Feature '#{feature}' rejected")
|
481
|
+
end
|
462
482
|
generate1(target, inmap)
|
463
483
|
when :cat, :det
|
464
484
|
lhs = generate1(target, inmap)
|
@@ -559,6 +579,51 @@ module CDDL
|
|
559
579
|
content[0...n] = ''
|
560
580
|
end
|
561
581
|
content
|
582
|
+
when :json
|
583
|
+
unless target == [:prim, 3]
|
584
|
+
fail "Don't know yet how to generate #{where}"
|
585
|
+
end
|
586
|
+
content = JSON::dump(generate1(control))
|
587
|
+
content
|
588
|
+
when :decimal
|
589
|
+
unless target == [:prim, 3]
|
590
|
+
fail "Don't know yet how to generate #{where}"
|
591
|
+
end
|
592
|
+
content = Integer(generate1(control)).to_s
|
593
|
+
content
|
594
|
+
when :join
|
595
|
+
content = generate1(control)
|
596
|
+
unless Array === content &&
|
597
|
+
content.all? {|x| String === x &&
|
598
|
+
((target == [:prim, 2] && x.encoding == Encoding::BINARY) ||
|
599
|
+
(target == [:prim, 3] && x.encoding != Encoding::BINARY))}
|
600
|
+
fail "Don't know yet how to generate #{where}"
|
601
|
+
end
|
602
|
+
content = content.join
|
603
|
+
content
|
604
|
+
when :b64u, :b64c, :b32, :h32, :hex, :hexlc, :hexuc
|
605
|
+
content = generate1(control)
|
606
|
+
unless String === content
|
607
|
+
fail "Don't know yet how to generate #{where}"
|
608
|
+
end
|
609
|
+
content = case conop
|
610
|
+
when :b64u
|
611
|
+
Base64.urlsafe_encode64(content, padding: false)
|
612
|
+
when :b64c
|
613
|
+
Base64.strict_encode64(content)
|
614
|
+
when :b32
|
615
|
+
Base32.table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
|
616
|
+
Base32.encode(content).gsub("=", "")
|
617
|
+
when :h32
|
618
|
+
Base32.table = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
|
619
|
+
Base32.encode(content).gsub("=", "")
|
620
|
+
when :hex, :hexuc
|
621
|
+
content.unpack("H*")[0].upcase
|
622
|
+
when :hexlc
|
623
|
+
content.unpack("H*")[0]
|
624
|
+
else fail "Cannot happen"
|
625
|
+
end
|
626
|
+
content
|
562
627
|
when :within, :and
|
563
628
|
32.times do
|
564
629
|
content = generate1(target)
|
@@ -636,6 +701,25 @@ module CDDL
|
|
636
701
|
}]
|
637
702
|
end
|
638
703
|
|
704
|
+
def extract_feature(control, d)
|
705
|
+
ok, v, vt = extract_value(control)
|
706
|
+
if ok
|
707
|
+
nm = v
|
708
|
+
det = d
|
709
|
+
warn "*** feature controller should be a string: #{control.inspect}" unless String == vt
|
710
|
+
else
|
711
|
+
ok, *v = extract_array(control)
|
712
|
+
if ok && v.size == 2
|
713
|
+
nm = v[0][0]
|
714
|
+
det = v[1][0]
|
715
|
+
warn "*** first element of feature controller should be a string: #{control.inspect}" unless String === nm
|
716
|
+
else
|
717
|
+
warn "*** feature controller not implemented: #{control.inspect}"
|
718
|
+
end
|
719
|
+
end
|
720
|
+
[nm, det]
|
721
|
+
end
|
722
|
+
|
639
723
|
def validate_diag
|
640
724
|
[@last_data, @last_rule, @last_message]
|
641
725
|
end
|
@@ -647,9 +731,8 @@ module CDDL
|
|
647
731
|
if warn
|
648
732
|
if result
|
649
733
|
if $features != {}
|
650
|
-
|
651
|
-
# warn
|
652
|
-
features = $features.reject {|k, v| ok.include? k.to_s }
|
734
|
+
features = $features.reject {|k, v| CDDL_FEATURE_OK[k.to_s] }
|
735
|
+
# warn "@@@ FEAT #{CDDL_FEATURE_OK.inspect} #{CDDL_FEATURE_REJECT.inspect}"
|
653
736
|
warn "** Features potentially used (#$fn): #{features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}" if features != {}
|
654
737
|
end
|
655
738
|
else
|
@@ -915,23 +998,9 @@ module CDDL
|
|
915
998
|
end
|
916
999
|
ann
|
917
1000
|
when :feature
|
918
|
-
|
919
|
-
if ok
|
920
|
-
nm = v
|
921
|
-
det = d
|
922
|
-
warn "*** feature controller should be a string: #{control.inspect}" unless String == vt
|
923
|
-
else
|
924
|
-
ok, *v = extract_array(control)
|
925
|
-
if ok && v.size == 2
|
926
|
-
nm = v[0][0]
|
927
|
-
det = v[1][0]
|
928
|
-
warn "*** first element of feature controller should be a string: #{control.inspect}" unless String === nm
|
929
|
-
else
|
930
|
-
warn "*** feature controller not implemented: #{control.inspect}"
|
931
|
-
end
|
932
|
-
end
|
1001
|
+
nm, det = extract_feature(control, d)
|
933
1002
|
$features[nm][det] = true
|
934
|
-
ann
|
1003
|
+
ann if !CDDL_FEATURE_REJECT[nm]
|
935
1004
|
when :lt, :le, :gt, :ge, :eq, :ne
|
936
1005
|
op = OPERATORS[conop]
|
937
1006
|
ok, v, _vt = extract_value(control)
|
@@ -971,6 +1040,53 @@ module CDDL
|
|
971
1040
|
ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
|
972
1041
|
when :cborseq
|
973
1042
|
ann if validate1((CBOR::decode("\x9f".b << d << "\xff".b) rescue :BAD_CBOR), control)
|
1043
|
+
when :json
|
1044
|
+
ann if validate1((JSON::load(d) rescue :BAD_JSON), control)
|
1045
|
+
when :decimal
|
1046
|
+
ann if (
|
1047
|
+
if /\A0|-?[1-9][0-9]*\z/ === d
|
1048
|
+
validate1((d.to_i rescue :BAD_JSON), control)
|
1049
|
+
end
|
1050
|
+
)
|
1051
|
+
when :join
|
1052
|
+
ok, *v = extract_array(control)
|
1053
|
+
# warn "@@@JJJ@@@ #{ok.inspect} #{v.inspect}"
|
1054
|
+
if ok
|
1055
|
+
expected = v.map {|ve|
|
1056
|
+
fail "Not a string in #{where}" unless String === ve[0]
|
1057
|
+
ve[0]
|
1058
|
+
}.join
|
1059
|
+
ann if d == expected
|
1060
|
+
else
|
1061
|
+
fail "Don't know yet how to validate against #{where}"
|
1062
|
+
end
|
1063
|
+
when :b64u, :b64c, :b32, :h32, :hex, :hexlc, :hexuc
|
1064
|
+
ann if (
|
1065
|
+
String === d && (
|
1066
|
+
decoded = case conop
|
1067
|
+
when :b64u
|
1068
|
+
/=/ !~ d &&
|
1069
|
+
Base64.urlsafe_decode64(d)
|
1070
|
+
when :b64c
|
1071
|
+
Base64.strict_decode64(d)
|
1072
|
+
when :b32
|
1073
|
+
/=/ !~ d &&
|
1074
|
+
(Base32.table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567") &&
|
1075
|
+
Base32.decode(d)
|
1076
|
+
when :h32
|
1077
|
+
/=/ !~ d &&
|
1078
|
+
(Base32.table = "0123456789ABCDEFGHIJKLMNOPQRSTUV") &&
|
1079
|
+
Base32.decode(d)
|
1080
|
+
when :hex
|
1081
|
+
/\A[0-9a-fA-F]*\z/ =~ d && [d].pack("H*")
|
1082
|
+
when :hexuc
|
1083
|
+
/\A[0-9A-F]*\z/ =~ d && [d].pack("H*")
|
1084
|
+
when :hexlc
|
1085
|
+
/\A[0-9a-f]*\z/ =~ d && [d].pack("H*")
|
1086
|
+
else fail "Cannot happen"
|
1087
|
+
end
|
1088
|
+
) && validate1(decoded.b, control)
|
1089
|
+
)
|
974
1090
|
when :within
|
975
1091
|
if validate1(d, control)
|
976
1092
|
ann
|
@@ -1120,7 +1236,7 @@ module CDDL
|
|
1120
1236
|
s = n.to_s
|
1121
1237
|
if s[-1] == "'"
|
1122
1238
|
bsqual, *parts = s.split("'", -1)
|
1123
|
-
if parts[-1] != ""
|
1239
|
+
if parts[-1] != ""
|
1124
1240
|
warn "*** Problem decoding byte string #{s.inspect}"
|
1125
1241
|
end
|
1126
1242
|
bsval = parts[0...-1].join("'").gsub(/\\(.)/){$1}
|
@@ -1327,7 +1443,10 @@ module CDDL
|
|
1327
1443
|
RANGE_EXCLUDE_END = {".." => false, "..." => true}
|
1328
1444
|
SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
|
1329
1445
|
:default, :lt, :le, :gt, :ge, :eq, :ne,
|
1330
|
-
:feature, :abnf, :abnfb, :det, :cat, :plus
|
1446
|
+
:feature, :abnf, :abnfb, :det, :cat, :plus,
|
1447
|
+
:json, :decimal, :join,
|
1448
|
+
:b64u, :b64c, :b32, :h32, :hex, :hexlc, :hexuc,
|
1449
|
+
]
|
1331
1450
|
|
1332
1451
|
def type1(n, canbegroup = false)
|
1333
1452
|
# puts "NVALUE #{n.value.inspect}"
|
data/test/test-cddl.rb
CHANGED
@@ -275,7 +275,7 @@ b = (
|
|
275
275
|
(x: int // y: int), z: int
|
276
276
|
)
|
277
277
|
HERE
|
278
|
-
|
278
|
+
refute parser.validate_for_test({}, false)
|
279
279
|
assert parser.validate_for_test({"x" => 2, "z" => 1})
|
280
280
|
assert parser.validate_for_test({"y" => 1, "z" => 2})
|
281
281
|
refute parser.validate_for_test({"z" => 1}, false)
|
@@ -293,7 +293,7 @@ b = ( z: int
|
|
293
293
|
(x: int // y: int)
|
294
294
|
)
|
295
295
|
HERE
|
296
|
-
|
296
|
+
refute parser.validate_for_test({}, false)
|
297
297
|
assert parser.validate_for_test({"x" => 2, "z" => 1})
|
298
298
|
assert parser.validate_for_test({"y" => 1, "z" => 2})
|
299
299
|
refute parser.validate_for_test({"z" => 1}, false)
|
data/test-data/b64c.cddl
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a = text .b64c 'mnoabcd'
|
data/test-data/b64u.cddl
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a = text .b64u 'mnoabcd'
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .b32 'mnoabcd'
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .h32 'mnoabcd'
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .decimal uint
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .decimal 4711
|
data/test-data/hex.cddl
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a = text .hex 'mnoabcd'
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .hexlc 'mnoabcd'
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .hexuc 'mnoabcd'
|
data/test-data/join.cddl
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a = text .join (["a", "b", "c"])
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .join (["a", "b", 3])
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .join (["a", "b", text])
|
data/test-data/json.cddl
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
a = text .json ([4, uint .size 1, {"a": "b"}])
|
@@ -0,0 +1 @@
|
|
1
|
+
a = text .json ([4, uint .size 2, {"a": "b"}])
|
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.
|
4
|
+
version: 0.10.2
|
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: 2023-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cbor-diag
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: base32
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.3'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.3'
|
97
111
|
description: A parser, generator, and validator for CDDL
|
98
112
|
email: cabo@tzi.org
|
99
113
|
executables:
|
@@ -119,7 +133,11 @@ files:
|
|
119
133
|
- test-data/abnf3.cddl
|
120
134
|
- test-data/ambig.cddl
|
121
135
|
- test-data/b.cddl
|
136
|
+
- test-data/b64c.cddl
|
137
|
+
- test-data/b64u.cddl
|
122
138
|
- test-data/badaddr.cddl
|
139
|
+
- test-data/base32.cddl
|
140
|
+
- test-data/base32hex.cddl
|
123
141
|
- test-data/basic_syntax_example.cddl
|
124
142
|
- test-data/bat.cddl
|
125
143
|
- test-data/bpv7.cddl
|
@@ -135,6 +153,8 @@ files:
|
|
135
153
|
- test-data/cose.cddl
|
136
154
|
- test-data/dcaf.cddl
|
137
155
|
- test-data/dcaf1.cddl
|
156
|
+
- test-data/decimal.cddl
|
157
|
+
- test-data/decimal2.cddl
|
138
158
|
- test-data/det1.cddl
|
139
159
|
- test-data/dotsize.cddl
|
140
160
|
- test-data/extractor-demo.cddl
|
@@ -148,6 +168,9 @@ files:
|
|
148
168
|
- test-data/grasp-09.cddl
|
149
169
|
- test-data/grasp-v1.cddl
|
150
170
|
- test-data/grasp-v2X.cddl
|
171
|
+
- test-data/hex.cddl
|
172
|
+
- test-data/hexlc.cddl
|
173
|
+
- test-data/hexuc.cddl
|
151
174
|
- test-data/homenet-de.cddl
|
152
175
|
- test-data/homenet-fe.cddl
|
153
176
|
- test-data/ifmap-base-2.0v17.cddl
|
@@ -157,6 +180,11 @@ files:
|
|
157
180
|
- test-data/jcr-ex.cddl
|
158
181
|
- test-data/jim-cut-2.cddl
|
159
182
|
- test-data/jim-cut.cddl
|
183
|
+
- test-data/join.cddl
|
184
|
+
- test-data/joini.cddl
|
185
|
+
- test-data/joinx.cddl
|
186
|
+
- test-data/json.cddl
|
187
|
+
- test-data/json2.cddl
|
160
188
|
- test-data/jsoniodef.cddl
|
161
189
|
- test-data/kevin5.cddl
|
162
190
|
- test-data/lint1.cddl
|
@@ -217,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
217
245
|
- !ruby/object:Gem::Version
|
218
246
|
version: '0'
|
219
247
|
requirements: []
|
220
|
-
rubygems_version: 3.
|
248
|
+
rubygems_version: 3.4.2
|
221
249
|
signing_key:
|
222
250
|
specification_version: 4
|
223
251
|
summary: CDDL generator and validator.
|