inertia_builder 0.1.1 → 0.2.0
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/lib/inertia_builder/version.rb +1 -1
- data/lib/inertia_builder.rb +52 -2
- data/test/inertia_builder_test.rb +93 -8
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d326ccb567aaf8b60dd19a3ec57358008e620e575e725e0827cf9378e64bf8e7
|
4
|
+
data.tar.gz: 4876abe3f8910c981e628417876b88598b643564dd471f6b8bdb66bd9064e799
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64a1c8f5f14eefd54908e53b6e88f7b199e4e30a9b9ce7d8fa25932508ccc1727481d89f8b40f4f638eace0a1609bf270e98ead3931fe46a86b4969860bca38f
|
7
|
+
data.tar.gz: 3f4026b1fbc067905de4a5eae7f8289bfe3987d6464be4622d254b9efabf8acac319c92dc6cd6c1cf8a147ff94b9a625c5fe60c4a6b40e1446c0470cd2a2159b
|
data/lib/inertia_builder.rb
CHANGED
@@ -4,18 +4,52 @@ require 'jbuilder/jbuilder_template'
|
|
4
4
|
require 'inertia_builder/handler'
|
5
5
|
require 'inertia_builder/controller'
|
6
6
|
require 'inertia_builder/renderer'
|
7
|
-
require 'inertia_builder/railtie'
|
7
|
+
require 'inertia_builder/railtie'
|
8
8
|
|
9
9
|
class JbuilderTemplate
|
10
|
-
self.template_lookup_options = { handlers: [
|
10
|
+
self.template_lookup_options = { handlers: %i[inertia jbuilder] }
|
11
11
|
end
|
12
12
|
|
13
13
|
module InertiaBuilder
|
14
14
|
class PropBuilder < JbuilderTemplate
|
15
15
|
alias props attributes!
|
16
16
|
|
17
|
+
def optional!(&block)
|
18
|
+
_call_inertia_block(:optional, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def always!(&block)
|
22
|
+
_call_inertia_block(:always, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def defer!(**opts, &block)
|
26
|
+
_call_inertia_block(:defer, **opts, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(name, *args, &block)
|
30
|
+
prop = self
|
31
|
+
|
32
|
+
if @inertia_block
|
33
|
+
method, opts = @inertia_block
|
34
|
+
_set_value(name, ::InertiaRails.send(method, **opts) { prop.set!(name, *args, &block) })
|
35
|
+
elsif !@in_scope
|
36
|
+
# Lazy evaluate outermost properties.
|
37
|
+
_set_value(name, -> { prop.set!(name, *args, &block); })
|
38
|
+
else
|
39
|
+
super
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
17
43
|
private
|
18
44
|
|
45
|
+
def _call_inertia_block(method, **opts)
|
46
|
+
::Kernel.raise "Nesting #{method}! in a #{@inertia_block[0]}! block is not allowed" if @inertia_block
|
47
|
+
|
48
|
+
@inertia_block = [method, opts]
|
49
|
+
yield
|
50
|
+
@inertia_block = nil
|
51
|
+
end
|
52
|
+
|
19
53
|
def _render_partial_with_options(options)
|
20
54
|
options[:locals] ||= options.except(:partial, :as, :collection, :cached)
|
21
55
|
options[:locals][:prop] = self
|
@@ -30,5 +64,21 @@ module InertiaBuilder
|
|
30
64
|
def _render_active_model_partial(object)
|
31
65
|
@context.render object, prop: self
|
32
66
|
end
|
67
|
+
|
68
|
+
def _scope
|
69
|
+
@in_scope = true
|
70
|
+
super
|
71
|
+
ensure
|
72
|
+
@in_scope = false
|
73
|
+
end
|
74
|
+
|
75
|
+
def _merge_values(current_value, updates)
|
76
|
+
# Always override lazy evaluation procs.
|
77
|
+
if current_value.is_a?(::Proc)
|
78
|
+
updates
|
79
|
+
else
|
80
|
+
super
|
81
|
+
end
|
82
|
+
end
|
33
83
|
end
|
34
84
|
end
|
@@ -47,8 +47,8 @@ class InertiaBuilderTest < Minitest::Test
|
|
47
47
|
}
|
48
48
|
}
|
49
49
|
|
50
|
-
assert_equal inertia_html_with_props(expected_props), render_view(template)
|
51
50
|
assert_equal inertia_json_with_props(expected_props), render_view(template, json: true)
|
51
|
+
assert_equal inertia_html_with_props(expected_props), render_view(template)
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_collection_prop
|
@@ -75,9 +75,9 @@ class InertiaBuilderTest < Minitest::Test
|
|
75
75
|
|
76
76
|
expected_props = { products: products }
|
77
77
|
|
78
|
-
assert_equal inertia_html_with_props(expected_props), render_view(template, assigns: { products: products })
|
79
78
|
assert_equal inertia_json_with_props(expected_props),
|
80
79
|
render_view(template, assigns: { products: products }, json: true)
|
80
|
+
assert_equal inertia_html_with_props(expected_props), render_view(template, assigns: { products: products })
|
81
81
|
end
|
82
82
|
|
83
83
|
def test_basic_partial_prop
|
@@ -91,8 +91,8 @@ class InertiaBuilderTest < Minitest::Test
|
|
91
91
|
|
92
92
|
expected_props = { user: user }
|
93
93
|
|
94
|
-
assert_equal inertia_html_with_props(expected_props), render_view(template, assigns: { user: user })
|
95
94
|
assert_equal inertia_json_with_props(expected_props), render_view(template, assigns: { user: user }, json: true)
|
95
|
+
assert_equal inertia_html_with_props(expected_props), render_view(template, assigns: { user: user })
|
96
96
|
end
|
97
97
|
|
98
98
|
def test_collection_partial_prop
|
@@ -140,11 +140,96 @@ class InertiaBuilderTest < Minitest::Test
|
|
140
140
|
assert_equal inertia_json_with_props(expected_props), render_view(template, json: true)
|
141
141
|
end
|
142
142
|
|
143
|
+
def test_optional_block
|
144
|
+
template = <<~INERTIA
|
145
|
+
prop.id 1
|
146
|
+
prop.optional! do
|
147
|
+
prop.user 'User'
|
148
|
+
prop.calculation 'Calculation'
|
149
|
+
end
|
150
|
+
INERTIA
|
151
|
+
|
152
|
+
partial_headers = {
|
153
|
+
'X-Inertia-Partial-Data' => 'user,calculation',
|
154
|
+
'X-Inertia-Partial-Component' => '/'
|
155
|
+
}
|
156
|
+
assert_equal inertia_json_with_props({ id: 1 }), render_view(template, json: true)
|
157
|
+
assert_equal inertia_json_with_props({ user: 'User', calculation: 'Calculation' }),
|
158
|
+
render_view(template, json: true, headers: partial_headers)
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_always_block
|
162
|
+
template = <<~INERTIA
|
163
|
+
prop.id 1
|
164
|
+
prop.always! do
|
165
|
+
prop.user 'User'
|
166
|
+
end
|
167
|
+
prop.optional! do
|
168
|
+
prop.calculation 'Calculation'
|
169
|
+
end
|
170
|
+
INERTIA
|
171
|
+
|
172
|
+
partial_headers = {
|
173
|
+
'X-Inertia-Partial-Data' => 'calculation',
|
174
|
+
'X-Inertia-Partial-Component' => '/'
|
175
|
+
}
|
176
|
+
assert_equal inertia_json_with_props({ id: 1, user: 'User' }), render_view(template, json: true)
|
177
|
+
assert_equal inertia_json_with_props({ user: 'User', calculation: 'Calculation' }),
|
178
|
+
render_view(template, json: true, headers: partial_headers)
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_defer_block
|
182
|
+
template = <<~INERTIA
|
183
|
+
prop.id 1
|
184
|
+
prop.defer! do
|
185
|
+
prop.user 'User'
|
186
|
+
prop.calculation 'Calculation'
|
187
|
+
end
|
188
|
+
INERTIA
|
189
|
+
|
190
|
+
assert_equal inertia_json_with_props({ id: 1 }, deferredProps: { default: %w[user calculation] }),
|
191
|
+
render_view(template, json: true)
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_defer_block_grouping
|
195
|
+
template = <<~INERTIA
|
196
|
+
prop.id 1
|
197
|
+
prop.defer! group: 'group1' do
|
198
|
+
prop.user 'User'
|
199
|
+
end
|
200
|
+
prop.defer! group: 'group2' do
|
201
|
+
prop.calculation 'Calculation'
|
202
|
+
end
|
203
|
+
INERTIA
|
204
|
+
|
205
|
+
assert_equal inertia_json_with_props({ id: 1 }, deferredProps: { group1: ['user'], group2: ['calculation'] }),
|
206
|
+
render_view(template, json: true)
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_defer_block_fetching
|
210
|
+
template = <<~INERTIA
|
211
|
+
prop.id 1
|
212
|
+
prop.defer! do
|
213
|
+
prop.user 'User'
|
214
|
+
prop.calculation 'Calculation'
|
215
|
+
end
|
216
|
+
INERTIA
|
217
|
+
|
218
|
+
partial_headers = {
|
219
|
+
'X-Inertia-Partial-Data' => 'user,calculation',
|
220
|
+
'X-Inertia-Partial-Component' => '/'
|
221
|
+
}
|
222
|
+
|
223
|
+
assert_equal inertia_json_with_props({ user: 'User', calculation: 'Calculation' }),
|
224
|
+
render_view(template, json: true, headers: partial_headers)
|
225
|
+
end
|
226
|
+
|
143
227
|
private
|
144
228
|
|
145
|
-
def render_view(source,
|
229
|
+
def render_view(source, **opts)
|
146
230
|
req = ActionDispatch::TestRequest.create
|
147
|
-
req.headers[
|
231
|
+
req.headers.merge!(opts[:headers] || {})
|
232
|
+
req.headers['X-Inertia'] = 'true' if opts[:json]
|
148
233
|
|
149
234
|
controller = ActionView::TestCase::TestController.new
|
150
235
|
controller.request = req
|
@@ -152,7 +237,7 @@ class InertiaBuilderTest < Minitest::Test
|
|
152
237
|
resolver = ActionView::FixtureResolver.new(PARTIALS.merge('source.html.inertia' => source))
|
153
238
|
lookup = ActionView::LookupContext.new([resolver], {}, [''])
|
154
239
|
|
155
|
-
view = ActionView::Base.with_empty_template_cache.new(lookup, assigns, controller)
|
240
|
+
view = ActionView::Base.with_empty_template_cache.new(lookup, opts[:assigns] || [], controller)
|
156
241
|
|
157
242
|
view.render(template: 'source')
|
158
243
|
end
|
@@ -163,7 +248,7 @@ class InertiaBuilderTest < Minitest::Test
|
|
163
248
|
HTML
|
164
249
|
end
|
165
250
|
|
166
|
-
def inertia_json_with_props(props)
|
251
|
+
def inertia_json_with_props(props, **extra_fields)
|
167
252
|
{
|
168
253
|
component: '/',
|
169
254
|
props: { errors: {} }.merge(props),
|
@@ -171,6 +256,6 @@ class InertiaBuilderTest < Minitest::Test
|
|
171
256
|
version: nil,
|
172
257
|
encryptHistory: false,
|
173
258
|
clearHistory: false
|
174
|
-
}.to_json
|
259
|
+
}.merge(extra_fields).to_json
|
175
260
|
end
|
176
261
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inertia_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Lima
|
@@ -70,8 +70,8 @@ licenses:
|
|
70
70
|
- MIT
|
71
71
|
metadata:
|
72
72
|
bug_tracker_uri: https://github.com/rodrigotavio91/inertia-builder/issues
|
73
|
-
changelog_uri: https://github.com/rodrigotavio91/inertia-builder/releases/tag/v0.
|
74
|
-
source_code_uri: https://github.com/rodrigotavio91/inertia-builder/tree/v0.
|
73
|
+
changelog_uri: https://github.com/rodrigotavio91/inertia-builder/releases/tag/v0.2.0
|
74
|
+
source_code_uri: https://github.com/rodrigotavio91/inertia-builder/tree/v0.2.0
|
75
75
|
rubygems_mfa_required: 'true'
|
76
76
|
rdoc_options: []
|
77
77
|
require_paths:
|