webdack-uuid_migration 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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2Y5MTYzM2UyMzU0ZmEyNTU0Y2IyMWE4NmU0ODUyMWI4YjMyMDU4Yw==
5
+ data.tar.gz: !binary |-
6
+ ODMyMWJlOWNmOTYzMTkwYWEyM2E3YmM5NzM1OThkZWUyOGIzMjI4MQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ OTJhOThlN2RhZTZiZWU2OWVhZWU2YWM1MjkzNDdiN2JlNWE0ZmUxODJhZDZi
10
+ ZmRhNjRlYjVmNzRlMThiMTYxZjUyM2JkN2ExOGE5MGM1YjUxODI4N2MzYWVk
11
+ M2I0NDMyY2I5ODVkYjgyOTE1ODAyOWU2MzNlOTY1YTdjZTg4YTg=
12
+ data.tar.gz: !binary |-
13
+ ZTQwMmJjZTkxZmY1MDJmOWUyNDBmYjE4MjU2MjViMTg2MzgxZTdkNjc2MzM5
14
+ ZWE4MGY2ZWUxOWU5ZWU1NDMwODFjMjZkNDQ1MGRjOGQ5MjQzYzgwYWZhZjA0
15
+ OThhZjAxOTI4MDNjZGM5OTYxZjZiNTNmNTI3YmIxN2NhZDVlNWI=
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in webdack-uuid_migration.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Deepak Kumar
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # Webdack::UuidMigration
2
+
3
+ Helper methods to migrate Integer columns to UUID columns during migrations in PostgreSQL.
4
+ It supports migrating primary key columns as well.
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'webdack-uuid_migration'
11
+
12
+ And then execute:
13
+
14
+ $ bundle
15
+
16
+ Or install it yourself as:
17
+
18
+ $ gem install webdack-uuid_migration
19
+
20
+ ## Usage
21
+
22
+ - Put `require 'webdack/uuid_migration/helper'` in your migration file.
23
+ - Enable `'uuid-ossp'` directly in Postgres database or by adding `enable_extension 'uuid-ossp'` to your migration.
24
+ - Use methods from {Webdack::UUIDMigration::Helpers} as appropriate.
25
+
26
+ Example:
27
+
28
+ # You must explicitly require it in your migration file
29
+ require 'webdack/uuid_migration/helper'
30
+
31
+ class UuidMigration < ActiveRecord::Migration
32
+ def change
33
+ reversible do |dir|
34
+ dir.up do
35
+ # Good idea to do the following, needs superuser rights in the database
36
+ # Alternatively the extension needs to be manually enabled in the RDBMS
37
+ enable_extension 'uuid-ossp'
38
+
39
+ primary_key_to_uuid :students
40
+
41
+ primary_key_to_uuid :cities
42
+ primary_key_to_uuid :sections
43
+ columns_to_uuid :students, :city_id, :section_id
44
+ end
45
+
46
+ dir.down do
47
+ raise ActiveRecord::IrreversibleMigration
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ Integer values are converted to UUID by padding 0's to the left. This makes it possible to
54
+ retrieve old id in future.
55
+
56
+ See {Webdack::UUIDMigration::Helpers} for more details. {Webdack::UUIDMigration::Helpers} is mixed
57
+ into {ActiveRecord::Migration}, so that all methods can directly be used within migrations.
58
+
59
+ ### Polymorphic references
60
+
61
+ Migrating Polymorphic references may get tricky if not all the participating entities are getting migrated to
62
+ UUID primary keys. If only some of the referenced entities are getting migrated to use UUID primary keys please use the
63
+ following steps:
64
+
65
+ - Change the corresponding <column>_id to String type (at least VARCHAR(36)).
66
+ - Call `polymorphic_column_data_for_uuid :table, :column, 'Entity1', 'Entity2', ...`
67
+ - Note that :column in is without the _id.
68
+ - See {Webdack::UUIDMigration::Helpers#polymorphic_column_data_for_uuid}
69
+ - When all remaining references also gets migrated to UUID primary keys, call `columns_to_uuid :table, :column_id`
70
+
71
+ Example:
72
+
73
+ # Student -- belongs_to :institution, :polymorphic => true
74
+ # An institution is either a School or a College
75
+ # College is migrated to use UUID as primary key
76
+ # School uses Integer primary keys
77
+
78
+ # Place the following in migration script
79
+ primary_key_to_uuid :colleges
80
+ change_column :students, :institution_id, :string
81
+ polymorphic_column_data_for_uuid :students, :institution, 'College'
82
+
83
+ # When School also gets migrated to UUID primary key
84
+ primary_key_to_uuid :schools
85
+ columns_to_uuid :students, :institution_id
86
+
87
+ # See the rspec test case in spec folder for full example
88
+
89
+
90
+ ## Compatibility
91
+
92
+ Works only with Rails 4. It uses Rails4's out-of-the-box UUID support for PostgreSQL. Works with Ruby 1.9.3 and 2.0.0.
93
+
94
+ To run the test suite:
95
+
96
+ # Update connection parameters in `spec/support/pg_database_helper.rb`.
97
+ # Postgres user must have rights to create/drop database and create extensions.
98
+ $ bundle exec rspec spec
99
+
100
+ ## Contributing
101
+
102
+ 1. Fork it ( http://github.com/kreatio-sw/webdack-uuid_migration/fork )
103
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
104
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
105
+ 4. Push to the branch (`git push origin my-new-feature`)
106
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,2 @@
1
+ require "webdack/uuid_migration/version"
2
+
@@ -0,0 +1,90 @@
1
+ module Webdack
2
+ module UUIDMigration
3
+ module Helpers
4
+
5
+ # Converts primary key from Serial Integer to UUID, migrates all data by left padding with 0's
6
+ # sets uuid_generate_v4() as default for the column
7
+ #
8
+ # @param table [Symbol]
9
+ # @param options [hash]
10
+ # @option options [Symbol] :primary_key if not supplied queries the schema (should work most of the times)
11
+ # @option options [String] :default mechanism to generate UUID for new records, default uuid_generate_v4(),
12
+ # which is Rails 4.0.0 default as well
13
+ # @return [none]
14
+ def primary_key_to_uuid(table, options={})
15
+ default= options[:default] || 'uuid_generate_v4()'
16
+
17
+ column= connection.primary_key(table)
18
+
19
+ execute %Q{ALTER TABLE #{table}
20
+ ALTER COLUMN #{column} DROP DEFAULT,
21
+ ALTER COLUMN #{column} SET DATA TYPE UUID USING (#{to_uuid_pg(column)}),
22
+ ALTER COLUMN #{column} SET DEFAULT #{default}}
23
+
24
+ execute %Q{DROP SEQUENCE #{table}_#{column}_seq} rescue nil
25
+ end
26
+
27
+ # Converts a column to UUID, migrates all data by left padding with 0's
28
+ #
29
+ # @param table [Symbol]
30
+ # @param column [Symbol]
31
+ #
32
+ # @return [none]
33
+ def column_to_uuid(table, column)
34
+ execute %Q{ALTER TABLE #{table}
35
+ ALTER COLUMN #{column} SET DATA TYPE UUID USING (#{to_uuid_pg(column)})}
36
+ end
37
+
38
+ # Converts columns to UUID, migrates all data by left padding with 0's
39
+ #
40
+ # @param table [Symbol]
41
+ # @param columns
42
+ #
43
+ # @return [none]
44
+ def columns_to_uuid(table, *columns)
45
+ columns.each do |column|
46
+ column_to_uuid(table, column)
47
+ end
48
+ end
49
+
50
+ # Convert an Integer to UUID formatted string by left padding with 0's
51
+ #
52
+ # @param num [Integer]
53
+ # @return [String]
54
+ def int_to_uuid(num)
55
+ '00000000-0000-0000-0000-%012d' % num.to_i
56
+ end
57
+
58
+ # Convert data values to UUID format for polymorphic associations. Useful when only few
59
+ # of associated entities have switched to UUID primary keys. Before calling this ensure that
60
+ # the corresponding column_id has been changed to :string (VARCHAR(36) or larger)
61
+ #
62
+ # See Polymorphic References in {file:README.md}
63
+ #
64
+ # @param table[Symbol]
65
+ # @param column [Symbol] it will change data in corresponding <column>_id
66
+ # @param entities [String] data referring these entities will be converted
67
+ def polymorphic_column_data_for_uuid(table, column, *entities)
68
+ list_of_entities= entities.map{|e| "'#{e}'"}.join(', ')
69
+ execute %Q{
70
+ UPDATE #{table} SET #{column}_id= #{to_uuid_pg("#{column}_id")}
71
+ WHERE #{column}_type in (#{list_of_entities})
72
+ }
73
+ end
74
+
75
+ private
76
+ # Prepare a fragment that can be used in SQL statements that converts teh data value
77
+ # from integer, string, or UUID to valid UUID string as per Postgres guidelines
78
+ #
79
+ # @param column [Symbol]
80
+ # @return [String]
81
+ def to_uuid_pg(column)
82
+ "uuid(lpad(replace(text(#{column}),'-',''), 32, '0'))"
83
+ end
84
+ end
85
+ end
86
+ end
87
+
88
+ ActiveRecord::Migration.class_eval do
89
+ include Webdack::UUIDMigration::Helpers
90
+ end
@@ -0,0 +1,7 @@
1
+ #
2
+ module Webdack
3
+ #
4
+ module UUIDMigration
5
+ VERSION = "0.0.2"
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ Bundler.setup(:development)
2
+
3
+ require 'rspec'
4
+ require 'active_record'
5
+ require 'pg'
6
+ require 'webdack/uuid_migration/helpers'
7
+
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,23 @@
1
+
2
+ def populate_sample_data
3
+ (0..4).each do |i|
4
+ City.create(name: "City #{i}")
5
+ School.create(name: "School #{i}")
6
+ College.create(name: "College #{i}")
7
+ end
8
+
9
+ (0..49).each do |i|
10
+
11
+ institution= if i.even? then
12
+ School.where(name: "School #{(i/2)%5}").first
13
+ else
14
+ College.where(name: "College #{(i/2)%5}").first
15
+ end
16
+
17
+ Student.create(
18
+ name: "Student #{i}",
19
+ city: City.where(name: "City #{i%5}").first,
20
+ institution: institution
21
+ )
22
+ end
23
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: UTF-8
2
+
3
+ def create_initial_schema
4
+ ActiveRecord::Schema.define(version: 20140117141611) do
5
+
6
+ # These are extensions that must be enabled in order to support this database
7
+ enable_extension "plpgsql"
8
+
9
+ create_table "cities", force: true do |t|
10
+ t.string "name"
11
+ t.datetime "created_at"
12
+ t.datetime "updated_at"
13
+ end
14
+
15
+ create_table "colleges", force: true do |t|
16
+ t.string "name"
17
+ t.datetime "created_at"
18
+ t.datetime "updated_at"
19
+ end
20
+
21
+ create_table "schools", force: true do |t|
22
+ t.string "name"
23
+ t.datetime "created_at"
24
+ t.datetime "updated_at"
25
+ end
26
+
27
+ create_table "students", force: true do |t|
28
+ t.string "name"
29
+ t.integer "city_id"
30
+ t.string "institution_type"
31
+ t.integer "institution_id"
32
+ t.datetime "created_at"
33
+ t.datetime "updated_at"
34
+
35
+ t.index "city_id"
36
+ t.index ["institution_type", "institution_id"]
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ class City < ActiveRecord::Base
2
+ has_many :students
3
+ end
@@ -0,0 +1,3 @@
1
+ class College < ActiveRecord::Base
2
+ has_many :students, as: :institution
3
+ end
@@ -0,0 +1,3 @@
1
+ class School < ActiveRecord::Base
2
+ has_many :students, as: :institution
3
+ end
@@ -0,0 +1,5 @@
1
+ class Student < ActiveRecord::Base
2
+ belongs_to :city
3
+
4
+ belongs_to :institution, :polymorphic => true
5
+ end
@@ -0,0 +1,20 @@
1
+ # With thanks to http://7fff.com/2010/12/02/activerecord-dropcreate-database-run-migrations-outside-of-rails/
2
+
3
+ PG_SPEC = {
4
+ :adapter => 'postgresql',
5
+ :host => 'localhost',
6
+ :database => 'webdack_uuid_migration_helper_test',
7
+ :username => 'kdeepak',
8
+ :encoding => 'utf8',
9
+ :password => 'kreatio'
10
+ }
11
+
12
+ def init_database
13
+ # drops and create need to be performed with a connection to the 'postgres' (system) database
14
+ ActiveRecord::Base.establish_connection(PG_SPEC.merge('database' => 'postgres', 'schema_search_path' => 'public'))
15
+ # drop the old database (if it exists)
16
+ ActiveRecord::Base.connection.drop_database PG_SPEC[:database] rescue nil
17
+ # create new
18
+ ActiveRecord::Base.connection.create_database(PG_SPEC[:database])
19
+ ActiveRecord::Base.establish_connection(PG_SPEC)
20
+ end
@@ -0,0 +1,117 @@
1
+ require_relative 'spec_helper'
2
+
3
+ class MigrationBase < ActiveRecord::Migration
4
+ def change
5
+ create_table :states, primary_key: :stateid do |t|
6
+ t.string :name
7
+ end
8
+
9
+ enable_extension 'uuid-ossp'
10
+ end
11
+ end
12
+
13
+ class Migration01 < ActiveRecord::Migration
14
+ def change
15
+ reversible do |dir|
16
+ dir.up do
17
+ primary_key_to_uuid :states
18
+ end
19
+
20
+ dir.down do
21
+ raise ActiveRecord::IrreversibleMigration
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ class Migration02 < ActiveRecord::Migration
28
+ def change
29
+ reversible do |dir|
30
+ dir.up do
31
+ primary_key_to_uuid :states, primary_key: :stateid
32
+ end
33
+
34
+ dir.down do
35
+ raise ActiveRecord::IrreversibleMigration
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ class Migration03 < ActiveRecord::Migration
42
+ def change
43
+ reversible do |dir|
44
+ dir.up do
45
+ primary_key_to_uuid :states, default: 'uuid_generate_v1()'
46
+ end
47
+
48
+ dir.down do
49
+ raise ActiveRecord::IrreversibleMigration
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ class State < ActiveRecord::Base
56
+ end
57
+
58
+ describe Webdack::UUIDMigration::Helpers do
59
+ def initial_setup
60
+ init_database
61
+
62
+ MigrationBase.migrate(:up)
63
+
64
+ (0..9).each do |i|
65
+ State.create(name: "State #{i}")
66
+ end
67
+ end
68
+
69
+ def reset_columns_data
70
+ [State].each{|klass| klass.reset_column_information}
71
+ end
72
+
73
+ def key_relationships
74
+ [
75
+ State.order(:name).map { |s| [s.name] }
76
+ ]
77
+ end
78
+
79
+ before(:each) do
80
+ initial_setup
81
+ end
82
+
83
+ it 'should migrate table with custom primary_key' do
84
+ expect {
85
+ Migration01.migrate(:up)
86
+ reset_columns_data
87
+ }.to_not change {
88
+ key_relationships
89
+ }
90
+
91
+ expect(State.connection.primary_key(:states)).to eq 'stateid'
92
+ end
93
+
94
+ it 'should honour primary_key with explicit hint' do
95
+ expect {
96
+ Migration02.migrate(:up)
97
+ reset_columns_data
98
+ }.to_not change {
99
+ key_relationships
100
+ }
101
+
102
+ expect(State.connection.primary_key(:states)).to eq 'stateid'
103
+ end
104
+
105
+ it 'should honour default' do
106
+ expect {
107
+ Migration03.migrate(:up)
108
+ reset_columns_data
109
+ }.to_not change {
110
+ key_relationships
111
+ }
112
+
113
+ default_function = State.connection.columns(:states).find { |c| c.name == 'stateid' }.default_function
114
+ expect(default_function).to eq 'uuid_generate_v1()'
115
+ end
116
+
117
+ end
@@ -0,0 +1,225 @@
1
+ require_relative 'spec_helper'
2
+
3
+ class BasicMigration < ActiveRecord::Migration
4
+ def change
5
+ reversible do |dir|
6
+ dir.up do
7
+ enable_extension 'uuid-ossp'
8
+
9
+ primary_key_to_uuid :students
10
+ columns_to_uuid :students, :city_id, :institution_id
11
+ end
12
+
13
+ dir.down do
14
+ raise ActiveRecord::IrreversibleMigration
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ class MigrateAllOneGo < ActiveRecord::Migration
21
+ def change
22
+ reversible do |dir|
23
+ dir.up do
24
+ enable_extension 'uuid-ossp'
25
+
26
+ primary_key_to_uuid :cities
27
+ primary_key_to_uuid :colleges
28
+ primary_key_to_uuid :schools
29
+
30
+ primary_key_to_uuid :students
31
+ columns_to_uuid :students, :city_id, :institution_id
32
+ end
33
+
34
+ dir.down do
35
+ raise ActiveRecord::IrreversibleMigration
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ class MigrateStep01 < ActiveRecord::Migration
42
+ def change
43
+ reversible do |dir|
44
+ dir.up do
45
+ enable_extension 'uuid-ossp'
46
+
47
+ primary_key_to_uuid :cities
48
+ primary_key_to_uuid :colleges
49
+
50
+ primary_key_to_uuid :students
51
+ columns_to_uuid :students, :city_id
52
+
53
+ change_column :students, :institution_id, :string
54
+ polymorphic_column_data_for_uuid :students, :institution, 'College'
55
+ end
56
+
57
+ dir.down do
58
+ raise ActiveRecord::IrreversibleMigration
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ class MigrateStep02 < ActiveRecord::Migration
65
+ def change
66
+ reversible do |dir|
67
+ dir.up do
68
+ primary_key_to_uuid :schools
69
+ columns_to_uuid :students, :institution_id
70
+ end
71
+
72
+ dir.down do
73
+ raise ActiveRecord::IrreversibleMigration
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe Webdack::UUIDMigration::Helpers do
80
+ def initial_setup
81
+ init_database
82
+ create_initial_schema
83
+ populate_sample_data
84
+ end
85
+
86
+ def reset_columns_data
87
+ [City, College, School, Student].each{|klass| klass.reset_column_information}
88
+ end
89
+
90
+ def key_relationships
91
+ [
92
+ Student.order(:name).map { |s| [s.name, s.city.name, s.institution.name] },
93
+ City.order(:name).map { |c| [c.name, c.students.order(:name).map(&:name)] },
94
+ School.order(:name).map { |s| [s.name, s.students.order(:name).map(&:name)] },
95
+ College.order(:name).map { |c| [c.name, c.students.order(:name).map(&:name)] }
96
+ ]
97
+ end
98
+
99
+ before(:each) do
100
+ initial_setup
101
+ end
102
+
103
+ describe 'Basic Test' do
104
+ it 'should migrate keys correctly' do
105
+ # Select a random student
106
+ student = Student.all.to_a.sample
107
+
108
+ # Store these values to check against later
109
+ original_name= student.name
110
+ original_ids= [student.id, student.city_id, student.institution_id].map{|i| i.to_i}
111
+
112
+ # Migrate and verify that all indexes and primary keys are intact
113
+ expect {
114
+ BasicMigration.migrate(:up)
115
+ reset_columns_data
116
+ }.to_not change {
117
+ indexes= Student.connection.indexes(:students).sort_by { |i| i.name }.map do |i|
118
+ [i.table, i.name, i.unique, i.columns, i.lengths, i.orders, i.where]
119
+ end
120
+
121
+ [indexes, Student.connection.primary_key(:students)]
122
+ }
123
+
124
+ # Verify that our data is still there
125
+ student= Student.where(name: original_name).first
126
+
127
+ # Verify that data in id columns have been migrated to UUID by verifying teh format
128
+ [student.id, student.city_id, student.institution_id].each do |id|
129
+ expect(id).to match(/^0{8}-0{4}-0{4}-0{4}-\d{12}$/)
130
+ end
131
+
132
+ # Verify that it is possible to retirve original id values
133
+ ids= [student.id, student.city_id, student.institution_id].map{|i| i.gsub('-','').to_i}
134
+ expect(ids).to eq(original_ids)
135
+
136
+ # Verify that schema reprts the migrated columns to be uuid type
137
+ columns= Student.connection.columns(:students)
138
+ [:id, :city_id, :institution_id].each do |column|
139
+ expect(columns.find{|c| c.name == column.to_s}.type).to eq :uuid
140
+ end
141
+
142
+ # Verify that primary key has correct default
143
+ expect(columns.find{|c| c.name == 'id'}.default_function).to eq 'uuid_generate_v4()'
144
+ end
145
+ end
146
+
147
+ it 'should migrate entire database in one go' do
148
+ expect {
149
+ MigrateAllOneGo.migrate(:up)
150
+ reset_columns_data
151
+ }.to_not change {
152
+ key_relationships
153
+ }
154
+ end
155
+
156
+ it 'should migrate in steps for polymorphic association' do
157
+ expect {
158
+ MigrateStep01.migrate(:up)
159
+ reset_columns_data
160
+ }.to_not change {
161
+ key_relationships
162
+ }
163
+
164
+ expect {
165
+ MigrateStep02.migrate(:up)
166
+ reset_columns_data
167
+ }.to_not change {
168
+ key_relationships
169
+ }
170
+ end
171
+
172
+ it 'should allow running same migration data even if it was already migrated' do
173
+ expect {
174
+ MigrateStep01.migrate(:up)
175
+ # Run again
176
+ MigrateStep01.migrate(:up)
177
+ reset_columns_data
178
+ }.to_not change {
179
+ key_relationships
180
+ }
181
+
182
+ expect {
183
+ MigrateStep02.migrate(:up)
184
+ # Run again
185
+ MigrateStep02.migrate(:up)
186
+ reset_columns_data
187
+ }.to_not change {
188
+ key_relationships
189
+ }
190
+ end
191
+
192
+ it 'should allow updation, deletion, and new entity creation' do
193
+ MigrateAllOneGo.migrate(:up)
194
+ reset_columns_data
195
+
196
+ # Select a random student
197
+ student = Student.all.to_a.sample
198
+
199
+ id= student.id
200
+ student.name= 'New student 01'
201
+ student.save
202
+ student = Student.find(id)
203
+
204
+ expect(student.name).to eq 'New student 01'
205
+
206
+ expect { student.destroy }.to change { Student.count }.by(-1)
207
+
208
+ expect {Student.find(id)}.to raise_exception(ActiveRecord::RecordNotFound)
209
+
210
+ student= Student.create(
211
+ name: 'New student 02',
212
+ city: City.where(name: 'City 2').first,
213
+ institution: School.where(name: 'School 1').first
214
+ )
215
+
216
+ expect(City.where(name: 'City 2').first.students.where(name: 'New student 02').first.name).to eq 'New student 02'
217
+ expect(School.where(name: 'School 1').first.students.where(name: 'New student 02').first.name).to eq 'New student 02'
218
+
219
+ College.where(name: 'College 3').first.students << student
220
+
221
+ student.reload
222
+
223
+ expect(student.institution.name).to eq 'College 3'
224
+ end
225
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'webdack/uuid_migration/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "webdack-uuid_migration"
8
+ spec.version = Webdack::UUIDMigration::VERSION
9
+ spec.authors = ["Deepak Kumar"]
10
+ spec.email = ["deepak@kreatio.com"]
11
+ spec.summary = %q{Useful helpers to migrate Integer id columns to UUID in PostgreSql.}
12
+ spec.description = %q{Useful helpers to migrate Integer id columns to UUID in PostgreSql. Special support for primary keys.}
13
+ spec.homepage = ""
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "yard"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "pg"
26
+
27
+ spec.add_dependency 'activerecord', '~> 4.0.0'
28
+
29
+ spec.has_rdoc= 'yard'
30
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webdack-uuid_migration
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Deepak Kumar
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activerecord
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 4.0.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 4.0.0
97
+ description: Useful helpers to migrate Integer id columns to UUID in PostgreSql. Special
98
+ support for primary keys.
99
+ email:
100
+ - deepak@kreatio.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - .gitignore
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - lib/webdack/uuid_migration.rb
111
+ - lib/webdack/uuid_migration/helpers.rb
112
+ - lib/webdack/uuid_migration/version.rb
113
+ - spec/spec_helper.rb
114
+ - spec/support/initial_data.rb
115
+ - spec/support/initial_schema.rb
116
+ - spec/support/models/city.rb
117
+ - spec/support/models/college.rb
118
+ - spec/support/models/school.rb
119
+ - spec/support/models/student.rb
120
+ - spec/support/pg_database_helper.rb
121
+ - spec/uuid_custom_pk_spec.rb
122
+ - spec/uuid_migrate_helper_spec.rb
123
+ - webdack-uuid_migration.gemspec
124
+ homepage: ''
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.1.11
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Useful helpers to migrate Integer id columns to UUID in PostgreSql.
148
+ test_files:
149
+ - spec/spec_helper.rb
150
+ - spec/support/initial_data.rb
151
+ - spec/support/initial_schema.rb
152
+ - spec/support/models/city.rb
153
+ - spec/support/models/college.rb
154
+ - spec/support/models/school.rb
155
+ - spec/support/models/student.rb
156
+ - spec/support/pg_database_helper.rb
157
+ - spec/uuid_custom_pk_spec.rb
158
+ - spec/uuid_migrate_helper_spec.rb
159
+ has_rdoc: yard