wagons 0.0.1 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/MIT-LICENSE +1 -1
  2. data/README.rdoc +135 -9
  3. data/Rakefile +13 -5
  4. data/lib/generators/wagon/templates/%singular_name%.gemspec.tt +0 -2
  5. data/lib/generators/wagon/templates/.gitignore +5 -0
  6. data/lib/generators/wagon/templates/Gemfile.tt +5 -9
  7. data/lib/generators/wagon/templates/app/assets/images/.empty_directory +0 -0
  8. data/lib/generators/wagon/templates/app/controllers/.empty_directory +0 -0
  9. data/lib/generators/wagon/templates/app/models/.empty_directory +0 -0
  10. data/lib/generators/wagon/templates/app/views/.empty_directory +0 -0
  11. data/lib/generators/wagon/templates/db/fixtures/development/.empty_directory +0 -0
  12. data/lib/generators/wagon/templates/db/migrate/.empty_directory +0 -0
  13. data/lib/generators/wagon/templates/lib/%singular_name%/wagon.rb.tt +7 -4
  14. data/lib/generators/wagon/templates/test/fixtures/.empty_directory +0 -0
  15. data/lib/generators/wagon/wagon_generator.rb +23 -4
  16. data/lib/tasks/wagons.rake +119 -20
  17. data/lib/wagons/extensions/application.rb +14 -0
  18. data/lib/wagons/extensions/require_optional.rb +9 -0
  19. data/lib/wagons/{test_case.rb → extensions/test_case.rb} +4 -1
  20. data/lib/wagons/installer.rb +313 -0
  21. data/lib/wagons/railtie.rb +1 -1
  22. data/lib/wagons/version.rb +1 -1
  23. data/lib/wagons/view_helper.rb +58 -0
  24. data/lib/wagons/wagon.rb +125 -109
  25. data/lib/wagons/wagon_tasks.rake +9 -7
  26. data/lib/wagons.rb +44 -7
  27. data/test/dummy/Gemfile +8 -2
  28. data/test/dummy/Gemfile.lock +51 -48
  29. data/test/dummy/app/assets/javascripts/application.js +0 -2
  30. data/test/dummy/app/controllers/people_controller.rb +6 -0
  31. data/test/dummy/app/views/people/index.html.erb +6 -0
  32. data/test/dummy/app/views/shared/_sidebar.html.erb +3 -0
  33. data/test/dummy/config/initializers/wagon_app_version.rb +7 -0
  34. data/test/dummy/config/routes.rb +3 -0
  35. data/test/dummy/db/development.sqlite3 +0 -0
  36. data/test/dummy/db/schema.rb +1 -1
  37. data/test/dummy/db/test.sqlite3 +0 -0
  38. data/test/dummy/log/development.log +1230 -1586
  39. data/test/dummy/log/test.log +6458 -1772
  40. data/test/dummy/test/unit/person_test.rb +6 -0
  41. data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  42. data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  43. data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  44. data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  45. data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
  46. data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
  47. data/test/dummy/tmp/pids/server.pid +1 -0
  48. data/test/dummy/vendor/wagons/superliner/Gemfile +1 -5
  49. data/test/dummy/vendor/wagons/superliner/Gemfile.lock +46 -48
  50. data/test/dummy/vendor/wagons/superliner/app/controllers/cities_controller.rb +6 -0
  51. data/test/dummy/vendor/wagons/superliner/app/views/cities/index.html.erb +7 -0
  52. data/test/dummy/vendor/wagons/superliner/app/views/people/_list_superliner.html.erb +3 -0
  53. data/test/dummy/vendor/wagons/superliner/app/views/shared/_sidebar_superliner.html.erb +1 -0
  54. data/test/dummy/vendor/wagons/superliner/config/routes.rb +1 -1
  55. data/test/dummy/vendor/wagons/superliner/db/migrate/{20120606125258_create_cities.rb → 20120606125058_create_cities.rb} +0 -0
  56. data/test/dummy/vendor/wagons/superliner/dummy_superliner.gemspec +0 -2
  57. data/test/dummy/vendor/wagons/superliner/lib/dummy_superliner/wagon.rb +3 -1
  58. data/test/dummy/vendor/wagons/superliner/test/functionals/cities_controller_test.rb +12 -0
  59. data/test/dummy/vendor/wagons/superliner/test/functionals/people_controller_test.rb +14 -0
  60. data/test/dummy/vendor/wagons/superliner/test/unit/city_test.rb +4 -1
  61. data/test/dummy/vendor/wagons/superliner/test/wagon_test.rb +7 -5
  62. data/test/wagons_installer_test.rb +225 -0
  63. metadata +241 -169
  64. data/test/dummy/dummy.gemspec +0 -17
@@ -0,0 +1,313 @@
1
+ module Wagons
2
+
3
+ # Helper class to install wagons into the current application.
4
+ # Wagons are searched for in the system gem repository.
5
+ #
6
+ # If you want to use the #install method, add "gem 'open4'" to
7
+ # your Gemfile.
8
+ class Installer
9
+
10
+ attr_accessor :include_version_in_wagonfile
11
+
12
+ def initialize
13
+ @include_version_in_wagonfile = true
14
+ end
15
+
16
+ # Gem specifications of all installed wagons.
17
+ def installed
18
+ @installed ||= Wagons.all.collect(&:gemspec)
19
+ end
20
+
21
+ # Most recent gem specifications of all wagons available in GEM_HOME.
22
+ def available
23
+ return @available if defined?(@available)
24
+
25
+ # only keep most recent version in @available
26
+ @available = []
27
+ load_available_specs.each do |spec|
28
+ if prev = @available.find {|w| w.name == spec.name }
29
+ if prev.version < spec.version
30
+ @available.delete(prev)
31
+ @available << spec
32
+ end
33
+ else
34
+ @available << spec
35
+ end
36
+ end
37
+ @available
38
+ end
39
+
40
+
41
+ # Most recent gem specifications of available, but not installed (in any version) wagons.
42
+ def not_installed
43
+ exclude_specs(available, installed)
44
+ end
45
+
46
+ # Most recent gem specifications of available and installed (in an older version) wagons.
47
+ def updates
48
+ available.select do |spec|
49
+ if wagon = installed_spec(spec.name)
50
+ wagon.version < spec.version
51
+ end
52
+ end
53
+ end
54
+
55
+ # Install or update the wagons with the given names. I.e., adds the given
56
+ # wagon names to the Wagonfile and runs rake wagon:setup.
57
+ # After that, the application MUST be restarted to load the new wagons.
58
+ # Returns nil if everything is fine or a string with error messages.
59
+ # This method requires open4.
60
+ def install(names)
61
+ change_internal(names, :check_dependencies) do |specs|
62
+ content = File.read(wagonfile) rescue ""
63
+ wagonfile_update(specs)
64
+
65
+ begin
66
+ setup_wagons(specs)
67
+ rescue => e
68
+ wagonfile_write(content)
69
+ raise e
70
+ end
71
+ end
72
+ end
73
+
74
+ # Remove the wagons with the given names. I.e., reverts the migrations
75
+ # of the given wagon names if the wagon is not protected
76
+ # and removes the entries from the Wagonfile.
77
+ # Returns nil if everything is fine or a string with error messages.
78
+ def uninstall(names)
79
+ change_internal(names, :check_uninstalled_dependencies, :check_protected) do |specs|
80
+ remove_wagons(specs)
81
+ wagonfile_remove(specs)
82
+ end
83
+ end
84
+
85
+ # Get the gem specification of the installed wagon with the given name.
86
+ # Return nil if not found.
87
+ def installed_spec(name)
88
+ installed.find {|s| s.name == name }
89
+ end
90
+
91
+ # Get the gem specification of an available wagon with the given name.
92
+ # Return nil if not found.
93
+ def available_spec(name)
94
+ available.find {|s| s.name == name}
95
+ end
96
+
97
+ # Update the Wagonfile with the given gem specifications.
98
+ def wagonfile_update(specs)
99
+ wagonfile_edit(specs) do |spec, content|
100
+ declaration = "gem '#{spec.name}'"
101
+ declaration += ", '#{spec.version.to_s}'" if include_version_in_wagonfile
102
+ unless content.sub!(gem_declaration_regexp(spec.name), declaration)
103
+ content += "\n#{declaration}"
104
+ end
105
+ content
106
+ end
107
+ end
108
+
109
+ # Remove the given gem specifications from the Wagonfile.
110
+ def wagonfile_remove(specs)
111
+ wagonfile_edit(specs) do |spec, content|
112
+ content.sub(gem_declaration_regexp(spec.name), '')
113
+ end
114
+ end
115
+
116
+ # Check if all wagon dependencies of the given gem specifications
117
+ # are met by the installed wagons.
118
+ # Returns nil if everything is fine or a string with error messages.
119
+ def check_dependencies(specs)
120
+ missing = check_app_requirement(specs)
121
+
122
+ present = exclude_specs(installed, specs)
123
+ future = present + specs
124
+
125
+ check_all_dependencies(specs, future, missing)
126
+ end
127
+
128
+ # Check if the app requirement of the given gem specifications
129
+ # are met by the current app version.
130
+ # Returns nil if everything is fine or a array with error messages.
131
+ def check_app_requirement(specs)
132
+ missing = []
133
+ specs.each do |spec|
134
+ if wagon = wagon_class(spec)
135
+ unless wagon.app_requirement.satisfied_by?(Wagons.app_version)
136
+ missing << "#{spec} requires application version #{wagon.app_requirement}"
137
+ end
138
+ end
139
+ end
140
+
141
+ missing
142
+ end
143
+
144
+ # Check if the wagon dependencies of the remaining wagons
145
+ # would still be met after the given gem specifications are uninstalled.
146
+ # Returns nil if everything is fine or a string with error messages.
147
+ def check_uninstalled_dependencies(specs)
148
+ present = exclude_specs(installed, specs)
149
+ check_all_dependencies(present, present)
150
+ end
151
+
152
+ # Checks if the wagons for given gem specifications are protected.
153
+ # Returns nil if everything is fine or a string with error messages.
154
+ def check_protected(specs)
155
+ protected = []
156
+ specs.each do |spec|
157
+ msg = Wagons.find(spec.name).protect?
158
+ protected << msg if msg.is_a?(String)
159
+ end
160
+ protected.join("\n").presence
161
+ end
162
+
163
+ # List of available gem specifications with the given names.
164
+ # Raises an error if a name cannot be found.
165
+ def specs_from_names(names)
166
+ names.collect do |name|
167
+ spec = available_spec(name)
168
+ raise "#{name} was not found" if spec.nil?
169
+ spec
170
+ end
171
+ end
172
+
173
+ # Removes all gem specifications with the same name in to_be_excluded from full.
174
+ # Versions are ignored.
175
+ def exclude_specs(full, to_be_excluded)
176
+ full.clone.delete_if {|s| to_be_excluded.find {|d| s.name == d.name } }
177
+ end
178
+
179
+ # Wagonfile
180
+ def wagonfile
181
+ Rails.root.join("Wagonfile")
182
+ end
183
+
184
+ # The wagon class of the given spec.
185
+ def wagon_class(spec)
186
+ @wagon_classes ||= {}
187
+ return @wagon_classes[spec] if @wagon_classes.has_key?(spec)
188
+
189
+ clazz = nil
190
+ file = File.join(spec.gem_dir, 'lib', spec.name, 'wagon.rb')
191
+ if File.exists?(file)
192
+ require file
193
+ clazz = "#{spec.name.camelize}::Wagon".constantize
194
+ else
195
+ raise "#{spec.name} wagon class not found in #{file}"
196
+ end
197
+ @wagon_classes[spec] = clazz
198
+ end
199
+
200
+ private
201
+
202
+ def load_available_specs
203
+ paths = [ENV['GEM_HOME']]
204
+ paths += (ENV['GEM_PATH'] || "").split(File::PATH_SEPARATOR)
205
+ paths.collect(&:presence).compact.collect do |path|
206
+ Dir[File.join(path, 'specifications', "#{Wagons.app_name}_*.gemspec")].collect do |gemspec|
207
+ Gem::Specification.load(gemspec)
208
+ end
209
+ end.flatten
210
+ end
211
+
212
+ def perform_checks(specs, checks)
213
+ checks.each do |check|
214
+ if msg = send(check, specs)
215
+ return msg
216
+ end
217
+ end
218
+ nil
219
+ end
220
+
221
+ def check_all_dependencies(to_check, all, missing = [])
222
+ to_check.each do |spec|
223
+ spec.runtime_dependencies.each do |dep|
224
+ if dep.name.start_with?("#{Wagons.app_name}_") &&
225
+ all.none? {|s| dep.matches_spec?(s) }
226
+ missing << "#{spec.name} requires #{dep.name} #{dep.requirement}"
227
+ end
228
+ end
229
+ end
230
+
231
+ missing.join("\n").presence
232
+ end
233
+
234
+ def gem_declaration_regexp(name)
235
+ /^.*gem\s+('|")#{name}('|").*$/
236
+ end
237
+
238
+ def wagonfile_edit(specs)
239
+ content = File.read(wagonfile) rescue ""
240
+
241
+ specs.each do |spec|
242
+ content = yield spec, content
243
+ end
244
+ content.gsub!(/(\n\s*\n\s*)+/, "\n") # remove empty lines
245
+
246
+ wagonfile_write(content.strip)
247
+ end
248
+
249
+ def wagonfile_write(content)
250
+ File.open(wagonfile, 'w') do |f|
251
+ f.puts content
252
+ end
253
+ end
254
+
255
+ def setup_wagons(specs)
256
+ require 'open4'
257
+
258
+ env = Rails.env
259
+ cmd = setup_command(specs)
260
+ Rails.logger.info(cmd)
261
+
262
+ Bundler.with_clean_env do
263
+ ENV['RAILS_ENV'] = env
264
+ execute_setup(cmd)
265
+ end
266
+ end
267
+
268
+ def remove_wagons(specs)
269
+ Wagons.all.reverse.each do |wagon|
270
+ if specs.find {|spec| wagon.gem_name == spec.name }
271
+ wagon.unload_seed
272
+ wagon.revert
273
+ end
274
+ end
275
+ end
276
+
277
+ def setup_command(specs)
278
+ wagons = specs.collect {|s| s.name.sub(/^#{Wagons.app_name}_/, '') }.join(',')
279
+ "cd #{Rails.root} && bundle exec rake wagon:setup WAGON=#{wagons} -t"
280
+ end
281
+
282
+ def execute_setup(cmd)
283
+ msg = nil
284
+ status = Open4.popen4(cmd) do |pid, input, output, errors|
285
+ msg = errors.read
286
+ end
287
+
288
+ if status.exitstatus.to_i != 0
289
+ raise msg.presence || "Unknown error while running wagon:setup"
290
+ end
291
+ end
292
+
293
+ def change_internal(names, *checks)
294
+ specs = specs_from_names(names)
295
+
296
+ if msg = perform_checks(specs, checks)
297
+ msg
298
+ else
299
+ yield specs
300
+ nil
301
+ end
302
+ rescue Exception => e
303
+ handle_exception(e, names)
304
+ end
305
+
306
+ def handle_exception(e, names)
307
+ msg = e.message
308
+ Rails.logger.error msg + "\n\t" + e.backtrace.join("\n\t")
309
+ msg
310
+ end
311
+
312
+ end
313
+ end
@@ -1,6 +1,6 @@
1
1
  module Wagons
2
2
  # Integrate tasks into Rails.
3
- class Railtie < Rails::Railtie
3
+ class Railtie < Rails::Railtie #:nodoc:
4
4
  rake_tasks do
5
5
  load "tasks/wagons.rake"
6
6
  end
@@ -1,3 +1,3 @@
1
1
  module Wagons
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -0,0 +1,58 @@
1
+ module Wagons
2
+ module ViewHelper
3
+
4
+ # Renders all partials with names that match "_[ key ]_*.[ format ].[ handler ]"
5
+ # in alphabetical order.
6
+ # Accepts an additional option :folder to pass an additional folder to search
7
+ # extension partials in.
8
+ def render_extensions(key, options = {})
9
+ extensions = find_extension_partials(key, options.delete(:folder)).collect do |partial|
10
+ render options.merge(:partial => partial)
11
+ end
12
+ safe_join(extensions)
13
+ end
14
+
15
+ # The view folders relative to app/views in which extensions are searched for.
16
+ # Uses the folder of the current template.
17
+ def extension_folders
18
+ [current_template_folder]
19
+ end
20
+
21
+ # The folder of the current partial relative to app/views
22
+ def current_template_folder
23
+ @virtual_path[/(.+)\/.*/, 1]
24
+ end
25
+
26
+ private
27
+
28
+ def find_extension_partials(key, folder = nil)
29
+ folders = extension_folders.dup
30
+ folders << folder if folder
31
+
32
+ files = find_extension_files(key, folders).sort_by { |f| File.basename(f) }
33
+ files_to_partial_names(files)
34
+ end
35
+
36
+ def find_extension_files(key, folders)
37
+ view_paths.collect do |path|
38
+ folders.collect do |folder|
39
+ lookup_context.formats.collect do |format|
40
+ lookup_context.handlers.collect do |handler|
41
+ Dir.glob(File.join(path, folder, "_#{key}_*.#{format}.#{handler}"))
42
+ end
43
+ end
44
+ end
45
+ end.flatten
46
+ end
47
+
48
+ def files_to_partial_names(files)
49
+ files.collect do |f|
50
+ m = f.match(/views.(.+?[\/\\])_(.+)\.\w+\.\w+$/)
51
+ m[1] + m[2]
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+
58
+ ActionView::Base.send(:include, Wagons::ViewHelper) if defined?(ActionView::Base)
data/lib/wagons/wagon.rb CHANGED
@@ -1,112 +1,128 @@
1
- # A wagon is an extension to your application train running on Rails.
2
- #
3
- # Wagons are built on Rails Engines. To change an engine to a wagon,
4
- # simply include this module into your own Engine.
5
- module Wagon
6
-
7
- # All wagons installed in the current Rails application.
8
- def self.all
9
- Rails.application.railties.all.select {|r| r.is_a?(Wagon) }
10
- end
11
-
12
- # The name of the main Rails application.
13
- def self.app_name
14
- Rails.application.class.name.split('::').first.underscore
15
- end
16
-
17
- # Find a wagon by its name.
18
- def self.find(name)
19
- name = name.to_s
20
- all.find {|wagon| wagon.wagon_name == name || wagon.gem_name == name }
21
- end
22
-
23
- # Version from the gemspec.
24
- def version
25
- gemspec.version
26
- end
27
-
28
- # Human readable name.
29
- def label
30
- gemspec.summary
31
- end
32
-
33
- # Simple system name, without application prefix.
34
- def wagon_name
35
- gem_name.sub(/^#{Wagon.app_name}_/, '')
36
- end
37
-
38
- # Name of the gem.
39
- def gem_name
40
- class_name = self.class.name.demodulize.underscore
41
- engine_name.sub(/_#{class_name}$/, '')
42
- end
43
-
44
- # Description from the gemspec.
45
- def description
46
- gemspec.description
47
- end
48
-
49
- # Direct dependencies on other wagons.
50
- def dependencies
51
- gemspec.dependencies.collect(&:name).
52
- select {|dep| dep =~ /\A#{Wagon.app_name}_/ }.
53
- collect { |dep| Wagon.find(dep) || raise("No wagon #{dep} found") }
54
- end
55
-
56
- # Recursive depdencies on other wagons.
57
- def all_dependencies
58
- dependencies.collect {|dep| dep.all_dependencies + [dep] }.flatten.uniq
59
- end
60
-
61
- # Gem Specification.
62
- def gemspec
63
- Gem::Specification.find_by_name(gem_name)
64
- end
65
-
66
- # If true, this wagon may not be removed. Override as required.
67
- def protect?
68
- false
69
- end
70
-
71
- # Run the migrations.
72
- def migrate(version = nil)
73
- ActiveRecord::Migrator.migrate(migrations_paths, version)
74
- end
75
-
76
- # Revert the migrations.
77
- def revert
78
- ActiveRecord::Migrator.migrate(migrations_paths, 0)
79
- end
80
-
81
- # Load seed data in db/fixtures.
82
- def load_seed
83
- SeedFu.seed seed_fixtures
84
- end
85
-
86
- # Unload seed data in db/fixtures.
87
- def unload_seed
88
- SeedFuNdo.unseed seed_fixtures
89
- end
90
-
91
- # Paths for migration files.
92
- def migrations_paths
93
- paths['db/migrate'].existent
94
- end
95
-
96
- # Loads tasks into the main Rails application.
97
- # Overwritten to only load own rake tasks, without install:migrations task from Rails::Engine
98
- def load_tasks(app=self)
99
- railties.all { |r| r.load_tasks(app) }
100
- extend Rake::DSL if defined? Rake::DSL
101
- self.class.rake_tasks.each { |block| self.instance_exec(app, &block) }
102
- paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
103
- end
104
-
105
- private
106
-
107
- def seed_fixtures
108
- fixtures = root.join('db', 'fixtures')
109
- [fixtures, File.join(fixtures, Rails.env)]
1
+ require 'active_support/concern'
2
+
3
+ module Wagons
4
+
5
+ # A wagon is an extension to your application train running on Rails.
6
+ #
7
+ # Wagons are built on Rails Engines. To change an engine to a wagon,
8
+ # simply include this module into your own Engine.
9
+ module Wagon
10
+ extend ActiveSupport::Concern
11
+
12
+ # Version from the gemspec.
13
+ def version
14
+ gemspec.version
15
+ end
16
+
17
+ # Human readable name.
18
+ def label
19
+ gemspec.summary
20
+ end
21
+
22
+ # Simple system name, without application prefix.
23
+ def wagon_name
24
+ gem_name.sub(/^#{Wagons.app_name}_/, '')
25
+ end
26
+
27
+ # Name of the gem.
28
+ def gem_name
29
+ class_name = self.class.name.demodulize.underscore
30
+ engine_name.sub(/_#{class_name}$/, '')
31
+ end
32
+
33
+ # Description from the gemspec.
34
+ def description
35
+ gemspec.description
36
+ end
37
+
38
+ # Direct dependencies on other wagons.
39
+ def dependencies
40
+ gemspec.dependencies.collect(&:name).
41
+ select {|dep| dep =~ /\A#{Wagons.app_name}_/ }.
42
+ collect { |dep| Wagons.find(dep) || raise("No wagon #{dep} found") }
43
+ end
44
+
45
+ # Recursive depdencies on other wagons.
46
+ def all_dependencies
47
+ dependencies.collect {|dep| dep.all_dependencies + [dep] }.flatten.uniq
48
+ end
49
+
50
+ # Gem Specification.
51
+ def gemspec
52
+ Gem::Specification.find_by_name(gem_name)
53
+ end
54
+
55
+ # If true, this wagon may not be removed. Override as required.
56
+ # May return a string with a message, why the wagon must not be removed.
57
+ def protect?
58
+ false
59
+ end
60
+
61
+ # Run the migrations.
62
+ def migrate(version = nil)
63
+ ActiveRecord::Migrator.migrate(migrations_paths, version)
64
+ end
65
+
66
+ # Revert the migrations.
67
+ def revert
68
+ ActiveRecord::Migrator.migrate(migrations_paths, 0)
69
+ end
70
+
71
+ # Load seed data in db/fixtures.
72
+ def load_seed
73
+ SeedFu.seed seed_fixtures
74
+ end
75
+
76
+ # Unload seed data in db/fixtures.
77
+ def unload_seed
78
+ SeedFuNdo.unseed seed_fixtures
79
+ end
80
+
81
+ # Hash of the seed models to their existing records.
82
+ def existing_seeds
83
+ silence_stream(STDOUT) do
84
+ SeedFuNdo.existing_seeds seed_fixtures
85
+ end
86
+ end
87
+
88
+ # The version requirement for the main application.
89
+ def app_requirement
90
+ self.class.app_requirement
91
+ end
92
+
93
+ # Paths for migration files.
94
+ def migrations_paths
95
+ paths['db/migrate'].existent
96
+ end
97
+
98
+ # Loads tasks into the main Rails application.
99
+ # Overwritten to only load own rake tasks, without install:migrations task from Rails::Engine
100
+ def load_tasks(app=self)
101
+ railties.all { |r| r.load_tasks(app) }
102
+ extend Rake::DSL if defined? Rake::DSL
103
+ self.class.rake_tasks.each { |block| self.instance_exec(app, &block) }
104
+ paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
105
+ end
106
+
107
+ private
108
+
109
+ def seed_fixtures
110
+ fixtures = root.join('db', 'fixtures')
111
+ ENV['NO_ENV'] ? [fixtures] : [fixtures, File.join(fixtures, Rails.env)]
112
+ end
113
+
114
+ module ClassMethods
115
+ # Get or set a version requirement for the main application.
116
+ # Set the application version in config/initializers/wagon_app_version.rb.
117
+ # Gem::Requirement syntax is supported.
118
+ def app_requirement(requirement = nil)
119
+ if requirement
120
+ @app_requirement = Gem::Requirement.new(requirement)
121
+ else
122
+ @app_requirement ||= Gem::Requirement.new
123
+ end
124
+ end
125
+ end
110
126
  end
111
127
  end
112
128
 
@@ -1,6 +1,5 @@
1
1
  # These are the tasks included by the specific wagons
2
2
 
3
-
4
3
  begin
5
4
  require 'bundler/setup'
6
5
  rescue LoadError
@@ -99,6 +98,8 @@ namespace :db do
99
98
 
100
99
  desc "Display status of migrations"
101
100
  app_task "migrate:status"
101
+
102
+ app_task "test:prepare"
102
103
  end
103
104
 
104
105
 
@@ -106,12 +107,12 @@ Rake.application.invoke_task(:load_app)
106
107
 
107
108
 
108
109
  namespace :app do
109
- task :environment do
110
- # set migrations paths only to core to have db:test:prepare work as desired
111
- ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
112
- end
113
-
114
110
  namespace :db do
111
+ task :load_config do
112
+ # set migrations paths to core only to have db:test:prepare work as desired
113
+ ActiveRecord::Migrator.migrations_paths = Rails.application.paths['db/migrate'].to_a
114
+ end
115
+
115
116
  namespace :test do
116
117
  # for sqlite, make sure to delete the test.sqlite3 from the main application
117
118
  task :purge do
@@ -123,7 +124,8 @@ namespace :app do
123
124
  end
124
125
  end
125
126
 
126
- # run wagon migrations and load seed data
127
+ # run wagon migrations and load seed data.
128
+ # append this to the regular app:db:test:prepare task.
127
129
  task :prepare do
128
130
  Rails.env = 'test'
129
131
  dependencies = (wagon.all_dependencies + [wagon])