slow_blink 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/ext/slow_blink/ext_schema_parser/parser.c +4 -4
  4. data/ext/slow_blink/message/ext_compact_encoder/compact_encoder.c +5 -5
  5. data/ext/slow_blink/message/ext_compact_encoder/ext_compact_encoder.c +31 -18
  6. data/lib/slow_blink/annotatable.rb +20 -17
  7. data/lib/slow_blink/annotation.rb +20 -18
  8. data/lib/slow_blink/binary.rb +20 -17
  9. data/lib/slow_blink/boolean.rb +20 -17
  10. data/lib/slow_blink/date.rb +20 -17
  11. data/lib/slow_blink/decimal.rb +20 -17
  12. data/lib/slow_blink/definition.rb +21 -19
  13. data/lib/slow_blink/enumeration.rb +30 -26
  14. data/lib/slow_blink/field.rb +20 -17
  15. data/lib/slow_blink/fixed.rb +20 -17
  16. data/lib/slow_blink/floating_point.rb +20 -17
  17. data/lib/slow_blink/group.rb +21 -18
  18. data/lib/slow_blink/incremental_annotation.rb +21 -18
  19. data/lib/slow_blink/integer.rb +20 -17
  20. data/lib/slow_blink/log.rb +20 -17
  21. data/lib/slow_blink/message/binary.rb +23 -18
  22. data/lib/slow_blink/message/boolean.rb +22 -17
  23. data/lib/slow_blink/message/date.rb +23 -18
  24. data/lib/slow_blink/message/decimal.rb +38 -21
  25. data/lib/slow_blink/message/enumeration.rb +31 -21
  26. data/lib/slow_blink/message/field.rb +23 -18
  27. data/lib/slow_blink/message/fixed.rb +23 -19
  28. data/lib/slow_blink/message/floating_point.rb +22 -17
  29. data/lib/slow_blink/message/group.rb +90 -55
  30. data/lib/slow_blink/message/integer.rb +51 -24
  31. data/lib/slow_blink/message/model.rb +197 -131
  32. data/lib/slow_blink/message/sequence.rb +31 -25
  33. data/lib/slow_blink/message/string.rb +23 -18
  34. data/lib/slow_blink/message/time.rb +31 -25
  35. data/lib/slow_blink/message/time_of_day.rb +24 -18
  36. data/lib/slow_blink/name_with_id.rb +20 -17
  37. data/lib/slow_blink/namespace.rb +22 -19
  38. data/lib/slow_blink/object.rb +20 -17
  39. data/lib/slow_blink/parse_error.rb +26 -0
  40. data/lib/slow_blink/ref.rb +20 -17
  41. data/lib/slow_blink/schema.rb +26 -24
  42. data/lib/slow_blink/schema_buffer.rb +20 -17
  43. data/lib/slow_blink/sequence.rb +20 -17
  44. data/lib/slow_blink/string.rb +20 -17
  45. data/lib/slow_blink/sym.rb +20 -17
  46. data/lib/slow_blink/time.rb +20 -17
  47. data/lib/slow_blink/time_of_day.rb +20 -17
  48. data/lib/slow_blink/type.rb +20 -17
  49. data/lib/slow_blink/version.rb +21 -18
  50. data/lib/slow_blink.rb +19 -17
  51. data/test/tc_compact_encoder.rb +64 -30
  52. data/test/tc_group.rb +0 -19
  53. data/test/tc_incr_annote.rb +0 -21
  54. data/test/tc_model_decimal.rb +94 -0
  55. data/test/tc_model_dynamic_group.rb +0 -19
  56. data/test/tc_model_extension.rb +0 -19
  57. data/test/tc_model_sequence_of_string.rb +29 -0
  58. data/test/tc_model_static_group.rb +0 -19
  59. data/test/tc_model_think_blink.rb +0 -19
  60. data/test/tc_types.rb +0 -19
  61. metadata +8 -4
  62. data/lib/slow_blink/compact_encoder.rb +0 -72
  63. data/lib/slow_blink/error.rb +0 -23
