wagons 0.0.1 → 0.0.9

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 (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])