slow_blink 0.0.5 → 0.0.6

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