bp3-request_state 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d89a2dba8a730e34a86bd5712f1b673bb3be432e179e20f1ee1daf79c017f939
4
+ data.tar.gz: 9ffefdfe6cc331637ff093dd2bfb422b86a0f4caaf16d56c64b3e95741df2e0c
5
+ SHA512:
6
+ metadata.gz: 1b0c29af713260d43e75a88472c1941e92f151f867570d1bd338a44d2dc963299a52bbcfaaada963b71c585e98aa1b815b970af0a568e095aceb5f6620f9e45d
7
+ data.tar.gz: 6e08dc1fcd0d0340ed04be8b3827dede51104867230902734a8cf925db7b4ac6e3e4559f979e7efe3573709a873bdedbb8e95c50065224fde2c3ba5a5fefc841
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,37 @@
1
+ require:
2
+ - rubocop-rake
3
+ - rubocop-rspec
4
+ - rubocop-capybara
5
+ - rubocop-factory_bot
6
+
7
+ AllCops:
8
+ TargetRubyVersion: 3.2.2
9
+ NewCops: enable
10
+
11
+ Gemspec/DevelopmentDependencies:
12
+ EnforcedStyle: gemspec
13
+
14
+ Metrics/AbcSize:
15
+ Max: 26
16
+
17
+ Metrics/CyclomaticComplexity:
18
+ Max: 10
19
+
20
+ Metrics/MethodLength:
21
+ Max: 15
22
+
23
+ Metrics/PerceivedComplexity:
24
+ Max: 10
25
+
26
+ Naming/FileName:
27
+ Exclude:
28
+ - lib/bp3-request_state.rb
29
+
30
+ RSpec/ExampleLength:
31
+ Max: 10
32
+
33
+ RSpec/MultipleExpectations:
34
+ Max: 4
35
+
36
+ Style/Documentation:
37
+ Enabled: false
data/.yardopts ADDED
@@ -0,0 +1,8 @@
1
+ --charset utf-8
2
+ --readme README.md
3
+ --markup markdown
4
+ --title "bp3-request_state"
5
+ --private
6
+ -
7
+ CHANGELOG.md
8
+ LICENSE.txt
data/CHANGELOG.md ADDED
@@ -0,0 +1,9 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.1] - 2024-05-31
4
+
5
+ - Tweaks and documentation
6
+
7
+ ## [0.1.0] - 2023-12-21
8
+
9
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in bp3-request_state.gemspec
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,139 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ bp3-request_state (0.1.1)
5
+ actionpack (>= 7.1.2, < 8)
6
+ activesupport (>= 7.1.2, < 8)
7
+ request_store (>= 1.5.1, < 2)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionpack (7.1.3)
13
+ actionview (= 7.1.3)
14
+ activesupport (= 7.1.3)
15
+ nokogiri (>= 1.8.5)
16
+ racc
17
+ rack (>= 2.2.4)
18
+ rack-session (>= 1.0.1)
19
+ rack-test (>= 0.6.3)
20
+ rails-dom-testing (~> 2.2)
21
+ rails-html-sanitizer (~> 1.6)
22
+ actionview (7.1.3)
23
+ activesupport (= 7.1.3)
24
+ builder (~> 3.1)
25
+ erubi (~> 1.11)
26
+ rails-dom-testing (~> 2.2)
27
+ rails-html-sanitizer (~> 1.6)
28
+ activesupport (7.1.3)
29
+ base64
30
+ bigdecimal
31
+ concurrent-ruby (~> 1.0, >= 1.0.2)
32
+ connection_pool (>= 2.2.5)
33
+ drb
34
+ i18n (>= 1.6, < 2)
35
+ minitest (>= 5.1)
36
+ mutex_m
37
+ tzinfo (~> 2.0)
38
+ ast (2.4.2)
39
+ base64 (0.2.0)
40
+ bigdecimal (3.1.6)
41
+ builder (3.2.4)
42
+ byebug (11.1.3)
43
+ concurrent-ruby (1.2.3)
44
+ connection_pool (2.4.1)
45
+ crass (1.0.6)
46
+ diff-lcs (1.5.0)
47
+ drb (2.2.0)
48
+ ruby2_keywords
49
+ erubi (1.12.0)
50
+ i18n (1.14.1)
51
+ concurrent-ruby (~> 1.0)
52
+ json (2.7.1)
53
+ language_server-protocol (3.17.0.3)
54
+ loofah (2.22.0)
55
+ crass (~> 1.0.2)
56
+ nokogiri (>= 1.12.0)
57
+ minitest (5.21.2)
58
+ mutex_m (0.2.0)
59
+ nokogiri (1.16.0-x86_64-darwin)
60
+ racc (~> 1.4)
61
+ parallel (1.24.0)
62
+ parser (3.3.0.4)
63
+ ast (~> 2.4.1)
64
+ racc
65
+ racc (1.7.3)
66
+ rack (3.0.8)
67
+ rack-session (2.0.0)
68
+ rack (>= 3.0.0)
69
+ rack-test (2.1.0)
70
+ rack (>= 1.3)
71
+ rails-dom-testing (2.2.0)
72
+ activesupport (>= 5.0.0)
73
+ minitest
74
+ nokogiri (>= 1.6)
75
+ rails-html-sanitizer (1.6.0)
76
+ loofah (~> 2.21)
77
+ nokogiri (~> 1.14)
78
+ rainbow (3.1.1)
79
+ rake (13.1.0)
80
+ regexp_parser (2.9.0)
81
+ request_store (1.5.1)
82
+ rack (>= 1.4)
83
+ rexml (3.2.6)
84
+ rspec (3.12.0)
85
+ rspec-core (~> 3.12.0)
86
+ rspec-expectations (~> 3.12.0)
87
+ rspec-mocks (~> 3.12.0)
88
+ rspec-core (3.12.2)
89
+ rspec-support (~> 3.12.0)
90
+ rspec-expectations (3.12.3)
91
+ diff-lcs (>= 1.2.0, < 2.0)
92
+ rspec-support (~> 3.12.0)
93
+ rspec-mocks (3.12.6)
94
+ diff-lcs (>= 1.2.0, < 2.0)
95
+ rspec-support (~> 3.12.0)
96
+ rspec-support (3.12.1)
97
+ rubocop (1.60.1)
98
+ json (~> 2.3)
99
+ language_server-protocol (>= 3.17.0)
100
+ parallel (~> 1.10)
101
+ parser (>= 3.3.0.2)
102
+ rainbow (>= 2.2.2, < 4.0)
103
+ regexp_parser (>= 1.8, < 3.0)
104
+ rexml (>= 3.2.5, < 4.0)
105
+ rubocop-ast (>= 1.30.0, < 2.0)
106
+ ruby-progressbar (~> 1.7)
107
+ unicode-display_width (>= 2.4.0, < 3.0)
108
+ rubocop-ast (1.30.0)
109
+ parser (>= 3.2.1.0)
110
+ rubocop-capybara (2.20.0)
111
+ rubocop (~> 1.41)
112
+ rubocop-factory_bot (2.25.1)
113
+ rubocop (~> 1.41)
114
+ rubocop-rake (0.6.0)
115
+ rubocop (~> 1.0)
116
+ rubocop-rspec (2.26.1)
117
+ rubocop (~> 1.40)
118
+ rubocop-capybara (~> 2.17)
119
+ rubocop-factory_bot (~> 2.22)
120
+ ruby-progressbar (1.13.0)
121
+ ruby2_keywords (0.0.5)
122
+ tzinfo (2.0.6)
123
+ concurrent-ruby (~> 1.0)
124
+ unicode-display_width (2.5.0)
125
+
126
+ PLATFORMS
127
+ x86_64-darwin-22
128
+
129
+ DEPENDENCIES
130
+ bp3-request_state!
131
+ byebug
132
+ rake (~> 13.0)
133
+ rspec (~> 3.0)
134
+ rubocop (~> 1.21)
135
+ rubocop-rake (~> 0.6)
136
+ rubocop-rspec (~> 2.25)
137
+
138
+ BUNDLED WITH
139
+ 2.4.22
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023-2024 Wim den Braven
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # Bp3::RequestState
2
+
3
+ bp3-action_dispatch provides the `Bp3::RequestState::Base` class for BP3, the persuavis/black_phoebe_3
4
+ multi-site multi-tenant rails application.
5
+
6
+ `Bp3::RequestState::Base` can be used to store global state per request, or per background job.
7
+ It keeps state per thread and is supposed to be thread safe.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'bp3-request_state'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle install
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install bp3-request_state
24
+
25
+ ## Usage
26
+
27
+ In your app, create a model or service that inherits from `Bp3::Request::State`, and
28
+ specify
29
+ - `hash_key_map`, mapping members of the global state to their class,
30
+ - `base_attrs`, defining the list of global state member objects, and
31
+ - `hash_attrs`, defining the list of members of the global state hash.
32
+ Override `.with_current` as needed.
33
+
34
+ Here is an example from BP3:
35
+ ```ruby
36
+ class GlobalRequestState < Bp3::RequestState::Base
37
+ self.hash_key_map =
38
+ {
39
+ target_site: 'Sites::Site',
40
+ target_tenant: 'Tenant',
41
+ target_workspace: 'Workspaces::Workspace',
42
+ current_site: 'Sites::Site',
43
+ current_tenant: 'Tenant',
44
+ current_workspace: 'Workspaces::Workspace',
45
+ current_user: 'Users::User',
46
+ current_admin: 'Sites::Admin',
47
+ current_root: 'Root',
48
+ current_visitor: 'Users::Visitor'
49
+ }.freeze
50
+
51
+ self.base_attrs =
52
+ %w[inbound_request
53
+ current_site current_workspace current_tenant
54
+ current_user current_admin current_root current_visitor
55
+ target_site target_tenant target_workspace
56
+ locale view_context].freeze
57
+
58
+ self.hash_attrs = (base_attrs - %w[locale view_context]).map { |a| "#{a}_id" }
59
+
60
+ define_accessors
61
+
62
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/ParameterLists
63
+ def self.with_current(site:, tenant: nil, workspace: nil,
64
+ visitor: nil, login: nil,
65
+ request_id: nil, inbound_request: nil)
66
+ # do NOT store the original in *RequestStore*, as it gets cleared after each request and each que job!!!
67
+ Thread.current[:bp3_original_request_state] = current
68
+ # super
69
+ clear!
70
+ self.request_id = request_id || inbound_request&.rqid
71
+ self.inbound_request = inbound_request if inbound_request
72
+ self.current_visitor = visitor
73
+ self.current_site = site
74
+ self.current_tenant = tenant || site.default_tenant
75
+ self.current_workspace = workspace || site.default_workspace
76
+ case login
77
+ when Root
78
+ self.current_root = login
79
+ when Sites::Admin
80
+ self.current_admin = login
81
+ when Users::User
82
+ self.current_user = login
83
+ end
84
+ yield if block_given?
85
+ ensure
86
+ RequestStore.write(:bp3_request_state, Thread.current[:bp3_original_request_state])
87
+ Thread.current[:bp3_original_request_state] = nil
88
+ end
89
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/ParameterLists
90
+ end
91
+ ```
92
+
93
+ You can then
94
+ - set global state members: `GlobalRequestState.current_site = current_site`
95
+ - access the global state: `GlobalRequestState.current`
96
+ - get the global state hash: `GlobalRequestState.to_hash`
97
+ - reset the global state: `GlobalRequestState.clear!`
98
+
99
+ ## Development
100
+
101
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec`
102
+ to run the tests. You can also run `bin/console` for an interactive prompt that will allow
103
+ you to experiment.
104
+
105
+ To install this gem onto your local machine, run `rake install`. To release a new version,
106
+ update the version number in `version.rb`, and then run `rake release`, which will create
107
+ a git tag for the version, push git commits and the created tag, and push the `.gem` file
108
+ to [rubygems.org](https://rubygems.org).
109
+
110
+ ## Testing
111
+ Run `rake` to run rspec tests and rubocop linting.
112
+
113
+ ## Documentation
114
+ A `.yardopts` file is provided to support yard documentation.
115
+
116
+ ## License
117
+
118
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require 'rubocop/rake_task'
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/bp3/request_state/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'bp3-request_state'
7
+ spec.version = Bp3::RequestState::VERSION
8
+ spec.authors = ['Wim den Braven']
9
+ spec.email = ['wimdenbraven@persuavis.com']
10
+
11
+ spec.summary = 'bp3-request_state provides the Bp3::RequestState::Base class for BP3 (persuavis/black_phoebe_3).'
12
+ # spec.description = "TODO: Write a longer description or delete this line."
13
+ spec.homepage = 'https://www.black-phoebe.com'
14
+ spec.license = 'MIT'
15
+ spec.required_ruby_version = '>= 3.2.0'
16
+
17
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
18
+
19
+ spec.metadata['homepage_uri'] = spec.homepage
20
+ spec.metadata['source_code_uri'] = 'https://github.com/persuavis/bp3-request_state'
21
+ spec.metadata['changelog_uri'] = 'https://github.com/persuavis/bp3-request_state/blob/main/CHANGELOG.md'
22
+
23
+ # Specify which files should be added to the gem when it is released.
24
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
+ `git ls-files -z`.split("\x0").reject do |f|
27
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
28
+ end
29
+ end
30
+ spec.bindir = 'exe'
31
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ['lib']
33
+
34
+ spec.add_dependency 'actionpack', ['>= 7.1.2', '< 8']
35
+ spec.add_dependency 'activesupport', ['>= 7.1.2', '< 8']
36
+ spec.add_dependency 'request_store', ['>= 1.5.1', '< 2']
37
+
38
+ spec.add_development_dependency 'byebug'
39
+ spec.add_development_dependency 'rake', '~> 13.0'
40
+ spec.add_development_dependency 'rspec', '~> 3.0'
41
+ spec.add_development_dependency 'rubocop', '~> 1.21'
42
+ spec.add_development_dependency 'rubocop-rake', '~> 0.6'
43
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.25'
44
+
45
+ # For more information and examples about making a new gem, check out our
46
+ # guide at: https://bundler.io/guides/creating_gem.html
47
+ spec.metadata['rubygems_mfa_required'] = 'true'
48
+ end
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_store'
4
+ require 'active_support'
5
+ require 'active_support/core_ext/date'
6
+ require 'active_support/core_ext/time'
7
+ require 'active_support/core_ext/date_time'
8
+ require 'active_support/core_ext/object'
9
+ require 'forwardable'
10
+ require 'ostruct'
11
+
12
+ module Bp3
13
+ module RequestState
14
+ # rubocop:disable Metrics/ClassLength, Style/ClassVars
15
+ class Base
16
+ extend Forwardable
17
+ cattr_accessor :hash_key_map, :base_attrs, :hash_attrs
18
+
19
+ @@hash_key_map =
20
+ { current_site: 'Site',
21
+ current_tenant: 'Tenant',
22
+ current_workspace: 'Workspace',
23
+ current_user: 'User',
24
+ current_admin: 'Admin',
25
+ current_root: 'Root',
26
+ current_visitor: 'Visitor' }.freeze
27
+
28
+ @@base_attrs =
29
+ %w[current_site current_tenant current_workspace
30
+ current_user current_admin current_root current_visitor
31
+ locale view_context].freeze
32
+
33
+ @@hash_attrs =
34
+ %w[current_site_id current_tenant_id current_workspace_id
35
+ current_user_id current_admin_id current_root_id current_visitor_id].freeze
36
+
37
+ def self.clear!
38
+ RequestStore.delete(:bp3_request_state)
39
+ end
40
+
41
+ def self.current
42
+ RequestStore.fetch(:bp3_request_state) do
43
+ { started: DateTime.current }
44
+ end
45
+ end
46
+
47
+ def self.with_current(site:, tenant: nil, workspace: nil)
48
+ clear!
49
+ self.current_site = site
50
+ self.current_tenant = tenant || site.default_tenant
51
+ self.current_workspace = workspace || site.default_workspace
52
+ yield if block_given?
53
+ end
54
+
55
+ def self.to_hash
56
+ {
57
+ request_id:,
58
+ started_string: started.utc.to_s,
59
+ locale: locale&.to_s
60
+ }.tap do |hash|
61
+ hash_attrs.each do |id_attr|
62
+ attr = id_attr.gsub('_id', '')
63
+ hash[id_attr] = send(id_attr) if respond_to?(attr)
64
+ end
65
+ end.stringify_keys
66
+ end
67
+
68
+ def self.define_accessors
69
+ base_attrs.each do |attr|
70
+ define_accessors_for_one_attr(attr)
71
+ end
72
+
73
+ # current_login picks one of the logged-in user, site-admin or root.
74
+ # pick the one with least privileges first
75
+ define_singleton_method :current_login do
76
+ current_user || current_admin || current_root
77
+ end
78
+ define_method :current_login do
79
+ current_user || current_admin || current_root
80
+ end
81
+
82
+ define_singleton_method :highest_privilege do
83
+ # do not include current_visitor, as they are not logged in
84
+ current_root || current_admin || current_user # || current_visitor
85
+ end
86
+ define_method :highest_privilege do
87
+ # do not include current_visitor, as they are not logged in
88
+ current_root || current_admin || current_user # || current_visitor
89
+ end
90
+ end
91
+
92
+ def self.from_hash(hash)
93
+ state = OpenStruct.new(hash) # rubocop:disable Style/OpenStructUse
94
+ fill_from_map(state)
95
+ fill_details(state)
96
+ self
97
+ end
98
+
99
+ def self.fill_from_map(state)
100
+ hash_key_map.each_key do |attr|
101
+ attr_with_id = "#{attr}_id"
102
+ fill_one_from_map(attr.to_sym, state.send(attr_with_id)) if state.send(attr_with_id)
103
+ end
104
+ end
105
+
106
+ def self.fill_one_from_map(attr, id)
107
+ klass = hash_key_map[attr.to_sym]&.constantize
108
+ writer = "#{attr}="
109
+ send(writer, klass.find_by(id:))
110
+ end
111
+
112
+ def self.fill_details(state)
113
+ self.request_id = state.request_id if state.request_id
114
+ self.started = state.started_string.present? ? DateTime.parse(state.started_string) : nil
115
+ self.locale = state.locale&.to_sym
116
+ end
117
+
118
+ def self.either_site
119
+ target_site || current_site
120
+ end
121
+ def_delegator self, :either_site
122
+
123
+ def self.either_site_id
124
+ target_site_id || current_site_id
125
+ end
126
+
127
+ def self.either_tenant
128
+ target_tenant || current_tenant
129
+ end
130
+ def_delegator self, :either_tenant
131
+
132
+ def self.either_tenant_id
133
+ target_tenant_id || current_tenant_id
134
+ end
135
+
136
+ def self.either_workspace
137
+ target_workspace || current_workspace
138
+ end
139
+ def_delegator self, :either_workspace
140
+
141
+ def self.either_workspace_id
142
+ target_workspace_id || current_workspace_id
143
+ end
144
+
145
+ def self.either_admin
146
+ current_root || current_admin
147
+ end
148
+ def_delegator self, :either_admin
149
+
150
+ def self.duration
151
+ (now - started) * 1.day # in seconds
152
+ end
153
+ def_delegator self, :duration
154
+
155
+ def self.now
156
+ DateTime.current
157
+ end
158
+ def_delegator self, :now
159
+
160
+ def self.started
161
+ current[:started] || now
162
+ end
163
+ def_delegator self, :started
164
+
165
+ def self.started=(time)
166
+ current[:started] = time || now
167
+ end
168
+
169
+ def self.request_id
170
+ current[:request_id]
171
+ end
172
+ def_delegator self, :request_id
173
+
174
+ def self.request_id=(rqid)
175
+ current[:request_id] = rqid
176
+ end
177
+
178
+ def self.define_accessors_for_one_attr(attr)
179
+ define_getter(attr)
180
+ define_setter(attr)
181
+ define_id_getter(attr)
182
+ define_id_setter(attr)
183
+ define_method(attr) do
184
+ self.class.current[attr.to_sym]
185
+ end
186
+ end
187
+
188
+ def self.define_getter(attr)
189
+ define_singleton_method(attr) do
190
+ current[attr.to_sym]
191
+ end
192
+ end
193
+
194
+ def self.define_setter(attr)
195
+ define_singleton_method("#{attr}=") do |obj|
196
+ current[attr.to_sym] = obj
197
+ end
198
+ end
199
+
200
+ def self.define_id_getter(attr)
201
+ define_singleton_method("#{attr}_id") do
202
+ current[attr.to_sym]&.id
203
+ end
204
+ end
205
+
206
+ def self.define_id_setter(attr)
207
+ define_singleton_method("#{attr}_id=") do |id|
208
+ current[attr.to_sym] = fill_one_from_map(attr.to_sym, id)
209
+ end
210
+ end
211
+ end
212
+ # rubocop:enable Metrics/ClassLength, Style/ClassVars
213
+ end
214
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bp3
4
+ module RequestState
5
+ class Site
6
+ attr_reader :id
7
+
8
+ def initialize(id)
9
+ @id = id
10
+ end
11
+
12
+ def self.find_by(id:)
13
+ new(id)
14
+ end
15
+
16
+ def ==(other)
17
+ id == other.id
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bp3
4
+ module RequestState
5
+ class Test < Base
6
+ self.hash_key_map =
7
+ {
8
+ target_site: 'Bp3::RequestState::Site',
9
+ current_site: 'Bp3::RequestState::Site'
10
+ }.freeze
11
+
12
+ self.base_attrs =
13
+ %w[current_site target_site locale view_context].freeze
14
+
15
+ self.hash_attrs = (base_attrs - %w[locale view_context]).map { |a| "#{a}_id" }
16
+
17
+ define_accessors
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bp3
4
+ module RequestState
5
+ VERSION = '0.1.1'
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_state/base'
4
+ require_relative 'request_state/version'
5
+
6
+ module Bp3
7
+ module RequestState
8
+ class Error < StandardError; end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bp3/request_state'
@@ -0,0 +1,6 @@
1
+ module Bp3
2
+ module RequestState
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
metadata ADDED
@@ -0,0 +1,209 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bp3-request_state
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Wim den Braven
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 7.1.2
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '8'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 7.1.2
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '8'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 7.1.2
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '8'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 7.1.2
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '8'
53
+ - !ruby/object:Gem::Dependency
54
+ name: request_store
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.5.1
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: 1.5.1
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2'
73
+ - !ruby/object:Gem::Dependency
74
+ name: byebug
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ type: :development
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ - !ruby/object:Gem::Dependency
88
+ name: rake
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '13.0'
94
+ type: :development
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '13.0'
101
+ - !ruby/object:Gem::Dependency
102
+ name: rspec
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '3.0'
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rubocop
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '1.21'
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '1.21'
129
+ - !ruby/object:Gem::Dependency
130
+ name: rubocop-rake
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '0.6'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '0.6'
143
+ - !ruby/object:Gem::Dependency
144
+ name: rubocop-rspec
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '2.25'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '2.25'
157
+ description:
158
+ email:
159
+ - wimdenbraven@persuavis.com
160
+ executables: []
161
+ extensions: []
162
+ extra_rdoc_files: []
163
+ files:
164
+ - ".rspec"
165
+ - ".rubocop.yml"
166
+ - ".yardopts"
167
+ - CHANGELOG.md
168
+ - Gemfile
169
+ - Gemfile.lock
170
+ - LICENSE.txt
171
+ - README.md
172
+ - Rakefile
173
+ - bp3-request_state.gemspec
174
+ - lib/bp3-request_state.rb
175
+ - lib/bp3/request_state.rb
176
+ - lib/bp3/request_state/base.rb
177
+ - lib/bp3/request_state/site.rb
178
+ - lib/bp3/request_state/test.rb
179
+ - lib/bp3/request_state/version.rb
180
+ - sig/bp3/request_state.rbs
181
+ homepage: https://www.black-phoebe.com
182
+ licenses:
183
+ - MIT
184
+ metadata:
185
+ allowed_push_host: https://rubygems.org
186
+ homepage_uri: https://www.black-phoebe.com
187
+ source_code_uri: https://github.com/persuavis/bp3-request_state
188
+ changelog_uri: https://github.com/persuavis/bp3-request_state/blob/main/CHANGELOG.md
189
+ rubygems_mfa_required: 'true'
190
+ post_install_message:
191
+ rdoc_options: []
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: 3.2.0
199
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ requirements: []
205
+ rubygems_version: 3.5.11
206
+ signing_key:
207
+ specification_version: 4
208
+ summary: bp3-request_state provides the Bp3::RequestState::Base class for BP3 (persuavis/black_phoebe_3).
209
+ test_files: []