cddl 0.4.0 → 0.4.1

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/cddl.gemspec +1 -1
  3. data/lib/cddl.rb +47 -15
  4. data/test/test-cddl.rb +19 -0
  5. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 167e4f338b7d73dd31d38e050c736fe9d8041984
4
- data.tar.gz: 62c373480ad582423abcf9c5475371a11f08425b
3
+ metadata.gz: d81421c45b8589d98a0bee597ebf58684b6dc47d
4
+ data.tar.gz: 2c43ce26e9ec1061a91ffc078eb797293e6e861c
5
5
  SHA512:
6
- metadata.gz: 6f26f2048e7a77f12175e23430bf1a0c5271deaa4e0d499683f1d25785aec4765b70966af4b7c155469f68a2db7cb9540658909da1764b6f3a221eed4dcfb92d
7
- data.tar.gz: 7e922d96378421546a660cfda5c1dc3ff54efa5ee218767323e1015570f875e829c196e5a90e4115be42c504c9c7d2f51d73b5a8d05f7e14f7d5946886b97cce
6
+ metadata.gz: a59f236c132f7d3c4c20b20275270a304873abe3a0a527cd923a84d683ab953d59a65fa006f7de0c81de45c0d175bb86dcbb7abc680aa5f83e7753464d0dc8d6
7
+ data.tar.gz: 2724e39b65ff8d6b2de65845ae67a713276fd99743625f2745bc4d6a6c0433ae43f736d47e1741f5e4df936c5102f112e675e541cffa3991a98abb54e93c9b67
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.4.0'
3
+ s.version = '0.4.1'
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')
@@ -14,6 +14,8 @@ module CDDL
14
14
 
15
15
  MANY = Float::INFINITY
16
16
 
17
+ MAX_RECURSE = 32 # XXX
18
+
17
19
  class ParseError < ArgumentError; end
18
20
 
19
21
  class Parser
@@ -119,14 +121,19 @@ module CDDL
119
121
  h[k] = Regexp.new("\\A#{k}\\z")
120
122
  }
121
123
 
122
- def generate(where=rules, inmap = false)
124
+ def generate
125
+ @recursion = 0
126
+ generate1(rules)
127
+ end
128
+
129
+ def generate1(where, inmap = false)
123
130
  case where[0]
124
131
  when :type1
125
- generate(where[rand(where.size-1)+1])
132
+ generate1(where[rand(where.size-1)+1])
126
133
  when :map
127
- Hash[where[1..-1].flat_map {|m| generate(m, true)}]
134
+ Hash[where[1..-1].flat_map {|m| generate1(m, true)}]
128
135
  when :array, :grpent
129
- r = where[1..-1].flat_map {|m| generate(m).map{|e| e[1]}}
136
+ r = where[1..-1].flat_map {|m| generate1(m).map{|e| e[1]}}
130
137
  .flat_map {|e| Array === e && e[0] == :grpent ? e[1..-1] : [e]}
131
138
  # nested grpents need to be "unpacked"
132
139
  if where[0] == :grpent
@@ -141,8 +148,8 @@ module CDDL
141
148
  kr = where[3]
142
149
  vr = where[4]
143
150
  fail "member key not given in map for #{where}" unless kr if inmap
