cddl 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
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