rubyrep 1.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.
Files changed (140) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +137 -0
  4. data/README.txt +37 -0
  5. data/Rakefile +30 -0
  6. data/bin/rubyrep +8 -0
  7. data/config/hoe.rb +72 -0
  8. data/config/mysql_config.rb +25 -0
  9. data/config/postgres_config.rb +21 -0
  10. data/config/proxied_test_config.rb +14 -0
  11. data/config/redmine_config.rb +17 -0
  12. data/config/rep_config.rb +20 -0
  13. data/config/requirements.rb +32 -0
  14. data/config/test_config.rb +20 -0
  15. data/lib/rubyrep/base_runner.rb +195 -0
  16. data/lib/rubyrep/command_runner.rb +144 -0
  17. data/lib/rubyrep/committers/buffered_committer.rb +140 -0
  18. data/lib/rubyrep/committers/committers.rb +146 -0
  19. data/lib/rubyrep/configuration.rb +240 -0
  20. data/lib/rubyrep/connection_extenders/connection_extenders.rb +133 -0
  21. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +284 -0
  22. data/lib/rubyrep/connection_extenders/mysql_extender.rb +168 -0
  23. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +261 -0
  24. data/lib/rubyrep/database_proxy.rb +52 -0
  25. data/lib/rubyrep/direct_table_scan.rb +75 -0
  26. data/lib/rubyrep/generate_runner.rb +105 -0
  27. data/lib/rubyrep/initializer.rb +39 -0
  28. data/lib/rubyrep/logged_change.rb +326 -0
  29. data/lib/rubyrep/proxied_table_scan.rb +171 -0
  30. data/lib/rubyrep/proxy_block_cursor.rb +145 -0
  31. data/lib/rubyrep/proxy_connection.rb +318 -0
  32. data/lib/rubyrep/proxy_cursor.rb +44 -0
  33. data/lib/rubyrep/proxy_row_cursor.rb +43 -0
  34. data/lib/rubyrep/proxy_runner.rb +89 -0
  35. data/lib/rubyrep/replication_difference.rb +91 -0
  36. data/lib/rubyrep/replication_extenders/mysql_replication.rb +271 -0
  37. data/lib/rubyrep/replication_extenders/postgresql_replication.rb +204 -0
  38. data/lib/rubyrep/replication_extenders/replication_extenders.rb +26 -0
  39. data/lib/rubyrep/replication_helper.rb +104 -0
  40. data/lib/rubyrep/replication_initializer.rb +307 -0
  41. data/lib/rubyrep/replication_run.rb +48 -0
  42. data/lib/rubyrep/replication_runner.rb +138 -0
  43. data/lib/rubyrep/replicators/replicators.rb +37 -0
  44. data/lib/rubyrep/replicators/two_way_replicator.rb +334 -0
  45. data/lib/rubyrep/scan_progress_printers/progress_bar.rb +65 -0
  46. data/lib/rubyrep/scan_progress_printers/scan_progress_printers.rb +65 -0
  47. data/lib/rubyrep/scan_report_printers/scan_detail_reporter.rb +111 -0
  48. data/lib/rubyrep/scan_report_printers/scan_report_printers.rb +67 -0
  49. data/lib/rubyrep/scan_report_printers/scan_summary_reporter.rb +75 -0
  50. data/lib/rubyrep/scan_runner.rb +25 -0
  51. data/lib/rubyrep/session.rb +177 -0
  52. data/lib/rubyrep/sync_helper.rb +111 -0
  53. data/lib/rubyrep/sync_runner.rb +31 -0
  54. data/lib/rubyrep/syncers/syncers.rb +112 -0
  55. data/lib/rubyrep/syncers/two_way_syncer.rb +174 -0
  56. data/lib/rubyrep/table_scan.rb +54 -0
  57. data/lib/rubyrep/table_scan_helper.rb +38 -0
  58. data/lib/rubyrep/table_sorter.rb +70 -0
  59. data/lib/rubyrep/table_spec_resolver.rb +136 -0
  60. data/lib/rubyrep/table_sync.rb +68 -0
  61. data/lib/rubyrep/trigger_mode_switcher.rb +63 -0
  62. data/lib/rubyrep/type_casting_cursor.rb +31 -0
  63. data/lib/rubyrep/uninstall_runner.rb +92 -0
  64. data/lib/rubyrep/version.rb +9 -0
  65. data/lib/rubyrep.rb +68 -0
  66. data/script/destroy +14 -0
  67. data/script/generate +14 -0
  68. data/script/txt2html +74 -0
  69. data/setup.rb +1585 -0
  70. data/sims/performance/big_rep_spec.rb +100 -0
  71. data/sims/performance/big_scan_spec.rb +57 -0
  72. data/sims/performance/big_sync_spec.rb +141 -0
  73. data/sims/performance/performance.rake +228 -0
  74. data/sims/sim_helper.rb +24 -0
  75. data/spec/base_runner_spec.rb +218 -0
  76. data/spec/buffered_committer_spec.rb +271 -0
  77. data/spec/command_runner_spec.rb +145 -0
  78. data/spec/committers_spec.rb +174 -0
  79. data/spec/configuration_spec.rb +198 -0
  80. data/spec/connection_extender_interface_spec.rb +138 -0
  81. data/spec/connection_extenders_registration_spec.rb +129 -0
  82. data/spec/database_proxy_spec.rb +48 -0
  83. data/spec/database_rake_spec.rb +40 -0
  84. data/spec/db_specific_connection_extenders_spec.rb +34 -0
  85. data/spec/db_specific_replication_extenders_spec.rb +38 -0
  86. data/spec/direct_table_scan_spec.rb +61 -0
  87. data/spec/generate_runner_spec.rb +84 -0
  88. data/spec/initializer_spec.rb +46 -0
  89. data/spec/logged_change_spec.rb +480 -0
  90. data/spec/postgresql_replication_spec.rb +48 -0
  91. data/spec/postgresql_support_spec.rb +57 -0
  92. data/spec/progress_bar_spec.rb +77 -0
  93. data/spec/proxied_table_scan_spec.rb +151 -0
  94. data/spec/proxy_block_cursor_spec.rb +197 -0
  95. data/spec/proxy_connection_spec.rb +399 -0
  96. data/spec/proxy_cursor_spec.rb +56 -0
  97. data/spec/proxy_row_cursor_spec.rb +66 -0
  98. data/spec/proxy_runner_spec.rb +70 -0
  99. data/spec/replication_difference_spec.rb +160 -0
  100. data/spec/replication_extender_interface_spec.rb +365 -0
  101. data/spec/replication_extenders_spec.rb +32 -0
  102. data/spec/replication_helper_spec.rb +121 -0
  103. data/spec/replication_initializer_spec.rb +477 -0
  104. data/spec/replication_run_spec.rb +166 -0
  105. data/spec/replication_runner_spec.rb +213 -0
  106. data/spec/replicators_spec.rb +31 -0
  107. data/spec/rubyrep_spec.rb +8 -0
  108. data/spec/scan_detail_reporter_spec.rb +119 -0
  109. data/spec/scan_progress_printers_spec.rb +68 -0
  110. data/spec/scan_report_printers_spec.rb +67 -0
  111. data/spec/scan_runner_spec.rb +50 -0
  112. data/spec/scan_summary_reporter_spec.rb +61 -0
  113. data/spec/session_spec.rb +212 -0
  114. data/spec/spec.opts +1 -0
  115. data/spec/spec_helper.rb +295 -0
  116. data/spec/sync_helper_spec.rb +157 -0
  117. data/spec/sync_runner_spec.rb +78 -0
  118. data/spec/syncers_spec.rb +171 -0
  119. data/spec/table_scan_helper_spec.rb +29 -0
  120. data/spec/table_scan_spec.rb +49 -0
  121. data/spec/table_sorter_spec.rb +31 -0
  122. data/spec/table_spec_resolver_spec.rb +102 -0
  123. data/spec/table_sync_spec.rb +84 -0
  124. data/spec/trigger_mode_switcher_spec.rb +83 -0
  125. data/spec/two_way_replicator_spec.rb +551 -0
  126. data/spec/two_way_syncer_spec.rb +256 -0
  127. data/spec/type_casting_cursor_spec.rb +50 -0
  128. data/spec/uninstall_runner_spec.rb +86 -0
  129. data/tasks/database.rake +439 -0
  130. data/tasks/deployment.rake +29 -0
  131. data/tasks/environment.rake +9 -0
  132. data/tasks/java.rake +37 -0
  133. data/tasks/redmine_test.rake +47 -0
  134. data/tasks/rspec.rake +68 -0
  135. data/tasks/rubyrep.tailor +18 -0
  136. data/tasks/stats.rake +19 -0
  137. data/tasks/task_helper.rb +20 -0
  138. data.tar.gz.sig +0 -0
  139. metadata +243 -0
  140. metadata.gz.sig +0 -0
