view_component_reflex 3.3.5 → 3.3.7

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.5'
3
- end
1
+ module ViewComponentReflex
2
+ VERSION = '3.3.7'
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,13 +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.5
4
+ version: 3.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua LeBlanc
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 2024-12-24 00:00:00.000000000 Z
11
+ date: 2025-05-26 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: rails
@@ -100,6 +101,7 @@ licenses:
100
101
  - MIT
101
102
  metadata:
102
103
  allowed_push_host: https://rubygems.org
104
+ post_install_message:
103
105
  rdoc_options: []
104
106
  require_paths:
105
107
  - lib
@@ -114,7 +116,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
116
  - !ruby/object:Gem::Version
115
117
  version: '0'
116
118
  requirements: []
117
- rubygems_version: 3.6.2
119
+ rubygems_version: 3.5.16
120
+ signing_key:
118
121
  specification_version: 4
119
122
  summary: Allow stimulus reflexes in a view component
120
123
  test_files: []