surrogate 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Readme.md +2 -0
- data/lib/surrogate/endower.rb +1 -1
- data/lib/surrogate/hatchery.rb +1 -1
- data/lib/surrogate/hatchling.rb +3 -3
- data/lib/surrogate/options.rb +17 -4
- data/lib/surrogate/version.rb +1 -1
- data/spec/defining_api_methods_spec.rb +30 -13
- data/surrogate.gemspec +2 -2
- metadata +15 -4
data/Readme.md
CHANGED
@@ -358,6 +358,8 @@ TODO
|
|
358
358
|
|
359
359
|
* Add a better explanation for motivations
|
360
360
|
* Figure out whether I'm supposed to be using clone or dup for the object -.^ (looks like there may also be an `initialize_copy` method I can take advantage of instead of crazy stupid shit I'm doing now)
|
361
|
+
* don't blow up when delegating to the Object#initialize with args
|
362
|
+
* queues should not reset when done, they should raise
|
361
363
|
|
362
364
|
|
363
365
|
Future Features
|
data/lib/surrogate/endower.rb
CHANGED
data/lib/surrogate/hatchery.rb
CHANGED
data/lib/surrogate/hatchling.rb
CHANGED
@@ -17,7 +17,7 @@ class Surrogate
|
|
17
17
|
|
18
18
|
def invoke_method(method_name, args, &block)
|
19
19
|
invoked_methods[method_name] << args
|
20
|
-
return get_default method_name, args unless has_ivar? method_name
|
20
|
+
return get_default method_name, args, &block unless has_ivar? method_name
|
21
21
|
Value.factory(get_ivar method_name).value(self, method_name)
|
22
22
|
end
|
23
23
|
|
@@ -64,8 +64,8 @@ class Surrogate
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
def get_default(method_name, args)
|
68
|
-
api_methods[method_name].default instance, args do
|
67
|
+
def get_default(method_name, args, &block)
|
68
|
+
api_methods[method_name].default instance, args, block do
|
69
69
|
raise UnpreparedMethodError, "#{method_name} has been invoked without being told how to behave"
|
70
70
|
end
|
71
71
|
end
|
data/lib/surrogate/options.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'bindable_block'
|
2
|
+
|
1
3
|
class Surrogate
|
2
4
|
class Options
|
3
5
|
attr_accessor :options, :default_proc
|
@@ -18,10 +20,21 @@ class Surrogate
|
|
18
20
|
options
|
19
21
|
end
|
20
22
|
|
21
|
-
def default(instance, args, &no_default)
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def default(instance, args, block, &no_default)
|
24
|
+
if options.has_key? :default
|
25
|
+
options[:default]
|
26
|
+
elsif default_proc
|
27
|
+
# This works for now, but it's a kind of crappy solution because
|
28
|
+
# BindableBlock adds and removes methods for each time it is invoked.
|
29
|
+
#
|
30
|
+
# A better solution would be to instantiate it before passing it to
|
31
|
+
# the options, then we only have to bind it to an instance and invoke
|
32
|
+
BindableBlock.new(instance.class, &default_proc)
|
33
|
+
.bind(instance)
|
34
|
+
.call(*args, &block)
|
35
|
+
else
|
36
|
+
no_default.call
|
37
|
+
end
|
25
38
|
end
|
26
39
|
end
|
27
40
|
end
|
data/lib/surrogate/version.rb
CHANGED
@@ -6,31 +6,48 @@ describe 'define' do
|
|
6
6
|
|
7
7
|
describe 'in the block' do
|
8
8
|
it 'is an api method for the class' do
|
9
|
-
pristine_klass = Class.new
|
10
|
-
|
11
|
-
define(:find) { 123 }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
klass1 = pristine_klass.clone
|
16
|
-
klass1.should_not have_been_told_to :find
|
17
|
-
klass1.find(1).should == 123
|
18
|
-
klass1.should have_been_told_to(:find).with(1)
|
9
|
+
pristine_klass = Class.new { Surrogate.endow(self) { define :find } }
|
10
|
+
pristine_klass.singleton_class.api_method_names.should == [:find]
|
19
11
|
end
|
20
12
|
end
|
21
13
|
|
22
14
|
|
23
15
|
describe 'out of the block' do
|
24
16
|
it 'is an api method for the instance' do
|
25
|
-
mocked_class.define
|
26
|
-
|
17
|
+
mocked_class.define :book
|
18
|
+
mocked_class.api_method_names.should == [:book]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'definition default block invocation' do
|
23
|
+
xit "something about raising an error if arity is wrong" do
|
24
|
+
mocked_class.define(:a) { |arg| 1 }
|
25
|
+
mocked_class.new.a.should == 1
|
26
|
+
mocked_class.new.a(2).should == 1
|
27
|
+
mocked_class.new.a(3).should == 1
|
28
|
+
end
|
29
|
+
|
30
|
+
it "is passed the arguments" do
|
31
|
+
arg = nil
|
32
|
+
mocked_class.define(:meth) { |inner_arg| arg = inner_arg }.new.meth(1212)
|
33
|
+
arg.should == 1212
|
34
|
+
end
|
35
|
+
|
36
|
+
it "is passed the block" do
|
37
|
+
block = nil
|
38
|
+
mocked_class.define(:meth) { |&inner_block| block = inner_block }.new.meth { 12 }
|
39
|
+
block.call.should == 12
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns the value that the method returns" do
|
43
|
+
mocked_class.define(:meth) { 1234 }.new.meth.should == 1234
|
27
44
|
end
|
28
45
|
end
|
29
46
|
|
30
47
|
describe 'declaring the behaviour' do
|
31
48
|
|
32
49
|
describe 'for verbs' do
|
33
|
-
before
|
50
|
+
before { mocked_class.define :wink }
|
34
51
|
|
35
52
|
describe 'will_<api_method>' do
|
36
53
|
it 'overrides the default value for the api method' do
|
data/surrogate.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
|
-
|
21
|
+
s.add_runtime_dependency 'bindable_block', '= 0.0.4'
|
22
|
+
|
22
23
|
s.add_development_dependency "rspec", '~> 2.8.0' # TODO: Figure out how far back we can work with
|
23
|
-
# s.add_runtime_dependency "rest-client"
|
24
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: surrogate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05
|
12
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: bindable_block
|
16
|
+
requirement: &70325486799660 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - =
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.0.4
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70325486799660
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: rspec
|
16
|
-
requirement: &
|
27
|
+
requirement: &70325486799160 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ~>
|
@@ -21,7 +32,7 @@ dependencies:
|
|
21
32
|
version: 2.8.0
|
22
33
|
type: :development
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70325486799160
|
25
36
|
description: Framework to aid in handrolling mock/spy objects.
|
26
37
|
email:
|
27
38
|
- josh.cheek@gmail.com
|