active_model_serializers_binary 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/active_model_serializers_binary/active_model_serializers_binary.rb +85 -29
- data/lib/active_model_serializers_binary/base_type.rb +2 -1
- data/lib/active_model_serializers_binary/data_types.rb +250 -186
- data/lib/active_model_serializers_binary/version.rb +1 -1
- data/test/dummy/app/models/producto.rb +26 -2
- data/test/dummy/lib/test_parser.rb +2 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 876801a003f61b57070687c4049198f3a7407a21
|
4
|
+
data.tar.gz: e9c677a84305f640f0f77280d01767246da97f9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34ed74da0e671a9be0e153940416150b8550e091d8e5ee10ab8c74caf89c30cbe963dfe62cdb47b3926b13b9cd9e7140d1617473e42d27197f7873e1fa0ba859
|
7
|
+
data.tar.gz: f7e0803f4e919c2c7b2c3d7e32718f0b912aaeff3be7288b86016c26bc21b3dbeb1ff1edc4bea9af6783dcb189d929fcae2ac1a8d961d389e36edd4c89c027d9
|
data/Gemfile.lock
CHANGED
@@ -14,11 +14,16 @@ module ActiveModel
|
|
14
14
|
extend ActiveModel::Naming
|
15
15
|
|
16
16
|
class_attribute :attr_config
|
17
|
-
|
17
|
+
class_attribute :serialize_options_global
|
18
|
+
self.attr_config = []
|
19
|
+
self.serialize_options_global = {
|
20
|
+
align: false, # Don't align data to byte/word/dword boundary
|
21
|
+
endianess: :little
|
22
|
+
}
|
18
23
|
|
19
24
|
def attributes
|
20
|
-
keys = self.attr_config.select{ |
|
21
|
-
values = keys.map{ |
|
25
|
+
keys = self.attr_config.select{ |attr| attr[:virtual]==true }.map{ |attr| attr[:name] }
|
26
|
+
values = keys.map{ |attr| self.instance_variable_get("@#{attr}") }
|
22
27
|
(super rescue {}).merge(Hash[keys.zip values])
|
23
28
|
end
|
24
29
|
|
@@ -36,16 +41,16 @@ module ActiveModel
|
|
36
41
|
|
37
42
|
module ClassMethods
|
38
43
|
def add_virtual_attributes( instance )
|
39
|
-
self.attr_config.each{ |
|
44
|
+
self.attr_config.each{ |attr| add_virtual_attribute(instance, attr) }
|
40
45
|
end
|
41
46
|
|
42
|
-
def add_virtual_attribute( instance,
|
43
|
-
|
44
|
-
if attr_value[:virtual] == true
|
47
|
+
def add_virtual_attribute( instance, attr )
|
48
|
+
if attr[:virtual] == true
|
45
49
|
true
|
46
50
|
else
|
51
|
+
attr_name = attr[:name].to_s
|
47
52
|
if !instance.respond_to? attr_name
|
48
|
-
|
53
|
+
attr[:virtual] = true
|
49
54
|
attr_accessor attr_name
|
50
55
|
true
|
51
56
|
else
|
@@ -56,56 +61,114 @@ module ActiveModel
|
|
56
61
|
|
57
62
|
# todo: agrupar parametros en hash (rompe la compatibilidad hacia atras)
|
58
63
|
def serialize_options( attr_name, coder, count=1, length=1, virtual=false, &block )
|
59
|
-
self.attr_config.
|
64
|
+
self.attr_config.push({:coder => coder, :count => count, :length => length, :block => block, :name => attr_name.to_s, :virtual => virtual})
|
65
|
+
if virtual==true
|
66
|
+
attr_accessor attr_name
|
67
|
+
end
|
60
68
|
end
|
61
69
|
|
62
70
|
def serialize_attribute_options( attr_name, options, &block )
|
63
|
-
self.attr_config.
|
71
|
+
self.attr_config.push(options.merge({:name => attr_name.to_s, block: block }))
|
72
|
+
if options[:virtual]==true
|
73
|
+
attr_accessor attr_name
|
74
|
+
end
|
64
75
|
end
|
65
76
|
|
66
77
|
def int8( attr_name, options = {}, &block )
|
78
|
+
options = serialize_options_global.merge(options)
|
67
79
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int8}), &block
|
68
80
|
end
|
69
81
|
|
70
82
|
def int16( attr_name, options = {}, &block )
|
83
|
+
options = serialize_options_global.merge(options)
|
71
84
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int16}), &block
|
72
85
|
end
|
73
86
|
|
87
|
+
def int16le( attr_name, options = {}, &block )
|
88
|
+
int16( attr_name, options.merge({endianess: :little}), &block )
|
89
|
+
end
|
90
|
+
|
91
|
+
def int16be( attr_name, options = {}, &block )
|
92
|
+
int16( attr_name, options.merge({endianess: :big}), &block )
|
93
|
+
end
|
94
|
+
|
74
95
|
def int32( attr_name, options = {}, &block )
|
96
|
+
options = serialize_options_global.merge(options)
|
75
97
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int32}), &block
|
76
98
|
end
|
77
99
|
|
100
|
+
def int32le( attr_name, options = {}, &block )
|
101
|
+
int32( attr_name, options.merge({endianess: :little}), &block )
|
102
|
+
end
|
103
|
+
|
104
|
+
def int32be( attr_name, options = {}, &block )
|
105
|
+
int16( attr_name, options.merge({endianess: :big}), &block )
|
106
|
+
end
|
107
|
+
|
78
108
|
def uint8( attr_name, options = {}, &block )
|
109
|
+
options = serialize_options_global.merge(options)
|
79
110
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt8}), &block
|
80
111
|
end
|
81
112
|
|
82
113
|
def uint16( attr_name, options = {}, &block )
|
114
|
+
options = serialize_options_global.merge(options)
|
83
115
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt16}), &block
|
84
116
|
end
|
85
117
|
|
118
|
+
def uint16le( attr_name, options = {}, &block )
|
119
|
+
uint16( attr_name, options.merge({endianess: :little}), &block )
|
120
|
+
end
|
121
|
+
|
122
|
+
def uint16be( attr_name, options = {}, &block )
|
123
|
+
uint16( attr_name, options.merge({endianess: :big}), &block )
|
124
|
+
end
|
125
|
+
|
86
126
|
def uint32( attr_name, options = {}, &block )
|
127
|
+
options = serialize_options_global.merge(options)
|
87
128
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt32}), &block
|
88
129
|
end
|
89
130
|
|
131
|
+
def uint32le( attr_name, options = {}, &block )
|
132
|
+
uint32( attr_name, options.merge({endianess: :little}), &block )
|
133
|
+
end
|
134
|
+
|
135
|
+
def uint32be( attr_name, options = {}, &block )
|
136
|
+
uint32( attr_name, options.merge({endianess: :big}), &block )
|
137
|
+
end
|
138
|
+
|
90
139
|
def bitfield( attr_name, options = {}, &block )
|
140
|
+
options = serialize_options_global.merge(options)
|
91
141
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::BitField}), &block
|
92
142
|
end
|
93
143
|
|
94
144
|
def float32( attr_name, options = {}, &block )
|
145
|
+
options = serialize_options_global.merge(options)
|
146
|
+
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Float32}), &block
|
147
|
+
end
|
148
|
+
|
149
|
+
def float64( attr_name, options = {}, &block )
|
150
|
+
options = serialize_options_global.merge(options)
|
95
151
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Float32}), &block
|
96
152
|
end
|
97
153
|
|
98
154
|
def char( attr_name, options = {}, &block )
|
155
|
+
options = serialize_options_global.merge(options)
|
99
156
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Char}), &block
|
100
157
|
end
|
101
158
|
|
102
159
|
def bool( attr_name, options = {}, &block )
|
160
|
+
options = serialize_options_global.merge(options)
|
103
161
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Bool}), &block
|
104
162
|
end
|
105
163
|
|
106
164
|
def nest( attr_name, options={}, &block )
|
165
|
+
options = serialize_options_global.merge(options)
|
107
166
|
serialize_attribute_options attr_name, options.merge({type: :nest}), &block
|
108
167
|
end
|
168
|
+
|
169
|
+
def endianess( type = :little )
|
170
|
+
serialize_options_global.merge!({endianess: type})
|
171
|
+
end
|
109
172
|
end
|
110
173
|
|
111
174
|
class Serializer #:nodoc:
|
@@ -124,12 +187,14 @@ module ActiveModel
|
|
124
187
|
tmp_buffer = [] # Aux Data Buffer
|
125
188
|
current_address = start_address*2 + 0.0 # Address in bytes
|
126
189
|
|
127
|
-
@serializable.attr_config.each do |
|
190
|
+
@serializable.attr_config.each do |attr_options|
|
191
|
+
attr_name = attr_options[:name]
|
128
192
|
if attr_options[:type] != :nest
|
129
193
|
var = attr_options[:coder].new(attr_options.merge(parent: @serializable))
|
130
194
|
var.value = serializable_values[attr_name] rescue nil
|
131
195
|
else
|
132
|
-
|
196
|
+
var_value = serializable_values[attr_name].attributes rescue nil
|
197
|
+
var = attr_options[:coder].new(var_value)
|
133
198
|
end
|
134
199
|
|
135
200
|
byte = current_address.floor
|
@@ -186,7 +251,8 @@ module ActiveModel
|
|
186
251
|
|
187
252
|
current_address = start_address*2 + 0.0 # Dirección en bytes
|
188
253
|
|
189
|
-
@serializable.attr_config.each do |
|
254
|
+
@serializable.attr_config.each do |attr_options|
|
255
|
+
attr_name = attr_options[:name]
|
190
256
|
byte = current_address.floor
|
191
257
|
bit = (current_address.modulo(1)*8).round
|
192
258
|
|
@@ -222,9 +288,9 @@ module ActiveModel
|
|
222
288
|
end
|
223
289
|
|
224
290
|
if attr_options[:type] == :nest
|
225
|
-
serialized_values["#{
|
291
|
+
serialized_values["#{attr_name}"] = result_deserialized
|
226
292
|
else
|
227
|
-
serialized_values["#{
|
293
|
+
serialized_values["#{attr_name}"] = result_deserialized.count>1 ? result_deserialized : result_deserialized.first
|
228
294
|
end
|
229
295
|
current_address = (byte+bit/8.0)+var.size
|
230
296
|
end
|
@@ -243,7 +309,7 @@ module ActiveModel
|
|
243
309
|
|
244
310
|
current_address = 0.0 # Dirección en bytes
|
245
311
|
|
246
|
-
@serializable.attr_config.each do |
|
312
|
+
@serializable.attr_config.each do |attr_options|
|
247
313
|
var = attr_options[:coder].new(attr_options.merge(parent: @serializable))
|
248
314
|
|
249
315
|
byte = current_address.floor
|
@@ -269,7 +335,6 @@ module ActiveModel
|
|
269
335
|
end
|
270
336
|
end
|
271
337
|
end
|
272
|
-
|
273
338
|
current_address = (byte+bit/8.0)+var.size
|
274
339
|
end
|
275
340
|
current_address-start_address
|
@@ -286,10 +351,7 @@ module ActiveModel
|
|
286
351
|
# => [98, 111, 98, 0, 0, 0, 0, 0, 0, 0, 22, 0, 1]
|
287
352
|
#
|
288
353
|
def to_bytes(options = {}, &block)
|
289
|
-
|
290
|
-
:align => true,
|
291
|
-
}
|
292
|
-
options = default_options.deep_merge(options)
|
354
|
+
options = self.serialize_options_global.deep_merge(options)
|
293
355
|
if block_given?
|
294
356
|
yield self
|
295
357
|
end
|
@@ -341,10 +403,7 @@ module ActiveModel
|
|
341
403
|
# @yield code block to execute after deserialization
|
342
404
|
#
|
343
405
|
def from_bytes(buffer, options = {}, &block)
|
344
|
-
|
345
|
-
:align => true
|
346
|
-
}
|
347
|
-
options = default_options.deep_merge(options)
|
406
|
+
options = self.serialize_options_global.deep_merge(options)
|
348
407
|
retVal = Serializer.new(self, options).load buffer
|
349
408
|
|
350
409
|
if block_given?
|
@@ -361,10 +420,7 @@ module ActiveModel
|
|
361
420
|
end
|
362
421
|
|
363
422
|
def size(options = {})
|
364
|
-
|
365
|
-
:align => true
|
366
|
-
}
|
367
|
-
options = default_options.deep_merge(options)
|
423
|
+
options = self.serialize_options_global.deep_merge(options)
|
368
424
|
Serializer.new(self, options).size
|
369
425
|
end
|
370
426
|
|
@@ -2,7 +2,7 @@ module DataTypes
|
|
2
2
|
|
3
3
|
class BaseType
|
4
4
|
|
5
|
-
attr_accessor :raw_value, :bit_length, :type, :sign, :count, :length, :value, :name, :parent
|
5
|
+
attr_accessor :raw_value, :bit_length, :type, :sign, :count, :length, :value, :name, :parent, :endianess
|
6
6
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@default_value = options[:default_value].nil? ? 0 : options[:default_value]
|
@@ -16,6 +16,7 @@ module DataTypes
|
|
16
16
|
@block = options[:block]
|
17
17
|
@name = options[:name]
|
18
18
|
@parent = options[:parent]
|
19
|
+
@endianess = options[:endianess] || :little
|
19
20
|
end
|
20
21
|
|
21
22
|
def to_s
|
@@ -1,187 +1,251 @@
|
|
1
|
-
require_relative 'base_type.rb'
|
2
|
-
|
3
|
-
module DataTypes
|
4
|
-
|
5
|
-
class Int8 < BaseType
|
6
|
-
def initialize(options = {})
|
7
|
-
super options.merge :bit_length => 8, :sign => :signed
|
8
|
-
end
|
9
|
-
|
10
|
-
def dump(value=nil)
|
11
|
-
before_dump( value ).pack('c*').unpack('C*')
|
12
|
-
@raw_value = @value
|
13
|
-
end
|
14
|
-
|
15
|
-
def load(raw_value)
|
16
|
-
self.value = check_raw_value(raw_value).pack('C*').unpack('c*')
|
17
|
-
after_load
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class Int16 < BaseType
|
22
|
-
def initialize(options = {})
|
23
|
-
super options.merge :bit_length => 16, :sign => :signed
|
24
|
-
end
|
25
|
-
|
26
|
-
def dump(value=nil)
|
27
|
-
before_dump( value )
|
28
|
-
@
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
@
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
def
|
109
|
-
if
|
110
|
-
'C*'
|
111
|
-
|
112
|
-
'
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
def
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
def
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
@raw_value =
|
164
|
-
end
|
165
|
-
|
166
|
-
def load(raw_value)
|
167
|
-
self.value = check_raw_value(raw_value).pack('C*').unpack('b*').first.slice(0
|
168
|
-
after_load
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
class
|
173
|
-
def initialize(options = {})
|
174
|
-
super options.merge :bit_length =>
|
175
|
-
end
|
176
|
-
|
177
|
-
def dump(value=nil)
|
178
|
-
before_dump( value )
|
179
|
-
@raw_value = @value.
|
180
|
-
end
|
181
|
-
|
182
|
-
def load(raw_value)
|
183
|
-
self.value = check_raw_value(raw_value).pack('C*').unpack(
|
184
|
-
after_load
|
185
|
-
end
|
186
|
-
end
|
1
|
+
require_relative 'base_type.rb'
|
2
|
+
|
3
|
+
module DataTypes
|
4
|
+
|
5
|
+
class Int8 < BaseType
|
6
|
+
def initialize(options = {})
|
7
|
+
super options.merge :bit_length => 8, :sign => :signed
|
8
|
+
end
|
9
|
+
|
10
|
+
def dump(value=nil)
|
11
|
+
before_dump( value ).pack('c*').unpack('C*')
|
12
|
+
@raw_value = @value
|
13
|
+
end
|
14
|
+
|
15
|
+
def load(raw_value)
|
16
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('c*')
|
17
|
+
after_load
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Int16 < BaseType
|
22
|
+
def initialize(options = {})
|
23
|
+
super options.merge :bit_length => 16, :sign => :signed
|
24
|
+
end
|
25
|
+
|
26
|
+
def dump(value=nil)
|
27
|
+
before_dump( value )
|
28
|
+
if @endianess == :big
|
29
|
+
@raw_value = @value.pack('s>*').unpack('C*')
|
30
|
+
else
|
31
|
+
@raw_value = @value.pack('s<*').unpack('C*')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def load(raw_value)
|
36
|
+
if @endianess == :big
|
37
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('s>*')
|
38
|
+
else
|
39
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('s<*')
|
40
|
+
end
|
41
|
+
after_load
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Int32 < BaseType
|
46
|
+
def initialize(options = {})
|
47
|
+
super options.merge :bit_length => 32, :sign => :signed
|
48
|
+
end
|
49
|
+
|
50
|
+
def dump(value=nil)
|
51
|
+
before_dump( value )
|
52
|
+
if @endianess == :big
|
53
|
+
@raw_value = @value.pack('l>*').unpack('C*')
|
54
|
+
else
|
55
|
+
@raw_value = @value.pack('l<*').unpack('C*')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def load(raw_value)
|
60
|
+
if @endianess == :big
|
61
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('l>*') if !value.nil?
|
62
|
+
else
|
63
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('l<*') if !value.nil?
|
64
|
+
end
|
65
|
+
after_load
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class UInt16 < BaseType
|
70
|
+
def initialize(options = {})
|
71
|
+
super options.merge :bit_length => 16, :sign => :unsigned
|
72
|
+
end
|
73
|
+
|
74
|
+
def dump(value=nil)
|
75
|
+
before_dump( value )
|
76
|
+
if @endianess == :big
|
77
|
+
@raw_value = @value.pack('S>*').unpack('C*')
|
78
|
+
else
|
79
|
+
@raw_value = @value.pack('S<*').unpack('C*')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def load(raw_value)
|
84
|
+
@raw_value = check_raw_value(raw_value)
|
85
|
+
if @endianess == :big
|
86
|
+
self.value = @raw_value.pack('C*').unpack('S>*')
|
87
|
+
else
|
88
|
+
self.value = @raw_value.pack('C*').unpack('S<*')
|
89
|
+
end
|
90
|
+
after_load
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class UInt32 < BaseType
|
95
|
+
def initialize(options = {})
|
96
|
+
super options.merge :bit_length => 32, :sign => :unsigned
|
97
|
+
end
|
98
|
+
|
99
|
+
def dump(value=nil)
|
100
|
+
before_dump( value )
|
101
|
+
if @endianess == :big
|
102
|
+
@raw_value = @value.pack('L>*').unpack('C*')
|
103
|
+
else
|
104
|
+
@raw_value = @value.pack('L<*').unpack('C*')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def load(raw_value)
|
109
|
+
if @endianess == :big
|
110
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('L>*') if !value.nil?
|
111
|
+
else
|
112
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('L<*') if !value.nil?
|
113
|
+
end
|
114
|
+
after_load
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class UInt8 < BaseType
|
119
|
+
def initialize(options = {})
|
120
|
+
super options.merge :bit_length => 8, :sign => :unsigned
|
121
|
+
end
|
122
|
+
|
123
|
+
def dump(value=nil)
|
124
|
+
before_dump( value )
|
125
|
+
@raw_value = @value
|
126
|
+
end
|
127
|
+
|
128
|
+
def load(raw_value)
|
129
|
+
self.value = check_raw_value(raw_value)
|
130
|
+
after_load
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
class BitField < BaseType
|
135
|
+
def initialize(options = {})
|
136
|
+
length = options[:bin_length].blank? ? 1 : (options[:bin_length] > 32 ? 32 : options[:bin_length])
|
137
|
+
super options.merge :bit_length => length, :sign => :unsigned
|
138
|
+
end
|
139
|
+
|
140
|
+
def format
|
141
|
+
if bit_length <= 8 # 8 bits
|
142
|
+
'C*'
|
143
|
+
elsif bit_length <= 16 # 16 bits
|
144
|
+
'v*'
|
145
|
+
else # 32 bits
|
146
|
+
'l*'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def word_length
|
151
|
+
if bit_length <= 8 # 8 bits
|
152
|
+
8
|
153
|
+
elsif bit_length <= 16 # 16 bits
|
154
|
+
16
|
155
|
+
else # 32 bits
|
156
|
+
32
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def dump(value=nil)
|
161
|
+
before_dump( value )
|
162
|
+
data = @value.pack(format).unpack('b*').first.chars.each_slice(word_length).map(&:join).map{|n| n.slice(0,bit_length)}
|
163
|
+
@raw_value = [data.join].pack('b*').unpack('C*')
|
164
|
+
end
|
165
|
+
|
166
|
+
def load(raw_value)
|
167
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('b*').first.chars.slice(0,@bit_length*@count).each_slice(bit_length).map(&:join).map{|n| [n].pack('b*').unpack('C*').first}
|
168
|
+
after_load
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class Char < BaseType
|
173
|
+
def initialize(options = {})
|
174
|
+
super options.merge :bit_length => 8, :sign => nil, :default_value => "\x0"
|
175
|
+
end
|
176
|
+
|
177
|
+
def dump(value=nil)
|
178
|
+
before_dump( value )
|
179
|
+
@raw_value = @value.map{|v| v.ljust(@length, @default_value).slice(0,@length).unpack('C*')}
|
180
|
+
end
|
181
|
+
|
182
|
+
def load(raw_value)
|
183
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack("Z#{@length}") if !value.nil?
|
184
|
+
after_load
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
class Bool < BaseType
|
189
|
+
def initialize(options = {})
|
190
|
+
super options.merge :bit_length => 1, :default_value => false
|
191
|
+
end
|
192
|
+
|
193
|
+
def dump(value=nil)
|
194
|
+
before_dump( value )
|
195
|
+
@raw_value = Array(@value.map{|v| v ? 1 : 0}.join).pack('b*').unpack('C*')
|
196
|
+
end
|
197
|
+
|
198
|
+
def load(raw_value)
|
199
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('b*').first.slice(0,size*8).split('').map(&:to_i) if !value.nil?
|
200
|
+
after_load
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
class Float32 < BaseType
|
205
|
+
def initialize(options = {})
|
206
|
+
super options.merge :bit_length => 32, :sign => nil, :default_value => 0.0
|
207
|
+
end
|
208
|
+
|
209
|
+
def dump(value=nil)
|
210
|
+
before_dump( value )
|
211
|
+
if @endianess == :big
|
212
|
+
@raw_value = @value.pack('g*').unpack('C*')
|
213
|
+
else
|
214
|
+
@raw_value = @value.pack('e*').unpack('C*')
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def load(raw_value)
|
219
|
+
if @endianess == :big
|
220
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('g*') if !value.nil?
|
221
|
+
else
|
222
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('e*') if !value.nil?
|
223
|
+
end
|
224
|
+
after_load
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
class Float64 < BaseType
|
229
|
+
def initialize(options = {})
|
230
|
+
super options.merge :bit_length => 64, :sign => nil, :default_value => 0.0
|
231
|
+
end
|
232
|
+
|
233
|
+
def dump(value=nil)
|
234
|
+
before_dump( value )
|
235
|
+
if @endianess == :big
|
236
|
+
@raw_value = @value.pack('G*').unpack('C*')
|
237
|
+
else
|
238
|
+
@raw_value = @value.pack('E*').unpack('C*')
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
def load(raw_value)
|
243
|
+
if @endianess == :big
|
244
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('G*') if !value.nil?
|
245
|
+
else
|
246
|
+
self.value = check_raw_value(raw_value).pack('C*').unpack('E*') if !value.nil?
|
247
|
+
end
|
248
|
+
after_load
|
249
|
+
end
|
250
|
+
end
|
187
251
|
end
|
@@ -5,12 +5,12 @@
|
|
5
5
|
# id :integer not null, primary key
|
6
6
|
# uid :integer
|
7
7
|
# silo :integer
|
8
|
-
# nombre :string
|
8
|
+
# nombre :string(255)
|
9
9
|
# total_acumulado :integer
|
10
10
|
# bits1 :boolean
|
11
11
|
# bits2 :boolean
|
12
12
|
# ffloat :float
|
13
|
-
# variable :string
|
13
|
+
# variable :string(255)
|
14
14
|
# created_at :datetime
|
15
15
|
# updated_at :datetime
|
16
16
|
#
|
@@ -18,6 +18,30 @@
|
|
18
18
|
class Producto < ActiveRecord::Base
|
19
19
|
include ActiveModel::Serializers::Binary
|
20
20
|
|
21
|
+
int16 :uid
|
22
|
+
int16 :silo
|
21
23
|
char :nombre, count: 1, length: 20
|
24
|
+
int32 :total_acumulado
|
25
|
+
bool :bits1
|
26
|
+
bool :bits2
|
27
|
+
bool :bits3, virtual: true
|
28
|
+
bool :bits4, virtual: true
|
29
|
+
bool :bits5, virtual: true
|
30
|
+
bool :bits6, virtual: true
|
31
|
+
bool :bits7, virtual: true
|
32
|
+
bool :bits8, virtual: true
|
33
|
+
bool :bits9, virtual: true
|
34
|
+
bool :bits10, virtual: true
|
35
|
+
bool :bits11, virtual: true
|
36
|
+
bool :bits12, virtual: true
|
37
|
+
bool :bits13, virtual: true
|
38
|
+
bool :bits14, virtual: true
|
39
|
+
bool :bits15, virtual: true
|
40
|
+
bool :bits16, virtual: true
|
41
|
+
float32 :ffloat
|
42
|
+
char :variable, count: 1, length: 20 do |field, mode|
|
43
|
+
puts (mode.to_s + ': variable block').blue
|
44
|
+
end
|
45
|
+
int32 :test, count: 10, virtual: true # No existe en la DB
|
22
46
|
nest :tipo, coder: Tipo
|
23
47
|
end
|
@@ -8,8 +8,9 @@ class String
|
|
8
8
|
end
|
9
9
|
|
10
10
|
orig = Producto.new
|
11
|
+
orig.silo = 0xFF7F
|
11
12
|
orig.nombre = "AAAAAAAAAAAAAAAAAAAA"
|
12
|
-
orig.tipo = Tipo.new({name:"BBBBBBBBBBBBBBBBBBBB", producto_id:
|
13
|
+
orig.tipo = Tipo.new({name:"BBBBBBBBBBBBBBBBBBBB", producto_id: 0xFF7F})
|
13
14
|
|
14
15
|
puts 'Datos originales...'
|
15
16
|
puts orig.inspect.green
|