active_model_serializers_binary 0.2.0 → 0.2.1
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 +4 -4
- data/lib/active_model_serializers_binary/active_model_serializers_binary.rb +105 -114
- data/lib/active_model_serializers_binary/base_type.rb +1 -1
- data/lib/active_model_serializers_binary/data_types.rb +250 -250
- data/lib/active_model_serializers_binary/version.rb +1 -1
- data/test/dummy/app/models/product.rb +27 -0
- data/test/dummy/app/models/type.rb +7 -0
- data/test/dummy/lib/test_parser.rb +23 -5
- metadata +6 -12
- data/test/dummy/app/models/producto.rb +0 -47
- data/test/dummy/app/models/tipo.rb +0 -18
- data/test/dummy/db/migrate/20160608024807_create_productos.rb +0 -16
- data/test/dummy/db/migrate/20170817015810_create_tipos.rb +0 -9
- data/test/dummy/db/schema.rb +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 596d98d9d3ebdccccb17e210ba65d1c21f3402a1
|
4
|
+
data.tar.gz: c8b0dfdb53e10abb64d79185687d6530a440e0fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 524d45fbc3dc9b1208cf49a5efe72a3beac8860b0ddc98e6897999f4f60f532e37512db7f2fa76cdbbf15681d250e0c899386933ab02ff39124949209521b7ad
|
7
|
+
data.tar.gz: c6b4b8d0e2a58b39d111fad53e10ef3ea40d2b540bcc6ad00b0661c4ed2174864a0e57465e997c4802d0d58f642d1d4a58e06cf7c59f33ea79272a238b2fd5fd
|
@@ -7,6 +7,7 @@ module ActiveModel
|
|
7
7
|
# == Active Model Binary serializer
|
8
8
|
module Binary
|
9
9
|
extend ActiveSupport::Concern
|
10
|
+
include ActiveModel::Model
|
10
11
|
include ActiveModel::Serialization
|
11
12
|
include DataTypes
|
12
13
|
|
@@ -16,10 +17,7 @@ module ActiveModel
|
|
16
17
|
class_attribute :attr_config
|
17
18
|
class_attribute :serialize_options_global
|
18
19
|
self.attr_config = []
|
19
|
-
self.serialize_options_global = {
|
20
|
-
align: false, # Don't align data to byte/word/dword boundary
|
21
|
-
endianess: :little
|
22
|
-
}
|
20
|
+
self.serialize_options_global = {}
|
23
21
|
|
24
22
|
def attributes
|
25
23
|
keys = self.attr_config.select{ |attr| attr[:virtual]==true }.map{ |attr| attr[:name] }
|
@@ -28,8 +26,8 @@ module ActiveModel
|
|
28
26
|
end
|
29
27
|
|
30
28
|
def initialize( *args )
|
31
|
-
super rescue super()
|
32
29
|
initialize_serializer
|
30
|
+
super rescue super()
|
33
31
|
end
|
34
32
|
|
35
33
|
def initialize_serializer
|
@@ -37,6 +35,9 @@ module ActiveModel
|
|
37
35
|
end
|
38
36
|
|
39
37
|
after_initialize :initialize_serializer rescue nil
|
38
|
+
|
39
|
+
endianess :little
|
40
|
+
align false
|
40
41
|
end
|
41
42
|
|
42
43
|
module ClassMethods
|
@@ -59,14 +60,6 @@ module ActiveModel
|
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
62
|
-
# todo: agrupar parametros en hash (rompe la compatibilidad hacia atras)
|
63
|
-
def serialize_options( attr_name, coder, count=1, length=1, virtual=false, &block )
|
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
|
68
|
-
end
|
69
|
-
|
70
63
|
def serialize_attribute_options( attr_name, options, &block )
|
71
64
|
self.attr_config.push(options.merge({:name => attr_name.to_s, block: block }))
|
72
65
|
if options[:virtual]==true
|
@@ -75,12 +68,12 @@ module ActiveModel
|
|
75
68
|
end
|
76
69
|
|
77
70
|
def int8( attr_name, options = {}, &block )
|
78
|
-
options = serialize_options_global.merge(options)
|
71
|
+
options = self.serialize_options_global.merge(options)
|
79
72
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int8}), &block
|
80
73
|
end
|
81
74
|
|
82
75
|
def int16( attr_name, options = {}, &block )
|
83
|
-
options = serialize_options_global.merge(options)
|
76
|
+
options = self.serialize_options_global.merge(options)
|
84
77
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int16}), &block
|
85
78
|
end
|
86
79
|
|
@@ -93,7 +86,7 @@ module ActiveModel
|
|
93
86
|
end
|
94
87
|
|
95
88
|
def int32( attr_name, options = {}, &block )
|
96
|
-
options = serialize_options_global.merge(options)
|
89
|
+
options = self.serialize_options_global.merge(options)
|
97
90
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Int32}), &block
|
98
91
|
end
|
99
92
|
|
@@ -102,16 +95,16 @@ module ActiveModel
|
|
102
95
|
end
|
103
96
|
|
104
97
|
def int32be( attr_name, options = {}, &block )
|
105
|
-
|
98
|
+
int32( attr_name, options.merge({endianess: :big}), &block )
|
106
99
|
end
|
107
100
|
|
108
101
|
def uint8( attr_name, options = {}, &block )
|
109
|
-
options = serialize_options_global.merge(options)
|
102
|
+
options = self.serialize_options_global.merge(options)
|
110
103
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt8}), &block
|
111
104
|
end
|
112
105
|
|
113
106
|
def uint16( attr_name, options = {}, &block )
|
114
|
-
options = serialize_options_global.merge(options)
|
107
|
+
options = self.serialize_options_global.merge(options)
|
115
108
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt16}), &block
|
116
109
|
end
|
117
110
|
|
@@ -124,7 +117,7 @@ module ActiveModel
|
|
124
117
|
end
|
125
118
|
|
126
119
|
def uint32( attr_name, options = {}, &block )
|
127
|
-
options = serialize_options_global.merge(options)
|
120
|
+
options = self.serialize_options_global.merge(options)
|
128
121
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::UInt32}), &block
|
129
122
|
end
|
130
123
|
|
@@ -137,55 +130,117 @@ module ActiveModel
|
|
137
130
|
end
|
138
131
|
|
139
132
|
def bitfield( attr_name, options = {}, &block )
|
140
|
-
options = serialize_options_global.merge(options)
|
141
|
-
serialize_attribute_options attr_name, options.merge({coder: DataTypes::BitField}), &block
|
133
|
+
options = self.serialize_options_global.merge(options)
|
134
|
+
serialize_attribute_options attr_name, options.merge({coder: DataTypes::BitField, type: :bitfield}), &block
|
142
135
|
end
|
143
136
|
|
144
137
|
def float32( attr_name, options = {}, &block )
|
145
|
-
options = serialize_options_global.merge(options)
|
138
|
+
options = self.serialize_options_global.merge(options)
|
146
139
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Float32}), &block
|
147
140
|
end
|
148
141
|
|
149
142
|
def float64( attr_name, options = {}, &block )
|
150
|
-
options = serialize_options_global.merge(options)
|
151
|
-
serialize_attribute_options attr_name, options.merge({coder: DataTypes::
|
143
|
+
options = self.serialize_options_global.merge(options)
|
144
|
+
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Float64}), &block
|
152
145
|
end
|
153
146
|
|
154
147
|
def char( attr_name, options = {}, &block )
|
155
|
-
options = serialize_options_global.merge(options)
|
148
|
+
options = self.serialize_options_global.merge(options)
|
156
149
|
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Char}), &block
|
157
150
|
end
|
158
151
|
|
159
152
|
def bool( attr_name, options = {}, &block )
|
160
|
-
options = serialize_options_global.merge(options)
|
161
|
-
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Bool}), &block
|
153
|
+
options = self.serialize_options_global.merge(options)
|
154
|
+
serialize_attribute_options attr_name, options.merge({coder: DataTypes::Bool, type: :bool}), &block
|
162
155
|
end
|
163
156
|
|
164
157
|
def nest( attr_name, options={}, &block )
|
165
|
-
options = serialize_options_global.merge(options)
|
158
|
+
options = self.serialize_options_global.merge(options)
|
166
159
|
serialize_attribute_options attr_name, options.merge({type: :nest}), &block
|
167
160
|
end
|
168
161
|
|
169
162
|
def endianess( type = :little )
|
170
|
-
serialize_options_global.merge!({endianess: type})
|
163
|
+
self.serialize_options_global.merge!({endianess: type})
|
164
|
+
end
|
165
|
+
|
166
|
+
def align( boundary = false )
|
167
|
+
self.serialize_options_global.merge!({align: boundary})
|
171
168
|
end
|
172
169
|
end
|
173
170
|
|
174
171
|
class Serializer #:nodoc:
|
175
|
-
|
172
|
+
attr_accessor :start_address
|
176
173
|
|
177
174
|
def initialize(serializable, options = nil)
|
178
175
|
@serializable = serializable
|
179
176
|
@options = options ? options.dup : {}
|
177
|
+
@current_address = 0
|
178
|
+
@start_address = 0
|
179
|
+
@current_byte = 0
|
180
|
+
@current_bit = 0
|
181
|
+
end
|
182
|
+
|
183
|
+
def current_address= (value)
|
184
|
+
@current_address = value
|
185
|
+
@current_byte = value.floor
|
186
|
+
@current_bit = (value.modulo(1)*8).round
|
187
|
+
end
|
188
|
+
|
189
|
+
def current_address
|
190
|
+
@current_address
|
191
|
+
end
|
192
|
+
|
193
|
+
def current_byte= (value)
|
194
|
+
@current_byte = value
|
195
|
+
@current_address = (@current_byte+@current_bit/8.0)
|
196
|
+
end
|
197
|
+
|
198
|
+
def current_byte
|
199
|
+
@current_byte
|
200
|
+
end
|
201
|
+
|
202
|
+
def current_bit= (value)
|
203
|
+
@current_bit = value
|
204
|
+
@current_address = (@current_byte+@current_bit/8.0)
|
205
|
+
end
|
206
|
+
|
207
|
+
def current_bit
|
208
|
+
@current_bit
|
209
|
+
end
|
210
|
+
|
211
|
+
def align_data( attr_options, var )
|
212
|
+
# XXX: hay que sacar nest de acá
|
213
|
+
if !attr_options[:type].in? [:bitfield, :bool, :nest]
|
214
|
+
# Se posiciona al principio de un byte
|
215
|
+
if self.current_bit != 0
|
216
|
+
self.current_address = self.current_address.ceil
|
217
|
+
end
|
218
|
+
if @options[:align]==:dword
|
219
|
+
# Si el dato es una palabra simple, alinea los datos en el siguiente byte par
|
220
|
+
if var.bit_length > 8 and (self.current_address + self.start_address).modulo(2) != 0
|
221
|
+
self.current_byte += 1
|
222
|
+
end
|
223
|
+
# Si el dato es una palabra doble, alinea los datos en la siguiente palabra par
|
224
|
+
if var.bit_length > 16 and (self.current_address + self.start_address).modulo(4) != 0
|
225
|
+
self.current_byte += 4-self.current_byte%4
|
226
|
+
end
|
227
|
+
elsif @options[:align]==:word
|
228
|
+
# Si el dato es una palabra simple, alinea los datos en el siguiente byte par
|
229
|
+
if var.bit_length > 8 and (self.current_address + self.start_address).modulo(2) != 0
|
230
|
+
self.current_byte += 1
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
180
234
|
end
|
181
235
|
|
182
236
|
def dump
|
183
237
|
serializable_values = @serializable.serializable_hash(@options)
|
184
|
-
start_address = @options[:start_address] || 0
|
238
|
+
self.start_address = @options[:start_address] || 0
|
185
239
|
|
186
240
|
buffer = [] # Data Buffer
|
187
241
|
tmp_buffer = [] # Aux Data Buffer
|
188
|
-
|
242
|
+
|
243
|
+
self.current_address = self.start_address # Address in bytes
|
189
244
|
|
190
245
|
@serializable.attr_config.each do |attr_options|
|
191
246
|
attr_name = attr_options[:name]
|
@@ -197,46 +252,24 @@ module ActiveModel
|
|
197
252
|
var = attr_options[:coder].new(var_value)
|
198
253
|
end
|
199
254
|
|
200
|
-
byte = current_address.floor
|
201
|
-
bit = (current_address.modulo(1)*8).round
|
202
|
-
|
203
255
|
tmp_buffer = var.dump
|
204
256
|
|
205
|
-
if @options[:align]
|
206
|
-
if !attr_options[:type].in? [:bitfield, :bool, :nest]
|
207
|
-
# Se posiciona al principio de un byte
|
208
|
-
if bit != 0
|
209
|
-
byte += 1
|
210
|
-
bit = 0
|
211
|
-
current_address = (byte+bit/8.0)
|
212
|
-
end
|
213
|
-
# Si el dato es una palabra simple, alinea los datos en el siguiente byte par
|
214
|
-
if var.bit_length > 8 and current_address.modulo(2) != 0
|
215
|
-
byte += 1
|
216
|
-
bit = 0
|
217
|
-
end
|
218
|
-
# Si el dato es una palabra doble, alinea los datos en la siguiente palabra par
|
219
|
-
if var.bit_length > 16 and (current_address + start_address*2).modulo(4) != 0
|
220
|
-
byte += 4-byte%4
|
221
|
-
bit = 0
|
222
|
-
end
|
223
|
-
end
|
224
|
-
end
|
257
|
+
align_data(attr_options, var) if @options[:align]
|
225
258
|
|
226
259
|
# Si los datos ocupan mas de un byte concatena los arrays
|
227
260
|
if !attr_options[:type].in? [:bitfield, :bool] and @options[:align]
|
228
|
-
buffer.insert(
|
261
|
+
buffer.insert(self.current_byte, tmp_buffer).flatten!
|
229
262
|
else # En caso de ser bits
|
230
263
|
tmp_buffer.flatten!
|
231
264
|
tmp_bits=tmp_buffer.pack('C*').unpack('b*').first.slice(0,var.size*8)
|
232
|
-
tmp_buffer=[tmp_bits.rjust(tmp_bits.length+
|
265
|
+
tmp_buffer=[tmp_bits.rjust(tmp_bits.length+self.current_bit,'0')].pack('b*').unpack('C*')
|
233
266
|
|
234
267
|
tmp_buffer.each_with_index do |v,i|
|
235
|
-
buffer[
|
268
|
+
buffer[self.current_byte+i] = (buffer[self.current_byte+i] || 0) | v
|
236
269
|
end
|
237
270
|
end
|
238
271
|
|
239
|
-
current_address
|
272
|
+
self.current_address += var.size
|
240
273
|
end
|
241
274
|
buffer.map!{|el| el || 0}
|
242
275
|
end
|
@@ -244,47 +277,26 @@ module ActiveModel
|
|
244
277
|
#deserializado
|
245
278
|
def load (buffer=[])
|
246
279
|
serialized_values = {}
|
247
|
-
start_address = @options[:start_address] || 0
|
280
|
+
self.start_address = @options[:start_address] || 0
|
248
281
|
|
249
282
|
buffer ||= [] # Buffer en bytes
|
250
283
|
tmp_buffer = [] # Buffer temporal en bytes
|
251
284
|
|
252
|
-
current_address = start_address
|
285
|
+
self.current_address = self.start_address # Dirección en bytes
|
253
286
|
|
254
287
|
@serializable.attr_config.each do |attr_options|
|
255
288
|
attr_name = attr_options[:name]
|
256
|
-
byte = current_address.floor
|
257
|
-
bit = (current_address.modulo(1)*8).round
|
258
289
|
|
259
290
|
var = attr_options[:coder].new(attr_options.merge(parent: @serializable)) #creo objeto del tipo de dato pasado
|
260
291
|
|
261
|
-
if @options[:align]
|
262
|
-
if !attr_options[:type].in? [:bitfield, :bool, :nest]
|
263
|
-
# Se posiciona al principio de un byte
|
264
|
-
if bit != 0
|
265
|
-
byte += 1
|
266
|
-
bit = 0
|
267
|
-
current_address = (byte+bit/8.0)
|
268
|
-
end
|
269
|
-
# Si el dato es una palabra simple, alinea los datos en el siguiente byte par
|
270
|
-
if var.bit_length > 8 and current_address.modulo(2) != 0
|
271
|
-
byte += 1
|
272
|
-
bit = 0
|
273
|
-
end
|
274
|
-
# Si el dato es una palabra doble, alinea los datos en la siguiente palabra par
|
275
|
-
if var.bit_length > 16 and (current_address + start_address*2).modulo(4) != 0
|
276
|
-
byte += 4-byte%4
|
277
|
-
bit = 0
|
278
|
-
end
|
279
|
-
end
|
280
|
-
end
|
292
|
+
align_data(attr_options, var) if @options[:align]
|
281
293
|
|
282
294
|
# Si los datos ocupan mas de un byte, obtiene los bytes completos del buffer original
|
283
295
|
if !attr_options[:type].in? [:bitfield, :bool] and @options[:align]
|
284
|
-
result_deserialized=var.load(buffer.slice(
|
296
|
+
result_deserialized=var.load(buffer.slice(self.current_byte, var.size))
|
285
297
|
else # En caso de ser bits
|
286
|
-
tmp_buffer = buffer.slice(
|
287
|
-
result_deserialized=var.load([tmp_buffer.pack('C*').unpack('b*').first.slice(
|
298
|
+
tmp_buffer = buffer.slice(self.current_byte, (var.size+self.current_bit/8.0).ceil)
|
299
|
+
result_deserialized=var.load([tmp_buffer.pack('C*').unpack('b*').first.slice(self.current_bit,var.size*8)].pack('b*').unpack('C*'))
|
288
300
|
end
|
289
301
|
|
290
302
|
if attr_options[:type] == :nest
|
@@ -292,7 +304,7 @@ module ActiveModel
|
|
292
304
|
else
|
293
305
|
serialized_values["#{attr_name}"] = result_deserialized.count>1 ? result_deserialized : result_deserialized.first
|
294
306
|
end
|
295
|
-
current_address
|
307
|
+
self.current_address += var.size
|
296
308
|
end
|
297
309
|
|
298
310
|
# Asigno los datos leidos
|
@@ -305,39 +317,18 @@ module ActiveModel
|
|
305
317
|
# Return size of object in bytes
|
306
318
|
def size
|
307
319
|
serializable_values = @serializable.serializable_hash(@options)
|
308
|
-
start_address = @options[:start_address] || 0
|
320
|
+
self.start_address = @options[:start_address] || 0
|
309
321
|
|
310
322
|
current_address = 0.0 # Dirección en bytes
|
311
323
|
|
312
324
|
@serializable.attr_config.each do |attr_options|
|
313
325
|
var = attr_options[:coder].new(attr_options.merge(parent: @serializable))
|
314
326
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
if @options[:align]
|
319
|
-
if !attr_options[:type].in? [:bitfield, :bool, :nest]
|
320
|
-
# Se posiciona al principio de un byte
|
321
|
-
if bit != 0
|
322
|
-
byte += 1
|
323
|
-
bit = 0
|
324
|
-
current_address = (byte+bit/8.0)
|
325
|
-
end
|
326
|
-
# Si el dato es una palabra simple, alinea los datos en el siguiente byte par
|
327
|
-
if var.bit_length > 8 and current_address.modulo(2) != 0
|
328
|
-
byte += 1
|
329
|
-
bit = 0
|
330
|
-
end
|
331
|
-
# Si el dato es una palabra doble, alinea los datos en la siguiente palabra par
|
332
|
-
if var.bit_length > 16 and (current_address + start_address*2).modulo(4) != 0
|
333
|
-
byte += 4-byte%4
|
334
|
-
bit = 0
|
335
|
-
end
|
336
|
-
end
|
337
|
-
end
|
338
|
-
current_address = (byte+bit/8.0)+var.size
|
327
|
+
align_data(attr_options, var) if @options[:align]
|
328
|
+
|
329
|
+
self.current_address += var.size
|
339
330
|
end
|
340
|
-
current_address-start_address
|
331
|
+
self.current_address-self.start_address
|
341
332
|
end
|
342
333
|
|
343
334
|
end #close class serializer
|
@@ -1,251 +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 )
|
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
|
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 )
|
12
|
+
@raw_value = @value.pack('c*').unpack('C*')
|
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
|
251
251
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Product
|
2
|
+
include ActiveModel::Serializers::Binary
|
3
|
+
|
4
|
+
endianess :big
|
5
|
+
align :dword
|
6
|
+
|
7
|
+
int8 :int8
|
8
|
+
int16 :int16
|
9
|
+
int16le :int16le
|
10
|
+
int16be :int16be
|
11
|
+
int32 :int32
|
12
|
+
int32le :int32le
|
13
|
+
int32be :int32be
|
14
|
+
uint8 :uint8
|
15
|
+
uint16 :uint16
|
16
|
+
uint16le :uint16le
|
17
|
+
uint16be :uint16be
|
18
|
+
uint32 :uint32
|
19
|
+
uint32le :uint32le
|
20
|
+
uint32be :uint32be
|
21
|
+
bitfield :bitfield
|
22
|
+
float32 :float32
|
23
|
+
float64 :float64
|
24
|
+
char :char
|
25
|
+
bool :bool
|
26
|
+
nest :type, coder: Type
|
27
|
+
end
|
@@ -7,10 +7,28 @@ class String
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
orig =
|
11
|
-
|
12
|
-
orig.
|
13
|
-
orig.
|
10
|
+
orig = Product.new
|
11
|
+
|
12
|
+
orig.int8 = 1;
|
13
|
+
orig.int16 = 1;
|
14
|
+
orig.int16le = 1;
|
15
|
+
orig.int16be = 1;
|
16
|
+
orig.int32 = 1;
|
17
|
+
orig.int32le = 1;
|
18
|
+
orig.int32be = 1;
|
19
|
+
orig.uint8 = 1;
|
20
|
+
orig.uint16 = 1;
|
21
|
+
orig.uint16le = 1;
|
22
|
+
orig.uint16be = 1;
|
23
|
+
orig.uint32 = 1;
|
24
|
+
orig.uint32le = 1;
|
25
|
+
orig.uint32be = 1;
|
26
|
+
orig.bitfield = 1;
|
27
|
+
orig.float32 = 1;
|
28
|
+
orig.float64 = 1;
|
29
|
+
orig.char = "A";
|
30
|
+
orig.bool = 1;
|
31
|
+
orig.type = Type.new({product_id: 1, name: "ABCDEFGHIJKLMNOPQRST"})
|
14
32
|
|
15
33
|
puts 'Datos originales...'
|
16
34
|
puts orig.inspect.green
|
@@ -21,7 +39,7 @@ serial = orig.to_bytes
|
|
21
39
|
puts serial.inspect.yellow
|
22
40
|
|
23
41
|
puts 'deserializando...'
|
24
|
-
deser =
|
42
|
+
deser = Product.new.from_bytes serial
|
25
43
|
puts deser.inspect.green
|
26
44
|
|
27
45
|
must_be_equal = (serial <=> deser.to_bytes) === 0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_model_serializers_binary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ByS Sistemas de Control
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -128,8 +128,8 @@ files:
|
|
128
128
|
- test/dummy/app/mailers/.keep
|
129
129
|
- test/dummy/app/models/.keep
|
130
130
|
- test/dummy/app/models/concerns/.keep
|
131
|
-
- test/dummy/app/models/
|
132
|
-
- test/dummy/app/models/
|
131
|
+
- test/dummy/app/models/product.rb
|
132
|
+
- test/dummy/app/models/type.rb
|
133
133
|
- test/dummy/app/views/layouts/application.html.erb
|
134
134
|
- test/dummy/bin/bundle
|
135
135
|
- test/dummy/bin/rails
|
@@ -153,9 +153,6 @@ files:
|
|
153
153
|
- test/dummy/config/locales/en.yml
|
154
154
|
- test/dummy/config/routes.rb
|
155
155
|
- test/dummy/config/secrets.yml
|
156
|
-
- test/dummy/db/migrate/20160608024807_create_productos.rb
|
157
|
-
- test/dummy/db/migrate/20170817015810_create_tipos.rb
|
158
|
-
- test/dummy/db/schema.rb
|
159
156
|
- test/dummy/lib/assets/.keep
|
160
157
|
- test/dummy/lib/test_parser.rb
|
161
158
|
- test/dummy/log/.keep
|
@@ -205,8 +202,8 @@ test_files:
|
|
205
202
|
- test/dummy/app/mailers/.keep
|
206
203
|
- test/dummy/app/models/.keep
|
207
204
|
- test/dummy/app/models/concerns/.keep
|
208
|
-
- test/dummy/app/models/
|
209
|
-
- test/dummy/app/models/
|
205
|
+
- test/dummy/app/models/product.rb
|
206
|
+
- test/dummy/app/models/type.rb
|
210
207
|
- test/dummy/app/views/layouts/application.html.erb
|
211
208
|
- test/dummy/bin/bundle
|
212
209
|
- test/dummy/bin/rails
|
@@ -230,9 +227,6 @@ test_files:
|
|
230
227
|
- test/dummy/config/locales/en.yml
|
231
228
|
- test/dummy/config/routes.rb
|
232
229
|
- test/dummy/config/secrets.yml
|
233
|
-
- test/dummy/db/migrate/20160608024807_create_productos.rb
|
234
|
-
- test/dummy/db/migrate/20170817015810_create_tipos.rb
|
235
|
-
- test/dummy/db/schema.rb
|
236
230
|
- test/dummy/lib/assets/.keep
|
237
231
|
- test/dummy/lib/test_parser.rb
|
238
232
|
- test/dummy/log/.keep
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# == Schema Information
|
2
|
-
#
|
3
|
-
# Table name: productos
|
4
|
-
#
|
5
|
-
# id :integer not null, primary key
|
6
|
-
# uid :integer
|
7
|
-
# silo :integer
|
8
|
-
# nombre :string(255)
|
9
|
-
# total_acumulado :integer
|
10
|
-
# bits1 :boolean
|
11
|
-
# bits2 :boolean
|
12
|
-
# ffloat :float
|
13
|
-
# variable :string(255)
|
14
|
-
# created_at :datetime
|
15
|
-
# updated_at :datetime
|
16
|
-
#
|
17
|
-
|
18
|
-
class Producto < ActiveRecord::Base
|
19
|
-
include ActiveModel::Serializers::Binary
|
20
|
-
|
21
|
-
int16 :uid
|
22
|
-
int16 :silo
|
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
|
46
|
-
nest :tipo, coder: Tipo
|
47
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# == Schema Information
|
2
|
-
#
|
3
|
-
# Table name: tipos
|
4
|
-
#
|
5
|
-
# id :integer not null, primary key
|
6
|
-
# name :string
|
7
|
-
# producto_id :integer
|
8
|
-
# created_at :datetime not null
|
9
|
-
# updated_at :datetime not null
|
10
|
-
#
|
11
|
-
|
12
|
-
class Tipo < ActiveRecord::Base
|
13
|
-
include ActiveModel::Serializers::Binary
|
14
|
-
|
15
|
-
int16 :producto_id
|
16
|
-
char :name, count: 1, length: 20
|
17
|
-
|
18
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class CreateProductos < ActiveRecord::Migration
|
2
|
-
def change
|
3
|
-
create_table :productos do |t|
|
4
|
-
t.integer :uid
|
5
|
-
t.integer :silo
|
6
|
-
t.string :nombre
|
7
|
-
t.integer :total_acumulado
|
8
|
-
t.boolean :bits1
|
9
|
-
t.boolean :bits2
|
10
|
-
t.float :ffloat
|
11
|
-
t.string :variable
|
12
|
-
|
13
|
-
t.timestamps
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/test/dummy/db/schema.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# This file is auto-generated from the current state of the database. Instead
|
2
|
-
# of editing this file, please use the migrations feature of Active Record to
|
3
|
-
# incrementally modify your database, and then regenerate this schema definition.
|
4
|
-
#
|
5
|
-
# Note that this schema.rb definition is the authoritative source for your
|
6
|
-
# database schema. If you need to create the application database on another
|
7
|
-
# system, you should be using db:schema:load, not running all the migrations
|
8
|
-
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
9
|
-
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
10
|
-
#
|
11
|
-
# It's strongly recommended that you check this file into your version control system.
|
12
|
-
|
13
|
-
ActiveRecord::Schema.define(version: 20170817015810) do
|
14
|
-
|
15
|
-
create_table "productos", force: :cascade do |t|
|
16
|
-
t.integer "uid"
|
17
|
-
t.integer "silo"
|
18
|
-
t.string "nombre"
|
19
|
-
t.integer "total_acumulado"
|
20
|
-
t.boolean "bits1"
|
21
|
-
t.boolean "bits2"
|
22
|
-
t.float "ffloat"
|
23
|
-
t.string "variable"
|
24
|
-
t.datetime "created_at"
|
25
|
-
t.datetime "updated_at"
|
26
|
-
end
|
27
|
-
|
28
|
-
create_table "tipos", force: :cascade do |t|
|
29
|
-
t.string "name"
|
30
|
-
t.integer "producto_id"
|
31
|
-
t.datetime "created_at", null: false
|
32
|
-
t.datetime "updated_at", null: false
|
33
|
-
t.index ["producto_id"], name: "index_tipos_on_producto_id"
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|