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.
@@ -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 as a hash' do
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
- extractor.extract do |record|
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
- describe 'without stubs' do
52
- before(:each) do
53
- File.delete('file.csv') if File.exists?('file.csv')
54
- end
61
+ describe 'without stubs' do
62
+ before(:each) do
63
+ File.delete('file.csv') if File.exists?('file.csv')
55
64
 
56
- after(:each) do
57
- File.delete('file.csv') if File.exists?('file.csv')
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
- it 'writes hash keys as header and records as rows' do
61
- File.open('file.csv', 'w') do |f|
62
- f.puts 'a,b'
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
- extractor.extract do |record|
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 = mock
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
- db = mock
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
- db = mock
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 = mock
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 as a hash' do
124
+ it 'yields each record hash and index' do
113
125
  record1 = { :a => 1 }
114
126
  record2 = { :b => 2 }
115
127
 
116
- db = mock
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
- extractor.extract do |record|
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
- describe 'without stubs' do
133
- before(:each) do
134
- @db = SQLite3::Database.new(':memory:')
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
- after(:each) do
142
- @db.close
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
- it 'yields each record as a hash' do
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
- extractor.extract do |record|
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' => 5, 'b' => 6 }
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