andyjeffries-rubyrep 1.2.1

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.
Files changed (125) hide show
  1. data/History.txt +83 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +151 -0
  4. data/README.txt +37 -0
  5. data/bin/rubyrep +8 -0
  6. data/lib/rubyrep.rb +72 -0
  7. data/lib/rubyrep/base_runner.rb +195 -0
  8. data/lib/rubyrep/command_runner.rb +144 -0
  9. data/lib/rubyrep/committers/buffered_committer.rb +151 -0
  10. data/lib/rubyrep/committers/committers.rb +152 -0
  11. data/lib/rubyrep/configuration.rb +275 -0
  12. data/lib/rubyrep/connection_extenders/connection_extenders.rb +165 -0
  13. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +65 -0
  14. data/lib/rubyrep/connection_extenders/mysql_extender.rb +59 -0
  15. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +277 -0
  16. data/lib/rubyrep/database_proxy.rb +52 -0
  17. data/lib/rubyrep/direct_table_scan.rb +75 -0
  18. data/lib/rubyrep/generate_runner.rb +105 -0
  19. data/lib/rubyrep/initializer.rb +39 -0
  20. data/lib/rubyrep/log_helper.rb +30 -0
  21. data/lib/rubyrep/logged_change.rb +160 -0
  22. data/lib/rubyrep/logged_change_loader.rb +197 -0
  23. data/lib/rubyrep/noisy_connection.rb +80 -0
  24. data/lib/rubyrep/proxied_table_scan.rb +171 -0
  25. data/lib/rubyrep/proxy_block_cursor.rb +145 -0
  26. data/lib/rubyrep/proxy_connection.rb +431 -0
  27. data/lib/rubyrep/proxy_cursor.rb +44 -0
  28. data/lib/rubyrep/proxy_row_cursor.rb +43 -0
  29. data/lib/rubyrep/proxy_runner.rb +89 -0
  30. data/lib/rubyrep/replication_difference.rb +100 -0
  31. data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
  32. data/lib/rubyrep/replication_extenders/postgresql_replication.rb +236 -0
  33. data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
  34. data/lib/rubyrep/replication_helper.rb +142 -0
  35. data/lib/rubyrep/replication_initializer.rb +327 -0
  36. data/lib/rubyrep/replication_run.rb +142 -0
  37. data/lib/rubyrep/replication_runner.rb +166 -0
  38. data/lib/rubyrep/replicators/replicators.rb +42 -0
  39. data/lib/rubyrep/replicators/two_way_replicator.rb +361 -0
  40. data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
  41. data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
  42. data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
  43. data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
  44. data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
  45. data/lib/rubyrep/scan_runner.rb +25 -0
  46. data/lib/rubyrep/session.rb +230 -0
  47. data/lib/rubyrep/sync_helper.rb +121 -0
  48. data/lib/rubyrep/sync_runner.rb +31 -0
  49. data/lib/rubyrep/syncers/syncers.rb +112 -0
  50. data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
  51. data/lib/rubyrep/table_scan.rb +54 -0
  52. data/lib/rubyrep/table_scan_helper.rb +46 -0
  53. data/lib/rubyrep/table_sorter.rb +70 -0
  54. data/lib/rubyrep/table_spec_resolver.rb +142 -0
  55. data/lib/rubyrep/table_sync.rb +90 -0
  56. data/lib/rubyrep/task_sweeper.rb +77 -0
  57. data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
  58. data/lib/rubyrep/type_casting_cursor.rb +31 -0
  59. data/lib/rubyrep/uninstall_runner.rb +93 -0
  60. data/lib/rubyrep/version.rb +9 -0
  61. data/rubyrep +8 -0
  62. data/rubyrep.bat +4 -0
  63. data/setup.rb +1585 -0
  64. data/spec/base_runner_spec.rb +218 -0
  65. data/spec/buffered_committer_spec.rb +274 -0
  66. data/spec/command_runner_spec.rb +145 -0
  67. data/spec/committers_spec.rb +178 -0
  68. data/spec/configuration_spec.rb +203 -0
  69. data/spec/connection_extender_interface_spec.rb +141 -0
  70. data/spec/connection_extenders_registration_spec.rb +164 -0
  71. data/spec/database_proxy_spec.rb +48 -0
  72. data/spec/database_rake_spec.rb +40 -0
  73. data/spec/db_specific_connection_extenders_spec.rb +34 -0
  74. data/spec/db_specific_replication_extenders_spec.rb +38 -0
  75. data/spec/direct_table_scan_spec.rb +61 -0
  76. data/spec/dolphins.jpg +0 -0
  77. data/spec/generate_runner_spec.rb +84 -0
  78. data/spec/initializer_spec.rb +46 -0
  79. data/spec/log_helper_spec.rb +39 -0
  80. data/spec/logged_change_loader_spec.rb +68 -0
  81. data/spec/logged_change_spec.rb +470 -0
  82. data/spec/noisy_connection_spec.rb +78 -0
  83. data/spec/postgresql_replication_spec.rb +48 -0
  84. data/spec/postgresql_schema_support_spec.rb +212 -0
  85. data/spec/postgresql_support_spec.rb +63 -0
  86. data/spec/progress_bar_spec.rb +77 -0
  87. data/spec/proxied_table_scan_spec.rb +151 -0
  88. data/spec/proxy_block_cursor_spec.rb +197 -0
  89. data/spec/proxy_connection_spec.rb +423 -0
  90. data/spec/proxy_cursor_spec.rb +56 -0
  91. data/spec/proxy_row_cursor_spec.rb +66 -0
  92. data/spec/proxy_runner_spec.rb +70 -0
  93. data/spec/replication_difference_spec.rb +161 -0
  94. data/spec/replication_extender_interface_spec.rb +367 -0
  95. data/spec/replication_extenders_spec.rb +32 -0
  96. data/spec/replication_helper_spec.rb +178 -0
  97. data/spec/replication_initializer_spec.rb +509 -0
  98. data/spec/replication_run_spec.rb +443 -0
  99. data/spec/replication_runner_spec.rb +254 -0
  100. data/spec/replicators_spec.rb +36 -0
  101. data/spec/rubyrep_spec.rb +8 -0
  102. data/spec/scan_detail_reporter_spec.rb +119 -0
  103. data/spec/scan_progress_printers_spec.rb +68 -0
  104. data/spec/scan_report_printers_spec.rb +67 -0
  105. data/spec/scan_runner_spec.rb +50 -0
  106. data/spec/scan_summary_reporter_spec.rb +61 -0
  107. data/spec/session_spec.rb +253 -0
  108. data/spec/spec.opts +1 -0
  109. data/spec/spec_helper.rb +305 -0
  110. data/spec/strange_name_support_spec.rb +135 -0
  111. data/spec/sync_helper_spec.rb +169 -0
  112. data/spec/sync_runner_spec.rb +78 -0
  113. data/spec/syncers_spec.rb +171 -0
  114. data/spec/table_scan_helper_spec.rb +36 -0
  115. data/spec/table_scan_spec.rb +49 -0
  116. data/spec/table_sorter_spec.rb +30 -0
  117. data/spec/table_spec_resolver_spec.rb +111 -0
  118. data/spec/table_sync_spec.rb +140 -0
  119. data/spec/task_sweeper_spec.rb +47 -0
  120. data/spec/trigger_mode_switcher_spec.rb +83 -0
  121. data/spec/two_way_replicator_spec.rb +721 -0
  122. data/spec/two_way_syncer_spec.rb +256 -0
  123. data/spec/type_casting_cursor_spec.rb +50 -0
  124. data/spec/uninstall_runner_spec.rb +93 -0
  125. metadata +190 -0
