rubyrep 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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