merge_db 0.0.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/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ tmp/
6
+ rerun.txt
7
+ log/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.2-p290@merge-db
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in merge_db.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard 'cucumber', :cli => '-c --drb --no-profile --format pretty' do
2
+ watch(%r{^features/.+\.feature$})
3
+ watch(%r{^features/support/.+$}) { 'features' }
4
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
5
+ end
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bin/merge_db ADDED
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
4
+
5
+ require "rubygems"
6
+ require "thor"
7
+ require 'merge_db'
8
+
9
+ class Db < Thor
10
+ desc "merge", "merge two databases"
11
+ method_option :source, :aliases => "-s", :required => true, :desc => "Records will be copied from this database"
12
+ method_option :target, :aliases => "-t", :required => true, :desc => "Records will be inserted into this database"
13
+
14
+ def merge
15
+ source = options[:source]
16
+ target = options[:target]
17
+
18
+ MergeDb::Merger.new(:source => source, :target => target).merge
19
+ end
20
+
21
+ desc "restore", "restore associations"
22
+ method_option :target, :aliases => "-t", :required => true, :desc => "Database for restoring"
23
+ def restore
24
+ target = options[:target]
25
+
26
+ MergeDb::Merger.new(:target => target).restore_associations
27
+ end
28
+
29
+ desc "prepare", "creates columns to store ids from source database"
30
+ method_option :target, :aliases => "-t", :required => true, :desc => "database into which data will be copied"
31
+ def prepare
32
+ target = options[:target]
33
+
34
+ MergeDb::Merger.new(:target => target).prepare
35
+ end
36
+ end
37
+
38
+ Db.start
@@ -0,0 +1,29 @@
1
+ defaults: &defaults
2
+ adapter: mysql2
3
+ encoding: utf8
4
+ host: localhost
5
+ reconnect: false
6
+
7
+ db_first:
8
+ database: db_first
9
+ username: root
10
+ password: ''
11
+ <<: *defaults
12
+
13
+ db_second:
14
+ database: db_second
15
+ username: root
16
+ password: ''
17
+ <<: *defaults
18
+
19
+ db_third:
20
+ database: db_third
21
+ username: root
22
+ password: ''
23
+ <<: *defaults
24
+
25
+ db_target:
26
+ database: db_target
27
+ username: root
28
+ password: ''
29
+ <<: *defaults
data/config/merge.rb ADDED
@@ -0,0 +1,3 @@
1
+ MergeDb::Configuration.scope_name = 'studio'
2
+
3
+ MergeDb::Configuration.scoped_tables = %w(users groups)
data/db.thor ADDED
@@ -0,0 +1,24 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/lib')
2
+
3
+ require 'merge_db'
4
+
5
+ class Db < Thor
6
+ desc "merge", "merge two databases"
7
+ method_option :source, :aliases => "-s", :required => true, :desc => "Records will be copied from this database"
8
+ method_option :target, :aliases => "-t", :required => true, :desc => "Records will be inserted into this database"
9
+
10
+ def merge
11
+ source = options[:source]
12
+ target = options[:target]
13
+
14
+ MergeDb::Merger.new(:source => source, :target => target).merge
15
+ end
16
+
17
+ desc "prepare", "creates columns to store ids from source database"
18
+ method_option :target, :aliases => "-t", :required => true, :desc => "database into which data will be copied"
19
+ def prepare
20
+ target = options[:target]
21
+
22
+ MergeDb::Merger.new(:target => target).prepare
23
+ end
24
+ end
@@ -0,0 +1,94 @@
1
+ Feature: Background
2
+ In order to migrate from multiple databases to single database in my application
3
+ As a developer
4
+ I want to merge all databases
5
+
6
+ Scenario:
7
+ Given a schema "old.rb":
8
+ """
9
+ Schema.define do
10
+ create_table "users" do |t|
11
+ t.integer "id"
12
+ t.string "name"
13
+ t.integer "group_id"
14
+ end
15
+
16
+ create_table "groups", :force => true do |t|
17
+ t.integer "id"
18
+ t.string "name"
19
+ end
20
+ end
21
+ """
22
+ Given a schema "new.rb":
23
+ """
24
+ Schema.define do
25
+ create_table "users" do |t|
26
+ t.integer "id"
27
+ t.string "name"
28
+ t.integer "group_id"
29
+ end
30
+
31
+ create_table "groups", :force => true do |t|
32
+ t.integer "id"
33
+ t.string "name"
34
+ end
35
+
36
+ create_table "studios", :force => true do |t|
37
+ t.integer "id"
38
+ t.string "db_name"
39
+ end
40
+ end
41
+ """
42
+ Given a database named "db_first" with schema "old.rb"
43
+ And a database named "db_second" with schema "old.rb"
44
+ And a database named "db_third" with schema "old.rb"
45
+ And a database named "db_target" with schema "new.rb"
46
+ And a table "users" in "db_first" with:
47
+ | id | name | group_id |
48
+ | 1 | John | 1 |
49
+ | 2 | Marry | 2 |
50
+ | 3 | Jane | 2 |
51
+ And a table "groups" in "db_first" with:
52
+ | id | name |
53
+ | 1 | First |
54
+ | 2 | Second |
55
+ And a table "users" in "db_second" with:
56
+ | id | name | group_id |
57
+ | 1 | Jeff | 1 |
58
+ | 2 | Frank | 1 |
59
+ | 3 | Adam | 2 |
60
+ And a table "groups" in "db_second" with:
61
+ | id | name |
62
+ | 1 | First 2 |
63
+ | 2 | Second 2 |
64
+ And a table "users" in "db_third" with:
65
+ | id | name | group_id |
66
+ | 1 | Piter | 1 |
67
+ | 2 | James | 2 |
68
+ | 3 | Bill | 3 |
69
+ And a table "groups" in "db_third" with:
70
+ | id | name |
71
+ | 1 | One |
72
+ | 2 | Two |
73
+ | 3 | Three |
74
+ When I prepare "db_target"
75
+ When I merge "db_first" into "db_target"
76
+ And I merge "db_second" into "db_target"
77
+ And I merge "db_third" into "db_target"
78
+ # When I run in shell "thor db:merge -s db_source -t db_target"
79
+ # Then I should see "Databases were merged."
80
+ When I connected to "db_target"
81
+ Then 9 users should exist
82
+ And 7 groups should exist
83
+ Then the following users should exist:
84
+ | name | groups.name | studios.db_name |
85
+ | Piter | One | db_third |
86
+ | James | Two | db_third |
87
+ | Bill | Three | db_third |
88
+ | John | First | db_first |
89
+ | Marry | Second | db_first |
90
+ | Jane | Second | db_first |
91
+ | Jeff | First 2 | db_second |
92
+ | Frank | First 2 | db_second |
93
+ | Adam | Second 2 | db_second |
94
+
@@ -0,0 +1,77 @@
1
+ Given /^a schema "([^"]*)":$/ do |schema_name, string|
2
+ Given %|a file named "temp/#{schema_name}" with:|, string
3
+ end
4
+
5
+ Given /^a database named "([^"]*)" with schema "([^"]*)"$/ do |db_name, schema_name|
6
+ connection.drop_database db_name
7
+ connection.create_database db_name
8
+
9
+ created_databases << db_name
10
+
11
+ connection.execute("use #{db_name}")
12
+
13
+ schema = File.read("./tmp/aruba/temp/#{schema_name}")
14
+
15
+ instance_eval schema
16
+ end
17
+
18
+ When /^I run in shell "([^"]*)"$/ do |command|
19
+ @output = `#{command}`
20
+ end
21
+
22
+ When /^I prepare "([^"]*)"$/ do |target|
23
+ MergeDb::Merger.new(:target => target).prepare
24
+ end
25
+
26
+ When /^I merge "([^"]*)" into "([^"]*)"$/ do |source, target|
27
+ MergeDb::Merger.new(:source => source, :target => target).merge
28
+ end
29
+
30
+ Then /^I should see "([^"]*)"$/ do |str|
31
+ @output.should include(str)
32
+ end
33
+
34
+ Then /^I should see the output$/ do
35
+ puts @output
36
+ end
37
+
38
+ Given /^a table "([^"]*)" in "([^"]*)" with:$/ do |table_name, db_name, data|
39
+ connection.execute("use #{db_name}")
40
+
41
+ data.hashes.each do |fixture|
42
+ connection.insert_fixture(fixture, table_name)
43
+ end
44
+ end
45
+
46
+ When /^I use "([^"]*)"$/ do |arg1|
47
+ pending # express the regexp above with the code you wish you had
48
+ end
49
+
50
+ When /^I connected to "([^"]*)"$/ do |db_name|
51
+ connection.execute("use #{db_name}")
52
+ end
53
+
54
+ Then /^(\d+) (\w+)?s should exist$/ do |count, model_name|
55
+ model = model_name.camelize.constantize
56
+ model.count.should == count.to_i
57
+ end
58
+
59
+ Then /^the following (\w+)?s should exist:$/ do |model_name, table|
60
+ model = model_name.camelize.constantize
61
+
62
+ join_tables = table.column_names.collect { |name| name.split(".").first.singularize.to_sym if name =~ /\w+\.\w+/ }.delete_if(&:nil?)
63
+
64
+ table.hashes.each do |attributes|
65
+ model.joins(join_tables).where(attributes).should_not be_empty, "expected to find a record with attributes: #{attributes}"
66
+ end
67
+ end
68
+
69
+ Then /^the following groups should exist:$/ do |table|
70
+ # table is a Cucumber::Ast::Table
71
+ pending # express the regexp above with the code you wish you had
72
+ end
73
+
74
+ Then /debug/ do
75
+ debugger
76
+ a = 1
77
+ end
@@ -0,0 +1,27 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'aruba/cucumber'
3
+ require 'active_record'
4
+ require 'ruby-debug'
5
+ require 'merge_db'
6
+
7
+ module CustomData
8
+ def connection
9
+ ActiveRecord::Base.establish_connection(connection_params) unless ActiveRecord::Base.connected?
10
+ ActiveRecord::Base.connection
11
+ end
12
+
13
+ def connection_params
14
+ {
15
+ :adapter => 'mysql2',
16
+ :host => 'localhost',
17
+ :username => 'root',
18
+ :password => '',
19
+ }
20
+ end
21
+
22
+ def created_databases
23
+ @databases ||= []
24
+ end
25
+ end
26
+
27
+ World(CustomData)
@@ -0,0 +1,5 @@
1
+ After do
2
+ created_databases.each do |db_name|
3
+ connection.drop_database db_name
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class User < ActiveRecord::Base
2
+ belongs_to :group
3
+ belongs_to :studio
4
+ end
5
+
6
+ class Studio < ActiveRecord::Base
7
+ end
8
+
9
+ class Group < ActiveRecord::Base
10
+ has_many :users
11
+ end
@@ -0,0 +1,8 @@
1
+ class Schema < ActiveRecord::Migration
2
+ def self.define(&block)
3
+ schema = new
4
+ schema.verbose = false
5
+ schema.instance_eval(&block)
6
+ end
7
+ end
8
+
@@ -0,0 +1,16 @@
1
+ module MergeDb
2
+ class Configuration
3
+ class << self
4
+ attr_accessor :scope_name, :scoped_tables
5
+
6
+ def scoped_tables
7
+ @scoped_tables || []
8
+ end
9
+
10
+ def database
11
+ require 'erb'
12
+ YAML::load(ERB.new(IO.read('./config/database.yml')).result)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,190 @@
1
+ module MergeDb
2
+ class Source < ActiveRecord::Base
3
+ end
4
+
5
+ class Target < ActiveRecord::Base
6
+ end
7
+
8
+ class Merger
9
+
10
+ def initialize(params)
11
+ @source_name = params[:source]
12
+ @target_name = params[:target]
13
+ end
14
+
15
+ def prepare
16
+ prepare_tables_in_target
17
+ end
18
+
19
+ def merge
20
+ add_db_to_scope
21
+ copy_data_from_source_to_target
22
+ restore_association_references
23
+ clean_backedup_primary_keys
24
+ end
25
+
26
+ def restore_associations
27
+ restore_association_references
28
+ clean_backedup_primary_keys
29
+ end
30
+
31
+ private
32
+
33
+ def prepare_tables_in_target
34
+ puts "Prepare target"
35
+
36
+ pbar = ProgressBar.new("tables", targte.tables.size)
37
+
38
+ target.tables.each do |table|
39
+
40
+ pbar.inc
41
+
42
+ add_scope_id_column(table) if Configuration.scoped_tables.include? table
43
+
44
+ target.columns(table)
45
+ .find_all {|column| column.name =~ /id$/}
46
+ .each do |column|
47
+ add_backup_id_column(table, column)
48
+ end
49
+ end
50
+
51
+ pbar.finish
52
+ end
53
+
54
+ def add_db_to_scope
55
+ @scope_id = target.insert("insert into #{Configuration.scope_name.pluralize} (db_name) values ('#{@source_name}')")
56
+ end
57
+
58
+ def copy_data_from_source_to_target
59
+ puts "Copy data into target"
60
+
61
+ source.tables.each do |table|
62
+ puts "\nCopy #{table} records "
63
+ query = "select * from #{table}"
64
+
65
+ records = source.select_all(query)
66
+
67
+ pbar = ProgressBar.new("#{table}", records.size)
68
+
69
+ records.each do |fixture|
70
+
71
+ pbar.inc
72
+
73
+ fixture_with_saved_ids = prepare_for_merge(fixture)
74
+
75
+ if Configuration.scoped_tables.include? table
76
+ fixture_with_saved_ids[scope_id_column] = @scope_id
77
+ end
78
+
79
+ target.insert_fixture(fixture_with_saved_ids, table)
80
+ end
81
+
82
+ pbar.finish
83
+ end
84
+ end
85
+
86
+ def restore_association_references
87
+ puts "Restore association references"
88
+
89
+ target.tables.each do |table|
90
+ query = "select * from #{table}"
91
+
92
+ restored_columns = Hash.new {|hash, key| hash[key] = [] }
93
+
94
+ records = target.select_all(query)
95
+
96
+ pbar = ProgressBar.new("#{table}", records.size)
97
+
98
+ records.each do |record|
99
+ pbar.inc
100
+ record.each do |column, old_id|
101
+ if column =~ /__id$/ && !old_id.nil? && !restored_columns[column].include?(old_id)
102
+
103
+ restored_columns[column] << old_id
104
+
105
+ if association = find_association_by_old_id(column, old_id)
106
+
107
+ new_id = association["id"]
108
+
109
+ update_query = "update #{table} set #{normalize_column_name(column)} = #{new_id} where #{column} = #{old_id}"
110
+ target.update(update_query)
111
+ else
112
+ ActiveRecord::Base.logger.error "Can't find #{column} with old id: #{old_id}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ pbar.finish
119
+
120
+ unless restored_columns.empty?
121
+ columns_with_null = restored_columns.keys.collect {|column| "#{column} = NULL"}.join(", ")
122
+ query = "update #{table} set #{columns_with_null}"
123
+ target.execute(query)
124
+ end
125
+ end
126
+ end
127
+
128
+ def clean_backedup_primary_keys
129
+ source.tables.each do |table|
130
+ query = "update #{table} set _id = NULL"
131
+
132
+ target.execute(query)
133
+ end
134
+ end
135
+
136
+ def add_backup_id_column(table, column)
137
+ target.add_column(table, backup_column_name(column.name), column.type)
138
+ end
139
+
140
+ def add_scope_id_column(table)
141
+ target.add_column(table, scope_id_column, :integer)
142
+ end
143
+
144
+ def scope_id_column
145
+ Configuration.scope_name + "_id"
146
+ end
147
+
148
+ def find_association_by_old_id(column, value)
149
+ association_table = column.split("__").first.pluralize
150
+ query = "select * from #{association_table} where _id = #{value}"
151
+ association = target.select_one(query)
152
+ end
153
+
154
+ def prepare_for_merge(fixture)
155
+ {}.tap do |new_fixture|
156
+ fixture.each do |key, value|
157
+ new_fixture[backup_column_name(key)] = value
158
+ end
159
+ end
160
+ end
161
+
162
+ def backup_column_name(name)
163
+ if name =~ /id$/
164
+ name = name.gsub(/id$/, "_id")
165
+ else
166
+ name
167
+ end
168
+ end
169
+
170
+ def normalize_column_name(name)
171
+ name.gsub(/__id$/, '_id')
172
+ end
173
+
174
+ def target
175
+ @target_connection ||= connect(Target, @target_name)
176
+ end
177
+
178
+ def source
179
+ @source_connection ||= connect(Source, @source_name)
180
+ end
181
+
182
+ def connect(constant, db_name)
183
+ if db_name
184
+ constant.establish_connection(Configuration.database[db_name])
185
+ constant.connection
186
+ end
187
+ end
188
+ end
189
+ end
190
+
@@ -0,0 +1,3 @@
1
+ module MergeDb
2
+ VERSION = "0.0.2"
3
+ end
data/lib/merge_db.rb ADDED
@@ -0,0 +1,19 @@
1
+ require "rubygems"
2
+ require "bundler/setup"
3
+
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+
6
+ require 'active_record'
7
+ # require 'ruby-debug'
8
+ require 'logger'
9
+ require 'progressbar'
10
+
11
+ require 'merge_db/configuration'
12
+ require 'merge_db/merger'
13
+
14
+ ActiveRecord::Base.logger = Logger.new('log.txt')
15
+
16
+ module MergeDb
17
+ end
18
+
19
+ require "./config/merge.rb"
data/merge_db.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "merge_db/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "merge_db"
7
+ s.version = MergeDb::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Pavel Gabriel"]
10
+ s.email = ["alovak@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Merge your Rails databases}
13
+ s.description = %q{With merge db you can easily merge your databases and save all associations}
14
+
15
+ s.rubyforge_project = "merge_db"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency "cucumber"
23
+ s.add_development_dependency "aruba"
24
+ s.add_development_dependency "guard"
25
+ s.add_development_dependency "guard-cucumber"
26
+ s.add_development_dependency "ruby-debug19"
27
+
28
+ s.add_runtime_dependency "thor"
29
+ s.add_runtime_dependency "activerecord"
30
+ s.add_runtime_dependency "mysql2"
31
+ s.add_runtime_dependency "ruby-progressbar"
32
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: merge_db
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Pavel Gabriel
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-04 00:00:00.000000000 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: cucumber
17
+ requirement: &2157140920 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: *2157140920
26
+ - !ruby/object:Gem::Dependency
27
+ name: aruba
28
+ requirement: &2157140480 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *2157140480
37
+ - !ruby/object:Gem::Dependency
38
+ name: guard
39
+ requirement: &2157140060 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2157140060
48
+ - !ruby/object:Gem::Dependency
49
+ name: guard-cucumber
50
+ requirement: &2157139640 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2157139640
59
+ - !ruby/object:Gem::Dependency
60
+ name: ruby-debug19
61
+ requirement: &2157139180 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *2157139180
70
+ - !ruby/object:Gem::Dependency
71
+ name: thor
72
+ requirement: &2157138760 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: *2157138760
81
+ - !ruby/object:Gem::Dependency
82
+ name: activerecord
83
+ requirement: &2157138280 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: *2157138280
92
+ - !ruby/object:Gem::Dependency
93
+ name: mysql2
94
+ requirement: &2157137760 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: *2157137760
103
+ - !ruby/object:Gem::Dependency
104
+ name: ruby-progressbar
105
+ requirement: &2157137300 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :runtime
112
+ prerelease: false
113
+ version_requirements: *2157137300
114
+ description: With merge db you can easily merge your databases and save all associations
115
+ email:
116
+ - alovak@gmail.com
117
+ executables:
118
+ - merge_db
119
+ extensions: []
120
+ extra_rdoc_files: []
121
+ files:
122
+ - .gitignore
123
+ - .rvmrc
124
+ - Gemfile
125
+ - Guardfile
126
+ - README
127
+ - Rakefile
128
+ - bin/merge_db
129
+ - config/database.yml
130
+ - config/merge.rb
131
+ - db.thor
132
+ - features/merge.feature
133
+ - features/step_definitions/database_steps.rb
134
+ - features/support/env.rb
135
+ - features/support/hooks.rb
136
+ - features/support/models.rb
137
+ - features/support/schema.rb
138
+ - lib/merge_db.rb
139
+ - lib/merge_db/configuration.rb
140
+ - lib/merge_db/merger.rb
141
+ - lib/merge_db/version.rb
142
+ - merge_db.gemspec
143
+ has_rdoc: true
144
+ homepage: ''
145
+ licenses: []
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ none: false
152
+ requirements:
153
+ - - ! '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ none: false
158
+ requirements:
159
+ - - ! '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project: merge_db
164
+ rubygems_version: 1.6.2
165
+ signing_key:
166
+ specification_version: 3
167
+ summary: Merge your Rails databases
168
+ test_files:
169
+ - features/merge.feature
170
+ - features/step_definitions/database_steps.rb
171
+ - features/support/env.rb
172
+ - features/support/hooks.rb
173
+ - features/support/models.rb
174
+ - features/support/schema.rb