departure-76c9880 6.2.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.
- checksums.yaml +7 -0
- data/.codeclimate.yml +8 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +60 -0
- data/.travis.yml +30 -0
- data/CHANGELOG.md +192 -0
- data/CODE_OF_CONDUCT.md +50 -0
- data/Dockerfile +32 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +227 -0
- data/RELEASING.md +17 -0
- data/Rakefile +17 -0
- data/bin/console +14 -0
- data/bin/rspec +16 -0
- data/bin/setup +7 -0
- data/config.yml.erb +4 -0
- data/configuration.rb +16 -0
- data/departure.gemspec +35 -0
- data/docker-compose.yml +23 -0
- data/lib/active_record/connection_adapters/for_alter.rb +91 -0
- data/lib/active_record/connection_adapters/percona_adapter.rb +168 -0
- data/lib/departure.rb +43 -0
- data/lib/departure/alter_argument.rb +49 -0
- data/lib/departure/cli_generator.rb +84 -0
- data/lib/departure/command.rb +96 -0
- data/lib/departure/configuration.rb +20 -0
- data/lib/departure/connection_base.rb +9 -0
- data/lib/departure/connection_details.rb +96 -0
- data/lib/departure/dsn.rb +24 -0
- data/lib/departure/errors.rb +39 -0
- data/lib/departure/log_sanitizers/password_sanitizer.rb +22 -0
- data/lib/departure/logger.rb +42 -0
- data/lib/departure/logger_factory.rb +16 -0
- data/lib/departure/migration.rb +96 -0
- data/lib/departure/null_logger.rb +15 -0
- data/lib/departure/option.rb +75 -0
- data/lib/departure/railtie.rb +21 -0
- data/lib/departure/runner.rb +62 -0
- data/lib/departure/user_options.rb +44 -0
- data/lib/departure/version.rb +3 -0
- data/lib/lhm.rb +23 -0
- data/lib/lhm/adapter.rb +107 -0
- data/lib/lhm/column_with_sql.rb +96 -0
- data/lib/lhm/column_with_type.rb +29 -0
- data/test_database.rb +80 -0
- metadata +245 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Lhm
|
4
|
+
# Abstracts the details of a table column definition when specified with a MySQL
|
5
|
+
# column definition string
|
6
|
+
class ColumnWithSql
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
# Returns the column's class to be used
|
10
|
+
#
|
11
|
+
# @return [Constant]
|
12
|
+
def self.column_factory
|
13
|
+
::ActiveRecord::ConnectionAdapters::DepartureAdapter::Column
|
14
|
+
end
|
15
|
+
|
16
|
+
# Constructor
|
17
|
+
#
|
18
|
+
# @param name [String, Symbol]
|
19
|
+
# @param definition [String]
|
20
|
+
def initialize(name, definition)
|
21
|
+
@name = name
|
22
|
+
@definition = definition
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the column data as an Array to be used with the splat operator.
|
26
|
+
# See Lhm::Adaper#add_column
|
27
|
+
#
|
28
|
+
# @return [Array]
|
29
|
+
def attributes
|
30
|
+
[type, column_options]
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def_delegators :column, :limit, :type, :default, :null
|
36
|
+
|
37
|
+
attr_reader :name, :definition
|
38
|
+
|
39
|
+
# TODO: investigate
|
40
|
+
#
|
41
|
+
# Rails doesn't take into account lenght argument of INT in the
|
42
|
+
# definition, as an integer it will default it to 4 not an integer
|
43
|
+
#
|
44
|
+
# Returns the columns data as a Hash
|
45
|
+
#
|
46
|
+
# @return [Hash]
|
47
|
+
def column_options
|
48
|
+
{ limit: column.limit, default: column.default, null: column.null }
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the column instance with the provided data
|
52
|
+
#
|
53
|
+
# @return [column_factory]
|
54
|
+
def column
|
55
|
+
cast_type = ActiveRecord::Base.connection.send(:lookup_cast_type, definition)
|
56
|
+
metadata = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(
|
57
|
+
type: cast_type.type,
|
58
|
+
sql_type: definition,
|
59
|
+
limit: cast_type.limit
|
60
|
+
)
|
61
|
+
mysql_metadata = ActiveRecord::ConnectionAdapters::MySQL::TypeMetadata.new(metadata)
|
62
|
+
@column ||= self.class.column_factory.new(
|
63
|
+
name,
|
64
|
+
default_value,
|
65
|
+
mysql_metadata,
|
66
|
+
null_value
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Gets the DEFAULT value the column takes as specified in the
|
71
|
+
# definition, if any
|
72
|
+
#
|
73
|
+
# @return [String, NilClass]
|
74
|
+
def default_value
|
75
|
+
match = if definition =~ /timestamp|datetime/i
|
76
|
+
/default '?(.+[^'])'?/i.match(definition)
|
77
|
+
else
|
78
|
+
/default '?(\w+)'?/i.match(definition)
|
79
|
+
end
|
80
|
+
|
81
|
+
return unless match
|
82
|
+
|
83
|
+
match[1].downcase != 'null' ? match[1] : nil
|
84
|
+
end
|
85
|
+
|
86
|
+
# Checks whether the column accepts NULL as specified in the definition
|
87
|
+
#
|
88
|
+
# @return [Boolean]
|
89
|
+
def null_value
|
90
|
+
match = /((\w*) NULL)/i.match(definition)
|
91
|
+
return true unless match
|
92
|
+
|
93
|
+
match[2].downcase == 'not' ? false : true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Lhm
|
2
|
+
# Abstracts the details of a table column definition when specified with a type
|
3
|
+
# as a symbol. This is the regular ActiveRecord's #add_column syntax:
|
4
|
+
#
|
5
|
+
# add_column :tablenames, :field, :string
|
6
|
+
#
|
7
|
+
class ColumnWithType
|
8
|
+
# Constructor
|
9
|
+
#
|
10
|
+
# @param name [String, Symbol]
|
11
|
+
# @param definition [Symbol]
|
12
|
+
def initialize(name, definition)
|
13
|
+
@name = name
|
14
|
+
@definition = definition
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns the column data as an Array to be used with the splat operator.
|
18
|
+
# See Lhm::Adaper#add_column
|
19
|
+
#
|
20
|
+
# @return [Array]
|
21
|
+
def attributes
|
22
|
+
[definition]
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :definition
|
28
|
+
end
|
29
|
+
end
|
data/test_database.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_record/connection_adapters/mysql2_adapter'
|
3
|
+
|
4
|
+
# Setups the test database with the schema_migrations table that ActiveRecord
|
5
|
+
# requires for the migrations, plus a table for the Comment model used throught
|
6
|
+
# the tests.
|
7
|
+
#
|
8
|
+
class TestDatabase
|
9
|
+
# Constructor
|
10
|
+
#
|
11
|
+
# @param config [Hash]
|
12
|
+
def initialize(config)
|
13
|
+
@config = config
|
14
|
+
@database = config['database']
|
15
|
+
end
|
16
|
+
|
17
|
+
# Creates the test database, the schema_migrations and the comments tables.
|
18
|
+
# It drops any of them if they already exist
|
19
|
+
def setup
|
20
|
+
setup_test_database
|
21
|
+
drop_and_create_schema_migrations_table
|
22
|
+
end
|
23
|
+
|
24
|
+
# Creates the #{@database} database and the comments table in it.
|
25
|
+
# Before, it drops both if they already exist
|
26
|
+
def setup_test_database
|
27
|
+
drop_and_create_test_database
|
28
|
+
drop_and_create_comments_table
|
29
|
+
end
|
30
|
+
|
31
|
+
# Creates the ActiveRecord's schema_migrations table required for
|
32
|
+
# migrations to work. Before, it drops the table if it already exists
|
33
|
+
def drop_and_create_schema_migrations_table
|
34
|
+
sql = [
|
35
|
+
"USE #{@database}",
|
36
|
+
'DROP TABLE IF EXISTS schema_migrations',
|
37
|
+
'CREATE TABLE schema_migrations ( version varchar(255) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY unique_schema_migrations (version)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
|
38
|
+
]
|
39
|
+
|
40
|
+
run_commands(sql)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
attr_reader :config, :database
|
46
|
+
|
47
|
+
def drop_and_create_test_database
|
48
|
+
sql = [
|
49
|
+
"DROP DATABASE IF EXISTS #{@database}",
|
50
|
+
"CREATE DATABASE #{@database} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci"
|
51
|
+
]
|
52
|
+
|
53
|
+
run_commands(sql)
|
54
|
+
end
|
55
|
+
|
56
|
+
def drop_and_create_comments_table
|
57
|
+
sql = [
|
58
|
+
"USE #{@database}",
|
59
|
+
'DROP TABLE IF EXISTS comments',
|
60
|
+
'CREATE TABLE comments ( id bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
|
61
|
+
]
|
62
|
+
|
63
|
+
run_commands(sql)
|
64
|
+
end
|
65
|
+
|
66
|
+
def run_commands(sql)
|
67
|
+
conn.execute('START TRANSACTION')
|
68
|
+
sql.each { |str| conn.execute(str) }
|
69
|
+
conn.execute('COMMIT')
|
70
|
+
end
|
71
|
+
|
72
|
+
def conn
|
73
|
+
@conn ||= ActiveRecord::Base.mysql2_connection(
|
74
|
+
host: @config['hostname'],
|
75
|
+
username: @config['username'],
|
76
|
+
password: @config['password'],
|
77
|
+
reconnect: true
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,245 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: departure-76c9880
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 6.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ilya Zayats
|
8
|
+
- Pau Pérez
|
9
|
+
- Fran Casas
|
10
|
+
- Jorge Morante
|
11
|
+
- Enrico Stano
|
12
|
+
- Adrian Serafin
|
13
|
+
- Kirk Haines
|
14
|
+
- Guillermo Iguaran
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
date: 2020-11-11 00:00:00.000000000 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: railties
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 5.2.0
|
27
|
+
- - "<"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '6.1'
|
30
|
+
type: :runtime
|
31
|
+
prerelease: false
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 5.2.0
|
37
|
+
- - "<"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '6.1'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: activerecord
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 5.2.0
|
47
|
+
- - "<"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '6.1'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 5.2.0
|
57
|
+
- - "<"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '6.1'
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: mysql2
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.4.0
|
67
|
+
- - "<="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.5.3
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ">="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.4.0
|
77
|
+
- - "<="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.5.3
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rake
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - "~>"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '10.0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '10.0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: rspec
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '3.4'
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.4.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '3.4'
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: 3.4.0
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: rspec-its
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '1.2'
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - "~>"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '1.2'
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: byebug
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - "~>"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '8.2'
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 8.2.1
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - "~>"
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '8.2'
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 8.2.1
|
148
|
+
- !ruby/object:Gem::Dependency
|
149
|
+
name: climate_control
|
150
|
+
requirement: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - "~>"
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 0.0.3
|
155
|
+
type: :development
|
156
|
+
prerelease: false
|
157
|
+
version_requirements: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - "~>"
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: 0.0.3
|
162
|
+
description: Execute your ActiveRecord migrations with Percona's pt-online-schema-change.
|
163
|
+
Formerly known as Percona Migrator.
|
164
|
+
email:
|
165
|
+
- ilya.zayats@redbooth.com
|
166
|
+
- pau.perez@redbooth.com
|
167
|
+
- nflamel@gmail.com
|
168
|
+
- jorge.morante@redbooth.com
|
169
|
+
- adrian@softmad.pl
|
170
|
+
- wyhaines@gmail.com
|
171
|
+
- guilleiguaran@gmail.com
|
172
|
+
executables: []
|
173
|
+
extensions: []
|
174
|
+
extra_rdoc_files: []
|
175
|
+
files:
|
176
|
+
- ".codeclimate.yml"
|
177
|
+
- ".gitignore"
|
178
|
+
- ".rspec"
|
179
|
+
- ".rubocop.yml"
|
180
|
+
- ".travis.yml"
|
181
|
+
- CHANGELOG.md
|
182
|
+
- CODE_OF_CONDUCT.md
|
183
|
+
- Dockerfile
|
184
|
+
- Gemfile
|
185
|
+
- LICENSE.txt
|
186
|
+
- README.md
|
187
|
+
- RELEASING.md
|
188
|
+
- Rakefile
|
189
|
+
- bin/console
|
190
|
+
- bin/rspec
|
191
|
+
- bin/setup
|
192
|
+
- config.yml.erb
|
193
|
+
- configuration.rb
|
194
|
+
- departure.gemspec
|
195
|
+
- docker-compose.yml
|
196
|
+
- lib/active_record/connection_adapters/for_alter.rb
|
197
|
+
- lib/active_record/connection_adapters/percona_adapter.rb
|
198
|
+
- lib/departure.rb
|
199
|
+
- lib/departure/alter_argument.rb
|
200
|
+
- lib/departure/cli_generator.rb
|
201
|
+
- lib/departure/command.rb
|
202
|
+
- lib/departure/configuration.rb
|
203
|
+
- lib/departure/connection_base.rb
|
204
|
+
- lib/departure/connection_details.rb
|
205
|
+
- lib/departure/dsn.rb
|
206
|
+
- lib/departure/errors.rb
|
207
|
+
- lib/departure/log_sanitizers/password_sanitizer.rb
|
208
|
+
- lib/departure/logger.rb
|
209
|
+
- lib/departure/logger_factory.rb
|
210
|
+
- lib/departure/migration.rb
|
211
|
+
- lib/departure/null_logger.rb
|
212
|
+
- lib/departure/option.rb
|
213
|
+
- lib/departure/railtie.rb
|
214
|
+
- lib/departure/runner.rb
|
215
|
+
- lib/departure/user_options.rb
|
216
|
+
- lib/departure/version.rb
|
217
|
+
- lib/lhm.rb
|
218
|
+
- lib/lhm/adapter.rb
|
219
|
+
- lib/lhm/column_with_sql.rb
|
220
|
+
- lib/lhm/column_with_type.rb
|
221
|
+
- test_database.rb
|
222
|
+
homepage: https://github.com/departurerb/departure
|
223
|
+
licenses:
|
224
|
+
- MIT
|
225
|
+
metadata: {}
|
226
|
+
post_install_message:
|
227
|
+
rdoc_options: []
|
228
|
+
require_paths:
|
229
|
+
- lib
|
230
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
231
|
+
requirements:
|
232
|
+
- - ">="
|
233
|
+
- !ruby/object:Gem::Version
|
234
|
+
version: '0'
|
235
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
236
|
+
requirements:
|
237
|
+
- - ">="
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
240
|
+
requirements: []
|
241
|
+
rubygems_version: 3.1.4
|
242
|
+
signing_key:
|
243
|
+
specification_version: 4
|
244
|
+
summary: pt-online-schema-change runner for ActiveRecord migrations
|
245
|
+
test_files: []
|