fake_sqs 0.0.11 → 0.1.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
2
  SHA1:
3
- metadata.gz: ae5e043b856cd439056c369baeb1fdc3d12e7787
4
- data.tar.gz: f4b4aedf522f93fa1e71a2ace2a1df482b310e90
3
+ metadata.gz: 04b7e156149ca16643c8fde1933bca20aea7434b
4
+ data.tar.gz: be9d4103aa2987ddbb43839c15f3ef85955b8e18
5
5
  SHA512:
6
- metadata.gz: aa51a2e3bcde55667e86206db9d49043448618e07960ecbaa1a441287e7198137333e58bb62ee3ddfad11e4dc8a600d9d960456cb2a72c185d5d9fb7506ded42
7
- data.tar.gz: edfb298a28ae9f4089b6d60e8deb36b3eed64e728284a08cfdce4520804e6a298fe810ab43f7aa1e689c7d97e20190e247aefbc49f11ecea27326a20af3ffe9e
6
+ metadata.gz: 4ffeacbcc77e857c5c125d90c3eaafdb4bbc068c4f8fc8b11d705d4f3c0e0fa26ef82bd5427cd882ef02e317375b8f35bcdb8399aa3c8bd88aa27763c28e7a89
7
+ data.tar.gz: 2a8dc5a14fbb7317e7ae6d44e9f79983568a3d204b74359d0cc2932dadd283b9a5ee79008ecb5dc1e649b596afc5ca4d658455cb6e508a420142a706a44e0983
data/README.md CHANGED
@@ -18,17 +18,16 @@ Done so far are:
18
18
  * Receive messages (and in batch)
19
19
  * Deleting messages (and in batch)
20
20
  * Changing queue attributes (but not all, and no validation)
21
+ * Setting visibility timeouts for messages
21
22
 
22
23
  Certain bits are left off on purpose, to make it easier to work with, such as:
23
24
 
24
25
  * No checking on access keys or signatures
25
26
  * No 60 second delay between deleting a queue and recreating it.
26
- * No visibility timeouts (see below about special hooks)
27
27
 
28
28
  Other parts are just not done yet:
29
29
 
30
30
  * Permissions
31
- * Changing message visibility
32
31
  * Error handling
33
32
 
34
33
  So, actually, just the basics are implemented at this point.
@@ -1,5 +1,6 @@
1
1
  require 'fake_sqs/api'
2
2
  require 'fake_sqs/catch_errors'
3
+ require 'fake_sqs/collection_view'
3
4
  require 'fake_sqs/error_response'
4
5
  require 'fake_sqs/message'
5
6
  require 'fake_sqs/queue'
@@ -0,0 +1,21 @@
1
+ module FakeSQS
2
+ module Actions
3
+ class ChangeMessageVisibility
4
+
5
+ def initialize(options = {})
6
+ @server = options.fetch(:server)
7
+ @queues = options.fetch(:queues)
8
+ @responder = options.fetch(:responder)
9
+ end
10
+
11
+ def call(queue, params)
12
+ visibility = params.fetch("VisibilityTimeout")
13
+ receipt = params.fetch("ReceiptHandle")
14
+
15
+ @queues.get(queue).change_message_visibility( receipt, visibility.to_i )
16
+ @responder.call :ChangeMessageVisibility
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,4 @@
1
+ require 'fake_sqs/actions/change_message_visibility'
1
2
  require 'fake_sqs/actions/create_queue'
2
3
  require 'fake_sqs/actions/delete_queue'
3
4
  require 'fake_sqs/actions/list_queues'
@@ -21,6 +22,13 @@ module FakeSQS
21
22
  def initialize(options = {})
22
23
  @queues = options.fetch(:queues)
23
24
  @options = options
25
+ @run_timer = true
26
+ @timer = Thread.new do
27
+ while @run_timer
28
+ queues.timeout_messages!
29
+ sleep(5)
30
+ end
31
+ end
24
32
  end
25
33
 
26
34
  def call(action, *args)
@@ -44,5 +52,9 @@ module FakeSQS
44
52
  queues.expire
45
53
  end
46
54
 
55
+ def stop
56
+ @run_timer = false
57
+ end
58
+
47
59
  end
48
60
  end
