cddl 0.8.13 → 0.8.18

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: bbd414d9d4fbc897f8f31c03437fa57155547c0f02978de2da4f75844cf0e1ef
4
- data.tar.gz: 9aa239d57c5e70f8352da90cc8023273a2793577df84ee6e003a1ac0fdc200dc
3
+ metadata.gz: ea0383306d236be5fef58afc284e8129b9cd125bb0b8548e6bf76f3bd7b45ab9
4
+ data.tar.gz: 3e439913ec68a51c044a4215a72789a2e4f25dd05b5f9e864349ce7dc9f83113
5
5
  SHA512:
6
- metadata.gz: 00dac4c95e0b94e0bc3ae775b1bf1ab33a41507bb06774ccaa0838daf6c9fffc0c2d4b3d049199c3ae35858888be853058248c710ea056edd718a0938fd7d8e3
7
- data.tar.gz: 18ea8731c6ab8ec9ae547331be276b9ca1c58c490c6986969824a0a56c7870478ca01418f8ae83a5504d393c14e9fcc5764bfc0cb65c7f2f267cd1757dfbdbac
6
+ metadata.gz: a2d7a09bbeedfb2a1d9884deb69e55c8ed889eec727d67fed6c74223981c6cea5aac9fc07a37dd9bd2e253f5942afdc3ac35effe7a9a8baab47baf375f88222e
7
+ data.tar.gz: dd32c4869a4d708863ba8ed1188ae1f98b784c6fc6d33ffab54d2db4a6254cbf2ea0490706d31ae2f4c53f21e64ce7a87b9bb0d81ec495765ffe19a2471c6470
data/bin/cddl CHANGED
@@ -14,8 +14,8 @@ def usage
14
14
  warn "Usage:"
15
15
  warn "#$0 spec.cddl generate [n]"
16
16
  warn "#$0 spec.cddl json-generate [n]"
17
- warn "#$0 spec.cddl validate instance.cbor"
18
- warn "#$0 spec.cddl validate instance.json"
17
+ warn "#$0 spec.cddl validate instance.cbor..."
18
+ warn "#$0 spec.cddl validate instance.json..."
19
19
  exit EX_USAGE
20
20
  end
21
21
 
@@ -48,13 +48,19 @@ def my_diag(v)
48
48
  end
49
49
  end
50
50
 
51
+ retcode = 0
52
+
51
53
  begin
52
54
  case ARGV[1]
53
- when /\A.p/
55
+ when /\A..*p/
54
56
  $annotate = true
55
57
  require_relative '../lib/cbor-pp'
56
58
  end
57
59
  case ARGV[1]
60
+ when /\A..*s/
61
+ $sequence = true
62
+ end
63
+ case ARGV[1]
58
64
  when /\Ar/ # secret
59
65
  $advanced = true
60
66
  my_pp parser.rules
@@ -81,15 +87,25 @@ begin
81
87
  g = parser.generate
82
88
  puts JSON.pretty_generate(g)
83
89
  end
84
- when /\Av/
85
- instance = read_arg(ARGV[2])
86
- instance = CBOR.decode(instance.b) rescue JSON.load(instance)
87
- instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
88
- ann = parser.validate(instance)
89
- # my_pp ann
90
- instance.cbor_add_annotations_from(ann) rescue nil
91
- my_diag(instance) if $annotate
92
- exit 1 unless ann
90
+ when /\Av(v)?/
91
+ verbose = $1
92
+ ARGV[2..-1].each do |fn|
93
+ instance = read_arg(fn)
94
+ instance = if $sequence
95
+ CBOR.decode("\x9f".b << instance.b << "\xff".b)
96
+ else
97
+ CBOR.decode(instance.b) rescue JSON.load(instance)
98
+ end
99
+ instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
100
+ warn "#{fn}:" if verbose
101
+ ann = parser.validate(instance)
102
+ # my_pp ann
103
+ instance.cbor_add_annotations_from(ann) rescue nil
104
+ my_diag(instance) if $annotate
105
+ unless ann
106
+ retcode = 1
107
+ end
108
+ end
93
109
  else
94
110
  usage
95
111
  end
@@ -97,3 +113,5 @@ rescue CDDL::ParseError => e
97
113
  warn e.message
98
114
  exit EX_DATAERR
99
115
  end
116
+
117
+ exit retcode
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.13'
3
+ s.version = '0.8.18'
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,24 @@ 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]
548
598
  end
549
599
 
550
600
  def extract_array(t)
@@ -568,7 +618,10 @@ module CDDL
568
618
  if warn
569
619
  if result
570
620
  if $features != {}
571
- 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 != {}
572
625
  end
573
626
  else
574
627
  warn "CDDL validation failure (#{result.inspect} for #{d.inspect}):"
