coney_island 0.11.4 → 0.11.5

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
  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