cddl 0.8.12 → 0.8.17

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