rubyrep 1.0.9 → 1.1.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 (38) hide show
  1. data/History.txt +5 -0
  2. data/config/hoe.rb +2 -2
  3. data/config/requirements.rb +1 -1
  4. data/lib/rubyrep/committers/buffered_committer.rb +20 -15
  5. data/lib/rubyrep/configuration.rb +11 -7
  6. data/lib/rubyrep/connection_extenders/connection_extenders.rb +1 -1
  7. data/lib/rubyrep/connection_extenders/jdbc_extender.rb +16 -34
  8. data/lib/rubyrep/connection_extenders/postgresql_extender.rb +66 -0
  9. data/lib/rubyrep/proxy_connection.rb +30 -3
  10. data/lib/rubyrep/replication_helper.rb +33 -3
  11. data/lib/rubyrep/replication_run.rb +20 -1
  12. data/lib/rubyrep/replicators/replicators.rb +6 -1
  13. data/lib/rubyrep/replicators/two_way_replicator.rb +12 -20
  14. data/lib/rubyrep/sync_helper.rb +14 -6
  15. data/lib/rubyrep/syncers/syncers.rb +3 -3
  16. data/lib/rubyrep/syncers/two_way_syncer.rb +4 -4
  17. data/lib/rubyrep/table_sync.rb +23 -1
  18. data/lib/rubyrep/version.rb +2 -2
  19. data/spec/configuration_spec.rb +5 -0
  20. data/spec/connection_extender_interface_spec.rb +16 -21
  21. data/spec/db_specific_connection_extenders_spec.rb +1 -1
  22. data/spec/logged_change_spec.rb +2 -2
  23. data/spec/noisy_connection_spec.rb +7 -9
  24. data/spec/postgresql_schema_support_spec.rb +5 -2
  25. data/spec/postgresql_support_spec.rb +8 -2
  26. data/spec/proxy_connection_spec.rb +34 -30
  27. data/spec/replication_helper_spec.rb +40 -0
  28. data/spec/replication_run_spec.rb +114 -3
  29. data/spec/replicators_spec.rb +5 -0
  30. data/spec/strange_name_support_spec.rb +14 -3
  31. data/spec/sync_helper_spec.rb +11 -4
  32. data/spec/syncers_spec.rb +6 -6
  33. data/spec/table_sync_spec.rb +60 -4
  34. data/spec/two_way_replicator_spec.rb +18 -38
  35. data/spec/two_way_syncer_spec.rb +6 -6
  36. data/spec/type_casting_cursor_spec.rb +8 -8
  37. data/tasks/database.rake +6 -0
  38. metadata +4 -4
data/spec/syncers_spec.rb CHANGED
@@ -101,7 +101,7 @@ describe Syncers::OneWaySyncer do
101
101
  helper = SyncHelper.new(sync)
102
102
  helper.stub!(:sync_options).and_return({:direction => :left, :delete => true})
103
103
  syncer = Syncers::OneWaySyncer.new(helper)
104
- helper.should_receive(:delete_record).with(:left, :dummy_record)
104
+ helper.should_receive(:delete_record).with(:left, 'scanner_records', :dummy_record)
105
105
  helper.should_not_receive(:update_record)
106
106
  helper.should_not_receive(:insert_record)
107
107
  syncer.sync_difference(:left, :dummy_record)
@@ -109,7 +109,7 @@ describe Syncers::OneWaySyncer do
109
109
  helper = SyncHelper.new(sync)
110
110
  helper.stub!(:sync_options).and_return({:direction => :right, :delete => true})
111
111
  syncer = Syncers::OneWaySyncer.new(helper)
112
- helper.should_receive(:delete_record).with(:right, :dummy_record)
112
+ helper.should_receive(:delete_record).with(:right, 'scanner_records', :dummy_record)
113
113
  syncer.sync_difference(:right, :dummy_record)
114
114
  end
115
115
 
