inertia_rails 1.5.0 → 1.9.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: ca1386958c2d3e3c0b0dfbab50c7e59f5a21144c1fc879e62493dcd54bc11ef5
4
- data.tar.gz: de0fc529f805b096ea8c567c2f9c78b9d30cd730aa2a8439f03b976d6e4e9a82
3
+ metadata.gz: 4a3b7e29654788cf3c7ac7307d83fd258d47c7ee5daa36745998c944ae31b472
4
+ data.tar.gz: 4070f2fb9ae9d253a94c98d7f8705f713248788b63611bfa30f36edaaa15a73e
5
5
  SHA512:
6
- metadata.gz: bb44ba24fb2f5ef1e020824a31b806840be221da969d73b19404db03c537ff1cb38cb8500b15dbe456ede6e0aec451fa06652b1b7bfa387f5ab6f0f007972f18
7
- data.tar.gz: 1db014d57a1a78a505e26b70b18f67e365b40829e7c8a847de29cd428ccb2882d6fb87a664758f6e77918cd7570132c05aecd102d5ed97eed5a72d73e68913cd
6
+ metadata.gz: 2aa986d0e69a1db45d94ca921771e7ff82ec61c53008dbf756b9eed3728837d314ee773e12acd27a98fcb1372d67f44653fa749ef24b2959759849b2be925ae9
7
+ data.tar.gz: ab880524135f77d437aeb4c8dfa1e3e23ddc69db5d99a5adea6139d17331db7981f691921ae10b84d41122d06fc1a01a456af902ed3fcde704fb9d4bf1b9f08a
@@ -8,7 +8,7 @@ jobs:
8
8
  fail-fast: false
9
9
  matrix:
10
10
  ruby: [2.6, 2.7]
11
- rails: ['5.0', '5.1', '5.2', '6.0']
11
+ rails: ['5.0', '5.1', '5.2', '6.0', '6.1']
12
12
 
13
13
  runs-on: ubuntu-latest
14
14
  name: Test against Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }}
data/Appraisals CHANGED
@@ -1,3 +1,7 @@
1
+ appraise "rails-6.1" do
2
+ gem "rails", "~> 6.1.0"
3
+ end
4
+
1
5
  appraise "rails-6.0" do
2
6
  gem "rails", "~> 6.0.3", '>= 6.0.3.2'
3
7
  end
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [1.9.0] - 2021-01-17
8
+
9
+ * Added the same inertia awareness that redirect_to has to redirect_back
10
+
11
+ ## [1.8.0] - 2020-12-08
12
+
13
+ * Add `inertia` route helper feature
14
+
15
+ ## [1.7.1] - 2020-11-24
16
+
17
+ * Fix the definition for InertiaRails::Lazy to avoid an uninitialized constant error when booting an application.
18
+
19
+ ## [1.7.0] - 2020-11-24
20
+
21
+ * Add support for "lazy" props while rendering. These are props that never compute on the initial page load. The only render during a partial update that calls for them explicitly.
22
+
23
+ ## [1.6.0] - 2020-11-20
24
+
25
+ * Built in error sharing across redirects! adding `{ inertia: { errors: 'errors go here' } }` as an option in `redirect_to` will automatically feed an `errors` prop to whatever is rendered after the redirect.
26
+ * Set content type to json for Inertia responses
27
+ * Return the original response status with Inertia responses
28
+
7
29
  ## [1.5.0] - 2020-10-07
8
30
 
9
31
  * Test against multiple Rails versions in Github Actions
@@ -0,0 +1,7 @@
1
+ module InertiaRails
2
+ class StaticController < ::ApplicationController
3
+ def static
4
+ render inertia: params[:component]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.1.0"
6
+
7
+ gemspec path: "../"
@@ -4,6 +4,7 @@ require 'inertia_rails/engine'
4
4
  require 'patches/debug_exceptions'
5
5
  require 'patches/better_errors'
6
6
  require 'patches/request'
7
+ require 'patches/mapper'
7
8
 
8
9
  ActionController::Renderers.add :inertia do |component, options|
