lhm 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +5 -13
  2. data/.rubocop.yml +256 -0
  3. data/.travis.yml +2 -3
  4. data/CHANGELOG.md +21 -0
  5. data/README.md +30 -3
  6. data/Rakefile +2 -2
  7. data/bin/lhm-config.sh +7 -0
  8. data/bin/lhm-kill-queue +13 -15
  9. data/bin/lhm-spec-clobber.sh +1 -1
  10. data/bin/lhm-spec-grants.sh +2 -2
  11. data/bin/lhm-spec-setup-cluster.sh +1 -1
  12. data/gemfiles/ar-2.3_mysql.gemfile +1 -0
  13. data/lhm.gemspec +6 -6
  14. data/lib/lhm.rb +20 -8
  15. data/lib/lhm/atomic_switcher.rb +2 -1
  16. data/lib/lhm/chunker.rb +19 -19
  17. data/lib/lhm/command.rb +1 -1
  18. data/lib/lhm/connection.rb +12 -0
  19. data/lib/lhm/entangler.rb +5 -5
  20. data/lib/lhm/intersection.rb +29 -16
  21. data/lib/lhm/invoker.rb +3 -3
  22. data/lib/lhm/locked_switcher.rb +6 -6
  23. data/lib/lhm/migration.rb +5 -4
  24. data/lib/lhm/migrator.rb +39 -10
  25. data/lib/lhm/printer.rb +4 -6
  26. data/lib/lhm/sql_helper.rb +4 -4
  27. data/lib/lhm/table.rb +12 -12
  28. data/lib/lhm/version.rb +1 -1
  29. data/spec/fixtures/users.ddl +1 -1
  30. data/spec/integration/atomic_switcher_spec.rb +7 -7
  31. data/spec/integration/chunker_spec.rb +2 -2
  32. data/spec/integration/cleanup_spec.rb +34 -10
  33. data/spec/integration/entangler_spec.rb +11 -11
  34. data/spec/integration/integration_helper.rb +10 -3
  35. data/spec/integration/lhm_spec.rb +96 -46
  36. data/spec/integration/locked_switcher_spec.rb +7 -7
  37. data/spec/integration/table_spec.rb +15 -15
  38. data/spec/test_helper.rb +4 -4
  39. data/spec/unit/atomic_switcher_spec.rb +6 -6
  40. data/spec/unit/chunker_spec.rb +22 -9
  41. data/spec/unit/entangler_spec.rb +19 -19
  42. data/spec/unit/intersection_spec.rb +27 -15
  43. data/spec/unit/lhm_spec.rb +6 -6
  44. data/spec/unit/locked_switcher_spec.rb +14 -14
  45. data/spec/unit/migration_spec.rb +6 -6
  46. data/spec/unit/migrator_spec.rb +53 -41
  47. data/spec/unit/printer_spec.rb +7 -7
  48. data/spec/unit/sql_helper_spec.rb +10 -10
  49. data/spec/unit/table_spec.rb +11 -11
  50. data/spec/unit/throttler_spec.rb +12 -12
  51. metadata +12 -10
@@ -10,125 +10,137 @@ describe Lhm::Migrator do
10
10
  include UnitHelper
11
11
 
12
12
  before(:each) do
13
- @table = Lhm::Table.new("alt")
13
+ @table = Lhm::Table.new('alt')
14
14
  @creator = Lhm::Migrator.new(@table)
15
15
  end
16
16
 
17
- describe "index changes" do
18
- it "should add an index" do
17
+ describe 'index changes' do
18
+ it 'should add an index' do
19
19
  @creator.add_index(:a)
20
20
 
21
21
  @creator.statements.must_equal([
22
- "create index `index_alt_on_a` on `lhmn_alt` (`a`)"
22
+ 'create index `index_alt_on_a` on `lhmn_alt` (`a`)'
23
23
  ])
24
24
  end
25
25
 
26
- it "should add a composite index" do
26
+ it 'should add a composite index' do
27
27
  @creator.add_index([:a, :b])
28
28
 
29
29
  @creator.statements.must_equal([
30
- "create index `index_alt_on_a_and_b` on `lhmn_alt` (`a`, `b`)"
30
+ 'create index `index_alt_on_a_and_b` on `lhmn_alt` (`a`, `b`)'
31
31
  ])
32
32
  end
33
33
 
34
- it "should add an index with prefix length" do
35
- @creator.add_index(["a(10)", "b"])
34
+ it 'should add an index with prefix length' do
35
+ @creator.add_index(['a(10)', 'b'])
36
36
 
37
37
  @creator.statements.must_equal([
38
- "create index `index_alt_on_a_and_b` on `lhmn_alt` (`a`(10), `b`)"
38
+ 'create index `index_alt_on_a_and_b` on `lhmn_alt` (`a`(10), `b`)'
39
39
  ])
40
40
  end
41
41
 
42
- it "should add an index with a custom name" do
42
+ it 'should add an index with a custom name' do
43
43
  @creator.add_index([:a, :b], :custom_index_name)
44
44
 
45
45
  @creator.statements.must_equal([
46
- "create index `custom_index_name` on `lhmn_alt` (`a`, `b`)"
46
+ 'create index `custom_index_name` on `lhmn_alt` (`a`, `b`)'
47
47
  ])
48
48
  end
49
49
 
50
- it "should add a unique index" do
51
- @creator.add_unique_index(["a(5)", :b])
50
+ it 'should raise an error when the index name is not a string or symbol' do
51
+ assert_raises ArgumentError do
52
+ @creator.add_index([:a, :b], :name => :custom_index_name)
53
+ end
54
+ end
55
+
56
+ it 'should add a unique index' do
57
+ @creator.add_unique_index(['a(5)', :b])
52
58
 
53
59
  @creator.statements.must_equal([
54
- "create unique index `index_alt_on_a_and_b` on `lhmn_alt` (`a`(5), `b`)"
60
+ 'create unique index `index_alt_on_a_and_b` on `lhmn_alt` (`a`(5), `b`)'
55
61
  ])
56
62
  end
57
63
 
58
- it "should add a unique index with a custom name" do
64
+ it 'should add a unique index with a custom name' do
59
65
  @creator.add_unique_index([:a, :b], :custom_index_name)
60
66
 
61
67
  @creator.statements.must_equal([
62
- "create unique index `custom_index_name` on `lhmn_alt` (`a`, `b`)"
68
+ 'create unique index `custom_index_name` on `lhmn_alt` (`a`, `b`)'
63
69
  ])
64
70
  end
65
71
 
66
- it "should remove an index" do
67
- @creator.remove_index(["b", "a"])
72
+ it 'should raise an error when the unique index name is not a string or symbol' do
73
+ assert_raises ArgumentError do
74
+ @creator.add_unique_index([:a, :b], :name => :custom_index_name)
75
+ end
76
+ end
77
+
78
+ it 'should remove an index' do
79
+ @creator.remove_index(['b', 'a'])
68
80
 
69
81
  @creator.statements.must_equal([
70
- "drop index `index_alt_on_b_and_a` on `lhmn_alt`"
82
+ 'drop index `index_alt_on_b_and_a` on `lhmn_alt`'
71
83
  ])
72
84
  end
73
85
 
74
- it "should remove an index with a custom name" do
86
+ it 'should remove an index with a custom name' do
75
87
  @creator.remove_index([:a, :b], :custom_index_name)
76
88
 
77
89
  @creator.statements.must_equal([
78
- "drop index `custom_index_name` on `lhmn_alt`"
90
+ 'drop index `custom_index_name` on `lhmn_alt`'
79
91
  ])
80
92
  end
81
93
  end
82
94
 
83
- describe "column changes" do
84
- it "should add a column" do
85
- @creator.add_column("logins", "INT(12)")
95
+ describe 'column changes' do
96
+ it 'should add a column' do
97
+ @creator.add_column('logins', 'INT(12)')
86
98
 
87
99
  @creator.statements.must_equal([
88
- "alter table `lhmn_alt` add column `logins` INT(12)"
100
+ 'alter table `lhmn_alt` add column `logins` INT(12)'
89
101
  ])
90
102
  end
91
103
 
92
- it "should remove a column" do
93
- @creator.remove_column("logins")
104
+ it 'should remove a column' do
105
+ @creator.remove_column('logins')
94
106
 
95
107
  @creator.statements.must_equal([
96
- "alter table `lhmn_alt` drop `logins`"
108
+ 'alter table `lhmn_alt` drop `logins`'
97
109
  ])
98
110
  end
99
111
 
100
- it "should change a column" do
101
- @creator.change_column("logins", "INT(11)")
112
+ it 'should change a column' do
113
+ @creator.change_column('logins', 'INT(11)')
102
114
 
103
115
  @creator.statements.must_equal([
104
- "alter table `lhmn_alt` modify column `logins` INT(11)"
116
+ 'alter table `lhmn_alt` modify column `logins` INT(11)'
105
117
  ])
106
118
  end
107
119
  end
108
120
 
109
- describe "direct changes" do
110
- it "should accept a ddl statement" do
111
- ddl = @creator.ddl("alter table `%s` add column `f` tinyint(1)" % @creator.name)
121
+ describe 'direct changes' do
122
+ it 'should accept a ddl statement' do
123
+ ddl = @creator.ddl('alter table `%s` add column `f` tinyint(1)' % @creator.name)
112
124
 
113
125
  @creator.statements.must_equal([
114
- "alter table `lhmn_alt` add column `f` tinyint(1)"
126
+ 'alter table `lhmn_alt` add column `f` tinyint(1)'
115
127
  ])
116
128
  end
117
129
  end
118
130
 
119
- describe "multiple changes" do
120
- it "should add two columns" do
121
- @creator.add_column("first", "VARCHAR(64)")
122
- @creator.add_column("last", "VARCHAR(64)")
131
+ describe 'multiple changes' do
132
+ it 'should add two columns' do
133
+ @creator.add_column('first', 'VARCHAR(64)')
134
+ @creator.add_column('last', 'VARCHAR(64)')
123
135
  @creator.statements.length.must_equal(2)
124
136
 
125
137
  @creator.
126
138
  statements[0].
127
- must_equal("alter table `lhmn_alt` add column `first` VARCHAR(64)")
139
+ must_equal('alter table `lhmn_alt` add column `first` VARCHAR(64)')
128
140
 
129
141
  @creator.
130
142
  statements[1].
131
- must_equal("alter table `lhmn_alt` add column `last` VARCHAR(64)")
143
+ must_equal('alter table `lhmn_alt` add column `last` VARCHAR(64)')
132
144
  end
133
145
  end
134
146
  end
@@ -5,13 +5,13 @@ require 'lhm/printer'
5
5
  describe Lhm::Printer do
6
6
  include UnitHelper
7
7
 
8
- describe "percentage printer" do
8
+ describe 'percentage printer' do
9
9
 
10
10
  before(:each) do
11
11
  @printer = Lhm::Printer::Percentage.new
12
12
  end
13
13
 
14
- it "prints the percentage" do
14
+ it 'prints the percentage' do
15
15
  mock = MiniTest::Mock.new
16
16
  10.times do |i|
17
17
  mock.expect(:write, :return_value) do |message|
@@ -25,7 +25,7 @@ describe Lhm::Printer do
25
25
  mock.verify
26
26
  end
27
27
 
28
- it "always print a bigger message" do
28
+ it 'always print a bigger message' do
29
29
  @length = 0
30
30
  mock = MiniTest::Mock.new
31
31
  3.times do |i|
@@ -45,7 +45,7 @@ describe Lhm::Printer do
45
45
  mock.verify
46
46
  end
47
47
 
48
- it "prints the end message" do
48
+ it 'prints the end message' do
49
49
  mock = MiniTest::Mock.new
50
50
  mock.expect(:write, :return_value, [String])
51
51
  mock.expect(:write, :return_value, ["\n"])
@@ -57,16 +57,16 @@ describe Lhm::Printer do
57
57
  end
58
58
  end
59
59
 
60
- describe "dot printer" do
60
+ describe 'dot printer' do
61
61
 
62
62
  before(:each) do
63
63
  @printer = Lhm::Printer::Dot.new
64
64
  end
65
65
 
66
- it "prints the dots" do
66
+ it 'prints the dots' do
67
67
  mock = MiniTest::Mock.new
68
68
  10.times do
69
- mock.expect(:write, :return_value, ["."])
69
+ mock.expect(:write, :return_value, ['.'])
70
70
  end
71
71
 
72
72
  @printer.instance_variable_set(:@output, mock)
@@ -6,27 +6,27 @@ require File.expand_path(File.dirname(__FILE__)) + '/unit_helper'
6
6
  require 'lhm/sql_helper'
7
7
 
8
8
  describe Lhm::SqlHelper do
9
- it "should name index with a single column" do
9
+ it 'should name index with a single column' do
10
10
  Lhm::SqlHelper.
11
11
  idx_name(:users, :name).
12
- must_equal("index_users_on_name")
12
+ must_equal('index_users_on_name')
13
13
  end
14
14
 
15
- it "should name index with multiple columns" do
15
+ it 'should name index with multiple columns' do
16
16
  Lhm::SqlHelper.
17
17
  idx_name(:users, [:name, :firstname]).
18
- must_equal("index_users_on_name_and_firstname")
18
+ must_equal('index_users_on_name_and_firstname')
19
19
  end
20
20
 
21
- it "should name index with prefixed column" do
21
+ it 'should name index with prefixed column' do
22
22
  Lhm::SqlHelper.
23
- idx_name(:tracks, ["title(10)", "album"]).
24
- must_equal("index_tracks_on_title_and_album")
23
+ idx_name(:tracks, ['title(10)', 'album']).
24
+ must_equal('index_tracks_on_title_and_album')
25
25
  end
26
26
 
27
- it "should quote column names in index specification" do
27
+ it 'should quote column names in index specification' do
28
28
  Lhm::SqlHelper.
29
- idx_spec(["title(10)", "album"]).
30
- must_equal("`title`(10), `album`")
29
+ idx_spec(['title(10)', 'album']).
30
+ must_equal('`title`(10), `album`')
31
31
  end
32
32
  end
@@ -8,26 +8,26 @@ require 'lhm/table'
8
8
  describe Lhm::Table do
9
9
  include UnitHelper
10
10
 
11
- describe "names" do
12
- it "should name destination" do
13
- @table = Lhm::Table.new("users")
14
- @table.destination_name.must_equal "lhmn_users"
11
+ describe 'names' do
12
+ it 'should name destination' do
13
+ @table = Lhm::Table.new('users')
14
+ @table.destination_name.must_equal 'lhmn_users'
15
15
  end
16
16
  end
17
17
 
18
- describe "constraints" do
19
- it "should be satisfied with a single column primary key called id" do
20
- @table = Lhm::Table.new("table", "id")
18
+ describe 'constraints' do
19
+ it 'should be satisfied with a single column primary key called id' do
20
+ @table = Lhm::Table.new('table', 'id')
21
21
  @table.satisfies_primary_key?.must_equal true
22
22
  end
23
23
 
24
- it "should not be satisfied with a primary key unless called id" do
25
- @table = Lhm::Table.new("table", "uuid")
24
+ it 'should not be satisfied with a primary key unless called id' do
25
+ @table = Lhm::Table.new('table', 'uuid')
26
26
  @table.satisfies_primary_key?.must_equal false
27
27
  end
28
28
 
29
- it "should not be satisfied with multicolumn primary key" do
30
- @table = Lhm::Table.new("table", ["id", "secondary"])
29
+ it 'should not be satisfied with multicolumn primary key' do
30
+ @table = Lhm::Table.new('table', ['id', 'secondary'])
31
31
  @table.satisfies_primary_key?.must_equal false
32
32
  end
33
33
  end
@@ -11,22 +11,22 @@ describe Lhm::Throttler do
11
11
  end
12
12
  end
13
13
 
14
- describe "#setup_throttler" do
15
- describe "when passing a key" do
14
+ describe '#setup_throttler' do
15
+ describe 'when passing a key' do
16
16
  before do
17
17
  @mock.setup_throttler(:time_throttler, :delay => 2)
18
18
  end
19
19
 
20
- it "instantiates the time throttle" do
20
+ it 'instantiates the time throttle' do
21
21
  @mock.throttler.class.must_equal Lhm::Throttler::Time
22
22
  end
23
23
 
24
- it "returns 2 seconds as time" do
24
+ it 'returns 2 seconds as time' do
25
25
  @mock.throttler.timeout_seconds.must_equal 2
26
26
  end
27
27
  end
28
28
 
29
- describe "when passing an instance" do
29
+ describe 'when passing an instance' do
30
30
 
31
31
  before do
32
32
  @instance = Class.new(Lhm::Throttler::Time) do
@@ -38,35 +38,35 @@ describe Lhm::Throttler do
38
38
  @mock.setup_throttler(@instance)
39
39
  end
40
40
 
41
- it "returns the instace given" do
41
+ it 'returns the instace given' do
42
42
  @mock.throttler.must_equal @instance
43
43
  end
44
44
 
45
- it "returns 0 seconds as time" do
45
+ it 'returns 0 seconds as time' do
46
46
  @mock.throttler.timeout_seconds.must_equal 0
47
47
  end
48
48
  end
49
49
 
50
- describe "when passing a class" do
50
+ describe 'when passing a class' do
51
51
 
52
52
  before do
53
53
  @klass = Class.new(Lhm::Throttler::Time)
54
54
  @mock.setup_throttler(@klass)
55
55
  end
56
56
 
57
- it "has the same class as given" do
57
+ it 'has the same class as given' do
58
58
  @mock.throttler.class.must_equal @klass
59
59
  end
60
60
  end
61
61
  end
62
62
 
63
- describe "#throttler" do
63
+ describe '#throttler' do
64
64
 
65
- it "returns the default Time based" do
65
+ it 'returns the default Time based' do
66
66
  @mock.throttler.class.must_equal Lhm::Throttler::Time
67
67
  end
68
68
 
69
- it "should default to 100 milliseconds" do
69
+ it 'should default to 100 milliseconds' do
70
70
  @mock.throttler.timeout_seconds.must_equal 0.1
71
71
  end
72
72
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lhm
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SoundCloud
@@ -11,34 +11,34 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2014-07-31 00:00:00.000000000 Z
14
+ date: 2015-01-16 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: minitest
18
18
  requirement: !ruby/object:Gem::Requirement
19
19
  requirements:
20
- - - ~>
20
+ - - "~>"
21
21
  - !ruby/object:Gem::Version
22
22
  version: 5.0.8
23
23
  type: :development
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ~>
27
+ - - "~>"
28
28
  - !ruby/object:Gem::Version
29
29
  version: 5.0.8
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - ! '>='
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
36
  version: '0'
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - ! '>='
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
43
  version: '0'
44
44
  description: Migrate large tables without downtime by copying to a temporary table
@@ -50,12 +50,14 @@ executables:
50
50
  extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
- - .gitignore
54
- - .travis.yml
53
+ - ".gitignore"
54
+ - ".rubocop.yml"
55
+ - ".travis.yml"
55
56
  - CHANGELOG.md
56
57
  - LICENSE
57
58
  - README.md
58
59
  - Rakefile
60
+ - bin/lhm-config.sh
59
61
  - bin/lhm-kill-queue
60
62
  - bin/lhm-spec-clobber.sh
61
63
  - bin/lhm-spec-grants.sh
@@ -126,12 +128,12 @@ require_paths:
126
128
  - lib
127
129
  required_ruby_version: !ruby/object:Gem::Requirement
128
130
  requirements:
129
- - - ! '>='
131
+ - - ">="
130
132
  - !ruby/object:Gem::Version
131
133
  version: '0'
132
134
  required_rubygems_version: !ruby/object:Gem::Requirement
133
135
  requirements:
134
- - - ! '>='
136
+ - - ">="
135
137
  - !ruby/object:Gem::Version
136
138
  version: '0'
137
139
  requirements: []