alterity 1.3.0 → 1.4.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 +4 -4
- data/lib/alterity/configuration.rb +4 -5
- data/lib/alterity/version.rb +1 -1
- data/lib/alterity.rb +24 -2
- data/spec/bin/custom_config.rb +13 -0
- data/spec/bin/disabled_migration.rb +9 -0
- data/spec/bin/rails_app_migration_test.sh +6 -0
- data/spec/bin/test_custom_config_result.rb +20 -1
- data/spec/bin/test_disabled_state.rb +6 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17e41112c9c2dbf07aa9115bbe62ead1666d8802f0ce67a57bb5c9390ff85ecf
|
4
|
+
data.tar.gz: 815373d5f3832cea20695a067c2e7ecaf7823bddb5ca7769a5de2f42e371cc01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ea71bf4f05a6413e864dce3f781dd3231a7832022bc21b890bdafeb4ca3e522222118929723f35495655a97863d60db1619f973c6f3b5d970c7c5cb63fcfe6b
|
7
|
+
data.tar.gz: ace1c68c92fe85b4704034be10f166b66e392777de6ebf1aafdc151fa6eb1e0ccb0e61fb636754507853fe6a33fbe5431bf38f347d915486435a58af6f432a47
|
@@ -4,7 +4,10 @@ class Alterity
|
|
4
4
|
Configuration = Struct.new(
|
5
5
|
:command,
|
6
6
|
:host, :port, :database, :username, :password,
|
7
|
-
:replicas_dsns_database, :replicas_dsns_table, :replicas_dsns
|
7
|
+
:replicas_dsns_database, :replicas_dsns_table, :replicas_dsns,
|
8
|
+
:before_command,
|
9
|
+
:on_command_output,
|
10
|
+
:after_command
|
8
11
|
)
|
9
12
|
CurrentState = Struct.new(:migrating, :disabled)
|
10
13
|
cattr_accessor :state
|
@@ -36,10 +39,6 @@ class Alterity
|
|
36
39
|
yield config
|
37
40
|
end
|
38
41
|
|
39
|
-
def command=(new_command)
|
40
|
-
config.command = new_command
|
41
|
-
end
|
42
|
-
|
43
42
|
def disable
|
44
43
|
state.disabled = true
|
45
44
|
yield
|
data/lib/alterity/version.rb
CHANGED
data/lib/alterity.rb
CHANGED
@@ -8,6 +8,8 @@ require "alterity/railtie"
|
|
8
8
|
class Alterity
|
9
9
|
class << self
|
10
10
|
def process_sql_query(sql, &block)
|
11
|
+
return block.call if state.disabled
|
12
|
+
|
11
13
|
case sql.tr("\n", " ").strip
|
12
14
|
when /^alter\s+table\s+(?<table>.+?)\s+(?<updates>.+)/i
|
13
15
|
table = $~[:table]
|
@@ -35,6 +37,7 @@ class Alterity
|
|
35
37
|
|
36
38
|
# hooks
|
37
39
|
def before_running_migrations
|
40
|
+
require "open3"
|
38
41
|
state.migrating = true
|
39
42
|
set_database_config
|
40
43
|
prepare_replicas_dsns_table
|
@@ -50,8 +53,27 @@ class Alterity
|
|
50
53
|
altered_table = table.delete("`")
|
51
54
|
alter_argument = %("#{updates.gsub('"', '\\"').gsub('`', '\\\`')}")
|
52
55
|
prepared_command = config.command.call(altered_table, alter_argument).to_s.gsub(/\n/, "\\\n")
|
53
|
-
puts "[Alterity] Will execute: #{prepared_command}"
|
54
|
-
|
56
|
+
puts "[Alterity] Will execute: #{sanitize(prepared_command)}"
|
57
|
+
config.before_command&.call(prepared_command)
|
58
|
+
|
59
|
+
result_str = +""
|
60
|
+
exit_status = nil
|
61
|
+
Open3.popen2e(prepared_command) do |_stdin, stdout_and_stderr, wait_thr|
|
62
|
+
stdout_and_stderr.each do |line|
|
63
|
+
puts line
|
64
|
+
result_str << line
|
65
|
+
config.on_command_output&.call(line)
|
66
|
+
end
|
67
|
+
exit_status = wait_thr.value
|
68
|
+
config.after_command&.call(wait_thr.value.to_i)
|
69
|
+
end
|
70
|
+
|
71
|
+
raise("[Alterity] Command failed. Full output: #{result_str}") unless exit_status.success?
|
72
|
+
end
|
73
|
+
|
74
|
+
def sanitize(command)
|
75
|
+
return command unless config.password.present?
|
76
|
+
command.gsub(config.password, '[filtered]')
|
55
77
|
end
|
56
78
|
|
57
79
|
def set_database_config
|
data/spec/bin/custom_config.rb
CHANGED
@@ -8,6 +8,7 @@ Alterity.configure do |config|
|
|
8
8
|
system("echo '#{string}' > /tmp/custom_command_result.txt")
|
9
9
|
system("echo '#{altered_table}' >> /tmp/custom_command_result.txt")
|
10
10
|
system("echo '#{alter_argument}' >> /tmp/custom_command_result.txt")
|
11
|
+
"ls /"
|
11
12
|
}
|
12
13
|
|
13
14
|
config.replicas(
|
@@ -23,4 +24,16 @@ Alterity.configure do |config|
|
|
23
24
|
"h=#{ENV['MYSQL_HOST']}"
|
24
25
|
]
|
25
26
|
)
|
27
|
+
|
28
|
+
config.before_command = lambda do |command|
|
29
|
+
File.new("/tmp/before_command.txt", "w").syswrite(command)
|
30
|
+
end
|
31
|
+
|
32
|
+
config.on_command_output = lambda do |output|
|
33
|
+
File.new("/tmp/on_command_output.txt", "w+").syswrite(output)
|
34
|
+
end
|
35
|
+
|
36
|
+
config.after_command = lambda do |exit_status|
|
37
|
+
File.new("/tmp/after_command.txt", "w").syswrite(exit_status)
|
38
|
+
end
|
26
39
|
end
|
@@ -69,3 +69,9 @@ ruby ../spec/bin/test_custom_config_result.rb
|
|
69
69
|
|
70
70
|
# Also testing what's in replicas_dsns, also checking that master was detected and removed.
|
71
71
|
bundle e rails runner 'res=ActiveRecord::Base.connection.execute("select dsn from percona.replicas_dsns").to_a.flatten;p(res); res == ["h=host1,P=3306", "h=host2,P=3306"] || exit(1)'
|
72
|
+
|
73
|
+
rm /tmp/custom_command_result.txt
|
74
|
+
cp ../spec/bin/disabled_migration.rb db/migrate/20210728182628_add_yet_another_color_to_shirts.rb
|
75
|
+
bundle e rails db:migrate --trace
|
76
|
+
bundle e rails runner 'Shirt.columns.map(&:name).include?("color3") || exit(1)'
|
77
|
+
ruby ../spec/bin/test_disabled_state.rb
|
@@ -15,6 +15,25 @@ puts result
|
|
15
15
|
p result.chars.map(&:hex)
|
16
16
|
|
17
17
|
if result != expected_result
|
18
|
-
puts "=>
|
18
|
+
puts "=> mismatched result"
|
19
|
+
exit(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
result = File.read("/tmp/before_command.txt")
|
24
|
+
if result != "ls /"
|
25
|
+
puts "=> mismatched before_command"
|
26
|
+
exit(1)
|
27
|
+
end
|
28
|
+
|
29
|
+
result = File.read("/tmp/on_command_output.txt")
|
30
|
+
if !result.include?("var")
|
31
|
+
puts "=> mismatched on_command_output"
|
32
|
+
exit(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
result = File.read("/tmp/after_command.txt")
|
36
|
+
if result.strip != "0"
|
37
|
+
puts "=> mismatched after_command"
|
19
38
|
exit(1)
|
20
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alterity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Maximin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mysql2
|
@@ -53,8 +53,10 @@ files:
|
|
53
53
|
- lib/alterity/version.rb
|
54
54
|
- spec/alterity_spec.rb
|
55
55
|
- spec/bin/custom_config.rb
|
56
|
+
- spec/bin/disabled_migration.rb
|
56
57
|
- spec/bin/rails_app_migration_test.sh
|
57
58
|
- spec/bin/test_custom_config_result.rb
|
59
|
+
- spec/bin/test_disabled_state.rb
|
58
60
|
- spec/spec_helper.rb
|
59
61
|
homepage: https://github.com/gumroad/alterity
|
60
62
|
licenses:
|
@@ -85,6 +87,8 @@ summary: Execute your ActiveRecord migrations with Percona's pt-online-schema-ch
|
|
85
87
|
test_files:
|
86
88
|
- spec/alterity_spec.rb
|
87
89
|
- spec/bin/custom_config.rb
|
90
|
+
- spec/bin/disabled_migration.rb
|
88
91
|
- spec/bin/rails_app_migration_test.sh
|
89
92
|
- spec/bin/test_custom_config_result.rb
|
93
|
+
- spec/bin/test_disabled_state.rb
|
90
94
|
- spec/spec_helper.rb
|