drudgery 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -18,6 +18,11 @@ describe Drudgery::Extractors::CSVExtractor do
|
|
18
18
|
extractor = Drudgery::Extractors::CSVExtractor.new('file.csv', options)
|
19
19
|
extractor.instance_variable_get('@options').must_equal({ :col_sep => '|', :headers => %w[id name email] })
|
20
20
|
end
|
21
|
+
|
22
|
+
it 'sets name to csv:<file base name>' do
|
23
|
+
extractor = Drudgery::Extractors::CSVExtractor.new('tmp/file.csv')
|
24
|
+
extractor.name.must_equal 'csv:file.csv'
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
describe '#extract' do
|
@@ -28,11 +33,11 @@ describe Drudgery::Extractors::CSVExtractor do
|
|
28
33
|
extractor.extract
|
29
34
|
end
|
30
35
|
|
31
|
-
it 'yields each record
|
32
|
-
record1 = mock
|
36
|
+
it 'yields each record hash and index' do
|
37
|
+
record1 = mock('record1')
|
33
38
|
record1.expects(:to_hash).returns({ :a => 1 })
|
34
39
|
|
35
|
-
record2 = mock
|
40
|
+
record2 = mock('record2')
|
36
41
|
record2.expects(:to_hash).returns({ :b => 2 })
|
37
42
|
|
38
43
|
CSV.stubs(:foreach).multiple_yields([record1], [record2])
|
@@ -40,36 +45,44 @@ describe Drudgery::Extractors::CSVExtractor do
|
|
40
45
|
extractor = Drudgery::Extractors::CSVExtractor.new('file.csv')
|
41
46
|
|
42
47
|
records = []
|
43
|
-
|
48
|
+
indexes = []
|
49
|
+
extractor.extract do |record, index|
|
44
50
|
records << record
|
51
|
+
indexes << index
|
45
52
|
end
|
46
53
|
|
47
54
|
records[0].must_equal({ :a => 1 })
|
48
55
|
records[1].must_equal({ :b => 2 })
|
56
|
+
|
57
|
+
indexes.must_equal [0, 1]
|
49
58
|
end
|
59
|
+
end
|
50
60
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
61
|
+
describe 'without stubs' do
|
62
|
+
before(:each) do
|
63
|
+
File.delete('file.csv') if File.exists?('file.csv')
|
55
64
|
|
56
|
-
|
57
|
-
|
65
|
+
File.open('file.csv', 'w') do |f|
|
66
|
+
f.puts 'a,b'
|
67
|
+
f.puts '1,2'
|
68
|
+
f.puts '3,4'
|
69
|
+
f.puts '5,6'
|
58
70
|
end
|
71
|
+
end
|
59
72
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
f.puts '1,2'
|
64
|
-
f.puts '3,4'
|
65
|
-
f.puts '5,6'
|
66
|
-
end
|
73
|
+
after(:each) do
|
74
|
+
File.delete('file.csv') if File.exists?('file.csv')
|
75
|
+
end
|
67
76
|
|
77
|
+
describe '#extract' do
|
78
|
+
it 'yields each record hash and index' do
|
68
79
|
extractor = Drudgery::Extractors::CSVExtractor.new('file.csv')
|
69
80
|
|
70
81
|
records = []
|
71
|
-
|
82
|
+
indexes = []
|
83
|
+
extractor.extract do |record, index|
|
72
84
|
records << record
|
85
|
+
indexes << index
|
73
86
|
end
|
74
87
|
|
75
88
|
records.must_equal([
|
@@ -77,6 +90,15 @@ describe Drudgery::Extractors::CSVExtractor do
|
|
77
90
|
{ 'a' => '3', 'b' => '4' },
|
78
91
|
{ 'a' => '5', 'b' => '6' }
|
79
92
|
])
|
93
|
+
|
94
|
+
indexes.must_equal [0, 1, 2]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe '#record_count' do
|
99
|
+
it 'returns count of CSV rows' do
|
100
|
+
extractor = Drudgery::Extractors::CSVExtractor.new('file.csv')
|
101
|
+
extractor.record_count.must_equal 3
|
80
102
|
end
|
81
103
|
end
|
82
104
|
end
|
@@ -2,9 +2,14 @@ require 'spec_helper'
|
|
2
2
|
require 'sqlite3'
|
3
3
|
|
4
4
|
describe Drudgery::Extractors::SQLite3Extractor do
|
5
|
+
|
6
|
+
def mock_db
|
7
|
+
stub('db', :database_list => [{ 'name' => 'main', 'file' => '' }], :results_as_hash= => nil, :type_translation= => nil)
|
8
|
+
end
|
9
|
+
|
5
10
|
describe '#initialize' do
|
6
11
|
it 'sets db and table to provided arguments' do
|
7
|
-
db =
|
12
|
+
db = mock_db
|
8
13
|
db.expects(:results_as_hash=).with(true)
|
9
14
|
db.expects(:type_translation=).with(true)
|
10
15
|
|
@@ -14,22 +19,31 @@ describe Drudgery::Extractors::SQLite3Extractor do
|
|
14
19
|
end
|
15
20
|
|
16
21
|
it 'initializes clauses hash' do
|
17
|
-
|
18
|
-
db.stubs(:results_as_hash=)
|
19
|
-
db.stubs(:type_translation=)
|
20
|
-
|
21
|
-
extractor = Drudgery::Extractors::SQLite3Extractor.new(db, 'tablename')
|
22
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(mock_db, 'tablename')
|
22
23
|
extractor.instance_variable_get('@clauses').must_equal({})
|
23
24
|
end
|
25
|
+
|
26
|
+
describe 'with in memory db' do
|
27
|
+
it 'sets name to sqlite3:memory.<table name>' do
|
28
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(mock_db, 'tablename')
|
29
|
+
extractor.name.must_equal 'sqlite3:memory.tablename'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'with file based db' do
|
34
|
+
it 'sets name to sqlite3:<main db name>.<table name>' do
|
35
|
+
db = mock_db
|
36
|
+
db.expects(:database_list).returns([{ 'name' => 'main', 'file' => 'db/test.sqlite3.db' }])
|
37
|
+
|
38
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(db, 'tablename')
|
39
|
+
extractor.name.must_equal 'sqlite3:test.tablename'
|
40
|
+
end
|
41
|
+
end
|
24
42
|
end
|
25
43
|
|
26
44
|
describe 'query building' do
|
27
45
|
before(:each) do
|
28
|
-
|
29
|
-
db.stubs(:results_as_hash=)
|
30
|
-
db.stubs(:type_translation=)
|
31
|
-
|
32
|
-
@extractor = Drudgery::Extractors::SQLite3Extractor.new(db, 'tablename')
|
46
|
+
@extractor = Drudgery::Extractors::SQLite3Extractor.new(mock_db, 'tablename')
|
33
47
|
end
|
34
48
|
|
35
49
|
describe '#select' do
|
@@ -89,9 +103,7 @@ describe Drudgery::Extractors::SQLite3Extractor do
|
|
89
103
|
|
90
104
|
describe '#extract' do
|
91
105
|
it 'selects records from db using defined query' do
|
92
|
-
db =
|
93
|
-
db.stubs(:results_as_hash=)
|
94
|
-
db.stubs(:type_translation=)
|
106
|
+
db = mock_db
|
95
107
|
db.expects(:execute).with('SELECT * FROM tablename')
|
96
108
|
db.expects(:execute).with('SELECT age, count(*) AS nr_ages FROM tablename t table2 t2 ON t2.my_id = t.id WHERE age > 10 GROUP BY age HAVING count(*) > 1 ORDER BY nr_ages')
|
97
109
|
|
@@ -109,52 +121,85 @@ describe Drudgery::Extractors::SQLite3Extractor do
|
|
109
121
|
extractor.extract
|
110
122
|
end
|
111
123
|
|
112
|
-
it 'yields each record
|
124
|
+
it 'yields each record hash and index' do
|
113
125
|
record1 = { :a => 1 }
|
114
126
|
record2 = { :b => 2 }
|
115
127
|
|
116
|
-
db =
|
117
|
-
db.stubs(:results_as_hash=)
|
118
|
-
db.stubs(:type_translation=)
|
128
|
+
db = mock_db
|
119
129
|
db.stubs(:execute).multiple_yields([record1], [record2])
|
120
130
|
|
121
131
|
extractor = Drudgery::Extractors::SQLite3Extractor.new(db, 'tablename')
|
122
132
|
|
123
133
|
records = []
|
124
|
-
|
134
|
+
indexes = []
|
135
|
+
extractor.extract do |record, index|
|
125
136
|
records << record
|
137
|
+
indexes << index
|
126
138
|
end
|
127
139
|
|
128
140
|
records[0].must_equal({ :a => 1 })
|
129
141
|
records[1].must_equal({ :b => 2 })
|
142
|
+
|
143
|
+
indexes.must_equal [0, 1]
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe 'without stubs' do
|
148
|
+
before(:each) do
|
149
|
+
@db = SQLite3::Database.new(':memory:')
|
150
|
+
@db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
|
151
|
+
@db.execute('INSERT INTO records (a, b) VALUES (1, 2)');
|
152
|
+
@db.execute('INSERT INTO records (a, b) VALUES (3, 4)');
|
153
|
+
@db.execute('INSERT INTO records (a, b) VALUES (3, 6)');
|
130
154
|
end
|
131
155
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
@db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
|
136
|
-
@db.execute('INSERT INTO records (a, b) VALUES (1, 2)');
|
137
|
-
@db.execute('INSERT INTO records (a, b) VALUES (3, 4)');
|
138
|
-
@db.execute('INSERT INTO records (a, b) VALUES (5, 6)');
|
139
|
-
end
|
156
|
+
after(:each) do
|
157
|
+
@db.close
|
158
|
+
end
|
140
159
|
|
141
|
-
|
142
|
-
|
160
|
+
describe '#initialize' do
|
161
|
+
it 'sets name to sqlite3:memory:records' do
|
162
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(@db, 'records')
|
163
|
+
extractor.name.must_equal 'sqlite3:memory.records'
|
143
164
|
end
|
165
|
+
end
|
144
166
|
|
145
|
-
|
167
|
+
describe '#extract' do
|
168
|
+
it 'yields each record hash and index' do
|
146
169
|
extractor = Drudgery::Extractors::SQLite3Extractor.new(@db, 'records')
|
147
170
|
|
148
171
|
records = []
|
149
|
-
|
172
|
+
indexes = []
|
173
|
+
extractor.extract do |record, index|
|
150
174
|
records << record
|
175
|
+
indexes << index
|
151
176
|
end
|
152
177
|
|
153
178
|
records.must_equal([
|
154
179
|
{ 'a' => 1, 'b' => 2 },
|
155
180
|
{ 'a' => 3, 'b' => 4 },
|
156
|
-
{ 'a' =>
|
181
|
+
{ 'a' => 3, 'b' => 6 }
|
157
182
|
])
|
183
|
+
|
184
|
+
indexes.must_equal [0, 1, 2]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe '#record_count' do
|
189
|
+
describe 'with custom query' do
|
190
|
+
it 'returns count of query results' do
|
191
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(@db, 'records')
|
192
|
+
extractor.where('a > 2')
|
193
|
+
extractor.group('a')
|
194
|
+
extractor.record_count.must_equal 1
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe 'without custom query' do
|
199
|
+
it 'returns count of table records' do
|
200
|
+
extractor = Drudgery::Extractors::SQLite3Extractor.new(@db, 'records')
|
201
|
+
extractor.record_count.must_equal 3
|
202
|
+
end
|
158
203
|
end
|
159
204
|
end
|
160
205
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Drudgery::JobLogger do
|
4
|
+
describe '#initialize' do
|
5
|
+
it 'sets prefix to ## JOB <id>' do
|
6
|
+
logger = Drudgery::JobLogger.new(345)
|
7
|
+
logger.instance_variable_get('@prefix').must_equal '## JOB 345'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#log_with_progress' do
|
12
|
+
before(:each) do
|
13
|
+
@logger = Drudgery::JobLogger.new(123)
|
14
|
+
STDERR.stubs(:puts)
|
15
|
+
Drudgery.stubs(:log)
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'when progress on' do
|
19
|
+
before(:each) do
|
20
|
+
Drudgery.show_progress = true
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'puts formatted message to STDERR' do
|
24
|
+
STDERR.expects(:puts).with('## JOB 123: Some message')
|
25
|
+
@logger.log_with_progress :info, 'Some message'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'passes mode and formatted message to Drudgery logger' do
|
29
|
+
Drudgery.expects(:log).with(:info, '## JOB 123: Some message')
|
30
|
+
@logger.log_with_progress :info, 'Some message'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe 'when progress off' do
|
35
|
+
before(:each) do
|
36
|
+
Drudgery.show_progress = false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'does not put formatted message to STDERR' do
|
40
|
+
STDERR.expects(:puts).never
|
41
|
+
@logger.log_with_progress :info, 'Some message'
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'passes mode and formatted message to Drudgery logger' do
|
45
|
+
Drudgery.expects(:log).with(:info, '## JOB 123: Some message')
|
46
|
+
@logger.log_with_progress :info, 'Some message'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#log' do
|
52
|
+
it 'passes mode and formatted message to Drudgery logger' do
|
53
|
+
Drudgery.expects(:log).with(:debug, '## JOB 234: Another message')
|
54
|
+
|
55
|
+
logger = Drudgery::JobLogger.new(234)
|
56
|
+
logger.log :debug, 'Another message'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Drudgery::JobProgress do
|
4
|
+
describe '#initialize' do
|
5
|
+
before(:each) do
|
6
|
+
STDERR.stubs(:print)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'sets title to ## JOB <id>' do
|
10
|
+
progress = Drudgery::JobProgress.new(123, 1)
|
11
|
+
progress.instance_variable_get('@title').must_equal '## JOB 123'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'sets title_with to title.length + 1' do
|
15
|
+
progress = Drudgery::JobProgress.new(123, 1)
|
16
|
+
progress.instance_variable_get('@title_width').must_equal '## JOB 123'.length + 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|