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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 057f28c37dcfc7b49f7443c8440af572892672ee
4
- data.tar.gz: b5d14983640d8e012ca2c153e2b8dddaa6ace337
2
+ SHA256:
3
+ metadata.gz: c9883603b6fb82a3e39d90b6e7509911f3813160d2fe267ad892536305c5d741
4
+ data.tar.gz: 437805cfcdfc5bc8c3c59bafe9d12bf4ae3ba1685e5261ca40dfce79f7cee845
5
5
  SHA512:
6
- metadata.gz: cea24b9f63fa74fc0b0235d155133932fc018934b64dae3256266a320f060e2f10b004b48735926caaeacf64d28f5fcad336f3df4c5c436994a9c02ac5651994
7
- data.tar.gz: 502ed5cb5807e7066fc3d2a0ac7d7f0d768af7f53c88f96e43c384ca57cfb9a371230f09c98692a8441c74e87c2402d68f09e48dc6aa8ba461892efc6af415c2
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 [![build status](https://travis-ci.org/steveklabnik/request_store.png?branch=master)](https://travis-ci.org/steveklabnik/request_store) [![Code Climate](https://codeclimate.com/github/steveklabnik/request_store.png)](https://codeclimate.com/github/steveklabnik/request_store)
1
+ # RequestStore [![CI](https://github.com/steveklabnik/request_store/actions/workflows/ci.yml/badge.svg)](https://github.com/steveklabnik/request_store/actions/workflows/ci.yml) [![Code Climate](https://codeclimate.com/github/steveklabnik/request_store.svg)](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
- response = @app.call(env)
19
+ status, headers, body = @app.call(env)
20
20
 
21
- returned = response << Rack::BodyProxy.new(response.pop) do
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!
@@ -1,3 +1,3 @@
1
1
  module RequestStore
2
- VERSION = "1.4.0"
2
+ VERSION = "1.7.0"
3
3
  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, &block)
50
+ def self.fetch(key)
47
51
  store[key] = yield unless exist?(key)
48
52
  store[key]
49
53
  end
@@ -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 = "http://github.com/steveklabnik/request_store"
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", "~> 10.5"
22
+ gem.add_development_dependency "rake"
24
23
  gem.add_development_dependency "minitest", "~> 5.0"
25
24
  end
@@ -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
@@ -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.0
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: 2018-01-01 00:00:00.000000000 Z
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: '10.5'
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: '10.5'
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: http://github.com/steveklabnik/request_store
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
- rubyforge_project:
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
@@ -1,18 +0,0 @@
1
- language: ruby
2
- sudo: false
3
- rvm:
4
- - 1.8.7
5
- - 1.9.2
6
- - 1.9.3
7
- - 2.0.0
8
- - 2.1.0
9
- - 2.2.3
10
- - jruby-18mode
11
- - jruby-19mode
12
- - ruby-head
13
- - jruby-head
14
- - ree
15
- matrix:
16
- allow_failures:
17
- - rvm: ruby-head
18
- - rvm: jruby-head