forwarder19 0.1.1 → 0.2.0.rc3
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.
- data/lib/forwarder/arguments.rb +22 -2
- data/lib/forwarder/compiler.rb +45 -0
- data/lib/forwarder/evaller.rb +59 -0
- data/lib/forwarder/params.rb +70 -46
- data/lib/forwarder/version.rb +1 -1
- metadata +23 -21
data/lib/forwarder/arguments.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwarder/evaller'
|
2
|
+
|
1
3
|
module Forwarder
|
2
4
|
class Arguments
|
3
5
|
attr_reader :args, :message, :target
|
@@ -34,6 +36,10 @@ module Forwarder
|
|
34
36
|
@params[ :to_chain ]
|
35
37
|
end
|
36
38
|
|
39
|
+
def complete_args *args
|
40
|
+
(self.args || []) + args
|
41
|
+
end
|
42
|
+
|
37
43
|
def custom_target?
|
38
44
|
@params[:to_object]
|
39
45
|
end
|
@@ -42,8 +48,11 @@ module Forwarder
|
|
42
48
|
!aop? && !custom_target? && !all? && !chain? && !args && !lambda?
|
43
49
|
end
|
44
50
|
|
45
|
-
def
|
46
|
-
|
51
|
+
def evaluable?
|
52
|
+
!lambda? &&
|
53
|
+
!aop? &&
|
54
|
+
( !args || args.all?{|a| Evaller.evaluable? a } ) &&
|
55
|
+
( !custom_target? || Evaller.evaluable?( custom_target? ) )
|
47
56
|
end
|
48
57
|
|
49
58
|
def lambda default=nil
|
@@ -60,6 +69,10 @@ module Forwarder
|
|
60
69
|
return unless custom_target?
|
61
70
|
target == :self ? default : target
|
62
71
|
end
|
72
|
+
|
73
|
+
def serialized_params
|
74
|
+
Evaller.serialize args
|
75
|
+
end
|
63
76
|
|
64
77
|
def translation alternative=nil, &blk
|
65
78
|
@params[ :as ].tap do | tltion |
|
@@ -74,6 +87,12 @@ module Forwarder
|
|
74
87
|
@__aop_values__ ||= @params.values_at( :after, :before ).compact
|
75
88
|
end
|
76
89
|
|
90
|
+
def check_for_incompatibilities!
|
91
|
+
raise ArgumentError, "cannot provide translations for forward_all" if @__all__ && translation
|
92
|
+
raise ArgumentError, "cannot provide arguments for forward_all" if @__all__ && args?
|
93
|
+
|
94
|
+
end
|
95
|
+
|
77
96
|
def initialize *args, &blk
|
78
97
|
@message = args.shift
|
79
98
|
raise ArgumentError, "need one message and a hash of kwd params, plus an optional block" unless args.size == 1 && args.first.is_a?( Hash )
|
@@ -81,6 +100,7 @@ module Forwarder
|
|
81
100
|
set_message
|
82
101
|
set_target
|
83
102
|
set_args blk
|
103
|
+
check_for_incompatibilities!
|
84
104
|
end
|
85
105
|
|
86
106
|
def set_args blk
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'forwarder/evaller'
|
2
|
+
module Forwarder
|
3
|
+
class Compiler
|
4
|
+
attr_reader :arguments
|
5
|
+
|
6
|
+
|
7
|
+
def compile
|
8
|
+
# Cannot compile because of intrinsic uncompilable traits of arguments
|
9
|
+
# TODO: implement compilable inside arguments
|
10
|
+
return unless !arguments.lambda? && !arguments.aop? && !arguments.custom_target?
|
11
|
+
# Cannot compile because arguments cannot be compiled
|
12
|
+
@compiled_args = Evaller.serialize arguments.args
|
13
|
+
return unless @compiled_args
|
14
|
+
# Can compile :)))
|
15
|
+
return compile_to_all if arguments.message.is_a? Array
|
16
|
+
compile_one
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def compile_to_all
|
22
|
+
arguments.message.map{ |msg|
|
23
|
+
"def #{msg} *args, &blk; #{arguments.target}.#{msg}( *args, &blk ) end"
|
24
|
+
}.join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
def compile_one
|
28
|
+
tltion = arguments.translation arguments.message
|
29
|
+
"def #{arguments.message} *args, &blk; " +
|
30
|
+
"#{self.class.compile_target arguments.target}.#{tltion}( " +
|
31
|
+
@compiled_args +
|
32
|
+
"*args, &blk ) end"
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize args
|
36
|
+
@arguments = args
|
37
|
+
end
|
38
|
+
|
39
|
+
class << self
|
40
|
+
def compile_target target
|
41
|
+
[ target ].flatten.join( "." )
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end # class Compiler
|
45
|
+
end # module Forwarder
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Forwarder
|
2
|
+
module Evaller extend self
|
3
|
+
|
4
|
+
NotSerializable = Class.new RuntimeError
|
5
|
+
|
6
|
+
def evaluable? an_object, cache={}
|
7
|
+
!!_serialize_one( an_object, cache )
|
8
|
+
rescue NotSerializable
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
def serialize args
|
13
|
+
return "" if args.nil? || args.empty?
|
14
|
+
serialize_without_arg_suffix( args ).join(", ") + ", "
|
15
|
+
rescue NotSerializable
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def serialize_without_arg_suffix args, cache={}
|
20
|
+
args.map{ | arg |
|
21
|
+
_serialize_one arg, cache
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def _serialize_hash hsh, cache
|
27
|
+
hsh.inject [] do | r, (k, v) |
|
28
|
+
k = _serialize_one k, cache
|
29
|
+
v = _serialize_one v, cache
|
30
|
+
r << "#{k} => #{v}"
|
31
|
+
end.join( ", ")
|
32
|
+
end
|
33
|
+
|
34
|
+
def _serialize_one arg, cache
|
35
|
+
case arg
|
36
|
+
when String
|
37
|
+
"'" + arg + "'"
|
38
|
+
when Symbol, Fixnum, NilClass, FalseClass, TrueClass
|
39
|
+
arg.inspect
|
40
|
+
else
|
41
|
+
_serialize_object arg, cache
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def _serialize_object arg, cache
|
46
|
+
oid = arg.object_id
|
47
|
+
raise NotSerializable if cache[oid]
|
48
|
+
cache[oid]=true
|
49
|
+
case arg
|
50
|
+
when Array
|
51
|
+
["[ ", serialize_without_arg_suffix( arg, cache ).join(", "), " ]"].join
|
52
|
+
when Hash
|
53
|
+
[ "{ ", _serialize_hash( arg, cache ), " }" ].join
|
54
|
+
else
|
55
|
+
raise NotSerializable
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end # module Evaller
|
59
|
+
end # module Forwarder
|
data/lib/forwarder/params.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'forwarder/arguments'
|
2
|
+
require 'forwarder/compiler'
|
2
3
|
require 'forwarder/meta'
|
3
4
|
module Forwarder
|
4
5
|
class Params
|
5
6
|
attr_reader :forwardee, :arguments
|
6
7
|
def forward!
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
compiled = compile_forward
|
9
|
+
if compiled
|
10
|
+
forwardee.module_eval compiled, __FILE__, __LINE__
|
11
|
+
else
|
12
|
+
general_delegate
|
13
|
+
end
|
12
14
|
end
|
13
15
|
|
14
16
|
def prepare_forward *args, &blk
|
@@ -17,54 +19,76 @@ module Forwarder
|
|
17
19
|
|
18
20
|
private
|
19
21
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
23
|
-
true
|
24
|
-
end
|
25
|
-
|
26
|
-
def delegate_all
|
27
|
-
return unless arguments.all?
|
28
|
-
delegate_all_to_forwardee
|
29
|
-
true
|
30
|
-
end
|
31
|
-
|
32
|
-
def delegate_all_to_forwardee
|
33
|
-
forwardee.extend Forwardable
|
34
|
-
forwardee.def_delegators( arguments.target, *arguments.message )
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
def delegate_chain
|
39
|
-
return unless arguments.chain?
|
40
|
-
delegate_to_chain
|
41
|
-
true
|
42
|
-
end
|
43
|
-
|
44
|
-
def delegate_to_chain
|
45
|
-
Meta.new( forwardee, arguments ).forward_chain
|
46
|
-
end
|
47
|
-
|
48
|
-
def delegate_object
|
49
|
-
return unless arguments.custom_target?
|
50
|
-
Meta.new( forwardee, arguments ).forward_object
|
51
|
-
true
|
52
|
-
end
|
53
|
-
|
54
|
-
def delegate_to_forwardee
|
55
|
-
forwardee.extend Forwardable
|
56
|
-
arguments.translation do | tltion |
|
57
|
-
forwardee.def_delegator arguments.target, tltion, arguments.message
|
58
|
-
end or
|
59
|
-
forwardee.def_delegator arguments.target, arguments.message
|
22
|
+
def compile_forward
|
23
|
+
compiler = Compiler.new arguments
|
24
|
+
compiler.compile
|
60
25
|
end
|
61
26
|
|
27
|
+
# def delegate
|
28
|
+
# return unless arguments.delegatable?
|
29
|
+
# delegate_to_forwardee
|
30
|
+
# true
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# def delegate_all
|
34
|
+
# return unless arguments.all?
|
35
|
+
# delegate_all_to_forwardee
|
36
|
+
# true
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def delegate_all_to_forwardee
|
40
|
+
# arguments.message.each do | msg |
|
41
|
+
# forwardee.module_eval(
|
42
|
+
# "def #{msg} *args, &blk; #{arguments.target}.#{msg}( *args, &blk ) end",
|
43
|
+
# __FILE__,
|
44
|
+
# __LINE__
|
45
|
+
# )
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
#
|
50
|
+
# def delegate_chain
|
51
|
+
# return unless arguments.chain?
|
52
|
+
# delegate_to_chain
|
53
|
+
# true
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# def delegate_to_chain
|
57
|
+
# tltion = arguments.translation arguments.message
|
58
|
+
# forwardee.module_eval(
|
59
|
+
# "def #{arguments.message} *args, &blk; #{arguments.target.join(".")}.#{tltion}( *args, &blk ) end",
|
60
|
+
# __FILE__,
|
61
|
+
# __LINE__
|
62
|
+
# )
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# def delegate_object
|
66
|
+
# return unless arguments.custom_target?
|
67
|
+
# Meta.new( forwardee, arguments ).forward_object
|
68
|
+
# true
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# def delegate_to_forwardee
|
72
|
+
# tltion = arguments.translation arguments.message
|
73
|
+
# forwardee.module_eval(
|
74
|
+
# "def #{arguments.message} *args, &blk; #{arguments.target}.#{tltion}( #{arguments.serialized_params}*args, &blk ) end",
|
75
|
+
# __FILE__,
|
76
|
+
# __LINE__
|
77
|
+
# )
|
78
|
+
# end
|
79
|
+
#
|
62
80
|
def initialize forwardee
|
63
81
|
@forwardee = forwardee
|
64
82
|
end
|
65
83
|
|
66
84
|
def general_delegate
|
67
|
-
|
85
|
+
if arguments.chain?
|
86
|
+
Meta.new( forwardee, arguments ).forward_chain
|
87
|
+
elsif arguments.custom_target?
|
88
|
+
Meta.new( forwardee, arguments ).forward_object
|
89
|
+
else
|
90
|
+
Meta.new( forwardee, arguments ).forward
|
91
|
+
end
|
68
92
|
end
|
69
93
|
end # class Params
|
70
94
|
end # module Forwarder
|
data/lib/forwarder/version.rb
CHANGED
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forwarder19
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0.rc3
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Robert Dober
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-20 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: lab419_core
|
16
|
-
requirement: &
|
16
|
+
requirement: &7941200 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *7941200
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: ruby-debug19
|
27
|
-
requirement: &
|
27
|
+
requirement: &7938300 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0.11'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *7938300
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &7789180 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.9.2.2
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *7789180
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec
|
49
|
-
requirement: &
|
49
|
+
requirement: &7124460 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.9.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *7124460
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: maruku
|
60
|
-
requirement: &
|
60
|
+
requirement: &7119940 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 0.6.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *7119940
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: wirble
|
71
|
-
requirement: &
|
71
|
+
requirement: &7118380 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ~>
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: 0.1.3
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *7118380
|
80
80
|
description: ! 'Ruby''s core Forwardable gets the job done(barely) and produces most
|
81
81
|
unreadable code. Furthermore it is about twice as slow (1.9.2-p290) or thrice as
|
82
82
|
slow (1.9.3-p0) as it needs to be.
|
@@ -101,12 +101,14 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
+
- lib/forwarder.rb
|
105
|
+
- lib/forwarder/evaller.rb
|
104
106
|
- lib/forwarder/arguments.rb
|
105
|
-
- lib/forwarder/meta.rb
|
106
|
-
- lib/forwarder/params.rb
|
107
107
|
- lib/forwarder/helpers.rb
|
108
108
|
- lib/forwarder/version.rb
|
109
|
-
- lib/forwarder.rb
|
109
|
+
- lib/forwarder/params.rb
|
110
|
+
- lib/forwarder/meta.rb
|
111
|
+
- lib/forwarder/compiler.rb
|
110
112
|
- LICENSE
|
111
113
|
- README.md
|
112
114
|
homepage: https://github.com/RobertDober/Forwarder19
|
@@ -125,12 +127,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
128
|
none: false
|
127
129
|
requirements:
|
128
|
-
- - ! '
|
130
|
+
- - ! '>'
|
129
131
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
132
|
+
version: 1.3.1
|
131
133
|
requirements: []
|
132
134
|
rubyforge_project:
|
133
|
-
rubygems_version: 1.8.
|
135
|
+
rubygems_version: 1.8.10
|
134
136
|
signing_key:
|
135
137
|
specification_version: 3
|
136
138
|
summary: Delegation And AOP Filters For It
|