chicago-etl 0.0.9

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.
Files changed (55) hide show
  1. data/.document +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +21 -0
  6. data/Rakefile +42 -0
  7. data/VERSION +1 -0
  8. data/chicago-etl.gemspec +117 -0
  9. data/lib/chicago/etl/batch.rb +110 -0
  10. data/lib/chicago/etl/buffering_insert_writer.rb +36 -0
  11. data/lib/chicago/etl/counter.rb +36 -0
  12. data/lib/chicago/etl/key_builder.rb +198 -0
  13. data/lib/chicago/etl/load_dataset_builder.rb +75 -0
  14. data/lib/chicago/etl/mysql_dumpfile.rb +32 -0
  15. data/lib/chicago/etl/mysql_load_file_value_transformer.rb +24 -0
  16. data/lib/chicago/etl/screens/column_screen.rb +59 -0
  17. data/lib/chicago/etl/screens/composite_screen.rb +17 -0
  18. data/lib/chicago/etl/screens/invalid_element.rb +27 -0
  19. data/lib/chicago/etl/screens/missing_value.rb +22 -0
  20. data/lib/chicago/etl/screens/out_of_bounds.rb +33 -0
  21. data/lib/chicago/etl/sequel/dependant_tables.rb +48 -0
  22. data/lib/chicago/etl/sequel/filter_to_etl_batch.rb +53 -0
  23. data/lib/chicago/etl/sequel/load_data_infile.rb +19 -0
  24. data/lib/chicago/etl/sink.rb +61 -0
  25. data/lib/chicago/etl/table_builder.rb +45 -0
  26. data/lib/chicago/etl/task_invocation.rb +32 -0
  27. data/lib/chicago/etl/tasks.rb +34 -0
  28. data/lib/chicago/etl/transformations/add_insert_timestamp.rb +16 -0
  29. data/lib/chicago/etl/transformations/uk_post_code.rb +40 -0
  30. data/lib/chicago/etl/transformations/uk_post_code_field.rb +59 -0
  31. data/lib/chicago/etl.rb +35 -0
  32. data/lib/chicago-etl.rb +0 -0
  33. data/spec/db_connections.yml.dist +4 -0
  34. data/spec/etl/batch_spec.rb +86 -0
  35. data/spec/etl/counter_spec.rb +44 -0
  36. data/spec/etl/etl_batch_id_dataset_filter.rb +29 -0
  37. data/spec/etl/key_builder_spec.rb +190 -0
  38. data/spec/etl/load_dataset_builder_spec.rb +86 -0
  39. data/spec/etl/mysql_dumpfile_spec.rb +42 -0
  40. data/spec/etl/mysql_load_file_value_transformer_spec.rb +27 -0
  41. data/spec/etl/screens/composite_screen_spec.rb +25 -0
  42. data/spec/etl/screens/invalid_element_spec.rb +27 -0
  43. data/spec/etl/screens/missing_value_spec.rb +58 -0
  44. data/spec/etl/screens/out_of_bounds_spec.rb +64 -0
  45. data/spec/etl/sequel/dependant_tables_spec.rb +41 -0
  46. data/spec/etl/sequel/filter_to_etl_batch_spec.rb +54 -0
  47. data/spec/etl/sequel/load_data_infile_spec.rb +37 -0
  48. data/spec/etl/sink_spec.rb +7 -0
  49. data/spec/etl/table_builder_spec.rb +22 -0
  50. data/spec/etl/task_spec.rb +87 -0
  51. data/spec/etl/transformations/add_insert_timestamp_spec.rb +9 -0
  52. data/spec/etl/transformations/uk_post_code_field_spec.rb +95 -0
  53. data/spec/etl/transformations/uk_post_code_spec.rb +102 -0
  54. data/spec/spec_helper.rb +20 -0
  55. metadata +245 -0
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chicago::ETL::Sink do
4
+ it "writes rows once if given a key" do
5
+
6
+ end
7
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe Chicago::ETL::TableBuilder do
4
+ before :each do
5
+ TEST_DB.drop_table(*(TEST_DB.tables))
6
+ end
7
+
8
+ it "should create an etl_batches table" do
9
+ ETL::TableBuilder.build(TEST_DB)
10
+ TEST_DB.tables.should include(:etl_batches)
11
+ end
12
+
13
+ it "should create an etl_task_invocations table" do
14
+ ETL::TableBuilder.build(TEST_DB)
15
+ TEST_DB.tables.should include(:etl_task_invocations)
16
+ end
17
+
18
+ it "should do nothing and not raise an error if run more times than necessary" do
19
+ ETL::TableBuilder.build(TEST_DB)
20
+ lambda { ETL::TableBuilder.build(TEST_DB) }.should_not raise_error(Sequel::DatabaseError)
21
+ end
22
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+ require 'timeout'
3
+
4
+ describe Chicago::ETL::TaskInvocation do
5
+ before :all do
6
+ TEST_DB.drop_table(*(TEST_DB.tables))
7
+ ETL::TableBuilder.build(TEST_DB)
8
+ ETL::TaskInvocation.db = TEST_DB
9
+ end
10
+
11
+ before :each do
12
+ TEST_DB[:etl_task_invocations].truncate
13
+ TEST_DB[:etl_batches].truncate
14
+ end
15
+
16
+ after :each do
17
+ tmpdir = File.expand_path(File.join(File.dirname(__FILE__), "..", "tmp"))
18
+ FileUtils.rm_r(tmpdir) if File.exists?(tmpdir)
19
+ end
20
+
21
+ it "should be associated with an ETL Batch" do
22
+ batch = create_batch
23
+ batch.should_not be_nil
24
+ t = ETL::TaskInvocation.create(:batch => batch)
25
+ t.reload.batch.should == batch
26
+ end
27
+
28
+ it "should be unqiue by name across an ETL Batch and stage" do
29
+ attrs = {:batch_id => 1, :stage => "Extract", :name => "foo"}
30
+ ETL::TaskInvocation.create(attrs)
31
+ lambda { ETL::TaskInvocation.create(attrs) }.should raise_error(Sequel::DatabaseError)
32
+ end
33
+
34
+ it "should be in the 'Created' state by default" do
35
+ ETL::TaskInvocation.create.state.should == "Created"
36
+ end
37
+
38
+ it "should perform an action in a block, and set it's state to Error if an exception is raised" do
39
+ task = ETL::TaskInvocation.create
40
+ lambda { task.perform { raise "Boom" } }.should raise_error(RuntimeError, "Boom")
41
+ task.state.should == "Error"
42
+ end
43
+
44
+ it "should perform an action in a block, and set it's state to Error if an timeout error is raised" do
45
+ task = ETL::TaskInvocation.create
46
+ lambda { task.perform { raise Timeout::Error.new("Timeout error") } }.should raise_error(Timeout::Error)
47
+ task.state.should == "Error"
48
+ end
49
+
50
+ it "should be in the 'Started' state while perform is called" do
51
+ task = ETL::TaskInvocation.create
52
+ task.perform { task.state.should == "Started" }
53
+ end
54
+
55
+ it "should be in the 'Finished' state after #perform has finished" do
56
+ task = ETL::TaskInvocation.create
57
+ task.perform {}
58
+ task.state.should == "Finished"
59
+ task.finished_at.should be_kind_of(Time)
60
+ end
61
+
62
+ it "should raise a RuntimeError if perform is attempted after the task has finished" do
63
+ task = ETL::TaskInvocation.create
64
+ task.perform {}
65
+ lambda { task.perform {} }.should raise_error(RuntimeError)
66
+ end
67
+
68
+ it "should increment the number of attempts each time the task is performed" do
69
+ task = ETL::TaskInvocation.create
70
+ task.perform { raise "Boom" } rescue nil
71
+ task.attempts.should == 1
72
+ task.perform { raise "Boom" } rescue nil
73
+ task.attempts.should == 2
74
+ end
75
+
76
+ it "should set the associated batch into an error state" do
77
+ batch = create_batch
78
+ task = ETL::TaskInvocation.create(:batch => batch)
79
+ task.perform { raise "Boom" } rescue nil
80
+ task.batch.should be_in_error
81
+ end
82
+
83
+ def create_batch
84
+ Chicago.project_root = File.expand_path(File.join(File.dirname(__FILE__), ".."))
85
+ ETL::Batch.create
86
+ end
87
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chicago::ETL::Transformations::AddInsertTimestamp do
4
+ it "adds a timestamp in UTC in the _inserted_at field" do
5
+ time = subject.call({}).first[:_inserted_at]
6
+ time.should be_kind_of(Time)
7
+ time.zone.should == "UTC"
8
+ end
9
+ end
@@ -0,0 +1,95 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Chicago::ETL::Transformations::UkPostCodeField do
5
+ it "reformats a 6 character postcode" do
6
+ data = described_class.new.normalize(" SW 30 TA")
7
+ data[:post_code].should == "SW3 0TA"
8
+ end
9
+
10
+ it "reformats a 7 character postcode" do
11
+ data = described_class.new.normalize(" G L515 FD")
12
+ data[:post_code].should == "GL51 5FD"
13
+ end
14
+
15
+ it "reformats a BFPO postcode" do
16
+ data = described_class.new.normalize("bfpo123")
17
+ data[:post_code].should == "BFPO 123"
18
+ end
19
+
20
+ it "returns the outcode" do
21
+ data = described_class.new.normalize(" G L515 FD")
22
+ data[:outcode].should == "GL51"
23
+ end
24
+
25
+ it "returns the incode" do
26
+ data = described_class.new.normalize(" G L515 FD")
27
+ data[:outcode].should == "GL51"
28
+ end
29
+
30
+ it "fixes people using 0 instead of O for OX and OL post codes" do
31
+ data = described_class.new.normalize(" 0X1 4HG")
32
+ data[:post_code].should == "OX1 4HG"
33
+
34
+ data = described_class.new.normalize(" 0L1 4HG")
35
+ data[:post_code].should == "OL1 4HG"
36
+ end
37
+
38
+ it "fixes people using 0 instead of O for OX post codes" do
39
+ data = described_class.new.normalize(" 0X1 4HG")
40
+ data[:post_code].should == "OX1 4HG"
41
+ end
42
+
43
+ it "fixes people using 0 instead of O for OL post codes" do
44
+ data = described_class.new.normalize(" 0L1 0LG")
45
+ data[:post_code].should == "OL1 0LG"
46
+ end
47
+
48
+ it "fixes people using 0 instead of O for PO post codes" do
49
+ data = described_class.new.normalize(" P01 4HG")
50
+ data[:post_code].should == "PO1 4HG"
51
+ end
52
+
53
+ it "fixes people using 0 instead of O for SO post codes" do
54
+ data = described_class.new.normalize(" S01 4HG")
55
+ data[:post_code].should == "SO1 4HG"
56
+ end
57
+
58
+ it "fixes people using 0 instead of O for CO post codes" do
59
+ data = described_class.new.normalize(" C01 4HG")
60
+ data[:post_code].should == "CO1 4HG"
61
+ end
62
+
63
+ it "fixes people using 0 instead of O for YO post codes" do
64
+ data = described_class.new.normalize(" Y01 4HG")
65
+ data[:post_code].should == "YO1 4HG"
66
+ end
67
+
68
+ it "fixes shift key slips" do
69
+ data = described_class.new.normalize(")X!£ $HG")
70
+ data[:post_code].should == "OX13 4HG"
71
+ end
72
+
73
+ it "uppercases post code letters" do
74
+ data = described_class.new.normalize("sw3 0ta")
75
+ data[:post_code].should == "SW3 0TA"
76
+ end
77
+
78
+ it "returns the postcode with an invalid flag if invalid" do
79
+ data = described_class.new.normalize("zzz zzz")
80
+ data.should == {:post_code => "zzz zzz", :invalid => true}
81
+ end
82
+
83
+ it "has no outcode if not valid" do
84
+ data = described_class.new.normalize("zzz zzz")
85
+ data[:outcode].should == nil
86
+ end
87
+
88
+ it "has the outcode for partial postcodes" do
89
+ data = described_class.new.normalize("W1a")
90
+ data[:post_code].should == "W1A"
91
+ data[:outcode].should == "W1A"
92
+ data[:incode].should be_nil
93
+ data[:invalid].should_not be_true
94
+ end
95
+ end
@@ -0,0 +1,102 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Chicago::ETL::Transformations::UkPostCode do
5
+ it "reformats a 6 character postcode" do
6
+ row, _ = described_class.new(:post_code).
7
+ call(:post_code => " SW 30 TA")
8
+
9
+ row[:post_code].should == "SW3 0TA"
10
+ end
11
+
12
+ it "reformats a 7 character postcode" do
13
+ row, _ = described_class.new(:post_code).
14
+ call(:post_code => " G L515 FD")
15
+
16
+ row[:post_code].should == "GL51 5FD"
17
+ end
18
+
19
+ it "doesn't reformat a BFPO post code" do
20
+ row, _ = described_class.new(:post_code).
21
+ call(:post_code => "BFPO 23")
22
+
23
+ row[:post_code].should == "BFPO 23"
24
+ end
25
+
26
+ it "fixes people using 0 instead of O for OX and OL post codes" do
27
+ row, _ = described_class.new(:post_code).
28
+ call(:post_code => " 0X1 4HG")
29
+
30
+ row[:post_code].should == "OX1 4HG"
31
+
32
+ row, _ = described_class.new(:post_code).
33
+ call(:post_code => " 0L1 4HG")
34
+
35
+ row[:post_code].should == "OL1 4HG"
36
+ end
37
+
38
+ it "fixes people using 0 instead of O for OX post codes" do
39
+ row, _ = described_class.new(:post_code).
40
+ call(:post_code => " 0X1 4HG")
41
+
42
+ row[:post_code].should == "OX1 4HG"
43
+ end
44
+
45
+ it "fixes people using 0 instead of O for OL post codes" do
46
+ row, _ = described_class.new(:post_code).
47
+ call(:post_code => " 0L1 0LG")
48
+
49
+ row[:post_code].should == "OL1 0LG"
50
+ end
51
+
52
+ it "fixes people using 0 instead of O for PO post codes" do
53
+ row, _ = described_class.new(:post_code).
54
+ call(:post_code => " P01 4HG")
55
+
56
+ row[:post_code].should == "PO1 4HG"
57
+ end
58
+
59
+ it "fixes people using 0 instead of O for SO post codes" do
60
+ row, _ = described_class.new(:post_code).
61
+ call(:post_code => " S01 4HG")
62
+
63
+ row[:post_code].should == "SO1 4HG"
64
+ end
65
+
66
+ it "fixes people using 0 instead of O for CO post codes" do
67
+ row, _ = described_class.new(:post_code).
68
+ call(:post_code => " C01 4HG")
69
+
70
+ row[:post_code].should == "CO1 4HG"
71
+ end
72
+
73
+ it "fixes people using 0 instead of O for YO post codes" do
74
+ row, _ = described_class.new(:post_code).
75
+ call(:post_code => " Y01 4HG")
76
+
77
+ row[:post_code].should == "YO1 4HG"
78
+ end
79
+
80
+ it "fixes shift key slips" do
81
+ row, _ = described_class.new(:post_code).
82
+ call(:post_code => ")X!£ $HG")
83
+
84
+ row[:post_code].should == "OX13 4HG"
85
+ end
86
+
87
+ it "uppercases post code letters" do
88
+ row, _ = described_class.new(:post_code).
89
+ call(:post_code => "sw3 0ta")
90
+
91
+ row[:post_code].should == "SW3 0TA"
92
+ end
93
+
94
+ it "can be configured to only run given a block with success" do
95
+ transform = described_class.new(:post_code) {|row| row[:country] == "GB" }
96
+
97
+ transform.call(:post_code => "sw1 7yh").first[:post_code].
98
+ should == "sw1 7yh"
99
+ transform.call(:country => "GB", :post_code => "sw1 7yh").
100
+ first[:post_code].should == "SW1 7YH"
101
+ end
102
+ end
@@ -0,0 +1,20 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'chicago'
5
+ require 'chicago/etl'
6
+ require 'yaml'
7
+ require 'timecop'
8
+
9
+ include Chicago
10
+
11
+ unless defined? TEST_DB
12
+ TEST_DB = Sequel.connect(YAML.load(File.read(File.dirname(__FILE__) + "/db_connections.yml")))
13
+ end
14
+
15
+ # Requires supporting files with custom matchers and macros, etc,
16
+ # in ./support/ and its subdirectories.
17
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
18
+
19
+ RSpec.configure do |config|
20
+ end
metadata ADDED
@@ -0,0 +1,245 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chicago-etl
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 9
10
+ version: 0.0.9
11
+ platform: ruby
12
+ authors:
13
+ - Roland Swingler
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2013-02-19 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
22
+ none: false
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ hash: 3
27
+ segments:
28
+ - 0
29
+ - 4
30
+ version: "0.4"
31
+ requirement: *id001
32
+ type: :runtime
33
+ prerelease: false
34
+ name: chicagowarehouse
35
+ - !ruby/object:Gem::Dependency
36
+ version_requirements: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ hash: 7
42
+ segments:
43
+ - 2
44
+ version: "2"
45
+ requirement: *id002
46
+ type: :development
47
+ prerelease: false
48
+ name: rspec
49
+ - !ruby/object:Gem::Dependency
50
+ version_requirements: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ hash: 3
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ requirement: *id003
60
+ type: :development
61
+ prerelease: false
62
+ name: timecop
63
+ - !ruby/object:Gem::Dependency
64
+ version_requirements: &id004 !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ requirement: *id004
74
+ type: :development
75
+ prerelease: false
76
+ name: yard
77
+ - !ruby/object:Gem::Dependency
78
+ version_requirements: &id005 !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ hash: 3
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ requirement: *id005
88
+ type: :development
89
+ prerelease: false
90
+ name: flog
91
+ - !ruby/object:Gem::Dependency
92
+ version_requirements: &id006 !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirement: *id006
102
+ type: :development
103
+ prerelease: false
104
+ name: jeweler
105
+ - !ruby/object:Gem::Dependency
106
+ version_requirements: &id007 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ hash: 3
112
+ segments:
113
+ - 0
114
+ version: "0"
115
+ requirement: *id007
116
+ type: :development
117
+ prerelease: false
118
+ name: rcov
119
+ - !ruby/object:Gem::Dependency
120
+ version_requirements: &id008 !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ hash: 3
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ requirement: *id008
130
+ type: :development
131
+ prerelease: false
132
+ name: simplecov
133
+ - !ruby/object:Gem::Dependency
134
+ version_requirements: &id009 !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ hash: 3
140
+ segments:
141
+ - 0
142
+ version: "0"
143
+ requirement: *id009
144
+ type: :development
145
+ prerelease: false
146
+ name: ZenTest
147
+ description: ETL tools for Chicago
148
+ email: roland.swingler@gmail.com
149
+ executables: []
150
+
151
+ extensions: []
152
+
153
+ extra_rdoc_files:
154
+ - LICENSE.txt
155
+ - README.rdoc
156
+ files:
157
+ - .document
158
+ - .rspec
159
+ - Gemfile
160
+ - LICENSE.txt
161
+ - README.rdoc
162
+ - Rakefile
163
+ - VERSION
164
+ - chicago-etl.gemspec
165
+ - lib/chicago-etl.rb
166
+ - lib/chicago/etl.rb
167
+ - lib/chicago/etl/batch.rb
168
+ - lib/chicago/etl/buffering_insert_writer.rb
169
+ - lib/chicago/etl/counter.rb
170
+ - lib/chicago/etl/key_builder.rb
171
+ - lib/chicago/etl/load_dataset_builder.rb
172
+ - lib/chicago/etl/mysql_dumpfile.rb
173
+ - lib/chicago/etl/mysql_load_file_value_transformer.rb
174
+ - lib/chicago/etl/screens/column_screen.rb
175
+ - lib/chicago/etl/screens/composite_screen.rb
176
+ - lib/chicago/etl/screens/invalid_element.rb
177
+ - lib/chicago/etl/screens/missing_value.rb
178
+ - lib/chicago/etl/screens/out_of_bounds.rb
179
+ - lib/chicago/etl/sequel/dependant_tables.rb
180
+ - lib/chicago/etl/sequel/filter_to_etl_batch.rb
181
+ - lib/chicago/etl/sequel/load_data_infile.rb
182
+ - lib/chicago/etl/sink.rb
183
+ - lib/chicago/etl/table_builder.rb
184
+ - lib/chicago/etl/task_invocation.rb
185
+ - lib/chicago/etl/tasks.rb
186
+ - lib/chicago/etl/transformations/add_insert_timestamp.rb
187
+ - lib/chicago/etl/transformations/uk_post_code.rb
188
+ - lib/chicago/etl/transformations/uk_post_code_field.rb
189
+ - spec/db_connections.yml.dist
190
+ - spec/etl/batch_spec.rb
191
+ - spec/etl/counter_spec.rb
192
+ - spec/etl/etl_batch_id_dataset_filter.rb
193
+ - spec/etl/key_builder_spec.rb
194
+ - spec/etl/load_dataset_builder_spec.rb
195
+ - spec/etl/mysql_dumpfile_spec.rb
196
+ - spec/etl/mysql_load_file_value_transformer_spec.rb
197
+ - spec/etl/screens/composite_screen_spec.rb
198
+ - spec/etl/screens/invalid_element_spec.rb
199
+ - spec/etl/screens/missing_value_spec.rb
200
+ - spec/etl/screens/out_of_bounds_spec.rb
201
+ - spec/etl/sequel/dependant_tables_spec.rb
202
+ - spec/etl/sequel/filter_to_etl_batch_spec.rb
203
+ - spec/etl/sequel/load_data_infile_spec.rb
204
+ - spec/etl/sink_spec.rb
205
+ - spec/etl/table_builder_spec.rb
206
+ - spec/etl/task_spec.rb
207
+ - spec/etl/transformations/add_insert_timestamp_spec.rb
208
+ - spec/etl/transformations/uk_post_code_field_spec.rb
209
+ - spec/etl/transformations/uk_post_code_spec.rb
210
+ - spec/spec_helper.rb
211
+ homepage: http://github.com/notonthehighstreet/chicago-etl
212
+ licenses:
213
+ - MIT
214
+ post_install_message:
215
+ rdoc_options: []
216
+
217
+ require_paths:
218
+ - lib
219
+ required_ruby_version: !ruby/object:Gem::Requirement
220
+ none: false
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ hash: 3
225
+ segments:
226
+ - 0
227
+ version: "0"
228
+ required_rubygems_version: !ruby/object:Gem::Requirement
229
+ none: false
230
+ requirements:
231
+ - - ">="
232
+ - !ruby/object:Gem::Version
233
+ hash: 3
234
+ segments:
235
+ - 0
236
+ version: "0"
237
+ requirements: []
238
+
239
+ rubyforge_project:
240
+ rubygems_version: 1.8.25
241
+ signing_key:
242
+ specification_version: 3
243
+ summary: Chicago ETL
244
+ test_files: []
245
+