view_component_reflex 3.3.4 → 3.3.6

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.
@@ -1,56 +1,56 @@
1
- ##
2
- # This adapter exists solely to allow switching to dom-based state storage, even
3
- # though dom-based state storage doesn't abide by the same standards as the other adapters
4
- #
5
- # The dom-based state storage is handled by the Dom::Component and Dom::Reflex modules that are prepended
6
- # to Component and Reflex in Engine, if the dom adapter is selected
7
- #
8
- # These modules override various methods to inject state into the dom, as well as encoding/decoding the state from the dom
9
-
10
- class CurrentState < ActiveSupport::CurrentAttributes
11
- attribute :state
12
- end
13
-
14
- module ViewComponentReflex
15
- module StateAdapter
16
- class Dom < Base
17
- def self.state(request, key)
18
- id = extract_id(request)
19
-
20
- CurrentState.state ||= {}
21
- CurrentState.state[id] ||= {}
22
- CurrentState.state[id][key] ||= {}
23
- end
24
-
25
- def self.set_state(request, _, key, new_state)
26
- new_state.each do |k, v|
27
- state(request, key)[k] = v
28
- end
29
- end
30
-
31
- def self.store_state(request, key, new_state = {})
32
- id = extract_id(request)
33
-
34
- CurrentState.state ||= {}
35
- CurrentState.state[id] ||= {}
36
- CurrentState.state[id][key] = {}
37
-
38
- new_state.each do |k, v|
39
- CurrentState.state[id][key][k] = v
40
- end
41
- end
42
-
43
- def self.extend_component(component)
44
- component.extend ViewComponentReflex::Dom::Component
45
- end
46
-
47
- def self.extend_reflex(reflex)
48
- reflex.extend ViewComponentReflex::Dom::Reflex
49
- end
50
-
51
- def self.wrap_write_async
52
- yield
53
- end
54
- end
55
- end
56
- end
1
+ ##
2
+ # This adapter exists solely to allow switching to dom-based state storage, even
3
+ # though dom-based state storage doesn't abide by the same standards as the other adapters
4
+ #
5
+ # The dom-based state storage is handled by the Dom::Component and Dom::Reflex modules that are prepended
6
+ # to Component and Reflex in Engine, if the dom adapter is selected
7
+ #
8
+ # These modules override various methods to inject state into the dom, as well as encoding/decoding the state from the dom
9
+
10
+ class CurrentState < ActiveSupport::CurrentAttributes
11
+ attribute :state
12
+ end
13
+
14
+ module ViewComponentReflex
15
+ module StateAdapter
16
+ class Dom < Base
17
+ def self.state(request, key)
18
+ id = extract_id(request)
19
+
20
+ CurrentState.state ||= {}
21
+ CurrentState.state[id] ||= {}
22
+ CurrentState.state[id][key] ||= {}
23
+ end
24
+
25
+ def self.set_state(request, _, key, new_state)
26
+ new_state.each do |k, v|
27
+ state(request, key)[k] = v
28
+ end
29
+ end
30
+
31
+ def self.store_state(request, key, new_state = {})
32
+ id = extract_id(request)
33
+
34
+ CurrentState.state ||= {}
35
+ CurrentState.state[id] ||= {}
36
+ CurrentState.state[id][key] = {}
37
+
38
+ new_state.each do |k, v|
39
+ CurrentState.state[id][key][k] = v
40
+ end
41
+ end
42
+
43
+ def self.extend_component(component)
44
+ component.extend ViewComponentReflex::Dom::Component
45
+ end
46
+
47
+ def self.extend_reflex(reflex)
48
+ reflex.extend ViewComponentReflex::Dom::Reflex
49
+ end
50
+
51
+ def self.wrap_write_async
52
+ yield
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,33 +1,33 @@
1
- VIEW_COMPONENT_REFLEX_MEMORY_STATE = {}
2
- module ViewComponentReflex
3
- module StateAdapter
4
- class Memory < Base
5
- def self.state(request, key)
6
- id = extract_id(request)
7
-
8
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[id] ||= {}
9
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key] ||= {}
10
- end
11
-
12
- def self.set_state(request, _, key, new_state)
13
- new_state.each do |k, v|
14
- state(request, key)[k] = v
15
- end
16
- end
17
-
18
- def self.store_state(request, key, new_state = {})
19
- id = extract_id(request)
20
-
21
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[id] ||= {}
22
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key] = {}
23
- new_state.each do |k, v|
24
- VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key][k] = v
25
- end
26
- end
27
-
28
- def self.wrap_write_async
29
- yield
30
- end
31
- end
32
- end
33
- end
1
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE = {}
2
+ module ViewComponentReflex
3
+ module StateAdapter
4
+ class Memory < Base
5
+ def self.state(request, key)
6
+ id = extract_id(request)
7
+
8
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[id] ||= {}
9
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key] ||= {}
10
+ end
11
+
12
+ def self.set_state(request, _, key, new_state)
13
+ new_state.each do |k, v|
14
+ state(request, key)[k] = v
15
+ end
16
+ end
17
+
18
+ def self.store_state(request, key, new_state = {})
19
+ id = extract_id(request)
20
+
21
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[id] ||= {}
22
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key] = {}
23
+ new_state.each do |k, v|
24
+ VIEW_COMPONENT_REFLEX_MEMORY_STATE[id][key][k] = v
25
+ end
26
+ end
27
+
28
+ def self.wrap_write_async
29
+ yield
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,87 +1,87 @@
1
- # A redis based adapter for component_reflex
2
- #
3
- # ViewComponentReflex::Engine.configure do |config|
4
- # config.state_adapter = ViewComponentReflex::StateAdapter::Redis.new(
5
- # redis_opts: {
6
- # url: "redis://localhost:6379/1", driver: :hiredis
7
- # },
8
- # ttl: 3600)
9
- # end
10
-
11
- module ViewComponentReflex
12
- module StateAdapter
13
- class Redis < Base
14
- attr_reader :ttl
15
- attr_accessor :client
16
-
17
- def initialize(redis_opts:, ttl: 3600)
18
- @client = ::Redis.new(redis_opts)
19
- @ttl = ttl
20
- end
21
-
22
- def state(request, key)
23
- cache_key = get_key(request, key)
24
- value = client.hgetall(cache_key)
25
-
26
- return {} if value.nil?
27
-
28
- value.map do |k, v|
29
- [k, Marshal.load(v)]
30
- end.to_h
31
- end
32
-
33
- def set_state(request, _, key, new_state)
34
- cache_key = get_key(request, key)
35
- save_to_redis(cache_key, new_state)
36
- end
37
-
38
- def store_state(request, key, new_state = {})
39
- cache_key = get_key(request, key)
40
- optimized_store_to_redis(cache_key, new_state, request)
41
- end
42
-
43
- def wrap_write_async
44
- client.pipelined do |pipeline|
45
- original_client = client
46
- @client = pipeline
47
- yield
48
- @client = original_client
49
- end
50
- end
51
-
52
- def extend_component(_)
53
- #stub
54
- end
55
-
56
- def extend_reflex(_)
57
- #stub
58
- end
59
-
60
- private
61
-
62
- # Reduce number of calls coming from #store_state to save Redis
63
- # when it's first rendered
64
- def optimized_store_to_redis(cache_key, new_state, request)
65
- request.env["CACHE_REDIS_REFLEX"] ||= []
66
- return if request.env["CACHE_REDIS_REFLEX"].include?(cache_key)
67
- request.env["CACHE_REDIS_REFLEX"].push(cache_key)
68
-
69
- save_to_redis(cache_key, new_state)
70
- end
71
-
72
- def save_to_redis(cache_key, new_state)
73
- new_state_json = new_state.map do |k, v|
74
- [k, Marshal.dump(v)]
75
- end
76
-
77
- client.hmset(cache_key, new_state_json.flatten)
78
- client.expire(cache_key, ttl)
79
- end
80
-
81
- def get_key(request, key)
82
- id = Redis.extract_id(request)
83
- "#{id}_#{key}_session_reflex_redis"
84
- end
85
- end
86
- end
87
- end
1
+ # A redis based adapter for component_reflex
2
+ #
3
+ # ViewComponentReflex::Engine.configure do |config|
4
+ # config.state_adapter = ViewComponentReflex::StateAdapter::Redis.new(
5
+ # redis_opts: {
6
+ # url: "redis://localhost:6379/1", driver: :hiredis
7
+ # },
8
+ # ttl: 3600)
9
+ # end
10
+
11
+ module ViewComponentReflex
12
+ module StateAdapter
13
+ class Redis < Base
14
+ attr_reader :ttl
15
+ attr_accessor :client
16
+
17
+ def initialize(redis_opts:, ttl: 3600)
18
+ @client = ::Redis.new(redis_opts)
19
+ @ttl = ttl
20
+ end
21
+
22
+ def state(request, key)
23
+ cache_key = get_key(request, key)
24
+ value = client.hgetall(cache_key)
25
+
26
+ return {} if value.nil?
27
+
28
+ value.map do |k, v|
29
+ [k, Marshal.load(v)]
30
+ end.to_h
31
+ end
32
+
33
+ def set_state(request, _, key, new_state)
34
+ cache_key = get_key(request, key)
35
+ save_to_redis(cache_key, new_state)
36
+ end
37
+
38
+ def store_state(request, key, new_state = {})
39
+ cache_key = get_key(request, key)
40
+ optimized_store_to_redis(cache_key, new_state, request)
41
+ end
42
+
43
+ def wrap_write_async
44
+ client.pipelined do |pipeline|
45
+ original_client = client
46
+ @client = pipeline
47
+ yield
48
+ @client = original_client
49
+ end
50
+ end
51
+
52
+ def extend_component(_)
53
+ #stub
54
+ end
55
+
56
+ def extend_reflex(_)
57
+ #stub
58
+ end
59
+
60
+ private
61
+
62
+ # Reduce number of calls coming from #store_state to save Redis
63
+ # when it's first rendered
64
+ def optimized_store_to_redis(cache_key, new_state, request)
65
+ request.env["CACHE_REDIS_REFLEX"] ||= []
66
+ return if request.env["CACHE_REDIS_REFLEX"].include?(cache_key)
67
+ request.env["CACHE_REDIS_REFLEX"].push(cache_key)
68
+
69
+ save_to_redis(cache_key, new_state)
70
+ end
71
+
72
+ def save_to_redis(cache_key, new_state)
73
+ new_state_json = new_state.map do |k, v|
74
+ [k, Marshal.dump(v)]
75
+ end
76
+
77
+ client.hmset(cache_key, new_state_json.flatten)
78
+ client.expire(cache_key, ttl)
79
+ end
80
+
81
+ def get_key(request, key)
82
+ id = Redis.extract_id(request)
83
+ "#{id}_#{key}_session_reflex_redis"
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,28 +1,28 @@
1
- module ViewComponentReflex
2
- module StateAdapter
3
- class Session < Base
4
- def self.state(request, key)
5
- request.session[key] ||= {}
6
- end
7
-
8
- def self.set_state(request, controller, key, new_state)
9
- new_state.each do |k, v|
10
- state(request, key)[k] = v
11
- end
12
- store = request.session.instance_variable_get("@by")
13
- store.commit_session request, controller.response
14
- end
15
-
16
- def self.store_state(request, key, new_state = {})
17
- request.session[key] = {}
18
- new_state.each do |k, v|
19
- request.session[key][k] = v
20
- end
21
- end
22
-
23
- def self.wrap_write_async
24
- yield
25
- end
26
- end
27
- end
28
- end
1
+ module ViewComponentReflex
2
+ module StateAdapter
3
+ class Session < Base
4
+ def self.state(request, key)
5
+ request.session[key] ||= {}
6
+ end
7
+
8
+ def self.set_state(request, controller, key, new_state)
9
+ new_state.each do |k, v|
10
+ state(request, key)[k] = v
11
+ end
12
+ store = request.session.instance_variable_get("@by")
13
+ store.commit_session request, controller.response
14
+ end
15
+
16
+ def self.store_state(request, key, new_state = {})
17
+ request.session[key] = {}
18
+ new_state.each do |k, v|
19
+ request.session[key][k] = v
20
+ end
21
+ end
22
+
23
+ def self.wrap_write_async
24
+ yield
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,3 +1,3 @@
1
- module ViewComponentReflex
2
- VERSION = '3.3.4'
3
- end
1
+ module ViewComponentReflex
2
+ VERSION = '3.3.6'
3
+ end
@@ -1,22 +1,22 @@
1
- require "stimulus_reflex"
2
- require "active_support/dependencies/autoload"
3
- require "view_component_reflex/state_adapter/base"
4
- require "view_component_reflex/state_adapter/session"
5
- require "view_component_reflex/state_adapter/memory"
6
- require "view_component_reflex/state_adapter/dom"
7
- require "view_component_reflex/state_adapter/redis"
8
- require "view_component_reflex/dom/verifier"
9
- require "view_component_reflex/dom/reflex"
10
- require "view_component_reflex/dom/component"
11
-
12
-
13
-
14
- module ViewComponentReflex
15
- extend ActiveSupport::Autoload
16
-
17
- autoload :ReflexFactory
18
- autoload :Reflex
19
- autoload :Component
20
- end
21
-
22
- require "view_component_reflex/engine"
1
+ require "stimulus_reflex"
2
+ require "active_support/dependencies/autoload"
3
+ require "view_component_reflex/state_adapter/base"
4
+ require "view_component_reflex/state_adapter/session"
5
+ require "view_component_reflex/state_adapter/memory"
6
+ require "view_component_reflex/state_adapter/dom"
7
+ require "view_component_reflex/state_adapter/redis"
8
+ require "view_component_reflex/dom/verifier"
9
+ require "view_component_reflex/dom/reflex"
10
+ require "view_component_reflex/dom/component"
11
+
12
+
13
+
14
+ module ViewComponentReflex
15
+ extend ActiveSupport::Autoload
16
+
17
+ autoload :ReflexFactory
18
+ autoload :Reflex
19
+ autoload :Component
20
+ end
21
+
22
+ require "view_component_reflex/engine"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_component_reflex
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.4
4
+ version: 3.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua LeBlanc
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-12 00:00:00.000000000 Z
11
+ date: 2025-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '5.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '8.0'
22
+ version: '9.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '5.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '8.0'
32
+ version: '9.0'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: stimulus_reflex
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +101,7 @@ licenses:
101
101
  - MIT
102
102
  metadata:
103
103
  allowed_push_host: https://rubygems.org
104
- post_install_message:
104
+ post_install_message:
105
105
  rdoc_options: []
106
106
  require_paths:
107
107
  - lib
@@ -116,8 +116,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  requirements: []
119
- rubygems_version: 3.5.6
120
- signing_key:
119
+ rubygems_version: 3.5.16
120
+ signing_key:
121
121
  specification_version: 4
122
122
  summary: Allow stimulus reflexes in a view component
123
123
  test_files: []