pt-osc 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +0 -1
- data/CHANGELOG.md +6 -0
- data/README.md +15 -1
- data/lib/active_record/pt_osc_migration.rb +50 -10
- data/lib/pt-osc/version.rb +1 -1
- data/pt-osc.gemspec +1 -1
- data/test/config/database.yml +5 -0
- data/test/functional/pt_osc_migration_functional_test.rb +78 -48
- data/test/unit/pt_osc_migration_unit_test.rb +115 -2
- metadata +6 -6
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.2.0
|
2
|
+
|
3
|
+
- support for setting the [`--check-alter` flag](http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html#cmdoption-pt-online-schema-change--%5Bno%5Dcheck-alter)
|
4
|
+
- internal improvements to the way `percona` options are handled
|
5
|
+
- removed support for Ruby 1.9.2
|
6
|
+
|
1
7
|
## 0.1.3
|
2
8
|
|
3
9
|
- fix for loading percona config
|
data/README.md
CHANGED
@@ -38,9 +38,22 @@ environment:
|
|
38
38
|
|
39
39
|
Additional/modified options for the `percona` hash include:
|
40
40
|
- `defaults-file`: Can be specified as an absolute path (with leading `/`) or relative (without). Relative paths will be treated as relative to your project's working directory.
|
41
|
+
- `check-alter`: When set to `false`, `ALTER` commands will not be checked when executing (same as [`--no-check-alter`](http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html#cmdoption-pt-online-schema-change--%5Bno%5Dcheck-alter))
|
41
42
|
- `run_mode`: Specify `'execute'` to actually run `pt-online-schema-change` when the migration runs. Specify `'print'` to output the commands to run to STDOUT instead. Default is `'print'`.
|
42
43
|
- `log`: Specify the file used for logging activity. Can be a relative or absolute path.
|
43
44
|
|
45
|
+
#### Migrations
|
46
|
+
|
47
|
+
To run migrations with `pt-online-schema-change`, you need to explicitly opt them in by changing their parent class to `ActiveRecord::PtOscMigration`. For instance, if your migration was
|
48
|
+
```ruby
|
49
|
+
class CreateTeams < ActiveRecord::Migration
|
50
|
+
```
|
51
|
+
you should change it to
|
52
|
+
```ruby
|
53
|
+
class CreateTeams < ActiveRecord::PtOscMigration
|
54
|
+
```
|
55
|
+
If you have migrations that you do not want to be run with `pt-online-schema-change`, leave the same parent class and they will be run normally.
|
56
|
+
|
44
57
|
## Caveats
|
45
58
|
|
46
59
|
This gem is not considered production ready. There will be bugs.
|
@@ -49,7 +62,6 @@ This gem is not considered production ready. There will be bugs.
|
|
49
62
|
|
50
63
|
`pt-osc` is tested against:
|
51
64
|
- ActiveRecord 3.2 branch
|
52
|
-
- Ruby 1.9.2
|
53
65
|
- Ruby 1.9.3
|
54
66
|
- Ruby 2.0.0
|
55
67
|
- Ruby 2.1.2
|
@@ -57,6 +69,8 @@ This gem is not considered production ready. There will be bugs.
|
|
57
69
|
|
58
70
|
Support for other versions of Ruby or ActiveRecord is unknown and not guaranteed.
|
59
71
|
|
72
|
+
`pt-osc` requires the use of `pt-online-schema-change` 2.0 or later. Some options may not work with all versions.
|
73
|
+
|
60
74
|
`pt-osc` is compatible with versions 0.5.0 and later of [zdennis/activerecord-import](https://github.com/zdennis/activerecord-import). It will not work with earlier versions.
|
61
75
|
|
62
76
|
#License and Copyright
|
@@ -9,10 +9,17 @@ module ActiveRecord
|
|
9
9
|
mutator: :make_path_absolute,
|
10
10
|
},
|
11
11
|
'recursion-method' => {
|
12
|
+
version: '>= 2.1',
|
12
13
|
},
|
13
14
|
'execute' => {
|
14
15
|
default: false,
|
15
16
|
},
|
17
|
+
'check-alter' => {
|
18
|
+
boolean: true,
|
19
|
+
default: true,
|
20
|
+
mutator: :execute_only,
|
21
|
+
version: '>= 2.1',
|
22
|
+
}
|
16
23
|
}.freeze
|
17
24
|
|
18
25
|
def self.percona_flags
|
@@ -140,18 +147,14 @@ module ActiveRecord
|
|
140
147
|
|
141
148
|
# Set defaults
|
142
149
|
self.class.percona_flags.each do |flag, flag_config|
|
143
|
-
options[flag]
|
150
|
+
options[flag] = flag_config[:default] if flag_config.key?(:default) && !options.key?(flag)
|
144
151
|
end
|
145
152
|
|
146
|
-
#
|
147
|
-
|
148
|
-
|
149
|
-
options.each do |key, value|
|
150
|
-
value = send(self.class.percona_flags[key][:mutator], value) if self.class.percona_flags[key].try(:key?, :mutator)
|
151
|
-
command += " --#{key} #{value}"
|
152
|
-
end
|
153
|
+
"#{command}#{run_mode_flag(options)}#{command_flags(options)}"
|
154
|
+
end
|
153
155
|
|
154
|
-
|
156
|
+
def self.tool_version
|
157
|
+
@_tool_version ||= Gem::Version.new(get_tool_version.sub('pt-online-schema-change', '').strip)
|
155
158
|
end
|
156
159
|
|
157
160
|
def database_config
|
@@ -175,11 +178,48 @@ module ActiveRecord
|
|
175
178
|
end
|
176
179
|
|
177
180
|
private
|
181
|
+
def command_flags(options)
|
182
|
+
options.map do |key, value|
|
183
|
+
next if key == 'execute'
|
184
|
+
flag_options = self.class.percona_flags[key]
|
185
|
+
|
186
|
+
# Satisfy version requirements
|
187
|
+
if flag_options.try(:key?, :version)
|
188
|
+
next unless Gem::Requirement.new(flag_options[:version]).satisfied_by? self.class.tool_version
|
189
|
+
end
|
190
|
+
|
191
|
+
# Mutate the value if needed
|
192
|
+
if flag_options.try(:key?, :mutator)
|
193
|
+
value = send(flag_options[:mutator], value, all_options: options, flag_name: key)
|
194
|
+
end
|
195
|
+
|
196
|
+
# Handle boolean flags
|
197
|
+
if flag_options.try(:[], :boolean)
|
198
|
+
key = "no-#{key}" unless value
|
199
|
+
value = nil
|
200
|
+
end
|
201
|
+
|
202
|
+
" --#{key} #{value}"
|
203
|
+
end.join('')
|
204
|
+
end
|
205
|
+
|
206
|
+
def run_mode_flag(options)
|
207
|
+
options[:execute] ? ' --execute' : ' --dry-run'
|
208
|
+
end
|
209
|
+
|
210
|
+
def self.get_tool_version
|
211
|
+
`pt-online-schema-change --version`
|
212
|
+
end
|
213
|
+
|
178
214
|
# Flag mutators
|
179
|
-
def make_path_absolute(path)
|
215
|
+
def make_path_absolute(path, _ = {})
|
180
216
|
return path if path[0] == '/'
|
181
217
|
# If path is not already absolute, treat it as relative to the app root
|
182
218
|
File.expand_path(path, Dir.getwd)
|
183
219
|
end
|
220
|
+
|
221
|
+
def execute_only(flag, options = {})
|
222
|
+
options[:all_options][:execute] ? flag : self.class.percona_flags[options[:flag_name]][:default]
|
223
|
+
end
|
184
224
|
end
|
185
225
|
end
|
data/lib/pt-osc/version.rb
CHANGED
data/pt-osc.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency 'rake'
|
22
22
|
spec.add_development_dependency 'shoulda'
|
23
23
|
spec.add_development_dependency 'faker'
|
24
|
-
spec.add_development_dependency 'mocha'
|
24
|
+
spec.add_development_dependency 'mocha', '>= 0.9.0'
|
25
25
|
|
26
26
|
# For testing using dummy Rails app
|
27
27
|
spec.add_development_dependency 'rails', '~> 3.2'
|
data/test/config/database.yml
CHANGED
@@ -3,36 +3,45 @@ require 'test_helper'
|
|
3
3
|
class PtOscMigrationFunctionalTest < ActiveRecord::TestCase
|
4
4
|
class TestMigration < ActiveRecord::PtOscMigration; end
|
5
5
|
|
6
|
-
context 'a migration
|
6
|
+
context 'a migration' do
|
7
7
|
setup do
|
8
|
-
ActiveRecord::Base.establish_connection(test_spec)
|
9
8
|
@migration = TestMigration.new
|
10
|
-
|
9
|
+
ActiveRecord::PtOscMigration.stubs(:tool_version).returns(Gem::Version.new('100'))
|
11
10
|
end
|
12
11
|
|
13
|
-
|
12
|
+
teardown do
|
13
|
+
ActiveRecord::PtOscMigration.unstub(:tool_version)
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'connected to a pt-osc database' do
|
14
17
|
setup do
|
15
|
-
|
16
|
-
@
|
17
|
-
|
18
|
-
|
18
|
+
ActiveRecord::Base.establish_connection(test_spec)
|
19
|
+
@migration.instance_variable_set(:@connection, ActiveRecord::Base.connection)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'on an existing table with an existing column' do
|
23
|
+
setup do
|
24
|
+
@table_name = Faker::Lorem.word
|
25
|
+
@column_name = Faker::Lorem.word
|
26
|
+
@index_name = Faker::Lorem.words.join('_')
|
27
|
+
@index_name_2 = "#{@index_name}_2"
|
19
28
|
|
20
|
-
|
21
|
-
|
29
|
+
ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS `#{@table_name}`;"
|
30
|
+
ActiveRecord::Base.connection.execute <<-SQL
|
22
31
|
CREATE TABLE `#{@table_name}` (
|
23
32
|
`#{@column_name}` varchar(255) DEFAULT NULL,
|
24
33
|
KEY `#{@index_name}` (`#{@column_name}`)
|
25
34
|
);
|
26
|
-
|
27
|
-
|
35
|
+
SQL
|
36
|
+
end
|
28
37
|
|
29
|
-
|
30
|
-
|
31
|
-
|
38
|
+
teardown do
|
39
|
+
ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS `#{@table_name}`;"
|
40
|
+
end
|
32
41
|
|
33
|
-
|
34
|
-
|
35
|
-
|
42
|
+
context 'a migration with only ALTER statements' do
|
43
|
+
setup do
|
44
|
+
TestMigration.class_eval <<-EVAL
|
36
45
|
def change
|
37
46
|
rename_table :#{@table_name}, :#{Faker::Lorem.word}
|
38
47
|
add_column :#{@table_name}, :#{Faker::Lorem.word}, :integer
|
@@ -42,58 +51,79 @@ class PtOscMigrationFunctionalTest < ActiveRecord::TestCase
|
|
42
51
|
add_index :#{@table_name}, :#{@column_name}, name: :#{@index_name_2}
|
43
52
|
remove_index :#{@table_name}, name: :#{@index_name}
|
44
53
|
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
teardown do
|
49
|
-
TestMigration.send(:remove_method, :change)
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'ignoring schema lookups' do
|
53
|
-
setup do
|
54
|
-
# Kind of a hacky way to do this
|
55
|
-
ignored_sql = ActiveRecord::SQLCounter.ignored_sql + [
|
56
|
-
/^SHOW FULL FIELDS FROM/,
|
57
|
-
/^SHOW COLUMNS FROM/,
|
58
|
-
/^SHOW KEYS FROM/,
|
59
|
-
]
|
60
|
-
ActiveRecord::SQLCounter.any_instance.stubs(:ignore).returns(ignored_sql)
|
54
|
+
EVAL
|
61
55
|
end
|
62
56
|
|
63
57
|
teardown do
|
64
|
-
|
58
|
+
TestMigration.send(:remove_method, :change)
|
65
59
|
end
|
66
60
|
|
67
|
-
context '
|
61
|
+
context 'ignoring schema lookups' do
|
68
62
|
setup do
|
69
|
-
|
70
|
-
|
63
|
+
# Kind of a hacky way to do this
|
64
|
+
ignored_sql = ActiveRecord::SQLCounter.ignored_sql + [
|
65
|
+
/^SHOW FULL FIELDS FROM/,
|
66
|
+
/^SHOW COLUMNS FROM/,
|
67
|
+
/^SHOW KEYS FROM/,
|
68
|
+
]
|
69
|
+
ActiveRecord::SQLCounter.any_instance.stubs(:ignore).returns(ignored_sql)
|
71
70
|
end
|
72
71
|
|
73
72
|
teardown do
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
should 'not execute any queries immediately' do
|
78
|
-
assert_no_queries { @migration.change }
|
73
|
+
ActiveRecord::SQLCounter.any_instance.unstub(:ignore)
|
79
74
|
end
|
80
75
|
|
81
|
-
context 'with
|
76
|
+
context 'with suppressed output' do
|
82
77
|
setup do
|
83
|
-
|
78
|
+
@migration.stubs(:write)
|
79
|
+
@migration.stubs(:announce)
|
84
80
|
end
|
85
81
|
|
86
82
|
teardown do
|
87
|
-
|
83
|
+
@migration.unstub(:write, :announce)
|
88
84
|
end
|
89
85
|
|
90
|
-
should 'not
|
91
|
-
assert_no_queries { @migration.
|
86
|
+
should 'not execute any queries immediately' do
|
87
|
+
assert_no_queries { @migration.change }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'with a working pt-online-schema-change' do
|
91
|
+
setup do
|
92
|
+
Kernel.expects(:system).with(regexp_matches(/^pt-online-schema-change/)).twice.returns(true)
|
93
|
+
end
|
94
|
+
|
95
|
+
teardown do
|
96
|
+
Kernel.unstub(:system)
|
97
|
+
end
|
98
|
+
|
99
|
+
should 'not directly execute any queries when migrating' do
|
100
|
+
assert_no_queries { @migration.migrate(:up) }
|
101
|
+
end
|
92
102
|
end
|
93
103
|
end
|
94
104
|
end
|
95
105
|
end
|
96
106
|
end
|
97
107
|
end
|
108
|
+
|
109
|
+
context 'connected without checking alter statements' do
|
110
|
+
setup do
|
111
|
+
@old_connection = @migration.instance_variable_get(:@connection)
|
112
|
+
ActiveRecord::Base.establish_connection(test_spec('test_no_check_alter'))
|
113
|
+
@migration.instance_variable_set(:@connection, ActiveRecord::Base.connection)
|
114
|
+
end
|
115
|
+
|
116
|
+
should 'check ALTER when dry-running sql' do
|
117
|
+
command = @migration.send(:percona_command, nil, nil, nil, execute: false)
|
118
|
+
assert command.include?('--check-alter'), "Command '#{command}' did not include ALTER check."
|
119
|
+
assert_equal false, command.include?('--no-check-alter'), "Command '#{command}' should not disable ALTER check."
|
120
|
+
end
|
121
|
+
|
122
|
+
should 'not check ALTER when executing sql' do
|
123
|
+
command = @migration.send(:percona_command, nil, nil, nil, execute: true)
|
124
|
+
assert command.include?('--no-check-alter'), "Command '#{command}' should not include ALTER check."
|
125
|
+
assert_equal false, command.include?('--check-alter'), "Command '#{command}' should disable ALTER check."
|
126
|
+
end
|
127
|
+
end
|
98
128
|
end
|
99
129
|
end
|
@@ -4,6 +4,12 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
4
4
|
context 'with a pt-osc migration' do
|
5
5
|
setup do
|
6
6
|
@migration = ActiveRecord::PtOscMigration.new
|
7
|
+
@tool_version = states('tool_version').starts_as('100')
|
8
|
+
ActiveRecord::PtOscMigration.stubs(:tool_version).returns(Gem::Version.new('100')).when(@tool_version.is('100'))
|
9
|
+
end
|
10
|
+
|
11
|
+
teardown do
|
12
|
+
ActiveRecord::PtOscMigration.unstub(:tool_version)
|
7
13
|
end
|
8
14
|
|
9
15
|
context '#percona_command' do
|
@@ -47,7 +53,7 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
47
53
|
|
48
54
|
should 'set missing flags to default values' do
|
49
55
|
flags_with_defaults = ActiveRecord::PtOscMigration.percona_flags.select do |flag, config|
|
50
|
-
config.key?(:default) && flag != 'execute'
|
56
|
+
config.key?(:default) && flag != 'execute' && !config[:boolean]
|
51
57
|
end
|
52
58
|
|
53
59
|
command = @migration.send(:percona_command, '', '', '')
|
@@ -58,6 +64,78 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
58
64
|
end
|
59
65
|
end
|
60
66
|
|
67
|
+
context 'with flags having version requirements' do
|
68
|
+
setup do
|
69
|
+
flags = ActiveRecord::PtOscMigration.percona_flags.merge({ 'flag-with-requirement' => { version: '> 2.0' } })
|
70
|
+
ActiveRecord::PtOscMigration.stubs(:percona_flags).returns(flags)
|
71
|
+
end
|
72
|
+
|
73
|
+
teardown do
|
74
|
+
ActiveRecord::PtOscMigration.unstub(:percona_flags)
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'with matching tool version' do
|
78
|
+
setup do
|
79
|
+
@old_tool_version = @tool_version.current_state
|
80
|
+
ActiveRecord::PtOscMigration.stubs(:tool_version).returns(Gem::Version.new('2.6.40')).when(@tool_version.is('2.6.40'))
|
81
|
+
@tool_version.become('2.6.40')
|
82
|
+
end
|
83
|
+
|
84
|
+
teardown do
|
85
|
+
@tool_version.become(@old_tool_version)
|
86
|
+
end
|
87
|
+
|
88
|
+
should 'contain the flag in the output' do
|
89
|
+
command = @migration.send(:percona_command, '', '', '', 'flag-with-requirement' => 'foobar')
|
90
|
+
assert command.include?('--flag-with-requirement foobar'),
|
91
|
+
"Flag was not included in command '#{command}' despite meeting version requirement."
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'with non-matching tool version' do
|
96
|
+
setup do
|
97
|
+
@old_tool_version = @tool_version.current_state
|
98
|
+
ActiveRecord::PtOscMigration.stubs(:tool_version).returns(Gem::Version.new('1.12')).when(@tool_version.is('1.12'))
|
99
|
+
@tool_version.become('1.12')
|
100
|
+
end
|
101
|
+
|
102
|
+
teardown do
|
103
|
+
@tool_version.become(@old_tool_version)
|
104
|
+
end
|
105
|
+
|
106
|
+
should 'not contain the flag in the output' do
|
107
|
+
command = @migration.send(:percona_command, '', '', '', 'flag-with-requirement' => 'foobar')
|
108
|
+
assert_equal false, command.include?('--flag-with-requirement'),
|
109
|
+
"Flag was included in command '#{command}' despite not meeting version requirement."
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'with boolean flags' do
|
115
|
+
setup do
|
116
|
+
flags = ActiveRecord::PtOscMigration.percona_flags.merge({ 'boolean-flag' => { boolean: true } })
|
117
|
+
ActiveRecord::PtOscMigration.stubs(:percona_flags).returns(flags)
|
118
|
+
end
|
119
|
+
|
120
|
+
teardown do
|
121
|
+
ActiveRecord::PtOscMigration.unstub(:percona_flags)
|
122
|
+
end
|
123
|
+
|
124
|
+
should 'include just the flag (no value) when true' do
|
125
|
+
command = @migration.send(:percona_command, '', '', '', 'boolean-flag' => true)
|
126
|
+
matches_eof = command =~ /\-\-boolean\-flag\s*$/
|
127
|
+
matches_middle = command =~ /\-\-boolean\-flag\s*\-\-/
|
128
|
+
assert matches_eof || matches_middle, "Boolean flag was malformed in command '#{command}'."
|
129
|
+
end
|
130
|
+
|
131
|
+
should 'include a "no" version of the flag when false' do
|
132
|
+
command = @migration.send(:percona_command, '', '', '', 'boolean-flag' => false)
|
133
|
+
matches_eof = command =~ /\-\-no\-boolean\-flag\s*$/
|
134
|
+
matches_middle = command =~ /\-\-no\-boolean\-flag\s*\-\-/
|
135
|
+
assert matches_eof || matches_middle, "Boolean flag was malformed in command '#{command}'."
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
61
139
|
should 'perform a dry run if execute not specified' do
|
62
140
|
command = @migration.send(:percona_command, '', '', '')
|
63
141
|
assert command.include?('--dry-run')
|
@@ -76,7 +154,7 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
76
154
|
end
|
77
155
|
|
78
156
|
should 'call #make_path_absolute' do
|
79
|
-
@migration.expects(:make_path_absolute).with(@path)
|
157
|
+
@migration.expects(:make_path_absolute).with(@path, anything)
|
80
158
|
@migration.send(:percona_command, '', '', '', @options)
|
81
159
|
end
|
82
160
|
end
|
@@ -193,6 +271,24 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
193
271
|
end
|
194
272
|
end
|
195
273
|
|
274
|
+
context '#execute_only' do
|
275
|
+
should 'return the default flag value during a dry run' do
|
276
|
+
ActiveRecord::PtOscMigration.stubs(:percona_flags).returns('foo' => { default: 'bar' })
|
277
|
+
assert_equal 'bar', @migration.send(:execute_only, 'baz', all_options: { execute: false }, flag_name: 'foo')
|
278
|
+
ActiveRecord::PtOscMigration.unstub(:percona_flags)
|
279
|
+
end
|
280
|
+
|
281
|
+
should 'return nil during a dry run if there is no default value' do
|
282
|
+
ActiveRecord::PtOscMigration.stubs(:percona_flags).returns('foo' => {})
|
283
|
+
assert_nil @migration.send(:execute_only, 'baz', all_options: { execute: false }, flag_name: 'foo')
|
284
|
+
ActiveRecord::PtOscMigration.unstub(:percona_flags)
|
285
|
+
end
|
286
|
+
|
287
|
+
should 'pass the flag through when executing' do
|
288
|
+
assert_equal 'baz', @migration.send(:execute_only, 'baz', all_options: { execute: true }, flag_name: 'foo')
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
196
292
|
context '#execute_pt_osc' do
|
197
293
|
context 'with a pt-osc connection' do
|
198
294
|
setup do
|
@@ -425,4 +521,21 @@ class PtOscMigrationUnitTest < Test::Unit::TestCase
|
|
425
521
|
end
|
426
522
|
end
|
427
523
|
end
|
524
|
+
|
525
|
+
context '#tool_version' do
|
526
|
+
context 'with known tool version' do
|
527
|
+
setup do
|
528
|
+
ActiveRecord::PtOscMigration.stubs(:get_tool_version).returns('pt-online-schema-change 2.2.7')
|
529
|
+
end
|
530
|
+
|
531
|
+
teardown do
|
532
|
+
ActiveRecord::PtOscMigration.unstub(:get_tool_version)
|
533
|
+
end
|
534
|
+
|
535
|
+
should 'return a Gem::Version with the expected value' do
|
536
|
+
assert_instance_of Gem::Version, ActiveRecord::PtOscMigration.send(:tool_version)
|
537
|
+
assert_equal '2.2.7', ActiveRecord::PtOscMigration.send(:tool_version).version
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
428
541
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pt-osc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -82,7 +82,7 @@ dependencies:
|
|
82
82
|
requirements:
|
83
83
|
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: 0.9.0
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,7 @@ dependencies:
|
|
90
90
|
requirements:
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
93
|
+
version: 0.9.0
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: rails
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -246,7 +246,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
246
246
|
version: '0'
|
247
247
|
segments:
|
248
248
|
- 0
|
249
|
-
hash:
|
249
|
+
hash: 2714793465659180068
|
250
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
251
|
none: false
|
252
252
|
requirements:
|
@@ -255,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
255
|
version: '0'
|
256
256
|
segments:
|
257
257
|
- 0
|
258
|
-
hash:
|
258
|
+
hash: 2714793465659180068
|
259
259
|
requirements: []
|
260
260
|
rubyforge_project:
|
261
261
|
rubygems_version: 1.8.23
|