@@ -0,0 +1,20 @@
1
+ require 'forwardable'
2
+
3
+ module FakeSQS
4
+ class CollectionView
5
+ include Enumerable
6
+ extend Forwardable
7
+ def_delegators :@original, :[], :each, :empty?, :size, :length
8
+
9
+ UnmodifiableObjectError = Class.new(StandardError)
10
+
11
+ def initialize( original )
12
+ @original = original
13
+ end
14
+
15
+ def []=(key_or_index,value)
16
+ raise UnmodifiableObjectError.new("This is a collection view and can not be modified - #{key_or_index} => #{value}")
17
+ end
18
+
19
+ end
20
+ end
@@ -16,6 +16,7 @@ InvalidSecurity: 403
16
16
  InvalidSecurityToken: 400
17
17
  MalformedVersion: 400
18
18
  MessageTooLong: 400
19
+ MessageNotInflight: 400
19
20
  MissingClientTokenId: 403
20
21
  MissingCredentials: 401
21
22
  MissingParameter: 400
@@ -25,6 +26,7 @@ NotAuthorizedToUseVersion: 401
25
26
  QueueDeletedRecently: 400
26
27
  QueueNameExists: 400
27
28
  ReadCountOutOfRange: 400
29
+ ReceiptHandleIsInvalid: 400
28
30
  RequestExpired: 400
29
31
  RequestThrottled: 403
30
32
  ServiceUnavailable: 503
@@ -4,6 +4,7 @@ module FakeSQS
4
4
  class Message
5
5
 
6
6
  attr_reader :body, :id, :md5
7
+ attr_accessor :visibility_timeout
7
8
 
8
9
  def initialize(options = {})
9
10
  @body = options.fetch("MessageBody")
@@ -11,6 +12,18 @@ module FakeSQS
11
12
  @md5 = options.fetch("MD5") { Digest::MD5.hexdigest(@body) }
12
13
  end
13
14
 
15
+ def expire!
16
+ self.visibility_timeout = nil
17
+ end
18
+
19
+ def expired?( limit = Time.now )
20
+ self.visibility_timeout.nil? || self.visibility_timeout < limit
21
+ end
22
+
23
+ def expire_at(seconds)
24
+ self.visibility_timeout = Time.now + seconds
25
+ end
26
+
14
27
  def attributes
