bogus 0.0.3.rc.1 → 0.0.3.rc.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bogus (0.0.3.rc.1)
4
+ bogus (0.0.3.rc.2)
5
5
  dependor (>= 0.0.4)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Bogus
2
2
 
3
3
  [![build status](https://secure.travis-ci.org/psyho/bogus.png)](http://travis-ci.org/psyho/bogus)
4
- [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/psyho/bogus)
4
+ [![Code Climate](https://codeclimate.com/github/psyho/bogus.png)](https://codeclimate.com/github/psyho/bogus)
5
5
 
6
6
  ## What is Bogus?
7
7
 
data/features/.nav CHANGED
@@ -6,6 +6,7 @@
6
6
  - global_fake_configuration.feature
7
7
  - anonymous_doubles.feature
8
8
  - replacing_classes.feature
9
+ - duck_types.feature
9
10
  - safe_stubbing (Safe Stubbing):
10
11
  - safe_mocking.feature
11
12
  - safe_stubbing.feature
@@ -21,4 +21,5 @@ Initial version.
21
21
  - Removed dependency on RR
22
22
  - verifies_contracts records on described_class instead of class based on fake name
23
23
  - Replacing classes with fakes
24
+ - Extracting common interface out of multpile classes to create duck types
24
25
 
@@ -0,0 +1,134 @@
1
+ Feature: Faking duck types
2
+
3
+ Sometimes, your system contains more than one class that can satisfy a given role. Which of the possible implementations do you pick then, and how can you make sure that their interfaces stay in sync?
4
+
5
+ Bogus gives you a way of extracting the "lowest common interface" out of multiple classes. All you need to do is just pass the classes in question to the `make_duck` method:
6
+
7
+ make_duck(DatabaseLogger, NetworkLogger, DevNullLogger)
8
+
9
+ This call will return a new class, that contains only the methods that exist in the public interface of all of the given classes, and in all of them have the same signature.
10
+
11
+ To make things easier for you, Bogus will automatically make a duck type for you, every time you return multiple classes from fake:
12
+
13
+ fake(:logger) { [DatabaseLogger, NetworkLogger, DevNullLogger] }
14
+
15
+ It is of course also possible to do the same thing in the global fake configuration:
16
+
17
+ Bogus.fakes do
18
+ fake :logger, class: proc{
19
+ [DatabaseLogger, NetworkLogger, DevNullLogger]
20
+ }
21
+ end
22
+
23
+ Background:
24
+ Given a file named "foo.rb" with:
25
+ """ruby
26
+ class DatabaseLogger
27
+ def error(message); end
28
+ def warn(message, level); end
29
+ def connection; end
30
+ end
31
+
32
+ class NetworkLogger
33
+ def error(message); end
34
+ def warn(message, level); end
35
+ def socket; end
36
+ end
37
+
38
+ class DevNullLogger
39
+ def error(message); end
40
+ def warn(message, level); end
41
+ def debug(message); end
42
+ end
43
+
44
+ class ExceptionNotifier
45
+ def initialize(logger)
46
+ @logger = logger
47
+ end
48
+
49
+ def notify(exception)
50
+ @logger.error(exception)
51
+ end
52
+ end
53
+
54
+ """
55
+
56
+ Scenario: Copying instance methods
57
+ Then spec file with following content should pass:
58
+ """ruby
59
+ describe "make_duck" do
60
+ let(:duck) { make_duck(DatabaseLogger, NetworkLogger,
61
+ DevNullLogger) }
62
+ let(:duck_instance) { duck.new }
63
+
64
+ it "responds to error" do
65
+ duck_instance.should respond_to(:error)
66
+ end
67
+
68
+ it "has arity 1 for error" do
69
+ duck_instance.method(:error).arity.should == 1
70
+ end
71
+
72
+ it "responds to warn" do
73
+ duck_instance.should respond_to(:warn)
74
+ end
75
+
76
+ it "has arity 2 for warn" do
77
+ duck_instance.method(:warn).arity.should == 2
78
+ end
79
+
80
+ it "does not respond to connection" do
81
+ duck_instance.should_not respond_to(:connection)
82
+ end
83
+
84
+ it "does not respond to socket" do
85
+ duck_instance.should_not respond_to(:socket)
86
+ end
87
+
88
+ it "does not respond to debug" do
89
+ duck_instance.should_not respond_to(:debug)
90
+ end
91
+ end
92
+ """
93
+
94
+ Scenario: Faking duck types
95
+ Then spec file with following content should pass:
96
+ """ruby
97
+ describe "fake with multiple classes" do
98
+ fake(:logger) { [DatabaseLogger,
99
+ NetworkLogger,
100
+ DevNullLogger] }
101
+
102
+ let(:notifier) { ExceptionNotifier.new(logger) }
103
+
104
+ it "logs the exception" do
105
+ notifier.notify("whoa!")
106
+
107
+ logger.should have_received.error("whoa!")
108
+ end
109
+ end
110
+ """
111
+
112
+ Scenario: Globally configured duck types
113
+ Then spec file with following content should pass:
114
+ """ruby
115
+ Bogus.fakes do
116
+ logger_implementations = proc{ [DatabaseLogger,
117
+ NetworkLogger,
118
+ DevNullLogger] }
119
+
120
+ fake :logger, class: logger_implementations
121
+ end
122
+
123
+ describe "fake with multiple classes" do
124
+ fake(:logger)
125
+
126
+ let(:notifier) { ExceptionNotifier.new(logger) }
127
+
128
+ it "logs the exception" do
129
+ notifier.notify("whoa!")
130
+
131
+ logger.should have_received.error("whoa!")
132
+ end
133
+ end
134
+ """
@@ -0,0 +1,22 @@
1
+ module Bogus
2
+ class ClassMethods
3
+ extend Bogus::Takes
4
+ takes :klass
5
+
6
+ def all
7
+ klass.methods - Class.methods
8
+ end
9
+
10
+ def get(name)
11
+ klass.method(name)
12
+ end
13
+
14
+ def remove(name)
15
+ klass.instance_eval "undef #{name}"
16
+ end
17
+
18
+ def define(body)
19
+ klass.instance_eval(body)
20
+ end
21
+ end
22
+ end
@@ -2,39 +2,13 @@ module Bogus
2
2
  class CopiesClasses
3
3
  extend Takes
4
4
 
5
- takes :makes_substitute_methods
5
+ takes :copies_methods
6
6
 
7
7
  def copy(klass)
8
8
  copy_class = Class.new(Bogus::Fake)
9
-
10
9
  copy_class.__copied_class__ = klass
11
- copy_instance_methods(klass, copy_class)
12
- copy_class_methods(klass, copy_class)
13
-
14
- return copy_class
15
- end
16
-
17
- private
18
-
19
- def copy_instance_methods(klass, copy_class)
20
- instance_methods = klass.instance_methods - Object.instance_methods
21
-
22
- instance_methods.each do |name|
23
- copy_class.class_eval(method_as_string(klass.instance_method(name)))
24
- end
10
+ copies_methods.copy(klass, copy_class)
11
+ copy_class
25
12
  end
26
-
27
- def copy_class_methods(klass, copy_class)
28
- klass_methods = klass.methods - Class.methods
29
-
30
- klass_methods.each do |name|
31
- copy_class.instance_eval(method_as_string(klass.method(name)))
32
- end
33
- end
34
-
35
- def method_as_string(method)
36
- makes_substitute_methods.stringify(method)
37
- end
38
-
39
13
  end
40
14
  end
@@ -0,0 +1,31 @@
1
+ module Bogus
2
+ class CopiesMethods
3
+ extend Bogus::Takes
4
+
5
+ takes :makes_substitute_methods,
6
+ :instance_methods,
7
+ :class_methods
8
+
9
+ def copy(from, into)
10
+ copy_methods(from, into, instance_methods)
11
+ copy_methods(from, into, class_methods)
12
+ end
13
+
14
+ private
15
+
16
+ def copy_methods(original_class, copy_class, make_methods)
17
+ original_methods = make_methods.call(original_class)
18
+ copy_methods = make_methods.call(copy_class)
19
+
20
+ original_methods.all.each do |name|
21
+ method = original_methods.get(name)
22
+ body = method_as_string(method)
23
+ copy_methods.define(body)
24
+ end
25
+ end
26
+
27
+ def method_as_string(method)
28
+ makes_substitute_methods.stringify(method)
29
+ end
30
+ end
31
+ end
@@ -4,11 +4,12 @@ module Bogus
4
4
 
5
5
  extend Takes
6
6
 
7
- takes :copies_classes, :converts_name_to_class
7
+ takes :copies_classes, :converts_name_to_class, :makes_ducks
8
8
 
9
9
  def create(name, opts = {}, &block)
10
10
  klass = self.klass(name, &block)
11
- klass_copy = copies_classes.copy(klass)
11
+ duck = make_duck(klass)
12
+ klass_copy = copies_classes.copy(duck)
12
13
 
13
14
  mode = opts.fetch(:as, :instance)
14
15
 
@@ -28,5 +29,10 @@ module Bogus
28
29
  return block.call if block_given?
29
30
  converts_name_to_class.convert(name)
30
31
  end
32
+
33
+ def make_duck(klass)
34
+ return klass unless klass.is_a?(Array)
35
+ makes_ducks.make(*klass)
36
+ end
31
37
  end
32
38
  end
data/lib/bogus/double.rb CHANGED
@@ -11,8 +11,8 @@ module Bogus
11
11
  end
12
12
 
13
13
  def stubs(name, *args, &return_value)
14
- double_tracker.track(object)
15
14
  verifies_stub_definition.verify!(object, name, args)
15
+ double_tracker.track(object)
16
16
  records_double_interactions.record(object, name, args, &return_value)
17
17
  overwrites_methods.overwrite(object, name)
18
18
  object.__shadow__.stubs(name, *args, &return_value)
@@ -19,6 +19,7 @@ module Bogus
19
19
  define_singleton_method(name, method)
20
20
  end
21
21
  @__overwritten_methods__ = {}
22
+ @__shadow__ = nil
22
23
  end
23
24
  end
24
25
  end
@@ -44,6 +44,14 @@ module Bogus
44
44
  create_double(object).mock
45
45
  end
46
46
 
47
+ def instance_methods(klass)
48
+ inject(InstanceMethods, klass: klass)
49
+ end
50
+
51
+ def class_methods(klass)
52
+ inject(ClassMethods, klass: klass)
53
+ end
54
+
47
55
  def have_received_matcher
48
56
  inject(HaveReceivedMatcher)
49
57
  end
@@ -0,0 +1,22 @@
1
+ module Bogus
2
+ class InstanceMethods
3
+ extend Bogus::Takes
4
+ takes :klass
5
+
6
+ def all
7
+ klass.instance_methods - Object.instance_methods
8
+ end
9
+
10
+ def get(name)
11
+ klass.instance_method(name)
12
+ end
13
+
14
+ def remove(name)
15
+ klass.send(:undef_method, name)
16
+ end
17
+
18
+ def define(body)
19
+ klass.class_eval(body)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ module Bogus
2
+ class MakesDucks
3
+ extend Bogus::Takes
4
+
5
+ takes :class_methods, :instance_methods, :makes_subtypes
6
+
7
+ def make(klass, *classes)
8
+ duck = makes_subtypes.make(klass)
9
+ classes.each do |klass|
10
+ remove_methods(class_methods.call(duck),
11
+ class_methods.call(klass))
12
+ remove_methods(instance_methods.call(duck),
13
+ instance_methods.call(klass))
14
+ end
15
+ duck
16
+ end
17
+
18
+ private
19
+
20
+ def remove_methods(duck_methods, klass_methods)
21
+ not_in_klass = duck_methods.all - klass_methods.all
22
+ not_in_klass.each { |name| duck_methods.remove(name) }
23
+
24
+ duck_methods.all.each do |name|
25
+ duck_method = duck_methods.get(name)
26
+ klass_method = klass_methods.get(name)
27
+ unless same_interface?(duck_method, klass_method)
28
+ duck_methods.remove(name)
29
+ end
30
+ end
31
+ end
32
+
33
+ def same_interface?(method1, method2)
34
+ method1.parameters == method2.parameters
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ module Bogus
2
+ class MakesSubtypes
3
+ extend Bogus::Takes
4
+
5
+ takes :copies_methods
6
+
7
+ def make(klass)
8
+ subtype = klass.is_a?(Class) ? Class.new : Module.new
9
+ copies_methods.copy(klass, subtype)
10
+ subtype
11
+ end
12
+ end
13
+ end
@@ -20,6 +20,10 @@ module Bogus
20
20
  Bogus.create_mock(*args)
21
21
  end
22
22
 
23
+ def make_duck(*args)
24
+ Bogus.make_duck(*args)
25
+ end
26
+
23
27
  def any_args
24
28
  Bogus::AnyArgs
25
29
  end
@@ -17,6 +17,7 @@ module Bogus
17
17
  end
18
18
 
19
19
  def reset!
20
+ clear
20
21
  @injector = Bogus::Injector.new
21
22
  end
22
23
 
@@ -28,6 +29,10 @@ module Bogus
28
29
  inject.create_mock(*args)
29
30
  end
30
31
 
32
+ def make_duck(*args)
33
+ inject.makes_ducks.make(*args)
34
+ end
35
+
31
36
  def have_received(*args)
32
37
  inject.have_received_matcher(*args).method_call
33
38
  end
@@ -42,6 +47,11 @@ module Bogus
42
47
 
43
48
  def after_each_test
44
49
  ensure_all_expectations_satisfied!
50
+ ensure
51
+ clear
52
+ end
53
+
54
+ def clear
45
55
  reset_stubbed_methods
46
56
  clear_expectations
47
57
  reset_overwritten_classes
@@ -9,9 +9,7 @@ module Bogus
9
9
  end
10
10
 
11
11
  def teardown_mocks_for_rspec
12
- Bogus.reset_stubbed_methods
13
- Bogus.clear_expectations
14
- Bogus.reset_overwritten_classes
12
+ Bogus.clear
15
13
  end
16
14
  end
17
15
  end
data/lib/bogus/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bogus
2
- VERSION = "0.0.3.rc.1"
2
+ VERSION = "0.0.3.rc.2"
3
3
  end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Bogus
4
+ describe ClassMethods do
5
+ class SampleClass
6
+ def foo(bar)
7
+ end
8
+
9
+ def self.bar(bam)
10
+ end
11
+
12
+ def self.hello
13
+ end
14
+ end
15
+
16
+ let(:class_methods) { ClassMethods.new(SampleClass) }
17
+
18
+ it "lists the instance methods" do
19
+ class_methods.all.should == [:bar, :hello]
20
+ end
21
+
22
+ it "returns the instance methods by name" do
23
+ class_methods.get(:bar).should ==
24
+ SampleClass.method(:bar)
25
+ end
26
+
27
+ it "removes methods by name" do
28
+ class_methods.remove(:hello)
29
+
30
+ SampleClass.should_not respond_to(:hello)
31
+ end
32
+
33
+ it "defines instance methods" do
34
+ class_methods.define <<-EOF
35
+ def greet(name)
36
+ return "Hello, " + name + "!"
37
+ end
38
+ EOF
39
+
40
+ SampleClass.greet("Joe").should == "Hello, Joe!"
41
+ end
42
+ end
43
+ end
44
+
@@ -1,7 +1,7 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe Bogus::Configuration do
4
- after { Bogus.reset! }
4
+ before { Bogus.reset! }
5
5
 
6
6
  it "stores the modules to be searched" do
7
7
  Bogus.configure do |c|
@@ -57,9 +57,7 @@ describe Bogus::CopiesClasses do
57
57
  end
58
58
  end
59
59
 
60
- let(:method_stringifier) { isolate(Bogus::MethodStringifier) }
61
- let(:makes_substitute_methods) { isolate(Bogus::MakesSubstituteMethods) }
62
- let(:copies_classes) { isolate(Bogus::CopiesClasses) }
60
+ let(:copies_classes) { Bogus.inject.copies_classes }
63
61
  let(:fake_class) { copies_classes.copy(klass) }
64
62
  let(:fake) { fake_class.new }
65
63
 
@@ -1,11 +1,12 @@
1
1
  require_relative '../spec_helper'
2
2
 
3
3
  describe Bogus::CreatesFakes do
4
- let(:fake_class) { stub() }
5
- let(:fake_instance) { stub() }
6
- let(:converts_name_to_class) { stub() }
7
- let(:copies_classes) { stub() }
8
- let(:creates_fakes) { Bogus::CreatesFakes.new(copies_classes, converts_name_to_class) }
4
+ let(:fake_class) { stub }
5
+ let(:fake_instance) { stub }
6
+ let(:converts_name_to_class) { stub }
7
+ let(:copies_classes) { stub }
8
+ let(:makes_ducks) { stub }
9
+ let(:creates_fakes) { isolate(Bogus::CreatesFakes) }
9
10
 
10
11
  module Foo
11
12
  end
@@ -56,4 +57,18 @@ describe Bogus::CreatesFakes do
56
57
  copies_classes.should_not have_received.convert
57
58
  end
58
59
  end
60
+
61
+ module FooBarDuck
62
+ end
63
+
64
+ context "with multiple classes" do
65
+ it "creates a duck type out of those classes and fakes it" do
66
+ stub(makes_ducks).make(Foo, Bar) { FooBarDuck }
67
+ stub(copies_classes).copy(FooBarDuck) { :the_fake }
68
+
69
+ fake = creates_fakes.create(:role, as: :class) { [Foo, Bar] }
70
+
71
+ fake.should == :the_fake
72
+ end
73
+ end
59
74
  end
@@ -9,6 +9,16 @@ module Bogus
9
9
  double.stub.foo("a", "b") { "the result" }
10
10
  end
11
11
 
12
+ it "does not track existence of the double if verify fails" do
13
+ stub(verifies_stub_definition).verify!(object, :foo, ["a", "b"]) { raise NameError }
14
+
15
+ expect {
16
+ double.stub.foo("a", "b") { "the result" }
17
+ }.to raise_error
18
+
19
+ double_tracker.should_not have_received.track(object)
20
+ end
21
+
12
22
  it "verifies stub definition" do
13
23
  mock(verifies_stub_definition).verify!(object, :foo, ["a", "b"])
14
24
 
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module Bogus
4
+ describe InstanceMethods do
5
+ class SampleClass
6
+ def foo(bar)
7
+ end
8
+
9
+ def hello
10
+ end
11
+
12
+ def self.bar(bam)
13
+ end
14
+ end
15
+
16
+ let(:instance_methods) { InstanceMethods.new(SampleClass) }
17
+
18
+ it "lists the instance methods" do
19
+ instance_methods.all.should == [:foo, :hello]
20
+ end
21
+
22
+ it "returns the instance methods by name" do
23
+ instance_methods.get(:foo).should ==
24
+ SampleClass.instance_method(:foo)
25
+ end
26
+
27
+ it "removes methods by name" do
28
+ instance_methods.remove(:hello)
29
+
30
+ SampleClass.new.should_not respond_to(:hello)
31
+ end
32
+
33
+ it "defines instance methods" do
34
+ instance_methods.define <<-EOF
35
+ def greet(name)
36
+ return "Hello, " + name + "!"
37
+ end
38
+ EOF
39
+
40
+ instance = SampleClass.new
41
+
42
+ instance.greet("Joe").should == "Hello, Joe!"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ module Bogus
4
+ describe MakesDucks do
5
+ class DatabaseLogger
6
+ def debug(message); end
7
+ def warn(*args); end
8
+ def error(message, another_arg); end
9
+ def log(opts = {}); end
10
+
11
+ def self.foo(x, y, z = 1); end
12
+ def self.bar(x, y); end
13
+ end
14
+
15
+ class NetworkLogger
16
+ def debug(message); end
17
+ def warn(*args); end
18
+ def error(message); end
19
+ def socket; end
20
+
21
+ def self.foo(x, y, z = 1); end
22
+ def self.bar(x, y, z); end
23
+ def self.baz; end
24
+ end
25
+
26
+ let(:class_methods) do
27
+ lambda{ |klass| ClassMethods.new(klass) }
28
+ end
29
+
30
+ let(:instance_methods) do
31
+ lambda{ |klass| InstanceMethods.new(klass) }
32
+ end
33
+
34
+ let(:makes_ducks) { Bogus.inject.makes_ducks }
35
+ let(:duck) { makes_ducks.make(DatabaseLogger, NetworkLogger) }
36
+
37
+ describe "the returned class" do
38
+ subject { duck }
39
+
40
+ it { should respond_to(:foo) }
41
+
42
+ it "should have arity -3 for foo" do
43
+ duck.method(:foo).arity.should == -3
44
+ end
45
+
46
+ it { should_not respond_to(:bar) }
47
+ it { should_not respond_to(:baz) }
48
+ end
49
+
50
+ describe "instances of the returned class" do
51
+ subject { duck.new }
52
+
53
+ it { should respond_to(:debug) }
54
+ it { should respond_to(:warn) }
55
+ it { should_not respond_to(:error) }
56
+ it { should_not respond_to(:socket) }
57
+ end
58
+
59
+ module AlwaysEnabled
60
+ def enabled?; true; end
61
+ extend self
62
+ end
63
+
64
+ module AlwaysDisabled
65
+ def enabled?; false; end
66
+ extend self
67
+ end
68
+
69
+ context "with modules" do
70
+ let(:duck) { makes_ducks.make(AlwaysDisabled, AlwaysEnabled)}
71
+
72
+ let(:duck_instance) do
73
+ object = Object.new
74
+ object.extend duck
75
+ object
76
+ end
77
+
78
+ it "copies class methods" do
79
+ duck.should respond_to(:enabled?)
80
+ end
81
+
82
+ it "copies instance methods" do
83
+ duck_instance.should respond_to(:enabled?)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -18,7 +18,7 @@ describe Bogus::MockingDSL do
18
18
  end
19
19
 
20
20
  before do
21
- Bogus.send(:clear_expectations)
21
+ Bogus.reset!
22
22
  end
23
23
 
24
24
  describe "#stub" do
@@ -165,6 +165,28 @@ describe Bogus::MockingDSL do
165
165
  end
166
166
  end
167
167
 
168
+ class ExampleForMockingOnConstants
169
+ def self.bar(foo)
170
+ end
171
+
172
+ def self.baz
173
+ end
174
+ end
175
+
176
+ it "clears expected interactions from constants" do
177
+ Mocker.mock(ExampleForMockingOnConstants).bar("foo")
178
+
179
+ expect {
180
+ Bogus.after_each_test
181
+ }.to raise_error(Bogus::NotAllExpectationsSatisfied)
182
+
183
+ Mocker.stub(ExampleForMockingOnConstants).baz
184
+
185
+ expect {
186
+ Bogus.after_each_test
187
+ }.not_to raise_error(Bogus::NotAllExpectationsSatisfied)
188
+ end
189
+
168
190
  context "with fakes" do
169
191
  it_behaves_like "mocking dsl" do
170
192
  let(:baz) { fake }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bogus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3.rc.1
4
+ version: 0.0.3.rc.2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000 Z
12
+ date: 2013-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dependor
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70101148931040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: 0.0.4
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: 0.0.4
24
+ version_requirements: *70101148931040
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: rake
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &70101148930480 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0'
38
33
  type: :development
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
35
+ version_requirements: *70101148930480
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: rspec
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &70101148930000 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ! '>='
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: '0'
54
44
  type: :development
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
46
+ version_requirements: *70101148930000
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: cucumber
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &70101148929420 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ! '>='
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: '0'
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ! '>='
76
- - !ruby/object:Gem::Version
77
- version: '0'
57
+ version_requirements: *70101148929420
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: aruba
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &70101148928920 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ! '>='
@@ -85,15 +65,10 @@ dependencies:
85
65
  version: '0'
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
68
+ version_requirements: *70101148928920
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: guard
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &70101148928480 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
74
  - - ! '>='
@@ -101,15 +76,10 @@ dependencies:
101
76
  version: '0'
102
77
  type: :development
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - ! '>='
108
- - !ruby/object:Gem::Version
109
- version: '0'
79
+ version_requirements: *70101148928480
110
80
  - !ruby/object:Gem::Dependency
111
81
  name: guard-rspec
112
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &70101148927700 !ruby/object:Gem::Requirement
113
83
  none: false
114
84
  requirements:
115
85
  - - ! '>='
@@ -117,15 +87,10 @@ dependencies:
117
87
  version: '0'
118
88
  type: :development
119
89
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ! '>='
124
- - !ruby/object:Gem::Version
125
- version: '0'
90
+ version_requirements: *70101148927700
126
91
  - !ruby/object:Gem::Dependency
127
92
  name: guard-cucumber
128
- requirement: !ruby/object:Gem::Requirement
93
+ requirement: &70101148927140 !ruby/object:Gem::Requirement
129
94
  none: false
130
95
  requirements:
131
96
  - - ! '>='
@@ -133,15 +98,10 @@ dependencies:
133
98
  version: '0'
134
99
  type: :development
135
100
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - ! '>='
140
- - !ruby/object:Gem::Version
141
- version: '0'
101
+ version_requirements: *70101148927140
142
102
  - !ruby/object:Gem::Dependency
143
103
  name: guard-ctags-bundler
144
- requirement: !ruby/object:Gem::Requirement
104
+ requirement: &70101148942700 !ruby/object:Gem::Requirement
145
105
  none: false
146
106
  requirements:
147
107
  - - ! '>='
@@ -149,15 +109,10 @@ dependencies:
149
109
  version: '0'
150
110
  type: :development
151
111
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - ! '>='
156
- - !ruby/object:Gem::Version
157
- version: '0'
112
+ version_requirements: *70101148942700
158
113
  - !ruby/object:Gem::Dependency
159
114
  name: growl
160
- requirement: !ruby/object:Gem::Requirement
115
+ requirement: &70101148942000 !ruby/object:Gem::Requirement
161
116
  none: false
162
117
  requirements:
163
118
  - - ! '>='
@@ -165,15 +120,10 @@ dependencies:
165
120
  version: '0'
166
121
  type: :development
167
122
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
- requirements:
171
- - - ! '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
123
+ version_requirements: *70101148942000
174
124
  - !ruby/object:Gem::Dependency
175
125
  name: libnotify
176
- requirement: !ruby/object:Gem::Requirement
126
+ requirement: &70101148941300 !ruby/object:Gem::Requirement
177
127
  none: false
178
128
  requirements:
179
129
  - - ! '>='
@@ -181,15 +131,10 @@ dependencies:
181
131
  version: '0'
182
132
  type: :development
183
133
  prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
- requirements:
187
- - - ! '>='
188
- - !ruby/object:Gem::Version
189
- version: '0'
134
+ version_requirements: *70101148941300
190
135
  - !ruby/object:Gem::Dependency
191
136
  name: rr
192
- requirement: !ruby/object:Gem::Requirement
137
+ requirement: &70101148939560 !ruby/object:Gem::Requirement
193
138
  none: false
194
139
  requirements:
195
140
  - - ! '>='
@@ -197,15 +142,10 @@ dependencies:
197
142
  version: '0'
198
143
  type: :development
199
144
  prerelease: false
200
- version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
- requirements:
203
- - - ! '>='
204
- - !ruby/object:Gem::Version
205
- version: '0'
145
+ version_requirements: *70101148939560
206
146
  - !ruby/object:Gem::Dependency
207
147
  name: relish
208
- requirement: !ruby/object:Gem::Requirement
148
+ requirement: &70101148937800 !ruby/object:Gem::Requirement
209
149
  none: false
210
150
  requirements:
211
151
  - - ! '>='
@@ -213,12 +153,7 @@ dependencies:
213
153
  version: '0'
214
154
  type: :development
215
155
  prerelease: false
216
- version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
- requirements:
219
- - - ! '>='
220
- - !ruby/object:Gem::Version
221
- version: '0'
156
+ version_requirements: *70101148937800
222
157
  description: Decreases the need to write integration tests by ensuring that the things
223
158
  you stub or mock actually exist.
224
159
  email:
@@ -246,6 +181,7 @@ files:
246
181
  - features/contract_tests/readme.md
247
182
  - features/contract_tests/return_value_contracts.feature
248
183
  - features/fakes/anonymous_doubles.feature
184
+ - features/fakes/duck_types.feature
249
185
  - features/fakes/fake_objects.feature
250
186
  - features/fakes/global_fake_configuration.feature
251
187
  - features/fakes/readme.md
@@ -264,10 +200,12 @@ files:
264
200
  - lib/bogus/adds_recording.rb
265
201
  - lib/bogus/any_args.rb
266
202
  - lib/bogus/anything.rb
203
+ - lib/bogus/class_methods.rb
267
204
  - lib/bogus/configuration.rb
268
205
  - lib/bogus/contract_not_fulfilled.rb
269
206
  - lib/bogus/converts_name_to_class.rb
270
207
  - lib/bogus/copies_classes.rb
208
+ - lib/bogus/copies_methods.rb
271
209
  - lib/bogus/creates_fakes.rb
272
210
  - lib/bogus/creates_fakes_with_stubbed_methods.rb
273
211
  - lib/bogus/double.rb
@@ -279,10 +217,13 @@ files:
279
217
  - lib/bogus/has_overwritten_methods.rb
280
218
  - lib/bogus/have_received_matcher.rb
281
219
  - lib/bogus/injector.rb
220
+ - lib/bogus/instance_methods.rb
282
221
  - lib/bogus/interaction.rb
283
222
  - lib/bogus/interaction_presenter.rb
284
223
  - lib/bogus/interactions_repository.rb
224
+ - lib/bogus/makes_ducks.rb
285
225
  - lib/bogus/makes_substitute_methods.rb
226
+ - lib/bogus/makes_subtypes.rb
286
227
  - lib/bogus/method_stringifier.rb
287
228
  - lib/bogus/mocking_dsl.rb
288
229
  - lib/bogus/multi_stubber.rb
@@ -313,6 +254,7 @@ files:
313
254
  - rbs.sh
314
255
  - spec/bogus/adds_recording_spec.rb
315
256
  - spec/bogus/anything_spec.rb
257
+ - spec/bogus/class_methods_spec.rb
316
258
  - spec/bogus/configuration_spec.rb
317
259
  - spec/bogus/converts_name_to_class_spec.rb
318
260
  - spec/bogus/copies_classes_spec.rb
@@ -324,8 +266,10 @@ files:
324
266
  - spec/bogus/fake_registry_spec.rb
325
267
  - spec/bogus/fakes_classes_spec.rb
326
268
  - spec/bogus/have_received_matcher_spec.rb
269
+ - spec/bogus/instance_methods_spec.rb
327
270
  - spec/bogus/interaction_spec.rb
328
271
  - spec/bogus/interactions_repository_spec.rb
272
+ - spec/bogus/makes_ducks_spec.rb
329
273
  - spec/bogus/makes_substitute_methods_spec.rb
330
274
  - spec/bogus/mocking_dsl_spec.rb
331
275
  - spec/bogus/multi_stubber_spec.rb
@@ -359,7 +303,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
359
303
  version: '0'
360
304
  segments:
361
305
  - 0
362
- hash: 1397815823919576770
306
+ hash: 3986267174147275748
363
307
  required_rubygems_version: !ruby/object:Gem::Requirement
364
308
  none: false
365
309
  requirements:
@@ -368,8 +312,69 @@ required_rubygems_version: !ruby/object:Gem::Requirement
368
312
  version: 1.3.1
369
313
  requirements: []
370
314
  rubyforge_project: bogus
371
- rubygems_version: 1.8.24
315
+ rubygems_version: 1.8.15
372
316
  signing_key:
373
317
  specification_version: 3
374
318
  summary: Create fakes to make your isolated unit tests reliable.
375
- test_files: []
319
+ test_files:
320
+ - features/authors.md
321
+ - features/changelog.md
322
+ - features/configuration_options.feature
323
+ - features/contract_tests/contract_tests_mocks.feature
324
+ - features/contract_tests/contract_tests_spies.feature
325
+ - features/contract_tests/contract_tests_stubs.feature
326
+ - features/contract_tests/readme.md
327
+ - features/contract_tests/return_value_contracts.feature
328
+ - features/fakes/anonymous_doubles.feature
329
+ - features/fakes/duck_types.feature
330
+ - features/fakes/fake_objects.feature
331
+ - features/fakes/global_fake_configuration.feature
332
+ - features/fakes/readme.md
333
+ - features/fakes/replacing_classes.feature
334
+ - features/getting_started.md
335
+ - features/license.md
336
+ - features/readme.md
337
+ - features/safe_stubbing/argument_matchers.feature
338
+ - features/safe_stubbing/readme.md
339
+ - features/safe_stubbing/safe_mocking.feature
340
+ - features/safe_stubbing/safe_stubbing.feature
341
+ - features/safe_stubbing/spies.feature
342
+ - features/step_definitions/rspec_steps.rb
343
+ - features/support/env.rb
344
+ - spec/bogus/adds_recording_spec.rb
345
+ - spec/bogus/anything_spec.rb
346
+ - spec/bogus/class_methods_spec.rb
347
+ - spec/bogus/configuration_spec.rb
348
+ - spec/bogus/converts_name_to_class_spec.rb
349
+ - spec/bogus/copies_classes_spec.rb
350
+ - spec/bogus/creates_fakes_spec.rb
351
+ - spec/bogus/creates_fakes_with_stubbed_methods_spec.rb
352
+ - spec/bogus/double_spec.rb
353
+ - spec/bogus/ensures_all_interactions_satisfied_spec.rb
354
+ - spec/bogus/fake_configuration_spec.rb
355
+ - spec/bogus/fake_registry_spec.rb
356
+ - spec/bogus/fakes_classes_spec.rb
357
+ - spec/bogus/have_received_matcher_spec.rb
358
+ - spec/bogus/instance_methods_spec.rb
359
+ - spec/bogus/interaction_spec.rb
360
+ - spec/bogus/interactions_repository_spec.rb
361
+ - spec/bogus/makes_ducks_spec.rb
362
+ - spec/bogus/makes_substitute_methods_spec.rb
363
+ - spec/bogus/mocking_dsl_spec.rb
364
+ - spec/bogus/multi_stubber_spec.rb
365
+ - spec/bogus/overwriten_classes_spec.rb
366
+ - spec/bogus/overwrites_classes_spec.rb
367
+ - spec/bogus/overwrites_methods_spec.rb
368
+ - spec/bogus/proxy_class_spec.rb
369
+ - spec/bogus/record_interactions_spec.rb
370
+ - spec/bogus/records_double_interactions_spec.rb
371
+ - spec/bogus/registers_created_fakes_spec.rb
372
+ - spec/bogus/resets_overwritten_classes_spec.rb
373
+ - spec/bogus/resets_stubbed_methods_spec.rb
374
+ - spec/bogus/shadow_spec.rb
375
+ - spec/bogus/verifies_contracts_spec.rb
376
+ - spec/bogus/verifies_stub_definition_spec.rb
377
+ - spec/spec_helper.rb
378
+ - spec/support/fake_creator_of_fakes.rb
379
+ - spec/support/sample_fake.rb
380
+ - spec/tracks_existence_of_test_doubles_spec.rb