cape 1.6.2 → 1.7.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.
Files changed (72) hide show
  1. data/Gemfile +7 -6
  2. data/Guardfile +29 -10
  3. data/History.markdown +4 -0
  4. data/README.markdown +38 -9
  5. data/Rakefile +35 -8
  6. data/features/dsl/each_rake_task/{without_arguments.feature → unqualified.feature} +16 -37
  7. data/features/dsl/each_rake_task/{with_defined_namespace_argument.feature → with_defined_namespace.feature} +2 -13
  8. data/features/dsl/each_rake_task/{with_defined_task_argument.feature → with_defined_task.feature} +2 -6
  9. data/features/dsl/each_rake_task/with_undefined_task_or_namespace.feature +24 -0
  10. data/features/dsl/mirror_rake_tasks/inside_capistrano_namespace.feature +2 -2
  11. data/features/dsl/mirror_rake_tasks/{without_arguments.feature → unqualified.feature} +15 -11
  12. data/features/dsl/mirror_rake_tasks/with_cd.feature +63 -0
  13. data/features/dsl/mirror_rake_tasks/with_cd_and_environment_variables.feature +27 -0
  14. data/features/dsl/mirror_rake_tasks/{with_defined_namespace_argument.feature → with_defined_namespace.feature} +6 -8
  15. data/features/dsl/mirror_rake_tasks/{with_defined_task_argument.feature → with_defined_task.feature} +4 -4
  16. data/features/dsl/mirror_rake_tasks/{with_defined_task_argument_and_environment_variables.feature → with_defined_task_and_cd.feature} +8 -8
  17. data/features/dsl/mirror_rake_tasks/with_defined_task_and_cd_and_environment_variables.feature +46 -0
  18. data/features/dsl/mirror_rake_tasks/with_defined_task_and_environment_variables.feature +92 -0
  19. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename.feature +47 -0
  20. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_cd.feature +49 -0
  21. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_cd_and_environment_variables.feature +52 -0
  22. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_environment_variables.feature +50 -0
  23. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_valid_options.feature +49 -0
  24. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_valid_options_and_cd.feature +51 -0
  25. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_valid_options_and_cd_and_environment_variables.feature +54 -0
  26. data/features/dsl/mirror_rake_tasks/with_defined_task_and_rename_and_valid_options_and_environment_variables.feature +52 -0
  27. data/features/dsl/mirror_rake_tasks/with_defined_task_and_valid_options.feature +53 -6
  28. data/features/dsl/mirror_rake_tasks/{with_defined_task_and_valid_options_arguments_and_environment_variables.feature → with_defined_task_and_valid_options_and_cd.feature} +10 -8
  29. data/features/dsl/mirror_rake_tasks/with_defined_task_and_valid_options_and_cd_and_environment_variables.feature +48 -0
  30. data/features/dsl/mirror_rake_tasks/with_defined_task_and_valid_options_and_environment_variables.feature +98 -0
  31. data/features/dsl/mirror_rake_tasks/with_environment_variables.feature +61 -4
  32. data/features/dsl/mirror_rake_tasks/with_rename.feature +27 -0
  33. data/features/dsl/mirror_rake_tasks/with_rename_and_cd.feature +28 -0
  34. data/features/dsl/mirror_rake_tasks/with_rename_and_cd_and_environment_variables.feature +30 -0
  35. data/features/dsl/mirror_rake_tasks/with_rename_and_environment_variables.feature +29 -0
  36. data/features/dsl/mirror_rake_tasks/with_rename_and_valid_options.feature +28 -0
  37. data/features/dsl/mirror_rake_tasks/with_rename_and_valid_options_and_cd.feature +29 -0
  38. data/features/dsl/mirror_rake_tasks/with_rename_and_valid_options_and_cd_and_environment_variables.feature +31 -0
  39. data/features/dsl/mirror_rake_tasks/with_rename_and_valid_options_and_environment_variables.feature +30 -0
  40. data/features/dsl/mirror_rake_tasks/{with_undefined_argument.feature → with_undefined_task_or_namespace.feature} +3 -4
  41. data/features/dsl/mirror_rake_tasks/with_valid_options.feature +46 -0
  42. data/features/dsl/mirror_rake_tasks/{with_valid_options_argument.feature → with_valid_options_and_cd.feature} +7 -5
  43. data/features/dsl/mirror_rake_tasks/with_valid_options_and_cd_and_environment_variables.feature +28 -0
  44. data/features/dsl/mirror_rake_tasks/with_valid_options_and_environment_variables.feature +51 -0
  45. data/features/dsl/rake_executable.feature +2 -2
  46. data/features/step_definitions.rb +40 -0
  47. data/lib/cape.rb +2 -0
  48. data/lib/cape/capistrano.rb +59 -32
  49. data/lib/cape/capistrano_deprecated.rb +165 -0
  50. data/lib/cape/core_ext.rb +2 -0
  51. data/lib/cape/deprecation.rb +12 -0
  52. data/lib/cape/deprecation/base.rb +59 -0
  53. data/lib/cape/deprecation/capistrano_deprecated_define_rake_wrapper.rb +168 -0
  54. data/lib/cape/deprecation/dsl_deprecated_mirror_rake_tasks.rb +145 -0
  55. data/lib/cape/dsl.rb +49 -60
  56. data/lib/cape/dsl_deprecated.rb +157 -0
  57. data/lib/cape/hash_list.rb +2 -0
  58. data/lib/cape/recipe_definition.rb +103 -0
  59. data/lib/cape/recipe_definition_deprecated.rb +41 -0
  60. data/lib/cape/util.rb +2 -0
  61. data/lib/cape/version.rb +1 -1
  62. data/lib/cape/xterm.rb +326 -0
  63. data/spec/cape/deprecation/base_sharedspec.rb +18 -0
  64. data/spec/cape/deprecation/capistrano_deprecated_define_rake_wrapper_spec.rb +157 -0
  65. data/spec/cape/deprecation/dsl_deprecated_mirror_rake_tasks_spec.rb +153 -0
  66. data/spec/cape/dsl_deprecated_spec.rb +307 -0
  67. data/spec/cape/dsl_spec.rb +10 -43
  68. data/spec/cape/recipe_definition_spec.rb +53 -0
  69. data/spec/cape/xterm_spec.rb +72 -0
  70. metadata +97 -28
  71. data/features/dsl/each_rake_task/with_undefined_argument.feature +0 -53
  72. data/features/dsl/mirror_rake_tasks/with_valid_options_arguments_and_environment_variables.feature +0 -26
@@ -5,6 +5,8 @@ end
5
5
  module Cape
6
6
 
7
7
  # Contains extensions to core types.
8
+ #
9
+ # @api private
8
10
  module CoreExt; end
9
11
 
10
12
  end
@@ -0,0 +1,12 @@
1
+ ::Dir.glob(::File.expand_path('../deprecation/*.rb', __FILE__)) do |f|
2
+ require "cape/deprecation/#{::File.basename f, '.rb'}"
3
+ end
4
+
5
+ module Cape
6
+
7
+ # Contains implementations of deprecation stream printers.
8
+ #
9
+ # @api private
10
+ module Deprecation; end
11
+
12
+ end
@@ -0,0 +1,59 @@
1
+ require 'cape/xterm'
2
+
3
+ module Cape
4
+
5
+ module Deprecation
6
+
7
+ # Prints to a stream a message related to deprecated API usage.
8
+ #
9
+ # @abstract
10
+ class Base
11
+
12
+ # Sets the value of {#stream}.
13
+ #
14
+ # @param [IO] value a new value for {#stream}
15
+ #
16
+ # @return [IO] _value_
17
+ attr_writer :stream
18
+
19
+ # Formats {#message_content} for display.
20
+ #
21
+ # @return [String] the full message
22
+ def formatted_message
23
+ [].tap do |fragments|
24
+ fragments << XTerm.bold_and_foreground_red('*** DEPRECATED:')
25
+ fragments << ' '
26
+ fragments << XTerm.bold(message_content)
27
+ end.join
28
+ end
29
+
30
+ # Prepares a message based on deprecated API usage.
31
+ #
32
+ # @raise [NotImplementedError]
33
+ #
34
+ # @abstract
35
+ def message_content
36
+ raise ::NotImplementedError
37
+ end
38
+
39
+ # The stream to which deprecation messages are printed. Defaults to
40
+ # $stderr.
41
+ #
42
+ # @return [IO]
43
+ def stream
44
+ @stream ||= $stderr
45
+ end
46
+
47
+ # Writes {#formatted_message} to {#stream}.
48
+ #
49
+ # @return [Base] the object
50
+ def write_formatted_message_to_stream
51
+ stream.puts formatted_message
52
+ self
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,168 @@
1
+ require 'cape/deprecation/base'
2
+ require 'cape/hash_list'
3
+
4
+ module Cape
5
+
6
+ module Deprecation
7
+
8
+ # Prints to a stream a message related to deprecated usage of
9
+ # {CapistranoDeprecated#define_rake_wrapper}.
10
+ class CapistranoDeprecatedDefineRakeWrapper < Base
11
+
12
+ # The _task_ argument to {CapistranoDeprecated#define_rake_wrapper}.
13
+ #
14
+ # @return [Symbol, String]
15
+ attr_accessor :task
16
+
17
+ # Environment variable names and values set in a call to
18
+ # {CapistranoDeprecated#define_rake_wrapper}.
19
+ #
20
+ # @return [HashList]
21
+ def env
22
+ @env ||= HashList.new
23
+ end
24
+
25
+ # Prepares a message based on deprecated usage of
26
+ # {CapistranoDeprecated#define_rake_wrapper}.
27
+ #
28
+ # @return [String] a deprecation message
29
+ def message_content
30
+ [].tap do |fragments|
31
+ fragments << message_content_actual
32
+ fragments << '. '
33
+ fragments << message_content_expected
34
+ end.join
35
+ end
36
+
37
+ # The _named_arguments_ argument to
38
+ # {CapistranoDeprecated#define_rake_wrapper}.
39
+ #
40
+ # @return [HashList]
41
+ def named_arguments
42
+ @named_arguments ||= HashList.new
43
+ end
44
+
45
+ # Sets the value of {#named_arguments}.
46
+ #
47
+ # @param [Hash] value a new value for {#named_arguments}
48
+ #
49
+ # @return [HashList] _value_
50
+ def named_arguments=(value)
51
+ @named_arguments = HashList.new(value)
52
+ end
53
+
54
+ private
55
+
56
+ def binding_named_arguments
57
+ named_arguments.select do |name, value|
58
+ name == :binding
59
+ end
60
+ end
61
+
62
+ def message_content_env_actual
63
+ [].tap do |fragments|
64
+ env_entries = env.collect do |name, value|
65
+ "env[#{name.inspect}] = #{value.inspect}"
66
+ end
67
+ unless env_entries.empty?
68
+ fragments << ' { |env| '
69
+ fragments << env_entries.join('; ')
70
+ fragments << ' }'
71
+ end
72
+ end.join
73
+ end
74
+
75
+ def message_content_options_and_env_expected
76
+ [].tap do |fragments|
77
+ unless named_arguments.empty? && env.empty?
78
+ fragments << ' { |recipes| '
79
+
80
+ options_entries = options.collect do |name, value|
81
+ "recipes.options[#{name.inspect}] = #{value.inspect}"
82
+ end
83
+ env_entries = env.collect do |name, value|
84
+ "recipes.env[#{name.inspect}] = #{value.inspect}"
85
+ end
86
+ fragments << (options_entries + env_entries).join('; ')
87
+
88
+ fragments << ' }'
89
+ end
90
+ end.join
91
+ end
92
+
93
+ def message_content_actual
94
+ [].tap do |fragments|
95
+ fragments << '`'
96
+ fragments << message_content_method_name
97
+ fragments << message_content_task_and_named_arguments_actual
98
+ fragments << message_content_env_actual
99
+ fragments << '`'
100
+ end.join
101
+ end
102
+
103
+ def message_content_expected
104
+ [].tap do |fragments|
105
+ fragments << 'Use this instead: '
106
+ fragments << '`'
107
+ fragments << message_content_method_name
108
+ fragments << message_content_task_and_named_arguments_expected
109
+ fragments << message_content_options_and_env_expected
110
+ fragments << '`'
111
+ end.join
112
+ end
113
+
114
+ def message_content_method_name
115
+ 'define_rake_wrapper'
116
+ end
117
+
118
+ def message_content_task_and_named_arguments_actual
119
+ [].tap do |fragments|
120
+ arguments = []
121
+ arguments << task.inspect unless task.nil?
122
+ named_arguments_entries = named_arguments.collect do |name, value|
123
+ "#{name.inspect} => #{value.inspect}"
124
+ end
125
+ unless named_arguments_entries.empty?
126
+ arguments << named_arguments_entries.join(', ')
127
+ end
128
+ unless arguments.empty?
129
+ if env.empty?
130
+ fragments << " #{arguments.join ', '}"
131
+ else
132
+ fragments << "(#{arguments.join ', '})"
133
+ end
134
+ end
135
+ end.join
136
+ end
137
+
138
+ def message_content_task_and_named_arguments_expected
139
+ [].tap do |fragments|
140
+ arguments = []
141
+ arguments << task.inspect unless task.nil?
142
+ binding_named_arguments_entries = binding_named_arguments.collect do |name, value|
143
+ "#{name.inspect} => #{value.inspect}"
144
+ end
145
+ unless binding_named_arguments_entries.empty?
146
+ arguments << binding_named_arguments_entries.join(', ')
147
+ end
148
+ unless arguments.empty?
149
+ if options.empty? && env.empty?
150
+ fragments << " #{arguments.join ', '}"
151
+ else
152
+ fragments << "(#{arguments.join ', '})"
153
+ end
154
+ end
155
+ end.join
156
+ end
157
+
158
+ def options
159
+ named_arguments.reject do |name, value|
160
+ name == :binding
161
+ end
162
+ end
163
+
164
+ end
165
+
166
+ end
167
+
168
+ end
@@ -0,0 +1,145 @@
1
+ require 'cape/deprecation/base'
2
+ require 'cape/hash_list'
3
+
4
+ module Cape
5
+
6
+ module Deprecation
7
+
8
+ # Prints to a stream a message related to deprecated usage of
9
+ # {DSLDeprecated#mirror_rake_tasks}.
10
+ class DSLDeprecatedMirrorRakeTasks < Base
11
+
12
+ # The _task_expression_ argument to {DSLDeprecated#mirror_rake_tasks}.
13
+ #
14
+ # @return [Symbol, String]
15
+ attr_accessor :task_expression
16
+
17
+ # Environment variable names and values set in a call to
18
+ # {DSLDeprecated#mirror_rake_tasks}.
19
+ #
20
+ # @return [HashList]
21
+ def env
22
+ @env ||= HashList.new
23
+ end
24
+
25
+ # Prepares a message based on deprecated usage of
26
+ # {DSLDeprecated#mirror_rake_tasks}.
27
+ #
28
+ # @return [String] a deprecation message
29
+ def message_content
30
+ [].tap do |fragments|
31
+ fragments << message_content_actual
32
+ fragments << '. '
33
+ fragments << message_content_expected
34
+ end.join
35
+ end
36
+
37
+ # The _options_ argument to {DSLDeprecated#mirror_rake_tasks}.
38
+ #
39
+ # @return [HashList]
40
+ def options
41
+ @options ||= HashList.new
42
+ end
43
+
44
+ # Sets the value of {#options}.
45
+ #
46
+ # @param [Hash] value a new value for {#options}
47
+ #
48
+ # @return [HashList] _value_
49
+ def options=(value)
50
+ @options = HashList.new(value)
51
+ end
52
+
53
+ private
54
+
55
+ def message_content_env_actual
56
+ [].tap do |fragments|
57
+ env_entries = env.collect do |name, value|
58
+ "env[#{name.inspect}] = #{value.inspect}"
59
+ end
60
+ unless env_entries.empty?
61
+ fragments << ' { |env| '
62
+ fragments << env_entries.join('; ')
63
+ fragments << ' }'
64
+ end
65
+ end.join
66
+ end
67
+
68
+ def message_content_options_and_env_expected
69
+ [].tap do |fragments|
70
+ unless options.empty? && env.empty?
71
+ fragments << ' { |recipes| '
72
+
73
+ options_entries = options.collect do |name, value|
74
+ "recipes.options[#{name.inspect}] = #{value.inspect}"
75
+ end
76
+ env_entries = env.collect do |name, value|
77
+ "recipes.env[#{name.inspect}] = #{value.inspect}"
78
+ end
79
+ fragments << (options_entries + env_entries).join('; ')
80
+
81
+ fragments << ' }'
82
+ end
83
+ end.join
84
+ end
85
+
86
+ def message_content_actual
87
+ [].tap do |fragments|
88
+ fragments << '`'
89
+ fragments << message_content_method_name
90
+ fragments << message_content_task_expression_and_options_actual
91
+ fragments << message_content_env_actual
92
+ fragments << '`'
93
+ end.join
94
+ end
95
+
96
+ def message_content_expected
97
+ [].tap do |fragments|
98
+ fragments << 'Use this instead: '
99
+ fragments << '`'
100
+ fragments << message_content_method_name
101
+ fragments << message_content_task_expression_expected
102
+ fragments << message_content_options_and_env_expected
103
+ fragments << '`'
104
+ end.join
105
+ end
106
+
107
+ def message_content_method_name
108
+ 'mirror_rake_tasks'
109
+ end
110
+
111
+ def message_content_task_expression_and_options_actual
112
+ [].tap do |fragments|
113
+ arguments = []
114
+ arguments << task_expression.inspect unless task_expression.nil?
115
+ options_entries = options.collect do |name, value|
116
+ "#{name.inspect} => #{value.inspect}"
117
+ end
118
+ arguments << options_entries.join(', ') unless options_entries.empty?
119
+ unless arguments.empty?
120
+ if env.empty?
121
+ fragments << " #{arguments.join ', '}"
122
+ else
123
+ fragments << "(#{arguments.join ', '})"
124
+ end
125
+ end
126
+ end.join
127
+ end
128
+
129
+ def message_content_task_expression_expected
130
+ [].tap do |fragments|
131
+ unless task_expression.nil?
132
+ if options.empty? && env.empty?
133
+ fragments << " #{task_expression.inspect}"
134
+ else
135
+ fragments << "(#{task_expression.inspect})"
136
+ end
137
+ end
138
+ end.join
139
+ end
140
+
141
+ end
142
+
143
+ end
144
+
145
+ end
@@ -92,59 +92,26 @@ module Cape
92
92
 
93
93
  # Defines Rake tasks as Capistrano recipes.
94
94
  #
95
- # @overload mirror_rake_tasks(task_expression=nil)
96
- # Defines Rake tasks as Capistrano recipes.
97
- #
98
- # @param [String, Symbol] task_expression the full name of a Rake task or
99
- # namespace to filter
100
- #
101
- # @yield [env] a block that defines environment variables for the Rake
102
- # task; optional
103
- # @yieldparam [Hash] env the environment variables to set before executing
104
- # the Rake task
105
- #
106
- # @return [DSL] the object
107
- #
108
- # @overload mirror_rake_tasks(capistrano_task_options={})
109
- # Defines all Rake tasks as Capistrano recipes with options.
110
- #
111
- # @param [Hash] capistrano_task_options options to pass to the Capistrano
112
- # +task+ method; optional
113
- #
114
- # @yield [env] a block that defines environment variables for the Rake
115
- # task; optional
116
- # @yieldparam [Hash] env the environment variables to set before executing
117
- # the Rake task
118
- #
119
- # @return [DSL] the object
120
- #
121
- # @overload mirror_rake_tasks(task_expression, capistrano_task_options={})
122
- # Defines specific Rake tasks as Capistrano recipes with options.
123
- #
124
- # @param [String, Symbol] task_expression the full name of a Rake
125
- # task or namespace to
126
- # filter
127
- # @param [Hash] capistrano_task_options options to pass to the
128
- # Capistrano +task+ method;
129
- # optional
95
+ # @param [String, Symbol] task_expression the full name of a Rake task or
96
+ # namespace to filter
130
97
  #
131
- # @yield [env] a block that defines environment variables for the Rake
132
- # task; optional
133
- # @yieldparam [Hash] env the environment variables to set before executing
134
- # the Rake task
98
+ # @yield [recipes] a block that customizes the Capistrano recipe(s)
99
+ # generated for the Rake task(s); optional
100
+ # @yieldparam [RecipeDefinition] recipes an interface for customizing the
101
+ # Capistrano recipe(s) generated for
102
+ # the Rake task(s)
135
103
  #
136
- # @return [DSL] the object
104
+ # @return [DSL] the object
137
105
  #
138
106
  # @note Any parameters that the Rake tasks have are integrated via environment variables, since Capistrano does not support recipe parameters per se.
139
107
  #
140
- # @see http://github.com/capistrano/capistrano/blob/master/lib/capistrano/configuration/actions/invocation.rb#L99-L144 Valid Capistrano ‘task’ method options
141
- #
142
108
  # @example Mirroring all Rake tasks
143
109
  # # config/deploy.rb
144
110
  #
145
111
  # require 'cape'
146
112
  #
147
113
  # Cape do
114
+ # # Create Capistrano recipes for all Rake tasks.
148
115
  # mirror_rake_tasks
149
116
  # end
150
117
  #
@@ -159,7 +126,7 @@ module Cape
159
126
  # mirror_rake_tasks :foo
160
127
  # end
161
128
  #
162
- # @example Mirroring Rake tasks that require Capistrano recipe options and/or environment variables
129
+ # @example Mirroring Rake tasks that require renaming, Capistrano recipe options, path switching, and/or environment variables
163
130
  # # config/deploy.rb
164
131
  #
165
132
  # require 'cape'
@@ -167,13 +134,37 @@ module Cape
167
134
  # Cape do
168
135
  # # Display defined Rails routes on application server remote machines
169
136
  # # only.
170
- # mirror_rake_tasks :routes, :roles => :app
137
+ # mirror_rake_tasks :routes do |recipes|
138
+ # recipes.options[:roles] = :app
139
+ # end
171
140
  #
172
141
  # # Execute database migration on application server remote machines
173
142
  # # only, and set the 'RAILS_ENV' environment variable to the value of
174
143
  # # the Capistrano variable 'rails_env'.
175
- # mirror_rake_tasks 'db:migrate', :roles => :app do |env|
176
- # env['RAILS_ENV'] = rails_env
144
+ # mirror_rake_tasks 'db:migrate' do |recipes|
145
+ # recipes.options[:roles] = :app
146
+ # recipes.env['RAILS_ENV'] = lambda { rails_env }
147
+ # end
148
+ #
149
+ # # Support a Rake task that must be run on application server remote
150
+ # # machines only, and in the remote directory 'release_path' instead of
151
+ # # the default, 'current_path'.
152
+ # before 'deploy:symlink', :spec
153
+ # mirror_rake_tasks :spec do |recipes|
154
+ # recipes.cd { release_path }
155
+ # recipes.options[:roles] = :app
156
+ # end
157
+ #
158
+ # # Avoid collisions with the existing Ruby method #test, run tests on
159
+ # # application server remote machines only, and set the 'RAILS_ENV'
160
+ # # environment variable to the value of the Capistrano variable
161
+ # # 'rails_env'.
162
+ # mirror_rake_tasks :test do |recipes|
163
+ # recipes.rename do |rake_task_name|
164
+ # "#{rake_task_name}_task"
165
+ # end
166
+ # recipes.options[:roles] = :app
167
+ # recipes.env['RAILS_ENV'] = lambda { rails_env }
177
168
  # end
178
169
  # end
179
170
  #
@@ -187,19 +178,9 @@ module Cape
187
178
  # cape.mirror_rake_tasks
188
179
  # end
189
180
  # end
190
- def mirror_rake_tasks(*arguments, &block)
191
- arguments_count = arguments.length
192
- options = arguments.last.is_a?(Hash) ? arguments.pop.dup : {}
193
- unless arguments.length <= 1
194
- raise ::ArgumentError,
195
- ("wrong number of arguments (#{arguments_count} for 0 or 1, " +
196
- 'plus an options hash)')
197
- end
198
-
199
- task_expression = arguments.first
200
- options[:binding] = binding
181
+ def mirror_rake_tasks(task_expression=nil, &block)
201
182
  rake.each_task task_expression do |t|
202
- deployment_library.define_rake_wrapper(t, options, &block)
183
+ deployment_library.define_rake_wrapper(t, :binding => binding, &block)
203
184
  end
204
185
  self
205
186
  end
@@ -235,7 +216,7 @@ module Cape
235
216
 
236
217
  # Returns an abstraction of the Rake installation and available tasks.
237
218
  def rake
238
- @rake ||= Rake.new
219
+ @rake ||= new_rake
239
220
  end
240
221
 
241
222
  private
@@ -244,7 +225,15 @@ module Cape
244
225
  return @deployment_library if @deployment_library
245
226
 
246
227
  raise_unless_capistrano
247
- @deployment_library = Capistrano.new(:rake => rake)
228
+ @deployment_library = new_capistrano(:rake => rake)
229
+ end
230
+
231
+ def new_capistrano(*arguments)
232
+ Capistrano.new(*arguments)
233
+ end
234
+
235
+ def new_rake(*arguments)
236
+ Rake.new(*arguments)
248
237
  end
249
238
 
250
239
  def raise_unless_capistrano