cddl 0.1.6 → 0.1.7

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