beetle_etl 1.0.1 → 2.0.0

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/.byebug_history +8 -0
  3. data/.travis.yml +6 -1
  4. data/README.md +31 -9
  5. data/beetle_etl.gemspec +1 -1
  6. data/lib/beetle_etl.rb +7 -49
  7. data/lib/beetle_etl/configuration.rb +39 -0
  8. data/lib/beetle_etl/dsl/dsl.rb +6 -2
  9. data/lib/beetle_etl/dsl/transformation.rb +2 -2
  10. data/lib/beetle_etl/dsl/transformation_loader.rb +4 -3
  11. data/lib/beetle_etl/import.rb +15 -11
  12. data/lib/beetle_etl/naming.rb +10 -20
  13. data/lib/beetle_etl/reporter.rb +3 -2
  14. data/lib/beetle_etl/step_runner/async_step_runner.rb +6 -4
  15. data/lib/beetle_etl/steps/create_stage.rb +2 -2
  16. data/lib/beetle_etl/steps/load.rb +2 -2
  17. data/lib/beetle_etl/steps/map_relations.rb +2 -2
  18. data/lib/beetle_etl/steps/step.rb +23 -4
  19. data/lib/beetle_etl/steps/transform.rb +2 -2
  20. data/lib/beetle_etl/testing.rb +10 -5
  21. data/lib/beetle_etl/testing/test_wrapper.rb +4 -4
  22. data/lib/beetle_etl/version.rb +1 -1
  23. data/spec/beetle_etl_spec.rb +6 -38
  24. data/spec/configuration_spec.rb +66 -0
  25. data/spec/dsl/dsl_spec.rb +9 -3
  26. data/spec/dsl/transformation_loader_spec.rb +9 -8
  27. data/spec/dsl/transformation_spec.rb +9 -7
  28. data/spec/feature/feature_spec.rb +8 -8
  29. data/spec/reporter_spec.rb +5 -2
  30. data/spec/spec_helper.rb +4 -5
  31. data/spec/steps/assign_ids_spec.rb +7 -7
  32. data/spec/steps/create_stage_spec.rb +14 -12
  33. data/spec/steps/load_spec.rb +9 -7
  34. data/spec/steps/map_relations_spec.rb +14 -8
  35. data/spec/steps/step_spec.rb +5 -3
  36. data/spec/steps/table_diff_spec.rb +7 -6
  37. data/spec/steps/transform_spec.rb +8 -4
  38. data/spec/testing_spec.rb +1 -1
  39. metadata +9 -5
@@ -38,7 +38,10 @@ module BeetleETL
38
38
  end
39
39
 
40
40
  it "loggs a summary of all step times by table name" do
41
- expect(BeetleETL.logger).to receive(:info).with <<-LOG.unindent
41
+ config = Configuration.new.tap do |c|
42
+ c.logger = double(:logger)
43
+ end
44
+ expect(config.logger).to receive(:info).with <<-LOG.unindent
42
45
 
43
46
 
44
47
  organisations
@@ -58,7 +61,7 @@ module BeetleETL
58
61
  01:31:39
59
62
  LOG
60
63
 
61
- Reporter.new(report).log_summary
64
+ Reporter.new(config, report).log_summary
62
65
  end
63
66
 
64
67
  end
@@ -1,9 +1,10 @@
1
+ require "byebug"
1
2
  require "codeclimate-test-reporter"
2
3
  CodeClimate::TestReporter.start
3
4
 
4
- require_relative '../lib/beetle_etl.rb'
5
- require_relative 'support/database_helpers.rb'
6
- require_relative 'support/file_helpers.rb'
5
+ require_relative "../lib/beetle_etl.rb"
6
+ require_relative "support/database_helpers.rb"
7
+ require_relative "support/file_helpers.rb"
7
8
 
8
9
  RSpec.configure do |config|
9
10
 
@@ -13,8 +14,6 @@ RSpec.configure do |config|
13
14
  config.backtrace_exclusion_patterns = [/rspec-core/]
