rabl-rails 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +17 -0
- data/lib/rabl-rails/compiler.rb +16 -1
- data/lib/rabl-rails/nodes.rb +1 -0
- data/lib/rabl-rails/nodes/fetch.rb +12 -0
- data/lib/rabl-rails/version.rb +1 -1
- data/lib/rabl-rails/visitors/to_hash.rb +12 -0
- data/test/test_compiler.rb +23 -2
- data/test/test_hash_visitor.rb +11 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac2d0bc8954f6b27e54002015d71ed0d00f4264c8c1d57411dc789216c627e44
|
4
|
+
data.tar.gz: 98757a9fe142bafb324782725e56e85e3ba83d5a018e76a75cda00c37c73ebf4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d55bc5c73b2add30025cfb41a1735548a236928ca0372c4cbc2aeec731cfbb1db60376c9498570b0ea0a40e9e4c6f79caf32cc474698ad48163845fed5da5d3a
|
7
|
+
data.tar.gz: 4bb4b91c9f4045f94dca99ec126e8fb64389736f675af3ec85466f6c92b75844e1ddc30a8b61633ddce8531ed68d2a7e3b0abf0072a61b48c803f847c6084d28
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -196,6 +196,23 @@ end
|
|
196
196
|
# => { "custom_data": [...] }
|
197
197
|
```
|
198
198
|
|
199
|
+
You can use a Hash-like data source, as long as keys match a method or attribute of your main resource, using the `fetch` keyword:
|
200
|
+
|
201
|
+
```ruby
|
202
|
+
# assuming you have something similar in your controller
|
203
|
+
# @users_hash = { 1 => User.new(pseudo: 'Batman') }
|
204
|
+
|
205
|
+
# in the view
|
206
|
+
object :@post
|
207
|
+
|
208
|
+
fetch(:@users_hash, as: :user, field: :user_id) do
|
209
|
+
attributes :pseudo
|
210
|
+
end
|
211
|
+
# => { user: { pseudo: 'Batman' } }
|
212
|
+
```
|
213
|
+
|
214
|
+
This comes very handy when adding attributes from external queries not really bound to a relation, like statistics.
|
215
|
+
|
199
216
|
### Constants
|
200
217
|
|
201
218
|
Adds a new field to the response using an immutable value.
|
data/lib/rabl-rails/compiler.rb
CHANGED
@@ -85,6 +85,21 @@ module RablRails
|
|
85
85
|
@template.add_node Nodes::Glue.new(template)
|
86
86
|
end
|
87
87
|
|
88
|
+
#
|
89
|
+
# Creates a node to be added to the output by fetching an object using
|
90
|
+
# current resource's field as key to the data, and appliying given
|
91
|
+
# template to said object
|
92
|
+
# Example:
|
93
|
+
# fetch(:@stats, field: :id) { attributes :total }
|
94
|
+
#
|
95
|
+
def fetch(name_or_data, options = {})
|
96
|
+
data, name = extract_data_and_name(name_or_data)
|
97
|
+
name = options[:as] if options.key?(:as)
|
98
|
+
field = options.fetch(:field, :id)
|
99
|
+
template = partial_or_block(data, options) { yield }
|
100
|
+
@template.add_node Nodes::Fetch.new(name, template, field)
|
101
|
+
end
|
102
|
+
|
88
103
|
#
|
89
104
|
# Creates an arbitrary node in the json output.
|
90
105
|
# It accepts :if option to create conditionnal nodes. The current data will
|
@@ -171,7 +186,7 @@ module RablRails
|
|
171
186
|
protected
|
172
187
|
|
173
188
|
def partial_or_block(data, options)
|
174
|
-
if options
|
189
|
+
if options&.key?(:partial)
|
175
190
|
template = Library.instance.compile_template_from_path(options[:partial], @view)
|
176
191
|
template.data = data
|
177
192
|
template
|
data/lib/rabl-rails/nodes.rb
CHANGED
data/lib/rabl-rails/version.rb
CHANGED
@@ -39,6 +39,18 @@ module Visitors
|
|
39
39
|
@_result.merge!(sub_visit(object, n.nodes)) if object
|
40
40
|
end
|
41
41
|
|
42
|
+
def visit_Fetch n
|
43
|
+
hash = object_from_data(_resource, n)
|
44
|
+
key = _resource.public_send(n.field)
|
45
|
+
object = hash[key]
|
46
|
+
|
47
|
+
@_result[n.name] = if object
|
48
|
+
collection?(object) ? object.map { |o| sub_visit(o, n.nodes) } : sub_visit(object, n.nodes)
|
49
|
+
else
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
42
54
|
def visit_Code n
|
43
55
|
if !n.condition || instance_exec(_resource, &(n.condition))
|
44
56
|
result = instance_exec _resource, &(n.block)
|
data/test/test_compiler.rb
CHANGED
@@ -180,8 +180,6 @@ class TestCompiler < Minitest::Test
|
|
180
180
|
end
|
181
181
|
|
182
182
|
it "compiles child with inline partial notation" do
|
183
|
-
|
184
|
-
|
185
183
|
t = @compiler.compile_source(%{child(:user, :partial => 'user') })
|
186
184
|
child_node = t.nodes.first
|
187
185
|
|
@@ -232,6 +230,29 @@ class TestCompiler < Minitest::Test
|
|
232
230
|
assert_equal([{ :id => :id }], extract_attributes(glue_node.nodes))
|
233
231
|
end
|
234
232
|
|
233
|
+
it "compiles fetch with record association" do
|
234
|
+
t = @compiler.compile_source(%{ fetch :address do attributes :foo end})
|
235
|
+
|
236
|
+
assert_equal(1, t.nodes.size)
|
237
|
+
fetch_node = t.nodes.first
|
238
|
+
|
239
|
+
assert_equal(:address, fetch_node.name)
|
240
|
+
assert_equal(:address, fetch_node.data)
|
241
|
+
assert_equal(:id, fetch_node.field)
|
242
|
+
assert_equal([{ foo: :foo }], extract_attributes(fetch_node.nodes))
|
243
|
+
end
|
244
|
+
|
245
|
+
it "compiles fetch with options" do
|
246
|
+
t = @compiler.compile_source(%{
|
247
|
+
fetch(:user, as: :author, field: :uid) do attributes :foo end
|
248
|
+
})
|
249
|
+
|
250
|
+
fetch_node = t.nodes.first
|
251
|
+
assert_equal(:author, fetch_node.name)
|
252
|
+
assert_equal(:user, fetch_node.data)
|
253
|
+
assert_equal(:uid, fetch_node.field)
|
254
|
+
end
|
255
|
+
|
235
256
|
it "compiles constant node" do
|
236
257
|
t = @compiler.compile_source(%{
|
237
258
|
const(:locale, 'fr_FR')
|
data/test/test_hash_visitor.rb
CHANGED
@@ -105,6 +105,17 @@ class TestHashVisitor < Minitest::Test
|
|
105
105
|
assert_equal({ name: 'Marty'}, visitor_result)
|
106
106
|
end
|
107
107
|
|
108
|
+
it 'renders fetch node' do
|
109
|
+
template = RablRails::CompiledTemplate.new
|
110
|
+
template.add_node(RablRails::Nodes::Attribute.new(name: :name))
|
111
|
+
template.data = :@users_hash
|
112
|
+
|
113
|
+
@nodes << RablRails::Nodes::Fetch.new(:user, template, :id)
|
114
|
+
@context.assigns['users_hash'] = { @resource.id => @resource }
|
115
|
+
|
116
|
+
assert_equal({ user: { name: 'Marty' } }, visitor_result)
|
117
|
+
end
|
118
|
+
|
108
119
|
describe 'with a code node' do
|
109
120
|
before do
|
110
121
|
@proc = ->(object) { object.name }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabl-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Cocchi-Perrier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -114,6 +114,7 @@ files:
|
|
114
114
|
- lib/rabl-rails/nodes/condition.rb
|
115
115
|
- lib/rabl-rails/nodes/const.rb
|
116
116
|
- lib/rabl-rails/nodes/extend.rb
|
117
|
+
- lib/rabl-rails/nodes/fetch.rb
|
117
118
|
- lib/rabl-rails/nodes/glue.rb
|
118
119
|
- lib/rabl-rails/nodes/lookup.rb
|
119
120
|
- lib/rabl-rails/nodes/polymorphic.rb
|
@@ -158,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
159
|
- !ruby/object:Gem::Version
|
159
160
|
version: '0'
|
160
161
|
requirements: []
|
161
|
-
rubygems_version: 3.
|
162
|
+
rubygems_version: 3.0.3
|
162
163
|
signing_key:
|
163
164
|
specification_version: 4
|
164
165
|
summary: Fast Rails 4+ templating system with JSON, XML and PList support
|