@@ -1,42 +1,50 @@
1
- # Copyright (c) 2016 Cameron Harper
1
+ # @license
2
+ #
3
+ # Copyright (c) 2016 Cameron Harper
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ # this software and associated documentation files (the "Software"), to deal in
7
+ # the Software without restriction, including without limitation the rights to
8
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ # the Software, and to permit persons to whom the Software is furnished to do so,
10
+ # subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
2
14
  #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- # this software and associated documentation files (the "Software"), to deal in
5
- # the Software without restriction, including without limitation the rights to
6
- # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
- # the Software, and to permit persons to whom the Software is furnished to do so,
8
- # subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in all
11
- # copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
- # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
- # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
- # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
- # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
21
 
20
22
  module SlowBlink::Message
21
23
 
24
+ # @abstract
25
+ #
22
26
  # A Group may form a complete message or be nested as a {DynamicGroup}
23
27
  class Group
24
28
 
29
+ # @private
25
30
  # @return [Hash<Field>] group fields
26
31
  def self.fields
27
32
  @fields
28
33
  end
29
34
 
35
+ # @api user
30
36
  # @return [Integer,nil] group identifier
31
37
  def self.id
32
38
  @id
33
39
  end
34
40
 
41
+ # @api user
35
42
  # @return [String] name of group
36
43
  def self.name
37
44
  @name
38
45
  end
39
46
 
47
+ # @private
40
48
  # @param input [String] Blink compact form
41
49
  # @param stack [Array] used to measure depth of recursion
42
50
  # @return [Group, nil]
@@ -49,7 +57,7 @@ module SlowBlink::Message
49
57
  if stack.size < @maxRecursion
50
58
  stack << self
51
59
  else
52
- raise Error.new "stack limit"
60
+ raise RecursionLimit
53
61
  end
54
62
 
55
63
  @fields.each do |fn, fd|
@@ -57,14 +65,18 @@ module SlowBlink::Message
57
65
  end
58
66
 
59
67
  if input.size > 0
60
- expected = input.getU32!
61
- while extensions.size != expected do
62
- extensions << @extensionObject.from_compact!(input, stack)
68
+ expected = input.getU32!
69
+ if expected
70
+ while extensions.size != expected do
71
+ extensions << @extensionObject.from_compact!(input, stack)
72
+ end
73
+ else
74
+ raise ExtensionPadding
63
75
  end
64
76
  end
65
77
 
66
78
  if input.size != 0
67
- raise Error.new "extra bytes at end of group after extensions"
79
+ raise ExtensionPadding
68
80
  end
69
81
 
70
82
  group = self.new(fields)
@@ -79,10 +91,12 @@ module SlowBlink::Message
79
91
 
80
92
  end
81
93
 
82
- # @return [Array<Group>] group extension objects
94
+ # @api user
95
+ # @return [Array<Group>] extension objects
83
96
  attr_reader :extension
84
97
 
85
- # set a field value
98
+ # @api user
99
+ # Finds Field by name and calls {Field#set}(value)
86
100
  #
87
101
  # @param name [String] name of field
88
102
  # @param value [Object]
@@ -90,13 +104,14 @@ module SlowBlink::Message
90
104
  def []=(name, value)
91
105
  if @value[name]
92
106
  @value[name].set(value)
93
- self
94
107
  else
95
108
  raise IndexError.new "field #{name} is not defined in this group"
96
109
  end
110
+ self
97
111
  end
98
112
 
99
- # Get a field value
113
+ # @api user
114
+ # Finds Field by name and calls {Field#get}
100
115
  #
101
116
  # @param name [String] name of field
102
117
  # @return [Object]
@@ -110,27 +125,18 @@ module SlowBlink::Message
110
125
  end
111
126
 
112
127
  # Get this group
113
- # @return [Group] self
128
+ # @return [self]
114
129
  def get
115
130
  self
116
131
  end
117
132
 
118
- # Get the value hash directly
119
- # @return [Hash]
120
- def fields
121
- @value
122
- end
123
-
124
133
  # Set the contents of this group
