deserializer 0.2.0 → 0.3.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 016e23ff6b54642bf58daea3210e2ed45011170b
4
- data.tar.gz: e897dd40e6b336374169440965eee92f2496e0a9
3
+ metadata.gz: d2d925b16aaf70730f68ed799b22236a2b4a9c1b
4
+ data.tar.gz: 291d5ba90c44ddd31eeab94c314f16f414ecf7df
5
5
  SHA512:
6
- metadata.gz: 66afd6278382e72c8f925be8c05b4fc330c9886714de2860a82915212a1a76df6c72d200c10e0c9c4fa16fdb4005c065f540b45f70328d9f6b12d777da4d239f
7
- data.tar.gz: cbe4496605fa6a1b9b1f37caf0affadeade2d833df2e857ff6c30c5158a1e14a616100adc84e79cb25b0807b2d09b803d72d988af7fab1efa4163159fa874f62
6
+ metadata.gz: df1caed559319d4c42f6770408172d600c8511260126a8eec742d645586d14861e8468999f094d195f0a9462c0bf09efe2afc3f289166f3c42f330e750e96e1d
7
+ data.tar.gz: 2a87db6f696784599033d89f4b41abad6bb2094890f7a403c83182afab53094c0714a7ff8d276a0a113c00a9e9b9990498f5b723721c5b23dc317dee305e36c5
data/README.md CHANGED
@@ -130,7 +130,7 @@ with params `{"title" => "lorem", "body" => "ipsum"}`, will give you a hash of `
130
130
  `attribute` is the singular version of `attributes`, but like `ActiveModel::Serializer` it can take a `:key`
131
131
  ```ruby
132
132
  class PostDeserializer < Deserializer::Base
133
- attribute :title
133
+ attribute :title, ignore_empty: true
134
134
  attribute :body, key: :text
135
135
  end
136
136
  ```
@@ -138,6 +138,43 @@ It is symmetric with `ActiveModel::Serializer`, so that :text is what it will ge
138
138
 
139
139
  For example with params of `{"title" => "lorem", "text" => "ipsum"}` this desrerializer will produce `{title: "lorem", body: "ipsum"}`.
140
140
 
141
+ `ignore_empty` is an option to ignore `false`/`nil`/`""`/`[]`/`{}` values that may come into the deserializer. By defualt it will pass the value through. With this option, it will drop the key from the result, turning `{"title" => "", "text" => nil}` into `{}`
142
+
143
+ `convert_with` allows the deserializer to deserialize and convert a value at the same time. For example, if we have a `Post` model that looks like
144
+
145
+ ```ruby
146
+ class Post < ActiveRecord::Base
147
+ belongs_to :post_type # this is a domain table
148
+ end
149
+ ```
150
+
151
+ and we serialize with
152
+ ```ruby
153
+ class PostSerializer < ActiveModel::Serializer
154
+ attribute :type
155
+
156
+ def type
157
+ object.post_type.symbolic_name
158
+ end
159
+ end
160
+ ```
161
+
162
+ Then, when we if we get a symbolic name from the controller, but want to work with an id in the backend, we can do something like:
163
+
164
+ ```ruby
165
+ class PostDeserializer < Deserializer::Base
166
+ attribute :title, ignore_empty: true
167
+ attribute :body
168
+ attribute :post_type_id, key: type, convert_with: to_type_id
169
+
170
+ def to_type_id(value)
171
+ Type.find_by_symbolic_name.id
172
+ end
173
+ end
174
+ ```
175
+
176
+ which would take the params `{"title" => "lorem", "body" => "ipsum", "type" => "BLAGABLAG"}` and produce `{title: "lorem", body: "ipsum", post_type_id: 1}`
177
+
141
178
 
142
179
  #### has_one
143
180
  NOTE: This is the only association currently supported by `Deserializer`.
@@ -101,10 +101,18 @@ module Deserializer
101
101
  def assign_value( attribute, value, options = {} )
102
102
  if options[:ignore_empty] && empty?(value)
103
103
  return
104
- # other options go here
105
- else
106
- self.object[attribute] = value
107
104
  end
105
+ if options[:convert_with]
106
+ method = options[:convert_with]
107
+ if self.respond_to? method
108
+ self.object[attribute] = self.send method, value
109
+ return
110
+ end
111
+ end
112
+ # other options go here
113
+
114
+ self.object[attribute] = value
115
+
108
116
  end
109
117
 
110
118
  def empty?(value)
@@ -114,4 +122,4 @@ module Deserializer
114
122
  value == []
115
123
  end
116
124
  end
117
- end
125
+ end
@@ -1,3 +1,3 @@
1
1
  module Deserializer
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -80,4 +80,34 @@ class HasOneWithObjectTargetDeserializer < Deserializer::Base
80
80
  def other_thing
81
81
  object
82
82
  end
83
+ end
84
+
85
+ class ConversionDeserializer < Deserializer::Base
86
+ attribute :real_range, convert_with: :to_range
87
+ attribute :bad_range, convert_with: :to_range
88
+
89
+ def to_range(value)
90
+ range_array = Array(value)
91
+ (range_array[0]..range_array[-1])
92
+ end
93
+ end
94
+
95
+ class KeyedConversionDeserializer < Deserializer::Base
96
+ attribute :real_range, convert_with: :to_range, key: :real
97
+ attribute :bad_range, convert_with: :to_range, key: :bad
98
+
99
+ def to_range(value)
100
+ range_array = Array(value)
101
+ (range_array[0]..range_array[-1])
102
+ end
103
+ end
104
+
105
+ class NillableConversionDeserializer < Deserializer::Base
106
+ attribute :real_range, convert_with: :to_range, key: :real, ignore_empty: true
107
+ attribute :bad_range, convert_with: :to_range, key: :bad, ignore_empty: true
108
+
109
+ def to_range(value)
110
+ range_array = Array(value)
111
+ (range_array[0]..range_array[-1])
112
+ end
83
113
  end
@@ -121,4 +121,25 @@ class DeserializerTest < Minitest::Test
121
121
  BasicDeserializer.belongs_to :explody
122
122
  end
123
123
  end
124
+
125
+ def test_supports_conversions
126
+ expected = { real_range: (1..4), bad_range: (1..1)}
127
+ params = { real_range: [1, 12, 4], bad_range: 1}
128
+
129
+ assert_equal expected, ConversionDeserializer.from_params( params )
130
+ end
131
+
132
+ def test_supports_conversions_with_key
133
+ expected = { real_range: (1..4), bad_range: (1..1)}
134
+ params = { real: [1, 4], bad: 1}
135
+
136
+ assert_equal expected, KeyedConversionDeserializer.from_params( params )
137
+ end
138
+
139
+ def test_supports_conversions_with_ignore_empty
140
+ expected = { real_range: (1..4)}
141
+ params = { real: [1, 4], bad: nil}
142
+
143
+ assert_equal expected, NillableConversionDeserializer.from_params( params )
144
+ end
124
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deserializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Orlov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-10 00:00:00.000000000 Z
11
+ date: 2015-09-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler