drudgery 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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