15
28
  {
16
29
  "MessageBody" => body,
@@ -1,12 +1,17 @@
1
1
  require 'securerandom'
2
+ require 'fake_sqs/collection_view'
2
3
 
3
4
  module FakeSQS
4
5
 
6
+ MessageNotInflight = Class.new(RuntimeError)
5
7
  ReadCountOutOfRange = Class.new(RuntimeError)
8
+ ReceiptHandleIsInvalid = Class.new(RuntimeError)
6
9
 
7
10
  class Queue
8
11
 
9
- attr_reader :name, :messages, :message_factory, :messages_in_flight, :arn, :queue_attributes
12
+ VISIBILITY_TIMEOUT = 30
13
+
14
+ attr_reader :name, :message_factory, :arn, :queue_attributes
10
15
 
11
16
  def initialize(options = {})
12
17
  @message_factory = options.fetch(:message_factory)
@@ -14,14 +19,15 @@ module FakeSQS
14
19
  @name = options.fetch("QueueName")
15
20
  @arn = options.fetch("Arn") { "arn:aws:sqs:us-east-1:#{SecureRandom.hex}:#{@name}" }
16
21
  @queue_attributes = options.fetch("Attributes") { {} }
22
+ @lock = Monitor.new
17
23
  reset
18
24
  end
19
25
 
20
26
  def to_yaml
21
27
  {
22
- "QueueName" => name,
23
- "Arn" => arn,
24
- "Attributes" => queue_attributes,
28
+ "QueueName" => name,
29
+ "Arn" => arn,
30
+ "Attributes" => queue_attributes,
25
31
  }
26
32
  end
27
33
 
@@ -32,15 +38,17 @@ module FakeSQS
32
38
  def attributes
33
39
  queue_attributes.merge(
34
40
  "QueueArn" => arn,
35
- "ApproximateNumberOfMessages" => messages.size,
36
- "ApproximateNumberOfMessagesNotVisible" => messages_in_flight.size,
41
+ "ApproximateNumberOfMessages" => @messages.size,
42
+ "ApproximateNumberOfMessagesNotVisible" => @messages_in_flight.size,
37
43
  )
38
44
  end
39
45
 
40
46
  def send_message(options = {})
41
- message = message_factory.new(options)
42
- messages << message
43
- message
47
+ with_lock do
48
+ message = message_factory.new(options)
49
+ @messages << message
50
+ message
51
+ end
44
52
  end
45
53
 
46
54
  def receive_message(options = {})
@@ -48,34 +56,99 @@ module FakeSQS
48
56
 
49
57
  fail ReadCountOutOfRange, amount if amount > 10
50
58
 
51
- return {} if messages.empty?
59
+ return {} if @messages.empty?
52
60
 
53
61
  result = {}
54
62
 
55
- actual_amount = amount > size ? size : amount
63
+ with_lock do
64
+ actual_amount = amount > size ? size : amount
56
65
 
57
- actual_amount.times do
58
- message = messages.delete_at(rand(size))
59
- receipt = generate_receipt
60
- messages_in_flight[receipt] = message
61
- result[receipt] = message
66
+ actual_amount.times do
67
+ message = @messages.delete_at(rand(size))
68
+ message.expire_at(default_visibility_timeout)
69
+ receipt = generate_receipt
70
+ @messages_in_flight[receipt] = message
71
+ result[receipt] = message
72
+ end
62
73
  end
63
74
 
64
75
  result
65
76
  end
66
77
 
78
+ def default_visibility_timeout
79
+ if value = attributes['VisibilityTimeout']
80
+ value.to_i
81
+ else
82
+ VISIBILITY_TIMEOUT
83
+ end
84
+ end
85
+
86
+ def timeout_messages!
87
+ with_lock do
88
+ expired = @messages_in_flight.inject({}) do |memo,(receipt,message)|
89
+ if message.expired?
90
+ memo[receipt] = message
91
+ end
92
+ memo
93
+ end
94
+ expired.each do |receipt,message|
95
+ message.expire!
96
+ @messages << message
97
+ delete_message(receipt)
98
+ end
99
+ end
100
+ end
101
+
102
+ def change_message_visibility(receipt, visibility)
103
+ with_lock do
104
+ message = @messages_in_flight[receipt]
105
+ raise MessageNotInflight unless message
106
+
107
+ if visibility == 0
108
+ message.expire!
109
+ @messages << message
110
+ delete_message(receipt)
111
+ else
112
+ message.expire_at(visibility)
113
+ end
114
+
115
+ end
116
+ end
117
+
67
118
  def delete_message(receipt)
68
- messages_in_flight.delete(receipt)
119
+ with_lock do
120
+ @messages_in_flight.delete(receipt)
121
+ end
69
122
  end
70
123
 
71
124
  def reset
72
- @messages = []
73
- @messages_in_flight = {}
125
+ with_lock do
126
+ @messages = []
127
+ @messages_view = FakeSQS::CollectionView.new(@messages)
128
+ reset_messages_in_flight
129
+ end
74
130
  end
75
131
 
76
132
  def expire
77
- @messages += messages_in_flight.values
78
- @messages_in_flight = {}
133
+ with_lock do
134
+ @messages += @messages_in_flight.values
135
+ reset_messages_in_flight
136
+ end
137
+ end
138
+
139
+ def reset_messages_in_flight
140
+ with_lock do
141
+ @messages_in_flight = {}
142
+ @messages_in_flight_view = FakeSQS::CollectionView.new(@messages_in_flight)
143
+ end
144
+ end
145
+
146
+ def messages
147
+ @messages_view
148
+ end
149
+
150
+ def messages_in_flight
151
+ @messages_in_flight_view
79
152
  end
80
153
 
81
154
  def size
@@ -86,5 +159,11 @@ module FakeSQS
86
159
  SecureRandom.hex
87
160
  end
88
161
 
162
+ def with_lock
163
+ @lock.synchronize do
164
+ yield
165
+ end
166
+ end
167
+
89
168
  end
90
169
  end
@@ -60,6 +60,12 @@ module FakeSQS
60
60
  database.reset
61
61
  end
62
62
 
63
+ def timeout_messages!
64
+ transaction do
65
+ database.each { |name,queue| queue.timeout_messages! }
66
+ end
67
+ end
68
+
63
69
  def expire
64
70
  transaction do
65
71
  database.each { |name, queue| queue.expire }
@@ -1,3 +1,3 @@
1
1
  module FakeSQS
2
- VERSION = "0.0.11"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -30,6 +30,7 @@ module FakeSQS
30
30
  end
31
31
 
32
32
  post "/" do
33
+ params['logger'] = logger
33
34
  if params['QueueUrl']
34
35
  queue = URI.parse(params['QueueUrl']).path.gsub(/\//, '')
35
36
  return settings.api.call(action, queue, params) unless queue.empty?
@@ -56,6 +56,46 @@ describe "Actions for Messages", :sqs do
56
56
  messages.map(&:body).should match_array bodies
57
57
  end
58
58
 
59
+ specify "set message timeout to 0" do
60
+ body = 'some-sample-message'
61
+ queue.send_message(body)
62
+ message = queue.receive_message
63
+ message.body.should == body
64
+ message.visibility_timeout = 0
65
+
66
+ same_message = queue.receive_message
67
+ same_message.body.should == body
68
+ end
69
+
70
+ specify 'set message timeout and wait for message to come' do
71
+
72
+ body = 'some-sample-message'
73
+ queue.send_message(body)
74
+ message = queue.receive_message
75
+ message.body.should == body
76
+ message.visibility_timeout = 3
77
+
78
+ nothing = queue.receive_message
79
+ nothing.should be_nil
80
+
81
+ sleep(10)
82
+
83
+ same_message = queue.receive_message
84
+ same_message.body.should == body
85
+ end
86
+
87
+ specify 'should fail if trying to update the visibility_timeout for a message that is not in flight' do
88
+ body = 'some-sample-message'
89
+ queue.send_message(body)
90
+ message = queue.receive_message
91
+ message.body.should == body
92
+ message.visibility_timeout = 0
93
+
94
+ expect do
95
+ message.visibility_timeout = 30
96
+ end.to raise_error(AWS::SQS::Errors::MessageNotInflight)
97
+ end
98
+
59
99
  def let_messages_in_flight_expire
60
100
  $fake_sqs.expire
61
101
  end
@@ -0,0 +1,41 @@
1
+ require 'fake_sqs/collection_view'
2
+
3
+ describe FakeSQS::CollectionView do
4
+
5
+ def wrap(collection)
6
+ FakeSQS::CollectionView.new(collection)
7
+ end
8
+
9
+ it 'should correctly wrap an array' do
10
+ array = %w{one two three four}
11
+ view = wrap(array)
12
+ view[0].should == 'one'
13
+ view[1].should == 'two'
14
+ view[2].should == 'three'
15
+ view[3].should == 'four'
16
+ end
17
+
18
+ it 'should correctly wrap a hash' do
19
+ hash = { :one => 1, :two => 2, :three => 3 }
20
+ view = wrap(hash)
21
+ view[:one].should == 1
22
+ view[:two].should == 2
23
+ view[:three].should == 3
24
+ end
25
+
26
+ it 'should respond to empty correctly' do
27
+ wrap([]).should be_empty
28
+ wrap({'one' => 1}).should_not be_empty
29
+ end
30
+
31
+ it 'should be enumerable' do
32
+ result = wrap([1, 2, 3]).map { |i| i * i }
33
+ result.should == [1, 4, 9]
34
+ end
35
+
36
+ it 'should respond to size/length' do
37
+ wrap([1, 2, 3]).size.should == 3
38
+ wrap([]).length.should == 0
39
+ end
40
+
41
+ end
@@ -29,6 +29,37 @@ describe FakeSQS::Message do
29
29
 
30
30
  end
31
31
 
32
+ describe 'visibility_timeout' do
33
+
34
+ let :message do
35
+ create_message
36
+ end
37
+
38
+ it 'should default to nil' do
39
+ message.visibility_timeout.should be_nil
40
+ end
41
+
42
+ it 'should be expired when it is nil' do
43
+ message.should be_expired
44
+ end
45
+
46
+ it 'should be expired if set to a previous time' do
47
+ message.visibility_timeout = Time.now - 1
48
+ message.should be_expired
49
+ end
50
+
51
+ it 'should not be expired at a future date' do
52
+ message.visibility_timeout = Time.now + 1
53
+ message.should_not be_expired
54
+ end
55
+
56
+ it 'should not be expired when set to expire at a future date' do
57
+ message.expire_at(5)
58
+ message.visibility_timeout.should be >=(Time.now + 4)
59
+ end
60
+
61
+ end
62
+
32
63
  def create_message(options = {})
33
64
  FakeSQS::Message.new({"MessageBody" => "test"}.merge(options))
34
65
  end
@@ -1,15 +1,11 @@
1
1
  require 'fake_sqs/queue'
2
+ require 'fake_sqs/message'
2
3
 
3
4
  describe FakeSQS::Queue do
4
5
 
5
6
  class MessageFactory
6
-
7
- def initialize
8
- @count = 0
9
- end
10
-
11
7
  def new(options = {})
12
- @count += 1
8
+ FakeSQS::Message.new({'MessageBody' => 'sample-body'}.merge(options))
13
9
  end
14
10
  end
15
11
 
metadata CHANGED
@@ -1,139 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_sqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - iain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-16 00:00:00.000000000 Z
11
+ date: 2014-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: builder
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: aws-sdk
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: faraday
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: thin
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: verbose_hash_fetch
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: activesupport
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  description: Provides a fake SQS server that you can run locally to test against
@@ -144,9 +144,9 @@ executables:
144
144
  extensions: []
145
145
  extra_rdoc_files: []
146
146
  files:
147
- - .gitignore
148
- - .rspec
149
- - .travis.yml
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".travis.yml"
150
150
  - Gemfile
151
151
  - MIT-LICENSE.txt
152
152
  - README.md
@@ -154,6 +154,7 @@ files:
154
154
  - bin/fake_sqs
155
155
  - fake_sqs.gemspec
156
156
  - lib/fake_sqs.rb
157
+ - lib/fake_sqs/actions/change_message_visibility.rb
157
158
  - lib/fake_sqs/actions/create_queue.rb
158
159
  - lib/fake_sqs/actions/delete_message.rb
159
160
  - lib/fake_sqs/actions/delete_message_batch.rb
@@ -167,6 +168,7 @@ files:
167
168
  - lib/fake_sqs/actions/set_queue_attributes.rb
168
169
  - lib/fake_sqs/api.rb
169
170
  - lib/fake_sqs/catch_errors.rb
171
+ - lib/fake_sqs/collection_view.rb
170
172
  - lib/fake_sqs/daemonize.rb
171
173
  - lib/fake_sqs/error_response.rb
172
174
  - lib/fake_sqs/error_responses.yml
@@ -187,6 +189,7 @@ files:
187
189
  - spec/spec_helper.rb
188
190
  - spec/unit/api_spec.rb
189
191
  - spec/unit/catch_errors_spec.rb
192
+ - spec/unit/collection_view_spec.rb
190
193
  - spec/unit/error_response_spec.rb
191
194
  - spec/unit/message_spec.rb
192
195
  - spec/unit/queue_factory_spec.rb
@@ -204,17 +207,17 @@ require_paths:
204
207
  - lib
205
208
  required_ruby_version: !ruby/object:Gem::Requirement
206
209
  requirements:
207
- - - '>='
210
+ - - ">="
208
211
  - !ruby/object:Gem::Version
209
212
  version: '0'
210
213
  required_rubygems_version: !ruby/object:Gem::Requirement
211
214
  requirements:
212
- - - '>='
215
+ - - ">="
213
216
  - !ruby/object:Gem::Version
214
217
  version: '0'
215
218
  requirements: []
216
219
  rubyforge_project:
217
- rubygems_version: 2.1.0
220
+ rubygems_version: 2.2.0
218
221
  signing_key:
219
222
  specification_version: 4
220
223
  summary: Provides a fake SQS server that you can run locally to test against
@@ -224,6 +227,7 @@ test_files:
224
227
  - spec/spec_helper.rb
225
228
  - spec/unit/api_spec.rb
226
229
  - spec/unit/catch_errors_spec.rb
230
+ - spec/unit/collection_view_spec.rb
227
231
  - spec/unit/error_response_spec.rb
228
232
  - spec/unit/message_spec.rb
229
233
  - spec/unit/queue_factory_spec.rb