ializer 0.3.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23ed07c07fd66ea5e3e8a7fdf7b5704264b1d030d7bf80a8146ae198d97f6ff4
4
- data.tar.gz: 64252cc08dd94f2f7655f0889c44e6e8302b16644b178207b4a1c00cfec8ffa3
3
+ metadata.gz: 99faa3c4e7cca943f993c112f46b36f7d36029e1bb4910699e21503b7bf3b74a
4
+ data.tar.gz: 85b7a7155bb42711a6c618a27fd350b6430705a53844f333bb9dfbae631f83d4
5
5
  SHA512:
6
- metadata.gz: 0a8f637568a675eb6889c14d9ecb0874a633572fbb076326ae9f283f89c53e1720d89a595cb37c7f965c8c9699c3f8f2dec80a28162c140e21f57d3b71d56bba
7
- data.tar.gz: 7602fa5387d2230097bdfc844d746742702f7f4032b8f9bfaf1ba2c4a545b51b798f85798be94acce7cb97ccde401f420154f82e9ee99cb3ae6e2aa21e74b08c
6
+ metadata.gz: e166c8c90c4cbc1b9535c45c2f0cb76ee1e7f048db28b65a71bcabab8a63832a31fbdba59c1ec1d239b939557fe1e9fd6382373b9435d420022c85a01289b3d9
7
+ data.tar.gz: dd84708200796c3b9dbfd5ad78496c41ee9cd72c7b77844c3933eab55fa531a20411adc36444152ed11242c0a6d4a7c8951aa626f62bb7dc578ea60ab23a802b
data/README.md CHANGED
@@ -13,6 +13,7 @@ A fast serializer/deserializer for Ruby Objects.
13
13
  * [Model Definitions](#model-definitions)
14
14
  * [Serializer Definitions](#serializer-definitions)
15
15
  * [DeSerializer Definitions](#deserializer-definitions)
16
+ * [De/Serializer Configuration](#deserializer-configuration)
16
17
  * [Object Serialization](#object-serialization)
17
18
  * [Object Deserialization](#object-deserialization)
18
19
  * [Attributes](#attributes)
@@ -153,6 +154,26 @@ class CustomerDeSer < De::Ser::Ializer
153
154
  end
154
155
  ```
155
156
 
157
+ ### De/Ser::Ializer Configuration
158
+
159
+ You can override the global config for a specific `Ser::Ializer` or `De::Ser::Ializer` by calling the setup command.
160
+
161
+ **Note:** `setup` must be called at the beginning of the definition otherwise the default config will be used.
162
+
163
+ ```ruby
164
+ class OrderDeSer < De::Ser::Ializer
165
+ setup do |config|
166
+ config.key_transform = :dasherize
167
+ end
168
+
169
+ integer :id
170
+ timestamp :created_at
171
+
172
+ nested :items, deser: OrderItemDeSer, model_class: OrderItem
173
+ nested :customer, deser: CustomerDeSer, model_class: Customer
174
+ end
175
+ ```
176
+
156
177
  ### Sample Object
157
178
 
158
179
  ```ruby
@@ -183,17 +204,17 @@ json_string = OrderDeser.serialize_json(order)
183
204
  ```json
184
205
  {
185
206
  "id": 4,
186
- "created-at": "2019-12-01T00:00:00.000-06:00",
207
+ "created_at": "2019-12-01T00:00:00.000-06:00",
187
208
  "items": [
188
209
  {
189
210
  "name": "Baseball",
190
211
  "decimal": "4.99",
191
- "in-stock": true
212
+ "in_stock": true
192
213
  },
193
214
  {
194
215
  "name": "Football",
195
216
  "decimal": "14.99",
196
- "in-stock": false
217
+ "in_stock": false
197
218
  }
198
219
  ],
199
220
  "customer": {
@@ -226,7 +247,7 @@ data = OrderDeSer.serialize([order, order2])
226
247
 
227
248
  ### Object Deserialization
228
249
 
229
- **Note:** Objects that are parsed must have a zero-argument initializer (ie: Object.new)
250
+ **Note:** Objects that are parsed must have a zero argument initializer (ie: Object.new)
230
251
 
231
252
  #### Parsing a hash
232
253
 
@@ -53,6 +53,8 @@ module De
53
53
  private
54
54
 
55
55
  def parse_field(object, field, value)
56
+ return if value.nil?
57
+
56
58
  parsed_value = field.parse(value)
57
59
 
58
60
  return if parsed_value.nil?
@@ -5,11 +5,17 @@ require 'bigdecimal'
5
5
  module Ializer
6
6
  class BigDecimalDeSer
7
7
  def self.serialize(value, _context = nil)
8
+ value = value.to_d unless value.is_a? BigDecimal
9
+
8
10
  value.to_s('F')
9
11
  end
10
12
 
11
13
  def self.parse(value)
14
+ return nil if value.nil?
15
+
12
16
  BigDecimal(value)
17
+ rescue ArgumentError
18
+ value
13
19
  end
14
20
  end
15
21
  end
@@ -10,7 +10,7 @@ module Ializer
10
10
  # :key_transform=: key_transform
11
11
  #
12
12
  # symbol of string transform to call on field keys
13
- # default is +:dasherize+.
13
+ # default is nil
14
14
  def key_transform=(key_transform)
15
15
  self.key_transformer = key_transform&.to_proc
16
16
  end
@@ -10,8 +10,8 @@ module Ializer
10
10
 
11
11
  def self.parse(value)
12
12
  Date.parse(value)
13
- rescue ArgumentError
14
- nil
13
+ rescue ArgumentError, TypeError
14
+ value
15
15
  end
16
16
  end
17
17
  end
@@ -9,6 +9,8 @@ module Ializer
9
9
  def self.parse(value)
10
10
  return value if value.is_a? Numeric
11
11
 
12
+ return nil if value.nil?
13
+
12
14
  value.to_i
13
15
  end
14
16
  end
@@ -23,6 +23,8 @@ module Ializer
23
23
 
24
24
  return Float::INFINITY if value == INFINITY_STRING
25
25
 
26
+ return nil if value.nil?
27
+
26
28
  value.to_f
27
29
  end
28
30
  end
@@ -9,6 +9,8 @@ module Ializer
9
9
  end
10
10
 
11
11
  def self.parse(value)
12
+ return nil if value.nil?
13
+
12
14
  Time.at(value / 1000.0)
13
15
  end
14
16
  end
@@ -7,7 +7,11 @@ module Ializer
7
7
  end
8
8
 
9
9
  def self.parse(value)
10
+ return nil if value.nil?
11
+
10
12
  value.to_sym
13
+ rescue NoMethodError
14
+ value
11
15
  end
12
16
  end
13
17
  end
@@ -10,6 +10,8 @@ module Ializer
10
10
 
11
11
  def self.parse(value)
12
12
  DateTime.iso8601 value
13
+ rescue ArgumentError
14
+ value
13
15
  end
14
16
  end
15
17
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ializer
4
- VERSION = '0.3.0'
4
+ VERSION = '0.8.0'
5
5
  end
@@ -5,9 +5,24 @@ module Ser
5
5
  @@method_registry = {} # rubocop:disable Style/ClassVars
6
6
 
7
7
  class << self
8
+ def config
9
+ @config ||=
10
+ if equal? Ser::Ializer
11
+ ::Ializer.config
12
+ else
13
+ superclass.config
14
+ end
15
+ end
16
+
17
+ def setup
18
+ @config = config.dup
19
+
20
+ yield @config
21
+ end
22
+
8
23
  # Public DSL
9
24
  def property(name, options = {}, &block)
10
- return add_attribute(Field.new(name, options, &block)) if options[:deser]
25
+ return add_attribute(Field.new(name, options, config, &block)) if options[:deser]
11
26
 
12
27
  return default(name, options, &block) unless options[:type]
13
28
 
@@ -25,7 +40,7 @@ module Ser
25
40
  options[:deser] = deser
26
41
  end
27
42
 
28
- add_attribute(Field.new(name, options))
43
+ add_attribute(Field.new(name, options, config))
29
44
  end
30
45
 
31
46
  def with(deser)
@@ -38,6 +53,8 @@ module Ser
38
53
  def serialize(object, context = nil)
39
54
  return serialize_one(object, context) unless valid_enumerable?(object)
40
55
 
56
+ return [] if object.empty?
57
+
41
58
  object.map { |o| serialize_one(o, context) }
42
59
  end
43
60
 
@@ -50,7 +67,7 @@ module Ser
50
67
 
51
68
  define_singleton_method(method_name) do |name, options = {}, &block|
52
69
  options[:deser] = deser
53
- add_attribute Field.new(name, options, &block)
70
+ add_attribute Field.new(name, options, config, &block)
54
71
  end
55
72
 
56
73
  matchers.each do |matcher|
@@ -60,12 +77,12 @@ module Ser
60
77
 
61
78
  def register_default(deser)
62
79
  define_singleton_method('default') do |name, options = {}, &block|
63
- raise ArgumentError, warning_message(name) if ::Ializer.config.raise_on_default?
80
+ raise ArgumentError, warning_message(name) if config.raise_on_default?
64
81
 
65
- puts warning_message(name) if ::Ializer.config.warn_on_default?
82
+ puts warning_message(name) if config.warn_on_default?
66
83
 
67
84
  options[:deser] = deser
68
- add_attribute Field.new(name, options, &block)
85
+ add_attribute Field.new(name, options, config, &block)
69
86
  end
70
87
  end
71
88
 
@@ -129,6 +146,8 @@ module Ser
129
146
 
130
147
  return field.serialize(value, context) unless valid_enumerable?(value)
131
148
 
149
+ return nil if value.empty?
150
+
132
151
  value.map { |v| field.serialize(v, context) }
133
152
  end
134
153
 
@@ -4,19 +4,19 @@ module Ser
4
4
  class Ializer
5
5
  class Field
6
6
  class << self
7
- def transform(key)
8
- return key unless ::Ializer.config.key_transformer
7
+ def transform(key, key_transformer)
8
+ return key unless key_transformer
9
9
 
10
- ::Ializer.config.key_transformer.call(key)
10
+ key_transformer.call(key)
11
11
  end
12
12
  end
13
13
 
14
14
  attr_reader :name, :setter, :key, :deser, :model_class, :if_condition, :block
15
15
 
16
- def initialize(name, options, &block)
16
+ def initialize(name, options, config, &block)
17
17
  @name = name
18
18
  @setter = options[:setter] || "#{name}="
19
- @key = options[:key] || Field.transform(name.to_s)
19
+ @key = options[:key] || Field.transform(name.to_s, config.key_transformer)
20
20
  @deser = options[:deser]
21
21
  @if_condition = options[:if]
22
22
  @model_class = options[:model_class]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Steinberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-14 00:00:00.000000000 Z
11
+ date: 2020-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport