gooddata_datawarehouse 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a3ba4f26ae8e33a6118a1f0a892315968f92857
4
- data.tar.gz: 2be9b35b829f8910116a65252a3651ab6dfd5be6
3
+ metadata.gz: c6dab944c3225fc70d395c43efb00edf49cd9211
4
+ data.tar.gz: 43a0ea9ca6328951e8f5087d97ba87014387d2be
5
5
  SHA512:
6
- metadata.gz: c2b74588cb194e9c0928dcd3c6c3250bf64907d1fe4fc93d137506a2f2f8e86c02350cbdbbc7341c5854a30d75ac7ad36b2269e8f3c5f393959f6b4ee1b26b59
7
- data.tar.gz: e7e8b1cb11d8926b47d516e9a636b79096d055bb7ca35331bb6edcf5d67926fde3a57ebb32c719741f83cf0caa2e6da66f2f0688535be91e13158e55af446113
6
+ metadata.gz: 67768d3deca6993494a62c4de9c05d4f62226ee1806d853d8183f529aa8510780ff8856331cfe6502259b871ebc8b3a26b70a482773901a6e691516836d02be2
7
+ data.tar.gz: 67bae1529cd48d066790a10e7b4927daf05110c3440cc3c45da2faed208b4fa1276d0eb02bf52763a98f0b41cde8df2400ecade369c3efdc859ae7515e62efde
data/.travis.yml ADDED
@@ -0,0 +1,21 @@
1
+ language: ruby
2
+ sudo: false
3
+ os:
4
+ - linux
5
+ - osx
6
+ branches:
7
+ except:
8
+ - gh-pages
9
+ - next_doc_release
10
+ env:
11
+ global:
12
+ - secure: "hPFBMIHa0J+Dc1gBPqipkr+4RLFQGQWBTHZbPRoAU/r9n8NkH36KvLjBNINgvJ/7eFNR/BLBFZ5tylp1zTp2E3Ysvv3snGN/qIHmAAa1O9YINbAugSUNka00kClH4s0vWF1r+e4uKTclb2TFhVBSRLjIAVEXibAQuXd7nMCm+78="
13
+ - secure: "Rqt5jW8L5c+3sVIZcfDRkXjlpy6P4g3F7JGliBcOP1whKOiJW15l5yiANoLolTBxps2UneewxcxViI4oa+ZIUZr6xms0on2I9OTyK69wZ62fVrwwrTyI+FwPfF0ilvieuuU2TF9i3bEYB9XyZHQMgqmnX4DtNFvX6hUnVPQsSn8="
14
+ - secure: "O1KhJhV69JooBAXjvZmLAbpBWTmwk0wlgQP3vlYshHC4HnGYh4su80dESn5NmTry8QuxYZNDAh211pkVx0/r73y6/NJfDd5eO1KKR+fR0HuLaRkhEW5PjfvZxkwDSa2Dwi1WZDOtd/3+3l26RGl0tg6A08fAUXgM2W7yKkB43L4="
15
+ rvm:
16
+ - jruby-19mode
17
+ before_install:
18
+ - gem update --system
19
+ - gem update bundler
20
+ script: rake ci
21
+
data/README.md CHANGED
@@ -2,17 +2,36 @@
2
2
 
3
3
  A little library to help you work with GoodData's Datawarehouse
4
4
 
5
+ ## Status
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/gooddata_datawarehouse.png)](http://badge.fury.io/rb/gooddata_datawarehouse)
8
+ [![Downloads](http://img.shields.io/gem/dt/gooddata_datawarehouse.svg)](http://rubygems.org/gems/gooddata_datawarehouse)
9
+ [![Dependency Status](https://gemnasium.com/cvengros/gooddata_datawarehouse.png)](https://gemnasium.com/cvengros/gooddata_datawarehouse)
10
+ [![Code Climate](https://codeclimate.com/github/cvengros/gooddata_datawarehouse.png)](https://codeclimate.com/github/cvengros/gooddata_datawarehouse)
11
+ [![Build Status](https://travis-ci.org/cvengros/gooddata_datawarehouse.png)](https://travis-ci.org/cvengros/gooddata_datawarehouse)
12
+ [![Coverage Status](https://coveralls.io/repos/cvengros/gooddata_datawarehouse/badge.png)](https://coveralls.io/r/cvengros/gooddata_datawarehouse)
13
+
5
14
  ## Installation
6
15
 
16
+ You need to run **jRuby** to use this gem, the gem won't work on any other Ruby platform than jRuby. That's because there's a dependency on the JDBC driver
17
+
18
+ If you're using [rvm](https://rvm.io/rvm/install) (recommended), run:
19
+
20
+ $ rvm use jruby
21
+
22
+ If you don't have jruby yet, run
23
+
24
+ $ rvm install jruby
25
+
7
26
  Add this line to your application's Gemfile:
8
27
 
9
28
  ```ruby
10
29
  gem 'gooddata_datawarehouse'
11
30
  ```
12
31
 
13
- And then execute:
32
+ And then install:
14
33
 
15
- $ bundle
34
+ $ bundle install
16
35
 
17
36
  Or install it yourself as:
18
37
 
@@ -24,7 +43,7 @@ Or install it yourself as:
24
43
  require 'gooddata_datawarehouse'
25
44
 
26
45
  # connect
27
- dwh = GoodData::Datawarehouse.new('you@gooddata.com', 'yourpass', 'your ADS instance id'
46
+ dwh = GoodData::Datawarehouse.new('you@gooddata.com', 'yourpass', 'your ADS instance id')
28
47
 
29
48
  # import a csv
30
49
  dwh.csv_to_new_table('my_table', 'path/to/my.csv')
@@ -40,7 +59,6 @@ dwh.execute_select('SELECT * FROM my_table ORDER BY col1') do |row|
40
59
  puts row[:col1]
41
60
  end
42
61
 
43
-
44
62
  # rename a table
45
63
  dwh.rename_table('my_table', 'my_new_table')
46
64
 
data/Rakefile CHANGED
@@ -1,2 +1,20 @@
1
- require "bundler/gem_tasks"
1
+ require 'coveralls/rake/task'
2
+ require 'rake/testtask'
3
+ require 'rspec/core/rake_task'
2
4
 
5
+ Coveralls::RakeTask.new
6
+
7
+ task default: %w[ci]
8
+
9
+ desc 'Run continuous integration test'
10
+ task :ci do
11
+ Rake::Task['test:unit'].invoke
12
+ Rake::Task['coveralls:push'].invoke
13
+ end
14
+
15
+ namespace :test do
16
+ desc "Run unit tests"
17
+ RSpec::Core::RakeTask.new(:unit) do |t|
18
+ t.pattern = 'spec/**/*.rb'
19
+ end
20
+ end
@@ -23,9 +23,10 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.7"
26
- spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "rake", "~> 10.3"
27
27
  spec.add_development_dependency 'rspec', '~>2.14'
28
28
  spec.add_development_dependency 'pry', '~> 0.9'
29
+ spec.add_development_dependency 'coveralls', '~> 0.7', '>= 0.7.0'
29
30
 
30
31
  spec.add_dependency "sequel", "~> 4.17"
31
32
  spec.add_dependency "gooddata-dss-jdbc", "~> 0.1"
@@ -7,11 +7,15 @@ require_relative 'sql_generator'
7
7
 
8
8
  module GoodData
9
9
  class Datawarehouse
10
- def initialize(username, password, instance_id, options={})
10
+ def initialize(username, password, instance_id, opts={})
11
11
  @logger = Logger.new(STDOUT)
12
12
  @username = username
13
13
  @password = password
14
14
  @jdbc_url = "jdbc:dss://secure.gooddata.com/gdc/dss/instances/#{instance_id}"
15
+ if @username.nil? || @password.nil? || instance_id.nil?
16
+ fail ArgumentError, "username, password and/or instance_id are nil. All of them are mandatory."
17
+ end
18
+
15
19
  Jdbc::DSS.load_driver
16
20
  Java.com.gooddata.dss.jdbc.driver.DssDriver
17
21
  end
@@ -20,7 +24,6 @@ module GoodData
20
24
  CSV.open(csv_path, 'wb', :force_quotes => true) do |csv|
21
25
  # get the names of cols
22
26
  cols = get_columns(table_name).map {|c| c[:column_name]}
23
- col_names =
24
27
 
25
28
  # write header
26
29
  csv << cols
@@ -53,7 +56,22 @@ module GoodData
53
56
 
54
57
  def load_data_from_csv(table_name, csv_path, opts={})
55
58
  columns = opts[:columns] || get_csv_headers(csv_path)
56
- execute(GoodData::SQLGenerator.load_data(table_name, csv_path, columns))
59
+
60
+ # temporary files to get the excepted records
61
+ exc = opts[:exceptions_file] ||= Tempfile.new('exceptions')
62
+ rej = opts[:rejections_file] ||= Tempfile.new('rejections')
63
+ exc = File.new(exc) unless exc.is_a?(File)
64
+ rej = File.new(rej) unless exc.is_a?(File)
65
+
66
+ # execute the load
67
+ execute(GoodData::SQLGenerator.load_data(table_name, csv_path, columns, opts))
68
+
69
+ exc.close
70
+ rej.close
71
+
72
+ if exc.size > 0 || rej.size > 0
73
+ fail ArgumentError, "Some lines in the CSV didn't go through. Exceptions: #{IO.read(exc)}\nRejected records: #{IO.read(rej)}"
74
+ end
57
75
  end
58
76
 
59
77
  # returns a list of columns created
@@ -65,8 +83,8 @@ module GoodData
65
83
  columns
66
84
  end
67
85
 
68
- def create_table(name, columns, options={})
69
- execute(GoodData::SQLGenerator.create_table(name, columns, options))
86
+ def create_table(name, columns, opts={})
87
+ execute(GoodData::SQLGenerator.create_table(name, columns, opts))
70
88
  end
71
89
 
72
90
  def table_exists?(name)
@@ -92,9 +110,9 @@ module GoodData
92
110
  end
93
111
 
94
112
  # executes sql (select), for each row, passes execution to block
95
- def execute_select(sql, options={})
96
- fetch_handler = options[:fetch_handler]
97
- count = options[:count]
113
+ def execute_select(sql, opts={})
114
+ fetch_handler = opts[:fetch_handler]
115
+ count = opts[:count]
98
116
 
99
117
  connect do |connection|
100
118
  # do the query
@@ -19,17 +19,19 @@ module GoodData
19
19
  "CREATE TABLE #{not_exists} #{table_name} (#{columns_string})"
20
20
  end
21
21
 
22
- def load_data(table, csv, columns)
22
+ def load_data(table, csv, columns, opts={})
23
23
  col_list = columns.join(', ')
24
+ skip = opts[:no_header] ? '' : 'SKIP 1'
25
+ parser = opts[:parser] || 'GdcCsvParser()'
26
+ escape_as = opts[:escape_as] || '"'
24
27
 
25
- # TODO: exceptions, rejections
26
- # EXCEPTIONS '#{except_filename(filename)}'
27
- # REJECTED DATA '#{reject_filename(filename)}' }
28
+ exc_rej = opts[:ignore_parse_errors] ? '' : "EXCEPTIONS '#{File.absolute_path(opts[:exceptions_file])}' REJECTED DATA '#{File.absolute_path(opts[:rejections_file])}'"
28
29
 
29
30
  %Q{COPY #{table} (#{col_list})
30
- FROM LOCAL '#{csv}' WITH PARSER GdcCsvParser()
31
- ESCAPE AS '"'
32
- SKIP 1}
31
+ FROM LOCAL '#{File.absolute_path(csv)}' WITH PARSER #{parser}
32
+ ESCAPE AS '#{escape_as}'
33
+ #{skip}
34
+ #{exc_rej}}
33
35
  end
34
36
 
35
37
  def get_table_count(table_name)
@@ -40,8 +42,8 @@ module GoodData
40
42
  "SELECT column_name, data_type FROM columns WHERE table_name = '#{table_name}'"
41
43
  end
42
44
 
43
- def select_all(table_name, options={})
44
- limit = options[:limit] ? "LIMIT #{options[:limit]}" : ''
45
+ def select_all(table_name, opts={})
46
+ limit = opts[:limit] ? "LIMIT #{opts[:limit]}" : ''
45
47
  "SELECT * FROM #{table_name} #{limit}"
46
48
  end
47
49
  end
@@ -1,5 +1,5 @@
1
1
  module GoodData
2
2
  class Datawarehouse
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -0,0 +1,6 @@
1
+ wheel_size,manufacturer
2
+ "29","Specialized"
3
+ "27.5","Scott"
4
+ "29","Scott"
5
+ "989","989"
6
+ "26","Something","Too much cols"
@@ -11,14 +11,14 @@ describe GoodData::Datawarehouse do
11
11
  end
12
12
 
13
13
  after(:each) do
14
- @created_tables.each{|t| @dwh.drop_table(t)} if @created_tables
14
+ @created_tables ||= [@random_table_name]
15
+ @created_tables.each{|t| @dwh.drop_table(t) if t} if @created_tables
15
16
  end
16
17
 
17
18
  describe '#create_table' do
18
19
  it 'creates a table with default type' do
19
20
  cols = ['col1', 'col2', 'col3']
20
21
  @dwh.create_table(@random_table_name, cols)
21
- @created_tables = [@random_table_name]
22
22
 
23
23
  # table exists
24
24
  expect(@dwh.table_exists?(@random_table_name)).to eq true
@@ -31,7 +31,6 @@ describe GoodData::Datawarehouse do
31
31
  cols = ['col1', 'col2', 'col3']
32
32
  cols2 = ['col1', 'col2']
33
33
  @dwh.create_table(@random_table_name, cols)
34
- @created_tables = [@random_table_name]
35
34
 
36
35
  expect(@dwh.table_exists?(@random_table_name)).to eq true
37
36
 
@@ -58,7 +57,6 @@ describe GoodData::Datawarehouse do
58
57
  }
59
58
  ]
60
59
  @dwh.create_table(@random_table_name, cols)
61
- @created_tables = [@random_table_name]
62
60
 
63
61
  # table exists
64
62
  expect(@dwh.table_exists?(@random_table_name)).to eq true
@@ -78,6 +76,8 @@ describe GoodData::Datawarehouse do
78
76
  # it shouldn't exist after being dropped
79
77
  @dwh.drop_table(@random_table_name)
80
78
  expect(@dwh.table_exists?(@random_table_name)).to eq false
79
+
80
+ @random_table_name = nil
81
81
  end
82
82
  end
83
83
 
@@ -109,7 +109,6 @@ describe GoodData::Datawarehouse do
109
109
  # cols are the same as in the csv
110
110
  expected_cols = File.open(path, &:gets).strip.split(',')
111
111
  expect(Set.new(@dwh.get_columns(@random_table_name))).to eq Set.new(expected_cols.map {|c| {:column_name => c, :data_type => GoodData::SQLGenerator::DEFAULT_TYPE}})
112
- @created_tables = [@random_table_name]
113
112
  end
114
113
  end
115
114
 
@@ -130,7 +129,6 @@ describe GoodData::Datawarehouse do
130
129
  exported = Set.new(CSV.read(f))
131
130
 
132
131
  expect(exported).to eq imported
133
- @created_tables = [@random_table_name]
134
132
  end
135
133
  end
136
134
 
@@ -157,7 +155,6 @@ describe GoodData::Datawarehouse do
157
155
  exported = Set.new(CSV.read(f))
158
156
 
159
157
  expect(exported).to eq imported
160
- @created_tables = [@random_table_name]
161
158
  end
162
159
 
163
160
  it 'fails for a wrong csv' do
@@ -167,8 +164,8 @@ describe GoodData::Datawarehouse do
167
164
  @dwh.create_table_from_csv_header(@random_table_name, path_wrong)
168
165
  expect(@dwh.table_exists?(@random_table_name)).to eq true
169
166
 
170
- # load the data there
171
- @dwh.load_data_from_csv(@random_table_name, path_wrong)
167
+ # load the data there - expect fail
168
+ expect{@dwh.load_data_from_csv(@random_table_name, path_wrong)}.to raise_error(ArgumentError)
172
169
 
173
170
  end
174
171
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require 'gooddata_datawarehouse'
2
+ require 'coveralls'
3
+
4
+ Coveralls.wear_merged!
2
5
 
3
6
  RSpec.configure do |c|
4
7
  c.filter_run :focus => true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gooddata_datawarehouse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Petr Cvengros
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-18 00:00:00.000000000 Z
11
+ date: 2015-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: '10.0'
32
+ version: '10.3'
33
33
  name: rake
34
34
  prerelease: false
35
35
  type: :development
@@ -37,7 +37,7 @@ dependencies:
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '10.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
@@ -66,6 +66,26 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ~>
73
+ - !ruby/object:Gem::Version
74
+ version: '0.7'
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.7.0
78
+ name: coveralls
79
+ prerelease: false
80
+ type: :development
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: '0.7'
86
+ - - '>='
87
+ - !ruby/object:Gem::Version
88
+ version: 0.7.0
69
89
  - !ruby/object:Gem::Dependency
70
90
  requirement: !ruby/object:Gem::Requirement
71
91
  requirements:
@@ -102,6 +122,7 @@ extensions: []
102
122
  extra_rdoc_files: []
103
123
  files:
104
124
  - .gitignore
125
+ - .travis.yml
105
126
  - Gemfile
106
127
  - LICENSE.txt
107
128
  - README.md
@@ -112,6 +133,7 @@ files:
112
133
  - lib/gooddata_datawarehouse/datawarehouse.rb
113
134
  - lib/gooddata_datawarehouse/sql_generator.rb
114
135
  - lib/gooddata_datawarehouse/version.rb
136
+ - spec/data/bike-wrong.csv
115
137
  - spec/data/bike.csv
116
138
  - spec/datawarehouse_spec.rb
117
139
  - spec/spec_helper.rb
@@ -140,6 +162,7 @@ signing_key:
140
162
  specification_version: 4
141
163
  summary: Convenient work with GoodData's Datawarehouse (ADS)
142
164
  test_files:
165
+ - spec/data/bike-wrong.csv
143
166
  - spec/data/bike.csv
144
167
  - spec/datawarehouse_spec.rb
145
168
  - spec/spec_helper.rb