userializer 0.1.3 → 0.1.4

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
  SHA256:
3
- metadata.gz: 176f64904bdd2aebe075ad93bb12ff1f900bdf5624b2a8a1c86001d7e9de497d
4
- data.tar.gz: e7ca4ff8d4436e8880772f4e8c526137669b9993fdce4e87f23674d92ab071fd
3
+ metadata.gz: ffef1e179dd3b2b19e6a55f24edc24c691a0885aa6bcc0585e5600296d6697f8
4
+ data.tar.gz: 9f6bfe4b0203808dc37ba579ade7386b0025d6593721fb1a330298e79ee76f75
5
5
  SHA512:
6
- metadata.gz: 51e1b63bcd632e558169f670fef2c83a5360fc8c0cce079504088b0574c972050f523ffcc93b5f6fd3ce970e0bb7c20d9d9873a47ad7587051012b7b96853052
7
- data.tar.gz: b9d61df410bf4d35d7f91d66fa439999c424164acf159990ca8105ed9795889e5619f3fa22b6cde3d8018a846dd9cd917caf6131334c257dd3027c3c0dd61873
6
+ metadata.gz: 2f3e01d2b9dbd0324c21d8917b4e1f4bf2909ea73b7f6233ccbff2b3b61e35849b398dbed0bb3b82e140ce38934905c62213b492ee21856b2cc4551996035fad
7
+ data.tar.gz: 587444031cec4029296277202efa952b3785b9d3127908205fe0237d115b7fc0ecbd80b6f56533f282d99ec0b9f98bdca3012974377355dd0a9b0a1da6882e4a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- userializer (0.1.3)
4
+ userializer (0.1.4)
5
5
  activesupport
6
6
  oj
7
7
 
data/README.md CHANGED
@@ -20,7 +20,152 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- TODO: Write usage instructions here
23
+ USerializer's DSL is relatively close to Active Model Serializer's,
24
+ while having a few additional features including:
25
+ * Attributes Conditional Declaration
26
+ * Attributes Inline Definition
27
+
28
+ ### Attributes Conditional Declaration
29
+
30
+ USerializer allows you to dynamically decide wether an attribute should
31
+ be serialized or not by passing its definition an `if` block as follows:
32
+ ```ruby
33
+ attributes :conditional_attr, if: proc { |_, opts| ... }
34
+ ```
35
+
36
+ Eg: Let's say you want to serialize an `Order` object but want to
37
+ include its `price` only if it's superior to *10*, your serializer
38
+ would look like the following:
39
+ ```ruby
40
+ class Order < ActiveRecord::Base
41
+ def price
42
+ 10
43
+ end
44
+ end
45
+
46
+ class OrderSerializer < USerializer::BaseSerializer
47
+ attributes :price, if: proc do |obj, _|
48
+ obj.price > 10
49
+ end
50
+ end
51
+ ```
52
+
53
+ In that case for example, the `price` attribute would be omitted from
54
+ the final response.
55
+
56
+ ### Attributes Inline Definition
57
+
58
+ Using AMS, the only way to rewrite an attribute prior to serialization
59
+ is to override it using a method with the same name, leading to
60
+ something like this:
61
+ ```ruby
62
+ class MyObject < ActiveRecord::Base
63
+ def random_attr
64
+ 0
65
+ end
66
+ end
67
+
68
+ class MyObjectSerializer < ActiveModel::Serializer
69
+ attributes :random_attr
70
+
71
+ def random_attr
72
+ object.random_attr + 1
73
+ end
74
+ end
75
+ ```
76
+
77
+ While this code works perfectly, it pushes the serialized attribute
78
+ value definition back from its declaration, causing developers to lose
79
+ focus when listing their serialized attributes because the overriding is
80
+ done farther.
81
+
82
+ With USerializer, all of this is done in an inline way, so that you can
83
+ override the attribute's value while declaring using a block as
84
+ follows:
85
+ ```ruby
86
+ attributes :your_attribute do |object, _|
87
+ ...
88
+ end
89
+ ```
90
+
91
+ Our `random_attr` serialization would then looks like this with
92
+ USerializer:
93
+ ```ruby
94
+ class MyObjectSerializer < USerializer::BaseSerializer
95
+ attributes :random_attr do |object, _|
96
+ object.random_attr + 1
97
+ end
98
+ end
99
+ ```
100
+
101
+ Way nicer, right?
102
+
103
+ ### Relationships
104
+
105
+ Just like AMS, USerializer supports `has_one` and `has_many`
106
+ relationships
107
+
108
+ ### Serialized Output
109
+
110
+ The following outputs will be based an on our `Order` object in
111
+ different situations:
112
+
113
+ * Order is serialized without any relationships:
114
+ ```json
115
+ {
116
+ "order": {
117
+ "id": 1,
118
+ "attr_1": "value_1",
119
+ "attr_2": "value_2",
120
+ "attr_3": "value_3",
121
+ }
122
+ }
123
+ ```
124
+
125
+ * Order has a `has_one` relationship with a `Client` model
126
+ ```json
127
+ {
128
+ "clients": [
129
+ {
130
+ "id": 4,
131
+ "name": "userializer client",
132
+ ...
133
+ }
134
+ ],
135
+ "order": {
136
+ "id": 1,
137
+ "attr_1": "value_1",
138
+ "attr_2": "value_2",
139
+ "attr_3": "value_3",
140
+ "client_id": 4
141
+ }
142
+ }
143
+ ```
144
+
145
+ * Order has a `has_many` relationship with an `Article` model
146
+ ```json
147
+ {
148
+ "articles": [
149
+ {
150
+ "id": 1,
151
+ "name": "Article #1",
152
+ ...
153
+ },
154
+ {
155
+ "id": 1,
156
+ "name": "Article #2",
157
+ ...
158
+ }
159
+ ],
160
+ "order": {
161
+ "id": 1,
162
+ "attr_1": "value_1",
163
+ "attr_2": "value_2",
164
+ "attr_3": "value_3",
165
+ "article_ids": [1, 2]
166
+ }
167
+ }
168
+ ```
24
169
 