14
15
 
15
16
  config.around(:each) do |example|
16
- BeetleETL.reset
17
-
18
17
  if example.metadata[:feature]
19
18
  example.run
20
19
  else
@@ -6,16 +6,16 @@ module BeetleETL
6
6
  let(:external_source) { 'my_source' }
7
7
  let(:another_source) { 'another_source' }
8
8
 
9
- subject { AssignIds.new(:example_table) }
10
-
11
- before do
12
- BeetleETL.configure do |config|
13
- config.stage_schema = 'stage'
14
- config.external_source = external_source
15
- config.database = test_database
9
+ let(:config) do
10
+ Configuration.new.tap do |c|
11
+ c.stage_schema = 'stage'
12
+ c.external_source = external_source
13
+ c.database = test_database
16
14
  end
17
15
  end
18
16
 
17
+ subject { AssignIds.new(config, :example_table) }
18
+
19
19
  describe '#dependencies' do
20
20
  it 'depends on TableDiff of the same table' do
21
21
  expect(subject.dependencies).to eql(['example_table: TableDiff'].to_set)
@@ -3,20 +3,22 @@ require 'spec_helper'
3
3
  module BeetleETL
4
4
  describe CreateStage do
5
5
 
6
+ let(:config) do
7
+ Configuration.new.tap do |c|
8
+ c.database = test_database
9
+ c.external_source = "source"
10
+ end
11
+ end
12
+
6
13
  describe '#dependencies' do
7
14
  it 'has no dependencies' do
8
- subject = CreateStage.new(:example_table, double(:dependencies), double(:columns))
15
+ subject = CreateStage.new(config, :example_table, double(:dependencies), double(:columns))
9
16
  expect(subject.dependencies).to eql(Set.new)
10
17
  end
11
18
  end
12
19
 
13
20
  describe '#run' do
14
21
  before do
15
- BeetleETL.configure do |config|
16
- config.database = test_database
17
- config.external_source = "source"
18
- end
19
-
20
22
  test_database.execute <<-SQL
