coney_island 0.11.4 → 0.11.5

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
2
  SHA1:
3
- metadata.gz: e89a4a37c2ee2c54d1971832c0a2116de95c3fe7
4
- data.tar.gz: 695f0918f28bfb72651a51c0adde9981f87e5e36
3
+ metadata.gz: 5b37b8094a18bf7583baf60304ba81a02cc89b28
4
+ data.tar.gz: f459132ee4aba56f789743faceaa867e098cecae
5
5
  SHA512:
6
- metadata.gz: fa2adee2194a6270b8b2e7d9cdfe37d6aa722e23e2ab7d7872d6702902d0120b4864b277928c7c1b969b97457ea59a96aff48d64affe557a21c81038346f9ee0
7
- data.tar.gz: 6d4e7c6446c7c3addbbc9a8b4d6f6af741a2b2d21888544da8235e2d69a46b7e473363caf87f322780b7a67f458c8eb6f20b2539ff5820d93024a597bd851027
6
+ metadata.gz: 83cd0ca590537117bf88e426b16f926df260737d5ec911848b15880bbaf79f77ebe6bd7717db2b0295334de1286046b1a87b551cda8f09c944aebd541466dcfc
7
+ data.tar.gz: 9d92651a39c4c41e35606a69bb27c3e9c70440d901e07b566621ba579e391f95504fdcb35c0d84179b5bafcf74c817e500012908dc392008097ce3f9752bf959
data/lib/coney_island.rb CHANGED
@@ -14,14 +14,6 @@ module ConeyIsland
14
14
  @amqp_parameters
15
15
  end
16
16
 
17
- def self.tcp_connection_retries=(number)
18
- @tcp_connection_retries = number
19
- end
20
-
21
- def self.tcp_connection_retries
22
- @tcp_connection_retries
23
- end
24
-
25
17
  def self.tcp_connection_retry_limit=(limit)
26
18
  @tcp_connection_retry_limit = limit
27
19
  end
@@ -30,8 +22,8 @@ module ConeyIsland
30
22
  @tcp_connection_retry_limit ||= 6
31
23
  end
32
24
 
33
- def self.tcp_connection_retry_interval
34
- self.tcp_connection_retry_seed ** self.tcp_connection_retries
25
+ def self.tcp_connection_retry_interval(retries)
26
+ self.tcp_connection_retry_seed ** retries
35
27
  end
36
28
 
37
29
  def self.tcp_connection_retry_seed=(seed)
@@ -135,3 +127,4 @@ require 'coney_island/submitter'
135
127
  require 'coney_island/job_argument_error'
136
128
  require 'coney_island/railtie' if defined?(Rails)
137
129
  require 'coney_island/performer'
130
+ require 'bunny'
@@ -13,6 +13,14 @@ module ConeyIsland
13
13
  @run_inline
14
14
  end
15
15
 
16
+ def self.tcp_connection_retries=(number)
17
+ @tcp_connection_retries = number
18
+ end
19
+
20
+ def self.tcp_connection_retries
21
+ @tcp_connection_retries
22
+ end
23
+
16
24
  def self.submit(*args)
17
25
  if RequestStore.store[:cache_jobs]
18
26
  job_id = SecureRandom.uuid
@@ -51,10 +59,26 @@ module ConeyIsland
51
59
  end
52
60
  end
53
61
 
62
+ def self.connection=(conn)
63
+ @connection = conn
64
+ end
65
+
66
+ def self.connection
67
+ @connection
68
+ end
69
+
70
+ def self.start_connection
71
+ @connection.start
72
+ end
73
+
54
74
  def self.channel
55
75
  @channel
56
76
  end
57
77
 
78
+ def self.create_channel
79
+ @channel = self.connection.create_channel
80
+ end
81
+
58
82
  def self.exchange
59
83
  @exchange
60
84
  end
@@ -76,27 +100,48 @@ module ConeyIsland
76
100
  end
77
101
 
78
102
  def self.handle_connection
79
- @connection ||= AMQP.connect(self.amqp_parameters)
80
- rescue AMQP::TCPConnectionFailed => e
81
- ConeyIsland.tcp_connection_retries ||= 0
82
- ConeyIsland.tcp_connection_retries += 1
83
- if ConeyIsland.tcp_connection_retries >= ConeyIsland.tcp_connection_retry_limit
84
- message = "Failed to connect to RabbitMQ #{ConeyIsland.tcp_connection_retry_limit} times, bailing out"
103
+ Rails.logger.info("ConeyIsland::Submitter.handle_connection connecting...")
104
+ self.connection = Bunny.new(self.amqp_parameters)
105
+ self.start_connection
106
+
107
+ rescue Bunny::TCPConnectionFailed, Bunny::PossibleAuthenticationFailureError => e
108
+ self.tcp_connection_retries ||= 0
109
+ self.tcp_connection_retries += 1
110
+ if self.tcp_connection_retries >= ConeyIsland.tcp_connection_retry_limit
111
+ message = "Submitter Failed to connect to RabbitMQ #{ConeyIsland.tcp_connection_retry_limit} times, bailing out"
85
112
  Rails.logger.error(message)
86
113
  ConeyIsland.poke_the_badger(e, {
87
114
  code_source: 'ConeyIsland::Submitter.handle_connection',
88
115
  reason: message}
89
116
  )
117
+ @connection = nil
90
118
  else
91
- message = "Failed to connecto to RabbitMQ Attempt ##{ConeyIsland.tcp_connection_retries} time(s), trying again in #{ConeyIsland.tcp_connection_retry_interval} seconds..."
119
+ message = "Failed to connecto to RabbitMQ Attempt ##{self.tcp_connection_retries} time(s), trying again in #{ConeyIsland.tcp_connection_retry_interval(self.tcp_connection_retries)} seconds..."
92
120
  Rails.logger.error(message)
93
- sleep(10)
121
+ sleep(ConeyIsland.tcp_connection_retry_interval(self.tcp_connection_retries))
94
122
  retry
95
123
  end
124
+ rescue Bunny::ConnectionLevelException => e
125
+ Rails.logger.error "Submitter Handling a connection-level exception."
126
+ # Rails.logger.error "Bunny class id : #{e.connection_close.class_id}"
127
+ # Rails.logger.error "Bunny method id: #{e.connection_close.method_id}"
128
+ # Rails.logger.error "Status code : #{e.connection_close.reply_code}"
129
+ # Rails.logger.error "Error message : #{e.connection_close.reply_text}"
130
+ rescue Bunny::ChannelLevelException => e
131
+ Rails.logger.error "Submitter Handling a channel-level exception."
132
+ Rails.logger.error "Bunny class id : #{e.channel_close.class_id}"
133
+ Rails.logger.error "Bunny method id: #{e.channel_close.method_id}"
134
+ Rails.logger.error "Status code : #{e.channel_close.reply_code}"
135
+ Rails.logger.error "Error message : #{e.channel_close.reply_text}"
96
136
  else
97
- @channel ||= AMQP::Channel.new(@connection)
98
- @exchange = @channel.topic('coney_island')
99
- @delay_exchange = @channel.topic('coney_island_delay')
137
+ self.initialize_rabbit
138
+ self.tcp_connection_retries = 0
139
+ end
140
+
141
+ def self.initialize_rabbit
142
+ self.create_channel
143
+ @exchange = self.channel.topic('coney_island')
144
+ @delay_exchange = self.channel.topic('coney_island_delay')
100
145
  @delay_queue = {}
101
146
  end
102
147
 
@@ -1,3 +1,3 @@
1
1
  module ConeyIsland
2
- VERSION = "0.11.4"
2
+ VERSION = "0.11.5"
3
3
  end
@@ -17,6 +17,14 @@ module ConeyIsland
17
17
  @log = log_thing
18
18
  end
19
19
 
20
+ def self.tcp_connection_retries=(number)
21
+ @tcp_connection_retries = number
22
+ end
23
+
24
+ def self.tcp_connection_retries
25
+ @tcp_connection_retries
26
+ end
27
+
20
28
  def self.running_jobs
