fake_sqs 0.0.9 → 0.0.10

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: c424f4af6489d03024c8cc27bc894df0ffd8e065
4
- data.tar.gz: 81d0da9ebe28dd1d47808d14f91f6a0d490d0bef
3
+ metadata.gz: 07cc7d69931207649b20dc94e4d3522023a4e110
4
+ data.tar.gz: 6c895b6844061cd9e054777cd19b369bccdca806
5
5
  SHA512:
6
- metadata.gz: 6f8286741675fb8beb9e8206ce5102bc82183386c5ea2297917fb44e9d03ff876265c1dd3c0838717fd7b34496e4de31becb0e1a7f276c155ccbf8b3619cc2cb
7
- data.tar.gz: f0f65a2c48b86beb6a935843cff6c37fe38148a4723add4176a5c24f264ca9afd1ff5b60054ee6ad97f5b48fb89d4e8e380470a40ff537d4a57ef816de75cd50
6
+ metadata.gz: e638d676fc1ba7cab88664b90bdbd5be94db189800e5507799e42fa546f99f7ee4f5a6d823673e54f86d69b1b6faa2788164304589e18e64063dcc12ef678b66
7
+ data.tar.gz: c6aebf4bffbe5d0f7a7fdc0025b4c121ff0f0fd01a4413d76e28f4575c3d156424d7a78a486a1cbfe87f142321e8dd100ac79390b20ad7abc01fe50ab2ed3434
data/.rspec CHANGED
@@ -1,3 +1,3 @@
1
- --format progress
1
+ --format documentation
2
2
  --color
3
3
  --order random
data/README.md CHANGED
@@ -55,6 +55,15 @@ To configure, see the options in the help:
55
55
  $ fake_sqs --help
56
56
  ```
57
57
 
58
+ By default, FakeSQS uses an in-memory database (just a hash actually). To make
59
+ it persistant, run with:
60
+
61
+ ```
62
+ $ fake_sqs --database /path/to/database.yml
63
+ ```
64
+
65
+ Messages are not persisted, just the queues.
66
+
58
67
  This is an example of how to configure the official [aws-sdk gem] [aws-sdk], to
59
68
  let it talk to Fake SQS.
60
69
 
@@ -146,6 +155,24 @@ describe "something with sqs", :sqs do
146
155
  end
147
156
  ```
148
157
 
158
+ ## Development
159
+
160
+ Run all the specs:
161
+
162
+ ```
163
+ $ rake
164
+ ```
165
+
166
+ This will run the unit tests, then the acceptance tests for both types of
167
+ storage (in-memory and on disk).
168
+
169
+ When debugging an acceptance test, you can run it like this, which will redirect
170
+ output to the console:
171
+
172
+ ```
173
+ $ DEBUG=true SQS_DATABASE=tmp/sqs.yml rspec spec/acceptance
174
+ ```
175
+
149
176
 
150
177
  [fake_dynamo]: https://github.com/ananthakumaran/fake_dynamo
151
178
  [aws-sdk]: https://github.com/amazonwebservices/aws-sdk-for-ruby
data/Rakefile CHANGED
@@ -1,6 +1,31 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
+ require "tempfile"
3
4
  require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new(:spec)
5
+
6
+ namespace :spec do
7
+
8
+ desc "Run only unit specs"
9
+ RSpec::Core::RakeTask.new(:unit) do |t|
10
+ t.pattern = "spec/unit"
11
+ end
12
+
13
+ desc "Run specs with in-memory database"
14
+ RSpec::Core::RakeTask.new(:memory) do |t|
15
+ ENV["SQS_DATABASE"] = ":memory:"
16
+ t.pattern = "spec/acceptance"
17
+ end
18
+
19
+ desc "Run specs with file database"
20
+ RSpec::Core::RakeTask.new(:file) do |t|
21
+ file = Tempfile.new(["rspec-sqs", ".yml"], encoding: "utf-8")
22
+ ENV["SQS_DATABASE"] = file.path
23
+ t.pattern = "spec/acceptance"
24
+ end
25
+
26
+ end
27
+
28
+ desc "Run spec suite with both in-memory and file"
29
+ task :spec => ["spec:unit", "spec:memory", "spec:file"]
5
30
 
6
31
  task :default => :spec
@@ -6,15 +6,25 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
6
  require 'fake_sqs'
7
7
  require 'optparse'
8
8
 
9
- options = { :port => 4568, :host => "0.0.0.0", :verbose => false, :daemonize => false }
9
+ options = {
10
+ :port => 4568,
11
+ :host => "0.0.0.0",
12
+ :verbose => false,
13
+ :daemonize => false,
14
+ :database => ":memory:"
15
+ }
10
16
 
11
17
  parser = OptionParser.new do |o|
12
18
 
19
+ o.on "--database DATABASE", "Where to store the database (default: #{options[:database]})" do |database|
20
+ options[:database] = database
21
+ end
22
+
13
23
  o.on "-p", "--port PORT", Integer, "Port to use (default: #{options[:port]})" do |port|
14
24
  options[:port] = port
15
25
  end
16
26
 
17
- o.on "-o", "--bind HOST", "Host to bind to (default: 0.0.0.0)" do |host|
27
+ o.on "-o", "--bind HOST", "Host to bind to (default: #{options[:host]})" do |host|
18
28
  options[:host] = host
19
29
  end
20
30
 
@@ -30,10 +40,14 @@ parser = OptionParser.new do |o|
30
40
  options[:daemonize] = daemonize
31
41
  end
32
42
 
33
- o.on "-v", "--[no]-verbose", "Shows input parameters and output XML" do |verbose|
43
+ o.on "-v", "--[no-]verbose", "Shows input parameters and output XML" do |verbose|
34
44
  options[:verbose] = verbose
35
45
  end
36
46
 
47
+ o.on "--log FILE", "Redirect output to this logfile (default: console)" do |logfile|
48
+ options[:log] = logfile
49
+ end
50
+
37
51
  o.on_tail "--version", "Shows the version" do
38
52
  puts "fake_sqs version #{FakeSQS::VERSION}"
39
53
  exit
@@ -48,34 +62,4 @@ end
48
62
 
49
63
  parser.parse!
50
64
 
51
- app = FakeSQS::WebInterface
52
-
53
- if options[:verbose]
54
- require 'fake_sqs/show_output'
55
- app.use FakeSQS::ShowOutput
56
- end
57
-
58
- if options[:daemonize]
59
- Process.daemon(true, true)
60
- end
61
-
62
- if (pid = options[:pid])
63
- if File.exist?(pid)
64
- existing_pid = File.open(pid, 'r').read.chomp.to_i
65
- running = Process.getpgid(existing_pid) rescue false
66
- if running
67
- warn "Error, Process #{existing_pid} already running"
68
- exit 1
69
- else
70
- warn "Cleaning up stale pid at #{pid}"
71
- end
72
- end
73
- File.open(pid, 'w') { |f| f.write(Process.pid) }
74
- end
75
-
76
- app.set :port, options[:port]
77
- app.set :bind, options[:host]
78
- app.set :server, options[:server] if options[:server]
79
- server = FakeSQS.server(port: options[:port], host: options[:host])
80
- app.set :api, FakeSQS.api(server: server)
81
- app.run!
65
+ FakeSQS.to_rack(options).run!
@@ -8,24 +8,56 @@ require 'fake_sqs/queues'
8
8
  require 'fake_sqs/responder'
9
9
  require 'fake_sqs/server'
10
10
  require 'fake_sqs/version'
11
- require 'fake_sqs/web_interface'
11
+ require 'fake_sqs/memory_database'
12
+ require 'fake_sqs/file_database'
12
13
 
13
14
  module FakeSQS
14
15
 
16
+ def self.to_rack(options)
17
+
18
+ require 'fake_sqs/web_interface'
19
+ app = FakeSQS::WebInterface
20
+
21
+ if (log = options[:log])
22
+ $stdout.reopen(log, "w:utf-8")
23
+ $stderr.reopen(log, "w:utf-8")
24
+ app.enable :logging
25
+ end
26
+
27
+ if options[:verbose]
28
+ require 'fake_sqs/show_output'
29
+ app.use FakeSQS::ShowOutput
30
+ app.enable :logging
31
+ end
32
+
33
+ if options[:daemonize]
34
+ require 'fake_sqs/daemonize'
35
+ Daemonize.new(options).call
36
+ end
37
+
38
+ app.set :port, options[:port] if options[:port]
39
+ app.set :bind, options[:host] if options[:host]
40
+ app.set :server, options[:server] if options[:server]
41
+ server = FakeSQS.server(port: options[:port], host: options[:host])
42
+ app.set :api, FakeSQS.api(server: server, database: options[:database])
43
+ app
44
+ end
45
+
15
46
  def self.server(options = {})
16
47
  Server.new(options)
17
48
  end
18
49
 
19
50
  def self.api(options = {})
51
+ db = database_for(options.fetch(:database) { ":memory:" })
20
52
  API.new(
21
53
  server: options.fetch(:server),
22
- queues: queues,
54
+ queues: queues(db),
23
55
  responder: responder
24
56
  )
25
57
  end
26
58
 
27
- def self.queues
28
- Queues.new(queue_factory: queue_factory)
59
+ def self.queues(database)
60
+ Queues.new(queue_factory: queue_factory, database: database)
29
61
  end
30
62
 
31
63
  def self.responder
@@ -44,4 +76,12 @@ module FakeSQS
44
76
  Queue
45
77
  end
46
78
 
79
+ def self.database_for(name)
80
+ if name == ":memory:"
81
+ MemoryDatabase.new
82
+ else
83
+ FileDatabase.new(name)
84
+ end
85
+ end
86
+
47
87
  end
@@ -17,6 +17,7 @@ module FakeSQS
17
17
  end
18
18
  end
19
19
  queue.add_queue_attributes(results)
20
+ @queues.save(queue)
20
21
  @responder.call :SetQueueAttributes
21
22
  end
22
23
 
@@ -16,7 +16,7 @@ module FakeSQS
16
16
 
17
17
  class API
18
18
 
19
- attr_reader :queues
19
+ attr_reader :queues, :options
20
20
 
21
21
  def initialize(options = {})
22
22
  @queues = options.fetch(:queues)
@@ -25,7 +25,10 @@ module FakeSQS
25
25
 
26
26
  def call(action, *args)
27
27
  if FakeSQS::Actions.const_defined?(action)
28
- FakeSQS::Actions.const_get(action).new(@options).call(*args)
28
+ action = FakeSQS::Actions.const_get(action).new(options)
29
+ queues.transaction do
30
+ action.call(*args)
31
+ end
29
32
  else
30
33
  fail InvalidAction, "Unknown (or not yet implemented) action: #{action}"
31
34
  end
@@ -0,0 +1,30 @@
1
+ module FakeSQS
2
+ class Daemonize
3
+
4
+ attr_reader :pid
5
+
6
+ def initialize(options)
7
+ @pid = options.fetch(:pid) {
8
+ warn "No PID file specified while daemonizing!"
9
+ exit 1
10
+ }
11
+ end
12
+
13
+ def call
14
+ Process.daemon(true, true)
15
+
16
+ if File.exist?(pid)
17
+ existing_pid = File.open(pid, 'r').read.chomp.to_i
18
+ running = Process.getpgid(existing_pid) rescue false
19
+ if running
20
+ warn "Error, Process #{existing_pid} already running"
21
+ exit 1
22
+ else
23
+ warn "Cleaning up stale pid at #{pid}"
24
+ end
25
+ end
26
+ File.open(pid, 'w') { |f| f.write(Process.pid) }
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,83 @@
1
+ require "yaml/store"
2
+
3
+ module FakeSQS
4
+ class FileDatabase
5
+
6
+ attr_reader :filename
7
+
8
+ def initialize(filename)
9
+ @filename = filename
10
+ @queue_objects = {}
11
+ end
12
+
13
+ def load
14
+ transaction do
15
+ store["queues"] ||= {}
16
+ end
17
+ end
18
+
19
+ def transaction
20
+ store.transaction do
21
+ yield
22
+ end
23
+ end
24
+
25
+ def reset
26
+ transaction do
27
+ store["queues"] = {}
28
+ end
29
+ @queue_objects = {}
30
+ end
31
+
32
+ def []=(key, value)
33
+ storage[key] = value.to_yaml
34
+ end
35
+
36
+ def [](key)
37
+ value = storage[key]
38
+ if value
39
+ deserialize(key)
40
+ else
41
+ value
42
+ end
43
+ end
44
+
45
+ def each(&block)
46
+ storage.each do |key, value|
47
+ yield key, deserialize(key)
48
+ end
49
+ end
50
+
51
+ def select(&block)
52
+ new_list = storage.select do |key, value|
53
+ yield key, deserialize(key)
54
+ end
55
+ Hash[new_list.map { |key, value| [key, deserialize(key)] }]
56
+ end
57
+
58
+ def delete(key)
59
+ storage.delete(key)
60
+ end
61
+
62
+ def values
63
+ storage.map { |key, value|
64
+ deserialize(key)
65
+ }
66
+ end
67
+
68
+ private
69
+
70
+ def deserialize(key)
71
+ @queue_objects[key] ||= Queue.new(storage[key].merge(message_factory: Message))
72
+ end
73
+
74
+ def storage
75
+ store["queues"]
76
+ end
77
+
78
+ def store
79
+ @store ||= YAML::Store.new(filename)
80
+ end
81
+
82
+ end
83
+ end
@@ -0,0 +1,36 @@
1
+ require "forwardable"
2
+
3
+ module FakeSQS
4
+ class MemoryDatabase
5
+ extend Forwardable
6
+
7
+ def_delegators :@queues,
8
+ :[], :[]=, :delete, :each, :select, :values
9
+
10
+ def initialize
11
+ @in_transaction = false
12
+ end
13
+
14
+ def load
15
+ @queues = {}
16
+ end
17
+
18
+ def transaction
19
+ if @in_transaction
20
+ raise "Already in transaction"
21
+ else
22
+ @in_transaction = true
23
+ begin
24
+ yield
25
+ ensure
26
+ @in_transaction = false
27
+ end
28
+ end
29
+ end
30
+
31
+ def reset
32
+ @queues = {}
33
+ end
34
+
35
+ end
36
+ end
@@ -3,18 +3,20 @@ require 'securerandom'
3
3
  module FakeSQS
4
4
  class Message
5
5
 
6
- attr_reader :body
6
+ attr_reader :body, :id, :md5
7
7
 
8
8
  def initialize(options = {})
9
9
  @body = options.fetch("MessageBody")
10
+ @id = options.fetch("Id") { SecureRandom.uuid }
11
+ @md5 = options.fetch("MD5") { Digest::MD5.hexdigest(@body) }
10
12
  end
11
13
 
12
- def id
13
- @id ||= SecureRandom.uuid
14
- end
15
-
16
- def md5
17
- @md5 ||= Digest::MD5.hexdigest(body)
14
+ def attributes
15
+ {
16
+ "MessageBody" => body,
17
+ "Id" => id,
18
+ "MD5" => md5,
19
+ }
18
20
  end
19
21
 
20
22
  end
@@ -6,22 +6,31 @@ module FakeSQS
6
6
 
7
7
  class Queue
8
8
 
9
- attr_reader :name, :messages, :message_factory, :messages_in_flight, :arn
9
+ attr_reader :name, :messages, :message_factory, :messages_in_flight, :arn, :queue_attributes
10
10
 
11
11
  def initialize(options = {})
12
- @name = options.fetch("QueueName")
13
12
  @message_factory = options.fetch(:message_factory)
14
- @arn = "arn:aws:sqs:us-east-1:#{SecureRandom.hex}:#{@name}"
15
- @queue_attributes = {}
13
+
14
+ @name = options.fetch("QueueName")
15
+ @arn = options.fetch("Arn") { "arn:aws:sqs:us-east-1:#{SecureRandom.hex}:#{@name}" }
16
+ @queue_attributes = options.fetch("Attributes") { {} }
16
17
  reset
17
18
  end
18
19
 
20
+ def to_yaml
21
+ {
22
+ "QueueName" => name,
23
+ "Arn" => arn,
24
+ "Attributes" => queue_attributes,
25
+ }
26
+ end
27
+
19
28
  def add_queue_attributes(attrs)
20
- @queue_attributes.merge!(attrs)
29
+ queue_attributes.merge!(attrs)
21
30
  end
22
31
 
23
32
  def attributes