21
23
  CREATE TABLE example_table (
22
24
  id INTEGER,
@@ -42,7 +44,7 @@ module BeetleETL
42
44
  end
43
45
 
44
46
  let(:subject) do
45
- CreateStage.new(:example_table, @relations, @columns)
47
+ CreateStage.new(config, :example_table, @relations, @columns)
46
48
  end
47
49
 
48
50
  it 'creates a stage table table with all payload columns' do
@@ -82,30 +84,30 @@ module BeetleETL
82
84
 
83
85
  it 'does not add foreign key columns twice if defined as payload column' do
84
86
  columns = [:some_string, :dependee_a_id]
85
- CreateStage.new(:example_table, @relations, columns).run
87
+ CreateStage.new(config, :example_table, @relations, columns).run
86
88
  end
87
89
 
88
90
  it 'raises an error if no columns and no relations are defined' do
89
91
  expect do
90
- CreateStage.new(:example_table, {}, []).run
92
+ CreateStage.new(config, :example_table, {}, []).run
91
93
  end.to raise_error(BeetleETL::NoColumnsDefinedError)
92
94
  end
93
95
 
94
96
  it 'raises an error when given columns with no definition' do
95
97
  expect do
96
- CreateStage.new(:example_table, @relations, [:undefined_column]).run
98
+ CreateStage.new(config, :example_table, @relations, [:undefined_column]).run
97
99
  end.to raise_error(BeetleETL::ColumnDefinitionNotFoundError)
98
100
  end
99
101
 
100
102
  it "truncates the stage table if it already exists" do
101
- CreateStage.new(:example_table, {}, @columns).run
103
+ CreateStage.new(config, :example_table, {}, @columns).run
102
104
 
103
105
  insert_into(subject.stage_table_name.to_sym).values(
104
106
  [ :some_string , :some_integer , :some_float ] ,
105
107
  [ "hello" , 123 , 123.456 ]
106
108
  )
107
109
 
108
- CreateStage.new(:example_table, {}, @columns).run
110
+ CreateStage.new(config, :example_table, {}, @columns).run
109
111
 
110
112
  expect(subject.stage_table_name).to have_values(
111
113
  [:some_string, :some_integer, :some_float]
@@ -11,14 +11,16 @@ module BeetleETL
11
11
  let(:now) { Time.now.beginning_of_day }
12
12
  let(:yesterday) { 1.day.ago.beginning_of_day }
13
13
 
14
- subject { Load.new(:example_table, []) }
15
-
16
- before do
17
- BeetleETL.configure do |config|
18
- config.external_source = external_source
19
- config.database = test_database
14
+ let(:config) do
15
+ Configuration.new.tap do |c|
16
+ c.external_source = external_source
17
+ c.database = test_database
20
18
  end
19
+ end
21
20
 
21
+ subject { Load.new(config, :example_table, []) }
22
+
23
+ before do
22
24
  allow(subject).to receive(:now) { now }
23
25
 
24
26
  test_database.create_schema(:stage)
@@ -54,7 +56,7 @@ module BeetleETL
54
56
  dependee_b_id: :dependee_b,
55
57
  }
56
58
 
57
- expect(Load.new(:depender, relations).dependencies).to eql(
59
+ expect(Load.new(config, :depender, relations).dependencies).to eql(
58
60
  [
59
61
  'dependee_a: Load',
60
62
  'dependee_b: Load',
@@ -3,8 +3,19 @@ require 'spec_helper'
3
3
  module BeetleETL
4
4
  describe MapRelations do
5
5
 
6
- let(:dependee_a) { BeetleETL::Naming.stage_table_name(:dependee_a).to_sym }
7
- let(:dependee_b) { BeetleETL::Naming.stage_table_name(:dependee_b).to_sym }
6
+ let(:config) do
7
+ Configuration.new.tap do |c|
8
+ c.external_source = 'my_source'
9
+ c.database = test_database
10
+ end
11
+ end
12
+
13
+ let(:dependee_a) do
14
+ BeetleETL::Naming.stage_table_name('my_source', :dependee_a).to_sym
15
+ end
16
+ let(:dependee_b) do
17
+ BeetleETL::Naming.stage_table_name('my_source', :dependee_b).to_sym
18
+ end
8
19
 
9
20
  let(:relations) do
10
21
  {
@@ -14,15 +25,10 @@ module BeetleETL
14
25
  end
15
26
 
16
27
  subject do
17
- MapRelations.new(:depender, relations)
28
+ MapRelations.new(config, :depender, relations)
18
29
  end
19
30
 
20
31
  before do
21
- BeetleETL.configure do |config|
22
- config.external_source = 'my_source'
23
- config.database = test_database
24
- end
25
-
26
32
  test_database.create_table(dependee_a) do
27
33
  Integer :id
28
34
  String :external_id, size: 255
@@ -3,7 +3,9 @@ require 'spec_helper'
3
3
  module BeetleETL
4
4
  describe Step do
5
5
 
6
- subject { Step.new(:example_table) }
6
+ let(:config) { Configuration.new }
7
+
8
+ subject { Step.new(config, :example_table) }
7
9
  FooStep = Class.new(Step)
8
10
 
9
11
  describe '.step_name' do
@@ -18,11 +20,11 @@ module BeetleETL
18
20
 
19
21
  describe '#name' do
20
22
  it 'returns the steps name' do
21
- expect(Step.new(:example_table).name).to eql('example_table: Step')
23
+ expect(Step.new(config, :example_table).name).to eql('example_table: Step')
22
24
  end
23
25
 
24
26
  it 'returns the step name of inheriting steps' do
25
- expect(FooStep.new(:foo_table).name).to eql('foo_table: FooStep')
27
+ expect(FooStep.new(config, :foo_table).name).to eql('foo_table: FooStep')
26
28
  end
27
29
  end
28
30
 
@@ -7,15 +7,16 @@ module BeetleETL
7
7
  describe TableDiff do
8
8
 
9
9
  let(:external_source) { 'my_source' }
10
+ let(:config) do
11
+ Configuration.new.tap do |c|
12
+ c.external_source = external_source
13
+ c.database = test_database
14
+ end
15
+ end
10
16
 
11
- subject { TableDiff.new(:example_table) }
17
+ subject { TableDiff.new(config, :example_table) }
12
18
 
13
19
  before do
14
- BeetleETL.configure do |config|
15
- config.external_source = external_source
16
- config.database = test_database
17
- end
18
-
19
20
  test_database.create_table(subject.stage_table_name.to_sym) do
20
21
  String :external_id, size: 255
21
22
  String :transition, size: 20
@@ -3,10 +3,17 @@ require 'spec_helper'
3
3
  module BeetleETL
4
4
  describe Transform do
5
5
 
6
+ let(:database) { double(:database) }
7
+ let(:config) do
8
+ Configuration.new.tap do |c|
9
+ c.database = database
10
+ end
11
+ end
6
12
  let(:query) { double(:query) }
13
+
7
14
  subject do
8
15
  deps = [:some_table, :some_other_table].to_set
9
- Transform.new(:example_table, deps, query)
16
+ Transform.new(config, :example_table, deps, query)
10
17
  end
11
18
 
12
19
  describe '#dependencies' do
@@ -22,9 +29,6 @@ module BeetleETL
22
29
 
23
30
  describe '#run' do
24
31
  it 'runs a query in the database' do
25
- database = double(:database)
26
- BeetleETL.configure { |config| config.database = database }
27
-
28
32
  expect(database).to receive(:run).with(query)
29
33
 
30
34
  subject.run
@@ -22,7 +22,7 @@ describe "BeetleETL:Testing" do
22
22
  end
23
23
  FILE
24
24
 
25
- BeetleETL.configure do |config|
25
+ BeetleETL::Testing.configure do |config|
26
26
  config.database = test_database
27
27
  config.transformation_file = data_file.path
28
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beetle_etl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luciano Maiwald
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-16 00:00:00.000000000 Z
11
+ date: 2016-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.6'
47
+ version: '1.11'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.6'
54
+ version: '1.11'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -116,6 +116,7 @@ executables: []
116
116
  extensions: []
117
117
  extra_rdoc_files: []
118
118
  files:
119
+ - ".byebug_history"
119
120
  - ".gitignore"
120
121
  - ".travis.yml"
121
122
  - Gemfile
@@ -124,6 +125,7 @@ files:
124
125
  - Rakefile
125
126
  - beetle_etl.gemspec
126
127
  - lib/beetle_etl.rb
128
+ - lib/beetle_etl/configuration.rb
127
129
  - lib/beetle_etl/dsl/dsl.rb
128
130
  - lib/beetle_etl/dsl/transformation.rb
129
131
  - lib/beetle_etl/dsl/transformation_loader.rb
@@ -145,6 +147,7 @@ files:
145
147
  - lib/beetle_etl/version.rb
146
148
  - script/postgres
147
149
  - spec/beetle_etl_spec.rb
150
+ - spec/configuration_spec.rb
148
151
  - spec/dsl/dsl_spec.rb
149
152
  - spec/dsl/transformation_loader_spec.rb
150
153
  - spec/dsl/transformation_spec.rb
@@ -186,12 +189,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
189
  version: '0'
187
190
  requirements: []
188
191
  rubyforge_project:
189
- rubygems_version: 2.4.5
192
+ rubygems_version: 2.2.5
190
193
  signing_key:
191
194
  specification_version: 4
192
195
  summary: BeetleETL helps you with your recurring ETL imports.
193
196
  test_files:
194
197
  - spec/beetle_etl_spec.rb
198
+ - spec/configuration_spec.rb
195
199
  - spec/dsl/dsl_spec.rb
196
200
  - spec/dsl/transformation_loader_spec.rb
197
201
  - spec/dsl/transformation_spec.rb