@@ -772,10 +825,18 @@ module CDDL
772
825
  when :range
773
826
  [] if where[2] === d && where[1].include?(d)
774
827
  when :anno
775
- target = where[2]
776
- if ann = validate1a(d, target)
777
- control = where[3]
778
- 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
779
840
  when :size
780
841
  case d
781
842
  when Integer
@@ -831,7 +892,7 @@ module CDDL
831
892
  $features[nm][det] = true
832
893
  ann
833
894
  when :lt, :le, :gt, :ge, :eq, :ne
834
- op = OPERATORS[where[1]]
895
+ op = OPERATORS[conop]
835
896
  ok, v, _vt = extract_value(control)
836
897
  if ok
837
898
  ann if d.send(op, v) rescue nil # XXX Focus ArgumentError
@@ -847,6 +908,22 @@ module CDDL
847
908
  end
848
909
  end
849
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
+ )
850
927
  when :cbor
851
928
  ann if validate1((CBOR::decode(d) rescue :BAD_CBOR), control)
852
929
  when :cborseq
@@ -1201,7 +1278,7 @@ module CDDL
1201
1278
  BRACE = {"{" => :map, "[" => :array}
1202
1279
  RANGE_EXCLUDE_END = {".." => false, "..." => true}
1203
1280
  SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
1204
- :default, :lt, :le, :gt, :ge, :eq, :ne, :feature]
1281
+ :default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :abnf, :cat, :plus]
1205
1282
 
1206
1283
  def type1(n, canbegroup = false)
1207
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,37 @@
1
+ start = [Tag0, Tag1004]
2
+
3
+ ; for draft-ietf-cbor-date-tag
4
+ Tag1004 = #6.1004(text .abnf full-date)
5
+ ; for RFC 7049
6
+ Tag0 = #6.0(text .abnf date-time)
7
+
8
+ full-date = "full-date" .cat rfc3339
9
+ date-time = "date-time" .cat rfc3339
10
+
11
+ ; Note the trick of idiomatically starting with a newline, separating
12
+ ; off the element in the .cat from the rule-list
13
+ rfc3339 = '
14
+ date-fullyear = 4DIGIT
15
+ date-month = 2DIGIT ; 01-12
16
+ date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
17
+ ; month/year
18
+ time-hour = 2DIGIT ; 00-23
19
+ time-minute = 2DIGIT ; 00-59
20
+ time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap sec
21
+ ; rules
22
+ time-secfrac = "." 1*DIGIT
23
+ time-numoffset = ("+" / "-") time-hour ":" time-minute
24
+ time-offset = "Z" / time-numoffset
25
+
26
+ partial-time = time-hour ":" time-minute ":" time-second
27
+ [time-secfrac]
28
+ full-date = date-fullyear "-" date-month "-" date-mday
29
+ full-time = partial-time time-offset
30
+
31
+ date-time = full-date "T" full-time
32
+ ' .cat rfc5234-core
33
+
34
+ rfc5234-core = '
35
+ DIGIT = %x30-39 ; 0-9
36
+ ; abbreviated here
37
+ '
@@ -0,0 +1,2 @@
1
+ foo = text .regexp myregexp
2
+ myregexp = "A" .cat "B"
@@ -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.13
4
+ version: 0.8.18
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-11-13 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,8 @@ files:
100
114
  - test-data/7807.cddl
101
115
  - test-data/a.cddl
102
116
  - test-data/abignum.cddl
117
+ - test-data/abnf1.cddl
118
+ - test-data/abnf2.cddl
103
119
  - test-data/ambig.cddl
104
120
  - test-data/b.cddl
105
121
  - test-data/badaddr.cddl
@@ -107,6 +123,7 @@ files:
107
123
  - test-data/bpv7.cddl
108
124
  - test-data/bpv7a.cddl
109
125
  - test-data/bpv7b.cddl
126
+ - test-data/cat-re.cddl
110
127
  - test-data/cdni-ct.cddl
111
128
  - test-data/coral.cddl
112
129
  - test-data/coral1.cddl
@@ -150,6 +167,7 @@ files:
150
167
  - test-data/named-group.cddl
151
168
  - test-data/patch1.cddl
152
169
  - test-data/reused_named_group.cddl
170
+ - test-data/sequence.cddl
153
171
  - test-data/structure.cddl
154
172
  - test-data/test-gen.cddl
155
173
  - test-data/toerless0.cddl
@@ -180,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
180
198
  - !ruby/object:Gem::Version
181
199
  version: '0'
182
200
  requirements: []
183
- rubygems_version: 3.1.2
201
+ rubygems_version: 3.2.3
184
202
  signing_key:
185
203
  specification_version: 4
186
204
  summary: CDDL generator and validator.