125
134
  #
126
- # This method accepts one of two options:
127
- #
128
- # First option is a Hash of fields. Values may be literals to be set to fields objects,
129
- # or instances of the field objects to completely replace existing field objects
130
- #
131
- # Second option is a {Group} where #{Group#fields} will be used in the same manner as the first option.
132
- #
133
- # @param value [Hash, Group] fields to set
135
+ # @overload set(value)
136
+ # @param value [Hash{String=>Field,Numeric,String,Time,nil}] Hash of {Field} objects or literal values
137
+ # @overload set(value)
138
+ # @param value [Group] a Hash of {Field} objects will be extracted from a Group object by calling {Group#fields}
139
+ # @return [self]
134
140
  # @raise [IndexError, TypeError]
135
141
  def set(value)
136
142
  if value.kind_of? Hash
@@ -153,11 +159,14 @@ module SlowBlink::Message
153
159
  else
154
160
  raise TypeError.new "expecting a Hash or a StaticGroup instance"
155
161
  end
162
+ self
156
163
  end
157
164
 
165
+ # @api user
158
166
  # Create a Group
159
167
  #
160
- # @param fields [Hash] associative array of slow blink objects or native values
168
+ # @note calls {#set}(fields)
169
+ # @param fields [Hash]
161
170
  def initialize(fields={})
162
171
  @extension = []
163
172
  @fields = self.class.fields
@@ -167,15 +176,17 @@ module SlowBlink::Message
167
176
  end
168
177
  set(fields)
169
178
  end
170
-
179
+
180
+ # @return [String] Blink Protocol compact form
171
181
  def encode_compact
172
182
  if self.class.id
173
183
  to_compact("")
174
184
  else
175
- raise Error.new "cannot encode a group without an ID"
185
+ raise UntaggedGroup.new "cannot encode a group without an ID"
176
186
  end
177
187
  end
178
188
 
189
+ # @private
179
190
  def to_compact(out)
180
191
  group = "".putU64(self.class.id)
181
192
  @value.each do |fn, fv|
@@ -187,7 +198,7 @@ module SlowBlink::Message
187
198
  #if e.is_a? @extensionObject
188
199
  e.to_compact(group)
189
200
  #else
190
- # raise Error.new "cannot convert unknown extension object to compact form"
201
+ # raise EncodingError.new "cannot convert unknown extension object to compact form"
191
202
  #end
192
203
  end
193
204
  end
@@ -195,18 +206,31 @@ module SlowBlink::Message
195
206
  out << group
196
207
  end
197
208
 
209
+ protected
210
+
211
+ # Get the value hash directly
212
+ # @return [Hash{String => Field}]
213
+ def fields
214
+ @value
215
+ end
216
+
198
217
  end
199
218
 
219
+ # @abstract
220
+ #
200
221
  # A StaticGroup is a kind of {Group} that can only exist as the contents of a {Field}
201
222
  class StaticGroup < Group
202
223
 
224
+ # @private
225
+ #
203
226
  # @note optionality affects how instances of this type are encoded
204
227
  #
205
228
  # @return [true,false] is optional
206
229
  def self.opt?
207
230
  @opt
208
231
  end
209
-
232
+
233
+ # @private
210
234
  # @param input [String] Blink compact form
211
235
  # @param stack [Array] used to measure depth of recursion
212
236
  # @return [Group, nil]
@@ -216,7 +240,7 @@ module SlowBlink::Message
216
240
  if stack.size < @maxRecursion
217
241
  stack << self
218
242
  else
219
- raise Error.new "stack limit"
243
+ raise RecursionLimit
220
244
  end
221
245
 
222
246
  if @opt
@@ -239,12 +263,13 @@ module SlowBlink::Message
239
263
 
240
264
  end
241
265
 
242
- # @note {StaticGroup} cannot have extensions therefore this method will raise a NoMethodError
266
+ # @note StaticGroup does not have extensions
243
267
  # @raise [NoMethodError]
244
268
  def extension