@@ -131,13 +131,13 @@ describe Syncers::OneWaySyncer do
131
131
  syncer = Syncers::OneWaySyncer.new(helper)
132
132
  helper.should_not_receive(:delete_record)
133
133
  helper.should_not_receive(:update_record)
134
- helper.should_receive(:insert_record).with(:left, :dummy_record)
134
+ helper.should_receive(:insert_record).with(:left, 'scanner_records', :dummy_record)
135
135
  syncer.sync_difference(:right, :dummy_record)
136
136
 
137
137
  helper = SyncHelper.new(sync)
138
138
  helper.stub!(:sync_options).and_return({:direction => :right, :insert => true})
139
139
  syncer = Syncers::OneWaySyncer.new(helper)
140
- helper.should_receive(:insert_record).with(:right, :dummy_record)
140
+ helper.should_receive(:insert_record).with(:right, 'scanner_records', :dummy_record)
141
141
  syncer.sync_difference(:left, :dummy_record)
142
142
  end
143
143
 
@@ -158,14 +158,14 @@ describe Syncers::OneWaySyncer do
158
158
  helper.stub!(:sync_options).and_return({:direction => :left, :update => true})
159
159
  syncer = Syncers::OneWaySyncer.new(helper)
160
160
  helper.should_not_receive(:delete_record)
161
- helper.should_receive(:update_record).with(:left, :right_record)
161
+ helper.should_receive(:update_record).with(:left, 'scanner_records', :right_record)
162
162
  helper.should_not_receive(:insert_record)
163
163
  syncer.sync_difference(:conflict, [:left_record, :right_record])
164
164
 
165
165
  helper = SyncHelper.new(sync)
166
166
  helper.stub!(:sync_options).and_return({:direction => :right, :update => true})
167
167
  syncer = Syncers::OneWaySyncer.new(helper)
168
- helper.should_receive(:update_record).with(:right, :left_record)
168
+ helper.should_receive(:update_record).with(:right, 'scanner_records', :left_record)
169
169
  syncer.sync_difference(:conflict, [:left_record, :right_record])
170
170
  end
171
171
  end
@@ -22,7 +22,7 @@ describe TableSync do
22
22
  sync.execute_sync_hook(:before_table_sync)
23
23
  end
24
24
 
25
- it "execute_sync_look should execute the given SQL command" do
25
+ it "execute_sync_hook should execute the given SQL command" do
26
26
  config = deep_copy(standard_config)
27
27
  config.add_table_options 'scanner_records', :before_table_sync => 'dummy_command'
28
28
  session = Session.new config
@@ -34,7 +34,7 @@ describe TableSync do
34
34
  sync.execute_sync_hook(:before_table_sync)
35
35
  end
36
36
 
37
- it "execute_sync_look should execute the given Proc" do
37
+ it "execute_sync_hook should execute the given Proc" do
38
38
  config = deep_copy(standard_config)
39
39
  received_handler = nil
40
40
  config.add_table_options 'scanner_records',
@@ -48,6 +48,52 @@ describe TableSync do
48
48
  received_handler.should == :dummy_helper
49
49
  end
50
50
 
51
+ it "event_filtered? should return false if there is no event filter" do
52
+ session = Session.new standard_config
53
+ sync = TableSync.new(session, 'scanner_records')
54
+
55
+ sync.event_filtered?(:left, 'id' => 1).should be_false
56
+ end
57
+
58
+ it "event_filtered? should return false if event filter does not filter sync events" do
59
+ config = deep_copy(standard_config)
60
+ config.add_table_options 'scanner_records', :event_filter => Object.new
61
+ session = Session.new config
62
+ sync = TableSync.new(session, 'scanner_records')
63
+
64
+ sync.event_filtered?(:left, 'id' => 1).should be_false
65
+ end
66
+
67
+ it "event_filtered? should signal filtering (i. e. return true) if the event filter result is false" do
68
+ filter = Object.new
69
+ def filter.before_sync(table, key, helper, type, row)
70
+ false
71
+ end
72
+ config = deep_copy(standard_config)
73
+ config.add_table_options 'scanner_records', :event_filter => filter
74
+ session = Session.new config
75
+ sync = TableSync.new(session, 'scanner_records')
76
+ sync.helper = SyncHelper.new(sync)
77
+ sync.event_filtered?(:left, 'id' => 1).should be_true
78
+ end
79
+
80
+ it "event_filtered? should return false if the event filter result is true" do
81
+ filter = {}
82
+ def filter.before_sync(table, key, helper, type, row)
83
+ self[:args] = [table, key, helper, type, row]
84
+ true
85
+ end
86
+ config = deep_copy(standard_config)
87
+ config.add_table_options 'scanner_records', :event_filter => filter
88
+ session = Session.new config
89
+ sync = TableSync.new(session, 'scanner_records')
90
+ sync.helper = SyncHelper.new(sync)
91
+ sync.event_filtered?(:left, 'id' => 1, 'name' => 'bla').should be_false
92
+
93
+ # verify correct parameter assignment
94
+ filter[:args].should == ['scanner_records', {'id' => 1}, sync.helper, :left, {'id' => 1, 'name' => 'bla'}]
95
+ end
96
+
51
97
  it "run should synchronize the databases" do
52
98
  config = deep_copy(standard_config)
53
99
  config.options[:committer] = :never_commit
@@ -56,6 +102,12 @@ describe TableSync do
56
102
  after_hook_called = false
57
103
  config.options[:before_table_sync] = lambda {|helper| before_hook_called = true}
58
104
  config.options[:after_table_sync] = lambda { |helper| after_hook_called = true}
105
+
106
+ filter = Object.new
107
+ def filter.before_sync(table, key, helper, type, row)
108
+ key['id'] != 6
109
+ end
110
+ config.options[:event_filter] = filter
59
111
  session = Session.new(config)
60
112
  begin
61
113
  sync = TableSync.new(session, 'scanner_records')
@@ -68,10 +120,14 @@ describe TableSync do
68
120
  row['description'].should == 'left_wins'
69
121
 
70
122
  # verify that the table was synchronized
71
- left_records = session.left.select_all("select * from scanner_records order by id")
72
- right_records = session.right.select_all("select * from scanner_records order by id")
123
+ left_records = session.left.select_all("select * from scanner_records where id <> 6 order by id")
124
+ right_records = session.right.select_all("select * from scanner_records where id <> 6 order by id")
73
125
  left_records.should == right_records
74
126
 
127
+ # verify that the filtered out record was not synced
128
+ session.left.select_one("select * from scanner_records where id = 6").
129
+ should be_nil
130
+
75
131
  # verify that hooks where called
76
132
  before_hook_called.should be_true
77
133
  after_hook_called.should be_true
@@ -68,26 +68,6 @@ describe Replicators::TwoWayReplicator do
68
68
  end
69
69
  end
70
70
 
71
- it "options_for_table should return the correct options for the table" do
72
- Initializer.configuration.options = {:a => 1, :b => 2}
73
- Initializer.configuration.add_table_options 'scanner_records', {:b => 3}
74
- rep_run = ReplicationRun.new(Session.new, TaskSweeper.new(1))
75
- helper = ReplicationHelper.new(rep_run)
76
- replicator = Replicators::TwoWayReplicator.new(helper)
77
- options = replicator.options_for_table('scanner_records')
78
- options[:a].should == 1
79
- options[:b].should == 3
80
- end
81
-
82
- it "options_for_table should merge the configured options into the default two way replicator options" do
83
- rep_run = ReplicationRun.new(Session.new, TaskSweeper.new(1))
84
- helper = ReplicationHelper.new(rep_run)
85
- replicator = Replicators::TwoWayReplicator.new(helper)
86
- replicator.options_for_table('scanner_records').include?(:left_change_handling).should be_true
87
- replicator.options_for_table('scanner_records').include?(:right_change_handling).should be_true
88
- replicator.options_for_table('scanner_records').include?(:replication_conflict_handling).should be_true
89
- end
90
-
91
71
  it "clear_conflicts should update the correct database with the correct action" do
