drudgery 0.0.3 → 0.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.
- data/README.md +68 -8
- data/lib/drudgery/extractors/active_record_extractor.rb +12 -1
- data/lib/drudgery/extractors/csv_extractor.rb +25 -5
- data/lib/drudgery/extractors/sqlite3_extractor.rb +31 -1
- data/lib/drudgery/job.rb +45 -9
- data/lib/drudgery/job_logger.rb +21 -0
- data/lib/drudgery/job_progress.rb +11 -0
- data/lib/drudgery/loaders/active_record_import_loader.rb +3 -0
- data/lib/drudgery/loaders/active_record_loader.rb +3 -0
- data/lib/drudgery/loaders/csv_loader.rb +4 -2
- data/lib/drudgery/loaders/sqlite3_loader.rb +17 -0
- data/lib/drudgery/version.rb +1 -1
- data/lib/drudgery.rb +16 -0
- data/spec/drudgery/extractors/active_record_extractor_spec.rb +49 -25
- data/spec/drudgery/extractors/csv_extractor_spec.rb +40 -18
- data/spec/drudgery/extractors/sqlite3_extractor_spec.rb +77 -32
- data/spec/drudgery/job_logger_spec.rb +59 -0
- data/spec/drudgery/job_progress_spec.rb +19 -0
- data/spec/drudgery/job_spec.rb +163 -35
- data/spec/drudgery/loaders/active_record_import_loader_spec.rb +24 -13
- data/spec/drudgery/loaders/active_record_loader_spec.rb +26 -15
- data/spec/drudgery/loaders/csv_loader_spec.rb +15 -8
- data/spec/drudgery/loaders/sqlite3_loader_spec.rb +43 -11
- data/spec/drudgery/manager_spec.rb +4 -8
- data/spec/drudgery_spec.rb +30 -2
- data/spec/spec_helper.rb +3 -0
- metadata +47 -19
data/spec/drudgery/job_spec.rb
CHANGED
@@ -3,13 +3,20 @@ require 'spec_helper'
|
|
3
3
|
describe Drudgery::Job do
|
4
4
|
describe '#initialize' do
|
5
5
|
before(:each) do
|
6
|
-
@extractor =
|
7
|
-
@transformer =
|
8
|
-
@loader =
|
6
|
+
@extractor = stub('extractor')
|
7
|
+
@transformer = stub('transformer')
|
8
|
+
@loader = stub('loader')
|
9
|
+
|
10
|
+
@now = Time.now
|
11
|
+
Time.stubs(:now).returns(@now)
|
9
12
|
|
10
13
|
@job = Drudgery::Job.new(:extractor => @extractor, :transformer => @transformer, :loader => @loader)
|
11
14
|
end
|
12
15
|
|
16
|
+
it 'sets job id to nsec time' do
|
17
|
+
@job.id.must_equal @now.nsec
|
18
|
+
end
|
19
|
+
|
13
20
|
it 'sets extractor, transformer, and loader with provided arguments' do
|
14
21
|
@job.instance_variable_get('@extractor').must_equal @extractor
|
15
22
|
@job.instance_variable_get('@transformer').must_equal @transformer
|
@@ -38,6 +45,16 @@ describe Drudgery::Job do
|
|
38
45
|
end
|
39
46
|
end
|
40
47
|
|
48
|
+
describe '#name' do
|
49
|
+
it 'returns <extractor name> => <loader name>' do
|
50
|
+
extractor = stub('extractor', :name => 'csv:file.csv')
|
51
|
+
loader = stub('loader', :name => 'sqlite3:memory.tablename')
|
52
|
+
|
53
|
+
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
54
|
+
job.name.must_equal 'csv:file.csv => sqlite3:memory.tablename'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
41
58
|
describe '#batch_size' do
|
42
59
|
it 'sets batch_size to provided value' do
|
43
60
|
job = Drudgery::Job.new
|
@@ -56,7 +73,7 @@ describe Drudgery::Job do
|
|
56
73
|
end
|
57
74
|
|
58
75
|
it 'yields extractor if block_given' do
|
59
|
-
extractor = mock
|
76
|
+
extractor = mock('extractor')
|
60
77
|
extractor.expects(:col_sep).with('|')
|
61
78
|
|
62
79
|
Drudgery::Extractors.stubs(:instantiate).returns(extractor)
|
@@ -68,7 +85,7 @@ describe Drudgery::Job do
|
|
68
85
|
end
|
69
86
|
|
70
87
|
it 'sets extractor' do
|
71
|
-
extractor =
|
88
|
+
extractor = stub('extractor')
|
72
89
|
|
73
90
|
Drudgery::Extractors.stubs(:instantiate).returns(extractor)
|
74
91
|
|
@@ -81,7 +98,7 @@ describe Drudgery::Job do
|
|
81
98
|
|
82
99
|
describe 'when extractor provided' do
|
83
100
|
it 'does not instantiat extractor with type and args' do
|
84
|
-
extractor =
|
101
|
+
extractor = stub('extractor')
|
85
102
|
|
86
103
|
Drudgery::Extractors.expects(:instantiate).never
|
87
104
|
|
@@ -90,7 +107,7 @@ describe Drudgery::Job do
|
|
90
107
|
end
|
91
108
|
|
92
109
|
it 'yields extractor if block_given' do
|
93
|
-
extractor = mock
|
110
|
+
extractor = mock('extractor')
|
94
111
|
extractor.expects(:col_sep).with('|')
|
95
112
|
|
96
113
|
job = Drudgery::Job.new
|
@@ -100,7 +117,7 @@ describe Drudgery::Job do
|
|
100
117
|
end
|
101
118
|
|
102
119
|
it 'sets extractor' do
|
103
|
-
extractor =
|
120
|
+
extractor = stub('extractor')
|
104
121
|
|
105
122
|
job = Drudgery::Job.new
|
106
123
|
job.extract(extractor)
|
@@ -113,8 +130,7 @@ describe Drudgery::Job do
|
|
113
130
|
describe '#transform' do
|
114
131
|
describe 'when transformer provided' do
|
115
132
|
it 'sets transformer to provided transformer' do
|
116
|
-
transformer =
|
117
|
-
transformer.stubs(:register)
|
133
|
+
transformer = stub('transformer', :register => nil)
|
118
134
|
|
119
135
|
job = Drudgery::Job.new
|
120
136
|
job.transform(transformer)
|
@@ -125,7 +141,7 @@ describe Drudgery::Job do
|
|
125
141
|
it 'registers provided proc with provided transformer' do
|
126
142
|
block = Proc.new { |data, cache| data }
|
127
143
|
|
128
|
-
transformer = mock
|
144
|
+
transformer = mock('transformer')
|
129
145
|
transformer.expects(:register).with(block)
|
130
146
|
|
131
147
|
job = Drudgery::Job.new
|
@@ -133,7 +149,7 @@ describe Drudgery::Job do
|
|
133
149
|
end
|
134
150
|
|
135
151
|
it 'registers provided block with provided transformer' do
|
136
|
-
transformer = mock
|
152
|
+
transformer = mock('transformer')
|
137
153
|
transformer.expects(:register).with { |data, cache| data }
|
138
154
|
|
139
155
|
job = Drudgery::Job.new
|
@@ -143,11 +159,10 @@ describe Drudgery::Job do
|
|
143
159
|
|
144
160
|
describe 'when no transformer provided' do
|
145
161
|
it 'sets transformer to default transformer' do
|
146
|
-
transformer =
|
147
|
-
|
148
|
-
|
162
|
+
transformer = stub('transformer', :register => nil)
|
163
|
+
|
149
164
|
Drudgery::Transformer.expects(:new).returns(transformer)
|
150
|
-
|
165
|
+
|
151
166
|
job = Drudgery::Job.new
|
152
167
|
job.transform
|
153
168
|
|
@@ -157,9 +172,9 @@ describe Drudgery::Job do
|
|
157
172
|
it 'registers provided proc with default transformer' do
|
158
173
|
block = Proc.new { |data, cache| data }
|
159
174
|
|
160
|
-
transformer = mock
|
175
|
+
transformer = mock('transformer')
|
161
176
|
transformer.expects(:register).with(block)
|
162
|
-
|
177
|
+
|
163
178
|
Drudgery::Transformer.stubs(:new).returns(transformer)
|
164
179
|
|
165
180
|
job = Drudgery::Job.new
|
@@ -188,7 +203,7 @@ describe Drudgery::Job do
|
|
188
203
|
end
|
189
204
|
|
190
205
|
it 'yields loader if block_given' do
|
191
|
-
loader = mock
|
206
|
+
loader = mock('loader')
|
192
207
|
loader.expects(:select).with('a', 'b', 'c')
|
193
208
|
|
194
209
|
Drudgery::Loaders.stubs(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
|
@@ -200,7 +215,7 @@ describe Drudgery::Job do
|
|
200
215
|
end
|
201
216
|
|
202
217
|
it 'sets loader' do
|
203
|
-
loader =
|
218
|
+
loader = stub('loader')
|
204
219
|
|
205
220
|
Drudgery::Loaders.expects(:instantiate).with(:sqlite3, 'db.sqlite3', 'tablename').returns(loader)
|
206
221
|
|
@@ -212,7 +227,7 @@ describe Drudgery::Job do
|
|
212
227
|
|
213
228
|
describe 'when loader provided' do
|
214
229
|
it 'does not instantiate loader with type with args' do
|
215
|
-
loader =
|
230
|
+
loader = stub('loader')
|
216
231
|
|
217
232
|
Drudgery::Loaders.expects(:instantiate).never
|
218
233
|
|
@@ -221,7 +236,7 @@ describe Drudgery::Job do
|
|
221
236
|
end
|
222
237
|
|
223
238
|
it 'yields loader if block_given' do
|
224
|
-
loader = mock
|
239
|
+
loader = mock('loader')
|
225
240
|
loader.expects(:select).with('a', 'b', 'c')
|
226
241
|
|
227
242
|
job = Drudgery::Job.new
|
@@ -231,7 +246,7 @@ describe Drudgery::Job do
|
|
231
246
|
end
|
232
247
|
|
233
248
|
it 'sets loader' do
|
234
|
-
loader =
|
249
|
+
loader = stub('loader')
|
235
250
|
|
236
251
|
job = Drudgery::Job.new
|
237
252
|
job.load(loader)
|
@@ -240,13 +255,25 @@ describe Drudgery::Job do
|
|
240
255
|
end
|
241
256
|
end
|
242
257
|
|
258
|
+
def mock_logger
|
259
|
+
stub('job_logger', :log => nil, :log_with_progress => nil)
|
260
|
+
end
|
261
|
+
|
262
|
+
def stub_logging
|
263
|
+
|
264
|
+
end
|
265
|
+
|
243
266
|
describe '#perform' do
|
267
|
+
before(:each) do
|
268
|
+
Drudgery.show_progress = false
|
269
|
+
Drudgery::JobLogger.stubs(:new).returns(mock_logger)
|
270
|
+
end
|
271
|
+
|
244
272
|
it 'extracts records from extractor' do
|
245
|
-
extractor =
|
246
|
-
extractor.expects(:extract).yields({ 'a' => 1 })
|
273
|
+
extractor = stub('extractor', :record_count => 1, :name => 'extractor')
|
274
|
+
extractor.expects(:extract).yields([{ 'a' => 1 }, 0])
|
247
275
|
|
248
|
-
loader =
|
249
|
-
loader.stubs(:load)
|
276
|
+
loader = stub('loader', :name => 'loader', :load => nil)
|
250
277
|
|
251
278
|
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
252
279
|
|
@@ -254,25 +281,51 @@ describe Drudgery::Job do
|
|
254
281
|
end
|
255
282
|
|
256
283
|
it 'transforms records with transformer' do
|
257
|
-
extractor =
|
258
|
-
extractor.stubs(:extract).yields({ 'a' => 1 })
|
284
|
+
extractor = stub('extractor', :record_count => 1, :name => 'extractor')
|
285
|
+
extractor.stubs(:extract).yields([{ 'a' => 1 }, 0])
|
259
286
|
|
260
|
-
transformer = mock
|
287
|
+
transformer = mock('transformer')
|
261
288
|
transformer.expects(:transform).with({ 'a' => 1 }).returns({ :a => 1 })
|
262
289
|
|
263
|
-
loader =
|
264
|
-
loader.stubs(:load)
|
290
|
+
loader = stub('loader', :name => 'loader', :load => nil)
|
265
291
|
|
266
292
|
job = Drudgery::Job.new(:extractor => extractor, :transformer => transformer, :loader => loader)
|
267
293
|
|
268
294
|
job.perform
|
269
295
|
end
|
270
296
|
|
297
|
+
it 'skips nil records' do
|
298
|
+
extractor = stub('extractor', :record_count => 1, :name => 'extractor')
|
299
|
+
extractor.stubs(:extract).yields([{ 'a' => 1 }, 0])
|
300
|
+
|
301
|
+
transformer = mock('transformer')
|
302
|
+
transformer.expects(:transform).with({ 'a' => 1 }).returns(nil)
|
303
|
+
|
304
|
+
loader = stub('loader', :name => 'loader')
|
305
|
+
loader.expects(:load).with([{ '1' => 1 }]).never
|
306
|
+
|
307
|
+
job = Drudgery::Job.new(:extractor => extractor, :transformer => transformer, :loader => loader)
|
308
|
+
|
309
|
+
job.perform
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'does not load empty records' do
|
313
|
+
extractor = stub('extractor', :record_count => 1, :name => 'extractor')
|
314
|
+
extractor.stubs(:extract)
|
315
|
+
|
316
|
+
loader = stub('loader', :name => 'loader')
|
317
|
+
loader.expects(:load).with([]).never
|
318
|
+
|
319
|
+
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
320
|
+
|
321
|
+
job.perform
|
322
|
+
end
|
323
|
+
|
271
324
|
it 'loads records with loader in batches' do
|
272
|
-
extractor =
|
273
|
-
extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }], [{ 'b' => 2 }], [{ 'c' => 3 }])
|
325
|
+
extractor = stub('extractor', :record_count => 3, :name => 'extractor')
|
326
|
+
extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
|
274
327
|
|
275
|
-
loader =
|
328
|
+
loader = stub('loader', :name => 'loader')
|
276
329
|
loader.expects(:load).with([{ 'a' => 1 }, { 'b' => 2 }])
|
277
330
|
loader.expects(:load).with([{ 'c' => 3 }])
|
278
331
|
|
@@ -281,5 +334,80 @@ describe Drudgery::Job do
|
|
281
334
|
|
282
335
|
job.perform
|
283
336
|
end
|
337
|
+
|
338
|
+
describe 'with progress on' do
|
339
|
+
it 'tracks progress information' do
|
340
|
+
Drudgery.show_progress = true
|
341
|
+
|
342
|
+
extractor = stub('extractor', :record_count => 3, :name => 'extractor')
|
343
|
+
extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
|
344
|
+
|
345
|
+
loader = stub('loader', :name => 'loader', :load => nil)
|
346
|
+
|
347
|
+
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
348
|
+
|
349
|
+
progress = mock('job_progress') do
|
350
|
+
expects(:inc).times(3)
|
351
|
+
expects(:finish)
|
352
|
+
end
|
353
|
+
Drudgery::JobProgress.stubs(:new).with(job.id, 3).returns(progress)
|
354
|
+
|
355
|
+
job.perform
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
describe 'with progress off' do
|
360
|
+
it 'does not track progress information' do
|
361
|
+
extractor = stub('extractor', :record_count => 3, :name => 'extractor')
|
362
|
+
extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
|
363
|
+
|
364
|
+
loader = stub('loader', :name => 'loader', :load => nil)
|
365
|
+
|
366
|
+
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
367
|
+
|
368
|
+
Drudgery::JobProgress.expects(:new).never
|
369
|
+
|
370
|
+
job.perform
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
it 'logs job details' do
|
375
|
+
extractor = stub('extractor', :record_count => 3, :name => 'extractor')
|
376
|
+
extractor.stubs(:extract).multiple_yields([{ 'a' => 1 }, 0], [{ 'b' => 2 }, 1], [{ 'c' => 3 }, 2])
|
377
|
+
|
378
|
+
loader = stub('loader', :name => 'loader', :load => nil)
|
379
|
+
|
380
|
+
job = Drudgery::Job.new(:extractor => extractor, :loader => loader)
|
381
|
+
job.batch_size 2
|
382
|
+
|
383
|
+
Benchmark.stubs(:realtime).returns(1.25333).yields
|
384
|
+
|
385
|
+
logger = mock_logger
|
386
|
+
logger.expects(:log_with_progress).with(:info, "extractor => loader")
|
387
|
+
|
388
|
+
logger.expects(:log).with(:debug, "Extracting Record -- Index: 0")
|
389
|
+
logger.expects(:log).with(:debug, "#{{ 'a' => 1 }.inspect}")
|
390
|
+
logger.expects(:log).with(:debug, "Transforming Record -- Index: 0")
|
391
|
+
logger.expects(:log).with(:debug, "#{{ 'a' => 1 }.inspect}")
|
392
|
+
logger.expects(:log).with(:debug, "Extracting Record -- Index: 1")
|
393
|
+
logger.expects(:log).with(:debug, "#{{ 'b' => 2 }.inspect}")
|
394
|
+
logger.expects(:log).with(:debug, "Transforming Record -- Index: 1")
|
395
|
+
logger.expects(:log).with(:debug, "#{{ 'b' => 2 }.inspect}")
|
396
|
+
logger.expects(:log).with(:debug, "Loading Records -- Count: 2")
|
397
|
+
logger.expects(:log).with(:debug, "#{[{ 'a' => 1 }, { 'b' => 2 }].inspect}")
|
398
|
+
|
399
|
+
logger.expects(:log).with(:debug, "Extracting Record -- Index: 2")
|
400
|
+
logger.expects(:log).with(:debug, "#{{ 'c' => 3 }.inspect}")
|
401
|
+
logger.expects(:log).with(:debug, "Transforming Record -- Index: 2")
|
402
|
+
logger.expects(:log).with(:debug, "#{{ 'c' => 3 }.inspect}")
|
403
|
+
logger.expects(:log).with(:debug, "Loading Records -- Count: 1")
|
404
|
+
logger.expects(:log).with(:debug, "#{[{ 'c' => 3 }].inspect}")
|
405
|
+
|
406
|
+
logger.expects(:log_with_progress).with(:info, "Completed in 1.25s\n\n")
|
407
|
+
|
408
|
+
Drudgery::JobLogger.stubs(:new).returns(logger)
|
409
|
+
|
410
|
+
job.perform
|
411
|
+
end
|
284
412
|
end
|
285
413
|
end
|
@@ -5,13 +5,22 @@ require 'activerecord-import'
|
|
5
5
|
describe Drudgery::Loaders::ActiveRecordImportLoader do
|
6
6
|
class Record < ActiveRecord::Base; end
|
7
7
|
|
8
|
+
def mock_model
|
9
|
+
stub('model', :name => 'Record')
|
10
|
+
end
|
11
|
+
|
8
12
|
describe '#initialize' do
|
9
13
|
it 'sets model to provided argument' do
|
10
|
-
model =
|
14
|
+
model = mock_model
|
11
15
|
|
12
16
|
loader = Drudgery::Loaders::ActiveRecordImportLoader.new(model)
|
13
17
|
loader.instance_variable_get('@model').must_equal model
|
14
18
|
end
|
19
|
+
|
20
|
+
it 'sets name to active_record_import:<model name>' do
|
21
|
+
loader = Drudgery::Loaders::ActiveRecordImportLoader.new(mock_model)
|
22
|
+
loader.name.must_equal 'active_record_import:Record'
|
23
|
+
end
|
15
24
|
end
|
16
25
|
|
17
26
|
describe '#load' do
|
@@ -19,27 +28,29 @@ describe Drudgery::Loaders::ActiveRecordImportLoader do
|
|
19
28
|
record1 = { :a => 1, :b => 2 }
|
20
29
|
record2 = { :a => 3, :b => 4 }
|
21
30
|
|
22
|
-
model =
|
31
|
+
model = mock_model
|
23
32
|
model.expects(:import).with([:a, :b], [[1, 2], [3, 4]], :validate => false)
|
24
33
|
|
25
34
|
loader = Drudgery::Loaders::ActiveRecordImportLoader.new(model)
|
26
35
|
loader.load([record1, record2])
|
27
36
|
end
|
37
|
+
end
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
39
|
+
describe 'without stubs' do
|
40
|
+
before(:each) do
|
41
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
42
|
+
ActiveRecord::Base.connection.create_table(:records) do |t|
|
43
|
+
t.integer :a
|
44
|
+
t.integer :b
|
36
45
|
end
|
46
|
+
end
|
37
47
|
|
38
|
-
|
39
|
-
|
40
|
-
|
48
|
+
after(:each) do
|
49
|
+
ActiveRecord::Base.clear_active_connections!
|
50
|
+
end
|
41
51
|
|
42
|
-
|
52
|
+
describe '#load' do
|
53
|
+
it 'writes records using model.import' do
|
43
54
|
record1 = { :a => 1, :b => 2 }
|
44
55
|
record2 = { :a => 3, :b => 4 }
|
45
56
|
|
@@ -4,13 +4,22 @@ require 'active_record'
|
|
4
4
|
describe Drudgery::Loaders::ActiveRecordLoader do
|
5
5
|
class Record < ActiveRecord::Base; end
|
6
6
|
|
7
|
+
def mock_model
|
8
|
+
stub('model', :name => 'Record')
|
9
|
+
end
|
10
|
+
|
7
11
|
describe '#initialize' do
|
8
12
|
it 'sets model to provided argument' do
|
9
|
-
model =
|
13
|
+
model = mock_model
|
10
14
|
|
11
15
|
loader = Drudgery::Loaders::ActiveRecordLoader.new(model)
|
12
16
|
loader.instance_variable_get('@model').must_equal model
|
13
17
|
end
|
18
|
+
|
19
|
+
it 'sets name to active_record:<model name>' do
|
20
|
+
loader = Drudgery::Loaders::ActiveRecordLoader.new(mock_model)
|
21
|
+
loader.name.must_equal 'active_record:Record'
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
25
|
describe '#load' do
|
@@ -18,10 +27,10 @@ describe Drudgery::Loaders::ActiveRecordLoader do
|
|
18
27
|
record1 = { :a => 1 }
|
19
28
|
record2 = { :a => 2 }
|
20
29
|
|
21
|
-
obj1 = mock
|
22
|
-
obj2 = mock
|
30
|
+
obj1 = mock('obj1')
|
31
|
+
obj2 = mock('obj2')
|
23
32
|
|
24
|
-
model =
|
33
|
+
model = mock_model
|
25
34
|
model.expects(:new).with(record1).returns(obj1)
|
26
35
|
model.expects(:new).with(record2).returns(obj2)
|
27
36
|
|
@@ -31,21 +40,23 @@ describe Drudgery::Loaders::ActiveRecordLoader do
|
|
31
40
|
loader = Drudgery::Loaders::ActiveRecordLoader.new(model)
|
32
41
|
loader.load([record1, record2])
|
33
42
|
end
|
43
|
+
end
|
34
44
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
45
|
+
describe 'without stubs' do
|
46
|
+
before(:each) do
|
47
|
+
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
|
48
|
+
ActiveRecord::Base.connection.create_table(:records) do |t|
|
49
|
+
t.integer :a
|
50
|
+
t.integer :b
|
42
51
|
end
|
52
|
+
end
|
43
53
|
|
44
|
-
|
45
|
-
|
46
|
-
|
54
|
+
after(:each) do
|
55
|
+
ActiveRecord::Base.clear_active_connections!
|
56
|
+
end
|
47
57
|
|
48
|
-
|
58
|
+
describe '#load' do
|
59
|
+
it 'writes records using model.create' do
|
49
60
|
record1 = { :a => 1, :b => 2 }
|
50
61
|
record2 = { :a => 3, :b => 4 }
|
51
62
|
|
@@ -18,6 +18,11 @@ describe Drudgery::Loaders::CSVLoader do
|
|
18
18
|
loader = Drudgery::Loaders::CSVLoader.new('file.csv', options)
|
19
19
|
loader.instance_variable_get('@options').must_equal({ :col_sep => '|' })
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'sets name to csv:<file base name>' do
|
23
|
+
loader = Drudgery::Loaders::CSVLoader.new('tmp/file.csv')
|
24
|
+
loader.name.must_equal 'csv:file.csv'
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
describe '#load' do
|
@@ -33,7 +38,7 @@ describe Drudgery::Loaders::CSVLoader do
|
|
33
38
|
record2 = { :a => 3, :b => 4 }
|
34
39
|
record3 = { :a => 5, :b => 6 }
|
35
40
|
|
36
|
-
csv = mock
|
41
|
+
csv = mock('csv')
|
37
42
|
csv.expects(:<<).with([:a, :b])
|
38
43
|
csv.expects(:<<).with([1, 2])
|
39
44
|
csv.expects(:<<).with([3, 4])
|
@@ -45,16 +50,18 @@ describe Drudgery::Loaders::CSVLoader do
|
|
45
50
|
loader.load([record1, record2])
|
46
51
|
loader.load([record3])
|
47
52
|
end
|
53
|
+
end
|
48
54
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
55
|
+
describe 'without stubs' do
|
56
|
+
before(:each) do
|
57
|
+
File.delete('file.csv') if File.exists?('file.csv')
|
58
|
+
end
|
53
59
|
|
54
|
-
|
55
|
-
|
56
|
-
|
60
|
+
after(:each) do
|
61
|
+
File.delete('file.csv') if File.exists?('file.csv')
|
62
|
+
end
|
57
63
|
|
64
|
+
describe '#load' do
|
58
65
|
it 'writes hash keys as header and records as rows' do
|
59
66
|
record1 = { :a => 1, :b => 2 }
|
60
67
|
record2 = { :a => 3, :b => 4 }
|
@@ -1,14 +1,37 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'sqlite3'
|
2
3
|
|
3
4
|
describe Drudgery::Loaders::SQLite3Loader do
|
5
|
+
|
6
|
+
def mock_db
|
7
|
+
stub('db', :database_list => [{ 'name' => 'main', 'file' => '' }], :results_as_hash= => nil, :type_translation= => nil)
|
8
|
+
end
|
9
|
+
|
4
10
|
describe '#initialize' do
|
5
11
|
it 'sets db to SQLite3 database using provided db name and table to provided table name' do
|
6
|
-
db =
|
12
|
+
db = mock_db
|
7
13
|
|
8
14
|
loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
|
9
15
|
loader.instance_variable_get('@db').must_equal db
|
10
16
|
loader.instance_variable_get('@table').must_equal 'tablename'
|
11
17
|
end
|
18
|
+
|
19
|
+
describe 'with in memory db' do
|
20
|
+
it 'sets name to sqlite3:memory:<table name>' do
|
21
|
+
loader = Drudgery::Loaders::SQLite3Loader.new(mock_db, 'tablename')
|
22
|
+
loader.name.must_equal 'sqlite3:memory.tablename'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'with file based db' do
|
27
|
+
it 'sets name to sqlite3:<main db name>:<table name>' do
|
28
|
+
db = mock_db
|
29
|
+
db.expects(:database_list).returns([{ 'name' => 'main', 'file' => 'db/test.sqlite3.db' }])
|
30
|
+
|
31
|
+
loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
|
32
|
+
loader.name.must_equal 'sqlite3:test.tablename'
|
33
|
+
end
|
34
|
+
end
|
12
35
|
end
|
13
36
|
|
14
37
|
describe '#load' do
|
@@ -16,7 +39,7 @@ describe Drudgery::Loaders::SQLite3Loader do
|
|
16
39
|
record1 = { :a => 1, :b => 2 }
|
17
40
|
record2 = { :a => 3, :b => 4 }
|
18
41
|
|
19
|
-
db =
|
42
|
+
db = mock_db
|
20
43
|
db.expects(:transaction).yields(db)
|
21
44
|
db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [1, 2])
|
22
45
|
db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [3, 4])
|
@@ -24,17 +47,26 @@ describe Drudgery::Loaders::SQLite3Loader do
|
|
24
47
|
loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
|
25
48
|
loader.load([record1, record2])
|
26
49
|
end
|
50
|
+
end
|
27
51
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
52
|
+
describe 'without stubs' do
|
53
|
+
before(:each) do
|
54
|
+
@db = SQLite3::Database.new(':memory:')
|
55
|
+
@db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
|
56
|
+
end
|
33
57
|
|
34
|
-
|
35
|
-
|
58
|
+
after(:each) do
|
59
|
+
@db.close
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#initialize' do
|
63
|
+
it 'sets name to sqlite3:memory:records' do
|
64
|
+
loader = Drudgery::Loaders::SQLite3Loader.new(@db, 'records')
|
65
|
+
loader.name.must_equal 'sqlite3:memory.records'
|
36
66
|
end
|
67
|
+
end
|
37
68
|
|
69
|
+
describe '#load' do
|
38
70
|
it 'writes each record in single transaction' do
|
39
71
|
record1 = { :a => 1, :b => 2 }
|
40
72
|
record2 = { :a => 3, :b => 4 }
|
@@ -48,8 +80,8 @@ describe Drudgery::Loaders::SQLite3Loader do
|
|
48
80
|
end
|
49
81
|
|
50
82
|
results.must_equal([
|
51
|
-
|
52
|
-
|
83
|
+
{ 'a' => 1, 'b' => 2, 0 => 1, 1 => 2 },
|
84
|
+
{ 'a' => 3, 'b' => 4, 0 => 3, 1 => 4}
|
53
85
|
])
|
54
86
|
end
|
55
87
|
end
|
@@ -13,7 +13,7 @@ describe Drudgery::Manager do
|
|
13
13
|
|
14
14
|
describe '#prepare' do
|
15
15
|
it 'adds obj to jobs array' do
|
16
|
-
job =
|
16
|
+
job = stub('job')
|
17
17
|
|
18
18
|
@manager.prepare(job)
|
19
19
|
@manager.instance_variable_get('@jobs').must_include job
|
@@ -22,13 +22,9 @@ describe Drudgery::Manager do
|
|
22
22
|
|
23
23
|
describe '#run' do
|
24
24
|
it 'performs each job' do
|
25
|
-
job1 = mock
|
26
|
-
|
27
|
-
|
28
|
-
job2 = mock
|
29
|
-
job2.expects(:perform)
|
30
|
-
|
31
|
-
job3 = mock
|
25
|
+
job1 = mock('job1', :perform => nil)
|
26
|
+
job2 = mock('job2', :perform => nil)
|
27
|
+
job3 = mock('job3')
|
32
28
|
job3.expects(:perform).never
|
33
29
|
|
34
30
|
@manager.prepare(job1)
|