@@ -0,0 +1,439 @@
1
+ $LOAD_PATH.unshift File.dirname(__FILE__) + "../lib/rubyrep"
2
+ require 'rake'
3
+ require 'rubyrep'
4
+
5
+ require File.dirname(__FILE__) + '/task_helper.rb'
6
+ require File.dirname(__FILE__) + '/../config/test_config'
7
+
8
+ # Creates the databases for the given configuration hash
9
+ def create_database(config)
10
+ begin
11
+ RR::ConnectionExtenders.db_connect(config)
12
+ rescue
13
+ case config[:adapter]
14
+ when 'postgresql'
15
+ `createdb "#{config[:database]}" -E utf8`
16
+ when 'mysql'
17
+ @charset = ENV['CHARSET'] || 'utf8'
18
+ @collation = ENV['COLLATION'] || 'utf8_general_ci'
19
+ begin
20
+ connection = RR::ConnectionExtenders.db_connect(config.merge({'database' => nil}))
21
+ connection.create_database(config[:database], {:charset => @charset, :collation => @collation})
22
+ RR::ConnectionExtenders.db_connect(config)
23
+ rescue
24
+ $stderr.puts $!
25
+ $stderr.puts "Couldn't create database for #{config.inspect}"
26
+ end
27
+ else
28
+ puts "adapter #{config[:adapter]} not supported"
29
+ end
30
+ else
31
+ puts "database #{config[:database]} already exists"
32
+ end
33
+ end
34
+
35
+ # Drops the databases identified by the given configuration hash
36
+ def drop_database(config)
37
+ case config[:adapter]
38
+ when 'postgresql'
39
+ `dropdb "#{config[:database]}"`
40
+ when 'mysql'
41
+ connection = RR::ConnectionExtenders.db_connect(config.merge({'database' => nil}))
42
+ connection.drop_database config[:database]
43
+ else
44
+ puts "adapter #{config[:adapter]} not supported"
45
+ end
46
+ end
47
+
48
+ # Creates the schema and tables for the postgres schema test
49
+ def create_postgres_schema(config)
50
+ return unless config[:adapter] == 'postgresql'
51
+ ActiveRecord::Base.establish_connection config
52
+ ActiveRecord::Schema.define do
53
+ execute <<-end_sql
54
+ create schema rr;
55
+
56
+ set search_path to rr;
57
+ end_sql
58
+
59
+ create_table :rr_simple do |t|
60
+ t.column :name, :string
61
+ end
62
+ execute "insert into rr_simple(id, name) values(1, 'bla')"
63
+
64
+ create_table :rr_referenced, :id => true do |t|
65
+ t.column :name, :string
66
+ end
67
+
68
+ create_table :rr_referencing, :id => true do |t|
69
+ t.column :rr_referenced_id, :integer
70
+ end
71
+
72
+ ActiveRecord::Base.connection.execute(<<-end_sql)
73
+ ALTER TABLE rr_referencing ADD CONSTRAINT rr_referenced_fkey
74
+ FOREIGN KEY (rr_referenced_id)
75
+ REFERENCES rr_referenced(id)
76
+ end_sql
77
+
78
+ create_table :rr_trigger_test, :id => false do |t|
79
+ t.column :first_id, :integer
80
+ t.column :second_id, :integer
81
+ t.column :name, :string
82
+ end
83
+
84
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
85
+ ALTER TABLE rr_trigger_test ADD CONSTRAINT rr_trigger_test_pkey
86
+ PRIMARY KEY (first_id, second_id)
87
+ end_sql
88
+
89
+ create_table :rr_sequence_test do |t|
90
+ t.column :name, :string
91
+ end
92
+ end
93
+ end
94
+
95
+ # Drops the schema and tables that were created for the postgres schema test
96
+ def drop_postgres_schema(config)
97
+ return unless config[:adapter] == 'postgresql'
98
+ ActiveRecord::Base.establish_connection config
99
+ ActiveRecord::Schema.define do
100
+ execute "drop schema rr cascade"
101
+ end
102
+ end
103
+
104
+ # Creates the sample schema in the database specified by the given
105
+ # configuration hash.
106
+ def create_sample_schema(config)
107
+ create_postgres_schema config
108
+
109
+ ActiveRecord::Base.establish_connection config
110
+
111
+ ActiveRecord::Schema.define do
112
+ create_table :scanner_text_key, :id => false do |t|
113
+ t.column :text_id, :string
114
+ t.column :name, :string
115
+ end rescue nil
116
+
117
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
118
+ ALTER TABLE scanner_text_key ADD CONSTRAINT scanner_text_key_pkey
119
+ PRIMARY KEY (text_id)
120
+ end_sql
121
+
122
+ create_table :scanner_records do |t|
123
+ t.column :name, :string, :null => false
124
+ end rescue nil
125
+
126
+ add_index :scanner_records, :name, :unique rescue nil
127
+
128
+ create_table :scanner_left_records_only do |t|
129
+ t.column :name, :string, :null => false
130
+ end rescue nil
131
+
132
+ create_table :extender_combined_key, :id => false do |t|
133
+ t.column :first_id, :integer
134
+ t.column :second_id, :integer
135
+ t.column :name, :string
136
+ end rescue nil
137
+
138
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
139
+ ALTER TABLE extender_combined_key ADD CONSTRAINT extender_combined_key_pkey
140
+ PRIMARY KEY (first_id, second_id)
141
+ end_sql
142
+
143
+ create_table :referenced_table, :id => false do |t|
144
+ t.column :first_id, :integer
145
+ t.column :second_id, :integer
146
+ t.column :name, :string
147
+ end
148
+
149
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
150
+ ALTER TABLE referenced_table ADD CONSTRAINT referenced_table_pkey
151
+ PRIMARY KEY (first_id, second_id)
152
+ end_sql
153
+
154
+ create_table :referenced_table2, :id => true do |t|
155
+ t.column :name, :string
156
+ end
157
+
158
+ create_table :referencing_table, :id => true do |t|
159
+ t.column :first_fk, :integer
160
+ t.column :second_fk, :integer
161
+ t.column :third_fk, :integer
162
+ end
163
+
164
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
165
+ ALTER TABLE referencing_table ADD CONSTRAINT referencing_table_fkey
166
+ FOREIGN KEY (first_fk, second_fk)
167
+ REFERENCES referenced_table(first_id, second_id)
168
+ end_sql
169
+
170
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
171
+ ALTER TABLE referencing_table ADD CONSTRAINT referencing_table2_fkey
172
+ FOREIGN KEY (third_fk)
173
+ REFERENCES referenced_table2(id)
174
+ end_sql
175
+
176
+ create_table :extender_inverted_combined_key, :id => false do |t|
177
+ t.column :first_id, :integer
178
+ t.column :second_id, :integer
179
+ end rescue nil
180
+
181
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
182
+ ALTER TABLE extender_inverted_combined_key
183
+ ADD CONSTRAINT extender_inverted_combined_key_pkey
184
+ PRIMARY KEY (second_id, first_id)
185
+ end_sql
186
+
187
+ create_table :extender_without_key, :id => false do |t|
188
+ t.column :first_id, :integer
189
+ t.column :second_id, :integer
190
+ end rescue nil
191
+
192
+ create_table :extender_one_record do |t|
193
+ t.column :name, :string
194
+ end rescue nil
195
+
196
+ create_table :extender_no_record do |t|
197
+ t.column :name, :string
198
+ end rescue nil
199
+
200
+ create_table :extender_type_check do |t|
201
+ t.column :decimal_test, :decimal, :precision => 10, :scale => 5
202
+ t.column :timestamp, :timestamp
203
+ t.column :multi_byte, :string
204
+ t.column :binary_test, :binary
205
+ t.column :text_test, :text
206
+ end rescue nil
207
+
208
+ create_table :table_with_manual_key, :id => false do |t|
209
+ t.column :id, :integer
210
+ t.column :name, :string
211
+ end
212
+
213
+ create_table :rr_pending_changes do |t|
214
+ t.column :change_table, :string
215
+ t.column :change_key, :string
216
+ t.column :change_new_key, :string
217
+ t.column :change_type, :string
218
+ t.column :change_time, :timestamp
219
+ end
220
+
221
+ create_table :rr_logged_events do |t|
222
+ t.column :activity, :string
223
+ t.column :change_table, :string
224
+ t.column :diff_type, :string
225
+ t.column :change_key, :string
226
+ t.column :left_change_type, :string
227
+ t.column :right_change_type, :string
228
+ t.column :description, :string
229
+ t.column :long_description, :string, :limit => RR::ReplicationInitializer::LONG_DESCRIPTION_SIZE
230
+ t.column :event_time, :timestamp
231
+ t.column :diff_dump, :string, :limit => RR::ReplicationInitializer::DIFF_DUMP_SIZE
232
+ end
233
+
234
+ create_table :rr_running_flags, :id => false do |t|
235
+ t.column :active, :integer
236
+ end
237
+
238
+ create_table :trigger_test, :id => false do |t|
239
+ t.column :first_id, :integer
240
+ t.column :second_id, :integer
241
+ t.column :name, :string
242
+ end
243
+
244
+ ActiveRecord::Base.connection.execute(<<-end_sql) rescue nil
245
+ ALTER TABLE trigger_test ADD CONSTRAINT trigger_test_pkey
246
+ PRIMARY KEY (first_id, second_id)
247
+ end_sql
248
+
249
+ create_table :sequence_test do |t|
250
+ t.column :name, :string
251
+ end
252
+
253
+ create_table :left_table do |t|
254
+ t.column :name, :string
255
+ end
256
+
257
+ create_table :right_table do |t|
258
+ t.column :name, :string
259
+ end
260
+ end
261
+ end
262
+
263
+ # Removes all tables from the sample scheme
264
+ # config: Hash of configuration values for the desired database connection
265
+ def drop_sample_schema(config)
266
+ drop_postgres_schema config
267
+
268
+ connection = RR::ConnectionExtenders.db_connect(config)
269
+ ActiveRecord::Base.connection = connection
270
+
271
+ ActiveRecord::Schema.define do
272
+ drop_table :extender_type_check rescue nil
273
+ drop_table :extender_no_record rescue nil
274
+ drop_table :extender_one_record rescue nil
275
+ drop_table :extender_without_key rescue nil
276
+ drop_table :extender_inverted_combined_key rescue nil
277
+ drop_table :extender_combined_key rescue nil
278
+ drop_table :scanner_left_records_only rescue nil
279
+ drop_table :scanner_records rescue nil
280
+ drop_table :scanner_text_key rescue nil
281
+ drop_table :referencing_table rescue nil
282
+ drop_table :referenced_table rescue nil
283
+ drop_table :referenced_table2 rescue nil
284
+ drop_table :table_with_manual_key
285
+ drop_table :rr_pending_changes rescue nil
286
+ drop_table :rr_running_flags rescue nil
287
+ drop_table :trigger_test rescue nil
288
+ drop_table :sequence_test rescue nil
289
+ drop_table :left_table rescue nil
290
+ drop_table :right_table rescue nil
291
+ end
292
+
293
+ ActiveRecord::Base.connection.disconnect!
294
+ end
295
+
296
+ class ExtenderCombinedKey < ActiveRecord::Base
297
+ set_table_name "extender_combined_key"
298
+ include CreateWithKey
299
+ end
300
+
301
+ class ScannerRecords < ActiveRecord::Base
302
+ include CreateWithKey
303
+ end
304
+
305
+ class ScannerLeftRecordsOnly < ActiveRecord::Base
306
+ set_table_name "scanner_left_records_only"
307
+ include CreateWithKey
308
+ end
309
+
310
+ class ExtenderOneRecord < ActiveRecord::Base
311
+ set_table_name "extender_one_record"
312
+ include CreateWithKey
313
+ end
314
+
315
+ class ExtenderTypeCheck < ActiveRecord::Base
316
+ set_table_name "extender_type_check"
317
+ include CreateWithKey
318
+ end
319
+
320
+ # Inserts the row as per specified :column_name => value hash in the specified database and table
321
+ # Used to create data in tables where the standard ActiveRecord approach doesn't work
322
+ # (E. g. tables with primary keys in text format)
323
+ def create_row(connection, table, row)
324
+ sql = "insert into #{table}("
325
+ sql << row.keys.join(', ')
326
+ sql << ") values('"
327
+ sql << row.values.join("', '")
328
+ sql << "')"
329
+ connection.execute sql
330
+ end
331
+
332
+ # Deletes all records and creates the records being same in left and right DB
333
+ def delete_all_and_create_shared_sample_data(config)
334
+ ActiveRecord::Base.establish_connection config
335
+ ScannerRecords.delete_all
336
+ ScannerRecords.create_with_key :id => 1, :name => 'Alice - exists in both databases'
337
+
338
+ ExtenderOneRecord.delete_all
339
+ ExtenderOneRecord.create_with_key :id => 1, :name => 'Alice'
340
+
341
+ ExtenderTypeCheck.delete_all
342
+ ExtenderTypeCheck.create_with_key(
343
+ :id => 1,
344
+ :decimal_test => 1.234,
345
+ :timestamp => Time.local(2007,"nov",10,20,15,1),
346
+ :multi_byte => "よろしくお願(ねが)いします yoroshiku onegai shimasu: I humbly ask for your favor.",
347
+ :binary_test => Marshal.dump(['bla',:dummy,1,2,3])
348
+ )
349
+
350
+ connection = ActiveRecord::Base.connection
351
+ # The primary key of this table is in text format - ActiveRecord cannot be
352
+ # used to create the example data.
353
+ connection.execute "delete from scanner_text_key"
354
+ [ {:text_id => 'a', :name => 'Alice'},
355
+ {:text_id => 'b', :name => 'Bob'},
356
+ {:text_id => 'c', :name => 'Charlie'}
357
+ ].each { |row| create_row connection, 'scanner_text_key', row}
358
+
359
+ # ActiveRecord also doesn't handle tables with combined primary keys
360
+ connection.execute("delete from extender_combined_key")
361
+ [
362
+ {:first_id => 1, :second_id => 1, :name => 'aa'},
363
+ {:first_id => 1, :second_id => 2, :name => 'ab'},
364
+ {:first_id => 2, :second_id => 1, :name => 'ba'},
365
+ {:first_id => 3, :second_id => 1}
366
+ ].each { |row| create_row connection, 'extender_combined_key', row}
367
+ end
368
+
369
+ # Reinitializes the sample schema with the sample data
370
+ def create_sample_data
371
+ # Create records existing in both databases
372
+ [:left, :right].each do |database|
373
+ delete_all_and_create_shared_sample_data RR::Initializer.configuration.send(database)
374
+ end
375
+
376
+ # Create data in left table
377
+ ActiveRecord::Base.establish_connection RR::Initializer.configuration.left
378
+ ScannerRecords.create_with_key :id => 2, :name => 'Bob - left database version'
379
+ ScannerRecords.create_with_key :id => 3, :name => 'Charlie - exists in left database only'
380
+ ScannerRecords.create_with_key :id => 5, :name => 'Eve - exists in left database only'
381
+
382
+ ScannerLeftRecordsOnly.delete_all
383
+ ScannerLeftRecordsOnly.create_with_key :id => 1, :name => 'Alice'
384
+ ScannerLeftRecordsOnly.create_with_key :id => 2, :name => 'Bob'
385
+
386
+ # Create data in right table
387
+ ActiveRecord::Base.establish_connection RR::Initializer.configuration.right
388
+ ScannerRecords.create_with_key :id => 2, :name => 'Bob - right database version'
389
+ ScannerRecords.create_with_key :id => 4, :name => 'Dave - exists in right database only'
390
+ ScannerRecords.create_with_key :id => 6, :name => 'Fred - exists in right database only'
391
+ end
392
+
393
+ namespace :db do
394
+ namespace :test do
395
+
396
+ desc "Creates the test databases"
397
+ task :create do
398
+ create_database RR::Initializer.configuration.left rescue nil
399
+ create_database RR::Initializer.configuration.right rescue nil
400
+ end
401
+
402
+ desc "Drops the test databases"
403
+ task :drop do
404
+ drop_database RR::Initializer.configuration.left rescue nil
405
+ drop_database RR::Initializer.configuration.right rescue nil
406
+ end
407
+
408
+ desc "Rebuilds the test databases & schemas"
409
+ task :rebuild => [:drop_schema, :drop, :create, :create_schema, :populate]
410
+
411
+ desc "Create the sample schemas"
412
+ task :create_schema do
413
+ create_sample_schema RR::Initializer.configuration.left rescue nil
414
+ create_sample_schema RR::Initializer.configuration.right rescue nil
415
+ end
416
+
417
+ desc "Writes the sample data"
418
+ task :populate do
419
+ create_sample_data
420
+ end
421
+
422
+ desc "Drops the sample schemas"
423
+ task :drop_schema do
424
+ # Since Rails 2.2 ActiveRecord doesn't release the database connection
425
+ # anymore. Thus the dropping of the database fails.
426
+ # Workaround:
427
+ # Execute the schema removal in a sub process. Once the sub process
428
+ # exits, it's database connections die.
429
+ pid = Process.fork
430
+ if pid
431
+ Process.wait pid
432
+ else
433
+ drop_sample_schema RR::Initializer.configuration.left rescue nil
434
+ drop_sample_schema RR::Initializer.configuration.right rescue nil
435
+ Kernel.exit!
436
+ end
437
+ end
438
+ end
439
+ end
@@ -0,0 +1,29 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ namespace :deploy do
11
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
12
+ task :local => [:website_generate, :install_gem]
13
+
14
+ task :check_version do
15
+ unless ENV['VERSION']
16
+ puts 'Must pass a VERSION=x.y.z release version'
17
+ exit
18
+ end
19
+ unless ENV['VERSION'] == VERS
20
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
21
+ exit
22
+ end
23
+ end
24
+
25
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
26
+ task :install_gem_no_doc => [:clean, :package] do
27
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ JRUBY_HOME = "#{ENV['HOME']}/usr/jruby"
2
+
3
+ task :ruby_env do
4
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
5
+ "jruby"
6
+ else
7
+ "ruby"
8
+ end unless defined? RUBY_APP
9
+ end
data/tasks/java.rake ADDED
@@ -0,0 +1,37 @@
1
+ namespace :deploy do
2
+
3
+ BASH_FILE_CONTENT = <<'EOS'
4
+ #!/bin/bash
5
+
6
+ script_dir="`dirname \"$0\"`"
7
+
8
+ jruby_path="$script_dir"/jruby/bin/jruby
9
+ rubyrep_path="$script_dir"/bin/rubyrep
10
+
11
+ $jruby_path --server $rubyrep_path $*
12
+ EOS
13
+
14
+ BAT_FILE_CONTENT = <<'EOS'.gsub(/^(.*)$/,"\\1\r")
15
+ @echo off
16
+ set jruby_path=%~dp0jruby\bin\jruby.bat
17
+ set rubyrep_path=%~dp0bin\rubyrep
18
+ %jruby_path% --server %rubyrep_path% %1 %2 %3 %4 %5 %6 %7 %8 %9
19
+ EOS
20
+
21
+ desc "Create the java installation package"
22
+ task :java do
23
+ pkg_name = "rubyrep-#{RR::VERSION::STRING}"
24
+
25
+ system "rm -rf /tmp/#{pkg_name}"
26
+ system "hg archive /tmp/#{pkg_name}"
27
+ system "mkdir -p /tmp/#{pkg_name}/jruby"
28
+ system "cp -r #{JRUBY_HOME}/* /tmp/#{pkg_name}/jruby/"
29
+ system "cd /tmp/#{pkg_name}/jruby; rm -rf samples share/ri lib/ruby/gems/1.8/doc"
30
+ File.open("/tmp/#{pkg_name}/rubyrep.bat", 'w') {|f| f.write(BAT_FILE_CONTENT)}
31
+ File.open("/tmp/#{pkg_name}/rubyrep", 'w') {|f| f.write(BASH_FILE_CONTENT)}
32
+ system "chmod a+x /tmp/#{pkg_name}/rubyrep"
33
+ system "cd /tmp; rm -f #{pkg_name}.zip; zip -r #{pkg_name}.zip #{pkg_name} >/dev/null"
34
+ system "mkdir -p pkg"
35
+ system "cp /tmp/#{pkg_name}.zip pkg"
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ require 'fileutils'
2
+ def install_redmine(database, name = nil)
3
+ unless name
4
+ install_redmine database, 'leftmine'
5
+ install_redmine database, 'rightmine'
6
+ else
7
+ database = database.to_s
8
+ database.sub!(/^postgres$/, 'postgresql')
9
+
10
+ FileUtils.cd(File.expand_path("~"))
11
+ unless File.exists?(name)
12
+ system "svn checkout -r 2145 http://redmine.rubyforge.org/svn/trunk #{name}"
13
+ end
14
+ FileUtils.cd name
15
+ ENV['RAILS_ENV'] = 'production'
16
+ config = File.read('config/database.yml.example')
17
+ config.gsub! 'redmine', name
18
+ config.gsub! 'mysql', database
19
+ if database == 'postgresql'
20
+ config.gsub! 'root', 'postgres'
21
+ end
22
+ File.open('config/database.yml', 'w') { |f| f.write config }
23
+ system 'rake db:drop'
24
+ system 'rake db:create'
25
+ system 'rake db:migrate'
26
+ system 'echo |rake redmine:load_default_data'
27
+ end
28
+ end
29
+
30
+ desc "Deploys two Redmine test installations"
31
+ namespace :deploy do
32
+ task :redmine do
33
+
34
+ database = ENV['RR_TEST_DB'] ? ENV['RR_TEST_DB'] : :postgres
35
+ install_redmine database
36
+
37
+ puts(<<EOS)
38
+ # Setup finished
39
+ # Start the redmine instances on ports 3000 and 3001 respectively
40
+ # with the following commands:
41
+ (cd ~/leftmine; ruby ./script/server -p 3000 -e production)
42
+ (cd ~/rightmine; ruby ./script/server -p 3001 -e production)
43
+ # Start the replication with
44
+ ruby ./bin/rubyrep replicate -c ./config/redmine_config.rb
45
+ EOS
46
+ end
47
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,68 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/*_spec.rb']
21
+ end
22
+
23
+ namespace :spec do
24
+ desc "Generate specdocs for examples for inclusion in RDoc"
25
+ Spec::Rake::SpecTask.new('docs') do |t|
26
+ t.spec_files = FileList['spec/*_spec.rb']
27
+ t.spec_opts = ["--format", "specdoc"]
28
+ end
29
+
30
+ desc "Run the specs with RCov"
31
+ Spec::Rake::SpecTask.new('rcov') do |t|
32
+ t.spec_opts = ['--options', "spec/spec.opts"]
33
+ t.spec_files = FileList['spec/*_spec.rb']
34
+ t.rcov = true
35
+ t.rcov_opts = [
36
+ '--exclude', 'tasks/,spec/,gems/\(?!rubyrep\)',
37
+ '--xrefs'
38
+ ]
39
+ end
40
+
41
+ desc "Run the specs for all supported databases"
42
+ task :all_dbs do
43
+ [:postgres, :mysql].each do |test_db|
44
+ puts "Running specs for #{test_db.id2name}"
45
+ ENV['RR_TEST_DB'] = test_db.id2name
46
+ system "spec spec"
47
+ end
48
+ end
49
+
50
+ desc "Run the specs for all supported databases and ruby platforms"
51
+ task :all_rubies do
52
+ puts "Running spec:all_dbs in standard ruby"
53
+ system "rake spec:all_dbs"
54
+ puts "Running spec:all_dbs in jruby"
55
+ system "export PATH=#{JRUBY_HOME}/bin:$PATH; rake spec:all_dbs"
56
+ end
57
+
58
+ begin
59
+ require 'ruby-prof/task'
60
+ RubyProf::ProfileTask.new do |t|
61
+ t.test_files = FileList['spec/*_spec.rb']
62
+ t.output_dir = 'profile'
63
+ t.printer = :flat
64
+ t.min_percent = 1
65
+ end
66
+ rescue LoadError
67
+ end
68
+ end
@@ -0,0 +1,18 @@
1
+ [DEFAULT]
2
+ verbose = True
3
+
4
+ [project]
5
+ target = svn:target
6
+ start-revision = 1
7
+ root-directory = /tmp/rubyrep_tailor
8
+ state-file = tailor.state
9
+ source = hg:source
10
+
11
+ [hg:source]
12
+ repository = .
13
+ subdir = hg
14
+
15
+ [svn:target]
16
+ repository = file:///tmp/rubyrep_tailor/svn_repository
17
+ module = rubyrep
18
+ subdir = svn
data/tasks/stats.rake ADDED
@@ -0,0 +1,19 @@
1
+ begin
2
+ require 'code_statistics' # This library is coming with the rails gem
3
+ desc "Report code statistics (KLOCs, etc)"
4
+ task :stats do
5
+ STATS_DIRECTORIES = [
6
+ %w(Libraries lib/),
7
+ %w(Unit\ tests spec/),
8
+ %w(Integration\ tests sims/)
9
+ ].collect { |name, dir| [ name, "#{File.dirname(__FILE__)}/../#{dir}" ] }.select { |name, dir| File.directory?(dir) }
10
+
11
+ desc "Report code statistics (KLOCs, etc) from the application"
12
+ task :stats do
13
+ require 'code_statistics'
14
+ CodeStatistics.new(*STATS_DIRECTORIES).to_s
15
+ end
16
+
17
+ end
18
+ rescue LoadError
19
+ end
@@ -0,0 +1,20 @@
1
+ # The standard ActiveRecord#create method ignores primary key attributes.
2
+ # This module provides a create method that allows manual setting of primary key values.
3
+ module CreateWithKey
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+ # The standard "create" method ignores primary key attributes
10
+ # This method set's _all_ attributes as provided
11
+ def create_with_key attributes
12
+ o = new
13
+ attributes.each do |key, value|
14
+ o[key] = value
15
+ end
16
+ o.save
17
+ end
18
+ end
19
+ end
20
+
data.tar.gz.sig ADDED
Binary file