plugin_migrations 0.1.2
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/CHANGELOG +57 -0
- data/MIT-LICENSE +20 -0
- data/README +98 -0
- data/Rakefile +80 -0
- data/init.rb +1 -0
- data/lib/plugin_migrations.rb +27 -0
- data/lib/plugin_migrations/extensions/plugin.rb +61 -0
- data/lib/plugin_migrations/extensions/schema_statements.rb +53 -0
- data/lib/plugin_migrations/migrator.rb +38 -0
- data/tasks/plugin_migrations_tasks.rake +18 -0
- data/test/app_root/app/models/article.rb +4 -0
- data/test/app_root/app/models/author.rb +3 -0
- data/test/app_root/app/models/comment.rb +3 -0
- data/test/app_root/app/models/company.rb +3 -0
- data/test/app_root/app/models/employee.rb +3 -0
- data/test/app_root/app/models/plugin_schema_info.rb +3 -0
- data/test/app_root/app/models/schema_info.rb +3 -0
- data/test/app_root/config/environment.rb +25 -0
- data/test/app_root/db_bak/migrate/001_migrate_plugin_with_migrations_to_version_2.rb +9 -0
- data/test/app_root/db_bak/migrate/002_migrate_second_plugin_with_migrations_to_version_1.rb +9 -0
- data/test/app_root/vendor/plugins/plugin_with_migrations/db/migrate/001_create_companies.rb +11 -0
- data/test/app_root/vendor/plugins/plugin_with_migrations/db/migrate/002_create_employees.rb +13 -0
- data/test/app_root/vendor/plugins/plugin_with_migrations/init.rb +0 -0
- data/test/app_root/vendor/plugins/plugin_with_migrations/test/fixtures/companies.yml +3 -0
- data/test/app_root/vendor/plugins/plugin_with_migrations/test/fixtures/employees.yml +11 -0
- data/test/app_root/vendor/plugins/plugin_with_no_db/init.rb +0 -0
- data/test/app_root/vendor/plugins/plugin_with_no_migrations/db/empty +0 -0
- data/test/app_root/vendor/plugins/plugin_with_no_migrations/init.rb +0 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/001_create_authors.rb +11 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/002_create_articles.rb +13 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/003_create_comments.rb +12 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/init.rb +0 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/test/fixtures/articles.yml +5 -0
- data/test/app_root/vendor/plugins/second_plugin_with_migrations/test/fixtures/authors.yml +7 -0
- data/test/functional/plugin_migration_generator_test.rb +82 -0
- data/test/test_helper.rb +10 -0
- data/test/unit/migrator_test.rb +59 -0
- data/test/unit/plugin_migrations_test.rb +158 -0
- data/test/unit/plugin_test.rb +113 -0
- data/test/unit/schema_statements_test.rb +63 -0
- metadata +84 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
*SVN*
|
2
|
+
|
3
|
+
*0.1.2* (September 28th, 2007)
|
4
|
+
|
5
|
+
* Fix Plugin#current_version failing if the plugin_schema_info table doesn't exist
|
6
|
+
|
7
|
+
* Add functional tests for plugin_migration generator
|
8
|
+
|
9
|
+
* Don't loop over plugins for self.down in generated plugin_migration
|
10
|
+
|
11
|
+
*0.1.1* (September 26th, 2007)
|
12
|
+
|
13
|
+
* Fix copyright to include proper credits
|
14
|
+
|
15
|
+
* Add plugin_migration generator
|
16
|
+
|
17
|
+
* Move SchemaStatements/Plugin extensions into separate modules rather than modifying the modules/classes directly
|
18
|
+
|
19
|
+
* Adopt Engines-style plugin migrations
|
20
|
+
|
21
|
+
* Use plugin_test_helper for testing
|
22
|
+
|
23
|
+
* Remove gem dependency on activerecord
|
24
|
+
|
25
|
+
* Convert dos newlines to unix newlines
|
26
|
+
|
27
|
+
* Fix README typo: db/migrations -> db/migrate
|
28
|
+
|
29
|
+
* Add proper terminator character at the end of statements produced when dumping schema information. Fixes #16
|
30
|
+
|
31
|
+
*0.1.0* (March 31st, 2007)
|
32
|
+
|
33
|
+
* Refactor plugin_migrations.rb into files specific to each class being extended
|
34
|
+
|
35
|
+
* Support running tests with plugins loaded via edge pluginaweek. Fixes #10 [Brian Takita]
|
36
|
+
|
37
|
+
* Updated to use the new Plugin interface
|
38
|
+
|
39
|
+
* Added empty files so that test directories get added to the gem
|
40
|
+
|
41
|
+
*0.0.2* (February 3rd, 2007)
|
42
|
+
|
43
|
+
* Released as a gem
|
44
|
+
|
45
|
+
* Added tests
|
46
|
+
|
47
|
+
* Refactored tasks so that they could be tested
|
48
|
+
|
49
|
+
* You can now specify PLUGINS and VERSION at the same time in the migration task
|
50
|
+
|
51
|
+
* You can now specify PLUGINS and FIXTURES at the same time in the fixtures task
|
52
|
+
|
53
|
+
* The plugin_migrations plugin doesn't access the LOADED_PLUGINS variable correctly (Peter Marklund).
|
54
|
+
|
55
|
+
*0.0.1* (November 5th, 2006)
|
56
|
+
|
57
|
+
* Initial release
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2006 James Adam, 2006-2007 Aaron Pfeifer & Neil Abraham
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
= plugin_migrations
|
2
|
+
|
3
|
+
+plugin_migrations+ adds support for plugin-based migrations.
|
4
|
+
|
5
|
+
== Resources
|
6
|
+
|
7
|
+
Announcement
|
8
|
+
|
9
|
+
* http://www.pluginaweek.org/2006/11/05/3-plugin_migrations-where-have-all-the-migrations-gone
|
10
|
+
|
11
|
+
Wiki
|
12
|
+
|
13
|
+
* http://wiki.pluginaweek.org/Plugin_migrations
|
14
|
+
|
15
|
+
API
|
16
|
+
|
17
|
+
* http://api.pluginaweek.org/plugin_migrations
|
18
|
+
|
19
|
+
Development
|
20
|
+
|
21
|
+
* http://dev.pluginaweek.org/browser/trunk/plugins/active_record/migrations/plugin_migrations
|
22
|
+
|
23
|
+
Source
|
24
|
+
|
25
|
+
* http://svn.pluginaweek.org/trunk/plugins/active_record/migrations/plugin_migrations
|
26
|
+
|
27
|
+
== Description
|
28
|
+
|
29
|
+
In addition to the normal schema_info table that Rails created in your database
|
30
|
+
to keep track of the current migration version, this plugin adds a new table
|
31
|
+
called plugin_schema_info:
|
32
|
+
|
33
|
+
plugin_schema_info
|
34
|
+
------------------
|
35
|
+
plugin_name (string)
|
36
|
+
version (integer)
|
37
|
+
|
38
|
+
Plugin migrations expects the migrations to be located in a similar directory
|
39
|
+
structure as that of your Rails application. That is, it would look in
|
40
|
+
/db/migrate in your plugin's folder.
|
41
|
+
|
42
|
+
== Usage
|
43
|
+
|
44
|
+
The plugin can be used via the new rake tasks that have been added. The plugins
|
45
|
+
which are migrated are based on what is stored in +Rails.plugins+. For more
|
46
|
+
information on this attributes, see the loaded_plugins[http://wiki.pluginaweek.org/Loaded_plugins] plugin.
|
47
|
+
|
48
|
+
=== db:migrate:plugins
|
49
|
+
|
50
|
+
Running <tt>db:migrate:plugins</tt> will run the migrations for every plugin that is
|
51
|
+
loaded. You can also specify exactly which plugin you want to migrate.
|
52
|
+
|
53
|
+
Examples:
|
54
|
+
|
55
|
+
Assuming the following directory structure:
|
56
|
+
|
57
|
+
vendor/
|
58
|
+
vendor/plugins/
|
59
|
+
vendor/plugins/acts_as_bunny/
|
60
|
+
vendor/plugins/acts_as_as_chicken/
|
61
|
+
|
62
|
+
rake db:migrate:plugins # Migrates both acts_as_bunny and acts_as_chicken
|
63
|
+
rake db:migrate:plugins PLUGIN=acts_as_bunny
|
64
|
+
rake db:migrate:plugins PLUGIN=acts_as_bunny VERSION=2
|
65
|
+
|
66
|
+
=== db:fixtures:load:plugins
|
67
|
+
|
68
|
+
Running <tt>db:fixtures:load:plugins</tt> will load the fixtures for every plugin that is
|
69
|
+
loaded. You can also specify exactly which plugin you want to load fixtures for.
|
70
|
+
|
71
|
+
Examples:
|
72
|
+
|
73
|
+
Assuming the following directory structure:
|
74
|
+
|
75
|
+
vendor/
|
76
|
+
vendor/plugins/
|
77
|
+
vendor/plugins/acts_as_bunny/
|
78
|
+
vendor/plugins/acts_as_as_chicken/
|
79
|
+
|
80
|
+
rake db:fixtures:load:plugins # Loads fixtures for both acts_as_bunny and acts_as_chicken
|
81
|
+
rake db:fixtures:load:plugins PLUGIN=acts_as_bunny
|
82
|
+
rake db:fixtures:load:plugins PLUGIN=acts_as_bunny FIXTURES=bunnies
|
83
|
+
rake db:fixtures:load:plugins PLUGIN=acts_as_bunny FIXTURES=bunnies,rabbits
|
84
|
+
|
85
|
+
== Testing
|
86
|
+
|
87
|
+
Before you can run any tests, the following gems must be installed:
|
88
|
+
* plugin_test_helper[http://wiki.pluginaweek.org/Plugin_test_helper]
|
89
|
+
|
90
|
+
== Dependencies
|
91
|
+
|
92
|
+
This plugin dependencies on the presence of the following plugins:
|
93
|
+
* loaded_plugins[http://wiki.pluginaweek.org/Loaded_plugins]
|
94
|
+
* plugin_dependencies[http://wiki.pluginaweek.org/Plugin_dependencies]
|
95
|
+
|
96
|
+
== References
|
97
|
+
|
98
|
+
* James Adam - Engines[http://www.rails-engines.org]
|
data/Rakefile
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rake/rdoctask'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'rake/contrib/sshpublisher'
|
5
|
+
|
6
|
+
PKG_NAME = 'plugin_migrations'
|
7
|
+
PKG_VERSION = '0.1.2'
|
8
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
9
|
+
RUBY_FORGE_PROJECT = 'pluginaweek'
|
10
|
+
|
11
|
+
desc 'Default: run unit tests.'
|
12
|
+
task :default => :test
|
13
|
+
|
14
|
+
desc 'Test the plugin_migrations plugin.'
|
15
|
+
Rake::TestTask.new(:test) do |t|
|
16
|
+
t.libs << 'lib'
|
17
|
+
t.pattern = 'test/**/*_test.rb'
|
18
|
+
t.verbose = true
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Generate documentation for the plugin_migrations plugin.'
|
22
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
23
|
+
rdoc.rdoc_dir = 'rdoc'
|
24
|
+
rdoc.title = 'PluginMigrations'
|
25
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
26
|
+
rdoc.rdoc_files.include('README')
|
27
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
|
+
end
|
29
|
+
|
30
|
+
spec = Gem::Specification.new do |s|
|
31
|
+
s.name = PKG_NAME
|
32
|
+
s.version = PKG_VERSION
|
33
|
+
s.platform = Gem::Platform::RUBY
|
34
|
+
s.summary = 'Adds support for plugin-based migrations'
|
35
|
+
|
36
|
+
s.files = FileList['{lib,tasks,test}/**/*'].to_a + %w(CHANGELOG init.rb MIT-LICENSE Rakefile README)
|
37
|
+
s.require_path = 'lib'
|
38
|
+
s.autorequire = 'plugin_migrations'
|
39
|
+
s.has_rdoc = true
|
40
|
+
s.test_files = Dir['test/**/*_test.rb']
|
41
|
+
s.add_dependency 'loaded_plugins', '>= 0.1.0'
|
42
|
+
|
43
|
+
s.author = 'Aaron Pfeifer, Neil Abraham'
|
44
|
+
s.email = 'info@pluginaweek.org'
|
45
|
+
s.homepage = 'http://www.pluginaweek.org'
|
46
|
+
end
|
47
|
+
|
48
|
+
Rake::GemPackageTask.new(spec) do |p|
|
49
|
+
p.gem_spec = spec
|
50
|
+
p.need_tar = true
|
51
|
+
p.need_zip = true
|
52
|
+
end
|
53
|
+
|
54
|
+
desc 'Publish the beta gem'
|
55
|
+
task :pgem => [:package] do
|
56
|
+
Rake::SshFilePublisher.new('pluginaweek@pluginaweek.org', '/home/pluginaweek/gems.pluginaweek.org/gems', 'pkg', "#{PKG_FILE_NAME}.gem").upload
|
57
|
+
end
|
58
|
+
|
59
|
+
desc 'Publish the API documentation'
|
60
|
+
task :pdoc => [:rdoc] do
|
61
|
+
Rake::SshDirPublisher.new('pluginaweek@pluginaweek.org', "/home/pluginaweek/api.pluginaweek.org/#{PKG_NAME}", 'rdoc').upload
|
62
|
+
end
|
63
|
+
|
64
|
+
desc 'Publish the API docs and gem'
|
65
|
+
task :publish => [:pdoc, :release]
|
66
|
+
|
67
|
+
desc 'Publish the release files to RubyForge.'
|
68
|
+
task :release => [:gem, :package] do
|
69
|
+
require 'rubyforge'
|
70
|
+
|
71
|
+
ruby_forge = RubyForge.new
|
72
|
+
ruby_forge.login
|
73
|
+
|
74
|
+
%w( gem tgz zip ).each do |ext|
|
75
|
+
file = "pkg/#{PKG_FILE_NAME}.#{ext}"
|
76
|
+
puts "Releasing #{File.basename(file)}..."
|
77
|
+
|
78
|
+
ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
|
79
|
+
end
|
80
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'plugin_migrations'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'loaded_plugins'
|
2
|
+
require 'plugin_migrations/extensions/plugin'
|
3
|
+
require 'plugin_migrations/extensions/schema_statements'
|
4
|
+
require 'plugin_migrations/migrator'
|
5
|
+
|
6
|
+
module PluginAWeek #:nodoc:
|
7
|
+
# Adds support for running migrations and loading fixtures from plugins
|
8
|
+
module PluginMigrations
|
9
|
+
class << self
|
10
|
+
# Migrate the database through scripts in plugin_xyz/db/migrate. Specify
|
11
|
+
# target plugins through plugin_names. The version can only be used when
|
12
|
+
# targeting specific plugins.
|
13
|
+
def migrate(plugin_names = nil, version = nil)
|
14
|
+
version = version.to_i if version
|
15
|
+
Rails.plugins.find_by_names(plugin_names).each {|plugin| plugin.migrate(version)}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Load plugin fixtures into the current environment's database. Load
|
19
|
+
# fixtures for a specific plugin using +plugin_names+, specific fixtures
|
20
|
+
# using +fixtures+
|
21
|
+
def load_fixtures(plugin_names = nil, fixtures = nil)
|
22
|
+
require 'active_record/fixtures'
|
23
|
+
Rails.plugins.find_by_names(plugin_names).each {|plugin| plugin.load_fixtures(fixtures)}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module PluginMigrations
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
# Adds migration/fixture support
|
5
|
+
module Plugin
|
6
|
+
# The location of the plugin's migrations
|
7
|
+
def migration_path
|
8
|
+
"#{root}/db/migrate"
|
9
|
+
end
|
10
|
+
|
11
|
+
# The current version of the plugin migrated in the database
|
12
|
+
def current_version
|
13
|
+
begin
|
14
|
+
if result = ActiveRecord::Base.connection.select_one("SELECT version FROM #{PluginAWeek::PluginMigrations::Migrator.schema_info_table_name} WHERE plugin_name = '#{name}'")
|
15
|
+
result['version'].to_i
|
16
|
+
else
|
17
|
+
# There probably isn't an entry for this plugin in the migration info table.
|
18
|
+
0
|
19
|
+
end
|
20
|
+
rescue ActiveRecord::StatementInvalid
|
21
|
+
# No migraiton info table, so never migrated
|
22
|
+
0
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# The latest version of the plugin according to the current migrations
|
27
|
+
def latest_version
|
28
|
+
migrations = Dir["#{migration_path}/[0-9]*_[_a-z0-9]*.rb"]
|
29
|
+
migrations.map {|migration| File.basename(migration).match(/^([0-9]+)/)[1].to_i}.max || 0
|
30
|
+
end
|
31
|
+
|
32
|
+
# Migrate this plugin to the given version
|
33
|
+
def migrate(version = nil)
|
34
|
+
PluginAWeek::PluginMigrations::Migrator.migrate_plugin(self, version)
|
35
|
+
end
|
36
|
+
|
37
|
+
# The location of the plugin's fixtures
|
38
|
+
def fixtures_path
|
39
|
+
"#{root}/test/fixtures"
|
40
|
+
end
|
41
|
+
|
42
|
+
# The paths of all of the plugin's fixtures
|
43
|
+
def fixtures(names = nil)
|
44
|
+
names ||= '*'
|
45
|
+
Dir["#{fixtures_path}/{#{names}}.{yml,csv}"].sort
|
46
|
+
end
|
47
|
+
|
48
|
+
# Loads the fixtures for the plugin
|
49
|
+
def load_fixtures(*args)
|
50
|
+
fixtures(*args).each do |fixture|
|
51
|
+
Fixtures.create_fixtures(File.dirname(fixture), File.basename(fixture, '.*'))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
Plugin.class_eval do
|
60
|
+
include PluginAWeek::PluginMigrations::Extensions::Plugin
|
61
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module PluginMigrations
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
# Adds support for the plugin schema info table
|
5
|
+
module SchemaStatements
|
6
|
+
def self.included(base) #:nodoc:
|
7
|
+
base.class_eval do
|
8
|
+
alias_method_chain :initialize_schema_information, :plugins
|
9
|
+
alias_method_chain :dump_schema_information, :plugins
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Creates the plugin schema info table
|
14
|
+
def initialize_schema_information_with_plugins
|
15
|
+
initialize_schema_information_without_plugins
|
16
|
+
|
17
|
+
begin
|
18
|
+
execute "CREATE TABLE #{PluginAWeek::PluginMigrations::Migrator.schema_info_table_name} (plugin_name #{type_to_sql(:string)}, version #{type_to_sql(:integer)})"
|
19
|
+
rescue ActiveRecord::StatementInvalid
|
20
|
+
# Schema has been initialized
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Dumps the plugin schema info table as well as information about the
|
25
|
+
# current plugin migrations
|
26
|
+
def dump_schema_information_with_plugins
|
27
|
+
schema_information = []
|
28
|
+
|
29
|
+
dump = dump_schema_information_without_plugins
|
30
|
+
schema_information << dump if dump
|
31
|
+
|
32
|
+
begin
|
33
|
+
plugins = ActiveRecord::Base.connection.select_all("SELECT * FROM #{PluginAWeek::PluginMigrations::Migrator.schema_info_table_name}")
|
34
|
+
plugins.each do |plugin|
|
35
|
+
if (version = plugin['version'].to_i) > 0
|
36
|
+
plugin_name = ActiveRecord::Base.quote_value(plugin['plugin_name'])
|
37
|
+
schema_information << "INSERT INTO #{PluginAWeek::PluginMigrations::Migrator.schema_info_table_name} (plugin_name, version) VALUES (#{plugin_name}, #{version})"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
rescue ActiveRecord::StatementInvalid
|
41
|
+
# No Schema Info
|
42
|
+
end
|
43
|
+
|
44
|
+
schema_information.join(";\n")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
ActiveRecord::ConnectionAdapters::SchemaStatements.class_eval do
|
52
|
+
include PluginAWeek::PluginMigrations::Extensions::SchemaStatements
|
53
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module PluginMigrations
|
3
|
+
# Responsible for migrating plugins. +current_plugin+ indicates which plugin
|
4
|
+
# is currently being migrated.
|
5
|
+
class Migrator < ActiveRecord::Migrator
|
6
|
+
# We need to be able to set the current plugin being migrated
|
7
|
+
cattr_accessor :current_plugin
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# Runs the migrations from a plugin, up (or down) to the version given
|
11
|
+
def migrate_plugin(plugin, version = nil)
|
12
|
+
self.current_plugin = plugin
|
13
|
+
migrate(plugin.migration_path, version)
|
14
|
+
end
|
15
|
+
|
16
|
+
def schema_info_table_name #:nodoc:
|
17
|
+
ActiveRecord::Base.table_name_prefix + 'plugin_schema_info' + ActiveRecord::Base.table_name_suffix
|
18
|
+
end
|
19
|
+
|
20
|
+
def current_version #:nodoc:
|
21
|
+
current_plugin.current_version
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Sets the version of the current plugin
|
26
|
+
def set_schema_version(version)
|
27
|
+
version = down? ? version.to_i - 1 : version.to_i
|
28
|
+
|
29
|
+
if ActiveRecord::Base.connection.select_one("SELECT version FROM #{self.class.schema_info_table_name} WHERE plugin_name = '#{current_plugin.name}'")
|
30
|
+
ActiveRecord::Base.connection.update("UPDATE #{self.class.schema_info_table_name} SET version = #{version} WHERE plugin_name = '#{current_plugin.name}'")
|
31
|
+
else
|
32
|
+
# We need to create the entry since it doesn't exist
|
33
|
+
ActiveRecord::Base.connection.execute("INSERT INTO #{self.class.schema_info_table_name} (version, plugin_name) VALUES (#{version},'#{current_plugin.name}')")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
namespace :db do
|
2
|
+
namespace :migrate do
|
3
|
+
desc 'Migrate the database through scripts in plugin_xyz/db/migrate. Target specific plugin with PLUGIN=x, specific version with VERSION=y'
|
4
|
+
task :plugins => :environment do
|
5
|
+
PluginAWeek::PluginMigrations.migrate(ENV['PLUGIN'], ENV['VERSION'])
|
6
|
+
Rake::Task['db:schema:dump'].invoke if ActiveRecord::Base.schema_format == :ruby
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
namespace :fixtures do
|
11
|
+
namespace :load do
|
12
|
+
desc "Load plugin fixtures into the current environment's database. Load fixtures for a specific plugin using PLUGIN=x, specific fixtures using FIXTURES=y,z"
|
13
|
+
task :plugins => :environment do
|
14
|
+
PluginAWeek::PluginMigrations.load_fixtures(ENV['PLUGIN'], ENV['FIXTURES'])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'config/boot'
|
2
|
+
|
3
|
+
$:.unshift("#{RAILS_ROOT}/../../../../../rails/plugin_dependencies/lib")
|
4
|
+
begin
|
5
|
+
require 'plugin_dependencies'
|
6
|
+
rescue Exception => e
|
7
|
+
end
|
8
|
+
|
9
|
+
Rails::Initializer.run do |config|
|
10
|
+
config.plugin_paths.concat([
|
11
|
+
"#{RAILS_ROOT}/../../..",
|
12
|
+
"#{RAILS_ROOT}/../../../../../rails"
|
13
|
+
])
|
14
|
+
config.plugins = [
|
15
|
+
'loaded_plugins',
|
16
|
+
File.basename(File.expand_path("#{RAILS_ROOT}/../..")),
|
17
|
+
'plugin_with_migrations',
|
18
|
+
'plugin_with_no_db',
|
19
|
+
'plugin_with_no_migrations',
|
20
|
+
'second_plugin_with_migrations'
|
21
|
+
]
|
22
|
+
config.cache_classes = false
|
23
|
+
config.frameworks -= [:action_web_service]
|
24
|
+
config.whiny_nils = true
|
25
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateEmployees < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :employees do |t|
|
4
|
+
t.column :company_id, :integer, :null => false
|
5
|
+
t.column :first_name, :string, :null => false
|
6
|
+
t.column :last_name, :string, :null => false
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down
|
11
|
+
drop_table :employees
|
12
|
+
end
|
13
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/002_create_articles.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateArticles < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :articles do |t|
|
4
|
+
t.column :title, :string, :null => false
|
5
|
+
t.column :content, :text, :null => false
|
6
|
+
t.column :author_id, :integer, :null => false
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down
|
11
|
+
drop_table :articles
|
12
|
+
end
|
13
|
+
end
|
File without changes
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
2
|
+
|
3
|
+
require 'rails_generator'
|
4
|
+
require 'rails_generator/scripts/generate'
|
5
|
+
|
6
|
+
# Add the plugin_migrations generators since it's not in the normal vendor/plugins path
|
7
|
+
Rails::Generator::Base.sources << Rails::Generator::PathSource.new(:plugin_migrations, "#{::RAILS_ROOT}/../../generators")
|
8
|
+
|
9
|
+
Rails::Generator::Commands::Base.class_eval do
|
10
|
+
def migration_directory(relative_path)
|
11
|
+
directory(relative_path)
|
12
|
+
@migration_directory = "#{RAILS_ROOT}/#{relative_path}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class PluginMigrationGeneratorTest < Test::Unit::TestCase
|
17
|
+
def setup
|
18
|
+
@db_root = "#{RAILS_ROOT}/db"
|
19
|
+
FileUtils.cp_r("#{RAILS_ROOT}/db_bak", @db_root)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_should_throw_exception_if_plugin_doesnt_exist
|
23
|
+
assert_raise(SystemExit) {generate('invalid')}
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_throw_exception_if_plugin_migration_already_created_for_latest_version
|
27
|
+
assert_raise(SystemExit) {generate('plugin_with_migrations')}
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_create_migration_for_plugin_never_migrated_before
|
31
|
+
FileUtils.rm("#{@db_root}/migrate/002_migrate_second_plugin_with_migrations_to_version_1.rb")
|
32
|
+
|
33
|
+
generate('second_plugin_with_migrations')
|
34
|
+
migration_path = "#{@db_root}/migrate/002_migrate_second_plugin_with_migrations_to_version_3.rb"
|
35
|
+
assert File.exists?(migration_path)
|
36
|
+
|
37
|
+
expected = <<-EOS
|
38
|
+
class MigrateSecondPluginWithMigrationsToVersion3 < ActiveRecord::Migration
|
39
|
+
def self.up
|
40
|
+
Rails.plugins[:second_plugin_with_migrations].migrate(3)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.down
|
44
|
+
Rails.plugins[:second_plugin_with_migrations].migrate(0)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
EOS
|
49
|
+
assert_equal expected, File.open(migration_path).readlines.join
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_should_create_migration_for_plugin_previously_migrated
|
53
|
+
PluginAWeek::PluginMigrations.migrate('second_plugin_with_migrations', 1)
|
54
|
+
|
55
|
+
generate('second_plugin_with_migrations')
|
56
|
+
migration_path = "#{@db_root}/migrate/003_migrate_second_plugin_with_migrations_to_version_3.rb"
|
57
|
+
assert File.exists?(migration_path)
|
58
|
+
|
59
|
+
expected = <<-EOS
|
60
|
+
class MigrateSecondPluginWithMigrationsToVersion3 < ActiveRecord::Migration
|
61
|
+
def self.up
|
62
|
+
Rails.plugins[:second_plugin_with_migrations].migrate(3)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.down
|
66
|
+
Rails.plugins[:second_plugin_with_migrations].migrate(1)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
EOS
|
71
|
+
assert_equal expected, File.open(migration_path).readlines.join
|
72
|
+
end
|
73
|
+
|
74
|
+
def teardown
|
75
|
+
FileUtils.rmtree(@db_root)
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
def generate(plugin)
|
80
|
+
Rails::Generator::Scripts::Generate.new.run(['plugin_migration', plugin])
|
81
|
+
end
|
82
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Load the plugin testing framework
|
2
|
+
$:.unshift("#{File.dirname(__FILE__)}/../../../../test/plugin_test_helper/lib")
|
3
|
+
require 'rubygems'
|
4
|
+
require 'plugin_test_helper'
|
5
|
+
|
6
|
+
class Test::Unit::TestCase
|
7
|
+
def initialize_schema_information
|
8
|
+
ActiveRecord::Base.connection.initialize_schema_information
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
2
|
+
|
3
|
+
class MigratorTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
ActiveRecord::Migration.verbose = true
|
6
|
+
initialize_schema_information
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_schema_info_table_name_should_not_have_prefix_or_suffix
|
10
|
+
assert_equal 'plugin_schema_info', PluginAWeek::PluginMigrations::Migrator.schema_info_table_name
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_schema_info_table_name_should_have_prefix_if_prefix_exists
|
14
|
+
ActiveRecord::Base.table_name_prefix = 'prefix_'
|
15
|
+
assert_equal 'prefix_plugin_schema_info', PluginAWeek::PluginMigrations::Migrator.schema_info_table_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_schema_info_table_name_should_have_suffix_if_suffix_exists
|
19
|
+
ActiveRecord::Base.table_name_suffix = '_suffix'
|
20
|
+
assert_equal 'plugin_schema_info_suffix', PluginAWeek::PluginMigrations::Migrator.schema_info_table_name
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_schema_info_table_name_should_have_prefix_and_suffix_if_both_exist
|
24
|
+
ActiveRecord::Base.table_name_prefix = 'prefix_'
|
25
|
+
ActiveRecord::Base.table_name_suffix = '_suffix'
|
26
|
+
assert_equal 'prefix_plugin_schema_info_suffix', PluginAWeek::PluginMigrations::Migrator.schema_info_table_name
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_current_plugin_version_should_be_zero_if_never_migrated
|
30
|
+
PluginAWeek::PluginMigrations::Migrator.current_plugin = Plugin.new('/path/to/test_plugin')
|
31
|
+
assert_equal 0, PluginAWeek::PluginMigrations::Migrator.current_version
|
32
|
+
assert_equal 0, PluginSchemaInfo.count
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_add_plugin_schema_info_after_setting_schema_version
|
36
|
+
PluginAWeek::PluginMigrations::Migrator.allocate.set_schema_version(0)
|
37
|
+
assert_equal 0, PluginAWeek::PluginMigrations::Migrator.current_version
|
38
|
+
assert_equal 1, PluginSchemaInfo.count
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_update_plugin_schema_info_if_plugin_version_previously_set
|
42
|
+
PluginAWeek::PluginMigrations::Migrator.allocate.set_schema_version(0)
|
43
|
+
assert_equal 0, PluginAWeek::PluginMigrations::Migrator.current_version
|
44
|
+
assert_equal 1, PluginSchemaInfo.count
|
45
|
+
|
46
|
+
PluginAWeek::PluginMigrations::Migrator.allocate.set_schema_version(1)
|
47
|
+
assert_equal 1, PluginAWeek::PluginMigrations::Migrator.current_version
|
48
|
+
assert_equal 1, PluginSchemaInfo.count
|
49
|
+
end
|
50
|
+
|
51
|
+
def teardown
|
52
|
+
ActiveRecord::Base.table_name_prefix = ''
|
53
|
+
ActiveRecord::Base.table_name_suffix = ''
|
54
|
+
ActiveRecord::Base.connection.drop_table(ActiveRecord::Migrator.schema_info_table_name)
|
55
|
+
[PluginSchemaInfo].each do |model|
|
56
|
+
ActiveRecord::Base.connection.drop_table(model.table_name) if model.table_exists?
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
2
|
+
|
3
|
+
class PluginMigrationsTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
ActiveRecord::Migration.verbose = true
|
6
|
+
initialize_schema_information
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_should_migrate_all_plugins_up_to_latest_version_by_default
|
10
|
+
PluginAWeek::PluginMigrations.migrate
|
11
|
+
|
12
|
+
assert Company.table_exists?
|
13
|
+
assert Employee.table_exists?
|
14
|
+
assert Author.table_exists?
|
15
|
+
assert Article.table_exists?
|
16
|
+
assert Comment.table_exists?
|
17
|
+
|
18
|
+
assert_equal 2, PluginSchemaInfo.count
|
19
|
+
expected = [
|
20
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 2),
|
21
|
+
PluginSchemaInfo.new(:plugin_name => 'second_plugin_with_migrations', :version => 3)
|
22
|
+
]
|
23
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_migrate_all_plugins_up_to_specific_version_if_specified
|
27
|
+
PluginAWeek::PluginMigrations.migrate(nil, 3)
|
28
|
+
|
29
|
+
assert Company.table_exists?
|
30
|
+
assert Employee.table_exists?
|
31
|
+
assert Author.table_exists?
|
32
|
+
assert Article.table_exists?
|
33
|
+
assert Comment.table_exists?
|
34
|
+
|
35
|
+
assert_equal 2, PluginSchemaInfo.count
|
36
|
+
expected = [
|
37
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 2),
|
38
|
+
PluginSchemaInfo.new(:plugin_name => 'second_plugin_with_migrations', :version => 3)
|
39
|
+
]
|
40
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_migrate_all_plugins_down_to_specific_version_if_specified
|
44
|
+
PluginAWeek::PluginMigrations.migrate(nil, 3)
|
45
|
+
PluginAWeek::PluginMigrations.migrate(nil, 1)
|
46
|
+
|
47
|
+
assert Company.table_exists?
|
48
|
+
assert !Employee.table_exists?
|
49
|
+
assert Author.table_exists?
|
50
|
+
assert !Article.table_exists?
|
51
|
+
assert !Comment.table_exists?
|
52
|
+
|
53
|
+
assert_equal 2, PluginSchemaInfo.count
|
54
|
+
expected = [
|
55
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 1),
|
56
|
+
PluginSchemaInfo.new(:plugin_name => 'second_plugin_with_migrations', :version => 1)
|
57
|
+
]
|
58
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_should_migrate_specific_plugins_to_latest_version_if_specified
|
62
|
+
PluginAWeek::PluginMigrations.migrate('plugin_with_migrations')
|
63
|
+
|
64
|
+
assert Company.table_exists?
|
65
|
+
assert Employee.table_exists?
|
66
|
+
assert !Author.table_exists?
|
67
|
+
assert !Article.table_exists?
|
68
|
+
assert !Comment.table_exists?
|
69
|
+
|
70
|
+
assert_equal 1, PluginSchemaInfo.count
|
71
|
+
expected = [
|
72
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 2)
|
73
|
+
]
|
74
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_should_migrate_specific_plugins_up_to_specific_version_if_both_specified
|
78
|
+
PluginAWeek::PluginMigrations.migrate('plugin_with_migrations', 1)
|
79
|
+
|
80
|
+
assert Company.table_exists?
|
81
|
+
assert !Employee.table_exists?
|
82
|
+
assert !Author.table_exists?
|
83
|
+
assert !Article.table_exists?
|
84
|
+
assert !Comment.table_exists?
|
85
|
+
|
86
|
+
assert_equal 1, PluginSchemaInfo.count
|
87
|
+
expected = [
|
88
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 2)
|
89
|
+
]
|
90
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_migrate_specific_plugins_down_to_specific_version_if_both_specified
|
94
|
+
PluginAWeek::PluginMigrations.migrate('plugin_with_migrations', 1)
|
95
|
+
PluginAWeek::PluginMigrations.migrate('plugin_with_migrations', 0)
|
96
|
+
|
97
|
+
assert !Company.table_exists?
|
98
|
+
assert !Employee.table_exists?
|
99
|
+
assert !Author.table_exists?
|
100
|
+
assert !Article.table_exists?
|
101
|
+
assert !Comment.table_exists?
|
102
|
+
|
103
|
+
assert_equal 1, PluginSchemaInfo.count
|
104
|
+
expected = [
|
105
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 0)
|
106
|
+
]
|
107
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_should_load_fixtures_for_all_plugins_by_default
|
111
|
+
PluginAWeek::PluginMigrations.migrate
|
112
|
+
PluginAWeek::PluginMigrations.load_fixtures
|
113
|
+
|
114
|
+
assert_equal 1, Company.count
|
115
|
+
assert_equal 2, Employee.count
|
116
|
+
assert_equal 2, Author.count
|
117
|
+
assert_equal 1, Article.count
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_should_load_specific_fixtures_for_all_plugins_if_specified
|
121
|
+
PluginAWeek::PluginMigrations.migrate
|
122
|
+
PluginAWeek::PluginMigrations.load_fixtures(nil, 'companies,authors')
|
123
|
+
|
124
|
+
assert_equal 1, Company.count
|
125
|
+
assert_equal 0, Employee.count
|
126
|
+
assert_equal 2, Author.count
|
127
|
+
assert_equal 0, Article.count
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_should_load_all_fixtures_for_specific_plugins_if_specified
|
131
|
+
PluginAWeek::PluginMigrations.migrate
|
132
|
+
PluginAWeek::PluginMigrations.load_fixtures('plugin_with_migrations')
|
133
|
+
|
134
|
+
assert_equal 1, Company.count
|
135
|
+
assert_equal 2, Employee.count
|
136
|
+
assert_equal 0, Author.count
|
137
|
+
assert_equal 0, Article.count
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_should_load_specific_fixtures_specific_plugins_if_both_specified
|
141
|
+
PluginAWeek::PluginMigrations.migrate
|
142
|
+
PluginAWeek::PluginMigrations.load_fixtures('plugin_with_migrations', 'companies')
|
143
|
+
|
144
|
+
assert_equal 1, Company.count
|
145
|
+
assert_equal 0, Employee.count
|
146
|
+
assert_equal 0, Author.count
|
147
|
+
assert_equal 0, Article.count
|
148
|
+
end
|
149
|
+
|
150
|
+
def teardown
|
151
|
+
ActiveRecord::Base.table_name_prefix = ''
|
152
|
+
ActiveRecord::Base.table_name_suffix = ''
|
153
|
+
ActiveRecord::Base.connection.drop_table(ActiveRecord::Migrator.schema_info_table_name)
|
154
|
+
[Article, Author, Comment, Company, Employee, PluginSchemaInfo].each do |model|
|
155
|
+
ActiveRecord::Base.connection.drop_table(model.table_name) if model.table_exists?
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
2
|
+
|
3
|
+
class PluginTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@plugin = Plugin.new("#{RAILS_ROOT}/vendor/plugins/plugin_with_migrations")
|
6
|
+
ActiveRecord::Migration.verbose = true
|
7
|
+
initialize_schema_information
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_have_migration_path
|
11
|
+
assert_equal "#{RAILS_ROOT}/vendor/plugins/plugin_with_migrations/db/migrate", @plugin.migration_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_current_version_should_be_zero_if_no_version_found
|
15
|
+
assert_equal 0, @plugin.current_version
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_current_version_should_be_latest_migrated_in_the_database
|
19
|
+
PluginSchemaInfo.create(:plugin_name => 'plugin_with_migrations', :version => 2)
|
20
|
+
assert_equal 2, @plugin.current_version
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_latest_version_should_be_zero_if_no_migrations_found
|
24
|
+
plugin = Plugin.new("#{RAILS_ROOT}/vendor/plugins/plugin_with_no_migrations")
|
25
|
+
assert_equal 0, plugin.latest_version
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_latest_version_should_be_latest_migration_available_if_migrations_exist
|
29
|
+
assert_equal 2, @plugin.latest_version
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_migrate_to_latest_version_by_default
|
33
|
+
@plugin.migrate
|
34
|
+
|
35
|
+
assert Company.table_exists?
|
36
|
+
assert Employee.table_exists?
|
37
|
+
|
38
|
+
assert_equal 1, PluginSchemaInfo.count
|
39
|
+
expected = [
|
40
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 2)
|
41
|
+
]
|
42
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_migrate_to_specific_version_if_version_specified
|
46
|
+
@plugin.migrate(1)
|
47
|
+
|
48
|
+
assert Company.table_exists?
|
49
|
+
assert !Employee.table_exists?
|
50
|
+
|
51
|
+
assert_equal 1, PluginSchemaInfo.count
|
52
|
+
expected = [
|
53
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 1)
|
54
|
+
]
|
55
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
56
|
+
|
57
|
+
@plugin.migrate(0)
|
58
|
+
|
59
|
+
assert !Company.table_exists?
|
60
|
+
assert !Employee.table_exists?
|
61
|
+
|
62
|
+
assert_equal 1, PluginSchemaInfo.count
|
63
|
+
expected = [
|
64
|
+
PluginSchemaInfo.new(:plugin_name => 'plugin_with_migrations', :version => 0)
|
65
|
+
]
|
66
|
+
assert_equal expected, PluginSchemaInfo.find(:all)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_should_have_fixtures_path
|
70
|
+
assert_equal "#{RAILS_ROOT}/vendor/plugins/plugin_with_migrations/test/fixtures", @plugin.fixtures_path
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_fixtures_should_include_all_by_default
|
74
|
+
expected = [
|
75
|
+
"#{@plugin.fixtures_path}/companies.yml",
|
76
|
+
"#{@plugin.fixtures_path}/employees.yml"
|
77
|
+
]
|
78
|
+
assert_equal expected, @plugin.fixtures
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_fixtures_should_only_include_specific_fixtures_if_specified
|
82
|
+
assert_equal ["#{@plugin.fixtures_path}/companies.yml"], @plugin.fixtures('companies')
|
83
|
+
|
84
|
+
expected = [
|
85
|
+
"#{@plugin.fixtures_path}/companies.yml",
|
86
|
+
"#{@plugin.fixtures_path}/employees.yml"
|
87
|
+
]
|
88
|
+
assert_equal expected, @plugin.fixtures('companies,employees')
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_load_should_create_all_fixtures_by_default
|
92
|
+
@plugin.migrate
|
93
|
+
@plugin.load_fixtures
|
94
|
+
|
95
|
+
assert_equal 1, Company.count
|
96
|
+
assert_equal 2, Employee.count
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_load_should_only_create_specific_fixtures_if_specified
|
100
|
+
@plugin.migrate
|
101
|
+
@plugin.load_fixtures('companies')
|
102
|
+
|
103
|
+
assert_equal 1, Company.count
|
104
|
+
assert_equal 0, Employee.count
|
105
|
+
end
|
106
|
+
|
107
|
+
def teardown
|
108
|
+
ActiveRecord::Base.connection.drop_table(ActiveRecord::Migrator.schema_info_table_name)
|
109
|
+
[Company, Employee, PluginSchemaInfo].each do |model|
|
110
|
+
ActiveRecord::Base.connection.drop_table(model.table_name) if model.table_exists?
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
2
|
+
|
3
|
+
class SchemaStatementsTest < Test::Unit::TestCase
|
4
|
+
def test_plugin_schema_info_table_should_not_exist_by_default
|
5
|
+
assert !PluginSchemaInfo.table_exists?
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_create_plugin_schema_info_table_when_initialized
|
9
|
+
initialize_schema_information
|
10
|
+
assert PluginSchemaInfo.table_exists?
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_not_dump_anything_if_no_main_or_plugin_schema_info
|
14
|
+
assert_equal '', ActiveRecord::Base.connection.dump_schema_information
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_not_dump_anything_if_schema_or_plugin_is_at_version_zero
|
18
|
+
initialize_schema_information
|
19
|
+
PluginSchemaInfo.create(:plugin_name => 'test_plugin', :version => 0)
|
20
|
+
assert_equal '', ActiveRecord::Base.connection.dump_schema_information
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_dump_schema_info_for_one_plugin
|
24
|
+
initialize_schema_information
|
25
|
+
PluginSchemaInfo.create(:plugin_name => 'test_plugin', :version => 1)
|
26
|
+
assert_equal "INSERT INTO plugin_schema_info (plugin_name, version) VALUES ('test_plugin', 1)", ActiveRecord::Base.connection.dump_schema_information
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_dump_schema_info_for_multiple_plugins
|
30
|
+
initialize_schema_information
|
31
|
+
PluginSchemaInfo.create(:plugin_name => 'test_plugin', :version => 1)
|
32
|
+
PluginSchemaInfo.create(:plugin_name => 'another_plugin', :version => 2)
|
33
|
+
|
34
|
+
expected = [
|
35
|
+
"INSERT INTO plugin_schema_info (plugin_name, version) VALUES ('test_plugin', 1);",
|
36
|
+
"INSERT INTO plugin_schema_info (plugin_name, version) VALUES ('another_plugin', 2)"
|
37
|
+
].join("\n")
|
38
|
+
assert_equal expected, ActiveRecord::Base.connection.dump_schema_information
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_dump_both_main_schema_info_and_plugin_schema_info
|
42
|
+
initialize_schema_information
|
43
|
+
ActiveRecord::Base.connection.update("UPDATE #{ActiveRecord::Migrator.schema_info_table_name} SET version = 1")
|
44
|
+
PluginSchemaInfo.create(:plugin_name => 'test_plugin', :version => 1)
|
45
|
+
|
46
|
+
expected = [
|
47
|
+
'INSERT INTO schema_info (version) VALUES (1);',
|
48
|
+
"INSERT INTO plugin_schema_info (plugin_name, version) VALUES ('test_plugin', 1)"
|
49
|
+
].join("\n")
|
50
|
+
assert_equal expected, ActiveRecord::Base.connection.dump_schema_information
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_dump_only_main_schema_info_if_no_plugins_migrated
|
54
|
+
initialize_schema_information
|
55
|
+
ActiveRecord::Base.connection.update("UPDATE #{ActiveRecord::Migrator.schema_info_table_name} SET version = 1")
|
56
|
+
assert_equal 'INSERT INTO schema_info (version) VALUES (1)', ActiveRecord::Base.connection.dump_schema_information
|
57
|
+
end
|
58
|
+
|
59
|
+
def teardown
|
60
|
+
ActiveRecord::Base.connection.drop_table(SchemaInfo.table_name) if SchemaInfo.table_exists?
|
61
|
+
ActiveRecord::Base.connection.drop_table(PluginSchemaInfo.table_name) if PluginSchemaInfo.table_exists?
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: plugin_migrations
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Aaron Pfeifer, Neil Abraham
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-09 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description:
|
15
|
+
email: info@pluginaweek.org
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/plugin_migrations.rb
|
21
|
+
- lib/plugin_migrations/migrator.rb
|
22
|
+
- lib/plugin_migrations/extensions/plugin.rb
|
23
|
+
- lib/plugin_migrations/extensions/schema_statements.rb
|
24
|
+
- tasks/plugin_migrations_tasks.rake
|
25
|
+
- test/test_helper.rb
|
26
|
+
- test/app_root/vendor/plugins/plugin_with_no_migrations/init.rb
|
27
|
+
- test/app_root/vendor/plugins/plugin_with_no_migrations/db/empty
|
28
|
+
- test/app_root/vendor/plugins/plugin_with_migrations/init.rb
|
29
|
+
- test/app_root/vendor/plugins/plugin_with_migrations/test/fixtures/employees.yml
|
30
|
+
- test/app_root/vendor/plugins/plugin_with_migrations/test/fixtures/companies.yml
|
31
|
+
- test/app_root/vendor/plugins/plugin_with_migrations/db/migrate/002_create_employees.rb
|
32
|
+
- test/app_root/vendor/plugins/plugin_with_migrations/db/migrate/001_create_companies.rb
|
33
|
+
- test/app_root/vendor/plugins/plugin_with_no_db/init.rb
|
34
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/init.rb
|
35
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/test/fixtures/authors.yml
|
36
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/test/fixtures/articles.yml
|
37
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/002_create_articles.rb
|
38
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/001_create_authors.rb
|
39
|
+
- test/app_root/vendor/plugins/second_plugin_with_migrations/db/migrate/003_create_comments.rb
|
40
|
+
- test/app_root/config/environment.rb
|
41
|
+
- test/app_root/app/models/employee.rb
|
42
|
+
- test/app_root/app/models/plugin_schema_info.rb
|
43
|
+
- test/app_root/app/models/author.rb
|
44
|
+
- test/app_root/app/models/company.rb
|
45
|
+
- test/app_root/app/models/article.rb
|
46
|
+
- test/app_root/app/models/comment.rb
|
47
|
+
- test/app_root/app/models/schema_info.rb
|
48
|
+
- test/app_root/db_bak/migrate/001_migrate_plugin_with_migrations_to_version_2.rb
|
49
|
+
- test/app_root/db_bak/migrate/002_migrate_second_plugin_with_migrations_to_version_1.rb
|
50
|
+
- test/unit/plugin_test.rb
|
51
|
+
- test/unit/migrator_test.rb
|
52
|
+
- test/unit/plugin_migrations_test.rb
|
53
|
+
- test/unit/schema_statements_test.rb
|
54
|
+
- test/functional/plugin_migration_generator_test.rb
|
55
|
+
- CHANGELOG
|
56
|
+
- init.rb
|
57
|
+
- MIT-LICENSE
|
58
|
+
- Rakefile
|
59
|
+
- README
|
60
|
+
homepage:
|
61
|
+
licenses: []
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.7.2
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Adds support for plugin-based migrations
|
84
|
+
test_files: []
|