inertia_builder 0.2.2 → 0.3.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: 8b41a77c0abf695c22870a0f35ac4a37c26c97271ac5d33b0a2b4eb1beec5480
4
- data.tar.gz: c64489eded45ffc35d4946f4787a0c4ab23ccf88626ca41d005138a9d621d2de
3
+ metadata.gz: 5d7e71953b0936b8ed91f3b928595e60d6d57680e0b35c0cfb7859b7bdaf7625
4
+ data.tar.gz: 6ff8c51673223bd0986100dd215666220ff7a06a743a18433aa6613064d77d23
5
5
  SHA512:
6
- metadata.gz: 6739d2a741a60a35d07b8e638f029fd349aa58d706b437350de491e09c3717aceacb7cc3075b612f91502300d8efd2cc5601251b0c1895d3a9cebf0fb448cf61
7
- data.tar.gz: bd1a2ae1600c6461469f84298bdbb5143faf35e3fdfed32bf792285480584839abd6a7186a374730ebc2ef505fac12823368bfaed11827a0e6c0dfe96a7ff6e2
6
+ metadata.gz: 3265c9ac28a8aabd5bb6f9499a9efe7469337f5f2f117986205112d2ae337b40e9830f03030ed341f98dd86424655c031e7ef5c451e950ebacd42841dc56c7ee
7
+ data.tar.gz: 895d95e54656cb6b15ee7dbd8fd3722d8e1d6717509736756cfaaeef3e1d9d8dc64e85a23c8866dcab27bd6c85bf3b88b02312f36ed1d139b783cc515eb5c2c0
@@ -23,7 +23,7 @@ module InertiaBuilder
23
23
  @view_context.controller.render_to_string(
24
24
  template: 'inertia',
25
25
  layout: false,
26
- locals: @inertia_renderer.send(:view_data).merge(page: page)
26
+ locals: { page: page }
27
27
  )
28
28
  end
29
29
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module InertiaBuilder
4
- VERSION = '0.2.2'
2
+ VERSION = "0.3.0"
5
3
  end
@@ -26,12 +26,16 @@ module InertiaBuilder
26
26
  _call_inertia_block(:defer, **opts, &block)
27
27
  end
28
28
 
29
+ def scroll!(metadata = nil, **opts, &block)
30
+ _call_inertia_block(:scroll, metadata, **opts, &block)
31
+ end
32
+
29
33
  def method_missing(name, *args, &block)
30
34
  prop = self
31
35
 
32
36
  if @inertia_block
33
- method, opts = @inertia_block
34
- _set_value(name, ::InertiaRails.send(method, **opts) { prop.set!(name, *args, &block) })
37
+ method, positional_args, opts = @inertia_block
38
+ _set_value(name, ::InertiaRails.send(method, *positional_args, **opts) { prop.set!(name, *args, &block) })
35
39
  elsif !@in_scope
36
40
  # Lazy evaluate outermost properties.
37
41
  _set_value(name, -> { prop.set!(name, *args, &block); })
@@ -42,10 +46,10 @@ module InertiaBuilder
42
46
 
43
47
  private
44
48
 
45
- def _call_inertia_block(method, **opts)
49
+ def _call_inertia_block(method, *args, **opts)
46
50
  ::Kernel.raise "Nesting #{method}! in a #{@inertia_block[0]}! block is not allowed" if @inertia_block
47
51
 
48
- @inertia_block = [method, opts]
52
+ @inertia_block = [method, args, opts]
49
53
  yield
50
54
  @inertia_block = nil
51
55
  end
@@ -78,7 +82,8 @@ module InertiaBuilder
78
82
  if current_value.is_a?(::Proc) ||
79
83
  current_value.is_a?(::InertiaRails::OptionalProp) ||
80
84
  current_value.is_a?(::InertiaRails::AlwaysProp) ||
81
- current_value.is_a?(::InertiaRails::DeferProp)
85
+ current_value.is_a?(::InertiaRails::DeferProp) ||
86
+ current_value.is_a?(::InertiaRails::ScrollProp)
82
87
  updates
83
88
  else
84
89
  super
@@ -13,6 +13,23 @@ class Item < Struct.new(:id, :title)
13
13
  include ActiveModel::Conversion
14
14
  end
15
15
 
16
+ Paginator = Struct.new(:current, :previous, :next, :param_name, keyword_init: true)
17
+
18
+ class PaginatorAdapter
19
+ def match?(metadata)
20
+ metadata.is_a?(Paginator)
21
+ end
22
+
23
+ def call(metadata, **_options)
24
+ {
25
+ page_name: metadata.param_name,
26
+ previous_page: metadata.previous,
27
+ next_page: metadata.next,
28
+ current_page: metadata.current
29
+ }
30
+ end
31
+ end
32
+
16
33
  class InertiaBuilderTest < Minitest::Test