144
- Array.new(st) { [ (generate(kr) if kr), # XXX: need error in map context
145
- generate(vr)
151
+ Array.new(st) { [ (generate1(kr) if kr), # XXX: need error in map context
152
+ generate1(vr)
146
153
  ]}
147
154
  when :string, :int, :float
148
155
  where[1]
@@ -161,7 +168,7 @@ module CDDL
161
168
  when 3
162
169
  gen_word
163
170
  when 6
164
- CBOR::Tagged.new(where[2], generate(where[3]))
171
+ CBOR::Tagged.new(where[2], generate1(where[3]))
165
172
  when 7
166
173
  case where[2]
167
174
  when nil
@@ -185,13 +192,13 @@ module CDDL
185
192
  control = where[3]
186
193
  case where[1]
187
194
  when :size
188
- should_be_int = generate(control)
195
+ should_be_int = generate1(control)
189
196
  unless target == [:prim, 2] && Integer === should_be_int
190
197
  fail "Don't know yet how to generate #{where}"
191
198
  end
192
199
  Random.new.bytes(should_be_int)
193
200
  when :bits
194
- set_of_bits = Array.new(10) { generate(control) } # XXX: ten?
201
+ set_of_bits = Array.new(10) { generate1(control) } # XXX: ten?
195
202
  # p set_of_bits
196
203
  unless (target == [:prim, 0] || target == [:prim, 2]) &&
197
204
  set_of_bits.all? {|x| Integer === x && x >= 0 }
@@ -213,7 +220,7 @@ module CDDL
213
220
  end
214
221
  end
215
222
  when :regexp
216
- regexp = generate(control)
223
+ regexp = generate1(control)
217
224
  unless target == [:prim, 3] && String === regexp
218
225
  fail "Don't know yet how to generate #{where}"
219
226
  end
@@ -221,6 +228,17 @@ module CDDL
221
228
  else
222
229
  fail "Don't know yet how to generate from #{where}"
223
230
  end
231
+ when :recurse
232
+ name = where[1]
233
+ rule = @stage1[name]
234
+ if @recursion < MAX_RECURSE
235
+ @recursion += 1
236
+ r = generate1(rule)
237
+ @recursion -= 1
238
+ r
239
+ else
240
+ fail "Deep recursion into #{name}: #{@stage1[name]}, not yet implemented"
241
+ end
224
242
  else
225
243
  fail "Don't know how to generate from #{where[0]}"
226
244
  end
@@ -249,6 +267,7 @@ module CDDL
249
267
  end
250
268
 
251
269
  def validate(d, warn=true)
270
+ @recursion = 0
252
271
  result = validate1(d)
253
272
  unless result
254
273
  if warn
@@ -416,10 +435,20 @@ module CDDL
416
435
  fail
417
436
  end
418
437
  end
419
-
420
438
  else
421
439
  fail "Can't validate prim #{where[1]} yet"
422
440
  end
441
+ when :recurse
442
+ name = where[1]
443
+ rule = @stage1[name]
444
+ if @recursion < MAX_RECURSE
445
+ @recursion += 1
446
+ r = validate1(d, rule)
447
+ @recursion -= 1
448
+ r
449
+ else
450
+ fail "Deep recursion into #{name}: #{rule}, not yet implemented"
451
+ end
423
452
  else
424
453
  # fail where
425
454
  end
@@ -455,12 +484,15 @@ module CDDL
455
484
  end
456
485
 
457
486
  def r_process(n, r, bindings = {})
458
- @bindings.push(bindings)
459
487
  t = r[0]
460
488
  # puts "Processing rule #{n} = #{t}"
461
- r = @stage1[n] ||= [t, *r[1..-1].map {|e| send(t, e)}]
462
- @bindings.pop
463
- r
489
+ @stage1[n] ||= begin
490
+ @stage1[n] = [:type1, [:recurse, n]]
491
+ @bindings.push(bindings)
492
+ r = [t, *r[1..-1].map {|e| send(t, e)}]
493
+ @bindings.pop
494
+ r
495
+ end
464
496
  end
465
497
 
466
498
  def value(n)
@@ -811,4 +811,23 @@ HERE
811
811
  }
812
812
  end
813
813
 
814
+ def test_endless_recursion
815
+ parser = CDDL::Parser.new <<HERE
816
+ a = a
817
+ HERE
818
+ assert_raise { parser.validate(1) }
819
+ assert_raise { parser.generate }
820
+ end
821
+
822
+ def test_recursion
823
+ parser = CDDL::Parser.new <<HERE
824
+ a = [a] / 1
825
+ HERE
826
+ 10.times {
827
+ g = parser.generate
828
+ pp ["recurse-test", g]
829
+ assert parser.validate(g)
830
+ }
831
+ end
832
+
814
833
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cddl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann