barley 0.4.0 → 0.5
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 +4 -4
- data/README.md +50 -12
- data/Rakefile +9 -0
- data/lib/barley/error.rb +6 -0
- data/lib/barley/serializable.rb +26 -9
- data/lib/barley/serializer.rb +34 -26
- data/lib/barley/version.rb +1 -1
- metadata +12 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4808cb10061c5a86be6edbf532a6fb041519e4b7b4a08b770e0d63854a5f61e1
|
|
4
|
+
data.tar.gz: 5ccb1ed50e9d440a0bb3e9c006280e970b70b5ecc64afb7b8660c0d326f58239
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4562ae18d898be75d1abf2d2872bd5f79333f38e6a3e111548624ba6e4b19f4f7316087e36ff35f9103cac56a6b96e9d2f1fb32d1cfb1596430e1b81a1f68c2a
|
|
7
|
+
data.tar.gz: 13c86fbcb1d2678165bd128ea0e57ca80e1e4d63e3a3ccee09f9ac85838bab7cd0894d75cc832c7a513ac29fd697573039b8ee5a1621be1152e2a22c6525b5ce
|
data/README.md
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
|
+
[](https://badge.fury.io/rb/barley)
|
|
5
|
+

|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
Barley is a dead simple, fast, and efficient ActiveModel serializer.
|
|
8
|
+
|
|
9
|
+
Cerealize your ActiveModel objects into flat hashes with a dead simple, yet versatile DSL, and caching and type-checking baked in. Our daily bread is to make your API faster.
|
|
6
10
|
|
|
7
11
|
You don't believe us? Check out the [benchmarks](#benchmarks). 😎
|
|
8
12
|
|
|
@@ -24,24 +28,30 @@ Then define your attributes and associations in a serializer class.
|
|
|
24
28
|
```ruby
|
|
25
29
|
# /app/serializers/user_serializer.rb
|
|
26
30
|
class UserSerializer < Barley::Serializer
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
many :
|
|
34
|
-
|
|
31
|
+
|
|
32
|
+
attributes id: Types::Strict::Integer, :name
|
|
33
|
+
|
|
34
|
+
attribute :email
|
|
35
|
+
attribute :value, type: Types::Coercible::Integer
|
|
36
|
+
|
|
37
|
+
many :posts
|
|
38
|
+
|
|
39
|
+
one :group, serializer: CustomGroupSerializer
|
|
40
|
+
|
|
41
|
+
many :related_users, key: :friends, cache: true
|
|
42
|
+
|
|
43
|
+
one :profile, cache: { expires_in: 1.day } do
|
|
35
44
|
attributes :avatar, :social_url
|
|
45
|
+
|
|
36
46
|
attribute :badges do
|
|
37
|
-
object.badges.map(&:display_name)
|
|
47
|
+
object.badges.map(&:display_name)
|
|
38
48
|
end
|
|
39
49
|
end
|
|
40
50
|
|
|
41
51
|
end
|
|
42
52
|
```
|
|
43
53
|
|
|
44
|
-
|
|
54
|
+
Then just use the `as_json` method on your model.
|
|
45
55
|
|
|
46
56
|
```ruby
|
|
47
57
|
user = User.find(1)
|
|
@@ -190,6 +200,25 @@ Feel like using a block to define your associations? You can do that too.
|
|
|
190
200
|
end
|
|
191
201
|
```
|
|
192
202
|
|
|
203
|
+
## Context
|
|
204
|
+
You can pass a context to the serializer with the `with_context` method.
|
|
205
|
+
|
|
206
|
+
```ruby
|
|
207
|
+
serializer = PostSerializer.new(Post.last).with_context(current_user: current_user)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
This context will be available in the serializer with the `context` method.
|
|
211
|
+
|
|
212
|
+
```ruby
|
|
213
|
+
class PostSerializer < Barley::Serializer
|
|
214
|
+
attributes :id, :title, :body
|
|
215
|
+
|
|
216
|
+
attribute :is_owner do
|
|
217
|
+
object.user == context.current_user
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
```
|
|
221
|
+
|
|
193
222
|
## Generators
|
|
194
223
|
You have two generators available. One to generate the serializer class:
|
|
195
224
|
|
|
@@ -386,6 +415,15 @@ ams : 1299674 allocated - 28.20x more
|
|
|
386
415
|
## License
|
|
387
416
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
388
417
|
|
|
418
|
+
## Contributing
|
|
419
|
+
You can contribute in several ways: reporting bugs, suggesting features, or contributing code. See [our contributing guidelines](CONTRIBUTING.md)
|
|
420
|
+
|
|
421
|
+
Make sure you adhere to [our code of conduct](CODE_OF_CONDUCT.md). We aim to keep this project open and inclusive.
|
|
422
|
+
|
|
423
|
+
## Security
|
|
424
|
+
|
|
425
|
+
Please refer to our [security guidelines](SECURITY.md)
|
|
426
|
+
|
|
389
427
|
## Credits
|
|
390
428
|
Barley is brought to you by the developer team from [StockPro](https://www.stock-pro.fr/).
|
|
391
429
|
|
data/Rakefile
CHANGED
data/lib/barley/error.rb
ADDED
data/lib/barley/serializable.rb
CHANGED
|
@@ -30,28 +30,45 @@ module Barley
|
|
|
30
30
|
# @param klass [Class] the serializer class
|
|
31
31
|
# @param cache [Boolean, Hash<Symbol, ActiveSupport::Duration>] whether to cache the result, or a hash with options for the cache
|
|
32
32
|
def serializer(klass, cache: false)
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
# We need to silence the warnings because we are defining a method with the same name as the parameter
|
|
34
|
+
# This avoids :
|
|
35
|
+
# - warning: method redefined; discarding old serializer
|
|
36
|
+
# - warning: previous definition of serializer was here
|
|
37
|
+
Kernel.silence_warnings do
|
|
38
|
+
define_method(:serializer) do
|
|
39
|
+
klass.new(self, cache: cache)
|
|
40
|
+
end
|
|
35
41
|
end
|
|
36
42
|
end
|
|
37
43
|
end
|
|
38
44
|
|
|
39
45
|
included do
|
|
40
|
-
|
|
46
|
+
begin
|
|
47
|
+
serializer "#{self}Serializer".constantize
|
|
48
|
+
rescue NameError
|
|
49
|
+
raise Barley::Error, "Could not find serializer for #{self}. Please define a #{self}Serializer class."
|
|
50
|
+
end
|
|
41
51
|
|
|
42
52
|
# Serializes the model
|
|
43
53
|
#
|
|
44
54
|
# @note this method does not provide default rails options like `only` or `except`.
|
|
45
55
|
# This is because the Barley serializer should be the only place where the attributes are defined.
|
|
46
56
|
#
|
|
47
|
-
# @
|
|
48
|
-
# @
|
|
49
|
-
# @
|
|
57
|
+
# @option options [Class] :serializer the serializer to use
|
|
58
|
+
# @option options [Boolean, Hash<Symbol, ActiveSupport::Duration>] :cache whether to cache the result, or a hash with options for the cache
|
|
59
|
+
# @option options [Boolean] :root whether to include the root key
|
|
50
60
|
#
|
|
51
61
|
# @return [Hash] the serialized attributes
|
|
52
|
-
def as_json(
|
|
53
|
-
|
|
54
|
-
serializer
|
|
62
|
+
def as_json(options = nil)
|
|
63
|
+
options ||= {}
|
|
64
|
+
serializer = options[:serializer] || self.serializer.class
|
|
65
|
+
cache = options[:cache] || false
|
|
66
|
+
root = options[:root] || false
|
|
67
|
+
begin
|
|
68
|
+
serializer.new(self, cache: cache, root: root).serializable_hash
|
|
69
|
+
rescue NameError
|
|
70
|
+
raise Barley::Error, "Could not find serializer for #{self}. Please define a #{serializer} class."
|
|
71
|
+
end
|
|
55
72
|
end
|
|
56
73
|
end
|
|
57
74
|
end
|
data/lib/barley/serializer.rb
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
module Barley
|
|
4
4
|
class Serializer
|
|
5
5
|
attr_accessor :object
|
|
6
|
+
attr_accessor :context
|
|
6
7
|
|
|
7
8
|
class << self
|
|
9
|
+
attr_accessor :defined_attributes
|
|
10
|
+
|
|
8
11
|
# Defines attributes for the serializer
|
|
9
12
|
#
|
|
10
13
|
# Accepts either a list of symbols or a hash of symbols and Dry::Types, or a mix of both
|
|
@@ -72,16 +75,12 @@ module Barley
|
|
|
72
75
|
# @param block [Proc] a block to use to compute the value
|
|
73
76
|
def attribute(key, key_name: nil, type: nil, &block)
|
|
74
77
|
key_name ||= key
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
end
|
|
79
|
-
else
|
|
80
|
-
define_method(key_name) do
|
|
81
|
-
type.nil? ? object.send(key) : type[object.send(key)]
|
|
82
|
-
end
|
|
78
|
+
define_method(key_name) do
|
|
79
|
+
value = block ? instance_eval(&block) : object.send(key)
|
|
80
|
+
type.nil? ? value : type[value]
|
|
83
81
|
end
|
|
84
|
-
|
|
82
|
+
|
|
83
|
+
self.defined_attributes = (defined_attributes || []) << key_name
|
|
85
84
|
end
|
|
86
85
|
|
|
87
86
|
# Defines a single association for the serializer
|
|
@@ -131,7 +130,7 @@ module Barley
|
|
|
131
130
|
el_serializer = serializer || element.serializer.class
|
|
132
131
|
el_serializer.new(element, cache: cache).serializable_hash
|
|
133
132
|
end
|
|
134
|
-
|
|
133
|
+
self.defined_attributes = (defined_attributes || []) << key_name
|
|
135
134
|
end
|
|
136
135
|
|
|
137
136
|
# Defines a collection association for the serializer
|
|
@@ -181,17 +180,7 @@ module Barley
|
|
|
181
180
|
el_serializer = serializer || elements.first.serializer.class
|
|
182
181
|
elements.map { |element| el_serializer.new(element, cache: cache).serializable_hash }.reject(&:blank?)
|
|
183
182
|
end
|
|
184
|
-
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# Either sets or appends a key to an instance variable
|
|
188
|
-
#
|
|
189
|
-
# @api private
|
|
190
|
-
#
|
|
191
|
-
# @param iv [Symbol] the instance variable to set
|
|
192
|
-
# @param key [Symbol] the key to add to the instance variable
|
|
193
|
-
def set_class_iv(iv, key)
|
|
194
|
-
instance_variable_defined?(iv) ? instance_variable_get(iv) << key : instance_variable_set(iv, [key])
|
|
183
|
+
self.defined_attributes = (defined_attributes || []) << key_name
|
|
195
184
|
end
|
|
196
185
|
end
|
|
197
186
|
|
|
@@ -236,6 +225,25 @@ module Barley
|
|
|
236
225
|
Barley::Cache.delete(key)
|
|
237
226
|
end
|
|
238
227
|
|
|
228
|
+
# Sets the context object for the serializer
|
|
229
|
+
#
|
|
230
|
+
# The context object is a Struct built from the given arguments.
|
|
231
|
+
# It can be used to pass additional data to the serializer. The context object is accessible in the serializer with the `context` attribute.
|
|
232
|
+
# @example
|
|
233
|
+
# serializer.with_context(current_user: current_user, locale: I18n.locale)
|
|
234
|
+
# # => #<Barley::Serializer:0x00007f8f3b8b3e08 @object=#<Product id: 1, name: "Product 1">, @context=#<struct current_user=1, locale=:en>>
|
|
235
|
+
# # In the serializer:
|
|
236
|
+
# attribute :name do
|
|
237
|
+
# "#{object.name[context.locale]}" # Will use the locale from the context
|
|
238
|
+
# end
|
|
239
|
+
# @param args [Hash] the context object attributes
|
|
240
|
+
# @return [Barley::Serializer] the serializer
|
|
241
|
+
def with_context(**args)
|
|
242
|
+
@context = Struct.new(*args.keys).new(*args.values)
|
|
243
|
+
|
|
244
|
+
self
|
|
245
|
+
end
|
|
246
|
+
|
|
239
247
|
private
|
|
240
248
|
|
|
241
249
|
# @api private
|
|
@@ -253,21 +261,21 @@ module Barley
|
|
|
253
261
|
#
|
|
254
262
|
# @return [Array<Symbol>] the defined attributes
|
|
255
263
|
def defined_attributes
|
|
256
|
-
self.class.
|
|
264
|
+
self.class.defined_attributes
|
|
257
265
|
end
|
|
258
266
|
|
|
259
267
|
# Serializes the object
|
|
260
268
|
#
|
|
261
269
|
# @api private
|
|
270
|
+
# @raise [Barley::Error] if no attribute or relation is defined in the serializer
|
|
262
271
|
#
|
|
263
272
|
# @return [Hash] the serializable hash
|
|
264
273
|
def _serializable_hash
|
|
265
|
-
|
|
274
|
+
raise Barley::Error, "No attribute or relation defined in #{self.class}" if defined_attributes.blank?
|
|
266
275
|
|
|
267
|
-
defined_attributes.
|
|
268
|
-
|
|
276
|
+
hash = defined_attributes.each_with_object({}) do |key, result|
|
|
277
|
+
result[key] = send(key)
|
|
269
278
|
end
|
|
270
|
-
|
|
271
279
|
@root ? {root_key => hash} : hash
|
|
272
280
|
end
|
|
273
281
|
|
data/lib/barley/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: barley
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: '0.5'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cedric Delalande
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2024-04-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -38,8 +38,9 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: 1.7.1
|
|
41
|
-
description: Cerealize your ActiveModel objects into flat
|
|
42
|
-
|
|
41
|
+
description: Cerealize your ActiveModel objects into flat hashes with a dead simple,
|
|
42
|
+
yet versatile DSL, and caching and type-checking baked in. Our daily bread is to
|
|
43
|
+
make your API faster.
|
|
43
44
|
email:
|
|
44
45
|
- weengs@moskitohero.com
|
|
45
46
|
executables: []
|
|
@@ -52,6 +53,7 @@ files:
|
|
|
52
53
|
- lib/barley.rb
|
|
53
54
|
- lib/barley/cache.rb
|
|
54
55
|
- lib/barley/configuration.rb
|
|
56
|
+
- lib/barley/error.rb
|
|
55
57
|
- lib/barley/railtie.rb
|
|
56
58
|
- lib/barley/serializable.rb
|
|
57
59
|
- lib/barley/serializer.rb
|
|
@@ -74,7 +76,8 @@ metadata:
|
|
|
74
76
|
homepage_uri: https://github.com/moskitohero/barley
|
|
75
77
|
source_code_uri: https://github.com/moskitohero/barley
|
|
76
78
|
changelog_uri: https://github.com/moskitohero/barley/CHANGELOG.md
|
|
77
|
-
|
|
79
|
+
documentation_uri: https://rubydoc.info/github/MoskitoHero/barley/main
|
|
80
|
+
post_install_message:
|
|
78
81
|
rdoc_options: []
|
|
79
82
|
require_paths:
|
|
80
83
|
- lib
|
|
@@ -89,8 +92,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
89
92
|
- !ruby/object:Gem::Version
|
|
90
93
|
version: '0'
|
|
91
94
|
requirements: []
|
|
92
|
-
rubygems_version: 3.
|
|
93
|
-
signing_key:
|
|
95
|
+
rubygems_version: 3.3.26
|
|
96
|
+
signing_key:
|
|
94
97
|
specification_version: 4
|
|
95
|
-
summary: Barley is a dead simple, fast, and efficient ActiveModel
|
|
98
|
+
summary: Barley is a dead simple, fast, and efficient ActiveModel serializer.
|
|
96
99
|
test_files: []
|