cddl 0.8.11 → 0.8.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77b28f069a663ccb82301ec6db8cf42db6b00127b36272020baf874416029a2b
4
- data.tar.gz: c37387e5d6b1009d054cb9a345d337e43fbc2a9bcc826d009aa0b1cdfeded437
3
+ metadata.gz: 4939bdcbf4646dc3e2606b7590db6967cc5ccdb0fcb3ac278376b2393baefef2
4
+ data.tar.gz: ee4e8dc9a948843a3ad4ee3adbc9a128c3de921a5c2056c8d91c82ecbdf85372
5
5
  SHA512:
6
- metadata.gz: b7818289a708b07c08a58c8b114730777d70a4dbfb43ec94f10fbcacfae21cdbdcd72b11dd225e52471963e1570d30cb5703790f424b470015ab67064cc48ae8
7
- data.tar.gz: 301eb0733448db7eae4dff9404d51b436c018ede13ed9a2288a6285d783e58d479186e80193e90e38ed075bd24b33fccf1ed2055eb57fd99cd99594621aa1df7
6
+ metadata.gz: 07360a1f513c23f9cabb0f64a870bbd961cc336f722b7d857f6d9e92dd47d8fe328899772dcd27afa24af47085e579c8a029ed4d02b8cbecb95b7af7ea2d50cf
7
+ data.tar.gz: 9dbf6d31bb5656b958274ec32d39bb76ebaf57e015cd819487f48c752b2d786667166f78f9d822322cfba6c7750a5559dc2baf8e938c42e4ce35b7bf3d509dd0
data/bin/cddl CHANGED
@@ -50,11 +50,15 @@ end
50
50
 
51
51
  begin
52
52
  case ARGV[1]
53
- when /\A.p/
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 = CBOR.decode(instance.b) rescue JSON.load(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,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.8.11'
3
+ s.version = '0.8.16'
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')
data/data/cddl.abnf CHANGED
@@ -16,6 +16,7 @@ type1 = type2 [S (rangeop / annotator) S type2]
16
16
  / "#" "6" ["." uint] "(" S type S ")" ; note no space!
17
17
  / "#" DIGIT ["." uint] ; major/ai
18
18
  / "#" ; any
19
+ / "~" S typename [genericarg]
19
20
  / "{" S group S "}"
20
21
  / "[" S group S "]"
21
22
  / "&" S "(" S group S ")"
data/lib/cddl.rb CHANGED
@@ -441,6 +441,29 @@ module CDDL
441
441
  generate1(target, inmap)
442
442
  when :feature
443
443
  generate1(target, inmap)
444
+ when :cat
445
+ lhs = generate1(target, inmap)
446
+ rhs = generate1(control)
447
+ begin
448
+ lhs + rhs
449
+ rescue Exception => e
450
+ fail "Can't #{lhs.inspect} .cat #{rhs.inspect}: #{e.message}"
451
+ end
452
+ when :plus
453
+ lhs = generate1(target, inmap)
454
+ rhs = generate1(control)
455
+ begin
456
+ case lhs
457
+ when Integer
458
+ lhs + Integer(rhs)
459
+ when Numeric
460
+ lhs + rhs
461
+ else
462
+ fail "#{lhs.inspect}: Not a number"
463
+ end
464
+ rescue Exception => e
465
+ fail "Can't #{lhs.inspect} .plus #{rhs.inspect}: #{e.message}"
466
+ end
444
467
  when :eq
445
468
  content = generate1(control)
446
469
  if validate1(content, where)
@@ -542,9 +565,34 @@ module CDDL
542
565
  [true, t[1], vt]
543
566
  elsif v = SIMPLE_VALUE[t]
544
567
  v
545
- else
546
- [false]
547
- end
568
+ elsif t[0] == :anno
569
+ _, conop, target, control = t
570
+ # warn ["EXV0", conop, target, control].inspect
571
+ if conop == :cat || conop == :plus
572
+ ok1, v1, vt1 = extract_value(target)
573
+ ok2, v2, vt2 = extract_value(control)
574
+ # warn ["EXV", ok1, v1, vt1, ok2, v2, vt2].inspect
575
+ if ok1 && ok2
576
+ if vt1 == Integer
577
+ [true, v1 + Integer(v2), Integer] if vt2 == Integer || vt2 == Float
578
+ elsif vt1 == Float
579
+ [true, v1 + v2, vt1] if vt2 == Integer || vt2 == Float
580
+ else
581
+ [true, v1 + v2, vt1] if vt1 == vt2
582
+ end
583
+ end rescue nil
584
+ end
585
+ end || [false]
586
+ end
587
+
588
+ def extract_array(t)
589
+ return [false] unless t[0] == :array
590
+ [true, *t[1..-1].map { |el|
591
+ return [false] unless el[0..3] == [:member, 1, 1, nil]
592
+ ok, v, vt = extract_value(el[4])
593
+ return [false] unless ok
594
+ [v, vt]
595
+ }]
548
596
  end
549
597
 
550
598
  def validate_diag
@@ -558,7 +606,10 @@ module CDDL
558
606
  if warn
559
607
  if result
560
608
  if $features != {}
561
- warn "** Features potentially used: #{$features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}"
609
+ ok = ENV["CDDL_FEATURE_OK"] and ok = ok.split(/,\s*/) or ok = []
610
+ # warn([:OK, ok, $features].inspect)
611
+ features = $features.reject {|k, v| ok.include? k.to_s }
612
+ warn "** Features potentially used: #{features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}" if features != {}
562
613
  end
563
614
  else
564
615
  warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
@@ -762,10 +813,18 @@ module CDDL
762
813
  when :range
763
814
  [] if where[2] === d && where[1].include?(d)
764
815
  when :anno
765
- target = where[2]
766
- if ann = validate1a(d, target)
767
- control = where[3]
768
- case where[1]
816
+ _, conop, target, control = where
817
+ if conop == :cat || conop == :plus
818
+ ok1, v1, vt1 = extract_value(target)
819
+ ok2, v2, vt2 = extract_value(control)
820
+ # warn ["ANNO0", ok1, v1, vt1, ok2, v2, vt2, d].inspect
821
+ if ok1 && ok2
822
+ v2 = Integer(v2) if vt1 == Integer
823
+ # warn ["ANNO", ok1, v1, vt1, ok2, v2, vt2, d].inspect
824
+ [] if d == v1 + v2 # XXX Focus ArgumentError
825
+ end
826
+ elsif ann = validate1a(d, target)
827
+ case conop
769
828
  when :size
770
829
  case d
771
830
  when Integer
@@ -806,10 +865,22 @@ module CDDL
806
865
  ann
807
866
  when :feature
808
867
  ok, v, vt = extract_value(control)
809
- $features[v][d] = true
868
+ if ok
869
+ nm = v
870
+ det = d
871
+ else
872
+ ok, *v = extract_array(control)
873
+ if ok && v.size == 2
874
+ nm = v[0][0]
875
+ det = v[1][0]
876
+ else
877
+ warn "*** feature controller not implemented: #{control.inspect}"
878
+ end
879
+ end
880
+ $features[nm][det] = true
810
881
  ann
811
882
  when :lt, :le, :gt, :ge, :eq, :ne
812
- op = OPERATORS[where[1]]
883
+ op = OPERATORS[conop]
813
884
  ok, v, _vt = extract_value(control)
814
885
  if ok
815
886
  ann if d.send(op, v) rescue nil # XXX Focus ArgumentError
@@ -1179,7 +1250,7 @@ module CDDL
1179
1250
  BRACE = {"{" => :map, "[" => :array}
1180
1251
  RANGE_EXCLUDE_END = {".." => false, "..." => true}
1181
1252
  SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
1182
- :default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
1253
+ :default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :cat, :plus]
1183
1254
 
1184
1255
  def type1(n, canbegroup = false)
1185
1256
  # puts "NVALUE #{n.value.inspect}"
@@ -1241,6 +1312,26 @@ module CDDL
1241
1312
  v
1242
1313
  }
1243
1314
  ]
1315
+ when /\A~/
1316
+ if tn = n.typename
1317
+ s = type_recall(tn.to_s, false, n.genericarg).flatten(1)
1318
+ else
1319
+ fail "No typename in unwrap #{n}"
1320
+ end
1321
+ if s[0] != :type1
1322
+ fail [:UNWRAPs0, s].inspect
1323
+ end
1324
+ case s[1]
1325
+ when :map, :array
1326
+ [:grpent, s[2..-1]]
1327
+ when :prim
1328
+ if s[2] != 6
1329
+ fail [:UNWRAPs2, s].inspect
1330
+ end
1331
+ s[4] # check :type1?
1332
+ else
1333
+ fail [:UNWRAPs1, s].inspect
1334
+ end
1244
1335
  else
1245
1336
  "unimplemented #{n}"
1246
1337
  end
data/test-data/feat1.cddl CHANGED
@@ -1,4 +1,4 @@
1
- foo = {
1
+ bla = {
2
2
  a: int
3
3
  ? ("b" .feature "foo") => float
4
4
  }
@@ -0,0 +1,5 @@
1
+ foo = {
2
+ kind: bar / baz .feature (["foo-extensions", "bazify"])
3
+ }
4
+ bar = int
5
+ baz = text ; complex stuff that doesn't all need to be in the detail
@@ -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.11
4
+ version: 0.8.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-14 00:00:00.000000000 Z
11
+ date: 2021-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag
@@ -118,6 +118,7 @@ files:
118
118
  - test-data/dotsize.cddl
119
119
  - test-data/extractor-demo.cddl
120
120
  - test-data/feat1.cddl
121
+ - test-data/feature-detail.cddl
121
122
  - test-data/foo.cddl
122
123
  - test-data/grasp-01-extract.cddl
123
124
  - test-data/grasp-01-test.cddl
@@ -149,6 +150,7 @@ files:
149
150
  - test-data/named-group.cddl
150
151
  - test-data/patch1.cddl
151
152
  - test-data/reused_named_group.cddl
153
+ - test-data/sequence.cddl
152
154
  - test-data/structure.cddl
153
155
  - test-data/test-gen.cddl
154
156
  - test-data/toerless0.cddl
@@ -179,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
181
  - !ruby/object:Gem::Version
180
182
  version: '0'
181
183
  requirements: []
182
- rubygems_version: 3.1.2
184
+ rubygems_version: 3.2.3
183
185
  signing_key:
184
186
  specification_version: 4
185
187
  summary: CDDL generator and validator.