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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db89ab90b2cb82bff0edc49732dfb8662a1e1af582fa0a81b8b7b569f631f107
4
- data.tar.gz: 63832da96a198430e738e3ca368ed9a3977415b615039d8a81c4c3dcec2b7a5a
3
+ metadata.gz: d326ccb567aaf8b60dd19a3ec57358008e620e575e725e0827cf9378e64bf8e7
4
+ data.tar.gz: 4876abe3f8910c981e628417876b88598b643564dd471f6b8bdb66bd9064e799
5
5
  SHA512:
6
- metadata.gz: 790787ba727eb3473a560275061fc28fe9a80a29bf8218a560471acb760b01b09599194542aa6b0bed8c491fad95d2c5741fa8b514ed149bd00e93d6ea175fdb
7
- data.tar.gz: a1c8f57f40b69b96f2597614ef2e801bcabb21d7b019de7ebb0fe9c0feab8ca233c755c8d126d42cc0dc44e1d191431c834157cbdedbf20fcdc098c01d45722a
6
+ metadata.gz: 64a1c8f5f14eefd54908e53b6e88f7b199e4e30a9b9ce7d8fa25932508ccc1727481d89f8b40f4f638eace0a1609bf270e98ead3931fe46a86b4969860bca38f
7
+ data.tar.gz: 3f4026b1fbc067905de4a5eae7f8289bfe3987d6464be4622d254b9efabf8acac319c92dc6cd6c1cf8a147ff94b9a625c5fe60c4a6b40e1446c0470cd2a2159b
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module InertiaBuilder
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -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' if defined?(Rails)
7
+ require 'inertia_builder/railtie'
8
8
 
9
9
  class JbuilderTemplate
10
- self.template_lookup_options = { handlers: [:inertia] }
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, assigns: {}, json: false)
229
+ def render_view(source, **opts)
146
230
  req = ActionDispatch::TestRequest.create
147
- req.headers['X-Inertia'] = 'true' if json
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.1.1
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.1.1
74
- source_code_uri: https://github.com/rodrigotavio91/inertia-builder/tree/v0.1.1
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: