alba-inertia 0.1.2 → 0.1.4

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: 36892b105c78f91a4874dca3d397e42be762acf30fcd56f379e1f2672683def0
4
- data.tar.gz: 8dfc87dca73d0594fcc7233e48bdf73d2cc62f6f082bfe0e820685cfa827603c
3
+ metadata.gz: cfe281c753944eadf0114123a314af226fb73fadeac1053a89c11c87577cdc6c
4
+ data.tar.gz: ad63713f57f9066ec4f0de804d51cd6ea856eec0d09e3e17a443f5327b0a128c
5
5
  SHA512:
6
- metadata.gz: 74b25910459121487726f3a3d1be5c235dacd494cc25d9bc0dfb337e0900e962be3c5283e8a2667476cf1dcff1314a984781c04ab037f7eddcf2b09379296b48
7
- data.tar.gz: d36a4bde371ad4322c595f251ce7a83c4cd0e83e6459695603044d8987e6d029b6556783337135a668ac76410cec19a57634492e805c252c86744d6d95efeddd
6
+ metadata.gz: 207186eb671f60205cd46f03862d84e6569473b18a7424f19c1eaae61435408fd5aeaf167e7642e9f0d46d3749af6f4ebef92e5d08ca394029e069f3de4f3e98
7
+ data.tar.gz: 6f6b0825a3bfbe83b1d4cd6c42ae2b2e2d9d789d5c84dfd79d36b480b1d9b9c879feed73b531a40789022f1439e163e6fc62ffdec34c1c1285a6675229b091fb
data/CHANGELOG.md CHANGED
@@ -7,11 +7,29 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.1.4] - 2026-04-21
11
+
12
+ ### Added
13
+
14
+ - Support for `InertiaRails.cache` props. ([@skryukov])
15
+ - Support for deferred scroll props. ([@nickpellant])
16
+ - Respect configured `transform_keys` on top-level prop keys. ([@bknoles])
17
+
18
+ ### Changed
19
+
20
+ - Compatibility with InertiaRails 3.19.0+ load path. ([@bknoles])
21
+
22
+ ## [0.1.3] - 2025-12-08
23
+
24
+ ### Added
25
+
26
+ - Support for `InertiaRails.once`. ([@skryukov])
27
+
10
28
  ## [0.1.2] - 2025-12-08
11
29
 
12
30
  ### Added
13
31
 
14
- - Support for `InertiaRails.scroll` attributes. ([@skryukov])
32
+ - Support for `InertiaRails.scroll`. ([@skryukov])
15
33
  - Add `serializer_params` option to `render_inertia` and `inertia_serializer_params` controller method for passing params to serializers. ([@skryukov])
16
34
 
17
35
  ## [0.1.1] - 2025-11-05
@@ -31,9 +49,13 @@ and this project adheres to [Semantic Versioning].
31
49
 
32
50
  - Initial release ([@skryukov])
33
51
 
52
+ [@bknoles]: https://github.com/bknoles
53
+ [@nickpellant]: https://github.com/nickpellant
34
54
  [@skryukov]: https://github.com/skryukov
35
55
 