245
- raise NoMethodError.new "static groups cannot have extensions"
269
+ raise NoMethodError.new "StaticGroup does not implement #{__method__}"
246
270
  end
247
271
 
272
+ # @private
248
273
  def to_compact(out)
249
274
  if self.class.opt?
250
275
  out.putPresent
@@ -255,8 +280,16 @@ module SlowBlink::Message
255
280
  out
256
281
  end
257
282
 
283
+ # @note StaticGroup cannot be encoded as a top level message
284
+ # @raise [NoMethodError]
285
+ def encode_compact
286
+ raise NoMethodError.new "StaticGroup does not inmplement #{__method__}"
287
+ end
288
+
258
289
  end
259
290
 
291
+ # @abstract
292
+ #
260
293
  # A DynamicGroup has a {Group} which has a {Group.id} that appears in {DynamicGroup.permitted} list
261
294
  class DynamicGroup
262
295
 
@@ -275,6 +308,7 @@ module SlowBlink::Message
275
308
  @permitted
276
309
  end
277
310
 
311
+ # @private
278
312
  # @param input [String] Blink compact form
279
313
  # @param stack [Array] used to measure depth of recursion
280
314
  # @return [Group, nil]
@@ -284,7 +318,7 @@ module SlowBlink::Message
284
318
  if stack.size < @maxRecursion
285
319
  stack << self
286
320
  else
287
- raise Error.new "stack limit"
321
+ raise RecursionLimit
288
322
  end
289
323
 
290
324
  buf = input.getBinary!
@@ -295,13 +329,13 @@ module SlowBlink::Message
295
329
  if @permitted.include? group.id
296
330
  result = self.new(group.from_compact!(buf, stack))
297
331
  else
298
- raise Error.new "W15: Group is known but unexpected"
332
+ raise WeakError15.new "W15: Group is known but unexpected"
299
333
  end
300
334
  else
301
- raise Error.new "W2: Group id #{group.id} is unknown"
335
+ raise WeakError2.new "W2: Group id #{group.id} is unknown"
302
336
  end
303
337
  else
304
- raise Error.new "W5: Value cannot be null"
338
+ raise WeakError5.new "W5: Value cannot be null"
305
339
  end
306
340
 
307
341
  stack.pop
@@ -316,7 +350,7 @@ module SlowBlink::Message
316
350
  if self.class.permitted.include? value.class.id
317
351
  @value = value
318
352
  else
319
- raise "group valid but not expected"
353
+ raise TypeError.new "group is known but compatible with schema"
320
354
  end
321
355
  # native values
322
356
  elsif value.kind_of? Hash
@@ -337,11 +371,12 @@ module SlowBlink::Message
337
371
  @value.extension
338
372
  end
339
373
 
340
- # @param value [Group, Hash]
374
+ # @note calls {#set}(value)
341
375
  def initialize(value)
342
376
  set(value)
343
377
  end
344
378
 
379
+ # @private
345
380
  def to_compact(out)
346
381
  @value.to_compact(out)
347
382
  end
@@ -1,24 +1,27 @@
1
- # Copyright (c) 2016 Cameron Harper
1
+ # @license
2
+ #
3
+ # Copyright (c) 2016 Cameron Harper
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ # this software and associated documentation files (the "Software"), to deal in
7
+ # the Software without restriction, including without limitation the rights to
8
+ # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ # the Software, and to permit persons to whom the Software is furnished to do so,
10
+ # subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
2
14
  #
3
- # Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- # this software and associated documentation files (the "Software"), to deal in
5
- # the Software without restriction, including without limitation the rights to
6
- # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
- # the Software, and to permit persons to whom the Software is furnished to do so,
8
- # subject to the following conditions:
9
- #
10
- # The above copyright notice and this permission notice shall be included in all
11
- # copies or substantial portions of the Software.
12
- #
13
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
- # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
- # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
- # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
- # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
21
 
20
22
  module SlowBlink::Message
21
23
 
24
+ # @abstract
22
25
  class INTEGER
23
26
 
24
27
  # @param value [Integer]
@@ -55,8 +58,10 @@ module SlowBlink::Message
55
58
 
56
59
  end
57
60
 
61
+ # @abstract
58
62
  class U8 < INTEGER
59
63
 
64
+ # @private
60
65
  def self.from_compact!(input, stack)
61
66
  value = input.getU8!
62
67
  if value
@@ -66,14 +71,17 @@ module SlowBlink::Message
66
71
  end
67
72
  end
68
73
 
74
+ # @private
69
75
  def to_compact(out)
70
76
  out.putU8(@value)
71
77
  end
72
78
 
73
79
  end
74
80
 
81
+ # @abstract
75
82
  class U16 < INTEGER
76
83
 
84
+ # @private
77
85
  def self.from_compact!(input, stack)
78
86
  value = input.getU16!
79
87
  if value
@@ -82,15 +90,18 @@ module SlowBlink::Message
82
90
  value
83
91
  end
84
92
  end
85
-
93
+
94
+ # @private
86
95
  def to_compact(out)
87
96
  out.putU16(@value)
88
97
  end
89
98
 
90
99
  end
91
100
 
101
+ # @abstract
92
102
  class U32 < INTEGER
93
103
 
104
+ # @private
94
105
  def self.from_compact!(input, stack)
95
106
  value = input.getU32!
96
107
  if value
@@ -100,14 +111,17 @@ module SlowBlink::Message
100
111
  end
101
112
  end
102
113
 
114
+ # @private
103
115
  def to_compact(out)
104
116
  out.putU32(@value)
105
117
  end
106
118
 
107
119
  end
108
120
 
121
+ # @abstract
109
122
  class U64 < INTEGER
110
123
 
124
+ # @private
111
125
  def self.from_compact!(input, stack)
112
126
  value = input.getU64!
113
127
  if value
@@ -116,15 +130,18 @@ module SlowBlink::Message
116
130
  value
117
131
  end
118
132
  end
119
-
133
+
134
+ # @private
120
135
  def to_compact(out)
121
136
  out.putU64(@value)
122
137
  end
123
138
 
124
139
  end
125
140
 
141
+ # @abstract
126
142
  class I8 < INTEGER
127
143
 
144
+ # @private
128
145
  def self.from_compact!(input, stack)
129
146
  value = input.getI8!
130
147
  if value
@@ -133,15 +150,18 @@ module SlowBlink::Message
133
150
  value
134
151
  end
135
152
  end
136
-
153
+
154
+ # @private
137
155
  def to_compact(out)
138
156
  out.putI8(@value)
139
157
  end
140
158
 
141
159
  end
142
160
 
161
+ # @abstract
143
162
  class I16 < INTEGER
144
-
163
+
164
+ # @private
145
165
  def self.from_compact!(input, stack)
146
166
  value = input.getI16!
147
167
  if value
@@ -150,15 +170,18 @@ module SlowBlink::Message
150
170
  value
151
171
  end
152
172
  end
153
-
173
+
174
+ # @private
154
175
  def to_compact(out)
155
176
  out.putI16(@value)
156
177
  end
157
178
 
158
179
  end
159
180
 
181
+ # @abstract
160
182
  class I32 < INTEGER
161
183
 
184
+ # @private
162
185
  def self.from_compact!(input, stack)
163
186
  value = input.getI32!
164
187
  if value
@@ -167,15 +190,18 @@ module SlowBlink::Message
167
190
  value
168
191
  end
169
192
  end
170
-
193
+
194
+ # @private
171
195
  def to_compact(out)
172
196
  out.putI32(@value)
173
197
  end
174
198
 
175
199
  end
176
200
 
201
+ # @abstract
177
202
  class I64 < INTEGER
178
203
 
204
+ # @private
179
205
  def self.from_compact!(input, stack)
180
206
  value = input.getI64!
181
207
  if value
@@ -184,7 +210,8 @@ module SlowBlink::Message
184
210
  value
185
211
  end
186
212
  end
187
-
213
+
214
+ # @private
188
215
  def to_compact(out)
189
216
  out.putI64(@value)
190
217
  end