casting 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,13 +30,23 @@ module Casting
30
30
  def base.delegate_missing_methods
31
31
  self.send(:include, ::Casting::MissingMethodClient)
32
32
  end
33
+
34
+ unless base.instance_methods.include?('delegate')
35
+ base.class_eval{ alias_method :delegate, :cast }
36
+ end
37
+ end
38
+
39
+ def self.extended(base)
40
+ unless base.respond_to?('delegate')
41
+ base.singleton_class.class_eval{ alias_method :delegate, :cast }
42
+ end
33
43
  end
34
44
 
35
45
  def delegation(delegated_method_name)
36
46
  Casting::Delegation.new(delegated_method_name, self)
37
47
  end
38
48
 
39
- def delegate(delegated_method_name, attendant, *args)
49
+ def cast(delegated_method_name, attendant, *args)
40
50
  delegation(delegated_method_name).to(attendant).with(*args).call
41
51
  end
42
52
 
@@ -96,7 +106,8 @@ module Casting
96
106
  self
97
107
  end
98
108
 
99
- def call
109
+ def call(*args)
110
+ @arguments = args unless args.empty?
100
111
  raise MissingAttendant.new unless attendant
101
112
 
102
113
  if arguments
@@ -167,8 +178,8 @@ module Casting
167
178
  self
168
179
  end
169
180
 
170
- def call
171
- prepared_delegation.call
181
+ def call(*args)
182
+ prepared_delegation.call(*args)
172
183
  end
173
184
 
174
185
  end
@@ -1,3 +1,3 @@
1
1
  module Casting
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+ require 'casting'
3
+
4
+ unless RedCard.check '2.0'
5
+
6
+ describe Casting, '.delegating' do
7
+ it 'delegates missing methods to object delegates' do
8
+ client = test_person
9
+ client.extend(Casting::Client)
10
+ client.delegate_missing_methods
11
+
12
+ attendant = test_person
13
+ attendant.extend(TestPerson::Greeter)
14
+
15
+ assert_raises(NoMethodError){
16
+ client.greet
17
+ }
18
+ Casting.delegating(client => attendant) do
19
+ assert_equal 'hello', client.greet
20
+ end
21
+ assert_raises(NoMethodError){
22
+ client.greet
23
+ }
24
+ end
25
+ end
26
+
27
+ describe Casting::Delegation do
28
+
29
+ # it 'errors with a method defined on another object not of the same module type' do
30
+ # client = test_person
31
+ # attendant = test_person
32
+ # attendant.extend(TestPerson::Greeter)
33
+ # assert_raises(TypeError){
34
+ # Casting::Delegation.new('greet', client).to(attendant)
35
+ # }
36
+ # end
37
+
38
+ it 'calls a method defined on another object of the same type' do
39
+ client = test_person
40
+ attendant = test_person
41
+ attendant.extend(TestPerson::Greeter)
42
+ delegation = Casting::Delegation.new('greet', client).to(attendant)
43
+ assert_equal 'hello', delegation.call
44
+ end
45
+
46
+ it 'passes arguments to a delegated method' do
47
+ client = test_person
48
+ attendant = test_person
49
+ attendant.extend(TestPerson::Verbose)
50
+ delegation = Casting::Delegation.new('verbose', client).to(attendant).with('arg1','arg2')
51
+ assert_equal 'arg1,arg2', delegation.call
52
+ end
53
+
54
+ it 'delegates when given a module' do
55
+ client = test_person
56
+ delegation = Casting::Delegation.new('greet', client).to(TestPerson::Greeter)
57
+ assert_equal 'hello', delegation.call
58
+ end
59
+
60
+ it 'does not delegate when given a class' do
61
+ client = test_person
62
+ assert_raises(TypeError){
63
+ Casting::Delegation.new('class_defined', client).to(Unrelated)
64
+ }
65
+ end
66
+ end
67
+
68
+ end # RedCard
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+ require 'casting'
3
+
4
+ if RedCard.check '2.0'
5
+
6
+ describe Casting::Delegation do
7
+
8
+ it 'finds the module defining a method and uses it to delegate' do
9
+ client = test_person
10
+ attendant = Unrelated.new
11
+ delegation = Casting::Delegation.new('unrelated', client).to(attendant)
12
+ assert_equal attendant.unrelated, delegation.call
13
+ end
14
+
15
+ it 'does not delegate to methods defined in classes' do
16
+ client = test_person
17
+ attendant = Unrelated.new
18
+ assert_raises(TypeError){
19
+ Casting::Delegation.new('class_defined', client).to(attendant)
20
+ }
21
+ end
22
+ end
23
+
24
+ end # RedCard
@@ -91,9 +91,35 @@ describe Casting::Delegation do
91
91
 
92
92
  assert_equal attendant_output, delegation_output
93
93
  end
94
+
95
+ it 'prefers `call` arguments over `with`' do
96
+ client = test_person
97
+ attendant = TestPerson::Verbose
98
+
99
+ delegation = Casting::Delegation.new('verbose', client).to(attendant)
100
+
101
+ attendant_output = attendant.verbose('call', 'args')
102
+ delegation_output = delegation.with('hello', 'goodbye').call('call','args')
103
+
104
+ assert_equal attendant_output, delegation_output
105
+ end
94
106
  end
95
107
 
96
108
  describe Casting::Client do
109
+ it 'will not override an existing `delegate` method' do
110
+ client = TestPerson.new
111
+ def client.delegate
112
+ 'existing delegate method'
113
+ end
114
+ client.extend(Casting::Client)
115
+
116
+ attendant = TestPerson::Greeter
117
+
118
+ assert_equal 'existing delegate method', client.delegate
119
+
120
+ assert_equal 'hello', client.cast('greet', attendant)
121
+ end
122
+
97
123
  it 'adds a delegate method to call a method on an attendant' do
98
124
  client = TestPerson.new
99
125
  client.extend(Casting::Client)
@@ -3,6 +3,9 @@ SimpleCov.start do
3
3
  add_filter 'test'
4
4
  end
5
5
 
6
+ require 'coveralls'
7
+ Coveralls.wear!
8
+
6
9
  require 'minitest/spec'
7
10
  require 'minitest/autorun'
8
11
 
@@ -46,4 +49,4 @@ end
46
49
 
47
50
  def test_person
48
51
  TestPerson.new
49
- end
52
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: casting
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-22 00:00:00.000000000 Z
12
+ date: 2013-05-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: redcard
@@ -27,7 +27,10 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: 1.1.0
30
- description: Proper method delegation.
30
+ description: ! "Casting assists in method delegation which preserves the binding of
31
+ 'self' to the object receiving a message.\n\n This allows you to define behavior
32
+ and apply it to an object temporarily without extending the object's super class
33
+ structure."
31
34
  email:
32
35
  - jim@saturnflyer.com
33
36
  executables: []
@@ -38,6 +41,8 @@ files:
38
41
  - lib/casting/version.rb
39
42
  - test/test_helper.rb
40
43
  - test/casting_test.rb
44
+ - test/casting_19_test.rb
45
+ - test/casting_20_test.rb
41
46
  homepage: http://github.com/saturnflyer/casting
42
47
  licenses: []
43
48
  post_install_message:
@@ -65,4 +70,6 @@ summary: Proper method delegation.
65
70
  test_files:
66
71
  - test/test_helper.rb
67
72
  - test/casting_test.rb
73
+ - test/casting_19_test.rb
74
+ - test/casting_20_test.rb
68
75
  has_rdoc: