loverload 0.1.0 → 0.2.0
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 +15 -0
- data/lib/loverload/block.rb +11 -0
- data/lib/loverload/method.rb +18 -8
- data/lib/loverload/version.rb +1 -1
- data/lib/loverload.rb +6 -5
- data/spec/loverload/loverload_spec.rb +48 -0
- metadata +22 -37
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjRlMDExM2QwMGU4ZmQwMmY4NjQ5OGViMGQzNWIyNzNhMDllOTE1ZA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YmRhMzc2YmU3OGU0Mzg1YjM4MjkzYWJjMmM4OTkwMzQ1OGY3OGJjOA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTc1MzRjZTIxM2VhYTY0MTFhMGIwNjM5ZmMyMWMyY2M0ZDNiNDZkNWM2MjNh
|
10
|
+
ODcwMTZjMWJkOGI5ODk3ZGZlMGU3MWNhNTNlMjBkYzA0ZDBmMDZlMjIwN2Jj
|
11
|
+
ODUwMjRhMTQyYjkyZGM0YmUzODAxOWU0ODFmYThjODlmZDY5MTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MjAwNGQzMjhkYWI0MWFmMDQzMmZjNWJlNzI3NWI0MzlmNWI0MTlmNjdmYTBk
|
14
|
+
ZmQ5N2IwMzRmOWU5NjgzZjBhZGMyNmE0ZTNmMWIyMjE2NGNhMjRjZDdlOGUz
|
15
|
+
YjUyOGE0NGQ4ZTQ5OTY4NDlhNGI0ZGJkZmNmYjE1MjRmNjNmNDE=
|
data/lib/loverload/method.rb
CHANGED
@@ -2,28 +2,38 @@ module Loverload
|
|
2
2
|
class Method
|
3
3
|
def initialize klass, method_name, &with_params_block
|
4
4
|
@klass, @method_name = klass, method_name
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
dictionary || @klass.instance_variable_set(:@__dictionary__, {})
|
7
7
|
|
8
8
|
instance_eval(&with_params_block)
|
9
9
|
end
|
10
10
|
|
11
11
|
def with_params *pars, &block
|
12
|
-
|
12
|
+
arg_count = block.arity
|
13
|
+
arg_count += 1 if pars.last == ::Loverload::Block
|
14
|
+
dictionary[method_signature(arg_count, *pars)] = block
|
13
15
|
end
|
14
16
|
|
15
|
-
def overload instance, *args
|
16
|
-
|
17
|
+
def overload instance, *args, &block
|
18
|
+
if block_given?
|
19
|
+
args << Block.new(&block)
|
20
|
+
found = find(*args)
|
21
|
+
instance.instance_exec *args do |*args|
|
22
|
+
found.call(*args, &(args.pop.block))
|
23
|
+
end
|
24
|
+
else
|
25
|
+
instance.instance_exec *args, &find(*args)
|
26
|
+
end
|
17
27
|
end
|
18
28
|
|
19
29
|
private
|
20
|
-
def find
|
30
|
+
def find(*args)
|
21
31
|
dictionary.find do |signature, _|
|
22
32
|
match? signature, method_signature(args.size, *args)
|
23
33
|
end.tap{ |arr| raise NoMethodError unless arr }.last
|
24
34
|
end
|
25
35
|
|
26
|
-
def match?
|
36
|
+
def match?(signature, args)
|
27
37
|
signature.zip(args).all? do |type, arg|
|
28
38
|
type === arg
|
29
39
|
end
|
@@ -33,7 +43,7 @@ module Loverload
|
|
33
43
|
@klass.instance_variable_get(:@__dictionary__)
|
34
44
|
end
|
35
45
|
|
36
|
-
def method_signature
|
46
|
+
def method_signature(size, *meta)
|
37
47
|
[*@method_name, size, *meta]
|
38
48
|
end
|
39
49
|
end
|
data/lib/loverload/version.rb
CHANGED
data/lib/loverload.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "loverload/version"
|
2
|
+
require "loverload/block"
|
2
3
|
require "loverload/method"
|
3
4
|
|
4
5
|
module Loverload
|
@@ -9,18 +10,18 @@ module Loverload
|
|
9
10
|
end
|
10
11
|
|
11
12
|
module ClassMethods
|
12
|
-
def def_overload
|
13
|
+
def def_overload(method_name_or_class, method_name = NULL, &with_params_block)
|
13
14
|
if method_name_or_class.is_a?(Class) && method_name != NULL
|
14
15
|
method = Method.new(method_name_or_class, method_name, &with_params_block)
|
15
16
|
|
16
|
-
define_singleton_method method_name do |*args|
|
17
|
-
method.overload(method_name_or_class, *args)
|
17
|
+
define_singleton_method method_name do |*args, &block|
|
18
|
+
method.overload(method_name_or_class, *args, &block)
|
18
19
|
end
|
19
20
|
else
|
20
21
|
method = Method.new(self, method_name_or_class, &with_params_block)
|
21
22
|
|
22
|
-
define_method method_name_or_class do |*args|
|
23
|
-
method.overload(self, *args)
|
23
|
+
define_method method_name_or_class do |*args, &block|
|
24
|
+
method.overload(self, *args, &block)
|
24
25
|
end
|
25
26
|
end
|
26
27
|
end
|
@@ -246,6 +246,28 @@ describe Loverload do
|
|
246
246
|
dummy.hello(2).should eql 'Two'
|
247
247
|
end
|
248
248
|
|
249
|
+
it "supports blocks" do
|
250
|
+
class Dummy
|
251
|
+
include Loverload
|
252
|
+
|
253
|
+
def_overload :hello do
|
254
|
+
with_params String do |s|
|
255
|
+
"Arg 1: #{s}. No block."
|
256
|
+
end
|
257
|
+
|
258
|
+
with_params String, Block do |s, &block|
|
259
|
+
"Arg 1: #{s}. Block present; results in: #{block.yield}."
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
dummy = Dummy.new
|
265
|
+
dummy.hello('str1').should eql 'Arg 1: str1. No block.'
|
266
|
+
dummy.hello 'str2' do
|
267
|
+
'str3'
|
268
|
+
end.should eql 'Arg 1: str2. Block present; results in: str3.'
|
269
|
+
end
|
270
|
+
|
249
271
|
it "works with inheritance" do
|
250
272
|
class Dummy
|
251
273
|
include Loverload
|
@@ -348,4 +370,30 @@ describe Loverload do
|
|
348
370
|
dummy = Dummy.new
|
349
371
|
[*0..10].map(&dummy.method(:fibonnaci)).should eql [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
|
350
372
|
end
|
373
|
+
|
374
|
+
it "can pass lambda and yielded" do
|
375
|
+
class Dummy
|
376
|
+
include Loverload
|
377
|
+
|
378
|
+
def_overload :pass_block do
|
379
|
+
with_params Proc do |blok|
|
380
|
+
blok.call
|
381
|
+
end
|
382
|
+
|
383
|
+
with_params String, Proc do |append_me, blok|
|
384
|
+
blok.call(append_me)
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
dummy = Dummy.new
|
390
|
+
|
391
|
+
expect{ dummy.pass_block('Hello from lambda') }.to raise_error
|
392
|
+
|
393
|
+
dummy.pass_block(lambda{ 'Hello from lambda' }).should eql 'Hello from lambda'
|
394
|
+
dummy.pass_block(->{ 'Hello from lambda' }).should eql 'Hello from lambda'
|
395
|
+
dummy.pass_block( Proc.new{ 'Hello from lambda' }).should eql 'Hello from lambda'
|
396
|
+
|
397
|
+
dummy.pass_block('Append me', lambda{ |s| "#{ s } and Hello from lambda" }).should eql 'Append me and Hello from lambda'
|
398
|
+
end
|
351
399
|
end
|
metadata
CHANGED
@@ -1,80 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loverload
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.1.0
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Teja Sophista V.R.
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-12-19 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
prerelease: false
|
16
14
|
name: bundler
|
17
|
-
|
18
|
-
version_requirements: !ruby/object:Gem::Requirement
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
19
16
|
requirements:
|
20
17
|
- - ~>
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '1.3'
|
23
|
-
|
24
|
-
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
23
|
requirements:
|
26
24
|
- - ~>
|
27
25
|
- !ruby/object:Gem::Version
|
28
26
|
version: '1.3'
|
29
|
-
none: false
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
prerelease: false
|
32
28
|
name: rake
|
33
|
-
|
34
|
-
version_requirements: !ruby/object:Gem::Requirement
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
35
30
|
requirements:
|
36
31
|
- - ! '>='
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
39
|
-
|
40
|
-
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
37
|
requirements:
|
42
38
|
- - ! '>='
|
43
39
|
- !ruby/object:Gem::Version
|
44
40
|
version: '0'
|
45
|
-
none: false
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
prerelease: false
|
48
42
|
name: rspec
|
49
|
-
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
51
44
|
requirements:
|
52
45
|
- - ! '>='
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '0'
|
55
|
-
|
56
|
-
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - ! '>='
|
59
53
|
- !ruby/object:Gem::Version
|
60
54
|
version: '0'
|
61
|
-
none: false
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
prerelease: false
|
64
56
|
name: debugger
|
65
|
-
|
66
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
67
58
|
requirements:
|
68
59
|
- - ! '>='
|
69
60
|
- !ruby/object:Gem::Version
|
70
61
|
version: '0'
|
71
|
-
|
72
|
-
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
65
|
requirements:
|
74
66
|
- - ! '>='
|
75
67
|
- !ruby/object:Gem::Version
|
76
68
|
version: '0'
|
77
|
-
none: false
|
78
69
|
description: DSL for building method overloading in Ruby more magical
|
79
70
|
email:
|
80
71
|
- tejanium@yahoo.com
|
@@ -88,6 +79,7 @@ files:
|
|
88
79
|
- README.md
|
89
80
|
- Rakefile
|
90
81
|
- lib/loverload.rb
|
82
|
+
- lib/loverload/block.rb
|
91
83
|
- lib/loverload/method.rb
|
92
84
|
- lib/loverload/version.rb
|
93
85
|
- loverload.gemspec
|
@@ -95,6 +87,7 @@ files:
|
|
95
87
|
homepage: http://github.com/tejanium/loverload
|
96
88
|
licenses:
|
97
89
|
- MIT
|
90
|
+
metadata: {}
|
98
91
|
post_install_message:
|
99
92
|
rdoc_options: []
|
100
93
|
require_paths:
|
@@ -103,25 +96,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
96
|
requirements:
|
104
97
|
- - ! '>='
|
105
98
|
- !ruby/object:Gem::Version
|
106
|
-
segments:
|
107
|
-
- 0
|
108
|
-
hash: 2984216650687558397
|
109
99
|
version: '0'
|
110
|
-
none: false
|
111
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
101
|
requirements:
|
113
102
|
- - ! '>='
|
114
103
|
- !ruby/object:Gem::Version
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
hash: 2984216650687558397
|
118
104
|
version: '0'
|
119
|
-
none: false
|
120
105
|
requirements: []
|
121
106
|
rubyforge_project:
|
122
|
-
rubygems_version:
|
107
|
+
rubygems_version: 2.4.5
|
123
108
|
signing_key:
|
124
|
-
specification_version:
|
109
|
+
specification_version: 4
|
125
110
|
summary: DSL for building method overloading in Ruby
|
126
111
|
test_files:
|
127
112
|
- spec/loverload/loverload_spec.rb
|