idempo 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79351972a8246031e7301fcadb2d3721fa99300edffc00a3cb1a2e5fa828c68b
4
- data.tar.gz: 27bb14ea7cfe6a10de6367cd725a549a0e26ccec289ca6bdc192752df39c60db
3
+ metadata.gz: 70c151d3823c956aac177dbf39ee4e5f216b9464a739b134c8a47822a01aa765
4
+ data.tar.gz: 4306e629c9d0f1bd59ad74bc6e61623e441e4713b88bccb8f69c08e8553dc251
5
5
  SHA512:
6
- metadata.gz: e7cab37f569d2688a83b0d2c25c8f73b720c3fbc294ab6f2cd70686167f8c8dfb1864c738a33ffa28fec152f346e409cc0088be2d9a907974ac8c5370a9469fb
7
- data.tar.gz: f2ad3d16e636499ce989c9093ad0c7144fb9d22fe89d63939045fbe9df593595ce349d4e9ae25cb70898020bc1e66ea0307889cd7b1eb3060e758675219e5add
6
+ metadata.gz: 5e80a42f84a311e633697123f7213af21b0f79d501937d5963e4dd918eb5cabd5d01174d781b0528d4f51923fc9eb038af20afeb164c8cdd51d2cc1983ea1111
7
+ data.tar.gz: 4d2ee3d361d009aacc23c42ec38323c9b9373d874c9abbd70596882dbd48d6ed4edcf9eb5c32f44e366aa091e178dfcd71c919b45d6bc1b8c17804094b23629f
@@ -15,7 +15,7 @@ jobs:
15
15
  strategy:
16
16
  matrix:
17
17
  ruby:
18
- - '2.7'
18
+ - "2.7"
19
19
  steps:
20
20
  - name: Checkout
21
21
  uses: actions/checkout@v4
@@ -37,11 +37,16 @@ jobs:
37
37
  name: Specs
38
38
  runs-on: ubuntu-22.04
39
39
  if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
40
+ env:
41
+ IDEMPO_RACK_VERSION: ${{ matrix.rack }}
40
42
  strategy:
41
43
  matrix:
42
44
  ruby:
43
- - '2.7'
44
- - '3.2'
45
+ - "2.7"
46
+ - "3.2"
47
+ rack:
48
+ - "2.0"
49
+ - "3.0"
45
50
  services:
46
51
  mysql:
47
52
  image: mysql:5.7
@@ -65,6 +70,7 @@ jobs:
65
70
  steps:
66
71
  - name: Checkout
67
72
  uses: actions/checkout@v4
73
+
68
74
  - name: Setup Ruby
69
75
  uses: ruby/setup-ruby@v1
70
76
  with:
data/CHANGELOG.md CHANGED
@@ -1,13 +1,17 @@
1
- ## [1.2.1] - 2024-02-22
1
+ ## 1.2.2
2
+
3
+ - Support `#to_ary` on Rack response bodies on newer Rails/Rack versions
4
+
5
+ ## 1.2.1
2
6
 
3
7
  - Use autoloading for internal modules. A user using Redis does not have to load the ActiveRecord storage backend, for example
4
8
  - Ensure that the original Rack response body receives a `close` when reading out for caching
5
9
 
6
- ## [1.2.0] - 2024-02-22
10
+ ## 1.2.0
7
11
 
8
12
  - Use memory locking in addition to DB locking in `ActiveRecordBackend`
9
13
 
10
- ## [1.1.0] - 2024-02-22
14
+ ## 1.1.0
11
15
 
12
16
  - Use modern ActiveRecord migration options for better Rails 7.x compatibility
13
17
  - Ensure Github actions CI can run and uses Postgres appropriately
@@ -15,16 +19,16 @@
15
19
  - Implement `#prune!` on storage backends
16
20
  - Reformat all code using [standard](https://github.com/standardrb/standard) instead of wetransfer_style as it is both more relaxed and more modern
17
21
 
18
- ## [1.0.0] - 2023-10-27
22
+ ## 1.0.0
19
23
 
20
24
  - Release 1.0 as the API can be considered stable and the gem has been in production for years
21
25
 
22
- ## [0.2.0] - 2022-04-08
26
+ ## 0.2.0
23
27
 
24
28
  - Allow setting the global default TTL for the cached responses
25
29
  - Allow customisation of the request key computation (so that the client can decide whether to include/exclude `Authorization` and the like)
26
30
  - Extract the error response generating apps into separate modules, to make them easier to override
27
31
 
28
- ## [0.1.0] - 2021-10-14
32
+ ## 0.1.0
29
33
 
30
34
  - Initial release
data/README.md CHANGED
@@ -10,7 +10,8 @@ instead of calling your application.
10
10
  Idempo supports a number of backends, we recommend using Redis if you have multiple application servers / dynos and MemoryBackend if you are only using one single Puma worker. To initialize with Redis as backend pass the `backend:` parameter when adding the middleware:
11
11
 
12
12
  ```ruby
13
- use Idempo, backend: Idempo::RedisBackend.new(Rails.application.config.redis_connection_pool)
13
+ be = Idempo::RedisBackend.new(Rails.application.config.redis_connection_pool)
14
+ use Idempo, backend: be
14
15
  ```
15
16
 
16
17
  and to initialize with a memory store as backend:
@@ -65,7 +66,8 @@ end
65
66
  Then configure Idempo to use the backend (in your `application.rb`):
66
67
 
67
68
  ```ruby
68
- config.middleware.insert Idempo, backend: Idempo::ActiveRecordBackend.new
69
+ be = Idempo::ActiveRecordBackend.new
70
+ config.middleware.insert Idempo, backend: be
69
71
  ```
70
72
 
71
73
  In your regular tasks (cron or Rake) you will want to add a call to delete old Idempo responses (there is an index on `expire_at`):
@@ -87,7 +89,8 @@ use Idempo, backend: Idempo::RedisBackend.new
87
89
  If you have a configured Redis connection pool (and you should) - pass it to the initializer:
88
90
 
89
91
  ```ruby
90
- config.middleware.insert Idempo, backend: Idempo::RedisBackend.new(config.redis_connection_pool)
92
+ be = Idempo::RedisBackend.new(config.redis_connection_pool)
93
+ config.middleware.insert Idempo, backend: be
91
94
  ```
92
95
 
93
96
  All data stored in Redis will have TTLs and will expire automatically. Redis scripts ensure that updates to the stored idempotent responses and locking happen atomically.
data/idempo.gemspec CHANGED
@@ -35,11 +35,10 @@ Gem::Specification.new do |spec|
35
35
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
36
36
  spec.require_paths = ["lib"]
37
37
 
38
- # Uncomment to register a new dependency of your gem
39
- spec.add_dependency "rack"
40
38
  spec.add_dependency "msgpack"
41
39
  spec.add_dependency "measurometer", "~> 1.3"
42
40
 
41
+ spec.add_development_dependency "rack", "~> 3"
43
42
  spec.add_development_dependency "rake", "~> 13.0"
44
43
  spec.add_development_dependency "rspec", "~> 3.0"
45
44
  spec.add_development_dependency "redis", "~> 4"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Idempo
4
- VERSION = "1.2.1"
4
+ VERSION = "1.2.2"
5
5
  end
data/lib/idempo.rb CHANGED
@@ -7,6 +7,7 @@ require "measurometer"
7
7
  require "msgpack"
8
8
  require "zlib"
9
9
  require "set"
10
+ require "rack"
10
11
 
11
12
  require "idempo/version"
12
13
 
@@ -57,6 +58,12 @@ class Idempo
57
58
  status, headers, body = @app.call(env)
58
59
 
59
60
  expires_in_seconds = (headers.delete("X-Idempo-Persist-For-Seconds") || @persist_for_seconds).to_i
61
+
62
+ # In some cases `body` could respond to to_ary. In this case, we don't need to call .close on body afterwards.
63
+ #
64
+ # @see https://github.com/rack/rack/blob/main/SPEC.rdoc#the-body-
65
+ body = body.to_ary if rack_v3? && body.respond_to?(:to_ary)
66
+
60
67
  if response_may_be_persisted?(status, headers, body)
61
68
  # Body is replaced with a cached version since a Rack response body is not rewindable
62
69
  marshaled_response, body = serialize_response(status, headers, body)
@@ -76,6 +83,10 @@ class Idempo
76
83
 
77
84
  private
78
85
 
86
+ def rack_v3?
87
+ Gem::Version.new(Rack.release) >= Gem::Version.new("3.0")
88
+ end
89
+
79
90
  def from_persisted_response(marshaled_response)
80
91
  if marshaled_response[-2..] != ":1"
81
92
  raise Error, "Unknown serialization of the marshaled response"
@@ -104,6 +115,7 @@ class Idempo
104
115
  # does not
105
116
  [deflated_message_packed_str, body_chunks]
106
117
  ensure
118
+ # This will not be applied to response bodies of Array type.
107
119
  rack_response_body.close if rack_response_body.respond_to?(:close)
108
120
  end
109
121
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: idempo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2024-02-27 00:00:00.000000000 Z
12
+ date: 2024-09-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rack
15
+ name: msgpack
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - ">="
@@ -26,33 +26,33 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
- name: msgpack
29
+ name: measurometer
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0'
34
+ version: '1.3'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0'
41
+ version: '1.3'
42
42
  - !ruby/object:Gem::Dependency
43
- name: measurometer
43
+ name: rack
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1.3'
49
- type: :runtime
48
+ version: '3'
49
+ type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1.3'
55
+ version: '3'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rake
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -220,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
220
220
  - !ruby/object:Gem::Version
221
221
  version: '0'
222
222
  requirements: []
223
- rubygems_version: 3.1.6
223
+ rubygems_version: 3.3.7
224
224
  signing_key:
225
225
  specification_version: 4
226
226
  summary: Idempotency keys for all.