9
10
  InertiaRails::Renderer.new(
@@ -4,6 +4,13 @@ module InertiaRails
4
4
  module Controller
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ included do
8
+ before_action do
9
+ # :inertia_errors are deleted from the session by the middleware
10
+ InertiaRails.share(errors: session[:inertia_errors]) if session[:inertia_errors].present?
11
+ end
12
+ end
13
+
7
14
  module ClassMethods
8
15
  def inertia_share(**args, &block)
9
16
  before_action do
@@ -13,9 +20,31 @@ module InertiaRails
13
20
  end
14
21
  end
15
22
 
23
+ private
24
+
16
25
  def inertia_location(url)
17
26
  headers['X-Inertia-Location'] = url
18
27
  head :conflict
19
28
  end
29
+
30
+ def redirect_to(options = {}, response_options = {})
31
+ capture_inertia_errors(response_options)
32
+ super(options, response_options)
33
+ end
34
+
35
+ def redirect_back(fallback_location:, allow_other_host: true, **options)
36
+ capture_inertia_errors(options)
37
+ super(
38
+ fallback_location: fallback_location,
39
+ allow_other_host: allow_other_host,
40
+ **options,
41
+ )
42
+ end
43
+
44
+ def capture_inertia_errors(options)
45
+ if (inertia_errors = options.dig(:inertia, :errors))
46
+ session[:inertia_errors] = inertia_errors
47
+ end
48
+ end
20
49
  end
21
50
  end
@@ -1,5 +1,6 @@
1
1
  # Needed for `thread_mattr_accessor`
2
2
  require 'active_support/core_ext/module/attribute_accessors_per_thread'
3
+ require 'inertia_rails/lazy'
3
4
 
4
5
  module InertiaRails
5
6
  thread_mattr_accessor :threadsafe_shared_plain_data
@@ -36,6 +37,10 @@ module InertiaRails
36
37
  self.shared_blocks = []
37
38
  end
38
39
 
40
+ def self.lazy(value = nil, &block)
41
+ InertiaRails::Lazy.new(value, &block)
42
+ end
43
+
39
44
  private
40
45
 
41
46
  module Configuration
@@ -0,0 +1,28 @@
1
+ module InertiaRails
2
+ class Lazy
3
+ def initialize(value = nil, &block)
4
+ @value = value
5
+ @block = block
6
+ end
7
+
8
+ def call
9
+ to_proc.call
10
+ end
11
+
12
+ def to_proc
13
+ # This is called by controller.instance_exec, which changes self to the
14
+ # controller instance. That makes the instance variables unavailable to the
15
+ # proc via closure. Copying the instance variables to local variables before
16
+ # the proc is returned keeps them in scope for the returned proc.
17
+ value = @value
18
+ block = @block
19
+ if value.respond_to?(:call)
20
+ value
21
+ elsif value
22
+ Proc.new { value }
23
+ else
24
+ block
25
+ end
26
+ end
27
+ end
28
+ end
@@ -3,41 +3,78 @@ module InertiaRails
3
3
  def initialize(app)
4
4
  @app = app
5
5
  end
6
-
6
+
7
7
  def call(env)
8
+ @env = env
9
+
8
10
  status, headers, body = @app.call(env)
9
11
  request = ActionDispatch::Request.new(env)
10
12
 
11
13
  ::InertiaRails.reset!
12
-
13
- return [status, headers, body] unless env['HTTP_X_INERTIA'].present?
14
-
15
- return force_refresh(request) if stale?(env['REQUEST_METHOD'], env['HTTP_X_INERTIA_VERSION'])
16
-
17
- if is_redirect_status?(status) &&
18
- is_non_get_redirectable_method?(env['REQUEST_METHOD'])
19
- status = 303
20
- end
21
-
22
- [status, headers, body]
23
- end
24
-
14
+
15
+ # Inertia errors are added to the session via redirect_to
16
+ request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
17
+
18
+ status = 303 if inertia_non_post_redirect?(status)
19
+
20
+ return stale_inertia_get? ? force_refresh(request) : [status, headers, body]
21
+ end
22
+
25
23
  private
26
-
27
- def is_redirect_status?(status)
24
+
25
+ def keep_inertia_errors?(status)
26
+ redirect_status?(status) || stale_inertia_request?
27
+ end
28
+
29
+ def stale_inertia_request?
30
+ inertia_request? && version_stale?
31
+ end
32
+
33
+ def redirect_status?(status)
28
34
  [301, 302].include? status
29
35
  end
30
-
31
- def is_non_get_redirectable_method?(request_method)
36
+
37
+ def non_get_redirectable_method?
32
38
  ['PUT', 'PATCH', 'DELETE'].include? request_method
33
39
  end
34
-
35
- def stale?(request_method, inertia_version)
36
- sent_version = InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
37
- saved_version = InertiaRails.version.is_a?(Numeric) ? InertiaRails.version.to_f : InertiaRails.version
38
- request_method == 'GET' && sent_version != saved_version
40
+
41
+ def inertia_non_post_redirect?(status)
42
+ inertia_request? && redirect_status?(status) && non_get_redirectable_method?
43
+ end
44
+
45
+ def stale_inertia_get?
46
+ get? && stale_inertia_request?
39
47
  end
40
-
48
+
49
+ def get?
50
+ request_method == 'GET'
51
+ end
52
+
53
+ def request_method
54
+ @env['REQUEST_METHOD']
55
+ end
56
+
57
+ def inertia_version
58
+ @env['HTTP_X_INERTIA_VERSION']
59
+ end
60
+
61
+ def inertia_request?
62
+ @env['HTTP_X_INERTIA'].present?
63
+ end
64
+
65
+ def version_stale?
66
+ sent_version != saved_version
67
+ end
68
+
69
+ def sent_version
70
+ return nil if inertia_version.nil?
71
+ InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
72
+ end
73
+
74
+ def saved_version
75
+ InertiaRails.version.is_a?(Numeric) ? InertiaRails.version.to_f : InertiaRails.version
76
+ end
77
+
41
78
  def force_refresh(request)
42
79
  request.flash.keep
43
80
  Rack::Response.new('', 409, {'X-Inertia-Location' => request.original_url}).finish
@@ -18,7 +18,7 @@ module InertiaRails
18
18
  if @request.headers['X-Inertia']
19
19
  @response.set_header('Vary', 'Accept')
20
20
  @response.set_header('X-Inertia', 'true')
21
- @render_method.call json: page, status: 200
21
+ @render_method.call json: page, status: @response.status, content_type: Mime[:json]
22
22
  else
23
23
  @render_method.call template: 'inertia', layout: ::InertiaRails.layout, locals: (view_data).merge({page: page})
24
24
  end
@@ -27,13 +27,13 @@ module InertiaRails
27
27
  private
28
28
 
29
29
  def props
30
- only = (@request.headers['X-Inertia-Partial-Data'] || '').split(',').compact.map(&:to_sym)
31
-
32
- _props = ::InertiaRails.shared_data(@controller).merge(@props)
33
-
34
- _props = (only.any? && @request.headers['X-Inertia-Partial-Component'] == component) ?
35
- _props.select {|key| key.in? only} :
36
- _props
30
+ _props = ::InertiaRails.shared_data(@controller).merge(@props).select do |key, prop|
31
+ if rendering_partial_component?
32
+ key.in? partial_keys
33
+ else
34
+ !prop.is_a?(InertiaRails::Lazy)
35
+ end
36
+ end
37
37
 
38
38
  deep_transform_values(_props, lambda {|prop| prop.respond_to?(:call) ? @controller.instance_exec(&prop) : prop })
39
39
  end
@@ -52,5 +52,13 @@ module InertiaRails
52
52
 
53
53
  hash.transform_values {|value| deep_transform_values(value, proc)}
54
54
  end
55
+
56
+ def partial_keys
57
+ (@request.headers['X-Inertia-Partial-Data'] || '').split(',').compact.map(&:to_sym)
58
+ end
59
+
60
+ def rendering_partial_component?
61
+ @request.inertia_partial? && @request.headers['X-Inertia-Partial-Component'] == component
62
+ end
55
63
  end
56
64
  end
@@ -1,3 +1,3 @@
1
1
  module InertiaRails
2
- VERSION = "1.5.0"
2
+ VERSION = "1.9.0"
3
3
  end
@@ -0,0 +1,8 @@
1
+ ActionDispatch::Routing::Mapper.class_eval do
2
+ def inertia(args, &block)
3
+ route = args.keys.first
4
+ component = args.values.first
5
+
6
+ get(route => 'inertia_rails/static#static', defaults: {component: component})
7
+ end
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inertia_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Knoles
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-10-07 00:00:00.000000000 Z
13
+ date: 2021-01-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -129,6 +129,7 @@ files:
129
129
  - LICENSE.txt
130
130
  - README.md
131
131
  - Rakefile
132
+ - app/controllers/inertia_rails/static_controller.rb
132
133
  - app/views/inertia.html.erb
133
134
  - bin/console
134
135
  - bin/setup
@@ -136,11 +137,13 @@ files:
136
137
  - gemfiles/rails_5.1.gemfile
137
138
  - gemfiles/rails_5.2.gemfile
138
139
  - gemfiles/rails_6.0.gemfile
140
+ - gemfiles/rails_6.1.gemfile
139
141
  - inertia_rails.gemspec
140
142
  - lib/inertia_rails.rb
141
143
  - lib/inertia_rails/controller.rb
142
144
  - lib/inertia_rails/engine.rb
143
145
  - lib/inertia_rails/inertia_rails.rb
146
+ - lib/inertia_rails/lazy.rb
144
147
  - lib/inertia_rails/middleware.rb
145
148
  - lib/inertia_rails/renderer.rb
146
149
  - lib/inertia_rails/rspec.rb
@@ -149,6 +152,7 @@ files:
149
152
  - lib/patches/debug_exceptions.rb
150
153
  - lib/patches/debug_exceptions/patch-5-0.rb
151
154
  - lib/patches/debug_exceptions/patch-5-1.rb
155
+ - lib/patches/mapper.rb
152
156
  - lib/patches/request.rb
153
157
  homepage: https://github.com/inertiajs/inertia-rails
154
158
  licenses:
@@ -172,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
176
  - !ruby/object:Gem::Version
173
177
  version: '0'
174
178
  requirements: []
175
- rubygems_version: 3.0.3
179
+ rubygems_version: 3.1.4
176
180
  signing_key:
177
181
  specification_version: 4
178
182
  summary: Inertia adapter for Rails