userializer 0.2.0 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/pull_request_template.md +28 -0
- data/.github/workflows/ci.yml +25 -0
- data/README.md +27 -0
- data/lib/userializer/base_serializer.rb +10 -4
- data/lib/userializer/composite_serializer.rb +78 -0
- data/lib/userializer/has_many.rb +8 -2
- data/lib/userializer/has_one.rb +1 -1
- data/lib/userializer/version.rb +1 -1
- data/lib/userializer.rb +1 -0
- metadata +6 -4
- data/.circleci/config.yml +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39db10c77bd519fffda4b6e6c7e613bc1105a951ab39e677dd8d1aaa0aa6f6b0
|
4
|
+
data.tar.gz: 5327aa7eb5e03f5abe504e4dde6d4e619df810af3802e896e28a72e9edc5c21f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fcc67f9270e9c8359dc4488eaf11684fcb952f563a64d41f90cae3d83c1ff31a5c271c2247bc538fa3b5877241d3a7f769a32100c9e04ed9cb327caa15fa92f
|
7
|
+
data.tar.gz: 982d8a1495d2c3a6eb83b498b79a6e9d40910f05226b3e4d14a0d5ab1100d04c4145c1d7e14ccd083f5329cf380089300e131848b7d9d2e6692f498793057b91
|
@@ -0,0 +1,28 @@
|
|
1
|
+
### What does this PR do?
|
2
|
+
|
3
|
+
<!-- A brief description of the context of this pull request and its purpose. -->
|
4
|
+
|
5
|
+
### What are the observable changes?
|
6
|
+
<!-- This question could be adequate with multiple use cases, for example: -->
|
7
|
+
|
8
|
+
<!-- Frontend: explain the feature created / updated, give instructions telling how to see the change in staging -->
|
9
|
+
<!-- Performance: what metric should be impacted, link to the right graphana dashboard for exemple -->
|
10
|
+
<!-- Bug: a given issue trail on sentry should stop happening -->
|
11
|
+
<!-- Feature: Implements X thrift service / Z HTTP REST API added, provide instructions on how leverage your feature from staging or your workstation -->
|
12
|
+
|
13
|
+
### Good PR checklist
|
14
|
+
|
15
|
+
- [ ] Title makes sense
|
16
|
+
- [ ] Is against the correct branch
|
17
|
+
- [ ] Only addresses one issue
|
18
|
+
- [ ] Properly assigned
|
19
|
+
- [ ] Added/updated tests
|
20
|
+
- [ ] Added/updated documentation
|
21
|
+
- [ ] Properly labeled
|
22
|
+
|
23
|
+
### Additional Notes
|
24
|
+
|
25
|
+
<!--
|
26
|
+
You can add anything you want here, an explanation on the way you built your implementation,
|
27
|
+
precisions on the origin of the bug, gotchas you need to mention.
|
28
|
+
-->
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: ci
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
pull_request:
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
name: Run Tests
|
12
|
+
runs-on: ubuntu-20.04
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
ruby: [2.7, 3.0.3]
|
16
|
+
steps:
|
17
|
+
- name: Checkout
|
18
|
+
uses: actions/checkout@v2
|
19
|
+
- name: Install Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby }}
|
23
|
+
bundler-cache: true
|
24
|
+
- name: Run the Test Suite
|
25
|
+
run: bundle exec rspec --color --require spec_helper --format progress spec
|
data/README.md
CHANGED
@@ -167,6 +167,33 @@ different situations:
|
|
167
167
|
}
|
168
168
|
```
|
169
169
|
|
170
|
+
### CompositeSerializer
|
171
|
+
|
172
|
+
Imagine you have a compound of different data that you want to return to the same payload.
|
173
|
+
For example, you have an **array** of a `Foo` class and a `Bar` value to return.
|
174
|
+
You can use a `CompositeSerializer` to serialize both.
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
array_foo = [Foo.new, Foo.new]
|
178
|
+
bar = Bar.new
|
179
|
+
|
180
|
+
CompositeSerializer.new(
|
181
|
+
{ key_foo: array_foo, key_bar: bar },
|
182
|
+
each_serializer: { key_foo: FooCustomSerializer },
|
183
|
+
serializer: { key_bar: BarSerializer },
|
184
|
+
root: { key_foo: :foo_root, key_bar: :bar_root }
|
185
|
+
).to_json
|
186
|
+
```
|
187
|
+
|
188
|
+
this will render:
|
189
|
+
|
190
|
+
```json
|
191
|
+
{
|
192
|
+
"foo_root": [{... foo1 attributes ...}, {... foo2 attributes ...}],
|
193
|
+
"bar_root": {... bar attributes ...}
|
194
|
+
}
|
195
|
+
```
|
196
|
+
|
170
197
|
## Development
|
171
198
|
|
172
199
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -45,6 +45,7 @@ module USerializer
|
|
45
45
|
@opts = opts
|
46
46
|
@meta = opts[:meta]
|
47
47
|
@except = Set.new([opts[:except]].flatten.compact)
|
48
|
+
@only = Set.new([opts[:only]].flatten.compact)
|
48
49
|
|
49
50
|
@root_key = (opts[:root] || ActiveSupport::Inflector.underscore(
|
50
51
|
obj.class.name
|
@@ -99,15 +100,20 @@ module USerializer
|
|
99
100
|
private
|
100
101
|
|
101
102
|
def attributes
|
102
|
-
@attributes ||= (self.class.attrs || {}).values.
|
103
|
-
|
103
|
+
@attributes ||= (self.class.attrs || {}).values.select do |attr|
|
104
|
+
allow?(attr.key)
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
107
108
|
def relations
|
108
|
-
@relations ||= (self.class.relations || {}).values.
|
109
|
-
|
109
|
+
@relations ||= (self.class.relations || {}).values.select do |rel|
|
110
|
+
allow?(rel.key)
|
110
111
|
end
|
111
112
|
end
|
113
|
+
|
114
|
+
def allow?(key)
|
115
|
+
return @only.include?(key) if @only.any?
|
116
|
+
!@except.include?(key)
|
117
|
+
end
|
112
118
|
end
|
113
119
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'oj'
|
2
|
+
|
3
|
+
module USerializer
|
4
|
+
class CompositeObject
|
5
|
+
def initialize(obj, opts = {})
|
6
|
+
@obj = obj
|
7
|
+
@opts = opts
|
8
|
+
@root_key = opts[:root].to_sym
|
9
|
+
serializer = opts[:serializer]
|
10
|
+
@serializer = if serializer.is_a?(Proc)
|
11
|
+
serializer
|
12
|
+
elsif serializer
|
13
|
+
proc { serializer }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def merge_root(res, opts)
|
18
|
+
serializer(@obj, opts).merge_root(res, @root_key, true, opts)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def serializer(obj, opts)
|
24
|
+
return @serializer.call(obj, opts).new(obj, @opts) if @serializer
|
25
|
+
return obj.serialize if obj.respond_to?(:serialize)
|
26
|
+
|
27
|
+
USerializer.infered_serializer_class(obj.class).new(obj, @opts)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class CompositeSerializer
|
32
|
+
def initialize(objs, opts = {})
|
33
|
+
@opts = opts
|
34
|
+
@objs = compose_objs(objs)
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge_root(res, opts)
|
38
|
+
@objs.each do |obj|
|
39
|
+
obj.merge_root(res, opts)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_hash
|
44
|
+
res = {}
|
45
|
+
|
46
|
+
merge_root(res, @opts)
|
47
|
+
res
|
48
|
+
end
|
49
|
+
|
50
|
+
def serialize(*_args)
|
51
|
+
to_hash
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json(*_args)
|
55
|
+
Oj.dump(to_hash, mode: :compat)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def compose_objs(objs)
|
61
|
+
objs.map do |(key, obj)|
|
62
|
+
opts = options_for(key)
|
63
|
+
|
64
|
+
if obj.is_a? Enumerable
|
65
|
+
ArraySerializer.new(obj, opts)
|
66
|
+
else
|
67
|
+
CompositeObject.new(obj, opts)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def options_for(key)
|
73
|
+
@opts.reduce({}) do |acc, (opt_key, values)|
|
74
|
+
acc.merge(opt_key.to_sym => values[key.to_sym])
|
75
|
+
end.compact.merge(root: key) { |_, x, y| x || y }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/userializer/has_many.rb
CHANGED
@@ -6,7 +6,7 @@ module USerializer
|
|
6
6
|
@key = key
|
7
7
|
|
8
8
|
@opts = opts
|
9
|
-
@
|
9
|
+
@ids_key = opts[:ids_key] || build_ids_key(key)
|
10
10
|
|
11
11
|
@embed_key = opts[:embed_key] || :id
|
12
12
|
@conditional_block = opts[:if] || proc { true }
|
@@ -15,7 +15,7 @@ module USerializer
|
|
15
15
|
def merge_attributes(res, ser, opts)
|
16
16
|
return unless @conditional_block.call(ser.object, opts)
|
17
17
|
|
18
|
-
res[@
|
18
|
+
res[@ids_key] = (entities(ser) || []).compact.map do |obj|
|
19
19
|
obj.nil? ? nil : obj.send(@embed_key)
|
20
20
|
end.compact
|
21
21
|
end
|
@@ -34,5 +34,11 @@ module USerializer
|
|
34
34
|
|
35
35
|
obj.send(@opts[:scope])
|
36
36
|
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def build_ids_key(key)
|
41
|
+
"#{ActiveSupport::Inflector.singularize(key)}_ids".to_sym
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end
|
data/lib/userializer/has_one.rb
CHANGED
data/lib/userializer/version.rb
CHANGED
data/lib/userializer.rb
CHANGED
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.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexis Montagne
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,7 +87,8 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- ".
|
90
|
+
- ".github/pull_request_template.md"
|
91
|
+
- ".github/workflows/ci.yml"
|
91
92
|
- ".gitignore"
|
92
93
|
- ".rspec"
|
93
94
|
- ".travis.yml"
|
@@ -100,6 +101,7 @@ files:
|
|
100
101
|
- lib/userializer/array_serializer.rb
|
101
102
|
- lib/userializer/attribute.rb
|
102
103
|
- lib/userializer/base_serializer.rb
|
104
|
+
- lib/userializer/composite_serializer.rb
|
103
105
|
- lib/userializer/has_many.rb
|
104
106
|
- lib/userializer/has_one.rb
|
105
107
|
- lib/userializer/version.rb
|
@@ -122,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
124
|
- !ruby/object:Gem::Version
|
123
125
|
version: '0'
|
124
126
|
requirements: []
|
125
|
-
rubygems_version: 3.
|
127
|
+
rubygems_version: 3.1.2
|
126
128
|
signing_key:
|
127
129
|
specification_version: 4
|
128
130
|
summary: Write a short summary, because RubyGems requires one.
|
data/.circleci/config.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
version: 2
|
2
|
-
jobs:
|
3
|
-
run_tests:
|
4
|
-
docker:
|
5
|
-
- image: circleci/ruby:2.7
|
6
|
-
|
7
|
-
working_directory: ~/userializer
|
8
|
-
|
9
|
-
steps:
|
10
|
-
- checkout
|
11
|
-
- run: bundle install --path=vendor/bundle
|
12
|
-
- run: bundle exec rspec --color --require spec_helper --format progress spec
|
13
|
-
|
14
|
-
workflows:
|
15
|
-
version: 2
|
16
|
-
test:
|
17
|
-
jobs:
|
18
|
-
- run_tests
|