36
- [Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.2...HEAD
56
+ [Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.4...HEAD
57
+ [0.1.4]: https://github.com/skryukov/alba-inertia/compare/v0.1.3...v0.1.4
58
+ [0.1.3]: https://github.com/skryukov/alba-inertia/compare/v0.1.2...v0.1.3
37
59
  [0.1.2]: https://github.com/skryukov/alba-inertia/compare/v0.1.1...v0.1.2
38
60
  [0.1.1]: https://github.com/skryukov/alba-inertia/compare/v0.1.0...v0.1.1
39
61
  [0.1.0]: https://github.com/skryukov/alba-inertia/commits/v0.1.0
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Alba::Inertia
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/alba-inertia.svg)](https://rubygems.org/gems/alba-inertia)
4
+
3
5
  Seamless integration between [Alba](https://github.com/okuramasafumi/alba) serializers and [Inertia Rails](https://inertia-rails.dev/).
4
6
 
5
7
  ## Features
@@ -8,6 +10,10 @@ Seamless integration between [Alba](https://github.com/okuramasafumi/alba) seria
8
10
  - Lazy evaluation for efficient data loading on partial reloads
9
11
  - Auto-detection of resource classes based on controller/action naming
10
12
 
13
+ <a href="https://evilmartians.com/?utm_source=alba-inertia&utm_campaign=project_page">
14
+ <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Built by Evil Martians" width="236" height="54">
15
+ </a>
16
+
11
17
  ## Installation
12
18
 
13
19
  Add to your Gemfile:
@@ -71,8 +77,12 @@ class CoursesIndexResource < ApplicationResource
71
77
 
72
78
  # Scroll prop with explicit metadata
73
79
  has_many :items, inertia: { scroll: :meta }
74
- has_many :items, inertia: { scroll: -> { |obj| obj.meta } }
75
- has_many :items, inertia: { scroll: -> { |obj| obj.meta }, wrapper: 'data' }
80
+ has_many :items, inertia: { scroll: ->(obj) { obj.meta } }
81
+ has_many :items, inertia: { scroll: ->(obj) { obj.meta }, wrapper: 'data' }
82
+
83
+ # Once prop
84
+ has_many :plans, inertia: :once
85
+ has_many :plans, inertia: { once: { key: 'active_plans', expires_in: 1.hour, fresh: ->(obj) { obj.fresh? } } }
76
86
  end
77
87
  ```
78
88
 
@@ -3,18 +3,24 @@
3
3
  module Alba
4
4
  module Inertia
5
5
  class PropBuilder
6
+ ONCE_KEYS = %i[once key expires_in fresh]
7
+
6
8
  class << self
7
9
  def build(evaluation_block, options, object = nil)
8
10
  if options[:optional]
9
11
  wrap_optional(evaluation_block, options[:optional], object)
12
+ elsif options[:once]
13
+ wrap_once(evaluation_block, options[:once], object)
14
+ elsif options[:scroll]
15
+ wrap_scroll(evaluation_block, options[:scroll], object, options)
10
16
  elsif options[:defer]
11
17
  wrap_defer(evaluation_block, options[:defer], object)
12
18
  elsif options[:merge]
13
19
  wrap_merge(evaluation_block, options[:merge], object)
14
- elsif options[:scroll]
15
- wrap_scroll(evaluation_block, options[:scroll], object)
16
20
  elsif options[:always]
17
21
  wrap_always(evaluation_block, options[:always], object)
22
+ elsif options[:cache]
23
+ wrap_cache(evaluation_block, options[:cache], object)
18
24
  else
19
25
  Alba::Inertia.config.lazy_by_default ? evaluation_block : evaluation_block.call
20
26
  end
@@ -26,18 +32,36 @@ module Alba
26
32
  ::InertiaRails.always(&value_block)
27
33
  end
28
34
 
29
- def wrap_optional(value_block, _opts, _object)
30
- ::InertiaRails.optional(&value_block)
35
+ def wrap_cache(value_block, opts, _object)
36
+ if opts.is_a?(Hash)
37
+ raise ArgumentError, "cache: hash requires a :key" unless opts.key?(:key)
38
+ ::InertiaRails.cache(opts[:key], **opts.except(:key), &value_block)
39
+ else
40
+ ::InertiaRails.cache(opts, &value_block)
41
+ end
42
+ end
43
+
44
+ def wrap_optional(value_block, opts, _object)
45
+ if opts.is_a?(Hash)
46
+ options = opts.slice(:cache, *ONCE_KEYS)
47
+ ::InertiaRails.optional(**options, &value_block)
48
+ else
49
+ ::InertiaRails.optional(&value_block)
50
+ end
51
+ end
52
+
53
+ def wrap_once(value_block, opts, _object)
54
+ if opts.is_a?(Hash)
55
+ options = opts.slice(*ONCE_KEYS)
56
+ ::InertiaRails.once(**options, &value_block)
57
+ else
58
+ ::InertiaRails.once(&value_block)
59
+ end
31
60
  end
32
61
 
33
62
  def wrap_defer(value_block, opts, _object)
34
63
  if opts.is_a?(Hash)
35
- options = {
36
- group: opts[:group],
37
- merge: opts[:merge],
38
- deep_merge: opts[:deep_merge],
39
- match_on: opts[:match_on]
40
- }.compact
64
+ options = opts.slice(:group, :deep_merge, :merge, :match_on, :cache, *ONCE_KEYS)
41
65
 
42
66
  ::InertiaRails.defer(**options, &value_block)
43
67
  else
@@ -47,30 +71,32 @@ module Alba
47
71
 
48
72
  def wrap_merge(value_block, opts, _object)
49
73
  if opts.is_a?(Hash)
50
- options = {match_on: opts[:match_on]}.compact
74
+ options = opts.slice(:match_on, *ONCE_KEYS)
51
75
  ::InertiaRails.merge(**options, &value_block)
52
76
  else
53
77
  ::InertiaRails.merge(&value_block)
54
78
  end
55
79
  end
56
80
 
57
- def wrap_scroll(value_block, opts, object)
81
+ def wrap_scroll(value_block, opts, object, all_options = {})
82
+ extra = all_options.slice(:defer, :group)
83
+
58
84
  case opts
59
85
  when Symbol
60
86
  # scroll: :meta => extract metadata from object[:meta] or object.meta
61
87
  metadata = extract_from_object(object, opts)
62
- ::InertiaRails.scroll(metadata: metadata, &value_block)
88
+ ::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
63
89
  when Proc
64
90
  # scroll: -> { |obj| obj.meta } => call proc with object
65
91
  metadata = opts.call(object)
66
- ::InertiaRails.scroll(metadata: metadata, &value_block)
92
+ ::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
67
93
  when Hash
68
94
  options = build_scroll_options(opts, object)
69
95
  ::InertiaRails.scroll(**options, &value_block)
70
96
  when TrueClass
71
97
  # scroll: true => auto-detect metadata
72
98
  metadata = auto_detect_pagination_metadata(object)
73
- ::InertiaRails.scroll(metadata: metadata, &value_block)
99
+ ::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
74
100
  else
75
101
  raise ArgumentError, "Invalid scroll option. Expected Symbol, Proc, Hash, or true."
76
102
  end
@@ -86,7 +112,7 @@ module Alba
86
112
  opts[:scroll]
87
113
  end
88
114
 
89
- {metadata: metadata}.merge(opts.slice(:wrapper, :page_name, :previous_page, :next_page, :current_page))
115
+ {metadata: metadata}.merge(opts.slice(:defer, :group, :wrapper, :page_name, :previous_page, :next_page, :current_page))
90
116
  end
91
117
 
92
118
  def extract_from_object(object, key)
@@ -56,15 +56,7 @@ module Alba
56
56
  #
57
57
  # @example Merge with custom options
58
58
  # inertia_prop :metadata, merge: { match_on: :id, prepend: 'meta_' }
59
- def inertia_prop(name, **kwargs)
60
- options = {
61
- optional: kwargs.delete(:optional) || false,
62
- defer: kwargs.delete(:defer) || false,
63
- merge: kwargs.delete(:merge) || false,
64
- scroll: kwargs.delete(:scroll) || false,
65
- always: kwargs.delete(:always) || false
66
- }.select { |_k, v| v.present? }
67
-
59
+ def inertia_prop(name, **options)
68
60
  inertia_metadata[name] = options.freeze
69
61
  auto_typelize_from_inertia(name, options)
70
62
  end
@@ -121,7 +113,7 @@ module Alba
121
113
  result = {}
122
114
 
123
115
  self.class._attributes.each do |attr_name, attr_body|
124
- attr_name_str = attr_name.to_s
116
+ attr_name_str = transform_key(attr_name)
125
117
 
126
118
  evaluation_block = build_evaluation_block(attr_name, attr_body)
127
119
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Alba
4
4
  module Inertia
5
- VERSION = "0.1.2"
5
+ VERSION = "0.1.4"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alba-inertia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  - !ruby/object:Gem::Version
92
92
  version: '0'
93
93
  requirements: []
94
- rubygems_version: 4.0.0
94
+ rubygems_version: 4.0.6
95
95
  specification_version: 4
96
96
  summary: Seamless integration between Alba and Inertia Rails.
97
97
  test_files: []