cddl 0.8.11 → 0.8.16

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 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.