drudgery 0.0.1

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.
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe Drudgery::Loaders::SQLite3Loader do
4
+ describe '#initialize' do
5
+ it 'sets db to SQLite3 database using provided db name and table to provided table name' do
6
+ db = mock
7
+
8
+ loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
9
+ loader.instance_variable_get('@db').must_equal db
10
+ loader.instance_variable_get('@table').must_equal 'tablename'
11
+ end
12
+ end
13
+
14
+ describe '#load' do
15
+ it 'writes each record in single transaction' do
16
+ record1 = { :a => 1, :b => 2 }
17
+ record2 = { :a => 3, :b => 4 }
18
+
19
+ db = mock
20
+ db.expects(:transaction).yields(db)
21
+ db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [1, 2])
22
+ db.expects(:execute).with('INSERT INTO tablename (a, b) VALUES (?, ?)', [3, 4])
23
+
24
+ loader = Drudgery::Loaders::SQLite3Loader.new(db, 'tablename')
25
+ loader.load([record1, record2])
26
+ end
27
+
28
+ describe 'without stubs' do
29
+ before(:each) do
30
+ @db = SQLite3::Database.new(':memory:')
31
+ @db.execute('CREATE TABLE records (a INTEGER, b INTEGER)')
32
+ end
33
+
34
+ after(:each) do
35
+ @db.close
36
+ end
37
+
38
+ it 'writes each record in single transaction' do
39
+ record1 = { :a => 1, :b => 2 }
40
+ record2 = { :a => 3, :b => 4 }
41
+
42
+ loader = Drudgery::Loaders::SQLite3Loader.new(@db, 'records')
43
+ loader.load([record1, record2])
44
+
45
+ results = []
46
+ @db.execute('SELECT * FROM records') do |result|
47
+ results << result
48
+ end
49
+
50
+ results.must_equal([
51
+ [1, 2],
52
+ [3, 4]
53
+ ])
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Drudgery::Manager do
4
+ before(:each) do
5
+ @manager = Drudgery::Manager.new
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'initializes jobs array' do
10
+ @manager.instance_variable_get('@jobs').must_equal []
11
+ end
12
+ end
13
+
14
+ describe '#prepare' do
15
+ it 'adds obj to jobs array' do
16
+ job = mock
17
+
18
+ @manager.prepare(job)
19
+ @manager.instance_variable_get('@jobs').must_include job
20
+ end
21
+ end
22
+
23
+ describe '#run' do
24
+ it 'performs each job' do
25
+ job1 = mock
26
+ job1.expects(:perform)
27
+
28
+ job2 = mock
29
+ job2.expects(:perform)
30
+
31
+ job3 = mock
32
+ job3.expects(:perform).never
33
+
34
+ @manager.prepare(job1)
35
+ @manager.prepare(job2)
36
+ @manager.run
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Drudgery::Transformer do
4
+ before(:each) do
5
+ @transformer = Drudgery::Transformer.new
6
+ end
7
+
8
+ describe '#initialize' do
9
+ it 'initializes processors array' do
10
+ @transformer.instance_variable_get('@processors').must_equal []
11
+ end
12
+
13
+ it 'initializes cache hash' do
14
+ @transformer.instance_variable_get('@cache').must_equal({})
15
+ end
16
+ end
17
+
18
+ describe '#register' do
19
+ it 'adds processor to processors array' do
20
+ processor = Proc.new { |data, cache| data }
21
+
22
+ @transformer.register(processor)
23
+ @transformer.instance_variable_get('@processors').must_include processor
24
+ end
25
+ end
26
+
27
+ describe '#transform' do
28
+ it 'symbolizes data keys' do
29
+ @transformer.transform({ 'a' => 1 }).must_equal({ :a => 1 })
30
+ end
31
+
32
+ it 'processes data in each processor' do
33
+ processor = Proc.new { |data, cache| data[:b] = 2; data }
34
+
35
+ @transformer.register(processor)
36
+ @transformer.transform({ 'a' => 1 }).must_equal({ :a => 1, :b => 2 })
37
+ end
38
+
39
+ it 'allows processors to use cache' do
40
+ processor = Proc.new do |data, cache|
41
+ cache[:a] ||= 0
42
+ cache[:a] += data[:a]
43
+ end
44
+
45
+ @transformer.register(processor)
46
+ @transformer.transform({ 'a' => 1 })
47
+ @transformer.transform({ 'a' => 2 })
48
+ @transformer.transform({ 'a' => 3 })
49
+ @transformer.instance_variable_get('@cache').must_equal({ :a => 6 })
50
+ end
51
+
52
+ it 'skips remaining processors and returns nil if any processor returns nil' do
53
+ processor1 = Proc.new { |data, cache| nil }
54
+ processor2 = Proc.new { |data, cache| raise 'should not get here' }
55
+
56
+ @transformer.register(processor1)
57
+ @transformer.register(processor2)
58
+ @transformer.transform({ 'a' => 1 }).must_be_nil
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Drudgery::Extractors do
4
+ describe '.instantiate' do
5
+ it 'initializes extractor of type with args' do
6
+ Drudgery::Extractors::CSVExtractor.expects(:new).with('file.csv', :col_sep => '|')
7
+ Drudgery::Extractors.instantiate(:csv, 'file.csv', :col_sep => '|')
8
+
9
+ Drudgery::Extractors::SQLite3Extractor.expects(:new).with('db.sqlite3', 'tablename')
10
+ Drudgery::Extractors.instantiate(:sqlite3, 'db.sqlite3', 'tablename')
11
+
12
+ model = mock
13
+ Drudgery::Extractors::ActiveRecordExtractor.expects(:new).with(model)
14
+ Drudgery::Extractors.instantiate(:active_record, model)
15
+ end
16
+
17
+ it 'returns an extractor' do
18
+ extractor = Drudgery::Extractors.instantiate(:csv, 'file.csv')
19
+ extractor.must_be_kind_of Drudgery::Extractors::CSVExtractor
20
+ end
21
+ end
22
+ end
23
+
24
+ describe Drudgery::Loaders do
25
+ describe '.instantiate' do
26
+ it 'initializes loader of type with args' do
27
+ Drudgery::Loaders::CSVLoader.expects(:new).with('file.csv', :col_sep => '|')
28
+ Drudgery::Loaders.instantiate(:csv, 'file.csv', :col_sep => '|')
29
+
30
+ Drudgery::Loaders::SQLite3Loader.expects(:new).with('db.sqlite3', 'tablename')
31
+ Drudgery::Loaders.instantiate(:sqlite3, 'db.sqlite3', 'tablename')
32
+
33
+ model = mock
34
+ Drudgery::Loaders::ActiveRecordLoader.expects(:new).with(model)
35
+ Drudgery::Loaders.instantiate(:active_record, model)
36
+
37
+ Drudgery::Loaders::ActiveRecordImportLoader.expects(:new).with(model)
38
+ Drudgery::Loaders.instantiate(:active_record_import, model)
39
+ end
40
+
41
+ it 'returns an loader' do
42
+ loader = Drudgery::Loaders.instantiate(:csv, 'file.csv')
43
+ loader.must_be_kind_of Drudgery::Loaders::CSVLoader
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,12 @@
1
+ if ENV['COVERAGE']
2
+ require 'simplecov'
3
+ SimpleCov.start do
4
+ add_filter '/spec/'
5
+ end
6
+ end
7
+
8
+ require 'minitest/spec'
9
+ require 'minitest/autorun'
10
+ require 'mocha'
11
+
12
+ require 'drudgery'
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: drudgery
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jeremy Israelsen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-02 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: &70137906765960 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70137906765960
25
+ - !ruby/object:Gem::Dependency
26
+ name: bundler
27
+ requirement: &70137906765280 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1.1'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70137906765280
36
+ - !ruby/object:Gem::Dependency
37
+ name: mocha
38
+ requirement: &70137906764780 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '0.10'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70137906764780
47
+ - !ruby/object:Gem::Dependency
48
+ name: simplecov
49
+ requirement: &70137906764200 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.6'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70137906764200
58
+ - !ruby/object:Gem::Dependency
59
+ name: guard-minitest
60
+ requirement: &70137906763580 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '0.5'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70137906763580
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: &70137906762940 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70137906762940
80
+ - !ruby/object:Gem::Dependency
81
+ name: activerecord-import
82
+ requirement: &70137906762200 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: 0.2.9
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70137906762200
91
+ - !ruby/object:Gem::Dependency
92
+ name: sqlite3
93
+ requirement: &70137906761580 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: '1.3'
99
+ type: :development
100
+ prerelease: false
101
+ version_requirements: *70137906761580
102
+ description: Currently supports CSV, SQLite3, and ActiveRecord sources and destinations.
103
+ email:
104
+ - jisraelsen@gmail.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - lib/drudgery.rb
110
+ - lib/drudgery/extractors/active_record_extractor.rb
111
+ - lib/drudgery/extractors/csv_extractor.rb
112
+ - lib/drudgery/extractors/sqlite3_extractor.rb
113
+ - lib/drudgery/job.rb
114
+ - lib/drudgery/loaders/active_record_import_loader.rb
115
+ - lib/drudgery/loaders/active_record_loader.rb
116
+ - lib/drudgery/loaders/csv_loader.rb
117
+ - lib/drudgery/loaders/sqlite3_loader.rb
118
+ - lib/drudgery/manager.rb
119
+ - lib/drudgery/transformer.rb
120
+ - lib/drudgery/version.rb
121
+ - LICENSE
122
+ - README.md
123
+ - spec/drudgery/extractors/active_record_extractor_spec.rb
124
+ - spec/drudgery/extractors/csv_extractor_spec.rb
125
+ - spec/drudgery/extractors/sqlite3_extractor_spec.rb
126
+ - spec/drudgery/job_spec.rb
127
+ - spec/drudgery/loaders/active_record_import_loader_spec.rb
128
+ - spec/drudgery/loaders/active_record_loader_spec.rb
129
+ - spec/drudgery/loaders/csv_loader_spec.rb
130
+ - spec/drudgery/loaders/sqlite3_loader_spec.rb
131
+ - spec/drudgery/manager_spec.rb
132
+ - spec/drudgery/transformer_spec.rb
133
+ - spec/drudgery_spec.rb
134
+ - spec/spec_helper.rb
135
+ homepage: http://github.com/jisraelsen/drudgery
136
+ licenses: []
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ none: false
143
+ requirements:
144
+ - - ! '>='
145
+ - !ruby/object:Gem::Version
146
+ version: 1.9.2
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ none: false
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project: drudgery
155
+ rubygems_version: 1.8.17
156
+ signing_key:
157
+ specification_version: 3
158
+ summary: Simple ETL Library
159
+ test_files:
160
+ - spec/drudgery/extractors/active_record_extractor_spec.rb
161
+ - spec/drudgery/extractors/csv_extractor_spec.rb
162
+ - spec/drudgery/extractors/sqlite3_extractor_spec.rb
163
+ - spec/drudgery/job_spec.rb
164
+ - spec/drudgery/loaders/active_record_import_loader_spec.rb
165
+ - spec/drudgery/loaders/active_record_loader_spec.rb
166
+ - spec/drudgery/loaders/csv_loader_spec.rb
167
+ - spec/drudgery/loaders/sqlite3_loader_spec.rb
168
+ - spec/drudgery/manager_spec.rb
169
+ - spec/drudgery/transformer_spec.rb
170
+ - spec/drudgery_spec.rb
171
+ - spec/spec_helper.rb