cddl 0.8.13 → 0.8.18

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