24
- @queue_attributes.merge(
33
+ queue_attributes.merge(
25
34
  "QueueArn" => arn,
26
35
  "ApproximateNumberOfMessages" => messages.size,
27
36
  "ApproximateNumberOfMessagesNotVisible" => messages_in_flight.size,
@@ -5,25 +5,26 @@ module FakeSQS
5
5
 
6
6
  class Queues
7
7
 
8
- attr_reader :queues, :queue_factory
8
+ attr_reader :queue_factory, :database
9
9
 
10
10
  def initialize(options = {})
11
11
  @queue_factory = options.fetch(:queue_factory)
12
- reset
12
+ @database = options.fetch(:database)
13
+ @database.load
13
14
  end
14
15
 
15
16
  def create(name, options = {})
16
- if queues[name]
17
+ if database[name]
17
18
  fail QueueNameExists, name
18
19
  else
19
20
  queue = queue_factory.new(options)
20
- queues[name] = queue
21
+ database[name] = queue
21
22
  end
22
23
  end
23
24
 
24
25
  def delete(name, options = {})
25
- if queues[name]
26
- queues.delete(name)
26
+ if database[name]
27
+ database.delete(name)
27
28
  else
28
29
  fail NonExistentQueue, name
29
30
  end
@@ -31,26 +32,38 @@ module FakeSQS
31
32
 
32
33
  def list(options = {})
33
34
  if (prefix = options["QueueNamePrefix"])
34
- queues.select { |name, queue| name =~ /^#{prefix}/ }.values
35
+ database.select { |name, queue| name.start_with?(prefix) }.values
35
36
  else
36
- queues.values
37
+ database.values
37
38
  end
38
39
  end
39
40
 
40
41
  def get(name, options = {})
41
- if queues[name]
42
- queues[name]
42
+ if (db = database[name])
43
+ db
43
44
  else
44
45
  fail NonExistentQueue, name
45
46
  end
46
47
  end
47
48
 
49
+ def transaction
50
+ database.transaction do
51
+ yield
52
+ end
53
+ end
54
+
55
+ def save(queue)
56
+ database[queue.name] = queue
57
+ end
58
+
48
59
  def reset
49
- @queues = {}
60
+ database.reset
50
61
  end
51
62
 
52
63
  def expire
53
- queues.each { |name, queue| queue.expire }
64
+ transaction do
65
+ database.each { |name, queue| queue.expire }
66
+ end
54
67
  end
55
68
 
56
69
  end
@@ -23,7 +23,8 @@ module FakeSQS
23
23
  end
24
24
 
25
25
  def start!
26
- @pid = Process.spawn(binfile, "-p", port.to_s, :out => out, :err => out)
26
+ args = [ binfile, "-p", port.to_s, verbose, logging, "--database", database, { :out => out, :err => out } ].flatten.compact
27
+ @pid = Process.spawn(*args)
27
28
  wait_until_up
28
29
  end
29
30
 
@@ -61,6 +62,25 @@ module FakeSQS
61
62
  options.fetch(key) { AWS.config.public_send(key) }
62
63
  end
63
64
 
65
+ def database
66
+ options.fetch(:database)
67
+ end
68
+
69
+ def verbose
70
+ if debug?
71
+ "--verbose"
72
+ else
73
+ "--no-verbose"
74
+ end
75
+ end
76
+
77
+ def logging
78
+ if (file = ENV["SQS_LOG"] || options[:log])
79
+ [ "--log", file ]
80
+ else
81
+ []
82
+ end
83
+ end
64
84
 
65
85
  def wait_until_up(deadline = Time.now + 2)
66
86
  fail "FakeSQS didn't start in time" if Time.now > deadline
@@ -87,7 +107,7 @@ module FakeSQS
87
107
  end
88
108
 
89
109
  def debug?
90
- ENV["DEBUG"].to_s == "true"
110
+ ENV["DEBUG"].to_s == "true" || options[:debug]
91
111
  end
92
112
 
93
113
  end
@@ -1,3 +1,3 @@
1
1
  module FakeSQS
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -9,13 +9,15 @@ AWS.config(
9
9
  :secret_access_key => "fake secret key",
10
10
  )
11
11
 
12
- $fake_sqs = FakeSQS::TestIntegration.new
12
+ db = ENV["SQS_DATABASE"] || ":memory:"
13
+ puts "\n\e[34mRunning specs with database \e[33m#{db}\e[0m"
14
+ $fake_sqs = FakeSQS::TestIntegration.new(database: db)
13
15
 
14
16
  RSpec.configure do |config|
15
17
 
16
18
  config.treat_symbols_as_metadata_keys_with_true_values = true
17
- config.before(:suite) { $fake_sqs = FakeSQS::TestIntegration.new }
18
19
  config.before(:each, :sqs) { $fake_sqs.start }
20
+ config.before(:each, :sqs) { $fake_sqs.reset }
19
21
  config.after(:suite) { $fake_sqs.stop }
20
22
 
21
23
  end
@@ -15,11 +15,13 @@ end
15
15
  describe FakeSQS::API do
16
16
 
17
17
  it "delegates actions to classes" do
18
- api = FakeSQS::API.new(:queues => [])
18
+ queues = double :queues
19
+ allow(queues).to receive(:transaction).and_yield
20
+ api = FakeSQS::API.new(:queues => queues)
19
21
 
20
22
  response = api.call("TheAction", {:foo => "bar"})
21
23
 
22
- response[:options].should eq :queues => []
24
+ response[:options].should eq :queues => queues
23
25
  response[:params].should eq :foo => "bar"
24
26
  end
25
27
 
@@ -1,16 +1,18 @@
1
1
  require 'fake_sqs/queues'
2
+ require 'fake_sqs/memory_database'
2
3
 
3
4
  describe FakeSQS::Queues do
4
5
 
6
+ let(:fake_database) { FakeSQS::MemoryDatabase.new }
5
7
  let(:queue_factory) { double :queue_factory, :new => double }
6
- subject(:queues) { FakeSQS::Queues.new(queue_factory: queue_factory) }
8
+ subject(:queues) { FakeSQS::Queues.new(queue_factory: queue_factory, database: fake_database) }
7
9
 
8
10
  describe "#create" do
9
11
 
10
12
  it "creates new queues" do
11
- queues.should have(0).queues
13
+ queues.list.size.should eq 0
12
14
  create_queue("test")
13
- queues.should have(1).queues
15
+ queues.list.size.should eq 1
14
16
  end
15
17
 
16
18
  it "uses the queue factory" do
@@ -38,9 +40,9 @@ describe FakeSQS::Queues do
38
40
 
39
41
  it "deletes an existing queue" do
40
42
  create_queue("test")
41
- queues.should have(1).queues
43
+ queues.list.size.should eq 1
42
44
  queues.delete("test")
43
- queues.should have(0).queues
45
+ queues.list.size.should eq 0
44
46
  end
45
47
 
46
48
  it "cannot delete an non-existing queue" do
@@ -62,7 +64,7 @@ describe FakeSQS::Queues do
62
64
  it "can be filtered by prefix" do
63
65
  queue1 = create_queue("test-1")
64
66
  queue2 = create_queue("test-2")
65
- queue3 = create_queue("other-3")
67
+ _ = create_queue("other-3")
66
68
  queues.list("QueueNamePrefix" => "test").should eq [ queue1, queue2 ]
67
69
  end
68
70
 
@@ -88,9 +90,9 @@ describe FakeSQS::Queues do
88
90
  it "clears all queues" do
89
91
  create_queue("foo")
90
92
  create_queue("bar")
91
- queues.should have(2).queues
93
+ queues.list.size.should eq 2
92
94
  queues.reset
93
- queues.should have(0).queues
95
+ queues.list.size.should eq 0
94
96
  end
95
97
 
96
98
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fake_sqs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - iain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-15 00:00:00.000000000 Z
11
+ date: 2013-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -167,8 +167,11 @@ files:
167
167
  - lib/fake_sqs/actions/set_queue_attributes.rb
168
168
  - lib/fake_sqs/api.rb
169
169
  - lib/fake_sqs/catch_errors.rb
170
+ - lib/fake_sqs/daemonize.rb
170
171
  - lib/fake_sqs/error_response.rb
171
172
  - lib/fake_sqs/error_responses.yml
173
+ - lib/fake_sqs/file_database.rb
174
+ - lib/fake_sqs/memory_database.rb
172
175
  - lib/fake_sqs/message.rb
173
176
  - lib/fake_sqs/queue.rb
174
177
  - lib/fake_sqs/queue_factory.rb