92
72
  Initializer.configuration.include_tables 'left_table, right_table'
93
73
  session = Session.new
@@ -165,23 +145,23 @@ describe Replicators::TwoWayReplicator do
165
145
  helper = ReplicationHelper.new(rep_run)
166
146
  replicator = Replicators::TwoWayReplicator.new(helper)
167
147
  helper.should_not_receive(:log_replication_outcome)
168
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => []})
148
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => []})
169
149
  replicator.log_replication_outcome :ignore, diff
170
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_conflicts]})
150
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_conflicts]})
171
151
  replicator.log_replication_outcome :left, diff
172
152
 
173
153
  # should log ignored conflicts correctly
174
154
  helper = ReplicationHelper.new(rep_run)
175
155
  replicator = Replicators::TwoWayReplicator.new(helper)
176
156
  helper.should_receive(:log_replication_outcome).with(diff, 'ignored')
177
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_conflicts]})
157
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_conflicts]})
178
158
  replicator.log_replication_outcome :ignore, diff
179
159
 
180
160
  # should log conflicts correctly
181
161
  helper = ReplicationHelper.new(rep_run)
182
162
  replicator = Replicators::TwoWayReplicator.new(helper)
183
163
  helper.should_receive(:log_replication_outcome).with(diff, 'left_won')
184
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:all_conflicts]})
164
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:all_conflicts]})
185
165
  replicator.log_replication_outcome :left, diff
186
166
  end
187
167
 
@@ -200,23 +180,23 @@ describe Replicators::TwoWayReplicator do
200
180
  helper = ReplicationHelper.new(rep_run)
201
181
  replicator = Replicators::TwoWayReplicator.new(helper)
202
182
  helper.should_not_receive(:log_replication_outcome)
203
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => []})
183
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => []})
204
184
  replicator.log_replication_outcome :ignore, diff
205
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_changes]})
185
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_changes]})
206
186
  replicator.log_replication_outcome :left, diff
207
187
 
208
188
  # should log changes correctly
209
189
  helper = ReplicationHelper.new(rep_run)
210
190
  replicator = Replicators::TwoWayReplicator.new(helper)
211
191
  helper.should_receive(:log_replication_outcome).with(diff, 'replicated')
212
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:all_changes]})
192
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:all_changes]})
213
193
  replicator.log_replication_outcome :right, diff
214
194
 
215
195
  # should log changes correctly
216
196
  helper = ReplicationHelper.new(rep_run)
217
197
  replicator = Replicators::TwoWayReplicator.new(helper)
218
198
  helper.should_receive(:log_replication_outcome).with(diff, 'ignored')
219
- replicator.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_changes]})
199
+ helper.stub!(:options_for_table).and_return({:logged_replication_events => [:ignored_changes]})
220
200
  replicator.log_replication_outcome :ignore, diff
221
201
  end
222
202
 
@@ -225,7 +205,7 @@ describe Replicators::TwoWayReplicator do
225
205
  rep_run = ReplicationRun.new(session, TaskSweeper.new(1))
226
206
  helper = ReplicationHelper.new(rep_run)
227
207
  replicator = Replicators::TwoWayReplicator.new(helper)
