mock_beaneater 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mock_beaneater.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Sean Xie
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,27 @@
1
+ MockBeaneater
2
+ ==================
3
+
4
+ Mock beaneater that goes AH-HEE-OH-HEE-AH-HEE\*. Intended for use in tests.
5
+
6
+ \*sound a beaneater makes
7
+
8
+ Usage
9
+ -----
10
+
11
+ Use a mock beaneater like you would a beaneater!
12
+
13
+ >> require 'mock_beaneater'
14
+ >> mbp = MockBeaneater::Pool.new
15
+ >> mtube = mbp.tubes.find('my-tube')
16
+ >> mtube.put('my-msg')
17
+ => {:status=>"INSERTED", :body=>nil, :id=>1}
18
+ >> mjob = mtube.reserve
19
+ => #<MockBeaneater::Job id=1 body="msg">
20
+ >> mjob.delete
21
+
22
+ TODO
23
+ -----
24
+
25
+ * stats
26
+ * ttr
27
+ * ...
@@ -0,0 +1,16 @@
1
+ require "rubygems"
2
+ require "bundler"
3
+ Bundler.setup
4
+
5
+ require "rake"
6
+ require "rspec"
7
+ require "rspec/core/rake_task"
8
+
9
+ $:.push File.expand_path("../lib", __FILE__)
10
+ require "mock_beaneater"
11
+
12
+ task :default => :spec
13
+
14
+ RSpec::Core::RakeTask.new(:spec) do |t|
15
+ t.pattern = 'spec/**/*_spec.rb'
16
+ end
@@ -0,0 +1,5 @@
1
+ require "algorithms"
2
+ require "mock_beaneater/job"
3
+ require "mock_beaneater/pool"
4
+ require "mock_beaneater/tube"
5
+ require "mock_beaneater/version"
@@ -0,0 +1,2 @@
1
+ require 'mock_beaneater/job/record'
2
+ require 'mock_beaneater/job/collection'
@@ -0,0 +1,8 @@
1
+ module MockBeaneater
2
+ class Jobs
3
+ class << self
4
+ attr_accessor :count
5
+ end
6
+ @count = 0
7
+ end
8
+ end
@@ -0,0 +1,40 @@
1
+ module MockBeaneater
2
+ class Job
3
+ attr_reader :id, :body, :connection, :reserved, :tube, :visible_at, :pri
4
+
5
+ def initialize(body, tube, visible_at = Time.now.to_i, pri = 65536)
6
+ @id = (Jobs.count += 1)
7
+ @body = body
8
+ @tube = tube
9
+ @visible_at = visible_at
10
+ @pri = pri
11
+ @reserved = false
12
+ end
13
+
14
+ def release(options={})
15
+ @reserved = false
16
+ @tube.release(self)
17
+ {:status => "RELEASED",
18
+ :body => nil}
19
+ end
20
+
21
+ def delete
22
+ @reserved = false
23
+ @tube.delete(self)
24
+ {:status => "DELETED",
25
+ :body => nil}
26
+ end
27
+
28
+ def reserved?
29
+ @reserved
30
+ end
31
+
32
+ def ==(other_job)
33
+ @id == other_job.id
34
+ end
35
+
36
+ def to_s
37
+ "#<MockBeaneater::Job id=#{@id} body=#{@body.inspect}>"
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,7 @@
1
+ module MockBeaneater
2
+ class Pool
3
+ def tubes
4
+ @tubes ||= Tubes.new(self)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'mock_beaneater/tube/record'
2
+ require 'mock_beaneater/tube/collection'
@@ -0,0 +1,49 @@
1
+ module MockBeaneater
2
+ class Tubes
3
+ attr_reader :pool, :all, :watched, :used
4
+
5
+ def initialize(pool)
6
+ @pool = pool
7
+ @all = [Tube.new(@pool, 'default')]
8
+ @watched = [find('default')]
9
+ @used = find('default')
10
+ end
11
+
12
+ def find(tube_name)
13
+ first_or_create(tube_name)
14
+ end
15
+ alias_method :[], :find
16
+
17
+ def reserve(timeout=nil)
18
+ job = nil
19
+ @all.each do |t|
20
+ if t.peek('ready')
21
+ job = t.reserve(timeout)
22
+ break
23
+ end
24
+ end
25
+ job
26
+ end
27
+
28
+ def watch(*names)
29
+ names.each do |n|
30
+ @watched << first_or_create(n)
31
+ end
32
+ end
33
+
34
+ def watch!(*names)
35
+ @watched = []
36
+ names.each do |n|
37
+ @watched << first_or_create(n)
38
+ end
39
+ end
40
+
41
+ def use(tube_name)
42
+ @used = first_or_create(tube_name)
43
+ end
44
+
45
+ def first_or_create(tube_name)
46
+ @all.find { |t| t.name == tube_name } || (@all << Tube.new(@pool, tube_name)).last
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,65 @@
1
+ module MockBeaneater
2
+ class Tube
3
+ attr_reader :pool, :name
4
+
5
+ def initialize(pool, name)
6
+ @name = name.to_s
7
+ @pool = pool
8
+ @delayed = Containers::PriorityQueue.new
9
+ @ready = Containers::PriorityQueue.new
10
+ @reserved = []
11
+ end
12
+
13
+ def put(body, options={})
14
+ visible_at = (options[:delay] || 0) + Time.now.to_i
15
+ job = Job.new(body, self, visible_at, options[:pri] || 65536)
16
+ if options[:delay]
17
+ @delayed.push job, -1*visible_at
18
+ else
19
+ @ready.push job, job.pri
20
+ end
21
+ {:status => "INSERTED",
22
+ :body => nil,
23
+ :id => job.id}
24
+ end
25
+
26
+ def peek(state)
27
+ refresh_tube
28
+ if state == 'ready'
29
+ @ready.next
30
+ elsif state == 'delayed'
31
+ @delayed.next
32
+ else
33
+ nil
34
+ end
35
+ end
36
+
37
+ def reserve(timeout=nil)
38
+ refresh_tube
39
+ @ready.pop.tap { |j| @reserved << j if j }
40
+ end
41
+
42
+ def clear
43
+ @delayed.clear
44
+ @ready.clear
45
+ end
46
+
47
+ def delete(job)
48
+ @reserved.delete(job)
49
+ end
50
+
51
+ def release(job)
52
+ @reserved.delete(job)
53
+ @ready.push(job, job.pri)
54
+ end
55
+
56
+ private
57
+
58
+ def refresh_tube
59
+ while @delayed.next && @delayed.next.visible_at < Time.now.to_i
60
+ job = @delayed.pop
61
+ @ready.push job, job.pri
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,3 @@
1
+ module MockBeaneater
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mock_beaneater/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mock_beaneater"
8
+ spec.version = MockBeaneater::VERSION
9
+ spec.authors = ["Sean Xie"]
10
+ spec.email = ["seanx@referralcandy.com"]
11
+ spec.description = 'Beaneater mock for testing'
12
+ spec.summary = 'Beaneater mock for testing'
13
+ spec.homepage = 'https://rubygems.org/gems/mock_beaneater'
14
+ spec.licenses = ["MIT"]
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "algorithms", ">= 0.6.1"
22
+ spec.add_development_dependency "bundler" , "~> 1.3"
23
+ spec.add_development_dependency "rspec" , ">= 2.9.0"
24
+ spec.add_development_dependency "rake"
25
+ end
@@ -0,0 +1,88 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe MockBeaneater::Job do
4
+ describe "#initialize" do
5
+ before { @tube = double }
6
+ subject { MockBeaneater::Job.new('body', @tube) }
7
+ its(:id) { should == MockBeaneater::Jobs.count }
8
+ its(:body) { should == 'body' }
9
+ its(:tube) { should == @tube }
10
+ its(:visible_at) { should be_within(1).of(Time.now.to_i) }
11
+ its(:reserved) { should be_false }
12
+
13
+ it "should assign each job a unique id through incrementing Jobs.count" do
14
+ current_count = MockBeaneater::Jobs.count
15
+ MockBeaneater::Job.new('body', double).id.should == current_count + 1
16
+ MockBeaneater::Job.new('body', double).id.should == current_count + 2
17
+ end
18
+ end
19
+
20
+ describe "#release" do
21
+ it "should set reserved to false" do
22
+ job = MockBeaneater::Job.new('body', double(:release => nil))
23
+ job.instance_variable_set(:@reserved, true)
24
+ job.release
25
+ job.should_not be_reserved
26
+ end
27
+ it "should request for tube to release self" do
28
+ tube = double
29
+ job = MockBeaneater::Job.new('body', tube)
30
+ tube.should_receive(:release).with(job)
31
+ job.release
32
+ end
33
+ it "should return hash with status and body (nil)" do
34
+ job = MockBeaneater::Job.new('body', double(:release => nil))
35
+ job.release.should == {:status => "RELEASED", :body => nil}
36
+ end
37
+ end
38
+
39
+ describe "#delete" do
40
+ it "should set reserved to false" do
41
+ job = MockBeaneater::Job.new('body', double(:delete => nil))
42
+ job.instance_variable_set(:@reserved, true)
43
+ job.delete
44
+ job.should_not be_reserved
45
+ end
46
+ it "should request for tube to delete self" do
47
+ tube = double
48
+ job = MockBeaneater::Job.new('body', tube)
49
+ tube.should_receive(:delete).with(job)
50
+ job.delete
51
+ end
52
+ it "should return hash with status and body (nil)" do
53
+ job = MockBeaneater::Job.new('body', double(:delete => nil))
54
+ job.delete.should == {:status => "DELETED", :body => nil}
55
+ end
56
+ end
57
+
58
+ describe "#reserved?" do
59
+ it "should return reserved status" do
60
+ job = MockBeaneater::Job.new('body', double)
61
+ [true, false].each do |status|
62
+ job.instance_variable_set(:@reserved, status)
63
+ job.reserved?.should == status
64
+ end
65
+ end
66
+ end
67
+
68
+ describe "#==" do
69
+ it "should be equal if both jobs have the same id" do
70
+ job = MockBeaneater::Job.new('body', double)
71
+ job2 = MockBeaneater::Job.new('body', double)
72
+ job2.instance_variable_set(:@id, job.id)
73
+ job.should == job2
74
+ end
75
+ it "should not be equal if both jobs have different ids" do
76
+ job = MockBeaneater::Job.new('body', double)
77
+ job2 = MockBeaneater::Job.new('body', double)
78
+ job.should_not == job2
79
+ end
80
+ end
81
+
82
+ describe "#to_s" do
83
+ it "should output only job id and body" do
84
+ job = MockBeaneater::Job.new('body', double)
85
+ job.to_s.should == "#<MockBeaneater::Job id=#{job.id} body=#{job.body.inspect}>"
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe MockBeaneater::Pool do
4
+ describe "#tubes" do
5
+ before { @pool = MockBeaneater::Pool.new }
6
+ it "should return an instance of tubes" do
7
+ @pool.tubes.should be_kind_of MockBeaneater::Tubes
8
+ end
9
+ it "should return tubes with reference to self" do
10
+ @pool.tubes.pool.should == @pool
11
+ end
12
+ it "should return same instance of tubes when called multiple times" do
13
+ @pool.tubes.should == @pool.tubes
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ require 'rspec'
2
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'mock_beaneater')
3
+ require 'mock_beaneater'
@@ -0,0 +1,83 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe MockBeaneater::Tubes do
4
+ describe "#initialize" do
5
+ before do
6
+ @pool = double
7
+ @default_tube = MockBeaneater::Tube.new(@pool, 'default')
8
+ MockBeaneater::Tube.stub(:new).and_return(@default_tube)
9
+ end
10
+ subject { MockBeaneater::Tubes.new(@pool) }
11
+ its(:pool) { should == @pool }
12
+ its(:all) { should == [@default_tube] }
13
+ its(:watched) { should == [@default_tube] }
14
+ its(:used) { should == @default_tube }
15
+ end
16
+
17
+ describe "#[]" do
18
+ it "should first_or_create tube with name:tube_name" do
19
+ tubes = MockBeaneater::Tubes.new(double)
20
+ tube_name = 'tube'
21
+ tubes.should_receive(:first_or_create).with(tube_name)
22
+ tubes[tube_name]
23
+ end
24
+ end
25
+
26
+ describe "#find" do
27
+ it "should first_or_create tube with name:tube_name" do
28
+ tubes = MockBeaneater::Tubes.new(double)
29
+ tube_name = 'tube'
30
+ tubes.should_receive(:first_or_create).with(tube_name)
31
+ tubes.find(tube_name)
32
+ end
33
+ end
34
+
35
+ describe "#reserve"do
36
+ it "should return job if any in watched tubes are ready"
37
+ end
38
+
39
+ describe "#watch" do
40
+ it "should add names to watch list" do
41
+ tubes = MockBeaneater::Tubes.new(double)
42
+ tube_names = ['watch-me', 'watch-me-too']
43
+ tubes.watched.should == [tubes.find('default')]
44
+ tubes.watch(*tube_names)
45
+ tubes.watched.should == [tubes.find('default'), tubes.find(tube_names.first), tubes.find(tube_names.last)]
46
+ end
47
+ end
48
+
49
+ describe "#watch!" do
50
+ it "should set watch list to tubes with names" do
51
+ tubes = MockBeaneater::Tubes.new(double)
52
+ tube_names = ['watch-me', 'watch-me-too']
53
+ tubes.watched.should == [tubes.find('default')]
54
+ tubes.watch!(*tube_names)
55
+ tubes.watched.should == [tubes.find(tube_names.first), tubes.find(tube_names.last)]
56
+ end
57
+ end
58
+
59
+ describe "#use" do
60
+ it "should set used to first or created tube with name:tube_name" do
61
+ tubes = MockBeaneater::Tubes.new(double)
62
+ tube_name = 'use-this-tube'
63
+ tubes.used.name.should == 'default'
64
+ tubes.use(tube_name)
65
+ tubes.used.name.should == tube_name
66
+ end
67
+ end
68
+
69
+ describe "#first_or_create" do
70
+ it "should return first known tube with tube_name if exists" do
71
+ tubes = MockBeaneater::Tubes.new(double)
72
+ tube_name = 'default'
73
+ tubes.first_or_create(tube_name).should == tubes.all.first
74
+ end
75
+ it "should create tube with name:tube_name if not known" do
76
+ tubes = MockBeaneater::Tubes.new(double)
77
+ tube_name = 'new-tube'
78
+ tubes.all.map(&:name).include?(tube_name).should be_false
79
+ tubes.first_or_create(tube_name).should == tubes.all.last
80
+ tubes.all.map(&:name).include?(tube_name).should be_true
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,138 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe MockBeaneater::Tube do
4
+ describe "#initialize" do
5
+ before do
6
+ @pool = double
7
+ @name = 'tube'
8
+ end
9
+ subject { MockBeaneater::Tube.new(@pool, @name) }
10
+ its(:pool) { should == @pool }
11
+ its(:name) { should == @name }
12
+
13
+ it "should instantiate a priority queue to hold delayed jobs" do
14
+ tube = MockBeaneater::Tube.new(double, double)
15
+ tube.instance_variable_get(:@delayed).should be_kind_of Containers::PriorityQueue
16
+ end
17
+ it "should instantiate a priority queue to hold ready jobs" do
18
+ tube = MockBeaneater::Tube.new(double, double)
19
+ tube.instance_variable_get(:@ready).should be_kind_of Containers::PriorityQueue
20
+ end
21
+ it "should instantiate an empty array to hold reserved jobs" do
22
+ tube = MockBeaneater::Tube.new(double, double)
23
+ tube.instance_variable_get(:@reserved).should == []
24
+ end
25
+ end
26
+
27
+ describe "#put" do
28
+ before { @tube = MockBeaneater::Tube.new(double, double) }
29
+ it "should add job to ready container if no delay specified" do
30
+ job_id = @tube.put('body', :pri => 12345)[:id]
31
+ @tube.reserve.should do |j|
32
+ j.id.should == job_id
33
+ j.body.should == 'body'
34
+ j.pri.should == 12345
35
+ end
36
+ end
37
+ it "should add job to delayed container if delay specified" do
38
+ job_id = @tube.put('body', :delay => 3)[:id]
39
+ @tube.peek('delayed').should do |j|
40
+ j.id.should == job_id
41
+ j.body.should == 'body'
42
+ j.pri.should == 65536
43
+ end
44
+ end
45
+ it "should return hash with status, body (nil) and id" do
46
+ @tube.put('body', :pri => 12345).should ==
47
+ {:status => "INSERTED", :body => nil, :id => MockBeaneater::Jobs.count}
48
+ end
49
+ end
50
+
51
+ describe "#peek" do
52
+ before { @tube = MockBeaneater::Tube.new(double, double) }
53
+ it "should refresh_tube" do
54
+ @tube.should_receive(:refresh_tube).once
55
+ @tube.peek('ready')
56
+ end
57
+ context "peeking at ready jobs" do
58
+ it "should return next ready job if exists" do
59
+ job_id = @tube.put('im-ready')[:id]
60
+ @tube.put('im-ready-2')
61
+ @tube.put('im-ready-3')
62
+ @tube.peek('ready').id.should == job_id
63
+ end
64
+ it "should return nil if no ready job exists" do
65
+ @tube.peek('ready').should be_nil
66
+ end
67
+ end
68
+ context "peeking at delayed jobs" do
69
+ it "should return next delayed job if exists" do
70
+ @tube.put('im-delayed', :delay => 30)
71
+ @tube.put('im-delayed-2', :delay => 40)
72
+ job_id = @tube.put('im-delayed-3', :delay => 10)[:id]
73
+ @tube.peek('delayed').id.should == job_id
74
+ end
75
+ it "should return nil if no delayed job exists" do
76
+ @tube.peek('delayed').should be_nil
77
+ end
78
+ end
79
+ it "should return nil if state is not 'ready' or 'delayed'" do
80
+ @tube.peek('invalid_state').should be_nil
81
+ end
82
+ end
83
+
84
+ describe "#clear" do
85
+ it "should clear ready and delayed containers" do
86
+ tube = MockBeaneater::Tube.new(double, double)
87
+ 5.times { tube.put('job') }
88
+ tube.clear
89
+ tube.peek('ready').should be_nil
90
+ tube.peek('delayed').should be_nil
91
+ end
92
+ end
93
+
94
+ describe "#delete" do
95
+ it "should delete job from reserved container" do
96
+ tube = MockBeaneater::Tube.new(double, double)
97
+ tube.put 'job'
98
+ tube.put 'job2'
99
+ job = tube.reserve
100
+ job2 = tube.reserve
101
+ tube.instance_variable_get(:@reserved).should == [job, job2]
102
+ job.delete
103
+ tube.instance_variable_get(:@reserved).should == [job2]
104
+ end
105
+ end
106
+
107
+ describe "#release" do
108
+ it "should delete job from reserved container and add job to ready container" do
109
+ tube = MockBeaneater::Tube.new(double, double)
110
+ tube.put 'job'
111
+ job = tube.reserve
112
+ tube.instance_variable_get(:@reserved).should == [job]
113
+ job.release
114
+ tube.instance_variable_get(:@reserved).should == []
115
+ tube.peek('ready').id.should == job.id
116
+ end
117
+ end
118
+
119
+ describe "#refresh_tube" do
120
+ it "should move jobs which should be visible from delayed to ready" do
121
+ tube = MockBeaneater::Tube.new(double, double)
122
+ job_id = tube.put('job')[:id]
123
+ job2_id = tube.put('job2', :delay => 1)[:id]
124
+ job3_id = tube.put('job3', :delay => 1)[:id]
125
+ job4_id = tube.put('job4', :delay => 30)[:id]
126
+ tube.peek('ready').id.should == job_id
127
+ tube.instance_variable_get(:@ready).size.should == 1
128
+ tube.peek('delayed').id.should == job2_id
129
+ tube.instance_variable_get(:@delayed).size.should == 3
130
+ sleep 2
131
+ tube.send(:refresh_tube)
132
+ tube.peek('ready').id.should == job_id
133
+ tube.instance_variable_get(:@ready).size.should == 3
134
+ tube.peek('delayed').id.should == job4_id
135
+ tube.instance_variable_get(:@delayed).size.should == 1
136
+ end
137
+ end
138
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mock_beaneater
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Xie
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: algorithms
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.6.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.6.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 2.9.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.9.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Beaneater mock for testing
79
+ email:
80
+ - seanx@referralcandy.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - Gemfile
87
+ - LICENSE.txt
88
+ - README.md
89
+ - Rakefile
90
+ - lib/mock_beaneater.rb
91
+ - lib/mock_beaneater/job.rb
92
+ - lib/mock_beaneater/job/collection.rb
93
+ - lib/mock_beaneater/job/record.rb
94
+ - lib/mock_beaneater/pool.rb
95
+ - lib/mock_beaneater/tube.rb
96
+ - lib/mock_beaneater/tube/collection.rb
97
+ - lib/mock_beaneater/tube/record.rb
98
+ - lib/mock_beaneater/version.rb
99
+ - mock_beaneater.gemspec
100
+ - spec/job/record_spec.rb
101
+ - spec/pool_spec.rb
102
+ - spec/spec_helper.rb
103
+ - spec/tube/collection_spec.rb
104
+ - spec/tube/record_spec.rb
105
+ homepage: https://rubygems.org/gems/mock_beaneater
106
+ licenses:
107
+ - MIT
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubyforge_project:
126
+ rubygems_version: 1.8.23
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: Beaneater mock for testing
130
+ test_files:
131
+ - spec/job/record_spec.rb
132
+ - spec/pool_spec.rb
133
+ - spec/spec_helper.rb
134
+ - spec/tube/collection_spec.rb
135
+ - spec/tube/record_spec.rb
136
+ has_rdoc: