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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ede21b4292e6f546745029c7a071eb1af1259366e676d90e19f400dfe089d7a
4
- data.tar.gz: 57ed90f75d58941bd28c5afef7d5eb29eea5d5483a6a3b2c4fc65d49df0370aa
3
+ metadata.gz: e57d91298d6da2ed2f30060754b3c54f36ebdbf967e6e4e5f3e164fd8dfe2004
4
+ data.tar.gz: c1f33e309cee195a2438d4e840fcef8748de4f50625f55ec15dbb154e1b43994
5
5
  SHA512:
6
- metadata.gz: 65de704e842bb6d48265e7024922edf0406d6cb521d2977b07db2926d396b8b2d6bdc103619d579b861cb53b8914b4383e25c2e610e86f7b4d88d89983a64dff
7
- data.tar.gz: c0919845b3ee5bba3b2a5d77f9e182a4a9f1904f187843501abf29954d37033d62f1cfd50545865ba878c92583f26151f9024dc1093c0d4607442038b36008b0
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.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,11 +1,12 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.8.12'
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
- else
546
- [false]
547
- end
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
- warn "** Features potentially used: #{$features.map {|k, v| "#{k}: #{v.keys}"}.join(", ")}"
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[2]
766
- if ann = validate1a(d, target)
767
- control = where[3]
768
- case where[1]
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
- $features[v][d] = true
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[where[1]]
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,3 @@
1
+ foo = text .abnf '4DIGIT
2
+ DIGIT = %x30-39 ; 0-9
3
+ '
@@ -0,0 +1,2 @@
1
+ foo = text .regexp myregexp
2
+ myregexp = "A" .cat "B"
@@ -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.12
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: 2020-06-24 00:00:00.000000000 Z
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.1.2
200
+ rubygems_version: 3.2.3
183
201
  signing_key:
184
202
  specification_version: 4
185
203
  summary: CDDL generator and validator.