adequack 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6cbd122c01215eb0d14f941fc68ecb1f147bfe3b
4
+ data.tar.gz: 1dbcf7bc56ae09478d86f0ae47b6fe4f4db6040d
5
+ SHA512:
6
+ metadata.gz: 93f3f69ffbfaf2c76ca608bcc3bf4d1c51e652f601e203d08f59b601dbe2d86b11669b55237cda7671dd800783d262ce28bde0df55fc66834d6750ce4e7ec49a
7
+ data.tar.gz: 13c964cd0d085001f92330d13468b149c49c2a820f756ca4ff2e571aaf369cdddad0057b41fe7266ae811129aac7e81b43f6386173b4e2540fc511f46fd6e75b
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .ruby-version
7
+ .DS_Store
8
+ *.sublime-*
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ doc/
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in adequack.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ilya Zayats
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.
data/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # Adequack
2
+
3
+ Everyone likes isolation testing now. And when you do it then you stubbing and mocking a lot.
4
+ But the main concern when you use this approach is that you stubs will be out of sync with the
5
+ real objects.
6
+ Adequack addresses this issue.
7
+
8
+ ## Problem 1. Missing methods
9
+
10
+ Let's dive into this toy code:
11
+ ```ruby
12
+ class Dog
13
+ def eat_food
14
+ puts "delicious!"
15
+ end
16
+ end
17
+
18
+ class Owner
19
+ def initialize(dog)
20
+ @dog = dog
21
+ end
22
+
23
+ def feed_animal
24
+ @dog.eat_food
25
+ end
26
+ end
27
+ ```
28
+
29
+ and we are going to spec things out:
30
+
31
+ ```ruby
32
+ describe Owner do
33
+ let(:dog) { double }
34
+ subject { described_class.new dog }
35
+
36
+ it "feeds animal" do
37
+ dog.should_receive(:eat_food)
38
+ subject.feed_animal
39
+ end
40
+ end
41
+ ```
42
+
43
+ And everything will pass.
44
+
45
+ But let's imagine that a big dog food brand will come to us and pay a lot for branding:
46
+
47
+ ```ruby
48
+ class Dog
49
+ def eat_chappi
50
+ puts "delicious chappi dog food! I will recommend it to all my buddies!"
51
+ end
52
+ end
53
+ ```
54
+
55
+ So we've changed our code and we should run the tests:
56
+
57
+ ```
58
+ .
59
+
60
+ Finished in 0.00051 seconds
61
+ 1 example, 0 failures
62
+ ```
63
+
64
+ You are very confident about your test suite and you decide to deploy the changes to production.
65
+ After that big dog food brand will take that payment away because of:
66
+
67
+ ```ruby
68
+ undefined method `eat_food' for #<Dog:0x99250dc>
69
+ ```
70
+
71
+ ### Solving this with adequack
72
+
73
+ Let's replay the story again but with a happy end:
74
+
75
+ ```ruby
76
+ require 'adequack'
77
+
78
+ module DogInterface
79
+ def eat_food; end
80
+ end
81
+
82
+ describe Dog do
83
+ subject { described_class }
84
+ it { should be_adequack_to DogInterface }
85
+ end
86
+
87
+ describe Owner do
88
+ let(:dog) { adequack_double double, DogInterface }
89
+ subject { described_class.new dog }
90
+
91
+ it "feeds animal" do
92
+ dog.should_receive(:eat_food)
93
+ subject.feed_animal
94
+ end
95
+ end
96
+ ```
97
+
98
+ and we will have 2 passing dots:
99
+
100
+ ```
101
+ .
102
+
103
+ Finished in 0.00128 seconds
104
+ 2 examples, 0 failures
105
+ ```
106
+
107
+ We should validate not only our mocks, but also that our core object really responds to the interface.
108
+ Use `be_adequack_to` matcher with a core class as an argument.
109
+
110
+ And to create doubles and stubs use `adequack_double` helper. This will return a proxy object that
111
+ will translate all calls to the object that you'll pass first (plain `double` at the example).
112
+
113
+ Let's replay our changes again:
114
+ ```ruby
115
+ class Dog
116
+ def eat_chappi
117
+ puts "delicious chappi dog food! I will recommend it to all my buddies!"
118
+ end
119
+ end
120
+ ```
121
+
122
+ and run our specs:
123
+ ```
124
+ F.
125
+
126
+ Failures:
127
+
128
+ 1) Dog
129
+ Failure/Error: it { should be_adequack_to DogInterface }
130
+ Adequack::InterfaceImplementationError:
131
+ object does not respond to 'eat_food' method
132
+
133
+ ```
134
+
135
+ Here we gon an error at the dog spec, because our core object falls out of sync with our interface.
136
+ But big sponsor is paying, so we will change the interface too:
137
+
138
+ ```ruby
139
+ module DogInterface
140
+ def eat_chappi; end
141
+ end
142
+ ```
143
+
144
+ and rerun our tests:
145
+ ```
146
+ .F
147
+
148
+ Failures:
149
+
150
+ 1) Owner feeds animal
151
+ Failure/Error: dog.should_receive(:eat_food)
152
+ Adequack::InterfaceImplementationError:
153
+ trying to stub nonexistent method
154
+
155
+ ```
156
+
157
+ Another failure, we should change our stubs too!
158
+
159
+ And at this time we will ger our payment fully.
160
+
161
+ ## Problem 2. Method signatures
162
+
163
+ But what if method is there, but signature is changed?
164
+
165
+ ```ruby
166
+ class Dog
167
+ def eat_food(brand)
168
+ puts "delicious #{brand} dog food! I will recommend it to all my buddies!"
169
+ end
170
+ end
171
+ ```
172
+
173
+ and our specs will tell you about that:
174
+
175
+ ```
176
+ .F
177
+
178
+ Failures:
179
+
180
+ 1) Owner feeds animal
181
+ Failure/Error: @dog.eat_food
182
+ Adequack::InterfaceImplementationError:
183
+ definition of method 'eat_food' differs in parameters accepted.
184
+ ```
185
+
186
+ ## Installation
187
+
188
+ Just install the gem
189
+ ```
190
+ gem install adequack
191
+ ```
192
+
193
+ and require it when you need it: `require 'adequack'`
194
+
195
+ After that your rspec tests will have `be_adequack_to` matcher and `adequack_double` helper.
196
+
197
+ ## Usage
198
+
199
+ TODO: Write full API definition here
200
+
201
+ ## Contributing
202
+
203
+ This library is considered "experimental" quality.
204
+ Your feedback would be very welcome! Pull requests are great, but issues are good too.
205
+
206
+ ## Licence
207
+
208
+ Copyright (c) 2013 Ilya Zayats
209
+
210
+ MIT License
211
+
212
+ Permission is hereby granted, free of charge, to any person obtaining
213
+ a copy of this software and associated documentation files (the
214
+ "Software"), to deal in the Software without restriction, including
215
+ without limitation the rights to use, copy, modify, merge, publish,
216
+ distribute, sublicense, and/or sell copies of the Software, and to
217
+ permit persons to whom the Software is furnished to do so, subject to
218
+ the following conditions:
219
+
220
+ The above copyright notice and this permission notice shall be
221
+ included in all copies or substantial portions of the Software.
222
+
223
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
224
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
225
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
226
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
227
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
228
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
229
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
data/adequack.gemspec ADDED
@@ -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 'adequack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "adequack"
8
+ spec.version = Adequack::VERSION
9
+ spec.authors = ["Ilya Zayats"]
10
+ spec.email = ["somebody32@gmail.com"]
11
+ spec.description = %q{Be sure that your mocks are adequate}
12
+ spec.summary = %q{Be sure that your mocks are adequate}
13
+ spec.homepage = "https://github.com/Somebody32/adequack"
14
+ spec.license = "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 "rspec", "~> 2.13"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ end
@@ -0,0 +1,43 @@
1
+ module Adequack
2
+ class Core
3
+
4
+ def self.implements(object, interface)
5
+ new(object, interface).send(:validate_ducktype)
6
+ end
7
+
8
+ private
9
+
10
+ def initialize(duck, interface)
11
+ self.duck = duck
12
+ self.interface = interface
13
+ end
14
+
15
+ def validate_ducktype
16
+ check_method_implementation(get_methods interface.public_methods )
17
+ check_method_implementation(
18
+ get_methods(interface.public_instance_methods), true
19
+ )
20
+ end
21
+
22
+ def check_method_implementation(methods, instance = false)
23
+ methods.each do |method|
24
+ if instance
25
+ name = method
26
+ defined = duck.method_defined?(method)
27
+ else
28
+ name = "self.#{method}"
29
+ defined = duck.respond_to?(method)
30
+ end
31
+
32
+ raise InterfaceImplementationError,
33
+ "object does not respond to '#{name}' method" unless defined
34
+ end
35
+ end
36
+
37
+ attr_accessor :duck, :interface
38
+
39
+ def get_methods(methods)
40
+ methods - Object.methods
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ module Adequack
2
+ module Integration
3
+ module RSpecHelpers
4
+ def adequack_double(object, interface)
5
+ Adequack.double object, interface
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ RSpec::Matchers.define :be_adequack_to do |*expected_duck_types|
12
+ expected_duck_types.each do |expected_duck_type|
13
+ match do |actual|
14
+ Adequack.check_implementation(actual, expected_duck_type)
15
+ end
16
+ end
17
+ end
18
+
19
+ RSpec.configure do |config|
20
+ config.include Adequack::Integration::RSpecHelpers
21
+ end
@@ -0,0 +1,86 @@
1
+ module Adequack
2
+ class Proxy
3
+
4
+ def initialize(target, interface)
5
+ self.target = target
6
+ self.interface = interface
7
+ end
8
+
9
+ def stub(message_or_hash, opts = {}, &block)
10
+ methods =
11
+ Hash === message_or_hash ? message_or_hash.keys : [message_or_hash]
12
+
13
+ methods.each { |m| check_method_existence m }
14
+
15
+ target.stub(message_or_hash, opts, &block)
16
+ end
17
+
18
+ alias_method :stub!, :stub
19
+
20
+ def stub_chain(*chain, &blk)
21
+ method =
22
+ String === chain.first ? chain.first.split(".").first : chain.first
23
+
24
+ check_method_existence method
25
+
26
+ target.stub_chain(*chain, &blk)
27
+ end
28
+
29
+ def should_receive(message, opts = {}, &block)
30
+ check_method_existence message
31
+
32
+ target.should_receive(message, opts, &block)
33
+ end
34
+
35
+ private
36
+
37
+ attr_accessor :target, :interface
38
+
39
+ def method_missing(name, *args, &block)
40
+ check_interface_implementation name, args
41
+ target.send name, *args, &block
42
+ end
43
+
44
+ def check_interface_implementation(name, args)
45
+ check_interface_signature(name, args) if method_in_interface?(name)
46
+ end
47
+
48
+ def check_interface_signature(name, args)
49
+ target_method = duck_type_methods.select { |m| m.name == name }.first
50
+ req_m = target_method.parameters.select { |m| m.first == :req }
51
+
52
+ if args.size < req_m.size
53
+ raise InterfaceImplementationError,
54
+ "definition of method '#{name}' differs in parameters accepted."
55
+ end
56
+
57
+ unless target_method.parameters.any? { |m| m.first == :rest }
58
+ opt_m = target_method.parameters.select { |m| m.first == :opt }
59
+
60
+ if args.size > (req_m.size + opt_m.size)
61
+ raise InterfaceImplementationError,
62
+ "definition of method '#{name}' differs in parameters accepted."
63
+ end
64
+ end
65
+ end
66
+
67
+ def check_method_existence(method)
68
+ unless method_in_interface? method
69
+ raise InterfaceImplementationError,
70
+ "trying to stub nonexistent method"
71
+ end
72
+ end
73
+
74
+ def method_in_interface?(method)
75
+ duck_type_methods.map(&:name).include? method.to_sym
76
+ end
77
+
78
+ def duck_type_methods
79
+ @duck_type_methods ||= (interface.instance_methods - Object.methods)
80
+ @duck_type_methods.map do |method_name|
81
+ interface.public_instance_method(method_name)
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,3 @@
1
+ module Adequack
2
+ VERSION = "0.0.1"
3
+ end
data/lib/adequack.rb ADDED
@@ -0,0 +1,16 @@
1
+ require "adequack/version"
2
+ require "adequack/core"
3
+ require "adequack/proxy"
4
+ require "adequack/integration/rspec_setup"
5
+
6
+ module Adequack
7
+ InterfaceImplementationError = Class.new(::StandardError)
8
+
9
+ def self.check_implementation(duck, interface)
10
+ Core.implements duck, interface
11
+ end
12
+
13
+ def self.double(core, interface)
14
+ Proxy.new core, interface
15
+ end
16
+ end
@@ -0,0 +1,129 @@
1
+ require "spec_helper"
2
+
3
+ describe Adequack do
4
+
5
+ let!(:interface) do
6
+ Class.new do
7
+ def self.evolutionize; end
8
+ def bark(what); end
9
+ def eat(tasty = true); end
10
+ def drink(what, many = true); end
11
+ def sleep(how_long, *places); end
12
+ end
13
+ end
14
+
15
+ before do
16
+ Object.send(:remove_const, :Animal) if Object.const_defined?(:Animal)
17
+ end
18
+
19
+ context "when checking interface implementation" do
20
+
21
+ it "passes when test class is ok" do
22
+ class Animal
23
+ def self.evolutionize; end
24
+ def bark(what); end
25
+ def eat(tasty = true); end
26
+ def drink(what, many = true); end
27
+ def sleep(how_long, *places); end
28
+ end
29
+
30
+ expect { described_class.check_implementation(Animal, interface) }.
31
+ not_to raise_error Adequack::InterfaceImplementationError
32
+ end
33
+
34
+ it "fails when no class method" do
35
+ class Animal
36
+ def bark(what); end
37
+ def eat(tasty = true); end
38
+ def drink(what, many = true); end
39
+ def sleep(how_long, *places); end
40
+ end
41
+
42
+ expect { described_class.check_implementation(Animal, interface) }.
43
+ to raise_error Adequack::InterfaceImplementationError,
44
+ "object does not respond to 'self.evolutionize' method"
45
+ end
46
+
47
+ it "will not take care about private and protected methods" do
48
+ class Animal
49
+ def bark(what); end
50
+ end
51
+
52
+ bad_interface = Class.new do
53
+ def bark(what); end
54
+
55
+ class << self
56
+ protected
57
+ def c_a; end
58
+ end
59
+
60
+ def self.c_b; end
61
+ private_class_method :c_b
62
+
63
+ protected
64
+ def a; end
65
+
66
+ private
67
+ def b; end
68
+ end
69
+
70
+ expect { described_class.check_implementation(Animal, bad_interface) }.
71
+ not_to raise_error Adequack::InterfaceImplementationError
72
+ end
73
+
74
+ end
75
+
76
+ context "when stubbing and mocking" do
77
+
78
+ let(:core) { double }
79
+ let(:subject) { Adequack.double core, interface }
80
+
81
+ it "let you stub methods that exists and return actual object" do
82
+ core.should_receive(:stub).with({ bark: "woof" }, {})
83
+ subject.stub(bark: "woof")
84
+ end
85
+
86
+ it "raises an error if trying to stub nonexistent method via hash" do
87
+ expect { subject.stub(muuuu: "hey hoo") }.
88
+ to raise_error Adequack::InterfaceImplementationError,
89
+ "trying to stub nonexistent method"
90
+ end
91
+
92
+ it "raises an error if trying to stub nonexistent method via message" do
93
+ expect { subject.stub(:muuuu) }.
94
+ to raise_error Adequack::InterfaceImplementationError,
95
+ "trying to stub nonexistent method"
96
+ end
97
+
98
+ it "works with chaining" do
99
+ core.should_receive(:stub_chain).with("bark.words")
100
+ subject.stub_chain("bark.words")
101
+ end
102
+
103
+ it "raises if chain in symbol form" do
104
+ expect { subject.stub_chain(:tongue, :skin) }.
105
+ to raise_error Adequack::InterfaceImplementationError,
106
+ "trying to stub nonexistent method"
107
+ end
108
+
109
+ it "raises if chain in string form" do
110
+ expect { subject.stub_chain("tongue.skin") }.
111
+ to raise_error Adequack::InterfaceImplementationError,
112
+ "trying to stub nonexistent method"
113
+ end
114
+
115
+ it "works with should receive too" do
116
+ expect { subject.should_receive(:muuuu) }.
117
+ to raise_error Adequack::InterfaceImplementationError,
118
+ "trying to stub nonexistent method"
119
+ end
120
+
121
+ it "tell you if you'r passing invalid arguments" do
122
+ expect {
123
+ core.should_not_receive(:bark)
124
+ subject.bark("woof", "not woof")
125
+ }.to raise_error Adequack::InterfaceImplementationError,
126
+ "definition of method 'bark' differs in parameters accepted."
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,64 @@
1
+ require "spec_helper"
2
+
3
+ module AnimalInterface
4
+ def self.evolutionize(from_what); end
5
+ def bark(what); end
6
+ def feed(what, many = false); end
7
+ end
8
+
9
+ class Animal
10
+ def initialize(name)
11
+ @name = name
12
+ end
13
+
14
+ def self.evolutionize(from_what)
15
+ new("next step from #{from_what}")
16
+ end
17
+
18
+ def bark(what)
19
+ puts what
20
+ end
21
+
22
+ def feed(what, many = false)
23
+ emotion = "So yammy #{what}"
24
+ emotion = [emotion, "I'm full up"].join(", ") if many
25
+
26
+ bark emotion
27
+ end
28
+ end
29
+
30
+ describe Animal do
31
+ subject { described_class }
32
+ it { should be_adequack_to AnimalInterface }
33
+ end
34
+
35
+ class Owner
36
+
37
+ def initialize(animal)
38
+ @animal = animal
39
+ end
40
+
41
+ def trick_animal
42
+ @animal.bark("woof")
43
+ end
44
+
45
+ def enormously_feed_animal
46
+ @animal.feed("chappy", true)
47
+ end
48
+
49
+ end
50
+
51
+ describe Owner do
52
+ let(:animal) { adequack_double double, AnimalInterface }
53
+ subject { described_class.new animal }
54
+
55
+ it "tricks animal" do
56
+ animal.should_receive(:bark).and_return("barked")
57
+ expect(subject.trick_animal).to eql "barked"
58
+ end
59
+
60
+ it "feeds animal" do
61
+ animal.should_receive(:feed).and_return("barked")
62
+ expect(subject.enormously_feed_animal).to eql "barked"
63
+ end
64
+ end
@@ -0,0 +1 @@
1
+ require "adequack"
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adequack
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ilya Zayats
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '2.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '2.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Be sure that your mocks are adequate
56
+ email:
57
+ - somebody32@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - .rspec
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - adequack.gemspec
69
+ - lib/adequack.rb
70
+ - lib/adequack/core.rb
71
+ - lib/adequack/integration/rspec_setup.rb
72
+ - lib/adequack/proxy.rb
73
+ - lib/adequack/version.rb
74
+ - spec/adequack_spec.rb
75
+ - spec/integration_spec.rb
76
+ - spec/spec_helper.rb
77
+ homepage: https://github.com/Somebody32/adequack
78
+ licenses:
79
+ - MIT
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.0.3
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Be sure that your mocks are adequate
101
+ test_files:
102
+ - spec/adequack_spec.rb
103
+ - spec/integration_spec.rb
104
+ - spec/spec_helper.rb