detach 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/detach.rb +17 -3
- data/test/test_detach.rb +30 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70d08bcd4bfbae5a1aab1faa9900e26b0397ee1e
|
4
|
+
data.tar.gz: fcae820f173e8053c35e82c23f53fcac47e77668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7742a36cc469786dc36c3aeea32a379f9d95fe6ce7c49bc072c1b331224baec0619e717a74a747b10bae20836bc10a11f2aa17776f3d786bcf429a98204c2e4a
|
7
|
+
data.tar.gz: 548716816c73bd3719737768c0f2f2bb3a43e78a17a37ba9b2c76ae072b02438569478d8500f368be37e21eb6ed906b6ab87dec5d49613196ebe249ca800c423
|
data/lib/detach.rb
CHANGED
@@ -44,11 +44,12 @@ module Detach
|
|
44
44
|
|
45
45
|
(score,best) = (public_methods+protected_methods+private_methods).grep(/^#{Regexp.escape(name)}\(/).collect {|candidate|
|
46
46
|
# extract paramters
|
47
|
-
params = /\((.*)\)/.match(candidate.to_s)[1].scan(/(\w+)-([\w
|
47
|
+
params = /\((.*)\)/.match(candidate.to_s)[1].scan(/(\w+)-([\w:\)]+)/).collect {|s,t|
|
48
48
|
[s.to_sym, t.split(/::/).inject(Kernel) {|m,c| m = m.const_get(c)}]
|
49
49
|
}
|
50
50
|
# form the list of all required argument classes
|
51
51
|
ctypes = params.values_at(*params.each_index.select {|i| params[i].first == :req}).map(&:last)
|
52
|
+
nreq = ctypes.size
|
52
53
|
|
53
54
|
# NOTE: ruby only allows a single *args, or a list of a=1, b=2--not both together--
|
54
55
|
# only one of the following will execute
|
@@ -68,12 +69,21 @@ module Detach
|
|
68
69
|
elsif ctypes.size == args.size
|
69
70
|
score = args.map(&:class).zip(ctypes).inject(0) {|s,t|
|
70
71
|
# apply each class comparison and require nonzero matches
|
71
|
-
|
72
|
+
if s
|
73
|
+
if t[0].ancestors.include?(t[1])
|
74
|
+
s += t[1].ancestors.size
|
75
|
+
else
|
76
|
+
s = nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
72
80
|
} || 0
|
73
81
|
else
|
74
82
|
score = 0
|
75
83
|
end
|
76
84
|
|
85
|
+
score += (1 + nreq) if args.size == params.size
|
86
|
+
|
77
87
|
[ score, candidate ]
|
78
88
|
|
79
89
|
}.max {|a,b| a[0] <=> b[0]}
|
@@ -96,10 +106,14 @@ module Detach
|
|
96
106
|
def taking
|
97
107
|
self
|
98
108
|
end
|
99
|
-
#
|
109
|
+
# Provides list of type names to decorator.
|
100
110
|
def [](*types)
|
101
111
|
@@types = types.flatten
|
102
112
|
end
|
113
|
+
# Provides load-time method aliasing.
|
114
|
+
#
|
115
|
+
# All methods added to a class which are decorated as taking specified types
|
116
|
+
# are aliased in a form known and searched at run-time.
|
103
117
|
def method_added(name)
|
104
118
|
return unless @@types
|
105
119
|
|
data/test/test_detach.rb
CHANGED
@@ -19,7 +19,6 @@ class TestDetach < Test::Unit::TestCase
|
|
19
19
|
def testLists
|
20
20
|
assert_equal "Object List [\"one\", 2, 3.0, \"4\"]", Foo.new.foo('one', 2, 3.0, '4')
|
21
21
|
assert_equal "String List [\"one\", \"two\", \"three\", \"four\"]", Foo.new.foo('one', 'two', 'three', 'four')
|
22
|
-
|
23
22
|
end
|
24
23
|
|
25
24
|
def testMixedLists
|
@@ -45,6 +44,12 @@ class TestDetach < Test::Unit::TestCase
|
|
45
44
|
assert_equal "11", Wow.new(5, 6).to_s
|
46
45
|
end
|
47
46
|
|
47
|
+
def testDefinitionOrder
|
48
|
+
assert_equal "Nonce", Junk.new.foo
|
49
|
+
assert_equal "String one", Junk.new.foo('one')
|
50
|
+
assert_equal "String List [\"one\", \"two\", \"three\", \"four\"]", Junk.new.foo('one', 'two', 'three', 'four')
|
51
|
+
end
|
52
|
+
|
48
53
|
|
49
54
|
#
|
50
55
|
# helper definitions
|
@@ -149,6 +154,30 @@ class TestDetach < Test::Unit::TestCase
|
|
149
154
|
end
|
150
155
|
end
|
151
156
|
|
157
|
+
class Junk
|
158
|
+
include Detach
|
159
|
+
|
160
|
+
taking[Object]
|
161
|
+
def foo(*a)
|
162
|
+
"Object List #{a}"
|
163
|
+
end
|
164
|
+
|
165
|
+
taking[String]
|
166
|
+
def foo(*a)
|
167
|
+
"String List #{a}"
|
168
|
+
end
|
169
|
+
|
170
|
+
taking[]
|
171
|
+
def foo
|
172
|
+
"Nonce"
|
173
|
+
end
|
174
|
+
|
175
|
+
taking[String]
|
176
|
+
def foo(a)
|
177
|
+
"String #{a}"
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
152
181
|
|
153
182
|
end
|
154
183
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: detach
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Calhoun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A mixin which separates method definitions by argument types, effectively
|
14
14
|
allowing C++ or Java style overloading.
|