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 +4 -4
- data/cddl.gemspec +1 -1
- data/data/cddl.abnf +9 -3
- data/lib/cddl.rb +52 -15
- data/test/test-cddl.rb +165 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18e49f92e707d92bff7762be5f4905702b48f179
|
4
|
+
data.tar.gz: 4f3fb0f3fc4573ec189ab16cf280ae1fcb63ead0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81b2b4241507fdb26f88164daacff36dc73e7f67df3d85662a9f76999f1aa7d7ae2fce72e93e87fbe55991a7b3f8459aa064cfff47f545f05e1904a3e1bef20a
|
7
|
+
data.tar.gz: 89b707e68854724d991785432dac1ed3e2814ae0d92791e3b30ade4e769eeb8508cfb457e0f4fc19b36494320ddbc98caa1ad04b7551359e15c59d4aae7a7a0f
|
data/cddl.gemspec
CHANGED
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 =
|
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
|
-
/ "("
|
17
|
-
/
|
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:
|
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
|
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
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
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.
|
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-
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cbor-diag
|