@@ -0,0 +1,256 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe Syncers::TwoWaySyncer do
6
+ before(:each) do
7
+ Initializer.configuration = deep_copy(standard_config)
8
+ Initializer.configuration.options = {:syncer => :two_way}
9
+ end
10
+
11
+ it "should register itself" do
12
+ Syncers::syncers[:two_way].should == Syncers::TwoWaySyncer
13
+ end
14
+
15
+ it "initialize should store sync_helper" do
16
+ sync = TableSync.new(Session.new, 'scanner_records')
17
+ helper = SyncHelper.new(sync)
18
+ syncer = Syncers::TwoWaySyncer.new(helper)
19
+ syncer.sync_helper.should == helper
20
+ end
21
+
22
+ it "initialize should throw an error if options are invalid" do
23
+ sync = TableSync.new(Session.new, 'scanner_records')
24
+ helper = SyncHelper.new(sync)
25
+ base_options = {
26
+ :syncer => :two_way,
27
+ :left_record_handling => :ignore,
28
+ :right_record_handling => :ignore,
29
+ :sync_conflict_handling => :ignore,
30
+ :logged_sync_events => []
31
+ }
32
+
33
+ # Verify that correct options don't raise errors.
34
+ helper.stub!(:sync_options).and_return(base_options)
35
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
36
+
37
+ # Also lambda options should not raise errors.
38
+ l = lambda {}
39
+ helper.stub!(:sync_options).and_return(base_options.merge(
40
+ {
41
+ :left_record_handling => l,
42
+ :right_record_handling => l,
43
+ :sync_conflict_handling => l
44
+ })
45
+ )
46
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should_not raise_error
47
+
48
+ # Invalid options should raise errors
49
+ invalid_options = [
50
+ {:left_record_handling => :invalid_left_option},
51
+ {:right_record_handling => :invalid_right_option},
52
+ {:sync_conflict_handling => :invalid_conflict_option},
53
+ {:logged_sync_events => [:invalid_logging_option]}
54
+ ]
55
+ invalid_options.each do |options|
56
+ helper.stub!(:sync_options).and_return(base_options.merge(options))
57
+ lambda {Syncers::TwoWaySyncer.new(helper)}.should raise_error(ArgumentError)
58
+ end
59
+ end
60
+
61
+ it "log_sync_outcome should not log if not so configured" do
62
+ sync = TableSync.new(Session.new, 'scanner_records')
63
+
64
+ helper = SyncHelper.new(sync)
65
+ helper.should_not_receive(:log_sync_outcome)
66
+ helper.stub!(:sync_options).and_return(
67
+ {
68
+ :rep_prefix => 'rr',
69
+ :left_record_handling => :ignore,
70
+ :right_record_handling => :ignore,
71
+ :sync_conflict_handling => :ignore,
72
+ :logged_sync_events => []
73
+ })
74
+ syncer = Syncers::TwoWaySyncer.new(helper)
75
+ [:left, :right, :conflict].each do |diff_type|
76
+ syncer.sync_difference(diff_type, :dummy_row)
77
+ end
78
+
79
+ helper = SyncHelper.new(sync)
80
+ helper.should_not_receive(:log_sync_outcome)
81
+ helper.stub!(:sync_options).and_return(
82
+ {
83
+ :rep_prefix => 'rr',
84
+ :left_record_handling => :insert,
85
+ :right_record_handling => :insert,
86
+ :sync_conflict_handling => :right_wins,
87
+ :logged_sync_events => [:ignored_changes, :ignored_conflicts]
88
+ })
89
+ helper.stub!(:insert_record)
90
+ helper.stub!(:update_record)
91
+ syncer.sync_difference :left, :dummy_row
92
+ syncer.sync_difference :right, :dummy_row
93
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
94
+ end
95
+
96
+ it "log_sync_outcome should log sync actions correctly" do
97
+ sync = TableSync.new(Session.new, 'scanner_records')
98
+
99
+ helper = SyncHelper.new(sync)
100
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :insert).ordered
101
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :insert).ordered
102
+ helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :right_wins).ordered
103
+ helper.stub!(:sync_options).and_return(
104
+ {
105
+ :rep_prefix => 'rr',
106
+ :left_record_handling => :insert,
107
+ :right_record_handling => :insert,
108
+ :sync_conflict_handling => :right_wins,
109
+ :logged_sync_events => [:all_changes, :all_conflicts]
110
+ })
111
+ helper.stub!(:insert_record)
112
+ helper.stub!(:update_record)
113
+ syncer = Syncers::TwoWaySyncer.new(helper)
114
+ syncer.sync_difference :left, :dummy_row
115
+ syncer.sync_difference :right, :dummy_row
116
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
117
+ end
118
+
119
+ it "log_sync_outcome should log ignored syncs correctly" do
120
+ sync = TableSync.new(Session.new, 'scanner_records')
121
+
122
+ helper = SyncHelper.new(sync)
123
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'left_record', :ignore).ordered
124
+ helper.should_receive(:log_sync_outcome).with(:dummy_row, 'right_record', :ignore).ordered
125
+ helper.should_receive(:log_sync_outcome).with(:left_dummy_row, 'conflict', :ignore).ordered
126
+ helper.stub!(:sync_options).and_return(
127
+ {
128
+ :rep_prefix => 'rr',
129
+ :left_record_handling => :ignore,
130
+ :right_record_handling => :ignore,
131
+ :sync_conflict_handling => :ignore,
132
+ :logged_sync_events => [:ignored_changes, :ignored_conflicts]
133
+ })
134
+ syncer = Syncers::TwoWaySyncer.new(helper)
135
+ syncer.sync_difference :left, :dummy_row
136
+ syncer.sync_difference :right, :dummy_row
137
+ syncer.sync_difference :conflict, [:left_dummy_row, :right_dummy_row]
138
+ end
139
+
140
+ it "sync_difference should not do anything if ignore option is given" do
141
+ sync = TableSync.new(Session.new, 'scanner_records')
142
+ helper = SyncHelper.new(sync)
143
+ helper.stub!(:sync_options).and_return(
144
+ {
145
+ :left_record_handling => :ignore,
146
+ :right_record_handling => :ignore,
147
+ :sync_conflict_handling => :ignore,
148
+ :logged_sync_events => []
149
+ })
150
+
151
+ syncer = Syncers::TwoWaySyncer.new(helper)
152
+ helper.should_not_receive(:delete_record)
153
+ helper.should_not_receive(:update_record)
154
+ helper.should_not_receive(:insert_record)
155
+
156
+ [:left, :right, :conflict].each do |diff_type|
157
+ syncer.sync_difference(diff_type, :dummy_row)
158
+ end
159
+ end
160
+
161
+ it "sync_difference should call the provided Proc objects" do
162
+ sync = TableSync.new(Session.new, 'scanner_records')
163
+ helper = SyncHelper.new(sync)
164
+
165
+ lambda_parameters = []
166
+ l = lambda do |sync_helper, type, row|
167
+ lambda_parameters << [sync_helper, type, row]
168
+ end
169
+ helper.stub!(:sync_options).and_return(
170
+ {
171
+ :left_record_handling => l,
172
+ :right_record_handling => l,
173
+ :sync_conflict_handling => l,
174
+ :logged_sync_events => [:ignored_conflicts]
175
+ })
176
+
177
+ syncer = Syncers::TwoWaySyncer.new(helper)
178
+ syncer.sync_difference(:left, :dummy_left)
179
+ syncer.sync_difference(:right, :dummy_right)
180
+ syncer.sync_difference(:conflict, [:dummy_left2, :dummy_right2])
181
+
182
+ lambda_parameters.should == [
183
+ [helper, :left, :dummy_left],
184
+ [helper, :right, :dummy_right],
185
+ [helper, :conflict, [:dummy_left2, :dummy_right2]]
186
+ ]
187
+ end
188
+
189
+ it "sync_difference should delete left or right records from source if that option is given" do
190
+ sync = TableSync.new(Session.new, 'scanner_records')
191
+ helper = SyncHelper.new(sync)
192
+ helper.stub!(:sync_options).and_return(
193
+ {
194
+ :left_record_handling => :delete,
195
+ :right_record_handling => :delete,
196
+ :sync_conflict_handling => :ignore,
197
+ :logged_sync_events => [:ignored_conflicts]
198
+ })
199
+
200
+ syncer = Syncers::TwoWaySyncer.new(helper)
201
+ helper.should_receive(:delete_record).with(:left, 'scanner_records', :dummy_left)
202
+ helper.should_receive(:delete_record).with(:right, 'scanner_records', :dummy_right)
203
+ syncer.sync_difference(:left, :dummy_left)
204
+ syncer.sync_difference(:right, :dummy_right)
205
+ end
206
+
207
+ it "sync_difference should insert left or right records to target if that option is given" do
208
+ sync = TableSync.new(Session.new, 'scanner_records')
209
+ helper = SyncHelper.new(sync)
210
+ helper.stub!(:sync_options).and_return(
211
+ {
212
+ :left_record_handling => :insert,
213
+ :right_record_handling => :insert,
214
+ :sync_conflict_handling => :ignore,
215
+ :logged_sync_events => [:ignored_conflicts]
216
+ })
217
+
218
+ syncer = Syncers::TwoWaySyncer.new(helper)
219
+ helper.should_receive(:insert_record).with(:right, 'scanner_records', :dummy_left)
220
+ helper.should_receive(:insert_record).with(:left, 'scanner_records', :dummy_right)
221
+ syncer.sync_difference(:left, :dummy_left)
222
+ syncer.sync_difference(:right, :dummy_right)
223
+ end
224
+
225
+ it "sync_difference should update the left database if conflict handling is specified with :right_wins" do
226
+ sync = TableSync.new(Session.new, 'scanner_records')
227
+ helper = SyncHelper.new(sync)
228
+ helper.stub!(:sync_options).and_return(
229
+ {
230
+ :left_record_handling => :ignore,
231
+ :right_record_handling => :ignore,
232
+ :sync_conflict_handling => :right_wins,
233
+ :logged_sync_events => [:ignored_conflicts]
234
+ })
235
+
236
+ syncer = Syncers::TwoWaySyncer.new(helper)
237
+ helper.should_receive(:update_record).with(:left, 'scanner_records', :dummy_right)
238
+ syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
239
+ end
240
+
241
+ it "sync_difference should update the right database if conflict handling is specified with :left_wins" do
242
+ sync = TableSync.new(Session.new, 'scanner_records')
243
+ helper = SyncHelper.new(sync)
244
+ helper.stub!(:sync_options).and_return(
245
+ {
246
+ :left_record_handling => :ignore,
247
+ :right_record_handling => :ignore,
248
+ :sync_conflict_handling => :left_wins,
249
+ :logged_sync_events => [:ignored_conflicts]
250
+ })
251
+
252
+ syncer = Syncers::TwoWaySyncer.new(helper)
253
+ helper.should_receive(:update_record).with(:right, 'scanner_records', :dummy_left)
254
+ syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
255
+ end
256
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe TypeCastingCursor do
6
+ before(:each) do
7
+ Initializer.configuration = standard_config
8
+ end
9
+
10
+ it "initialize should cache the provided cursor and the retrieved Column objects" do
11
+ cursor = TypeCastingCursor.new Session.new.left, 'extender_type_check', :dummy_org_cursor
12
+ cursor.columns['id'].name.should == 'id'
13
+ cursor.columns['decimal_test'].name.should == 'decimal_test'
14
+ cursor.org_cursor.should == :dummy_org_cursor
15
+ end
16
+
17
+ it "next_row should delegate next? and clear to the original cursor" do
18
+ session = Session.new
19
+ cursor = session.left.select_cursor(
20
+ :query => "select id from extender_type_check where id = 1",
21
+ :table => "extender_type_check"
22
+ )
23
+ cursor.next?.should be_true
24
+ row = cursor.next_row
25
+ cursor.next?.should be_false
26
+ cursor.clear
27
+ end
28
+
29
+ it "next_row should cast rows - including uncommon data types - correctly" do
30
+ session = Session.new
31
+ row = session.left.select_record(
32
+ :query => "select id, decimal_test, timestamp, binary_test from extender_type_check where id = 1",
33
+ :table => "extender_type_check"
34
+ )
35
+
36
+ # verify that the row fields have been converted to the correct types
37
+ row['id'].should be_an_instance_of(Fixnum)
38
+ row['timestamp'].should be_an_instance_of(Time)
39
+ row['decimal_test'].should be_an_instance_of(BigDecimal)
40
+ row['binary_test'].should be_an_instance_of(String)
41
+
42
+ # verify that the row values were converted correctly
43
+ row.should == {
44
+ 'id' => 1,
45
+ 'decimal_test' => BigDecimal.new("1.234"),
46
+ 'timestamp' => Time.local(2007,"nov",10,20,15,1),
47
+ 'binary_test' => Marshal.dump(['bla',:dummy,1,2,3])
48
+ }
49
+ end
50
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ include RR
4
+
5
+ describe UninstallRunner do
6
+ before(:each) do
7
+ end
8
+
9
+ it "should register itself with CommandRunner" do
10
+ CommandRunner.commands['uninstall'][:command].should == UninstallRunner
11
+ CommandRunner.commands['uninstall'][:description].should be_an_instance_of(String)
12
+ end
13
+
14
+ it "process_options should make options as nil and teturn status as 1 if command line parameters are unknown" do
15
+ # also verify that an error message is printed
16
+ $stderr.should_receive(:puts).any_number_of_times
17
+ runner = UninstallRunner.new
18
+ status = runner.process_options ["--nonsense"]
19
+ runner.options.should == nil
20
+ status.should == 1
21
+ end
22
+
23
+ it "process_options should make options as nil and return status as 1 if config option is not given" do
24
+ # also verify that an error message is printed
25
+ $stderr.should_receive(:puts).any_number_of_times
26
+ runner = UninstallRunner.new
27
+ status = runner.process_options []
28
+ runner.options.should == nil
29
+ status.should == 1
30
+ end
31
+
32
+ it "process_options should make options as nil and return status as 0 if command line includes '--help'" do
33
+ # also verify that the help message is printed
34
+ $stderr.should_receive(:puts)
35
+ runner = UninstallRunner.new
36
+ status = runner.process_options ["--help"]
37
+ runner.options.should == nil
38
+ status.should == 0
39
+ end
40
+
41
+ it "process_options should set the correct options" do
42
+ runner = UninstallRunner.new
43
+ runner.process_options ["-c", "config_path"]
44
+ runner.options[:config_file].should == 'config_path'
45
+ end
46
+
47
+ it "run should not start an uninstall if the command line is invalid" do
48
+ $stderr.should_receive(:puts).any_number_of_times
49
+ UninstallRunner.any_instance_should_not_receive(:execute) {
50
+ UninstallRunner.run(["--nonsense"])
51
+ }
52
+ end
53
+
54
+ it "run should start an uninstall if the command line is correct" do
55
+ UninstallRunner.any_instance_should_receive(:execute) {
56
+ UninstallRunner.run(["--config=path"])
57
+ }
58
+ end
59
+
60
+ it "session should create and return the session" do
61
+ runner = UninstallRunner.new
62
+ runner.options = {:config_file => "config/test_config.rb"}
63
+ runner.session.should be_an_instance_of(Session)
64
+ runner.session.should == runner.session # should only be created one time
65
+ end
66
+
67
+ it "execute should uninstall all rubyrep elements" do
68
+ begin
69
+ org_stdout, $stdout = $stdout, StringIO.new
70
+ config = deep_copy(standard_config)
71
+ config.options[:rep_prefix] = 'rx'
72
+ session = Session.new(config)
73
+ initializer = ReplicationInitializer.new(session)
74
+
75
+ initializer.ensure_infrastructure
76
+ initializer.create_trigger :left, 'scanner_records'
77
+
78
+ runner = UninstallRunner.new
79
+ runner.stub!(:session).and_return(session)
80
+
81
+ runner.execute
82
+
83
+ initializer.trigger_exists?(:left, 'scanner_records').should be_false
84
+ initializer.change_log_exists?(:left).should be_false
85
+ session.right.tables.include?('rx_running_flags').should be_false
86
+ initializer.event_log_exists?.should be_false
87
+
88
+ $stdout.string =~ /uninstall completed/i
89
+ ensure
90
+ $stdout = org_stdout
91
+ end
92
+ end
93
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: andyjeffries-rubyrep
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.2.1
6
+ platform: ruby
7
+ authors:
8
+ - Andy Jeffries
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-02 00:00:00 +01:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :development
26
+ version_requirements: *id001
27
+ description:
28
+ email: andy@andyjeffries.co.uk
29
+ executables:
30
+ - rubyrep
31
+ extensions: []
32
+
33
+ extra_rdoc_files:
34
+ - README.txt
35
+ files:
36
+ - History.txt
37
+ - License.txt
38
+ - Manifest.txt
39
+ - README.txt
40
+ - rubyrep
41
+ - rubyrep.bat
42
+ - setup.rb
43
+ - bin/rubyrep
44
+ - spec/base_runner_spec.rb
45
+ - spec/buffered_committer_spec.rb
46
+ - spec/command_runner_spec.rb
47
+ - spec/committers_spec.rb
48
+ - spec/configuration_spec.rb
49
+ - spec/connection_extender_interface_spec.rb
50
+ - spec/connection_extenders_registration_spec.rb
51
+ - spec/database_proxy_spec.rb
52
+ - spec/database_rake_spec.rb
53
+ - spec/db_specific_connection_extenders_spec.rb
54
+ - spec/db_specific_replication_extenders_spec.rb
55
+ - spec/direct_table_scan_spec.rb
56
+ - spec/dolphins.jpg
57
+ - spec/generate_runner_spec.rb
58
+ - spec/initializer_spec.rb
59
+ - spec/log_helper_spec.rb
60
+ - spec/logged_change_loader_spec.rb
61
+ - spec/logged_change_spec.rb
62
+ - spec/noisy_connection_spec.rb
63
+ - spec/postgresql_replication_spec.rb
64
+ - spec/postgresql_schema_support_spec.rb
65
+ - spec/postgresql_support_spec.rb
66
+ - spec/progress_bar_spec.rb
67
+ - spec/proxied_table_scan_spec.rb
68
+ - spec/proxy_block_cursor_spec.rb
69
+ - spec/proxy_connection_spec.rb
70
+ - spec/proxy_cursor_spec.rb
71
+ - spec/proxy_row_cursor_spec.rb
72
+ - spec/proxy_runner_spec.rb
73
+ - spec/replication_difference_spec.rb
74
+ - spec/replication_extender_interface_spec.rb
75
+ - spec/replication_extenders_spec.rb
76
+ - spec/replication_helper_spec.rb
77
+ - spec/replication_initializer_spec.rb
78
+ - spec/replication_run_spec.rb
79
+ - spec/replication_runner_spec.rb
80
+ - spec/replicators_spec.rb
81
+ - spec/rubyrep_spec.rb
82
+ - spec/scan_detail_reporter_spec.rb
83
+ - spec/scan_progress_printers_spec.rb
84
+ - spec/scan_report_printers_spec.rb
85
+ - spec/scan_runner_spec.rb
86
+ - spec/scan_summary_reporter_spec.rb
87
+ - spec/session_spec.rb
88
+ - spec/spec.opts
89
+ - spec/spec_helper.rb
90
+ - spec/strange_name_support_spec.rb
91
+ - spec/sync_helper_spec.rb
92
+ - spec/sync_runner_spec.rb
93
+ - spec/syncers_spec.rb
94
+ - spec/table_scan_helper_spec.rb
95
+ - spec/table_scan_spec.rb
96
+ - spec/table_sorter_spec.rb
97
+ - spec/table_spec_resolver_spec.rb
98
+ - spec/table_sync_spec.rb
99
+ - spec/task_sweeper_spec.rb
100
+ - spec/trigger_mode_switcher_spec.rb
101
+ - spec/two_way_replicator_spec.rb
102
+ - spec/two_way_syncer_spec.rb
103
+ - spec/type_casting_cursor_spec.rb
104
+ - spec/uninstall_runner_spec.rb
105
+ - lib/rubyrep/base_runner.rb
106
+ - lib/rubyrep/command_runner.rb
107
+ - lib/rubyrep/committers/buffered_committer.rb
108
+ - lib/rubyrep/committers/committers.rb
109
+ - lib/rubyrep/configuration.rb
110
+ - lib/rubyrep/connection_extenders/connection_extenders.rb
111
+ - lib/rubyrep/connection_extenders/jdbc_extender.rb
112
+ - lib/rubyrep/connection_extenders/mysql_extender.rb
113
+ - lib/rubyrep/connection_extenders/postgresql_extender.rb
114
+ - lib/rubyrep/database_proxy.rb
115
+ - lib/rubyrep/direct_table_scan.rb
116
+ - lib/rubyrep/generate_runner.rb
117
+ - lib/rubyrep/initializer.rb
118
+ - lib/rubyrep/log_helper.rb
119
+ - lib/rubyrep/logged_change.rb
120
+ - lib/rubyrep/logged_change_loader.rb
121
+ - lib/rubyrep/noisy_connection.rb
122
+ - lib/rubyrep/proxied_table_scan.rb
123
+ - lib/rubyrep/proxy_block_cursor.rb
124
+ - lib/rubyrep/proxy_connection.rb
125
+ - lib/rubyrep/proxy_cursor.rb
126
+ - lib/rubyrep/proxy_row_cursor.rb
127
+ - lib/rubyrep/proxy_runner.rb
128
+ - lib/rubyrep/replication_difference.rb
129
+ - lib/rubyrep/replication_extenders/mysql_replication.rb
130
+ - lib/rubyrep/replication_extenders/postgresql_replication.rb
131
+ - lib/rubyrep/replication_extenders/replication_extenders.rb
132
+ - lib/rubyrep/replication_helper.rb
133
+ - lib/rubyrep/replication_initializer.rb
134
+ - lib/rubyrep/replication_run.rb
135
+ - lib/rubyrep/replication_runner.rb
136
+ - lib/rubyrep/replicators/replicators.rb
137
+ - lib/rubyrep/replicators/two_way_replicator.rb
138
+ - lib/rubyrep/scan_progress_printers/progress_bar.rb
139
+ - lib/rubyrep/scan_progress_printers/scan_progress_printers.rb
140
+ - lib/rubyrep/scan_report_printers/scan_detail_reporter.rb
141
+ - lib/rubyrep/scan_report_printers/scan_report_printers.rb
142
+ - lib/rubyrep/scan_report_printers/scan_summary_reporter.rb
143
+ - lib/rubyrep/scan_runner.rb
144
+ - lib/rubyrep/session.rb
145
+ - lib/rubyrep/sync_helper.rb
146
+ - lib/rubyrep/sync_runner.rb
147
+ - lib/rubyrep/syncers/syncers.rb
148
+ - lib/rubyrep/syncers/two_way_syncer.rb
149
+ - lib/rubyrep/table_scan.rb
150
+ - lib/rubyrep/table_scan_helper.rb
151
+ - lib/rubyrep/table_sorter.rb
152
+ - lib/rubyrep/table_spec_resolver.rb
153
+ - lib/rubyrep/table_sync.rb
154
+ - lib/rubyrep/task_sweeper.rb
155
+ - lib/rubyrep/trigger_mode_switcher.rb
156
+ - lib/rubyrep/type_casting_cursor.rb
157
+ - lib/rubyrep/uninstall_runner.rb
158
+ - lib/rubyrep/version.rb
159
+ - lib/rubyrep.rb
160
+ has_rdoc: true
161
+ homepage: http://andyjeffries.co.uk
162
+ licenses: []
163
+
164
+ post_install_message:
165
+ rdoc_options:
166
+ - --main
167
+ - README.txt
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: "0"
176
+ required_rubygems_version: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: "0"
182
+ requirements: []
183
+
184
+ rubyforge_project:
185
+ rubygems_version: 1.6.1
186
+ signing_key:
187
+ specification_version: 3
188
+ summary: Database replication
189
+ test_files: []
190
+