25
170
  ## Development
26
171
 
@@ -8,13 +8,16 @@ module USerializer
8
8
  @opts = opts
9
9
  @id_key = "#{ActiveSupport::Inflector.singularize(key)}_ids".to_sym
10
10
 
11
+ @embed_key = opts[:embed_key] || :id
11
12
  @conditional_block = opts[:if] || proc { true }
12
13
  end
13
14
 
14
15
  def merge_attributes(res, ser, opts)
15
16
  return unless @conditional_block.call(ser.object, opts)
16
17
 
17
- res[@id_key] = (ser.send(@key) || []).compact.map(&:id).compact
18
+ res[@id_key] = (ser.send(@key) || []).compact.map do |obj|
19
+ obj.nil? ? nil : obj.send(@embed_key)
20
+ end.compact
18
21
  end
19
22
 
20
23
  def merge_root(res, ser, opts)
@@ -7,7 +7,7 @@ module USerializer
7
7
  @root_key = opts[:root]&.to_sym
8
8
 
9
9
  @serializer = opts[:serializer]
10
-
10
+ @embed_key = opts[:embed_key] || :id
11
11
  @conditional_block = opts[:if] || proc { true }
12
12
  end
13
13
 
@@ -17,7 +17,7 @@ module USerializer
17
17
  return unless @conditional_block.call(ser.object, opts)
18
18
 
19
19
  obj = ser.send(@key)
20
- res[@id_key] = obj&.id
20
+ res[@id_key] = obj.nil? ? nil : obj.send(@embed_key)
21
21
  end
22
22
 
23
23
  def merge_root(res, ser, opts)
@@ -1,3 +1,3 @@
1
1
  module USerializer
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: userializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexis Montagne
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-05-10 00:00:00.000000000 Z
11
+ date: 2019-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler