chicago-etl 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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 "mysql", "2.8.1"
17
+ gem "mysql2"
19
18
  gem "bundler", "~> 1"
20
19
  gem "jeweler"
21
20
  end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.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.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 = "2013-11-26"
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<mysql>, ["= 2.8.1"])
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<mysql>, ["= 2.8.1"])
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<mysql>, ["= 2.8.1"])
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
@@ -17,7 +17,7 @@ module Chicago
17
17
  protected
18
18
 
19
19
  def key_field(field, name)
20
- :if[{field => nil}, 1, field].as(name)
20
+ :if.sql_function({field => nil}, 1, field).as(name)
21
21
  end
22
22
 
23
23
  # Returns a column for use in a Sequel::Dataset#select method to
@@ -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
- key_table = staging_db[table.key_table_name]
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 = (opts[:from] + (opts[:join] || [])).
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 = conditions.any? ? filter(conditions.inject {|a,b| a | b}) : dup
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
@@ -1,4 +1,4 @@
1
- adapter: mysql
1
+ adapter: mysql2
2
2
  username: root
3
3
  socket: /tmp/mysql.sock
4
4
  database: chicago_test_db
@@ -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(Sequel::DatabaseError)
85
+ lambda { batch.perform_task(:transform, "Test") {} }.should_not raise_error
86
86
  end
87
87
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Chicago::ETL::DatasetSource do
4
- let(:dataset) { stub(:dataset) }
4
+ let(:dataset) { double(:dataset) }
5
5
 
6
6
  it "should delegtate each to the dataset" do
7
7
  dataset.should_receive(:each)
@@ -7,11 +7,11 @@ describe "Chicago::ETL Execution method" do
7
7
  end
8
8
  end
9
9
 
10
- let(:logger) { mock(:logger).as_null_object }
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 = stub(:stage, :executable? => false, :name => "test")
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 = stub(:stage, :executable? => true, :name => "test")
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 = stub(:staging_database).as_null_object
41
- @db.stub(:[]).and_return(stub(:max => nil, :select_hash => {}))
42
- @sink = stub(:sink).as_null_object
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(stub(:factory, :key_sink => @sink))
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(stub(:max => 2, :select_hash => {}))
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 = stub(:dataset, :max => 1, :select_hash => {40 => 1})
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 = stub(:dataset, :max => 1).as_null_object
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(stub(:max => 100, :select_hash => {}))
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
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Chicago::ETL::LoadDatasetBuilder do
4
- let(:db) { stub(:database).as_null_object }
4
+ let(:db) { double(:database).as_null_object }
5
5
 
6
6
  before :each do
7
7
  db.stub(:[]).with(:original_users).
@@ -2,9 +2,9 @@ require 'spec_helper'
2
2
  require 'sequel'
3
3
 
4
4
  describe Chicago::ETL::MysqlFileSink do
5
- let(:dataset) { mock(:dataset).as_null_object }
6
- let(:db) { mock(:db, :[] => dataset, :schema => []) }
7
- let(:csv) { mock(: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(stub(:etl_batch), true)
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) { stub(:dimension).as_null_object }
5
- let(:db) { stub(:db).as_null_object }
6
- let(:sink_factory) { stub(:sink_factory).as_null_object }
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(stub(:sink).as_null_object)
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(stub(:sink).as_null_object)
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) { stub(:db) }
4
+ let(:db) { double(:db) }
5
5
 
6
6
  let(:dimension) {
7
- Chicago::Schema::Builders::DimensionBuilder.new(stub(:schema)).build(:foo) do
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 = stub(:sink).as_null_object
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 = stub(:sink).as_null_object
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(stub.as_null_object)
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) { stub(:batch, :id => 42) }
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([])
@@ -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 => stub(:sink)})
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 => stub(: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 => stub(:source),
23
- :sinks => {:default => stub(:sink)},
22
+ :source => double(:source),
23
+ :sinks => {:default => double(:sink)},
24
24
  :filter_strategy => lambda { fail })
25
25
 
26
- stage.filtered_source(stub(:etl_batch), true)
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 = mock(: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(stub(:etl_batch), true)
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(Sequel::DatabaseError)
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(ArgumentError)
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) { stub(:key_builder, :key => 42) }
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
- version: 0.2.2
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
- date: 2013-11-26 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: chicagowarehouse
16
- requirement: !ruby/object:Gem::Requirement
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
- version: '0.4'
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
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
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
- version: '0'
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
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
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
- version: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: 0.0.2
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
86
- type: :runtime
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '2'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '0'
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
- version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
- requirements:
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
- version: 2.8.1
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
- requirement: !ruby/object:Gem::Requirement
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
- version: '1'
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
- extra_rdoc_files:
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
- require_paths:
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
- version: '0'
344
- segments:
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ hash: 3
322
+ segments:
345
323
  - 0
346
- hash: -2294158408277347233
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
- version: '0'
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
+