bright_serializer 0.2.5 → 0.3.1

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: ae3444c6b0be4fc77c338286c25e97acc5501aeac9af722a53bf1182dad6034c
4
- data.tar.gz: 75461556470937cd50f91326e591c73aea3a089cbfe3961200a8420d6682c019
3
+ metadata.gz: 193184e7a6c008dc18745e187bbf375a9c42a6568d0730ed39dcea3c04888115
4
+ data.tar.gz: e574c34963493d24af6039f534f4074e398d0515f30d6d4ae716c0e8ffbbad33
5
5
  SHA512:
6
- metadata.gz: 17d5c832abe849c799e4c5240bdfda4ed8e292f0284a3004908d0e812a0bb90268f85be8f1e416c83b596446aec0bcef38d02d1e26e607fe6da902dfc6daa69f
7
- data.tar.gz: 7e78a38854d53707fd8f6cd4eb3df7368f045fc20f086df1fd592c07cf723b69de458c2bfc2890457d245633f716bbc1e8d379cb0318f8486809fc42ff37fd72
6
+ metadata.gz: 4271988147d4f68f39a1846d7cbcbdba6cbc445e2ee28c58160f8a124658cd6cebd4bebf5e0c5e4f56c811229ccb295c44e914ddeaba4c0289fe232c12cf0b59
7
+ data.tar.gz: ee98dfaf4e70a123bfe5ea46dc0817e0beaefb93238f21ed856da0eb5e722a864c9bc42256611ec81bdd6722d3f751afb9e1b8d1a42b8219c7a77c3fbabe1180
data/CHANGELOG.md CHANGED
@@ -2,7 +2,17 @@
2
2
 
3
3
  ## master (unreleased)
4
4
 
5
- * Your contribution
5
+ ## 0.3.1 (2022-09-28)
6
+
7
+ * Performance improvements, use nil instead of empty set. ([#97](https://github.com/petalmd/bright_serializer/pull/97))
8
+ * Move specs out of lib. ([#96](https://github.com/petalmd/bright_serializer/pull/96))
9
+
10
+ ## 0.3.0 (2022-05-26)
11
+
12
+ * Allow to evaluate entity values with a callable lambda. ([#88](https://github.com/petalmd/bright_serializer/pull/88))
13
+ * Fix `FrozenError (can't modify frozen Array)` when parsing entity. ([#83](https://github.com/petalmd/bright_serializer/pull/83))
14
+ * Added the support to use instance methods from a serializer class in the library ([#85](https://github.com/petalmd/bright_serializer/pull/85))
15
+ * Use real coveralls_reborn gem
6
16
 
7
17
  ## 0.2.5 (2021-03-08)
8
18
 
@@ -33,7 +43,7 @@
33
43
  * Define entity in serializer for grape_swagger ([#9](https://github.com/petalmd/bright_serializer/pull/9))
34
44
 
35
45
  ## 0.1.1 (2020-07-13)
36
-
46
+
37
47
  * Add description in gemspec file
38
48
  * Add content in CHANGELOG.md
39
49
 
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ gemspec
10
10
  gem 'oj', require: false
11
11
 
12
12
  group :test do
13
+ gem 'coveralls_reborn', require: false
13
14
  gem 'faker'
14
15
  gem 'rubocop'
15
16
  gem 'rubocop-performance'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bright_serializer (0.2.5)
4
+ bright_serializer (0.3.1)
5
5
  oj (~> 3)
6
6
 
7
7
  GEM
@@ -9,7 +9,13 @@ GEM
9
9
  specs:
10
10
  ast (2.4.1)
11
11
  concurrent-ruby (1.1.7)
12
+ coveralls_reborn (0.22.0)
13
+ simplecov (>= 0.18.1, < 0.22.0)
14
+ term-ansicolor (~> 1.6)
15
+ thor (>= 0.20.3, < 2.0)
16
+ tins (~> 1.16)
12
17
  diff-lcs (1.4.4)
18
+ docile (1.4.0)
13
19
  faker (2.15.1)
14
20
  i18n (>= 1.6, < 2)
15
21
  i18n (1.8.5)
@@ -53,6 +59,18 @@ GEM
53
59
  rubocop (~> 0.87)
54
60
  rubocop-ast (>= 0.7.1)
55
61
  ruby-progressbar (1.11.0)
62
+ simplecov (0.21.2)
63
+ docile (~> 1.1)
64
+ simplecov-html (~> 0.11)
65
+ simplecov_json_formatter (~> 0.1)
66
+ simplecov-html (0.12.3)
67
+ simplecov_json_formatter (0.1.3)
68
+ sync (0.5.0)
69
+ term-ansicolor (1.7.1)
70
+ tins (~> 1.0)
71
+ thor (1.1.0)
72
+ tins (1.29.1)
73
+ sync
56
74
  unicode-display_width (1.7.0)
57
75
 
58
76
  PLATFORMS
@@ -61,6 +79,7 @@ PLATFORMS
61
79
  DEPENDENCIES
62
80
  bright_serializer!
63
81
  bundler (~> 2)
82
+ coveralls_reborn
64
83
  faker
65
84
  oj
66
85
  rake (~> 13.0)
@@ -70,4 +89,4 @@ DEPENDENCIES
70
89
  rubocop-rspec
71
90
 
72
91
  BUNDLED WITH
73
- 2.1.4
92
+ 2.2.3
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  [![Actions Status](https://github.com/petalmd/bright_serializer/workflows/Build/badge.svg)](https://github.com/petalmd/bright_serializer/actions?query=workflow%3ABuild)
2
2
  [![Gem Version](https://badge.fury.io/rb/bright_serializer.svg)](https://badge.fury.io/rb/bright_serializer)
3
+ [![Coverage Status](https://coveralls.io/repos/github/petalmd/bright_serializer/badge.svg?branch=master)](https://coveralls.io/github/petalmd/bright_serializer?branch=master)
3
4
 
4
5
  # BrightSerializer
5
6
 
@@ -31,12 +32,12 @@ Create a class and include `BrightSerializer::Serializer`
31
32
  class AccountSerializer
32
33
  include BrightSerializer::Serializer
33
34
  attributes :id, :first_name, :last_name
34
-
35
+
35
36
  # With a block
36
37
  attribute :name do |object|
37
38
  "#{object.first_name} #{object.last_name}"
38
39
  end
39
-
40
+
40
41
  # With a block shorter
41
42
  attribute :created_at, &:to_s
42
43
  end
@@ -53,7 +54,7 @@ You can pass params to your serializer. For example to have more context with th
53
54
  class AccountSerializer
54
55
  include BrightSerializer::Serializer
55
56
  attributes :id, :first_name, :last_name
56
-
57
+
57
58
  attribute :friend do |object, params|
58
59
  object.is_friend_with? params[:current_user]
59
60
  end
@@ -65,14 +66,14 @@ AccountSerializer.new(Account.first, params: { current_user: current_user }).to_
65
66
 
66
67
  ### Conditional Attributes
67
68
 
68
- Attribute can be remove from serialization by passing a `proc` to the option `if`. If the proc return `true` the attibute
69
- will be serialize. `object` and `params` or accessible.
69
+ Attribute can be remove from serialization by passing a `proc` to the option `if`. If the proc return `true` the attibute
70
+ will be serialize. `object` and `params` or accessible.
70
71
 
71
72
  ```ruby
72
73
  class AccountSerializer
73
74
  include BrightSerializer::Serializer
74
75
  attributes :id, :first_name, :last_name
75
-
76
+
76
77
  attribute :email, if: -> { |object, params| params[:current_user].is_admin? }
77
78
  end
78
79
  ```
@@ -118,7 +119,7 @@ end
118
119
  class AccountSerializer
119
120
  include BrightSerializer::Serializer
120
121
  attributes :id, :first_name, :last_name
121
-
122
+
122
123
  attribute :friends do |object|
123
124
  FriendSerializer.new(object.friends)
124
125
  end
@@ -128,7 +129,7 @@ end
128
129
  ### Entity
129
130
 
130
131
  You can define the entity of your serializer to generate documentation with the option `entity`.
131
- The feature was build to work with [grape-swagger](https://github.com/ruby-grape/grape-swagger).
132
+ The feature was build to work with [grape-swagger](https://github.com/ruby-grape/grape-swagger).
132
133
  For more information about defining a model entity see the [Swagger documentation](https://swagger.io/specification/v2/?sbsearch=array%20response#schema-object).
133
134
 
134
135
  ```ruby
@@ -138,12 +139,37 @@ class AccountSerializer
138
139
  attribute :name
139
140
 
140
141
  attribute :friends,
141
- entity: {
142
+ entity: {
142
143
  type: :array, items: { ref: 'FriendSerializer' }, description: 'The list the account friends.'
143
144
  } do |object|
144
145
  FriendSerializer.new(object.friends)
145
146
  end
146
147
  end
148
+
149
+ ```
150
+ Callable values are supported.
151
+
152
+ ```ruby
153
+ { entity: { type: :string, enum: -> { SomeModel::ENUMVALUES } } }
154
+ ```
155
+
156
+ ### Instance
157
+
158
+ If you have defined instance methods inside your serializer you can access them inside block attribute.
159
+
160
+ ```ruby
161
+ class AccountSerializer
162
+ include BrightSerializer::Serializer
163
+ attributes :id, :name
164
+
165
+ attribute :print do |object|
166
+ print_account(object)
167
+ end
168
+
169
+ def print_account(object)
170
+ "Account: #{object.name}"
171
+ end
172
+ end
147
173
  ```
148
174
 
149
175
  ## Development
@@ -14,12 +14,16 @@ module BrightSerializer
14
14
  @entity = entity ? Entity::Base.new(entity) : nil
15
15
  end
16
16
 
17
- def serialize(object, params)
17
+ def serialize(serializer_instance, object, params)
18
18
  return unless object
19
19
 
20
20
  value =
21
21
  if @block
22
- @block.arity.abs == 1 ? object.instance_eval(&@block) : object.instance_exec(object, params, &@block)
22
+ if @block.arity.abs == 1
23
+ serializer_instance.instance_exec(object, &@block)
24
+ else
25
+ serializer_instance.instance_exec(object, params, &@block)
26
+ end
23
27
  elsif object.is_a?(Hash)
24
28
  object.key?(key) ? object[key] : object[key.to_s]
25
29
  else
@@ -14,8 +14,9 @@ module BrightSerializer
14
14
  end
15
15
 
16
16
  def to_h
17
- Inflector.deep_transform_keys_in_object!(@definition) { |k| Inflector.camel_lower k.to_s }
17
+ @definition = Inflector.deep_transform_keys_in_object(@definition) { |k| Inflector.camel_lower k.to_s }
18
18
  parse_ref!
19
+ evaluate_callable!
19
20
  @definition
20
21
  end
21
22
 
@@ -28,6 +29,12 @@ module BrightSerializer
28
29
  object['$ref'] = relation
29
30
  end
30
31
 
32
+ def evaluate_callable!
33
+ @definition = Inflector.deep_transform_values_in_object(@definition) do |value|
34
+ value.respond_to?(:call) ? value.call : value
35
+ end
36
+ end
37
+
31
38
  def nested_hash(obj, key)
32
39
  if obj.respond_to?(:key?) && obj.key?(key)
33
40
  obj
@@ -60,20 +60,30 @@ class Inflector
60
60
  end
61
61
  end
62
62
 
63
- # File active_support/core_ext/hash/keys.rb, line 156
64
- def deep_transform_keys_in_object!(object, &block)
63
+ # File active_support/core_ext/hash/keys.rb, line 116
64
+ def deep_transform_keys_in_object(object, &block)
65
65
  case object
66
66
  when Hash
67
- object.keys.each do |key| # rubocop:disable Style/HashEachMethods
68
- value = object.delete(key)
69
- object[yield(key)] = deep_transform_keys_in_object!(value, &block)
67
+ object.each_with_object({}) do |(key, value), result|
68
+ result[yield(key)] = deep_transform_keys_in_object(value, &block)
70
69
  end
71
- object
72
70
  when Array
73
- object.map! { |e| deep_transform_keys_in_object!(e, &block) }
71
+ object.map { |e| deep_transform_keys_in_object(e, &block) }
74
72
  else
75
73
  object
76
74
  end
77
75
  end
76
+
77
+ # File active_support/core_ext/hash/deep_transform_values.rb, line 25
78
+ def deep_transform_values_in_object(object, &block)
79
+ case object
80
+ when Hash
81
+ object.transform_values { |value| deep_transform_values_in_object(value, &block) }
82
+ when Array
83
+ object.map { |e| deep_transform_values_in_object(e, &block) }
84
+ else
85
+ yield(object)
86
+ end
87
+ end
78
88
  end
79
89
  end
@@ -20,15 +20,17 @@ module BrightSerializer
20
20
  def initialize(object, **options)
21
21
  @object = object
22
22
  @params = options.delete(:params)
23
- @fields = Set.new(options.delete(:fields))
23
+
24
+ fields = options.delete(:fields)
25
+ @fields = fields ? Set.new(fields) : nil
24
26
  end
25
27
 
26
28
  def serialize(object)
27
29
  self.class.attributes_to_serialize.each_with_object({}) do |attribute, result|
28
- next if @fields.any? && !@fields.include?(attribute.key)
30
+ next if !@fields.nil? && !@fields.include?(attribute.key)
29
31
  next unless attribute.condition?(object, @params)
30
32
 
31
- result[attribute.transformed_key] = attribute.serialize(object, @params)
33
+ result[attribute.transformed_key] = attribute.serialize(self, object, @params)
32
34
  end
33
35
  end
34
36
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BrightSerializer
4
- VERSION = '0.2.5'
4
+ VERSION = '0.3.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bright_serializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Francis Bastien
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-08 00:00:00.000000000 Z
11
+ date: 2022-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -127,7 +127,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  requirements: []
130
- rubygems_version: 3.1.2
130
+ rubygems_version: 3.0.3
131
131
  signing_key:
132
132
  specification_version: 4
133
133
  summary: Light and fast Ruby serializer