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
@@ -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
|