departure 4.0.1 → 5.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89a3f4d1cb84878f4a556da1439057a2dc8a402e
4
- data.tar.gz: c6b8f26150c220f793ef021b7dc1d7ceb0a7ebe7
3
+ metadata.gz: 188abb75d64bc512bba775dfe589294bdf3bd075
4
+ data.tar.gz: 7c06bd461fe3c1a8756a6be3ebf38cc6aad7a9e6
5
5
  SHA512:
6
- metadata.gz: 66727be4d155815b20da61075f06ddf5e94665e165a3cc9f5ebada94f96e63ac8940efc555a812a127fa013533feb2f3bc0e9342aa5ca0ca699ff8044f000efb
7
- data.tar.gz: 89ae513dd2268fddea60c3e11325fcdc309ae02283b74d07a719b77ecf8df968d041d7d92af8d6a35f36d8b341e826a2ce6c42ac9154dec5606cf0da18462daa
6
+ metadata.gz: fcdc8acbd5a3e40643a745b29423eda2dab89e7b919d6248eb3b73d64c9371bf50874d089790f05012b09845ffe4040ebaee9b9bdc1c01a0043d1ee6d26fa96c
7
+ data.tar.gz: 1a7933c409ab19e804849a60dd0507d9c6861c9deeadb141fcf03a3022a134dd0c124d56d4911033e2d096aed1b6eb249669f97dbaf8d1eda903d09d0455c744
@@ -0,0 +1,8 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ channel: rubocop-0-49
6
+ ratings:
7
+ paths:
8
+ - "**.rb"
@@ -0,0 +1,60 @@
1
+ ---
2
+ Metrics/AbcSize:
3
+ Enabled: false
4
+
5
+ Metrics/BlockLength:
6
+ Max: 20
7
+ Exclude:
8
+ - 'spec/*'
9
+ - 'spec/**/*'
10
+
11
+ Metrics/BlockNesting:
12
+ Max: 4
13
+
14
+ Metrics/ClassLength:
15
+ Max: 250
16
+
17
+ Metrics/LineLength:
18
+ Max: 120
19
+ Exclude:
20
+ - 'departure.gemspec'
21
+ - 'test_database.rb'
22
+
23
+ Metrics/MethodLength:
24
+ Max: 30
25
+
26
+ Metrics/ModuleLength:
27
+ Max: 250
28
+
29
+ Metrics/ParameterLists:
30
+ Max: 5
31
+
32
+ Performance/Casecmp:
33
+ Enabled: false
34
+
35
+ Style/BracesAroundHashParameters:
36
+ Exclude:
37
+ - 'spec/fixtures/migrate/**.rb'
38
+ - 'spec/integration/**.rb'
39
+
40
+ Style/CommandLiteral:
41
+ Exclude:
42
+ - 'test_database.rb'
43
+
44
+ Style/Documentation:
45
+ Enabled: false
46
+
47
+ Style/MultilineBlockChain:
48
+ Exclude:
49
+ - 'spec/integration_spec.rb'
50
+
51
+ Style/MultilineMethodCallIndentation:
52
+ Enabled: false
53
+
54
+ Style/SymbolArray:
55
+ Enabled: false
56
+
57
+ Style/UnneededPercentQ:
58
+ Exclude:
59
+ - 'departure.gemspec'
60
+
@@ -4,14 +4,20 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  Please follow the format in [Keep a Changelog](http://keepachangelog.com/)
6
6
 
7
- ## [Unreleased]
7
+ ## [5.0.0] - 2017-09-19
8
8
 
9
9
  ### Added
10
+
11
+ - Support for ActiveRecord 5.0
12
+ - Docker setup to run the spec suite
13
+
10
14
  ### Changed
11
15
  ### Deprecated
12
16
  ### Removed
13
17
  ### Fixed
14
18
 
19
+ - Allow using bash special characters in passwords
20
+
15
21
  ## [4.0.1] - 2017-08-01
16
22
 
17
23
  ### Added
@@ -0,0 +1,32 @@
1
+ FROM ruby:2.3.4
2
+ MAINTAINER muffinista@gmail.com
3
+
4
+ # Install apt based dependencies required to run Rails as
5
+ # well as RubyGems. As the Ruby image itself is based on a
6
+ # Debian image, we use apt-get to install those.
7
+ RUN apt-get update && apt-get install -y \
8
+ build-essential \
9
+ percona-toolkit
10
+
11
+ # Configure the main working directory. This is the base
12
+ # directory used in any further RUN, COPY, and ENTRYPOINT
13
+ # commands.
14
+ RUN mkdir -p /app /app/lib/departure
15
+ WORKDIR /app
16
+
17
+ # Copy the Gemfile as well as the Gemfile.lock and install
18
+ # the RubyGems. This is a separate step so the dependencies
19
+ # will be cached unless changes to one of those two files
20
+ # are made.
21
+ COPY departure.gemspec Gemfile ./
22
+ COPY lib/departure/version.rb ./lib/departure/
23
+
24
+ RUN gem install bundler && bundle install --jobs 20 --retry 5
25
+
26
+ # Copy the main application.
27
+ COPY . ./
28
+
29
+ # The main command to run when the container starts. Also
30
+ # tell the Rails dev server to bind to all interfaces by
31
+ # default.
32
+ #CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
data/Gemfile CHANGED
@@ -2,4 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- gem "codeclimate-test-reporter", '~> 1.0.3', group: :test, require: nil
5
+ gem 'codeclimate-test-reporter', '~> 1.0.3', group: :test, require: nil
6
+ gem 'rubocop', '~> 0.49.1', require: false
data/README.md CHANGED
@@ -117,10 +117,10 @@ Departure.configure do |config|
117
117
  end
118
118
  ```
119
119
 
120
- Unlike using `PERCONA_ARGS`, options provided with global configuration will be applied
120
+ Unlike using `PERCONA_ARGS`, options provided with global configuration will be applied
121
121
  every time sql command is executed via `pt-online-schema-change`.
122
-
123
- Arguments provided in global configuration can be overwritten with `PERCONA_ARGS` env variable.
122
+
123
+ Arguments provided in global configuration can be overwritten with `PERCONA_ARGS` env variable.
124
124
 
125
125
  We recommend using this option with caution and only when you understand the consequences.
126
126
 
@@ -171,6 +171,12 @@ When an any error occurs, an `ActiveRecord::StatementInvalid` exception is
171
171
  raised and the migration is aborted, as all other ActiveRecord connection
172
172
  adapters.
173
173
 
174
+ ## Trouleshooting
175
+
176
+ ### Error creating new table: DBD::mysql::db do failed: Can't write; duplicate key in table (TABLE_NAME)
177
+ There is a [known bug](https://bugs.launchpad.net/percona-toolkit/+bug/1498128) in percona-toolkit version 2.2.15
178
+ that prevents schema changes when a table has constraints. You should upgrade to a version later than 2.2.17 to fix the issue.
179
+
174
180
  ## Development
175
181
 
176
182
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "percona_migrator"
3
+ require 'bundler/setup'
4
+ require 'percona_migrator'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "percona_migrator"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start
data/bin/rspec CHANGED
@@ -1,17 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
- #
3
+
4
4
  # This file was generated by Bundler.
5
5
  #
6
6
  # The application 'rspec' is installed as part of a gem, and
7
7
  # this file is here to facilitate running it.
8
8
  #
9
9
 
10
- require "pathname"
11
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
- Pathname.new(__FILE__).realpath)
10
+ require 'pathname'
11
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', Pathname.new(__FILE__).realpath)
13
12
 
14
- require "rubygems"
15
- require "bundler/setup"
13
+ require 'rubygems'
14
+ require 'bundler/setup'
16
15
 
17
- load Gem.bin_path("rspec-core", "rspec")
16
+ load Gem.bin_path('rspec-core', 'rspec')
@@ -0,0 +1,4 @@
1
+ username: <%= ENV['PERCONA_DB_USER'] || 'root' %>
2
+ password: <%= ENV['PERCONA_DB_PASSWORD'] || '' %>
3
+ database: <%= ENV['PERCONA_DB_NAME'] || 'departure_test' %>
4
+ hostname: <%= ENV['PERCONA_DB_HOST'] || 'localhost' %>
@@ -1,12 +1,13 @@
1
1
  require 'yaml'
2
+ require 'erb'
2
3
 
3
4
  class Configuration
4
- CONFIG_PATH = 'config.yml'
5
+ CONFIG_PATH = 'config.yml.erb'.freeze
5
6
 
6
7
  attr_reader :config
7
8
 
8
9
  def initialize
9
- @config = YAML.load_file(CONFIG_PATH)
10
+ @config = YAML.load(ERB.new(File.read(CONFIG_PATH)).result).freeze
10
11
  end
11
12
 
12
13
  def [](key)
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
 
@@ -7,21 +8,20 @@ require 'departure/version'
7
8
  Gem::Specification.new do |spec|
8
9
  spec.name = 'departure'
9
10
  spec.version = Departure::VERSION
10
- spec.authors = ['Ilya Zayats', 'Pau Pérez', 'Fran Casas', 'Jorge Morante', 'Enrico Stano', 'Adrian Serafin']
11
- spec.email = ['ilya.zayats@redbooth.com', 'pau.perez@redbooth.com', 'fran.casas@redbooth.com', 'jorge.morante@redbooth.com', 'adrian@softmad.pl']
11
+ spec.authors = ['Ilya Zayats', 'Pau Pérez', 'Fran Casas', 'Jorge Morante', 'Enrico Stano', 'Adrian Serafin', 'Kirk Haines']
12
+ spec.email = ['ilya.zayats@redbooth.com', 'pau.perez@redbooth.com', 'fran.casas@redbooth.com', 'jorge.morante@redbooth.com', 'adrian@softmad.pl', 'wyhaines@gmail.com']
12
13
 
13
- spec.summary = %q{pt-online-schema-change runner for ActiveRecord migrations}
14
- spec.description = %q{Execute your ActiveRecord migrations with Percona's pt-online-schema-change. Formerly known as Percona Migrator.}
14
+ spec.summary = %q(pt-online-schema-change runner for ActiveRecord migrations)
15
+ spec.description = %q(Execute your ActiveRecord migrations with Percona's pt-online-schema-change. Formerly known as Percona Migrator.)
15
16
  spec.homepage = 'http://github.com/redbooth/departure'
16
17
  spec.license = 'MIT'
17
18
 
18
19
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
20
  spec.require_paths = ['lib']
20
21
 
21
- spec.add_runtime_dependency 'rails', '~> 4.2.0'
22
+ spec.add_runtime_dependency 'rails', '~> 5.0.0'
22
23
  spec.add_runtime_dependency 'mysql2', '~> 0.4.0'
23
24
 
24
- spec.add_development_dependency 'bundler', '~> 1.10'
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
26
  spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
27
27
  spec.add_development_dependency 'rspec-its', '~> 1.2'
@@ -0,0 +1,23 @@
1
+ version: '2'
2
+ services:
3
+ db:
4
+ image: mysql/mysql-server
5
+ ports:
6
+ - "3306:3306"
7
+ environment:
8
+ MYSQL_DATABASE: departure_test
9
+ MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
10
+ MYSQL_ROOT_HOST: '%'
11
+ rails:
12
+ build: .
13
+ links:
14
+ - db
15
+ depends_on:
16
+ - db
17
+ tty: true
18
+ stdin_open: true
19
+ environment:
20
+ PERCONA_DB_USER: root
21
+ PERCONA_DB_HOST: db
22
+ PERCONA_DB_PASSWORD:
23
+ PERCONA_DB_NAME: departure_test
@@ -41,7 +41,7 @@ module ActiveRecord
41
41
  module ConnectionAdapters
42
42
  class DepartureAdapter < AbstractMysqlAdapter
43
43
 
44
- class Column < AbstractMysqlAdapter::Column
44
+ class Column < ActiveRecord::ConnectionAdapters::MySQL::Column
45
45
  def adapter
46
46
  DepartureAdapter
47
47
  end
@@ -54,18 +54,18 @@ module ActiveRecord
54
54
  def_delegators :mysql_adapter, :last_inserted_id, :each_hash, :set_field_encoding
55
55
 
56
56
  def initialize(connection, _logger, connection_options, _config)
57
+ @mysql_adapter = connection_options[:mysql_adapter]
57
58
  super
58
59
  @prepared_statements = false
59
- @mysql_adapter = connection_options[:mysql_adapter]
60
60
  end
61
61
 
62
62
  def exec_delete(sql, name, binds)
63
63
  execute(to_sql(sql, binds), name)
64
64
  @connection.affected_rows
65
65
  end
66
- alias :exec_update :exec_delete
66
+ alias exec_update exec_delete
67
67
 
68
- def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
68
+ def exec_insert(sql, name, binds, pk = nil, sequence_name = nil) # rubocop:disable Lint/UnusedMethodArgument, Metrics/LineLength
69
69
  execute(to_sql(sql, binds), name)
70
70
  end
71
71
 
@@ -76,8 +76,9 @@ module ActiveRecord
76
76
 
77
77
  # Executes a SELECT query and returns an array of rows. Each row is an
78
78
  # array of field values.
79
- def select_rows(sql, name = nil)
80
- execute(sql, name).to_a
79
+
80
+ def select_rows(arel, name = nil, binds = [])
81
+ select_all(arel, name, binds).rows
81
82
  end
82
83
 
83
84
  # Executes a SELECT query and returns an array of record hashes with the
@@ -91,9 +92,11 @@ module ActiveRecord
91
92
  true
92
93
  end
93
94
 
94
- def new_column(field, default, cast_type, sql_type = nil, null = true, collation = '', extra = '')
95
- Column.new(field, default, cast_type, sql_type, null, collation, strict_mode?, extra)
95
+ # rubocop:disable Metrics/ParameterLists
96
+ def new_column(field, default, type_metadata, null, table_name, default_function, collation, comment)
97
+ Column.new(field, default, type_metadata, null, table_name, default_function, collation, comment)
96
98
  end
99
+ # rubocop:enable Metrics/ParameterLists
97
100
 
98
101
  # Adds a new index to the table
99
102
  #
@@ -102,7 +105,7 @@ module ActiveRecord
102
105
  # @param options [Hash] optional
103
106
  def add_index(table_name, column_name, options = {})
104
107
  index_name, index_type, index_columns, index_options = add_index_options(table_name, column_name, options)
105
- execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{index_type} INDEX #{quote_column_name(index_name)} (#{index_columns})#{index_options}"
108
+ execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{index_type} INDEX #{quote_column_name(index_name)} (#{index_columns})#{index_options}" # rubocop:disable Metrics/LineLength
106
109
  end
107
110
 
108
111
  # Remove the given index from the table.
@@ -116,8 +119,7 @@ module ActiveRecord
116
119
 
117
120
  # Returns the MySQL error number from the exception. The
118
121
  # AbstractMysqlAdapter requires it to be implemented
119
- def error_number(_exception)
120
- end
122
+ def error_number(_exception); end
121
123
 
122
124
  def full_version
123
125
  mysql_adapter.raw_connection.server_info[:version]
@@ -32,7 +32,7 @@ module Departure
32
32
  def self.load
33
33
  ActiveRecord::Migrator.instance_eval do
34
34
  class << self
35
- alias_method(:original_migrate, :migrate)
35
+ alias original_migrate migrate
36
36
  end
37
37
 
38
38
  # Checks whether arguments are being passed through PERCONA_ARGS when running
@@ -37,7 +37,7 @@ module Departure
37
37
  def parsed_statement
38
38
  @parsed_statement ||= statement
39
39
  .gsub(ALTER_TABLE_REGEX, '')
40
- .gsub('`','\\\`')
40
+ .gsub('`', '\\\`')
41
41
  end
42
42
  end
43
43
  end
@@ -5,12 +5,11 @@ require 'departure/connection_details'
5
5
  require 'departure/user_options'
6
6
 
7
7
  module Departure
8
-
9
8
  # Generates the equivalent Percona's pt-online-schema-change command to the
10
9
  # given SQL statement
11
10
  #
12
- # --no-check-alter is used to allow running CHANGE COLUMN statements. For
13
- # more details, check: www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html#cmdoption-pt-online-schema-change--[no]check-alter
11
+ # --no-check-alter is used to allow running CHANGE COLUMN statements. For more details, check:
12
+ # www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html#cmdoption-pt-online-schema-change--[no]check-alter # rubocop:disable Metrics/LineLength
14
13
  #
15
14
  class CliGenerator
16
15
  COMMAND_NAME = 'pt-online-schema-change'.freeze
@@ -47,7 +47,7 @@ module Departure
47
47
  data = stdout.read_nonblock(8)
48
48
  logger.write_no_newline(data)
49
49
  end
50
- rescue EOFError
50
+ rescue EOFError # rubocop:disable Lint/HandleExceptions
51
51
  # noop
52
52
  ensure
53
53
  @status = waith_thr.value
@@ -69,7 +69,7 @@ module Departure
69
69
  # @raise [SignalError] if the spawned process received a signal
70
70
  # @raise [CommandNotFoundError] if pt-online-schema-change can't be found
71
71
  def validate_status!
72
- raise SignalError.new(status) if status.signaled?
72
+ raise SignalError.new(status) if status.signaled? # rubocop:disable Style/RaiseArgs
73
73
  raise CommandNotFoundError if status.exitstatus == COMMAND_NOT_FOUND
74
74
  raise Error, error_message unless status.success?
75
75
  end
@@ -1,7 +1,8 @@
1
+ require 'shellwords'
1
2
  module Departure
2
3
  # Holds the parameters of the DB connection and formats them to string
3
4
  class ConnectionDetails
4
-
5
+ DEFAULT_PORT = 3306
5
6
  # Constructor
6
7
  #
7
8
  # @param [Hash] connection parametes as used in #establish_conneciton
@@ -14,7 +15,7 @@ module Departure
14
15
  #
15
16
  # @return [String]
16
17
  def to_s
17
- @to_s ||= "-h #{host} -u #{user} #{password_argument}"
18
+ @to_s ||= "-h #{host} -P #{port} -u #{user} #{password_argument}"
18
19
  end
19
20
 
20
21
  # TODO: Doesn't the abstract adapter already handle this somehow?
@@ -33,7 +34,7 @@ module Departure
33
34
  # @return [String]
34
35
  def password_argument
35
36
  if password.present?
36
- "-p #{password}"
37
+ %(--password #{Shellwords.escape(password)} )
37
38
  else
38
39
  ''
39
40
  end
@@ -66,5 +67,12 @@ module Departure
66
67
  def password
67
68
  ENV.fetch('PERCONA_DB_PASSWORD', connection_data[:password])
68
69
  end
70
+
71
+ # Returns the database's port.
72
+ #
73
+ # @return [String]
74
+ def port
75
+ connection_data.fetch(:port, DEFAULT_PORT)
76
+ end
69
77
  end
70
78
  end
@@ -1,9 +1,7 @@
1
1
  module Departure
2
-
3
2
  # Represents the 'DSN' argument of Percona's pt-online-schema-change
4
3
  # See https://www.percona.com/doc/percona-toolkit/2.0/pt-online-schema-change.html#dsn-options
5
4
  class DSN
6
-
7
5
  # Constructor
8
6
  #
9
7
  # @param database [String, Symbol]
@@ -1,7 +1,7 @@
1
1
  module Departure
2
2
  module LogSanitizers
3
3
  class PasswordSanitizer
4
- PASSWORD_REPLACEMENT = '[filtered_password]'
4
+ PASSWORD_REPLACEMENT = '[filtered_password]'.freeze
5
5
 
6
6
  delegate :password_argument, to: :connection_details
7
7
 
@@ -15,6 +15,7 @@ module Departure
15
15
  end
16
16
 
17
17
  private
18
+
18
19
  attr_accessor :connection_details
19
20
  end
20
21
  end
@@ -4,7 +4,6 @@ module Departure
4
4
  # the from ActiveRecord::Migration because the migration's instance can't be
5
5
  # seen from the connection adapter.
6
6
  class Logger
7
-
8
7
  def initialize(sanitizers)
9
8
  @sanitizers = sanitizers
10
9
  end
@@ -15,7 +14,7 @@ module Departure
15
14
  # @param message [String]
16
15
  # @param subitem [Boolean] whether to show message as a nested log item
17
16
  def say(message, subitem = false)
18
- write "#{subitem ? " ->" : "--"} #{message}"
17
+ write "#{subitem ? ' ->' : '--'} #{message}"
19
18
  end
20
19
 
21
20
  # Outputs the text through the stdout adding a new line at the end
@@ -1,6 +1,5 @@
1
1
  module Departure
2
2
  module LoggerFactory
3
-
4
3
  # Returns the appropriate logger instance for the given configuration. Use
5
4
  # :verbose option to log to the stdout
6
5
  #
@@ -24,10 +24,10 @@ module Departure
24
24
  #
25
25
  # @param [Option]
26
26
  # @return [Boolean]
27
- def ==(another_option)
28
- name == another_option.name
27
+ def ==(other)
28
+ name == other.name
29
29
  end
30
- alias :eql? :==
30
+ alias eql? ==
31
31
 
32
32
  # Returns the option's hash
33
33
  #
@@ -65,7 +65,7 @@ module Departure
65
65
  def value_as_string
66
66
  if value.nil?
67
67
  ''
68
- elsif value.include?("=")
68
+ elsif value.include?('=')
69
69
  " #{value}"
70
70
  else
71
71
  "=#{value}"
@@ -1,11 +1,9 @@
1
1
  require 'open3'
2
2
 
3
3
  module Departure
4
-
5
4
  # It executes pt-online-schema-change commands in a new process and gets its
6
5
  # output and status
7
6
  class Runner
8
-
9
7
  # Constructor
10
8
  #
11
9
  # @param logger [#say, #write]
@@ -1,3 +1,3 @@
1
1
  module Departure
2
- VERSION = '4.0.1'.freeze
2
+ VERSION = '5.0.0'.freeze
3
3
  end
data/lib/lhm.rb CHANGED
@@ -4,14 +4,13 @@ require 'lhm/adapter'
4
4
  # while providing a different behaviour. We delegate all LHM's methods to
5
5
  # ActiveRecord so that you don't need to modify your old LHM migrations
6
6
  module Lhm
7
-
8
7
  # Yields an adapter instance so that Lhm migration Dsl methods get
9
8
  # delegated to ActiveRecord::Migration ones instead
10
9
  #
11
10
  # @param table_name [String]
12
11
  # @param _options [Hash]
13
12
  # @param block [Block]
14
- def self.change_table(table_name, _options = {}, &block)
13
+ def self.change_table(table_name, _options = {}, &block) # rubocop:disable Lint/UnusedMethodArgument
15
14
  yield Adapter.new(@migration, table_name)
16
15
  end
17
16
 
@@ -22,4 +21,3 @@ module Lhm
22
21
  @migration = migration
23
22
  end
24
23
  end
25
-
@@ -2,12 +2,10 @@ require 'lhm/column_with_sql'
2
2
  require 'lhm/column_with_type'
3
3
 
4
4
  module Lhm
5
-
6
5
  # Translates Lhm DSL to ActiveRecord's one, so Lhm migrations will now go
7
6
  # through Percona as well, without any modification on the migration's
8
7
  # code
9
8
  class Adapter
10
-
11
9
  # Constructor
12
10
  #
13
11
  # @param migration [ActiveRecord::Migtration]
@@ -79,7 +77,7 @@ module Lhm
79
77
  # @param index_name [String]
80
78
  def add_unique_index(columns, index_name = nil)
81
79
  options = { unique: true }
82
- options.merge!(name: index_name) if index_name
80
+ options.merge!(name: index_name) if index_name # rubocop:disable Performance/RedundantMerge
83
81
 
84
82
  migration.add_index(table_name, columns, options)
85
83
  end
@@ -1,7 +1,6 @@
1
1
  require 'forwardable'
2
2
 
3
3
  module Lhm
4
-
5
4
  # Abstracts the details of a table column definition when specified with a MySQL
6
5
  # column definition string
7
6
  class ColumnWithSql
@@ -54,11 +53,16 @@ module Lhm
54
53
  # @return [column_factory]
55
54
  def column
56
55
  cast_type = ActiveRecord::Base.connection.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)
57
62
  @column ||= self.class.column_factory.new(
58
63
  name,
59
64
  default_value,
60
- cast_type,
61
- definition,
65
+ mysql_metadata,
62
66
  null_value
63
67
  )
64
68
  end
@@ -1,12 +1,10 @@
1
1
  module Lhm
2
-
3
2
  # Abstracts the details of a table column definition when specified with a type
4
3
  # as a symbol. This is the regular ActiveRecord's #add_column syntax:
5
4
  #
6
5
  # add_column :tablenames, :field, :string
7
6
  #
8
7
  class ColumnWithType
9
-
10
8
  # Constructor
11
9
  #
12
10
  # @param name [String, Symbol]
@@ -1,9 +1,12 @@
1
+ require 'active_record'
2
+
1
3
  # Setups the test database with the schema_migrations table that ActiveRecord
2
4
  # requires for the migrations, plus a table for the Comment model used throught
3
5
  # the tests.
4
6
  #
5
7
  class TestDatabase
6
8
 
9
+
7
10
  # Constructor
8
11
  #
9
12
  # @param config [Hash]
@@ -19,7 +22,7 @@ class TestDatabase
19
22
  drop_and_create_schema_migrations_table
20
23
  end
21
24
 
22
- # Creates the #{database} database and the comments table in it.
25
+ # Creates the #{@database} database and the comments table in it.
23
26
  # Before, it drops both if they already exist
24
27
  def setup_test_database
25
28
  drop_and_create_test_database
@@ -29,7 +32,13 @@ class TestDatabase
29
32
  # Creates the ActiveRecord's schema_migrations table required for
30
33
  # migrations to work. Before, it drops the table if it already exists
31
34
  def drop_and_create_schema_migrations_table
32
- %x(#{mysql_command} "USE #{database}; DROP TABLE IF EXISTS schema_migrations; 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")
35
+ sql = [
36
+ "USE #{@database}",
37
+ "DROP TABLE IF EXISTS schema_migrations",
38
+ "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"
39
+ ]
40
+
41
+ run_commands(sql)
33
42
  end
34
43
 
35
44
  private
@@ -37,16 +46,37 @@ class TestDatabase
37
46
  attr_reader :config, :database
38
47
 
39
48
  def drop_and_create_test_database
40
- %x(#{mysql_command} "DROP DATABASE IF EXISTS #{database}; CREATE DATABASE #{database} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;")
49
+ sql = [
50
+ "DROP DATABASE IF EXISTS #{@database}",
51
+ "CREATE DATABASE #{@database} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci"
52
+ ]
53
+
54
+ run_commands(sql)
41
55
  end
42
56
 
43
57
  def drop_and_create_comments_table
44
- %x(#{mysql_command} "USE #{database}; DROP TABLE IF EXISTS comments; CREATE TABLE comments ( id int(12) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;")
58
+ sql = [
59
+ "USE #{@database}",
60
+ "DROP TABLE IF EXISTS comments",
61
+ "CREATE TABLE comments ( id int(12) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci"
62
+ ]
63
+
64
+ run_commands(sql)
65
+ end
66
+
67
+ def run_commands(sql)
68
+ conn.execute("START TRANSACTION")
69
+ sql.each { |str|
70
+ conn.execute(str)
71
+ }
72
+ conn.execute("COMMIT")
45
73
  end
46
74
 
47
- # Returns the command to run the mysql client. It uses the crendentials from
48
- # the provided config
49
- def mysql_command
50
- "mysql --user=#{config['username']} --password=#{config['password']} -e"
75
+ def conn
76
+ @conn ||= ActiveRecord::Base.mysql2_connection(
77
+ host: @config['hostname'],
78
+ username: @config['username'],
79
+ password: @config['password'],
80
+ reconnect: true)
51
81
  end
52
82
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: departure
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.1
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ilya Zayats
@@ -10,10 +10,11 @@ authors:
10
10
  - Jorge Morante
11
11
  - Enrico Stano
12
12
  - Adrian Serafin
13
+ - Kirk Haines
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
- date: 2017-08-01 00:00:00.000000000 Z
17
+ date: 2017-09-19 00:00:00.000000000 Z
17
18
  dependencies:
18
19
  - !ruby/object:Gem::Dependency
19
20
  name: rails
@@ -21,14 +22,14 @@ dependencies:
21
22
  requirements:
22
23
  - - "~>"
23
24
  - !ruby/object:Gem::Version
24
- version: 4.2.0
25
+ version: 5.0.0
25
26
  type: :runtime
26
27
  prerelease: false
27
28
  version_requirements: !ruby/object:Gem::Requirement
28
29
  requirements:
29
30
  - - "~>"
30
31
  - !ruby/object:Gem::Version
31
- version: 4.2.0
32
+ version: 5.0.0
32
33
  - !ruby/object:Gem::Dependency
33
34
  name: mysql2
34
35
  requirement: !ruby/object:Gem::Requirement
@@ -43,20 +44,6 @@ dependencies:
43
44
  - - "~>"
44
45
  - !ruby/object:Gem::Version
45
46
  version: 0.4.0
46
- - !ruby/object:Gem::Dependency
47
- name: bundler
48
- requirement: !ruby/object:Gem::Requirement
49
- requirements:
50
- - - "~>"
51
- - !ruby/object:Gem::Version
52
- version: '1.10'
53
- type: :development
54
- prerelease: false
55
- version_requirements: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '1.10'
60
47
  - !ruby/object:Gem::Dependency
61
48
  name: rake
62
49
  requirement: !ruby/object:Gem::Requirement
@@ -147,15 +134,19 @@ email:
147
134
  - fran.casas@redbooth.com
148
135
  - jorge.morante@redbooth.com
149
136
  - adrian@softmad.pl
137
+ - wyhaines@gmail.com
150
138
  executables: []
151
139
  extensions: []
152
140
  extra_rdoc_files: []
153
141
  files:
142
+ - ".codeclimate.yml"
154
143
  - ".gitignore"
155
144
  - ".rspec"
145
+ - ".rubocop.yml"
156
146
  - ".travis.yml"
157
147
  - CHANGELOG.md
158
148
  - CODE_OF_CONDUCT.md
149
+ - Dockerfile
159
150
  - Gemfile
160
151
  - LICENSE.txt
161
152
  - README.md
@@ -164,10 +155,11 @@ files:
164
155
  - bin/console
165
156
  - bin/rspec
166
157
  - bin/setup
167
- - config.yml
158
+ - config.yml.erb
168
159
  - configuration.rb
169
160
  - departure.gemspec
170
161
  - departure_error.log
162
+ - docker-compose.yml
171
163
  - lib/active_record/connection_adapters/percona_adapter.rb
172
164
  - lib/departure.rb
173
165
  - lib/departure/alter_argument.rb
data/config.yml DELETED
@@ -1,3 +0,0 @@
1
- username: 'root'
2
- password: ''
3
- database: 'departure_test'