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.
@@ -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 complete_args *args
46
- (self.args || []) + args
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
@@ -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
- return if delegate
8
- return if delegate_all
9
- return if delegate_chain
10
- return if delegate_object
11
- general_delegate
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 delegate
21
- return unless arguments.delegatable?
22
- delegate_to_forwardee
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
- Meta.new( forwardee, arguments ).forward
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
@@ -1,3 +1,3 @@
1
1
  module Forwarder
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0.rc3'
3
3
  end # module Forwarder
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.1.1
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-15 00:00:00.000000000Z
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: &83003930 !ruby/object:Gem::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: *83003930
24
+ version_requirements: *7941200
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ruby-debug19
27
- requirement: &83003660 !ruby/object:Gem::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: *83003660
35
+ version_requirements: *7938300
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &83003420 !ruby/object:Gem::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: *83003420
46
+ version_requirements: *7789180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &83003190 !ruby/object:Gem::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: *83003190
57
+ version_requirements: *7124460
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: maruku
60
- requirement: &83002960 !ruby/object:Gem::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: *83002960
68
+ version_requirements: *7119940
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: wirble
71
- requirement: &83002730 !ruby/object:Gem::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: *83002730
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: '0'
132
+ version: 1.3.1
131
133
  requirements: []
132
134
  rubyforge_project:
133
- rubygems_version: 1.8.11
135
+ rubygems_version: 1.8.10
134
136
  signing_key:
135
137
  specification_version: 3
136
138
  summary: Delegation And AOP Filters For It