21
29
  @running_jobs ||= []
22
30
  end
@@ -114,10 +122,9 @@ module ConeyIsland
114
122
  end
115
123
 
116
124
  AMQP.connect(self.amqp_parameters) do |connection|
117
- self.log.info("Connected to AMQP broker. Running #{AMQP::VERSION}")
125
+ self.log.info("Worker Connected to AMQP broker. Running #{AMQP::VERSION}")
118
126
  connection.on_error do |conn, connection_close|
119
- self.log.error "Handling a connection-level exception."
120
- self.log.error
127
+ self.log.error "Worker Handling a connection-level exception."
121
128
  self.log.error "AMQP class id : #{connection_close.class_id}"
122
129
  self.log.error "AMQP method id: #{connection_close.method_id}"
123
130
  self.log.error "Status code : #{connection_close.reply_code}"
@@ -125,23 +132,18 @@ module ConeyIsland
125
132
  end
126
133
  #Handle a lost connection to rabbitMQ
127
134
  connection.on_tcp_connection_loss do |connection, settings|
128
- # since we lost the connection, rabbitMQ will resend all jobs we didn't finish
129
- # so drop them and restart
130
135
  self.log.warn("Lost rabbit connection, attempting to reconnect...")
131
136
  connection.reconnect(true, 1)
132
137
  self.initialize_rabbit(connection)
133
- # unless @shutting_down
134
- # self.abandon_and_shutdown
135
- # end
136
138
  end
137
139
 
138
140
  self.initialize_rabbit(connection)
139
141
  end
140
142
  end
141
143
  rescue AMQP::TCPConnectionFailed, AMQP::PossibleAuthenticationFailureError => e
142
- ConeyIsland.tcp_connection_retries ||= 0
143
- ConeyIsland.tcp_connection_retries += 1
144
- if ConeyIsland.tcp_connection_retries >= ConeyIsland.tcp_connection_retry_limit
144
+ self.tcp_connection_retries ||= 0
145
+ self.tcp_connection_retries += 1
146
+ if self.tcp_connection_retries >= ConeyIsland.tcp_connection_retry_limit
145
147
  message = "Failed to connect to RabbitMQ #{ConeyIsland.tcp_connection_retry_limit} times, bailing out"
146
148
  self.log.error(message)
