chicago-etl 0.2.2 → 0.2.3
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/Gemfile +3 -4
- data/VERSION +1 -1
- data/chicago-etl.gemspec +8 -11
- data/lib/chicago/etl/dataset_builder.rb +1 -1
- data/lib/chicago/etl/key_builder.rb +17 -10
- data/lib/chicago/etl/sequel/filter_to_etl_batch.rb +15 -3
- data/spec/db_connections.yml.dist +1 -1
- data/spec/etl/batch_spec.rb +1 -1
- data/spec/etl/dataset_source_spec.rb +1 -1
- data/spec/etl/execution_wrapper_spec.rb +3 -3
- data/spec/etl/key_builder_spec.rb +8 -8
- data/spec/etl/load_dataset_builder_spec.rb +1 -1
- data/spec/etl/mysql_file_sink_spec.rb +3 -3
- data/spec/etl/mysql_integration_spec.rb +1 -1
- data/spec/etl/pipeline_stage_builder_spec.rb +5 -5
- data/spec/etl/schema_table_sink_factory_spec.rb +5 -5
- data/spec/etl/sequel/filter_to_etl_batch_spec.rb +1 -1
- data/spec/etl/stage_spec.rb +7 -7
- data/spec/etl/table_builder_spec.rb +1 -1
- data/spec/etl/transformation_spec.rb +1 -1
- data/spec/etl/transformations_spec.rb +1 -1
- metadata +180 -197
data/Gemfile
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
source "http://rubygems.org"
|
1
|
+
source "http://rubygems.org"
|
2
2
|
|
3
|
-
gem "chicagowarehouse", "~> 0.4"
|
3
|
+
gem "chicagowarehouse", "~> 0.4", ">= 0.4.6"
|
4
4
|
gem "fastercsv", :platform => :ruby_18
|
5
|
-
gem "sequel"
|
6
5
|
gem "sequel_load_data_infile", ">= 0.0.2", :require => "sequel/load_data_infile"
|
7
6
|
gem "sequel_fast_columns", :require => "sequel/fast_columns"
|
8
7
|
|
@@ -15,7 +14,7 @@ group :development do
|
|
15
14
|
gem "flog"
|
16
15
|
gem "simplecov", :platforms => :mri_19, :require => false
|
17
16
|
gem "ZenTest"
|
18
|
-
gem "
|
17
|
+
gem "mysql2"
|
19
18
|
gem "bundler", "~> 1"
|
20
19
|
gem "jeweler"
|
21
20
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
data/chicago-etl.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "chicago-etl"
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Roland Swingler"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2014-01-06"
|
13
13
|
s.description = "ETL tools for Chicago"
|
14
14
|
s.email = "roland.swingler@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -113,9 +113,8 @@ Gem::Specification.new do |s|
|
|
113
113
|
s.specification_version = 3
|
114
114
|
|
115
115
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
116
|
-
s.add_runtime_dependency(%q<chicagowarehouse>, ["~> 0.4"])
|
116
|
+
s.add_runtime_dependency(%q<chicagowarehouse>, [">= 0.4.6", "~> 0.4"])
|
117
117
|
s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
|
118
|
-
s.add_runtime_dependency(%q<sequel>, [">= 0"])
|
119
118
|
s.add_runtime_dependency(%q<sequel_load_data_infile>, [">= 0.0.2"])
|
120
119
|
s.add_runtime_dependency(%q<sequel_fast_columns>, [">= 0"])
|
121
120
|
s.add_development_dependency(%q<rspec>, ["~> 2"])
|
@@ -124,13 +123,12 @@ Gem::Specification.new do |s|
|
|
124
123
|
s.add_development_dependency(%q<flog>, [">= 0"])
|
125
124
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
126
125
|
s.add_development_dependency(%q<ZenTest>, [">= 0"])
|
127
|
-
s.add_development_dependency(%q<
|
126
|
+
s.add_development_dependency(%q<mysql2>, [">= 0"])
|
128
127
|
s.add_development_dependency(%q<bundler>, ["~> 1"])
|
129
128
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
130
129
|
else
|
131
|
-
s.add_dependency(%q<chicagowarehouse>, ["~> 0.4"])
|
130
|
+
s.add_dependency(%q<chicagowarehouse>, [">= 0.4.6", "~> 0.4"])
|
132
131
|
s.add_dependency(%q<fastercsv>, [">= 0"])
|
133
|
-
s.add_dependency(%q<sequel>, [">= 0"])
|
134
132
|
s.add_dependency(%q<sequel_load_data_infile>, [">= 0.0.2"])
|
135
133
|
s.add_dependency(%q<sequel_fast_columns>, [">= 0"])
|
136
134
|
s.add_dependency(%q<rspec>, ["~> 2"])
|
@@ -139,14 +137,13 @@ Gem::Specification.new do |s|
|
|
139
137
|
s.add_dependency(%q<flog>, [">= 0"])
|
140
138
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
141
139
|
s.add_dependency(%q<ZenTest>, [">= 0"])
|
142
|
-
s.add_dependency(%q<
|
140
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
143
141
|
s.add_dependency(%q<bundler>, ["~> 1"])
|
144
142
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
145
143
|
end
|
146
144
|
else
|
147
|
-
s.add_dependency(%q<chicagowarehouse>, ["~> 0.4"])
|
145
|
+
s.add_dependency(%q<chicagowarehouse>, [">= 0.4.6", "~> 0.4"])
|
148
146
|
s.add_dependency(%q<fastercsv>, [">= 0"])
|
149
|
-
s.add_dependency(%q<sequel>, [">= 0"])
|
150
147
|
s.add_dependency(%q<sequel_load_data_infile>, [">= 0.0.2"])
|
151
148
|
s.add_dependency(%q<sequel_fast_columns>, [">= 0"])
|
152
149
|
s.add_dependency(%q<rspec>, ["~> 2"])
|
@@ -155,7 +152,7 @@ Gem::Specification.new do |s|
|
|
155
152
|
s.add_dependency(%q<flog>, [">= 0"])
|
156
153
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
157
154
|
s.add_dependency(%q<ZenTest>, [">= 0"])
|
158
|
-
s.add_dependency(%q<
|
155
|
+
s.add_dependency(%q<mysql2>, [">= 0"])
|
159
156
|
s.add_dependency(%q<bundler>, ["~> 1"])
|
160
157
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
161
158
|
end
|
@@ -21,18 +21,13 @@ module Chicago
|
|
21
21
|
@table = table
|
22
22
|
@staging_db = staging_db
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
|
+
# Creates the appropriate key builder for a schema table,
|
26
|
+
# depending on the table type and whether rows are identified
|
27
|
+
# by original keys or need to be hashed.
|
25
28
|
def make
|
26
29
|
if dimension?
|
27
|
-
|
28
|
-
|
29
|
-
if table.identifiable?
|
30
|
-
IdentifiableDimensionKeyBuilder.new(key_table)
|
31
|
-
elsif existing_hash_column?(table)
|
32
|
-
ExistingHashColumnKeyBuilder.new(key_table)
|
33
|
-
else
|
34
|
-
HashingKeyBuilder.new(key_table, columns_to_hash)
|
35
|
-
end
|
30
|
+
dimension_key_builder
|
36
31
|
elsif fact?
|
37
32
|
FactKeyBuilder.new(staging_db[table.table_name])
|
38
33
|
end
|
@@ -40,6 +35,18 @@ module Chicago
|
|
40
35
|
|
41
36
|
private
|
42
37
|
|
38
|
+
def dimension_key_builder
|
39
|
+
key_table = staging_db[table.key_table_name]
|
40
|
+
|
41
|
+
if table.identifiable?
|
42
|
+
IdentifiableDimensionKeyBuilder.new(key_table)
|
43
|
+
elsif existing_hash_column?(table)
|
44
|
+
ExistingHashColumnKeyBuilder.new(key_table)
|
45
|
+
else
|
46
|
+
HashingKeyBuilder.new(key_table, columns_to_hash)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
43
50
|
def existing_hash_column?(table)
|
44
51
|
table.columns.any? {|c| c.binary? && c.name == :hash && c.unique? }
|
45
52
|
end
|
@@ -2,12 +2,16 @@ module Chicago
|
|
2
2
|
module ETL
|
3
3
|
module SequelExtensions
|
4
4
|
module FilterToEtlBatch
|
5
|
+
# Filters this Dataset to select records only applicable to
|
6
|
+
# the current batch, based on the batch id.
|
7
|
+
#
|
8
|
+
# Applies filters on all tables selected & joined if they have
|
9
|
+
# an etl_batch_id column.
|
5
10
|
def filter_to_etl_batch(etl_batch)
|
6
|
-
conditions =
|
7
|
-
select {|e| has_etl_batch_column?(e) }.
|
11
|
+
conditions = tables_with_etl_batch_column.
|
8
12
|
map {|e| make_etl_batch_filter(e, etl_batch) }
|
9
13
|
|
10
|
-
ds =
|
14
|
+
ds = apply_etl_batch_filters(conditions)
|
11
15
|
|
12
16
|
if ds.opts[:compounds]
|
13
17
|
ds.opts[:compounds].each do |compound|
|
@@ -20,6 +24,14 @@ module Chicago
|
|
20
24
|
|
21
25
|
private
|
22
26
|
|
27
|
+
def tables_with_etl_batch_column
|
28
|
+
(opts[:from] + (opts[:join] || [])).select {|e| has_etl_batch_column?(e) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def apply_etl_batch_filters(conditions)
|
32
|
+
conditions.any? ? filter(conditions.inject {|a,b| a | b}) : dup
|
33
|
+
end
|
34
|
+
|
23
35
|
def make_etl_batch_filter(expression, etl_batch)
|
24
36
|
table = case expression
|
25
37
|
when Sequel::SQL::AliasedExpression
|
data/spec/etl/batch_spec.rb
CHANGED
@@ -82,6 +82,6 @@ describe Chicago::ETL::Batch do
|
|
82
82
|
|
83
83
|
it "should not complain when given a symbol as the stage name" do
|
84
84
|
batch = ETL::Batch.instance.start
|
85
|
-
lambda { batch.perform_task(:transform, "Test") {} }.should_not raise_error
|
85
|
+
lambda { batch.perform_task(:transform, "Test") {} }.should_not raise_error
|
86
86
|
end
|
87
87
|
end
|
@@ -7,11 +7,11 @@ describe "Chicago::ETL Execution method" do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
let(:logger) {
|
10
|
+
let(:logger) { double(:logger).as_null_object }
|
11
11
|
let(:batch) { StubBatch.new }
|
12
12
|
|
13
13
|
it "only logs skipping the stage if the stage is not executable" do
|
14
|
-
stage =
|
14
|
+
stage = double(:stage, :executable? => false, :name => "test")
|
15
15
|
stage.should_not_receive(:execute)
|
16
16
|
logger.should_receive(:info).with("Skipping stage test")
|
17
17
|
|
@@ -19,7 +19,7 @@ describe "Chicago::ETL Execution method" do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it "executes the stage" do
|
22
|
-
stage =
|
22
|
+
stage = double(:stage, :executable? => true, :name => "test")
|
23
23
|
stage.should_receive(:execute).with(batch, false)
|
24
24
|
|
25
25
|
Chicago::ETL.execute(stage, batch, false, logger)
|
@@ -37,11 +37,11 @@ describe Chicago::ETL::KeyBuilder do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
before :each do
|
40
|
-
@db =
|
41
|
-
@db.stub(:[]).and_return(
|
42
|
-
@sink =
|
40
|
+
@db = double(:staging_database).as_null_object
|
41
|
+
@db.stub(:[]).and_return(double(:max => nil, :select_hash => {}))
|
42
|
+
@sink = double(:sink).as_null_object
|
43
43
|
Chicago::ETL::SchemaTableSinkFactory.stub(:new).
|
44
|
-
and_return(
|
44
|
+
and_return(double(:factory, :key_sink => @sink))
|
45
45
|
end
|
46
46
|
|
47
47
|
describe "for identifiable dimensions" do
|
@@ -62,13 +62,13 @@ describe Chicago::ETL::KeyBuilder do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it "takes into account the current maximum key in the database" do
|
65
|
-
@db.stub(:[]).with(:keys_dimension_user).and_return(
|
65
|
+
@db.stub(:[]).with(:keys_dimension_user).and_return(double(:max => 2, :select_hash => {}))
|
66
66
|
builder = described_class.for_table(@dimension, @db)
|
67
67
|
builder.key(:original_id => 1).first.should == 3
|
68
68
|
end
|
69
69
|
|
70
70
|
it "returns previously created keys" do
|
71
|
-
dataset =
|
71
|
+
dataset = double(:dataset, :max => 1, :select_hash => {40 => 1})
|
72
72
|
@db.stub(:[]).with(:keys_dimension_user).and_return(dataset)
|
73
73
|
|
74
74
|
builder = described_class.for_table(@dimension, @db)
|
@@ -133,7 +133,7 @@ describe Chicago::ETL::KeyBuilder do
|
|
133
133
|
end
|
134
134
|
|
135
135
|
it "selects the Hex version of the binary column for the cache" do
|
136
|
-
dataset =
|
136
|
+
dataset = double(:dataset, :max => 1).as_null_object
|
137
137
|
@db.stub(:[]).with(:keys_dimension_address).and_return(dataset)
|
138
138
|
@builder = described_class.for_table(@schema.dimension(:address), @db)
|
139
139
|
|
@@ -161,7 +161,7 @@ describe Chicago::ETL::KeyBuilder do
|
|
161
161
|
end
|
162
162
|
|
163
163
|
it "increments from the last id stored id in the fact table" do
|
164
|
-
@db.stub(:[]).with(:facts_addresses).and_return(
|
164
|
+
@db.stub(:[]).with(:facts_addresses).and_return(double(:max => 100, :select_hash => {}))
|
165
165
|
@builder = described_class.for_table(@schema.fact(:addresses), @db)
|
166
166
|
@builder.key({}).first.should == 101
|
167
167
|
end
|
@@ -2,9 +2,9 @@ require 'spec_helper'
|
|
2
2
|
require 'sequel'
|
3
3
|
|
4
4
|
describe Chicago::ETL::MysqlFileSink do
|
5
|
-
let(:dataset) {
|
6
|
-
let(:db) {
|
7
|
-
let(:csv) {
|
5
|
+
let(:dataset) { double(:dataset).as_null_object }
|
6
|
+
let(:db) { double(:db, :[] => dataset, :schema => []) }
|
7
|
+
let(:csv) { double(:csv) }
|
8
8
|
|
9
9
|
let(:sink) {
|
10
10
|
described_class.new(db, :table, [:foo], :filepath => "test_file")
|
@@ -64,7 +64,7 @@ describe "Mysql -> Mysql through transformation chain" do
|
|
64
64
|
:other => sink_2
|
65
65
|
})
|
66
66
|
|
67
|
-
stage.execute(
|
67
|
+
stage.execute(double(:etl_batch), true)
|
68
68
|
|
69
69
|
expected = [{:id => 1, :foo => nil, :bin => "1F"},
|
70
70
|
{:id => 2, :foo => "Hello", :bin => "1F"}]
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Chicago::ETL::SchemaSinksAndTransformationsBuilder do
|
4
|
-
let(:dimension) {
|
5
|
-
let(:db) {
|
6
|
-
let(:sink_factory) {
|
4
|
+
let(:dimension) { double(:dimension).as_null_object }
|
5
|
+
let(:db) { double(:db).as_null_object }
|
6
|
+
let(:sink_factory) { double(:sink_factory).as_null_object }
|
7
7
|
|
8
8
|
before(:each) {
|
9
9
|
Chicago::ETL::SchemaTableSinkFactory.stub(:new).and_return(sink_factory)
|
@@ -12,7 +12,7 @@ describe Chicago::ETL::SchemaSinksAndTransformationsBuilder do
|
|
12
12
|
it "should exclude columns from the sink" do
|
13
13
|
sink_factory.should_receive(:sink).
|
14
14
|
with(:ignore => false, :exclude => [:foo]).
|
15
|
-
and_return(
|
15
|
+
and_return(double(:sink).as_null_object)
|
16
16
|
|
17
17
|
described_class.new(db, dimension).build do
|
18
18
|
load_separately :foo
|
@@ -22,7 +22,7 @@ describe Chicago::ETL::SchemaSinksAndTransformationsBuilder do
|
|
22
22
|
it "can specify rows are not going to be replaced" do
|
23
23
|
sink_factory.should_receive(:sink).
|
24
24
|
with(:ignore => true, :exclude => []).
|
25
|
-
and_return(
|
25
|
+
and_return(double(:sink).as_null_object)
|
26
26
|
|
27
27
|
described_class.new(db, dimension).build do
|
28
28
|
ignore_present_rows
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Chicago::ETL::SchemaTableSinkFactory do
|
4
|
-
let(:db) {
|
4
|
+
let(:db) { double(:db) }
|
5
5
|
|
6
6
|
let(:dimension) {
|
7
|
-
Chicago::Schema::Builders::DimensionBuilder.new(
|
7
|
+
Chicago::Schema::Builders::DimensionBuilder.new(double(:schema)).build(:foo) do
|
8
8
|
columns do
|
9
9
|
string :bar
|
10
10
|
integer :baz
|
@@ -43,7 +43,7 @@ describe Chicago::ETL::SchemaTableSinkFactory do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
it "builds the key table sink" do
|
46
|
-
sink =
|
46
|
+
sink = double(:sink).as_null_object
|
47
47
|
sink_class.should_receive(:new).
|
48
48
|
with(db, :keys_dimension_foo, [:original_id, :dimension_id], {}).
|
49
49
|
and_return(sink)
|
@@ -52,7 +52,7 @@ describe Chicago::ETL::SchemaTableSinkFactory do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it "builds other explicit key table sinks" do
|
55
|
-
sink =
|
55
|
+
sink = double(:sink).as_null_object
|
56
56
|
sink_class.should_receive(:new).
|
57
57
|
with(db, :keys_foo, [:original_id, :dimension_id], {}).
|
58
58
|
and_return(sink)
|
@@ -62,7 +62,7 @@ describe Chicago::ETL::SchemaTableSinkFactory do
|
|
62
62
|
|
63
63
|
it "builds an error sink" do
|
64
64
|
sink_class.should_receive(:new).
|
65
|
-
with(db, :etl_error_log, [:column, :row_id, :error, :severity, :error_detail], {}).and_return(
|
65
|
+
with(db, :etl_error_log, [:column, :row_id, :error, :severity, :error_detail], {}).and_return(double.as_null_object)
|
66
66
|
|
67
67
|
described_class.new(db, dimension).error_sink
|
68
68
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Chicago::ETL::SequelExtensions::FilterToEtlBatch do
|
4
|
-
let(:batch) {
|
4
|
+
let(:batch) { double(:batch, :id => 42) }
|
5
5
|
|
6
6
|
it "should do nothing to a table without an etl_batch_id column" do
|
7
7
|
TEST_DB.should_receive(:schema).with(:foo).and_return([])
|
data/spec/etl/stage_spec.rb
CHANGED
@@ -5,29 +5,29 @@ describe Chicago::ETL::Stage do
|
|
5
5
|
expect {
|
6
6
|
described_class.new(:test,
|
7
7
|
:source => nil,
|
8
|
-
:sinks => {:default =>
|
8
|
+
:sinks => {:default => double(:sink)})
|
9
9
|
}.to raise_error(ArgumentError)
|
10
10
|
end
|
11
11
|
|
12
12
|
it "requires sinks" do
|
13
13
|
expect {
|
14
14
|
described_class.new(:test,
|
15
|
-
:source =>
|
15
|
+
:source => double(:source),
|
16
16
|
:sinks => nil)
|
17
17
|
}.to raise_error(ArgumentError)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "does not filter the dataset if re-extracting" do
|
21
21
|
stage = described_class.new(:test,
|
22
|
-
:source =>
|
23
|
-
:sinks => {:default =>
|
22
|
+
:source => double(:source),
|
23
|
+
:sinks => {:default => double(:sink)},
|
24
24
|
:filter_strategy => lambda { fail })
|
25
25
|
|
26
|
-
stage.filtered_source(
|
26
|
+
stage.filtered_source(double(:etl_batch), true)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "opens sinks before writing and closes them afterwards" do
|
30
|
-
sink =
|
30
|
+
sink = double(:sink)
|
31
31
|
sink.should_receive(:open)
|
32
32
|
sink.should_receive(:close)
|
33
33
|
|
@@ -35,6 +35,6 @@ describe Chicago::ETL::Stage do
|
|
35
35
|
:source => [],
|
36
36
|
:sinks => {:default => sink})
|
37
37
|
|
38
|
-
stage.execute(
|
38
|
+
stage.execute(double(:etl_batch), true)
|
39
39
|
end
|
40
40
|
end
|
@@ -17,6 +17,6 @@ describe Chicago::ETL::TableBuilder do
|
|
17
17
|
|
18
18
|
it "should do nothing and not raise an error if run more times than necessary" do
|
19
19
|
ETL::TableBuilder.build(TEST_DB)
|
20
|
-
lambda { ETL::TableBuilder.build(TEST_DB) }.should_not raise_error
|
20
|
+
lambda { ETL::TableBuilder.build(TEST_DB) }.should_not raise_error
|
21
21
|
end
|
22
22
|
end
|
@@ -86,6 +86,6 @@ describe Chicago::ETL::Transformation do
|
|
86
86
|
it "can enforce options" do
|
87
87
|
klass = Class.new(described_class) { requires_options :foo }
|
88
88
|
expect { klass.new }.to raise_error(ArgumentError)
|
89
|
-
expect { klass.new(:foo => :bar) }.to_not raise_error
|
89
|
+
expect { klass.new(:foo => :bar) }.to_not raise_error
|
90
90
|
end
|
91
91
|
end
|
@@ -35,7 +35,7 @@ describe Chicago::ETL::Transformations::WrittenRowFilter do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
describe Chicago::ETL::Transformations::AddKey do
|
38
|
-
let(:key_builder) {
|
38
|
+
let(:key_builder) { double(:key_builder, :key => 42) }
|
39
39
|
let(:transform) { described_class.new(:key_builder => key_builder) }
|
40
40
|
|
41
41
|
it "requires a key builder" do
|
metadata
CHANGED
@@ -1,248 +1,225 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: chicago-etl
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Roland Swingler
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
|
18
|
+
date: 2014-01-06 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
17
22
|
none: false
|
18
|
-
requirements:
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 3
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 4
|
30
|
+
- 6
|
31
|
+
version: 0.4.6
|
19
32
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
hash: 3
|
35
|
+
segments:
|
36
|
+
- 0
|
37
|
+
- 4
|
38
|
+
version: "0.4"
|
39
|
+
requirement: *id001
|
22
40
|
type: :runtime
|
23
41
|
prerelease: false
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0.4'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: fastercsv
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
42
|
+
name: chicagowarehouse
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
33
45
|
none: false
|
34
|
-
requirements:
|
35
|
-
- -
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 3
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
version: "0"
|
53
|
+
requirement: *id002
|
38
54
|
type: :runtime
|
39
55
|
prerelease: false
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
- - ! '>='
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: sequel
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
+
name: fastercsv
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
49
59
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 27
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
- 0
|
67
|
+
- 2
|
68
|
+
version: 0.0.2
|
69
|
+
requirement: *id003
|
54
70
|
type: :runtime
|
55
71
|
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
72
|
name: sequel_load_data_infile
|
64
|
-
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
65
75
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirement: *id004
|
70
84
|
type: :runtime
|
71
85
|
prerelease: false
|
72
|
-
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 0.0.2
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
86
|
name: sequel_fast_columns
|
80
|
-
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
81
89
|
none: false
|
82
|
-
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
|
86
|
-
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 7
|
94
|
+
segments:
|
95
|
+
- 2
|
96
|
+
version: "2"
|
97
|
+
requirement: *id005
|
98
|
+
type: :development
|
87
99
|
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
100
|
name: rspec
|
96
|
-
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
97
103
|
none: false
|
98
|
-
requirements:
|
99
|
-
- -
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 3
|
108
|
+
segments:
|
109
|
+
- 0
|
110
|
+
version: "0"
|
111
|
+
requirement: *id006
|
102
112
|
type: :development
|
103
113
|
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ~>
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '2'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
114
|
name: timecop
|
112
|
-
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
113
117
|
none: false
|
114
|
-
requirements:
|
115
|
-
- -
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 3
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
requirement: *id007
|
118
126
|
type: :development
|
119
127
|
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
128
|
name: yard
|
128
|
-
|
129
|
+
- !ruby/object:Gem::Dependency
|
130
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
129
131
|
none: false
|
130
|
-
requirements:
|
131
|
-
- -
|
132
|
-
- !ruby/object:Gem::Version
|
133
|
-
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
requirement: *id008
|
134
140
|
type: :development
|
135
141
|
prerelease: false
|
136
|
-
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
|
-
requirements:
|
139
|
-
- - ! '>='
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: '0'
|
142
|
-
- !ruby/object:Gem::Dependency
|
143
142
|
name: flog
|
144
|
-
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
145
145
|
none: false
|
146
|
-
requirements:
|
147
|
-
- -
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
version: "0"
|
153
|
+
requirement: *id009
|
150
154
|
type: :development
|
151
155
|
prerelease: false
|
152
|
-
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- - ! '>='
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: '0'
|
158
|
-
- !ruby/object:Gem::Dependency
|
159
156
|
name: simplecov
|
160
|
-
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
161
159
|
none: false
|
162
|
-
requirements:
|
163
|
-
- -
|
164
|
-
- !ruby/object:Gem::Version
|
165
|
-
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
hash: 3
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
version: "0"
|
167
|
+
requirement: *id010
|
166
168
|
type: :development
|
167
169
|
prerelease: false
|
168
|
-
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
|
-
requirements:
|
171
|
-
- - ! '>='
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
- !ruby/object:Gem::Dependency
|
175
170
|
name: ZenTest
|
176
|
-
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
version_requirements: &id011 !ruby/object:Gem::Requirement
|
177
173
|
none: false
|
178
|
-
requirements:
|
179
|
-
- -
|
180
|
-
- !ruby/object:Gem::Version
|
181
|
-
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
hash: 3
|
178
|
+
segments:
|
179
|
+
- 0
|
180
|
+
version: "0"
|
181
|
+
requirement: *id011
|
182
182
|
type: :development
|
183
183
|
prerelease: false
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
- - ! '>='
|
188
|
-
- !ruby/object:Gem::Version
|
189
|
-
version: '0'
|
190
|
-
- !ruby/object:Gem::Dependency
|
191
|
-
name: mysql
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
+
name: mysql2
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
version_requirements: &id012 !ruby/object:Gem::Requirement
|
193
187
|
none: false
|
194
|
-
requirements:
|
195
|
-
- -
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
|
188
|
+
requirements:
|
189
|
+
- - ~>
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
hash: 1
|
192
|
+
segments:
|
193
|
+
- 1
|
194
|
+
version: "1"
|
195
|
+
requirement: *id012
|
198
196
|
type: :development
|
199
197
|
prerelease: false
|
200
|
-
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
|
-
requirements:
|
203
|
-
- - '='
|
204
|
-
- !ruby/object:Gem::Version
|
205
|
-
version: 2.8.1
|
206
|
-
- !ruby/object:Gem::Dependency
|
207
198
|
name: bundler
|
208
|
-
|
199
|
+
- !ruby/object:Gem::Dependency
|
200
|
+
version_requirements: &id013 !ruby/object:Gem::Requirement
|
209
201
|
none: false
|
210
|
-
requirements:
|
211
|
-
- -
|
212
|
-
- !ruby/object:Gem::Version
|
213
|
-
|
202
|
+
requirements:
|
203
|
+
- - ">="
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
hash: 3
|
206
|
+
segments:
|
207
|
+
- 0
|
208
|
+
version: "0"
|
209
|
+
requirement: *id013
|
214
210
|
type: :development
|
215
211
|
prerelease: false
|
216
|
-
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
|
-
requirements:
|
219
|
-
- - ~>
|
220
|
-
- !ruby/object:Gem::Version
|
221
|
-
version: '1'
|
222
|
-
- !ruby/object:Gem::Dependency
|
223
212
|
name: jeweler
|
224
|
-
requirement: !ruby/object:Gem::Requirement
|
225
|
-
none: false
|
226
|
-
requirements:
|
227
|
-
- - ! '>='
|
228
|
-
- !ruby/object:Gem::Version
|
229
|
-
version: '0'
|
230
|
-
type: :development
|
231
|
-
prerelease: false
|
232
|
-
version_requirements: !ruby/object:Gem::Requirement
|
233
|
-
none: false
|
234
|
-
requirements:
|
235
|
-
- - ! '>='
|
236
|
-
- !ruby/object:Gem::Version
|
237
|
-
version: '0'
|
238
213
|
description: ETL tools for Chicago
|
239
214
|
email: roland.swingler@gmail.com
|
240
215
|
executables: []
|
216
|
+
|
241
217
|
extensions: []
|
242
|
-
|
218
|
+
|
219
|
+
extra_rdoc_files:
|
243
220
|
- LICENSE.txt
|
244
221
|
- README.rdoc
|
245
|
-
files:
|
222
|
+
files:
|
246
223
|
- .document
|
247
224
|
- .rspec
|
248
225
|
- Gemfile
|
@@ -329,31 +306,37 @@ files:
|
|
329
306
|
- spec/etl/transformations_spec.rb
|
330
307
|
- spec/spec_helper.rb
|
331
308
|
homepage: http://github.com/notonthehighstreet/chicago-etl
|
332
|
-
licenses:
|
309
|
+
licenses:
|
333
310
|
- MIT
|
334
311
|
post_install_message:
|
335
312
|
rdoc_options: []
|
336
|
-
|
313
|
+
|
314
|
+
require_paths:
|
337
315
|
- lib
|
338
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
316
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
339
317
|
none: false
|
340
|
-
requirements:
|
341
|
-
- -
|
342
|
-
- !ruby/object:Gem::Version
|
343
|
-
|
344
|
-
segments:
|
318
|
+
requirements:
|
319
|
+
- - ">="
|
320
|
+
- !ruby/object:Gem::Version
|
321
|
+
hash: 3
|
322
|
+
segments:
|
345
323
|
- 0
|
346
|
-
|
347
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
324
|
+
version: "0"
|
325
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
348
326
|
none: false
|
349
|
-
requirements:
|
350
|
-
- -
|
351
|
-
- !ruby/object:Gem::Version
|
352
|
-
|
327
|
+
requirements:
|
328
|
+
- - ">="
|
329
|
+
- !ruby/object:Gem::Version
|
330
|
+
hash: 3
|
331
|
+
segments:
|
332
|
+
- 0
|
333
|
+
version: "0"
|
353
334
|
requirements: []
|
335
|
+
|
354
336
|
rubyforge_project:
|
355
337
|
rubygems_version: 1.8.25
|
356
338
|
signing_key:
|
357
339
|
specification_version: 3
|
358
340
|
summary: Chicago ETL
|
359
341
|
test_files: []
|
342
|
+
|