cddl 0.1.6 → 0.1.7

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
  SHA1:
3
- metadata.gz: 3d195f7221754d19c72524ad9e7f813021ffbb06
4
- data.tar.gz: 3db97cb441c00b2abc6a420163352243e8c89e07
3
+ metadata.gz: 18e49f92e707d92bff7762be5f4905702b48f179
4
+ data.tar.gz: 4f3fb0f3fc4573ec189ab16cf280ae1fcb63ead0
5
5
  SHA512:
6
- metadata.gz: c6fe1856503d0f3b316830fc61b6b9569014981528fd5058c8390553565adf5cf7e4fb16712e4d2a47877dcb02d066ba818775d75c12121db3c41f8e63d2cb52
7
- data.tar.gz: 84da634e9885f93badaeda4f0642163a9959ebf362b8e544189b4810076e1abf574378e6c470e4cc5b2eeeb560b251a0c1265734fd6b6de615891f39cdd10d81
6
+ metadata.gz: 81b2b4241507fdb26f88164daacff36dc73e7f67df3d85662a9f76999f1aa7d7ae2fce72e93e87fbe55991a7b3f8459aa064cfff47f545f05e1904a3e1bef20a
7
+ data.tar.gz: 89b707e68854724d991785432dac1ed3e2814ae0d92791e3b30ade4e769eeb8508cfb457e0f4fc19b36494320ddbc98caa1ad04b7551359e15c59d4aae7a7a0f
data/cddl.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.1.6'
3
+ s.version = '0.1.7'
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')
data/data/cddl.abnf CHANGED
@@ -7,14 +7,20 @@ groupname = id
7
7
 
8
8
  type = type1 S *("/" S type1 S)
9
9
 
10
- type1 = value
10
+ type1 = type2 [rangeop type2]
11
11
  / "#" "6" ["." uint] "(" S type S ")" ; note no space!
12
12
  / "#" DIGIT ["." uint] ; major/ai
13
13
  / "#" ; any
14
14
  / "{" S group S "}"
15
15
  / "[" S group S "]"
16
- / "(" type ")"
17
- / typename
16
+ / "&" S "(" S group S ")"
17
+ / "&" S groupname
18
+
19
+ type2 = value
20
+ / typename
21
+ / "(" type ")"
22
+
23
+ rangeop = "..." / ".."
18
24
 
19
25
  group = "(" S *grpent S ")"
20
26
  / *grpent
data/lib/cddl.rb CHANGED
@@ -97,6 +97,8 @@ module CDDL
97
97
  ]}
98
98
  when :string, :int, :float
99
99
  where[1]
100
+ when :range
101
+ rand(where[1])
100
102
  when :prim
101
103
  case where[1]
102
104
  when nil
@@ -134,17 +136,17 @@ module CDDL
134
136
  end
135
137
  end
136
138
 
137
- VALUE_TYPE = {string: true, int: true, float: true}
139
+ VALUE_TYPE = {string: String, int: Integer, float: Float}
138
140
  SIMPLE_VALUE = {
139
- [:prim, 7, 20] => [true, false],
140
- [:prim, 7, 21] => [true, true],
141
- [:prim, 7, 22] => [true, nil],
142
- [:prim, 7, 23] => [true, :undefined],
141
+ [:prim, 7, 20] => [true, false, :bool],
142
+ [:prim, 7, 21] => [true, true, :bool],
143
+ [:prim, 7, 22] => [true, nil, :nil],
144
+ [:prim, 7, 23] => [true, :undefined, :undefined],
143
145
  }
144
146
 
145
147
  def extract_value(t)
146
- if VALUE_TYPE[t[0]]
147
- [true, t[1]]
148
+ if vt = VALUE_TYPE[t[0]]
149
+ [true, t[1], vt]
148
150
  elsif v = SIMPLE_VALUE[t]
149
151
  v
150
152
  else
@@ -251,6 +253,8 @@ module CDDL
251
253
  when :string, :int, :float
252
254
  _, v = extract_value(where)
253
255
  d == v
256
+ when :range
257
+ where[2] === d && where[1].include?(d)
254
258
  when :prim
255
259
  # warn "validate prim WI #{where.inspect} #{d.inspect}"
256
260
  case where[1]
@@ -336,7 +340,7 @@ module CDDL
336
340
  else
337
341
  type1(n.type1, true) # type1 can be a group here!
338
342
  end
339
- if t[0] == :grpent && (@insides.last == :map || occ == [1, 1])
343
+ if t[0] == :grpent && (@insides.last != :array || occ == [1, 1])
340
344
  # go through the members here and multiply the occs
341
345
  t1 = t[1..-1].flatten(1)
342
346
  t1.flat_map {|t2|
@@ -398,11 +402,10 @@ module CDDL
398
402
  end
399
403
  end
400
404
 
401
- BRACE = {"{" => :map, "[" => :array}
402
-
403
- def type1(n, canbegroup = false)
404
- # puts "NVALUE #{n.value.inspect}"
405
- if v = n.value
405
+ def type2(n, canbegroup = false)
406
+ if v = n.type
407
+ type(n.type)
408
+ elsif v = n.value
406
409
  value(n)
407
410
  elsif v = n.typename
408
411
  t = type_recall(v.to_s, canbegroup)
@@ -421,6 +424,28 @@ module CDDL
421
424
  end
422
425
  end # XXX should flatten the thing, too
423
426
  t
427
+ end
428
+ end
429
+
430
+ BRACE = {"{" => :map, "[" => :array}
431
+ RANGE_EXCLUDE_END = {".." => false, "..." => true}
432
+
433
+ def type1(n, canbegroup = false)
434
+ # puts "NVALUE #{n.value.inspect}"
435
+ if v = n.type2
436
+ if ro = n.rangeop
437
+ cats = []
438
+ [:range, Range.new(*n.children(:type2).map {|l|
439
+ ok, val, cat = extract_value(type2(l))
440
+ fail "Can't have range with #{l}" unless ok
441
+ # XXX really should be checking type coherence of range
442
+ cats << cat
443
+ val
444
+ }, RANGE_EXCLUDE_END[ro.to_s]),
445
+ cats[0] == cats[1] ? cats[0] : fail("Incompatible range #{cats}")]
446
+ else
447
+ type2(v, canbegroup)
448
+ end
424
449
  else
425
450
  case str = n.to_s
426
451
  when "#"
@@ -432,8 +457,6 @@ module CDDL
432
457
  s << type(tagged_type)
433
458
  end
434
459
  s
435
- when /\A\(/
436
- type(n.type)
437
460
  when /\A[\[{]/
438
461
  type = BRACE[str[0]]
439
462
  @insides << type
@@ -448,6 +471,20 @@ module CDDL
448
471
  end
449
472
  # warn s.inspect
450
473
  [type, *s]
474
+ when /\A&/
475
+ if gn = n.groupname
476
+ s = group_recall(gn.to_s).flatten(1)
477
+ else
478
+ @insides << :enum
479
+ s = n.children(:group).flat_map {|ch| group(ch)}
480
+ @insides.pop
481
+ end
482
+ [:type1, *s.map {|mem|
483
+ t, _s, _e, _k, v = mem
484
+ fail unless t == :member
485
+ v
486
+ }
487
+ ]
451
488
  else
452
489
  "unimplemented #{n}"
453
490
  end
data/test/test-cddl.rb CHANGED
@@ -425,4 +425,169 @@ HERE
425
425
  assert_equal [:type1, [:map, [:member, 0, CDDL::MANY, [:string, "b"], [:int, 1]]]], parser.rules
426
426
  end
427
427
 
428
+ def test_range_integer
429
+ parser = CDDL::Parser.new <<HERE
430
+ color = 0..12
431
+ HERE
432
+ pp parser.generate
433
+ 10.times {
434
+ assert parser.generate.between?(0, 12)
435
+ }
436
+ assert parser.validate(0)
437
+ assert parser.validate(7)
438
+ assert parser.validate(12)
439
+ refute parser.validate(-1, false)
440
+ refute parser.validate(13, false)
441
+ end
442
+
443
+ def test_range_integer_excl
444
+ parser = CDDL::Parser.new <<HERE
445
+ color = 0...13
446
+ HERE
447
+ 10.times {
448
+ assert parser.generate.between?(0, 12)
449
+ }
450
+ assert parser.validate(0)
451
+ assert parser.validate(7)
452
+ refute parser.validate(7.0)
453
+ assert parser.validate(12)
454
+ refute parser.validate(-1, false)
455
+ refute parser.validate(13, false)
456
+ end
457
+
458
+ def test_range_float
459
+ parser = CDDL::Parser.new <<HERE
460
+ color = 0.5..max
461
+ max = 12.5
462
+ HERE
463
+ pp parser.rules
464
+ 10.times {
465
+ assert parser.generate.between?(0.5, 12.5)
466
+ }
467
+ refute parser.validate(0.0, false)
468
+ assert parser.validate(0.5)
469
+ assert parser.validate(7.0)
470
+ refute parser.validate(7)
471
+ assert parser.validate(12.0)
472
+ assert parser.validate(12.5)
473
+ refute parser.validate(-1.0, false)
474
+ refute parser.validate(13.0, false)
475
+ end
476
+
477
+ def test_enum
478
+ parser = CDDL::Parser.new <<HERE
479
+ color = &(
480
+ black: 0,
481
+ red: 1,
482
+ green: 2,
483
+ yellow: 3,
484
+ blue: 4,
485
+ magenta: 5,
486
+ cyan: 6,
487
+ white: 7,
488
+ orange: 8,
489
+ pink: 9,
490
+ purple: 10,
491
+ brown: 11,
492
+ grey: 12,
493
+ )
494
+ HERE
495
+ # brittle on type1 nesting optimization
496
+ assert_equal [:type1,
497
+ [:type1,
498
+ [:int, 0],
499
+ [:int, 1],
500
+ [:int, 2],
501
+ [:int, 3],
502
+ [:int, 4],
503
+ [:int, 5],
504
+ [:int, 6],
505
+ [:int, 7],
506
+ [:int, 8],
507
+ [:int, 9],
508
+ [:int, 10],
509
+ [:int, 11],
510
+ [:int, 12]]], parser.rules
511
+ 10.times {
512
+ assert parser.generate.between?(0, 12)
513
+ }
514
+ end
515
+
516
+ def test_enum_indirect
517
+ parser = CDDL::Parser.new <<HERE
518
+ color = &colors
519
+ basecolors = (
520
+ red: 1,
521
+ green: 2,
522
+ blue: 4,
523
+ lila,
524
+ )
525
+ lila = (
526
+ magenta: 5,
527
+ pink: 9,
528
+ purple: 10,
529
+ )
530
+ colors = (
531
+ black: 0,
532
+ basecolors,
533
+ yellow: 3,
534
+ cyan: 6,
535
+ white: 7,
536
+ orange: 8,
537
+ brown: 11,
538
+ grey: 12,
539
+ )
540
+ HERE
541
+ # brittle on type1 nesting optimization
542
+ assert_equal [:type1,
543
+ [:type1,
544
+ [:int, 0],
545
+ [:int, 1],
546
+ [:int, 2],
547
+ [:int, 4],
548
+ [:int, 5],
549
+ [:int, 9],
550
+ [:int, 10],
551
+ [:int, 3],
552
+ [:int, 6],
553
+ [:int, 7],
554
+ [:int, 8],
555
+ [:int, 11],
556
+ [:int, 12]]], parser.rules
557
+ 10.times {
558
+ assert parser.generate.between?(0, 12)
559
+ }
560
+ end
561
+
562
+ def test_invalidate_unequal_range
563
+ # $debug_ast = true
564
+ parser = CDDL::Parser.new <<HERE
565
+ test = 1..2.5
566
+ HERE
567
+ # puts "RULES:"
568
+ assert_raise { # TODO: This really should be checked at parse time
569
+ pp parser.rules
570
+ }
571
+ # puts "APR:"
572
+ # pp parser.apr
573
+ assert_raise { puts parser.generate() }
574
+ assert_raise { parser.validate({}) }
575
+ end
576
+
577
+ def test_invalidate_boolean_range
578
+ # $debug_ast = true
579
+ parser = CDDL::Parser.new <<HERE
580
+ test = false..true
581
+ HERE
582
+ # puts "RULES:"
583
+ assert_raise { # TODO: This really should be checked at parse time
584
+ pp parser.rules
585
+ }
586
+ # puts "APR:"
587
+ # pp parser.apr
588
+ assert_raise { puts parser.generate() }
589
+ assert_raise { parser.validate({}) }
590
+ end
591
+
592
+
428
593
  end
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.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-04 00:00:00.000000000 Z
11
+ date: 2015-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag