cddl 0.1.2 → 0.1.3

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