147
149
  ConeyIsland.poke_the_badger(e, {
@@ -150,9 +152,9 @@ module ConeyIsland
150
152
  )
151
153
  self.abandon_and_shutdown
152
154
  else
153
- message = "Failed to connecto to RabbitMQ Attempt ##{ConeyIsland.tcp_connection_retries} time(s), trying again in #{ConeyIsland.tcp_connection_retry_interval} seconds..."
155
+ message = "Worker Failed to connecto to RabbitMQ Attempt ##{self.tcp_connection_retries} time(s), trying again in #{ConeyIsland.tcp_connection_retry_interval(self.tcp_connection_retries)} seconds..."
154
156
  self.log.error(message)
155
- sleep(ConeyIsland.tcp_connection_retry_interval)
157
+ sleep(ConeyIsland.tcp_connection_retry_interval(self.tcp_connection_retries))
156
158
  retry
157
159
  end
158
160
  end
@@ -161,9 +163,8 @@ module ConeyIsland
161
163
  def self.initialize_rabbit(connection)
162
164
  self.log.info('initializing rabbit connection with channel and queue...')
163
165
  @channel = AMQP::Channel.new(connection)
164
- channel.on_error do |ch, channel_close|
165
- self.log.error "Handling a channel-level exception."
166
- self.log.error
166
+ @channel.on_error do |ch, channel_close|
167
+ self.log.error "Worker Handling a channel-level exception."
167
168
  self.log.error "AMQP class id : #{channel_close.class_id}"
168
169
  self.log.error "AMQP method id: #{channel_close.method_id}"
169
170
  self.log.error "Status code : #{channel_close.reply_code}"
@@ -180,9 +181,13 @@ module ConeyIsland
180
181
  self.channel.prefetch @prefetch_count
181
182
  @queue = self.channel.queue(@full_instance_name, auto_delete: false, durable: true)
182
183
  @queue.bind(self.exchange, routing_key: 'carousels.' + @ticket + '.#')
184
+ if ConeyIsland::Submitter.amqp_connection.respond_to?(:connected?) && !ConeyIsland::Submitter.amqp_connection.connected?
185
+ ConeyIsland::Submitter.handle_connection
186
+ end
183
187
  @queue.subscribe(:ack => true) do |metadata,payload|
184
188
  self.handle_incoming_message(metadata,payload)
185
189
  end
190
+ self.tcp_connection_retries = 0
186
191
  end
187
192
 
188
193
  def self.handle_incoming_message(metadata,payload)
@@ -3,18 +3,6 @@ require 'test_helper'
3
3
  class ConeyIslandTest < MiniTest::Test
4
4
  describe "ConeyIsland running jobs" do
5
5
 
6
- def force_tcp_error
7
- lambda do |params|
8
- @attempts ||= 0
9
- @attempts += 1
10
- if @attempts == 1
11
- raise AMQP::TCPConnectionFailed.new({host: '127.0.0.1'})
12
- else
13
- return true
14
- end
15
- end
16
- end
17
-
18
6
  it "runs inline" do
19
7
  ConeyIsland.run_inline
20
8
  my_array = []
@@ -34,20 +22,5 @@ class ConeyIslandTest < MiniTest::Test
34
22
  ConeyIsland.stop_caching_jobs
35
23
  end
36
24
 
37
- it "retries on TCP connection errors" do
38
- ConeyIsland.stop_running_inline
39
- ConeyIsland.tcp_connection_retry_seed = 0
40
- @fake_channel = MiniTest::Mock.new
41
- @fake_channel.expect :topic, nil, [String]
42
- @fake_channel.expect :topic, nil, [String]
43
- AMQP::Channel.stub(:new,@fake_channel) do
44
- AMQP.stub(:connect, force_tcp_error) do
45
- ConeyIsland::Submitter.handle_connection
46
- end
47
- end
48
- @fake_channel.verify
49
- ConeyIsland.tcp_connection_retries.must_equal 1
50
- end
51
-
52
25
  end
53
26
  end
@@ -37,3 +37,101 @@ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
37
37
  Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
38
38
  ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
39
39
  Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
40
+ ConeyIsland::Submitter.handle_connection connecting...
41
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
42
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
43
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
44
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
45
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
46
+ ConeyIsland::Submitter.handle_connection connecting...
47
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
48
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
49
+ ConeyIsland::Submitter.handle_connection connecting...
50
+ ConeyIsland::Submitter.handle_connection connecting...
51
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
52
+ ConeyIsland::Submitter.handle_connection connecting...
53
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
54
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
55
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
56
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
57
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
58
+ ConeyIsland::Submitter.handle_connection connecting...
59
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
60
+ ConeyIsland::Submitter.handle_connection connecting...
61
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
62
+ ConeyIsland::Submitter.handle_connection connecting...
63
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
64
+ ConeyIsland::Submitter.handle_connection connecting...
65
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
66
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
67
+ ConeyIsland::Submitter.handle_connection connecting...
68
+ ConeyIsland::Submitter.handle_connection connecting...
69
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
70
+ ConeyIsland::Submitter.handle_connection connecting...
71
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
72
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
73
+ ConeyIsland::Submitter.handle_connection connecting...
74
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
75
+ ConeyIsland::Submitter.handle_connection connecting...
76
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
77
+ ConeyIsland::Submitter.handle_connection connecting...
78
+ ConeyIsland::Submitter.handle_connection connecting...
79
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
80
+ ConeyIsland::Submitter.handle_connection connecting...
81
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
82
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
83
+ ConeyIsland::Submitter.handle_connection connecting...
84
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
85
+ ConeyIsland::Submitter.handle_connection connecting...
86
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
87
+ ConeyIsland::Submitter.handle_connection connecting...
88
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
89
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
90
+ ConeyIsland::Submitter.handle_connection connecting...
91
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
92
+ ConeyIsland::Submitter.handle_connection connecting...
93
+ ConeyIsland::Submitter.handle_connection connecting...
94
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
95
+ ConeyIsland::Submitter.handle_connection connecting...
96
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
97
+ ConeyIsland::Submitter.handle_connection connecting...
98
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
99
+ ConeyIsland::Submitter.handle_connection connecting...
100
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
101
+ ConeyIsland::Submitter.handle_connection connecting...
102
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
103
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
104
+ ConeyIsland::Submitter.handle_connection connecting...
105
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
106
+ ConeyIsland::Submitter.handle_connection connecting...
107
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
108
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
109
+ ConeyIsland::Submitter.handle_connection connecting...
110
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
111
+ ConeyIsland::Submitter.handle_connection connecting...
112
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
113
+ ConeyIsland::Submitter.handle_connection connecting...
114
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
115
+ ConeyIsland::Submitter.handle_connection connecting...
116
+ ConeyIsland::Submitter.handle_connection connecting...
117
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
118
+ ConeyIsland::Submitter.handle_connection connecting...
119
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
120
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
121
+ ConeyIsland::Submitter.handle_connection connecting...
122
+ ConeyIsland::Submitter.handle_connection connecting...
123
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
124
+ ConeyIsland::Submitter.handle_connection connecting...
125
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
126
+ ConeyIsland::Submitter.handle_connection connecting...
127
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
128
+ ConeyIsland::Submitter.handle_connection connecting...
129
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
130
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
131
+ ConeyIsland::Submitter.handle_connection connecting...
132
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
133
+ ConeyIsland::Submitter.handle_connection connecting...
134
+ ConeyIsland::Submitter.handle_connection connecting...
135
+ Failed to connecto to RabbitMQ Attempt #1 time(s), trying again in 0 seconds...
136
+ ConeyIsland::Submitter.handle_connection connecting...
137
+ ConeyIsland::Submitter.submit! about to iterate over this many jobs: 1
@@ -32,6 +32,30 @@ class SubmitterTest < MiniTest::Test
32
32
  ConeyIsland::Submitter.publish_job([:not_a_class, :add_to_list, args: [[]]])
33
33
  end
34
34
  end
35
+ it "retries on TCP connection errors" do
36
+ ConeyIsland.stop_running_inline
37
+ ConeyIsland.tcp_connection_retry_seed = 0
38
+ @fake_channel = Minitest::Mock.new
39
+ @fake_channel.expect :topic, nil, [String]
40
+ @fake_channel.expect :topic, nil, [String]
41
+ force_tcp_error = ->{
42
+ @attempts ||= 0
43
+ @attempts += 1
44
+ if @attempts == 1
45
+ raise Bunny::TCPConnectionFailed.new({host: '127.0.0.1'})
46
+ else
47
+ return true
48
+ end
49
+ }
50
+ ConeyIsland::Submitter.stub(:start_connection,force_tcp_error) do
51
+ ConeyIsland::Submitter.stub(:create_channel, nil) do
52
+ ConeyIsland::Submitter.stub(:channel, @fake_channel) do
53
+ ConeyIsland::Submitter.handle_connection
54
+ end
55
+ end
56
+ end
57
+ @attempts.must_equal 2
58
+ end
35
59
  end
36
60
 
37
61
  def setup_mock(klass, method, args, expected_work_queue, work_queue=nil)
@@ -74,6 +98,7 @@ class SubmitterTest < MiniTest::Test
74
98
  end
75
99
 
76
100
  end
101
+
77
102
  end
78
103
 
79
104
  class DummyPerformer
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coney_island
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.4
4
+ version: 0.11.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Draut
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-05-20 00:00:00.000000000 Z
13
+ date: 2015-05-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -40,6 +40,20 @@ dependencies:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: 1.5.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: bunny
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.7.0
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 1.7.0
43
57
  - !ruby/object:Gem::Dependency
44
58
  name: request_store
45
59
  requirement: !ruby/object:Gem::Requirement