super_migration 0.0.0.pre1 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,6 +1,38 @@
1
1
  = super_migration
2
2
 
3
- Description goes here.
3
+ Migrate legacy database content into a databse with a new structure.
4
+
5
+ == Example
6
+
7
+ require 'super_migration'
8
+ include SM
9
+
10
+ SuperMigration.setup do |config|
11
+ # same options as in database.yml
12
+ config.from_database :database => "sm1",
13
+ :adapter => "mysql",
14
+ :host => "localhost",
15
+ :username => "root",
16
+ :password => ""
17
+
18
+ config.to_database :database => "sm2",
19
+ :adapter => "mysql",
20
+ :host => "localhost",
21
+ :username => "root",
22
+ :password => ""
23
+ end
24
+
25
+ SuperMigration.migrate do
26
+ table :from => :books, :to => :livres do
27
+
28
+ field :from => :author, :to => :autheur
29
+
30
+ # apply a transformation to dob field
31
+ field :from => :title, :to => :titre do |title|
32
+ Date.today.to_s + title
33
+ end
34
+ end
35
+ end
4
36
 
5
37
  == Note on Patches/Pull Requests
6
38
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0.pre1
1
+ 0.0.1
@@ -0,0 +1,18 @@
1
+ module SM
2
+ # map @from to @to aditionally applying a block @block to @to
3
+ # e.g.
4
+ #
5
+ # for the following fields
6
+ #
7
+ # {:profile_name => :name, :block => BLOCK}, # => applies the BLOCK on the :name field and put it in profile_name
8
+ # {:profile_email => :email, :block => BLOCK},
9
+ # {:profile_website => :website} # => put the :profile_website data on the corresponding :website field
10
+ class FieldsMap
11
+ attr_accessor :from, :to, :block
12
+ def initialize(from, to, block = nil)
13
+ @from = from
14
+ @to = to
15
+ @block= block
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module SM
2
+ class Record
3
+ attr_accessor :fields_maps
4
+
5
+ def initialize
6
+ @fields_maps = Array.new
7
+ end
8
+ end
9
+ end
data/lib/example.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'super_migration'
2
+ include SM
3
+
4
+ SuperMigration.setup do |config|
5
+ # same options as in database.yml
6
+ config.from_database :database => "sm1",
7
+ :adapter => "mysql",
8
+ :host => "localhost",
9
+ :username => "root",
10
+ :password => ""
11
+
12
+ config.to_database :database => "sm2",
13
+ :adapter => "mysql",
14
+ :host => "localhost",
15
+ :username => "root",
16
+ :password => ""
17
+ end
18
+
19
+ SuperMigration.migrate do
20
+ table :from => :books, :to => :livres do
21
+
22
+ field :from => :author, :to => :autheur
23
+
24
+ # apply a transformation to dob field
25
+ field :from => :title, :to => :titre do |title|
26
+ Date.today.to_s + title
27
+ end
28
+ end
29
+ end
@@ -1,41 +1,131 @@
1
- #require 'active-record'
1
+ require 'rubygems'
2
+ require 'active_record'
3
+ require 'active_support'
2
4
 
3
- module SM
5
+ Dir["#{File.dirname(__FILE__)}/entities/*.rb"].each { |file| require file }
4
6
 
7
+ module SM
5
8
  class SuperMigration
6
- attr_accessor :from_db_name, :from_host, :from_username, :from_password
7
- attr_accessor :to_db_name, :to_host, :to_username, :to_password
9
+ @@from_db_options = nil
10
+ @@to_db_options = nil
11
+
12
+ # I have a feeling this may not be quite good
13
+ @@current_table_from = nil
14
+ @@current_table_to = nil
15
+
16
+ @@current_record = Record.new
17
+ # ---
8
18
 
9
19
  def self.setup(&block)
10
20
  block.call(self)
11
21
  end
12
22
 
13
- private
23
+ def self.migrate(&block)
24
+ yield
25
+ end
26
+
14
27
  def self.from_database(options = {})
15
- puts "from"
16
28
  return if options.size < 4
17
- from_db_name = options[:db_name]
18
- from_host = options[:host]
19
- from_username = options[:username]
20
- from_password = options[:password]
21
-
29
+ @@from_db_options = options.dup
22
30
  end
23
31
 
24
32
  def self.to_database(options = {})
25
- puts "to"
26
33
  return if options.size < 4
27
- to_db_name = options[:db_name]
28
- to_host = options[:host]
29
- to_username = options[:username]
30
- to_password = options[:password]
34
+ @@to_db_options = options.dup
35
+ end
36
+
37
+ def self.from_db_options
38
+ @@from_db_options
39
+ end
40
+
41
+ def self.to_db_options
42
+ @@to_db_options
43
+ end
44
+
45
+ def self.current_table_from
46
+ @@current_table_from
47
+ end
48
+
49
+ def self.current_table_from=(table_from)
50
+ @@current_table_from = table_from
51
+ end
52
+
53
+ def self.current_table_to
54
+ @@current_table_to
55
+ end
56
+
57
+ def self.current_table_to=(table_to)
58
+ @@current_table_to = table_to
59
+ end
60
+
61
+ def self.current_record
62
+ @@current_record
63
+ end
64
+
65
+ def self.current_record=(record_hash)
66
+ @@current_record = record_hash
31
67
  end
32
68
  end
33
-
34
- def table(options = {})
35
- return if options.empty?
69
+
70
+ def define_init_classes(from, to)
71
+ # create a class with the name table[:from] in the SM module
72
+ # which inherits from ActiveRecord::Base
73
+ # call the establish_connection method for this class
74
+
75
+ SuperMigration.current_table_from = from.to_s.singularize.capitalize
76
+ SM.class_eval("class #{SuperMigration.current_table_from} < ActiveRecord::Base ; establish_connection(SuperMigration.from_db_options) ; end")
77
+
78
+ # create a class with the name table[:from] in the SM module
79
+ # which inherits from ActiveRecord::Base
80
+ # call the establish_connection nethod for this class
81
+
82
+ SuperMigration.current_table_to = to.to_s.singularize.capitalize
83
+ SM.class_eval("class #{SuperMigration.current_table_to} < ActiveRecord::Base ; establish_connection(SuperMigration.to_db_options); end")
36
84
  end
37
85
 
38
- def field(options = {})
39
- return if options.empty?
86
+ def table(table = {}, &block)
87
+ return unless block_given?
88
+
89
+ define_init_classes(table[:from], table[:to])
90
+
91
+ puts "Migrating data from table #{table[:from]} to table #{table[:to]}"
92
+ puts "-----------------------------------------------------------------"
93
+
94
+ yield
95
+
96
+ from_table = SuperMigration.current_table_from
97
+ to_table = SuperMigration.current_table_to
98
+
99
+ Kernel.const_get(from_table).all.collect do |record|
100
+ rc = SuperMigration.current_record.dup
101
+ new_record_hash = Hash.new
102
+
103
+ rc.fields_maps.each do |field_map|
104
+ unless record.respond_to?(field_map.from)
105
+ raise "Undefined attribute name \"#{field_map.from}\" for Model #{from_table}."
106
+ end
107
+
108
+ if field_map.block
109
+ new_record_hash[field_map.to] = field_map.block.call(record.send(field_map.from))
110
+ else
111
+ new_record_hash[field_map.to] = record.send(field_map.from)
112
+ end
113
+ end
114
+ new_record = Kernel.const_get(to_table).new(new_record_hash)
115
+ new_record.save!
116
+ end
117
+
118
+ # reinitialize current_record
119
+ SuperMigration.current_record = Hash.new
120
+ end
121
+
122
+ def field(options = {}, &block)
123
+ return if options.size < 2
124
+ if block_given?
125
+ raise "Arity for block is not good." if block.arity != 1
126
+ end
127
+
128
+ fields_map = FieldsMap.new(options[:from], options[:to], block)
129
+ SuperMigration.current_record.fields_maps << fields_map
40
130
  end
41
131
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: super_migration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.pre1
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cristian Prodan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-18 00:00:00 +02:00
12
+ date: 2010-02-22 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -38,6 +38,9 @@ files:
38
38
  - README.rdoc
39
39
  - Rakefile
40
40
  - VERSION
41
+ - lib/entities/fields_map.rb
42
+ - lib/entities/record.rb
43
+ - lib/example.rb
41
44
  - lib/super_migration.rb
42
45
  - test/helper.rb
43
46
  - test/test_super_migration.rb
@@ -58,9 +61,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
61
  version:
59
62
  required_rubygems_version: !ruby/object:Gem::Requirement
60
63
  requirements:
61
- - - ">"
64
+ - - ">="
62
65
  - !ruby/object:Gem::Version
63
- version: 1.3.1
66
+ version: "0"
64
67
  version:
65
68
  requirements: []
66
69