17
34
  USER_PARTIAL = <<~INERTIA
18
35
  prop.id user.id
@@ -260,6 +277,79 @@ class InertiaBuilderTest < Minitest::Test
260
277
  render_view(template, assigns: { user: user }, json: true, headers: partial_headers)
261
278
  end
262
279
 
280
+ def test_scroll_block
281
+ users = [
282
+ User.new(id: 1, first_name: 'John', last_name: 'Smith', email: 'john@email.com'),
283
+ User.new(id: 2, first_name: 'Jane', last_name: 'Smith', email: 'jane@email.com')
284
+ ]
285
+
286
+ template = <<~INERTIA
287
+ prop.id 1
288
+ prop.scroll!(page_name: 'page', current_page: 1, previous_page: nil, next_page: 2) do
289
+ prop.users @users, partial: 'users/user', as: :user
290
+ end
291
+ INERTIA
292
+
293
+ expected = inertia_json_with_props(
294
+ { id: 1, users: users },
295
+ scrollProps: { users: { pageName: 'page', previousPage: nil, nextPage: 2, currentPage: 1, reset: false } },
296
+ mergeProps: ['users']
297
+ )
298
+
299
+ assert_equal expected, render_view(template, assigns: { users: users }, json: true)
300
+ end
301
+
302
+ def test_scroll_block_fetching
303
+ users = [
304
+ User.new(id: 3, first_name: 'Alice', last_name: 'Jones', email: 'alice@email.com'),
305
+ User.new(id: 4, first_name: 'Bob', last_name: 'Brown', email: 'bob@email.com')
306
+ ]
307
+
308
+ template = <<~INERTIA
309
+ prop.id 1
310
+ prop.scroll!(page_name: 'page', current_page: 2, previous_page: 1, next_page: 3) do
311
+ prop.users @users, partial: 'users/user', as: :user
312
+ end
313
+ INERTIA
314
+
315
+ partial_headers = {
316
+ 'X-Inertia-Partial-Data' => 'users',
317
+ 'X-Inertia-Partial-Component' => '/'
318
+ }
319
+ expected = inertia_json_with_props(
320
+ { users: users },
321
+ scrollProps: { users: { pageName: 'page', previousPage: 1, nextPage: 3, currentPage: 2, reset: false } },
322
+ mergeProps: ['users']
323
+ )
324
+
325
+ assert_equal expected, render_view(template, assigns: { users: users }, json: true, headers: partial_headers)
326
+ end
327
+
328
+ def test_scroll_block_with_metadata_extractor
329
+ users = [
330
+ User.new(id: 1, first_name: 'John', last_name: 'Smith', email: 'john@email.com')
331
+ ]
332
+
333
+ paginator = Paginator.new(current: 1, previous: nil, next: 2, param_name: 'p')
334
+
335
+ template = <<~INERTIA
336
+ prop.id 1
337
+ prop.scroll!(@paginator) do
338
+ prop.users @users, partial: 'users/user', as: :user
339
+ end
340
+ INERTIA
341
+
342
+ with_scroll_metadata_adapater(PaginatorAdapter) do
343
+ expected = inertia_json_with_props(
344
+ { id: 1, users: users },
345
+ scrollProps: { users: { pageName: 'p', previousPage: nil, nextPage: 2, currentPage: 1, reset: false } },
346
+ mergeProps: ['users']
347
+ )
348
+
349
+ assert_equal expected, render_view(template, assigns: { users: users, paginator: paginator }, json: true)
350
+ end
351
+ end
352
+
263
353
  private
264
354
 
265
355
  def render_view(source, **opts)
@@ -294,4 +384,12 @@ class InertiaBuilderTest < Minitest::Test
294
384
  clearHistory: false
295
385
  }.merge(extra_fields).to_json
296
386
  end
387
+
388
+ def with_scroll_metadata_adapater(adapter_class)
389
+ original_adapters = InertiaRails::ScrollMetadata.adapters.dup
390
+ InertiaRails::ScrollMetadata.register_adapter(adapter_class)
391
+ yield
392
+ ensure
393
+ InertiaRails::ScrollMetadata.adapters = original_adapters
394
+ end
297
395
  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.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Lima
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '3.5'
18
+ version: '3.12'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '3.5'
25
+ version: '3.12'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: jbuilder
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -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.2.2
74
- source_code_uri: https://github.com/rodrigotavio91/inertia-builder/tree/v0.2.2
73
+ changelog_uri: https://github.com/rodrigotavio91/inertia-builder/releases/tag/v0.3.0
74
+ source_code_uri: https://github.com/rodrigotavio91/inertia-builder/tree/v0.3.0
75
75
  rubygems_mfa_required: 'true'
76
76
  rdoc_options: []
77
77
  require_paths: