chicago-etl 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTdkYTQ0NmIxNGQ0ODU2NTAzMWU4NThjYzhjZWMwOTVjNmU4NjRhNg==
5
+ data.tar.gz: !binary |-
6
+ NDA3N2Y0Y2Y3ZTk1ZGQ2Mzg0NDdkMjA4YzRjODMwMDlmZTRjOWZkMw==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MTJiYzg5MGFlMjcwNTBlOTc5N2RkOGM3ZmVmMzIwNTMyN2FmYWQ2ODgwMmYz
10
+ YTI2MGYwZGQ5ZGNkZWU0MzNlOWNmNTlhODg0NTRkNzU5NDhlYTZjNzcxOWRi
11
+ ODE3NGNiNWZjMjg3NzJkNzc4OWRhYThlOWUwMjBkNzkzMmYwMWQ=
12
+ data.tar.gz: !binary |-
13
+ MDg3ZDQ0ZjhjZTYyZjMzYmFhNWUwOWJlNTAzMzBkOTdjNGFlMzU2NTZkMzA5
14
+ ZjcwNDBmYTg0YTUyZDE5MThhY2IxYzQwYzM1NzE1MzcwYWEyM2FhYTllYWU3
15
+ OTkwZmJlMDEwMTQzNjhjMmNjMTAxYWRjYmY3ZjNjZGY5ZDIwYjg=
data/Gemfile CHANGED
@@ -13,7 +13,6 @@ group :development do
13
13
  gem "yard"
14
14
  gem "flog"
15
15
  gem "simplecov", :platforms => :mri_19, :require => false
16
- gem "ZenTest"
17
16
  gem "mysql2"
18
17
  gem "bundler", "~> 1"
19
18
  gem "jeweler"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.4
1
+ 0.2.5
@@ -2,14 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: chicago-etl 0.2.5 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "chicago-etl"
8
- s.version = "0.2.4"
9
+ s.version = "0.2.5"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Roland Swingler"]
12
- s.date = "2014-01-07"
14
+ s.date = "2014-08-07"
13
15
  s.description = "ETL tools for Chicago"
14
16
  s.email = "roland.swingler@gmail.com"
15
17
  s.extra_rdoc_files = [
@@ -45,6 +47,7 @@ Gem::Specification.new do |s|
45
47
  "lib/chicago/etl/null_sink.rb",
46
48
  "lib/chicago/etl/pipeline.rb",
47
49
  "lib/chicago/etl/pipeline_endpoint.rb",
50
+ "lib/chicago/etl/row_transformation_stage.rb",
48
51
  "lib/chicago/etl/schema_sinks_and_transformations_builder.rb",
49
52
  "lib/chicago/etl/schema_table_sink_factory.rb",
50
53
  "lib/chicago/etl/schema_table_stage_builder.rb",
@@ -85,6 +88,7 @@ Gem::Specification.new do |s|
85
88
  "spec/etl/mysql_file_sink_spec.rb",
86
89
  "spec/etl/mysql_integration_spec.rb",
87
90
  "spec/etl/pipeline_stage_builder_spec.rb",
91
+ "spec/etl/row_transformation_stage_spec.rb",
88
92
  "spec/etl/schema_table_sink_factory_spec.rb",
89
93
  "spec/etl/screens/invalid_element_spec.rb",
90
94
  "spec/etl/screens/missing_value_spec.rb",
@@ -92,7 +96,6 @@ Gem::Specification.new do |s|
92
96
  "spec/etl/sequel/dependant_tables_spec.rb",
93
97
  "spec/etl/sequel/filter_to_etl_batch_spec.rb",
94
98
  "spec/etl/stage_name_spec.rb",
95
- "spec/etl/stage_spec.rb",
96
99
  "spec/etl/table_builder_spec.rb",
97
100
  "spec/etl/task_spec.rb",
98
101
  "spec/etl/transformation_chain_spec.rb",
@@ -105,12 +108,11 @@ Gem::Specification.new do |s|
105
108
  ]
106
109
  s.homepage = "http://github.com/notonthehighstreet/chicago-etl"
107
110
  s.licenses = ["MIT"]
108
- s.require_paths = ["lib"]
109
- s.rubygems_version = "1.8.25"
111
+ s.rubygems_version = "2.2.1"
110
112
  s.summary = "Chicago ETL"
111
113
 
112
114
  if s.respond_to? :specification_version then
113
- s.specification_version = 3
115
+ s.specification_version = 4
114
116
 
115
117
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
116
118
  s.add_runtime_dependency(%q<chicagowarehouse>, [">= 0.4.6", "~> 0.4"])
@@ -122,7 +124,6 @@ Gem::Specification.new do |s|
122
124
  s.add_development_dependency(%q<yard>, [">= 0"])
123
125
  s.add_development_dependency(%q<flog>, [">= 0"])
124
126
  s.add_development_dependency(%q<simplecov>, [">= 0"])
125
- s.add_development_dependency(%q<ZenTest>, [">= 0"])
126
127
  s.add_development_dependency(%q<mysql2>, [">= 0"])
127
128
  s.add_development_dependency(%q<bundler>, ["~> 1"])
128
129
  s.add_development_dependency(%q<jeweler>, [">= 0"])
@@ -136,7 +137,6 @@ Gem::Specification.new do |s|
136
137
  s.add_dependency(%q<yard>, [">= 0"])
137
138
  s.add_dependency(%q<flog>, [">= 0"])
138
139
  s.add_dependency(%q<simplecov>, [">= 0"])
139
- s.add_dependency(%q<ZenTest>, [">= 0"])
140
140
  s.add_dependency(%q<mysql2>, [">= 0"])
141
141
  s.add_dependency(%q<bundler>, ["~> 1"])
142
142
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -151,7 +151,6 @@ Gem::Specification.new do |s|
151
151
  s.add_dependency(%q<yard>, [">= 0"])
152
152
  s.add_dependency(%q<flog>, [">= 0"])
153
153
  s.add_dependency(%q<simplecov>, [">= 0"])
154
- s.add_dependency(%q<ZenTest>, [">= 0"])
155
154
  s.add_dependency(%q<mysql2>, [">= 0"])
156
155
  s.add_dependency(%q<bundler>, ["~> 1"])
157
156
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -28,6 +28,7 @@ require 'chicago/etl/transformations'
28
28
  require 'chicago/etl/load_dataset_builder'
29
29
  require 'chicago/etl/dataset_builder'
30
30
  require 'chicago/etl/stage'
31
+ require 'chicago/etl/row_transformation_stage'
31
32
  require 'chicago/etl/stage_builder'
32
33
  require 'chicago/etl/schema_sinks_and_transformations_builder'
33
34
  require 'chicago/etl/pipeline'
@@ -6,40 +6,37 @@ module Chicago
6
6
  attr_reader :stages
7
7
 
8
8
  # Creates a pipeline for a Schema.
9
- def initialize(db, schema)
9
+ def initialize(db, schema, &block)
10
10
  @schema, @db = schema, db
11
11
  @stages = Chicago::Schema::NamedElementCollection.new
12
+ @builder_class_factory = block || lambda {|name, options| StageBuilder }
12
13
  end
13
14
 
14
15
  # Defines a generic stage in the pipeline.
15
16
  def define_stage(*args, &block)
16
17
  options = args.last.kind_of?(Hash) ? args.pop : {}
17
18
 
18
- name = StageName.new(args)
19
-
20
- if name =~ [:load, :dimensions]
21
- @stages << build_dimension_load_stage(name, options, &block)
22
- elsif name =~ [:load, :facts]
23
- @stages << build_fact_load_stage(name, options, &block)
19
+ if args.last.kind_of?(Stage)
20
+ stage = args.pop
21
+ name = StageName.new(args)
24
22
  else
25
- @stages << StageBuilder.new(@db).build(name, &block)
23
+ name = StageName.new(args)
24
+ stage = build_stage(name, options, &block)
26
25
  end
27
- end
28
26
 
29
- def build_stage(name, schema_table, &block)
30
- SchemaTableStageBuilder.new(@db, schema_table).build(name, &block)
31
- end
27
+ stage.name = StageName.new(args)
32
28
 
33
- private
29
+ @stages << stage
30
+ end
34
31
 
35
- def build_dimension_load_stage(name, options, &block)
36
- dimension_name = options[:dimension] || name.name
37
- build_stage(name, @schema.dimension(dimension_name), &block)
32
+ def build_stage(name, options, &block)
33
+ builder(name, options).build(name, options, &block)
38
34
  end
39
35
 
40
- def build_fact_load_stage(name, options, &block)
41
- fact_name = options[:fact] || name.name
42
- build_stage(name, @schema.fact(fact_name), &block)
36
+ private
37
+
38
+ def builder(name, options)
39
+ @builder_class_factory.call(name, options).new(@db, @schema)
43
40
  end
44
41
  end
45
42
  end
@@ -0,0 +1,78 @@
1
+ module Chicago
2
+ module ETL
3
+ # A Stage that passes source rows through a transformation chain.
4
+ #
5
+ # All rows are read into Ruby and then written to sinks after
6
+ # passing through 0 or more Transformations.
7
+ class RowTransformationStage < Stage
8
+ # Returns the source for this stage.
9
+ attr_reader :source
10
+
11
+ def initialize(options={})
12
+ super
13
+ @source = options[:source]
14
+ @sinks = options[:sinks]
15
+ @transformations = options[:transformations] || []
16
+ @filter_strategy = options[:filter_strategy] || lambda {|s, _| s }
17
+
18
+ validate_arguments
19
+ end
20
+
21
+ # Executes this stage in the context of an ETL::Batch
22
+ def perform_execution(etl_batch)
23
+ transform_and_load filtered_source(etl_batch)
24
+ end
25
+
26
+ # Returns the named sink, if it exists
27
+ def sink(name)
28
+ @sinks[name.to_sym]
29
+ end
30
+
31
+ def sinks
32
+ @sinks.values
33
+ end
34
+
35
+ # @api private
36
+ def filtered_source(etl_batch)
37
+ filtered_dataset = etl_batch.reextracting? ? source :
38
+ @filter_strategy.call(source, etl_batch)
39
+
40
+ DatasetSource.new(filtered_dataset)
41
+ end
42
+
43
+ private
44
+
45
+ def transform_and_load(source)
46
+ sinks.each(&:open)
47
+ pipe_rows_to_sinks_from(source)
48
+ sinks.each(&:close)
49
+ end
50
+
51
+ def pipe_rows_to_sinks_from(source)
52
+ source.each do |row|
53
+ transformation_chain.process(row).each {|row| process_row(row) }
54
+ end
55
+ transformation_chain.flush.each {|row| process_row(row) }
56
+ end
57
+
58
+ def transformation_chain
59
+ @transformation_chain ||= TransformationChain.new(*@transformations)
60
+ end
61
+
62
+ def process_row(row)
63
+ stream = row.delete(:_stream) || :default
64
+ @sinks[stream] << row
65
+ end
66
+
67
+ def validate_arguments
68
+ if @source.nil?
69
+ raise ArgumentError, "Stage #{@name} requires a source"
70
+ end
71
+
72
+ if @sinks.blank?
73
+ raise ArgumentError, "Stage #{@name} requires at least one sink"
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -7,11 +7,11 @@ module Chicago
7
7
  # Clients shouldn't need to instantiate this directly, but instead
8
8
  # call the protected methods in the context of defining a Pipeline
9
9
  class SchemaTableStageBuilder < StageBuilder
10
- # @api private
11
- def initialize(db, schema_table)
12
- super(db)
10
+ def build(name, options, &block)
13
11
  @wrapped_builder = SchemaSinksAndTransformationsBuilder.
14
- new(@db, schema_table)
12
+ new(@db, schema_table(name, options))
13
+
14
+ super
15
15
  end
16
16
 
17
17
  protected
@@ -47,5 +47,19 @@ module Chicago
47
47
  }
48
48
  end
49
49
  end
50
+
51
+ class LoadDimensionStageBuilder < SchemaTableStageBuilder
52
+ def schema_table(name, options)
53
+ dimension_name = options[:dimension] || name.name
54
+ @schema.dimension(dimension_name)
55
+ end
56
+ end
57
+
58
+ class LoadFactStageBuilder < SchemaTableStageBuilder
59
+ def schema_table(name, options)
60
+ fact_name = options[:dimension] || name.name
61
+ @schema.fact(fact_name)
62
+ end
63
+ end
50
64
  end
51
65
  end
@@ -1,30 +1,24 @@
1
1
  module Chicago
2
2
  module ETL
3
- # A Stage in the ETL pipeline.
3
+ # A Stage in the ETL Pipeline.
4
4
  #
5
- # A Stage wires together a Source, 0 or more Transformations and 1
6
- # or more Sinks.
5
+ # Stage subclasses vary in how they perform their execution - some
6
+ # stages may pipe rows from a source to sinks, others may perform
7
+ # direct in-database updates.
8
+ #
9
+ # @abstract
7
10
  class Stage
8
- # Returns the source for this stage.
9
- attr_reader :source
10
-
11
- # Returns the name of this stage.
12
- attr_reader :name
11
+ # The name of this stage.
12
+ attr_accessor :name
13
13
 
14
- def initialize(name, options={})
15
- @name = name
16
- @source = options[:source]
17
- @sinks = options[:sinks]
18
- @transformations = options[:transformations] || []
19
- @filter_strategy = options[:filter_strategy] || lambda {|s, _| s }
20
- @pre_execution_strategies = options[:pre_execution_strategies] || []
14
+ def initialize(options={})
21
15
  @executable = options.has_key?(:executable) ? options[:executable] : true
22
-
23
- validate_arguments
16
+ @pre_execution_strategies = options[:pre_execution_strategies] || []
24
17
  end
25
-
18
+
26
19
  # Returns the unqualified name of this stage.
27
20
  def task_name
21
+ raise "This Stage has not been bound to a name" if @name.nil?
28
22
  name.name
29
23
  end
30
24
 
@@ -32,28 +26,25 @@ module Chicago
32
26
  def executable?
33
27
  @executable
34
28
  end
35
-
36
- # Executes this stage in the context of an ETL::Batch
29
+
30
+ # Executes this stage in the context of an ETL::Batch.
31
+ #
32
+ # This should not be overridden by subclasses; perform_execution
33
+ # should be changed instead.
37
34
  def execute(etl_batch)
38
35
  prepare_stage(etl_batch)
39
- transform_and_load filtered_source(etl_batch)
40
- end
41
-
42
- # Returns the named sink, if it exists
43
- def sink(name)
44
- @sinks[name.to_sym]
36
+ perform_execution(etl_batch)
45
37
  end
46
38
 
47
- def sinks
48
- @sinks.values
49
- end
50
-
51
- # @api private
52
- def filtered_source(etl_batch)
53
- filtered_dataset = etl_batch.reextracting? ? source :
54
- @filter_strategy.call(source, etl_batch)
39
+ protected
55
40
 
56
- DatasetSource.new(filtered_dataset)
41
+ # Does the actual work involved in executing this stage.
42
+ #
43
+ # This should be overridden by subclasses.
44
+ #
45
+ # @abstract
46
+ def perform_execution(etl_batch)
47
+ raise "perform_execution method has not been overridden."
57
48
  end
58
49
 
59
50
  private
@@ -63,38 +54,6 @@ module Chicago
63
54
  strategy.call(self, etl_batch)
64
55
  end
65
56
  end
66
-
67
- def transform_and_load(source)
68
- sinks.each(&:open)
69
- pipe_rows_to_sinks_from(source)
70
- sinks.each(&:close)
71
- end
72
-
73
- def pipe_rows_to_sinks_from(source)
74
- source.each do |row|
75
- transformation_chain.process(row).each {|row| process_row(row) }
76
- end
77
- transformation_chain.flush.each {|row| process_row(row) }
78
- end
79
-
80
- def transformation_chain
81
- @transformation_chain ||= TransformationChain.new(*@transformations)
82
- end
83
-
84
- def process_row(row)
85
- stream = row.delete(:_stream) || :default
86
- @sinks[stream] << row
87
- end
88
-
89
- def validate_arguments
90
- if @source.nil?
91
- raise ArgumentError, "Stage #{@name} requires a source"
92
- end
93
-
94
- if @sinks.blank?
95
- raise ArgumentError, "Stage #{@name} requires at least one sink"
96
- end
97
- end
98
57
  end
99
58
  end
100
59
  end
@@ -1,24 +1,25 @@
1
1
  module Chicago
2
2
  module ETL
3
3
  class StageBuilder
4
- def initialize(db)
4
+ def initialize(db, schema)
5
5
  @db = db
6
+ @schema = schema
6
7
  end
7
8
 
8
- def build(name, &block)
9
+ def build(name, options, &block)
9
10
  @pre_execution_strategies = []
10
11
  @executable = true
11
12
 
12
13
  instance_eval &block
13
14
  set_default_stage_values
14
15
 
15
- Stage.new(name,
16
- :source => @dataset,
17
- :sinks => @sinks,
18
- :transformations => @transformations,
19
- :filter_strategy => @filter_strategy,
20
- :pre_execution_strategies => @pre_execution_strategies,
21
- :executable => @executable)
16
+ RowTransformationStage.
17
+ new(:source => @dataset,
18
+ :sinks => @sinks,
19
+ :transformations => @transformations,
20
+ :filter_strategy => @filter_strategy,
21
+ :pre_execution_strategies => @pre_execution_strategies,
22
+ :executable => @executable)
22
23
  end
23
24
 
24
25
  protected
@@ -15,8 +15,12 @@ describe "creating and running a dimension stage" do
15
15
  schema
16
16
  }
17
17
 
18
- let(:pipeline) { Chicago::ETL::Pipeline.new(db, schema)}
19
-
18
+ let(:pipeline) {
19
+ Chicago::ETL::Pipeline.new(db, schema) do |name, options|
20
+ Chicago::ETL::LoadDimensionStageBuilder
21
+ end
22
+ }
23
+
20
24
  it "glues the source, transformations, and sink correctly" do
21
25
  pipeline.define_stage(:load, :dimensions, :test) do
22
26
  source do
@@ -56,13 +56,13 @@ describe "Mysql -> Mysql through transformation chain" do
56
56
  new(TEST_DB, :destination, [:id, :foo, :bin])
57
57
  sink_2 = Chicago::ETL::ArraySink.new([:id, :foo, :bin])
58
58
 
59
- stage = Chicago::ETL::Stage.new(:test,
60
- :source => source,
61
- :transformations => transformations,
62
- :sinks => {
63
- :default => sink_1,
64
- :other => sink_2
65
- })
59
+ stage = Chicago::ETL::RowTransformationStage.
60
+ new(:source => source,
61
+ :transformations => transformations,
62
+ :sinks => {
63
+ :default => sink_1,
64
+ :other => sink_2
65
+ })
66
66
 
67
67
  stage.execute(double(:etl_batch, :reextracting? => true))
68
68
 
@@ -1,27 +1,24 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Chicago::ETL::Stage do
3
+ describe Chicago::ETL::RowTransformationStage do
4
4
  let(:etl_batch) { double(:etl_batch, :reextracting? => true) }
5
5
 
6
6
  it "requires a source" do
7
7
  expect {
8
- described_class.new(:test,
9
- :source => nil,
8
+ described_class.new(:source => nil,
10
9
  :sinks => {:default => double(:sink)})
11
10
  }.to raise_error(ArgumentError)
12
11
  end
13
12
 
14
13
  it "requires sinks" do
15
14
  expect {
16
- described_class.new(:test,
17
- :source => double(:source),
15
+ described_class.new(:source => double(:source),
18
16
  :sinks => nil)
19
17
  }.to raise_error(ArgumentError)
20
18
  end
21
19
 
22
20
  it "does not filter the dataset if re-extracting" do
23
- stage = described_class.new(:test,
24
- :source => double(:source),
21
+ stage = described_class.new(:source => double(:source),
25
22
  :sinks => {:default => double(:sink)},
26
23
  :filter_strategy => lambda { fail })
27
24
 
@@ -33,8 +30,7 @@ describe Chicago::ETL::Stage do
33
30
  sink.should_receive(:open)
34
31
  sink.should_receive(:close)
35
32
 
36
- stage = described_class.new(:test,
37
- :source => [],
33
+ stage = described_class.new(:source => [],
38
34
  :sinks => {:default => sink})
39
35
 
40
36
  stage.execute(etl_batch)
metadata CHANGED
@@ -1,225 +1,197 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: chicago-etl
3
- version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 4
10
- version: 0.2.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.5
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Roland Swingler
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2014-01-07 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
- - 6
11
+ date: 2014-08-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chicagowarehouse
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
31
19
  version: 0.4.6
32
20
  - - ~>
33
- - !ruby/object:Gem::Version
34
- hash: 3
35
- segments:
36
- - 0
37
- - 4
38
- version: "0.4"
39
- requirement: *id001
40
- type: :runtime
41
- prerelease: false
42
- name: chicagowarehouse
43
- - !ruby/object:Gem::Dependency
44
- version_requirements: &id002 !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- hash: 3
50
- segments:
51
- - 0
52
- version: "0"
53
- requirement: *id002
21
+ - !ruby/object:Gem::Version
22
+ version: '0.4'
54
23
  type: :runtime
55
24
  prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.4.6
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '0.4'
33
+ - !ruby/object:Gem::Dependency
56
34
  name: fastercsv
57
- - !ruby/object:Gem::Dependency
58
- version_requirements: &id003 !ruby/object:Gem::Requirement
59
- none: false
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
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
70
40
  type: :runtime
71
41
  prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
72
48
  name: sequel_load_data_infile
73
- - !ruby/object:Gem::Dependency
74
- version_requirements: &id004 !ruby/object:Gem::Requirement
75
- none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
83
- requirement: *id004
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.0.2
84
54
  type: :runtime
85
55
  prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: 0.0.2
61
+ - !ruby/object:Gem::Dependency
86
62
  name: sequel_fast_columns
87
- - !ruby/object:Gem::Dependency
88
- version_requirements: &id005 !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- hash: 7
94
- segments:
95
- - 2
96
- version: "2"
97
- requirement: *id005
98
- type: :development
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
99
69
  prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
100
76
  name: rspec
101
- - !ruby/object:Gem::Dependency
102
- version_requirements: &id006 !ruby/object:Gem::Requirement
103
- none: false
104
- requirements:
105
- - - ">="
106
- - !ruby/object:Gem::Version
107
- hash: 3
108
- segments:
109
- - 0
110
- version: "0"
111
- requirement: *id006
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: '2'
112
82
  type: :development
113
83
  prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '2'
89
+ - !ruby/object:Gem::Dependency
114
90
  name: timecop
115
- - !ruby/object:Gem::Dependency
116
- version_requirements: &id007 !ruby/object:Gem::Requirement
117
- none: false
118
- requirements:
119
- - - ">="
120
- - !ruby/object:Gem::Version
121
- hash: 3
122
- segments:
123
- - 0
124
- version: "0"
125
- requirement: *id007
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
126
96
  type: :development
127
97
  prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
128
104
  name: yard
129
- - !ruby/object:Gem::Dependency
130
- version_requirements: &id008 !ruby/object:Gem::Requirement
131
- none: false
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
137
- - 0
138
- version: "0"
139
- requirement: *id008
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
140
110
  type: :development
141
111
  prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ! '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
142
118
  name: flog
143
- - !ruby/object:Gem::Dependency
144
- version_requirements: &id009 !ruby/object:Gem::Requirement
145
- none: false
146
- requirements:
147
- - - ">="
148
- - !ruby/object:Gem::Version
149
- hash: 3
150
- segments:
151
- - 0
152
- version: "0"
153
- requirement: *id009
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
154
124
  type: :development
155
125
  prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
156
132
  name: simplecov
157
- - !ruby/object:Gem::Dependency
158
- version_requirements: &id010 !ruby/object:Gem::Requirement
159
- none: false
160
- requirements:
161
- - - ">="
162
- - !ruby/object:Gem::Version
163
- hash: 3
164
- segments:
165
- - 0
166
- version: "0"
167
- requirement: *id010
168
- type: :development
169
- prerelease: false
170
- name: ZenTest
171
- - !ruby/object:Gem::Dependency
172
- version_requirements: &id011 !ruby/object:Gem::Requirement
173
- none: false
174
- requirements:
175
- - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: 3
178
- segments:
179
- - 0
180
- version: "0"
181
- requirement: *id011
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ! '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
182
138
  type: :development
183
139
  prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
184
146
  name: mysql2
185
- - !ruby/object:Gem::Dependency
186
- version_requirements: &id012 !ruby/object:Gem::Requirement
187
- none: false
188
- requirements:
189
- - - ~>
190
- - !ruby/object:Gem::Version
191
- hash: 1
192
- segments:
193
- - 1
194
- version: "1"
195
- requirement: *id012
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ! '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
196
152
  type: :development
197
153
  prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
198
160
  name: bundler
199
- - !ruby/object:Gem::Dependency
200
- version_requirements: &id013 !ruby/object:Gem::Requirement
201
- none: false
202
- requirements:
203
- - - ">="
204
- - !ruby/object:Gem::Version
205
- hash: 3
206
- segments:
207
- - 0
208
- version: "0"
209
- requirement: *id013
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ~>
164
+ - !ruby/object:Gem::Version
165
+ version: '1'
210
166
  type: :development
211
167
  prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ version: '1'
173
+ - !ruby/object:Gem::Dependency
212
174
  name: jeweler
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ! '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ! '>='
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
213
187
  description: ETL tools for Chicago
214
188
  email: roland.swingler@gmail.com
215
189
  executables: []
216
-
217
190
  extensions: []
218
-
219
- extra_rdoc_files:
191
+ extra_rdoc_files:
220
192
  - LICENSE.txt
221
193
  - README.rdoc
222
- files:
194
+ files:
223
195
  - .document
224
196
  - .rspec
225
197
  - Gemfile
@@ -248,6 +220,7 @@ files:
248
220
  - lib/chicago/etl/null_sink.rb
249
221
  - lib/chicago/etl/pipeline.rb
250
222
  - lib/chicago/etl/pipeline_endpoint.rb
223
+ - lib/chicago/etl/row_transformation_stage.rb
251
224
  - lib/chicago/etl/schema_sinks_and_transformations_builder.rb
252
225
  - lib/chicago/etl/schema_table_sink_factory.rb
253
226
  - lib/chicago/etl/schema_table_stage_builder.rb
@@ -288,6 +261,7 @@ files:
288
261
  - spec/etl/mysql_file_sink_spec.rb
289
262
  - spec/etl/mysql_integration_spec.rb
290
263
  - spec/etl/pipeline_stage_builder_spec.rb
264
+ - spec/etl/row_transformation_stage_spec.rb
291
265
  - spec/etl/schema_table_sink_factory_spec.rb
292
266
  - spec/etl/screens/invalid_element_spec.rb
293
267
  - spec/etl/screens/missing_value_spec.rb
@@ -295,7 +269,6 @@ files:
295
269
  - spec/etl/sequel/dependant_tables_spec.rb
296
270
  - spec/etl/sequel/filter_to_etl_batch_spec.rb
297
271
  - spec/etl/stage_name_spec.rb
298
- - spec/etl/stage_spec.rb
299
272
  - spec/etl/table_builder_spec.rb
300
273
  - spec/etl/task_spec.rb
301
274
  - spec/etl/transformation_chain_spec.rb
@@ -306,37 +279,28 @@ files:
306
279
  - spec/etl/transformations_spec.rb
307
280
  - spec/spec_helper.rb
308
281
  homepage: http://github.com/notonthehighstreet/chicago-etl
309
- licenses:
282
+ licenses:
310
283
  - MIT
284
+ metadata: {}
311
285
  post_install_message:
312
286
  rdoc_options: []
313
-
314
- require_paths:
287
+ require_paths:
315
288
  - lib
316
- required_ruby_version: !ruby/object:Gem::Requirement
317
- none: false
318
- requirements:
319
- - - ">="
320
- - !ruby/object:Gem::Version
321
- hash: 3
322
- segments:
323
- - 0
324
- version: "0"
325
- required_rubygems_version: !ruby/object:Gem::Requirement
326
- none: false
327
- requirements:
328
- - - ">="
329
- - !ruby/object:Gem::Version
330
- hash: 3
331
- segments:
332
- - 0
333
- version: "0"
289
+ required_ruby_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ! '>='
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ! '>='
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
334
299
  requirements: []
335
-
336
300
  rubyforge_project:
337
- rubygems_version: 1.8.25
301
+ rubygems_version: 2.2.1
338
302
  signing_key:
339
- specification_version: 3
303
+ specification_version: 4
340
304
  summary: Chicago ETL
341
305
  test_files: []
342
-
306
+ has_rdoc: