also_migrate 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- metadata +28 -22
- data/LICENSE +0 -18
- data/README.md +0 -43
- data/lib/also_migrate.rb +0 -21
- data/lib/also_migrate/base.rb +0 -35
- data/lib/also_migrate/gems.rb +0 -44
- data/lib/also_migrate/migration.rb +0 -72
- data/lib/also_migrate/migrator.rb +0 -100
- data/lib/also_migrate/version.rb +0 -3
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 2
|
8
7
|
- 3
|
9
|
-
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Winton Welsh
|
@@ -14,42 +14,48 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-01-
|
17
|
+
date: 2011-01-09 00:00:00 -08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: rake
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- - "
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
|
-
-
|
30
|
-
-
|
31
|
-
-
|
32
|
-
version:
|
29
|
+
- 0
|
30
|
+
- 8
|
31
|
+
- 7
|
32
|
+
version: 0.8.7
|
33
33
|
type: :development
|
34
34
|
version_requirements: *id001
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 1
|
45
|
+
- 0
|
46
|
+
version: "1.0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
description: Migrate multiple tables with similar schema at once.
|
50
|
+
email: mail@wintoni.us
|
38
51
|
executables: []
|
39
52
|
|
40
53
|
extensions: []
|
41
54
|
|
42
55
|
extra_rdoc_files: []
|
43
56
|
|
44
|
-
files:
|
45
|
-
|
46
|
-
- lib/also_migrate/gems.rb
|
47
|
-
- lib/also_migrate/migration.rb
|
48
|
-
- lib/also_migrate/migrator.rb
|
49
|
-
- lib/also_migrate/version.rb
|
50
|
-
- lib/also_migrate.rb
|
51
|
-
- LICENSE
|
52
|
-
- README.md
|
57
|
+
files: []
|
58
|
+
|
53
59
|
has_rdoc: true
|
54
60
|
homepage: http://github.com/winton/also_migrate
|
55
61
|
licenses: []
|
@@ -81,6 +87,6 @@ rubyforge_project:
|
|
81
87
|
rubygems_version: 1.3.7
|
82
88
|
signing_key:
|
83
89
|
specification_version: 3
|
84
|
-
summary: Migrate multiple tables with similar schema at once
|
90
|
+
summary: Migrate multiple tables with similar schema at once.
|
85
91
|
test_files: []
|
86
92
|
|
data/LICENSE
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
Copyright (c) 2010 Winton Welsh
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
4
|
-
this software and associated documentation files (the "Software"), to deal in
|
5
|
-
the Software without restriction, including without limitation the rights to
|
6
|
-
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
7
|
-
the Software, and to permit persons to whom the Software is furnished to do so,
|
8
|
-
subject to the following conditions:
|
9
|
-
|
10
|
-
The above copyright notice and this permission notice shall be included in all
|
11
|
-
copies or substantial portions of the Software.
|
12
|
-
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
15
|
-
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
16
|
-
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
17
|
-
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
18
|
-
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
AlsoMigrate
|
2
|
-
===========
|
3
|
-
|
4
|
-
Migrate multiple tables with similar schema at once.
|
5
|
-
|
6
|
-
Requirements
|
7
|
-
------------
|
8
|
-
|
9
|
-
<pre>
|
10
|
-
sudo gem install also_migrate
|
11
|
-
</pre>
|
12
|
-
|
13
|
-
Define the model
|
14
|
-
----------------
|
15
|
-
|
16
|
-
<pre>
|
17
|
-
class Article < ActiveRecord::Base
|
18
|
-
also_migrate(
|
19
|
-
:article_archives,
|
20
|
-
:add => [
|
21
|
-
# Parameters to ActiveRecord::ConnectionAdapters::SchemaStatements#add_column
|
22
|
-
[ 'deleted_at', :datetime, {} ]
|
23
|
-
],
|
24
|
-
:subtract => 'restored_at',
|
25
|
-
:ignore => 'deleted_at',
|
26
|
-
:indexes => 'id'
|
27
|
-
)
|
28
|
-
end
|
29
|
-
</pre>
|
30
|
-
|
31
|
-
Options:
|
32
|
-
|
33
|
-
* <code>add</code> Create columns that the original table doesn't have (defaults to none)
|
34
|
-
* <code>subtract</code> Exclude columns from the original table (defaults to none)
|
35
|
-
* <code>ignore</code> Ignore migrations that apply to certain columns (defaults to none)
|
36
|
-
* <code>indexes</code> Only index certain columns (duplicates all indexes by default)
|
37
|
-
|
38
|
-
That's it!
|
39
|
-
----------
|
40
|
-
|
41
|
-
Next time you migrate, <code>article_archives</code> is created if it doesn't exist.
|
42
|
-
|
43
|
-
Any new migration applied to <code>articles</code> is automatically applied to <code>article_archives</code>.
|
data/lib/also_migrate.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/also_migrate/gems'
|
2
|
-
|
3
|
-
AlsoMigrate::Gems.require(:lib)
|
4
|
-
|
5
|
-
$:.unshift File.dirname(__FILE__)
|
6
|
-
|
7
|
-
require 'also_migrate/version'
|
8
|
-
|
9
|
-
require 'also_migrate/base'
|
10
|
-
require 'also_migrate/migration'
|
11
|
-
require 'also_migrate/migrator'
|
12
|
-
|
13
|
-
module AlsoMigrate
|
14
|
-
class <<self
|
15
|
-
attr_accessor :classes
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
ActiveRecord::Base.send(:include, AlsoMigrate::Base)
|
20
|
-
ActiveRecord::Migrator.send(:include, AlsoMigrate::Migrator)
|
21
|
-
ActiveRecord::Migration.send(:include, AlsoMigrate::Migration)
|
data/lib/also_migrate/base.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module AlsoMigrate
|
2
|
-
module Base
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
unless base.respond_to?(:also_migrate)
|
6
|
-
base.extend ClassMethods
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
|
12
|
-
def also_migrate(*args)
|
13
|
-
options = args.extract_options!
|
14
|
-
@also_migrate_config ||= []
|
15
|
-
@also_migrate_config << {
|
16
|
-
:table_name => self.table_name,
|
17
|
-
:tables => args.collect(&:to_s),
|
18
|
-
:options => {
|
19
|
-
:add => options[:add] ? options[:add] : [],
|
20
|
-
:subtract => [ options[:subtract] ].flatten.compact,
|
21
|
-
:ignore => [ options[:ignore] ].flatten.compact,
|
22
|
-
:indexes => options[:indexes] ? [ options[:indexes] ].flatten : nil
|
23
|
-
}
|
24
|
-
}
|
25
|
-
self.class_eval do
|
26
|
-
class <<self
|
27
|
-
attr_accessor :also_migrate_config
|
28
|
-
end
|
29
|
-
end
|
30
|
-
::AlsoMigrate.classes ||= []
|
31
|
-
::AlsoMigrate.classes << self
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/also_migrate/gems.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
unless defined?(AlsoMigrate::Gems)
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
|
5
|
-
module AlsoMigrate
|
6
|
-
class Gems
|
7
|
-
|
8
|
-
VERSIONS = {
|
9
|
-
:active_wrapper => '=0.4.0',
|
10
|
-
:rake => '=0.8.7',
|
11
|
-
:rspec => '=1.3.1'
|
12
|
-
}
|
13
|
-
|
14
|
-
TYPES = {
|
15
|
-
:gemspec => [],
|
16
|
-
:gemspec_dev => [ :rspec ],
|
17
|
-
:lib => [],
|
18
|
-
:rake => [ :rake, :rspec ],
|
19
|
-
:spec => [ :active_wrapper, :rspec ],
|
20
|
-
:spec_rake => [ :active_wrapper ]
|
21
|
-
}
|
22
|
-
|
23
|
-
class <<self
|
24
|
-
|
25
|
-
def lockfile
|
26
|
-
file = File.expand_path('../../../gems', __FILE__)
|
27
|
-
unless File.exists?(file)
|
28
|
-
File.open(file, 'w') do |f|
|
29
|
-
Gem.loaded_specs.each do |key, value|
|
30
|
-
f.puts "#{key} #{value.version.version}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def require(type=nil)
|
37
|
-
(TYPES[type] || TYPES.values.flatten.compact).each do |name|
|
38
|
-
gem name.to_s, VERSIONS[name]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module AlsoMigrate
|
2
|
-
module Migration
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
unless base.respond_to?(:method_missing_with_also_migrate)
|
6
|
-
base.extend ClassMethods
|
7
|
-
base.class_eval do
|
8
|
-
class <<self
|
9
|
-
alias_method :method_missing_without_also_migrate, :method_missing
|
10
|
-
alias_method :method_missing, :method_missing_with_also_migrate
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
module ClassMethods
|
17
|
-
|
18
|
-
def method_missing_with_also_migrate(method, *arguments, &block)
|
19
|
-
args = Marshal.load(Marshal.dump(arguments))
|
20
|
-
method_missing_without_also_migrate(method, *arguments, &block)
|
21
|
-
|
22
|
-
supported = [
|
23
|
-
:add_column, :add_index, :add_timestamps, :change_column,
|
24
|
-
:change_column_default, :change_table, :create_table,
|
25
|
-
:drop_table, :remove_column, :remove_columns,
|
26
|
-
:remove_timestamps, :rename_column, :rename_table
|
27
|
-
]
|
28
|
-
|
29
|
-
if !args.empty? && supported.include?(method)
|
30
|
-
connection = ActiveRecord::Base.connection
|
31
|
-
table_name = ActiveRecord::Migrator.proper_table_name(args[0])
|
32
|
-
|
33
|
-
# Find models
|
34
|
-
if ::AlsoMigrate.classes
|
35
|
-
::AlsoMigrate.classes.uniq.each do |klass|
|
36
|
-
if klass.also_migrate_config
|
37
|
-
klass.also_migrate_config.each do |config|
|
38
|
-
options = config[:options]
|
39
|
-
tables = config[:tables]
|
40
|
-
|
41
|
-
next unless config[:table_name] == table_name
|
42
|
-
|
43
|
-
# Don't change ignored columns
|
44
|
-
options[:ignore].each do |column|
|
45
|
-
next if args.include?(column) || args.include?(column.intern)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Run migration
|
49
|
-
config[:tables].each do |table|
|
50
|
-
if method == :create_table
|
51
|
-
ActiveRecord::Migrator::AlsoMigrate.create_tables(klass)
|
52
|
-
elsif method == :add_index && !options[:indexes].nil?
|
53
|
-
next
|
54
|
-
elsif connection.table_exists?(table)
|
55
|
-
args[0] = table
|
56
|
-
args[1] = table if method == :rename_table
|
57
|
-
begin
|
58
|
-
connection.send(method, *args, &block)
|
59
|
-
rescue Exception => e
|
60
|
-
puts "(also_migrate warning) #{e.message}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,100 +0,0 @@
|
|
1
|
-
module AlsoMigrate
|
2
|
-
module Migrator
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
unless base.respond_to?(:migrate_with_also_migrate)
|
6
|
-
base.send :include, InstanceMethods
|
7
|
-
base.class_eval do
|
8
|
-
alias_method :migrate_without_also_migrate, :migrate
|
9
|
-
alias_method :migrate, :migrate_with_also_migrate
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module InstanceMethods
|
15
|
-
|
16
|
-
def migrate_with_also_migrate
|
17
|
-
if ::AlsoMigrate.classes
|
18
|
-
::AlsoMigrate.classes.uniq.each do |klass|
|
19
|
-
if klass.respond_to?(:also_migrate_config)
|
20
|
-
AlsoMigrate.create_tables(klass)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
rescue Exception => e
|
25
|
-
puts "AlsoMigrate error: #{e.message}"
|
26
|
-
puts e.backtrace.join("\n")
|
27
|
-
ensure
|
28
|
-
migrate_without_also_migrate
|
29
|
-
end
|
30
|
-
|
31
|
-
module AlsoMigrate
|
32
|
-
class <<self
|
33
|
-
|
34
|
-
def connection
|
35
|
-
ActiveRecord::Base.connection
|
36
|
-
end
|
37
|
-
|
38
|
-
def create_tables(klass)
|
39
|
-
config = klass.also_migrate_config
|
40
|
-
return unless config
|
41
|
-
old_table = klass.table_name
|
42
|
-
config.each do |config|
|
43
|
-
options = config[:options]
|
44
|
-
config[:tables].each do |new_table|
|
45
|
-
if !connection.table_exists?(new_table) && connection.table_exists?(old_table)
|
46
|
-
columns = connection.columns(old_table).collect(&:name)
|
47
|
-
columns -= options[:subtract].collect(&:to_s)
|
48
|
-
columns.collect! { |col| connection.quote_column_name(col) }
|
49
|
-
indexes = options[:indexes]
|
50
|
-
if indexes
|
51
|
-
engine =
|
52
|
-
if connection.class.to_s.include?('Mysql')
|
53
|
-
'ENGINE=' + connection.select_one(<<-SQL)['Engine']
|
54
|
-
SHOW TABLE STATUS
|
55
|
-
WHERE Name = '#{old_table}'
|
56
|
-
SQL
|
57
|
-
end
|
58
|
-
connection.execute(<<-SQL)
|
59
|
-
CREATE TABLE #{new_table} #{engine}
|
60
|
-
AS SELECT #{columns.join(',')}
|
61
|
-
FROM #{old_table}
|
62
|
-
WHERE false;
|
63
|
-
SQL
|
64
|
-
indexes.each do |column|
|
65
|
-
connection.add_index(new_table, column)
|
66
|
-
end
|
67
|
-
else
|
68
|
-
connection.execute(<<-SQL)
|
69
|
-
CREATE TABLE #{new_table}
|
70
|
-
LIKE #{old_table};
|
71
|
-
SQL
|
72
|
-
end
|
73
|
-
end
|
74
|
-
if connection.table_exists?(new_table)
|
75
|
-
if options[:add] || options[:subtract]
|
76
|
-
columns = connection.columns(new_table).collect(&:name)
|
77
|
-
end
|
78
|
-
if options[:add]
|
79
|
-
options[:add].each do |column|
|
80
|
-
unless columns.include?(column[0])
|
81
|
-
connection.add_column(*([ new_table ] + column))
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
if options[:subtract]
|
86
|
-
options[:subtract].each do |column|
|
87
|
-
if columns.include?(column)
|
88
|
-
connection.remove_column(new_table, column)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
data/lib/also_migrate/version.rb
DELETED