mock_beaneater 0.0.2

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.
@@ -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: