cddl 0.1.2 → 0.1.3

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: 5b80c417f78166e91712ce4270d125de2882dbc6
4
- data.tar.gz: 49627f00404731d047e12980ca3eaed9ed1e81ee
3
+ metadata.gz: 6c11e42eff3d540d3d5a7db2097a1e247788ffbe
4
+ data.tar.gz: 19183bc21865f3c17b8b89f91747a006f1c1d49c
5
5
  SHA512:
6
- metadata.gz: a179a6580f45955f1b3240b4dffbf5dc0dd06efbaeb5d6058131a6d1a536c9509765d5fc3649608fe4e4b9f02de93420ba66de7a1924fe8d105d644307145f82
7
- data.tar.gz: 43dd94d9885dbd746bb653ec5db7d9a27760c18bd99ad412ae449962d576bb9bdb0b5f4a54505606005694ea627da6696a1090df8b8994c2f9e9aa8e1542557e
6
+ metadata.gz: 2f19f5e350b7fd93d674f120ad6dcb43c06edacb2f3c78bf6f81c7643319268c8ddb4d65f512d381c1813eba07e3fd7cc64640f06e1e69a8743cfae9170d5bf1
7
+ data.tar.gz: 7423ef4fd5b04d518be5df9a597f85143b4a6b60f8a8955675805344d0a27d2646cb5df911ce6a243d52af43475ce81b1a3351a62f863df2a58a0b43dce46698
data/bin/cddl CHANGED
@@ -15,9 +15,14 @@ def usage
15
15
  exit 1
16
16
  end
17
17
 
18
+ def parser
19
+ @parser ||= CDDL::Parser.new(File.read(ARGV[0]))
20
+ end
21
+
18
22
  case ARGV[1]
23
+ when /\Ar/ # secret
24
+ pp parser.rules
19
25
  when /\Ag/
20
- parser = CDDL::Parser.new(File.read(ARGV[0]))
21
26
  n = 1
22
27
  n = ARGV[2].to_i if ARGV[2]
23
28
  n.times do
@@ -25,7 +30,6 @@ when /\Ag/
25
30
  puts g.cbor_diagnostic
26
31
  end
27
32
  when /\Aj/
28
- parser = CDDL::Parser.new(File.read(ARGV[0]))
29
33
  n = 1
30
34
  n = ARGV[2].to_i if ARGV[2]
31
35
  n.times do
@@ -33,7 +37,6 @@ when /\Aj/
33
37
  puts JSON.pretty_generate(g)
34
38
  end
35
39
  when /\Av/
36
- parser = CDDL::Parser.new(File.read(ARGV[0]))
37
40
  instance = File.read(ARGV[2])
38
41
  instance = CBOR.decode(instance.b) rescue JSON.load(instance)
39
42
  p parser.validate(instance)
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.1.2'
3
+ s.version = '0.1.3'
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')
@@ -34,16 +34,18 @@ occur = [uint] "*" [uint]
34
34
  / "+"
35
35
  / "?"
36
36
 
37
- uint = "0"
38
- / DIGIT1 *DIGIT
37
+ uint = ["0x" / "0b"] "0"
38
+ / ["0x" / "0b"] DIGIT1 *DIGIT
39
39
 
40
- value = int
41
- / float
40
+ value = number
42
41
  / string
43
42
 
44
43
  int = ["-"] uint
45
44
 
46
- float = int ["." 1*DIGIT] ["e" int ]
45
+ ; This is a float if it has fraction or exponent; int otherwise
46
+ number = int ["." fraction] ["e" exponent ]
47
+ fraction = 1*DIGIT
48
+ exponent = int
47
49
 
48
50
  string = %x22 *SCHAR %x22
49
51
  SCHAR = %x20-21 / %x23-7E / SESC
@@ -41,3 +41,4 @@ true = #7.21
41
41
  nil = #7.22
42
42
  undefined = #7.23
43
43
 
44
+ used_in_cddl_prelude = any / bstr / tdate / time / number / biguint / bignint / bigint / integer / decfrac / bigfloat / eb64url / eb64legacy / eb16 / encoded-cbor / uri / b64url / b64legacy / regexp / mime-message / cbor-any / float16 / float32 / float64 / float16-32 / float32-64 / float / false / true / nil / undefined / uint / nint / int / tstr
@@ -50,11 +50,18 @@ module CDDL
50
50
  @rootrule = @rules.keys.first
51
51
  # now process the rules...
52
52
  @stage1 = {}
53
- r_process(@rootrule, @rules[@rootrule])
54
- # @rules.each do |n, r| # debug only loop
55
- # r_process(n, r)
53
+ result = r_process(@rootrule, @rules[@rootrule])
54
+ r_process("used_in_cddl_prelude", @rules["used_in_cddl_prelude"])
55
+ @rules.each do |n, r|
56
+ # r_process(n, r) # debug only loop
57
+ warn "Unused rule #{n}" unless @stage1[n]
58
+ end
59
+ if result[0] == :grpent
60
+ warn "Group at top -- first rule must be a type!"
61
+ end
56
62
  # end
57
63
  # @stage1
64
+ result
58
65
  end
59
66
 
60
67
  def generate(where=rules, inmap = false)
@@ -109,7 +116,7 @@ module CDDL
109
116
  fail "Can't generate prim #{where[1]}"
110
117
  end
111
118
  else
112
- # fail where
119
+ fail "Don't know how to generate from #{where[0]}"
113
120
  end
114
121
  end
115
122
 
@@ -214,6 +221,7 @@ module CDDL
214
221
  _, v = extract_value(where)
215
222
  d == v
216
223
  when :prim
224
+ # warn "validate prim WI #{where.inspect} #{d.inspect}"
217
225
  case where[1]
218
226
  when nil
219
227
  true
@@ -242,7 +250,7 @@ module CDDL
242
250
  end
243
251
 
244
252
  else
245
- fail "Can't generate prim #{where[1]}"
253
+ fail "Can't validate prim #{where[1]} yet"
246
254
  end
247
255
  else
248
256
  # fail where
@@ -273,7 +281,9 @@ module CDDL
273
281
 
274
282
  def value(n)
275
283
  # cheat:
284
+ # warn n
276
285
  val = eval(n.to_s)