228
- replicator.stub!(:options_for_table).and_return(
208
+ helper.stub!(:options_for_table).and_return(
229
209
  {
230
210
  :left_change_handling => :ignore,
231
211
  :right_change_handling => :ignore,
@@ -267,7 +247,7 @@ describe Replicators::TwoWayReplicator do
267
247
  lambda_parameters << [rep_helper, diff]
268
248
  end
269
249
  replicator = Replicators::TwoWayReplicator.new(helper)
270
- replicator.stub!(:options_for_table).and_return(
250
+ helper.stub!(:options_for_table).and_return(
271
251
  {
272
252
  :left_change_handling => l,
273
253
  :right_change_handling => l,
@@ -317,17 +297,17 @@ describe Replicators::TwoWayReplicator do
317
297
  diff.changes[:right] = right_change
318
298
 
319
299
  replicator = Replicators::TwoWayReplicator.new(helper)
320
- replicator.stub!(:options_for_table).and_return({:replication_conflict_handling => :left_wins})
300
+ helper.stub!(:options_for_table).and_return({:replication_conflict_handling => :left_wins})
321
301
  replicator.should_receive(:clear_conflict).with(:left, diff, 1)
322
302
  replicator.replicate_difference diff, 1
323
303
 
324
304
  replicator = Replicators::TwoWayReplicator.new(helper)
325
- replicator.stub!(:options_for_table).and_return({:replication_conflict_handling => :right_wins})
305
+ helper.stub!(:options_for_table).and_return({:replication_conflict_handling => :right_wins})
326
306
  replicator.should_receive(:clear_conflict).with(:right, diff, 1)
327
307
  replicator.replicate_difference diff, 1
328
308
 
329
309
  replicator = Replicators::TwoWayReplicator.new(helper)
330
- replicator.stub!(:options_for_table).and_return({:replication_conflict_handling => :later_wins})
310
+ helper.stub!(:options_for_table).and_return({:replication_conflict_handling => :later_wins})
331
311
  replicator.should_receive(:clear_conflict).with(:left, diff, 1).twice
332
312
  left_change.last_changed_at = 5.seconds.from_now
333
313
  right_change.last_changed_at = Time.now
@@ -339,7 +319,7 @@ describe Replicators::TwoWayReplicator do
339
319
  replicator.replicate_difference diff, 1
340
320
 
341
321
  replicator = Replicators::TwoWayReplicator.new(helper)
342
- replicator.stub!(:options_for_table).and_return({:replication_conflict_handling => :earlier_wins})
322
+ helper.stub!(:options_for_table).and_return({:replication_conflict_handling => :earlier_wins})
343
323
  replicator.should_receive(:clear_conflict).with(:left, diff, 1).twice
344
324
  left_change.last_changed_at = 5.seconds.ago
345
325
  right_change.last_changed_at = Time.now
@@ -449,8 +429,8 @@ describe Replicators::TwoWayReplicator do
449
429
  }
450
430
  replicator.replicate_difference diff, 2
451
431
 
452
- session.left.select_one("select * from extender_no_record").should == {
453
- 'id' => '1',
432
+ session.left.select_record(:table => "extender_no_record").should == {
433
+ 'id' => 1,
454
434
  'name' => 'blub'
455
435
  }
456
436
  ensure
@@ -725,8 +705,8 @@ describe Replicators::TwoWayReplicator do
725
705
  }
726
706
  replicator.replicate_difference diff, 2
727
707
 
728
- session.right.select_one("select * from extender_no_record").should == {
729
- 'id' => '2',
708
+ session.right.select_record(:table => "extender_no_record").should == {
709
+ 'id' => 2,
730
710
  'name' => 'bla'
731
711
  }
732
712
  ensure
@@ -198,8 +198,8 @@ describe Syncers::TwoWaySyncer do
198
198
  })
199
199
 
200
200
  syncer = Syncers::TwoWaySyncer.new(helper)
201
- helper.should_receive(:delete_record).with(:left, :dummy_left)
202
- helper.should_receive(:delete_record).with(:right, :dummy_right)
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
203
  syncer.sync_difference(:left, :dummy_left)
204
204
  syncer.sync_difference(:right, :dummy_right)
205
205
  end
@@ -216,8 +216,8 @@ describe Syncers::TwoWaySyncer do
216
216
  })
217
217
 
218
218
  syncer = Syncers::TwoWaySyncer.new(helper)
219
- helper.should_receive(:insert_record).with(:right, :dummy_left)
220
- helper.should_receive(:insert_record).with(:left, :dummy_right)
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
221
  syncer.sync_difference(:left, :dummy_left)
222
222
  syncer.sync_difference(:right, :dummy_right)
223
223
  end
@@ -234,7 +234,7 @@ describe Syncers::TwoWaySyncer do
234
234
  })
235
235
 
236
236
  syncer = Syncers::TwoWaySyncer.new(helper)
237
- helper.should_receive(:update_record).with(:left, :dummy_right)
237
+ helper.should_receive(:update_record).with(:left, 'scanner_records', :dummy_right)
238
238
  syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
239
239
  end
240
240
 
@@ -250,7 +250,7 @@ describe Syncers::TwoWaySyncer do
250
250
  })
251
251
 
252
252
  syncer = Syncers::TwoWaySyncer.new(helper)
253
- helper.should_receive(:update_record).with(:right, :dummy_left)
253
+ helper.should_receive(:update_record).with(:right, 'scanner_records', :dummy_left)
254
254
  syncer.sync_difference(:conflict, [:dummy_left, :dummy_right])
255
255
  end
256
256
  end
@@ -16,9 +16,10 @@ describe TypeCastingCursor do
16
16
 
17
17
  it "next_row should delegate next? and clear to the original cursor" do
18
18
  session = Session.new
19
- org_cursor = session.left.select_cursor(:query => "select id from extender_type_check where id = 1")
20
-
21
- cursor = TypeCastingCursor.new session.left, 'extender_type_check', org_cursor
19
+ cursor = session.left.select_cursor(
20
+ :query => "select id from extender_type_check where id = 1",
21
+ :table => "extender_type_check"
22
+ )
22
23
  cursor.next?.should be_true
23
24
  row = cursor.next_row
24
25
  cursor.next?.should be_false
@@ -27,11 +28,11 @@ describe TypeCastingCursor do
27
28
 
28
29
  it "next_row should cast rows - including uncommon data types - correctly" do
29
30
  session = Session.new
30
- org_cursor = session.left.select_cursor(:query => "select id, decimal_test, timestamp, binary_test from extender_type_check where id = 1")
31
- cursor = TypeCastingCursor.new session.left, 'extender_type_check', org_cursor
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
+ )
32
35
 
33
- row = cursor.next_row
34
-
35
36
  # verify that the row fields have been converted to the correct types
36
37
  row['id'].should be_an_instance_of(Fixnum)
37
38
  row['timestamp'].should be_an_instance_of(Time)
@@ -45,6 +46,5 @@ describe TypeCastingCursor do
45
46
  'timestamp' => Time.local(2007,"nov",10,20,15,1),
46
47
  'binary_test' => Marshal.dump(['bla',:dummy,1,2,3])
47
48
  }
48
- cursor.clear
49
49
  end
50
50
  end
data/tasks/database.rake CHANGED
@@ -257,6 +257,12 @@ def create_sample_schema(database, config)
257
257
  t.column :name, :string
258
258
  end
259
259
 
260
+ connection = ActiveRecord::Base.connection
261
+ # Neccessary to create tables with dots in ActiveRecord 2.3.5
262
+ def connection.extract_pg_identifier_from_name(name)
263
+ return name, nil
264
+ end
265
+
260
266
  create_table STRANGE_TABLE do |t|
261
267
  t.column :first_fk, :integer
262
268
  t.column :second_fk, :integer
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyrep
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.9
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arndt Lehmann
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-14 00:00:00 +09:00
12
+ date: 2009-12-14 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.2.2
23
+ version: 2.3.5
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activerecord
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.2.2
33
+ version: 2.3.5
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: hoe