request_store 1.4.0 → 1.7.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 +5 -5
- data/.github/workflows/ci.yml +33 -0
- data/Gemfile +9 -0
- data/README.md +11 -1
- data/lib/request_store/middleware.rb +6 -2
- data/lib/request_store/version.rb +1 -1
- data/lib/request_store.rb +5 -1
- data/request_store.gemspec +2 -3
- data/test/middleware_test.rb +36 -0
- data/test/request_store_test.rb +7 -0
- data/test/test_helper.rb +16 -0
- metadata +9 -10
- data/.travis.yml +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c9883603b6fb82a3e39d90b6e7509911f3813160d2fe267ad892536305c5d741
|
4
|
+
data.tar.gz: 437805cfcdfc5bc8c3c59bafe9d12bf4ae3ba1685e5261ca40dfce79f7cee845
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb19a5818c773c1e27ee3b1c215d1422bdabecf7929eaf235db48364c0a0f05467203c4c3b651ce9470c6d51f412d1f7d54e0c5043d44f0c2744d22a0e28d727
|
7
|
+
data.tar.gz: b0a56bde2842cecf4b291622e332130bed3c175d649f0659024594e4d38a49309a6e1ad40171afc6ee368045e98a93e6c8aa1c56f1235ed50d38d3197298e570
|
@@ -0,0 +1,33 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
pull_request:
|
5
|
+
|
6
|
+
push:
|
7
|
+
branches: [master]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby:
|
15
|
+
- '3.0'
|
16
|
+
- 3.1
|
17
|
+
- 3.2
|
18
|
+
- 3.3
|
19
|
+
- ruby-head
|
20
|
+
- jruby-9.1
|
21
|
+
- jruby-9.2
|
22
|
+
- jruby-9.3
|
23
|
+
- jruby-head
|
24
|
+
- truffleruby-head
|
25
|
+
|
26
|
+
steps:
|
27
|
+
- uses: actions/checkout@v4
|
28
|
+
- uses: ruby/setup-ruby@v1
|
29
|
+
with:
|
30
|
+
ruby-version: ${{ matrix.ruby }}
|
31
|
+
bundler-cache: true # 'bundle install' and cache
|
32
|
+
- name: Test
|
33
|
+
run: bundle exec rake
|
data/Gemfile
CHANGED
@@ -2,3 +2,12 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in request_store.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
case Gem::Version.new(RUBY_VERSION.dup)
|
7
|
+
when ->(ruby_version) { ruby_version >= Gem::Version.new('2.2.0') }
|
8
|
+
gem 'rake', '~> 13'
|
9
|
+
when ->(ruby_version) { ruby_version >= Gem::Version.new('2.0.0') }
|
10
|
+
gem 'rake', '~> 12.3.3'
|
11
|
+
else
|
12
|
+
gem 'rake', '~> 11'
|
13
|
+
end
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# RequestStore [](https://github.com/steveklabnik/request_store/actions/workflows/ci.yml) [](https://codeclimate.com/github/steveklabnik/request_store)
|
2
2
|
|
3
3
|
Ever needed to use a global variable in Rails? Ugh, that's the worst. If you
|
4
4
|
need global state, you've probably reached for `Thread.current`. Like this:
|
@@ -58,6 +58,16 @@ Yep, everywhere you used `Thread.current` just change it to
|
|
58
58
|
`RequestStore.store`. Now no matter what server you use, you'll get `1` every
|
59
59
|
time: the storage is local to that request.
|
60
60
|
|
61
|
+
### API
|
62
|
+
|
63
|
+
The `fetch` method returns the stored value if it already exists. If no stored value exists, it uses the provided block to add a new stored value.
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
top_posts = RequestStore.fetch(:top_posts) do
|
67
|
+
# code to obtain the top posts
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
61
71
|
### Rails 2 compatibility
|
62
72
|
|
63
73
|
The gem includes a Railtie that will configure everything properly for Rails 3+
|
@@ -16,12 +16,16 @@ module RequestStore
|
|
16
16
|
def call(env)
|
17
17
|
RequestStore.begin!
|
18
18
|
|
19
|
-
|
19
|
+
status, headers, body = @app.call(env)
|
20
20
|
|
21
|
-
|
21
|
+
body = Rack::BodyProxy.new(body) do
|
22
22
|
RequestStore.end!
|
23
23
|
RequestStore.clear!
|
24
24
|
end
|
25
|
+
|
26
|
+
returned = true
|
27
|
+
|
28
|
+
[status, headers, body]
|
25
29
|
ensure
|
26
30
|
unless returned
|
27
31
|
RequestStore.end!
|
data/lib/request_store.rb
CHANGED
@@ -7,6 +7,10 @@ module RequestStore
|
|
7
7
|
Thread.current[:request_store] ||= {}
|
8
8
|
end
|
9
9
|
|
10
|
+
def self.store=(store)
|
11
|
+
Thread.current[:request_store] = store
|
12
|
+
end
|
13
|
+
|
10
14
|
def self.clear!
|
11
15
|
Thread.current[:request_store] = {}
|
12
16
|
end
|
@@ -43,7 +47,7 @@ module RequestStore
|
|
43
47
|
store.key?(key)
|
44
48
|
end
|
45
49
|
|
46
|
-
def self.fetch(key
|
50
|
+
def self.fetch(key)
|
47
51
|
store[key] = yield unless exist?(key)
|
48
52
|
store[key]
|
49
53
|
end
|
data/request_store.gemspec
CHANGED
@@ -10,16 +10,15 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["steve@steveklabnik.com"]
|
11
11
|
gem.description = %q{RequestStore gives you per-request global storage.}
|
12
12
|
gem.summary = %q{RequestStore gives you per-request global storage.}
|
13
|
-
gem.homepage = "
|
13
|
+
gem.homepage = "https://github.com/steveklabnik/request_store"
|
14
14
|
gem.licenses = ["MIT"]
|
15
15
|
|
16
16
|
gem.files = `git ls-files`.split($/)
|
17
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
18
|
gem.require_paths = ["lib"]
|
20
19
|
|
21
20
|
gem.add_dependency "rack", ">= 1.4"
|
22
21
|
|
23
|
-
gem.add_development_dependency "rake"
|
22
|
+
gem.add_development_dependency "rake"
|
24
23
|
gem.add_development_dependency "minitest", "~> 5.0"
|
25
24
|
end
|
data/test/middleware_test.rb
CHANGED
@@ -12,6 +12,7 @@ class MiddlewareTest < Minitest::Test
|
|
12
12
|
def call_middleware(opts = {})
|
13
13
|
_, _, proxy = @middleware.call(opts)
|
14
14
|
proxy.close
|
15
|
+
proxy
|
15
16
|
end
|
16
17
|
|
17
18
|
def test_middleware_resets_store
|
@@ -23,6 +24,17 @@ class MiddlewareTest < Minitest::Test
|
|
23
24
|
assert_equal({}, RequestStore.store)
|
24
25
|
end
|
25
26
|
|
27
|
+
def test_middleware_does_not_mutate_response_and_does_not_overflow_stack
|
28
|
+
10000.times do
|
29
|
+
call_middleware
|
30
|
+
end
|
31
|
+
|
32
|
+
resp = call_middleware
|
33
|
+
assert resp.is_a?(::Rack::BodyProxy)
|
34
|
+
assert_equal ["response"], resp.to_a
|
35
|
+
assert_equal ["response"], resp.instance_variable_get(:@body)
|
36
|
+
end
|
37
|
+
|
26
38
|
def test_middleware_resets_store_on_error
|
27
39
|
e = assert_raises RuntimeError do
|
28
40
|
call_middleware({:error => true})
|
@@ -63,3 +75,27 @@ class MiddlewareTest < Minitest::Test
|
|
63
75
|
refute RequestStore.store[:foo]
|
64
76
|
end
|
65
77
|
end
|
78
|
+
|
79
|
+
class MiddlewareWithConstResponseTest < Minitest::Test
|
80
|
+
def setup
|
81
|
+
@app = RackAppWithConstResponse.new
|
82
|
+
@middleware = RequestStore::Middleware.new(@app)
|
83
|
+
end
|
84
|
+
|
85
|
+
def call_middleware(opts = {})
|
86
|
+
_, _, proxy = @middleware.call(opts)
|
87
|
+
proxy.close
|
88
|
+
proxy
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_middleware_does_not_mutate_response_and_does_not_overflow_stack
|
92
|
+
10000.times do
|
93
|
+
call_middleware
|
94
|
+
end
|
95
|
+
|
96
|
+
resp = call_middleware
|
97
|
+
assert resp.is_a?(::Rack::BodyProxy)
|
98
|
+
assert_equal ["response"], resp.to_a
|
99
|
+
assert_equal ["response"], resp.instance_variable_get(:@body)
|
100
|
+
end
|
101
|
+
end
|
data/test/request_store_test.rb
CHANGED
@@ -20,6 +20,13 @@ class RequestStoreTest < Minitest::Test
|
|
20
20
|
assert_equal Hash.new, RequestStore.store
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_assign_store
|
24
|
+
store_obj = { test_key: 'test' }
|
25
|
+
RequestStore.store = store_obj
|
26
|
+
assert_equal 'test', RequestStore.store[:test_key]
|
27
|
+
assert_equal store_obj, RequestStore.store
|
28
|
+
end
|
29
|
+
|
23
30
|
def test_clear
|
24
31
|
RequestStore.store[:foo] = 1
|
25
32
|
RequestStore.clear!
|
data/test/test_helper.rb
CHANGED
@@ -11,3 +11,19 @@ class RackApp
|
|
11
11
|
[200, {}, ["response"]]
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
class RackAppWithConstResponse
|
16
|
+
RESPONSE = [200, {}, ["response"]]
|
17
|
+
|
18
|
+
attr_reader :last_value, :store_active
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
RequestStore.store[:foo] ||= 0
|
22
|
+
RequestStore.store[:foo] += 1
|
23
|
+
@last_value = RequestStore.store[:foo]
|
24
|
+
@store_active = RequestStore.active?
|
25
|
+
raise 'FAIL' if env[:error]
|
26
|
+
|
27
|
+
RESPONSE
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: request_store
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Klabnik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,8 +59,8 @@ executables: []
|
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
+
- ".github/workflows/ci.yml"
|
62
63
|
- ".gitignore"
|
63
|
-
- ".travis.yml"
|
64
64
|
- Gemfile
|
65
65
|
- LICENSE.txt
|
66
66
|
- README.md
|
@@ -73,7 +73,7 @@ files:
|
|
73
73
|
- test/middleware_test.rb
|
74
74
|
- test/request_store_test.rb
|
75
75
|
- test/test_helper.rb
|
76
|
-
homepage:
|
76
|
+
homepage: https://github.com/steveklabnik/request_store
|
77
77
|
licenses:
|
78
78
|
- MIT
|
79
79
|
metadata: {}
|
@@ -92,8 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
95
|
-
|
96
|
-
rubygems_version: 2.5.2
|
95
|
+
rubygems_version: 3.3.5
|
97
96
|
signing_key:
|
98
97
|
specification_version: 4
|
99
98
|
summary: RequestStore gives you per-request global storage.
|
data/.travis.yml
DELETED