286
+ # warn val
277
287
  [case val
278
288
  when Integer; :int
279
289
  when Numeric; :float
@@ -318,11 +328,15 @@ module CDDL
318
328
 
319
329
  def label(n)
320
330
  # if this is not a rulename, it's a bareword
321
- name = n.to_s
322
- if r = @rules[name]
323
- r_process(name, r)
331
+ if n.bareword
332
+ name = n.to_s
333
+ if r = @rules[name]
334
+ r_process(name, r)
335
+ else
336
+ [:string, name]
337
+ end
324
338
  else
325
- [:string, name]
339
+ type1(n.type1)
326
340
  end
327
341
  end
328
342
 
@@ -0,0 +1,7 @@
1
+ ; This is a comment
2
+ person = { g }
3
+
4
+ g = (
5
+ name: tstr,
6
+ age: int,
7
+ )
@@ -0,0 +1 @@
1
+ foo = #
@@ -0,0 +1,14 @@
1
+ info = (
2
+ age: int,
3
+ name: tstr,
4
+ )
5
+ person = {
6
+ info,
7
+ employer: tstr,
8
+ }
9
+ dog = {
10
+ info,
11
+ collar: color,
12
+ }
13
+
14
+ color = "blue"
@@ -0,0 +1,9 @@
1
+ Geography = [
2
+ city : tstr
3
+ gpsCoordinates : GpsCoordinates
4
+ ]
5
+
6
+ GpsCoordinates = {
7
+ longitude : uint ; multiplied by 10^7
8
+ latitude : uint ; multiplied by 10^7
9
+ }
@@ -0,0 +1,13 @@
1
+ person = {(
2
+ age: int,
3
+ name: tstr,
4
+ collar: color,
5
+ )}
6
+
7
+ dog = {(
8
+ age: int,
9
+ name: tstr,
10
+ employer: tstr,
11
+ )}
12
+
13
+ color = "red"
@@ -49,6 +49,39 @@ class TestABNF < Test::Unit::TestCase
49
49
  end
50
50
  end
51
51
 
52
+ def test_generate_hex_bin
53
+ parser = CDDL::Parser.new <<HERE
54
+ test = [0x4711, 0b1011001110001111000]
55
+ HERE
56
+ assert_equal [0x4711, 0b1011001110001111000], parser.generate
57
+ end
58
+
59
+
60
+ def test_validate_person_occurs
61
+ person = <<HERE
62
+ person = (
63
+ name: tstr,
64
+ age: uint,
65
+ )
66
+ HERE
67
+ parser1 = CDDL::Parser.new "unlimitedpersons = [* person ]" + person
68
+ parser2 = CDDL::Parser.new "oneortwoPerson = [1*2 person ]" + person
69
+ parser3 = CDDL::Parser.new "min2Person = [2* person ]" + person
70
+
71
+ assert parser1.validate([])
72
+ refute parser2.validate([], false)
73
+ refute parser3.validate([], false)
74
+ assert parser1.validate(["Methuselah", 969])
75
+ assert parser2.validate(["Methuselah", 969])
76
+ refute parser3.validate(["Methuselah", 969], false)
77
+ assert parser1.validate(["Methuselah", "Methuselah", 969, 969]) # XXX Sequence
78
+ assert parser2.validate(["Methuselah", "Methuselah", 969, 969])
79
+ assert parser3.validate(["Methuselah", "Methuselah", 969, 969])
80
+ assert parser1.validate(["Methuselah", "Methuselah", "Methuselah", 969, 969]) # XXX Sequence
81
+ refute parser2.validate(["Methuselah", "Methuselah", "Methuselah", 969, 969], false)
82
+ assert parser3.validate(["Methuselah", "Methuselah", "Methuselah", 969, 969])
83
+ end
84
+
52
85
  def test_validate
53
86
  parser1 = CDDL::Parser.new(File.read("test-data/7071-concise.cddl"))
54
87
  g = parser1.generate
@@ -288,5 +321,24 @@ HERE
288
321
  refute parser.validate([1, 2, 1], false)
289
322
  end
290
323
 
324
+ def test_validate_json_float
325
+ parser = CDDL::Parser.new <<HERE
326
+ test = {
327
+ foo: int
328
+ ? bar: beer
329
+ f16: float16
330
+ "f64": float64
331
+ }
332
+ beer = 3.14 / 6.28
333
+ HERE
334
+ pp parser.rules
335
+ pp parser.generate
336
+ refute parser.validate({}, false)
337
+ assert parser.validate({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 3.14})
338
+ assert parser.validate({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 6.28})
339
+ refute parser.validate({"f16" => 1.5, "foo" => 1, "f64" => 1.1, "bar" => 3.15}, false)
340
+ assert parser.validate({"f16" => 1.5, "foo" => 1, "f64" => 1.1})
341
+ refute parser.validate({"f16" => 1, "foo" => 1, "f64" => 1.1}, false)
342
+ end
291
343
 
292
344
  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.2
4
+ version: 0.1.3
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-02-28 00:00:00.000000000 Z
11
+ date: 2015-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag
@@ -66,6 +66,11 @@ files:
66
66
  - lib/cddl.rb
67
67
  - test-data/7071-concise.cddl
68
68
  - test-data/7071-verbose.cddl
69
+ - test-data/basic_syntax_example.cddl
70
+ - test-data/minimal.cddl
71
+ - test-data/reused_named_group.cddl
72
+ - test-data/structure.cddl
73
+ - test-data/two_anonymous_groups.cddl
69
74
  - test/test-cddl.rb
70
75
  homepage: http://github.com/cabo/cddl
71
76
  licenses: