holistics 0.3.5 → 0.4.0

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
- SHA1:
3
- metadata.gz: cab913239d13210e0e3c091b01bc3f9b61cdc78d
4
- data.tar.gz: 53b64ba89eb7ffb7134b7b80c15948d291b75efe
2
+ SHA256:
3
+ metadata.gz: 32364a4f3b5aa6da19afdc05c34a6a9c3361721a200a6788bbc81bd4c7039b52
4
+ data.tar.gz: a3a993895ae584784d2abe4b3ba4e27a21688e8a4222c71be942cad483bfa809
5
5
  SHA512:
6
- metadata.gz: 89b361bb3763a3c89c59ffe4845d5f3b1625da74292fd6e19164dfb19ee1814566e9c8f246f7d7a753fb56a4e926c7894738099006dad0063f2c4dc1e1753925
7
- data.tar.gz: f115d45d5baa6972a7d30d2b9610032aa39b924d1cf97c1ff98101cfc20e9ca8e6b640b5830245c77f39b1a2915e3c424ebdc40d3959eb7d68d90b8646eefa1c
6
+ metadata.gz: 8d5cfeb9ffc0990025139117aa02c31a0bada08b86c267bfd37e1257f240267221f9acb0d8eb162e7f9f1ab5a60a00a152c1d070c30ff8bc60a18dafd70c3919
7
+ data.tar.gz: 441660cafeee9c3b74f6a8cd6f9984b1e2b4e13bf7cbfd33c58d0a765ab98c45b5da371a3a36c315ea236287f5110b2a012aa3501e6caa85ba0f2931d84a4ff5
data/CHANGELOG.md CHANGED
@@ -2,6 +2,9 @@
2
2
  All notable changes to this project will be documented in this file.
3
3
  This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
+ ## v0.4.0
6
+ * Add `dbt upload` command
7
+
5
8
  ## v0.3.4
6
9
  * Update retry mechanism for `fetch_job_details`
7
10
 
data/README.md CHANGED
@@ -80,6 +80,11 @@ Example:
80
80
  [job:738] Hot-swapping with Redshift table public.users ...
81
81
  [job:738] Done.
82
82
 
83
+ ## dbt commands
84
+ ### Upload dbt's manifest.json file to Holistics
85
+ $ holistics dbt upload --file-path /path/to/manifest.json --data-source demodb
86
+
87
+
83
88
  ### Custom table build transport
84
89
 
85
90
  See `samples/clicks_mysql_to_redshift.json` for details of transport configs.
data/holistics.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.0"
24
24
 
25
- spec.add_dependency 'activesupport', '~> 4.2'
25
+ spec.add_dependency 'activesupport'
26
26
  spec.add_dependency 'httparty', '~> 0.13'
27
27
  spec.add_dependency 'thor', '~> 0.19'
28
28
  spec.add_dependency 'multipart-post', '~> 2.0'
data/lib/dbt.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'thor'
2
+ require 'holistics/helpers/http_request'
3
+
4
+ module Holistics
5
+ class Dbt < Thor
6
+ method_option :filepath, aliases: '--file-path', type: :string, required: false, desc: 'Path to manifest.json file'
7
+ method_option :data_source_name, aliases: '--data-source', type: :string, required: false, desc: 'Name of data_source'
8
+ desc 'upload', 'Upload manifest.json file to Holistics'
9
+ def upload
10
+ data_source_name = options[:data_source_name]
11
+ manifest_file = get_manifest_file_from(options)
12
+
13
+ params = {
14
+ data_source_name: data_source_name
15
+ }
16
+
17
+ http_request.post_file('api/v2/data_sources/upload_dbt_manifest.json', params, manifest_file, 'application/json',
18
+ 'Error uploading manifest.json file')
19
+
20
+ puts 'Upload completed!'
21
+ end
22
+
23
+ private
24
+
25
+ def get_manifest_file_from(options)
26
+ local_filepath =
27
+ if options[:filepath].present?
28
+ options[:filepath]
29
+ else
30
+ Dir['./**/manifest.json'].first
31
+ end
32
+
33
+ begin
34
+ file = File.open(local_filepath)
35
+ rescue StandardError
36
+ warn "Could not open file at '#{local_filepath}'."
37
+ puts 'Invalid file path. Please check your file path.'
38
+ return
39
+ end
40
+
41
+ file
42
+ end
43
+
44
+ def http_request
45
+ @http_request ||= Helpers::HttpRequest.new
46
+ end
47
+ end
48
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tabular_formatter'
2
4
  require 'yaml'
3
5
  require 'json'
@@ -10,16 +12,16 @@ module Holistics
10
12
  class ImportError < StandardError
11
13
  end
12
14
 
13
- def import_csv options
15
+ def import_csv(options)
14
16
  local_filepath = options[:filepath]
15
17
  dest_ds_id = options[:dest_ds_id]
16
18
  dest_fqname = options[:dest_table_name]
17
19
 
18
20
  begin
19
21
  file = File.open local_filepath
20
- rescue
21
- STDERR.puts "Could not open file at '#{local_filepath}'."
22
- puts "Invalid file path. Please check your file path."
22
+ rescue StandardError
23
+ warn "Could not open file at '#{local_filepath}'."
24
+ puts 'Invalid file path. Please check your file path.'
23
25
 
24
26
  return
25
27
  end
@@ -31,7 +33,7 @@ module Holistics
31
33
  dest_ds_id: dest_ds_id
32
34
  }
33
35
 
34
- json = http_request.post_csv 'data_imports/import_csv.json', params, file, 'Error uploading CSV file'
36
+ json = http_request.post_file 'data_imports/import_csv.json', params, file, 'text/csv', 'Error uploading CSV file'
35
37
 
36
38
  job_id = json['message']['job_id']
37
39
 
@@ -42,8 +44,8 @@ module Holistics
42
44
  def ds_list
43
45
  result = http_request.get 'data_sources.json', 'Error retrieving list of data sources'
44
46
 
45
- table = [%w(ID Type Name)]
46
- rows = result.map {|record| [record['id'], record['dbtype'], record['name']]}
47
+ table = [%w[ID Type Name]]
48
+ rows = result.map { |record| [record['id'], record['dbtype'], record['name']] }
47
49
  table.concat(rows)
48
50
 
49
51
  puts TabularFormatter.new(table).to_pretty_table
@@ -52,8 +54,8 @@ module Holistics
52
54
  def import_list
53
55
  result = http_request.get 'data_imports.json', 'Error retrieving list of data imports'
54
56
 
55
- table = [%w(ID Name)]
56
- rows = result.map {|record| [record['id'], record['title']]}
57
+ table = [%w[ID Name]]
58
+ rows = result.map { |record| [record['id'], record['title']] }
57
59
  table.concat(rows)
58
60
 
59
61
  puts TabularFormatter.new(table).to_pretty_table
@@ -62,8 +64,8 @@ module Holistics
62
64
  def transform_list
63
65
  result = http_request.get 'data_transforms.json', 'Error retrieving list of data transports'
64
66
 
65
- table = [%w(ID Name)]
66
- rows = result.map {|record| [record['id'], record['title']]}
67
+ table = [%w[ID Name]]
68
+ rows = result.map { |record| [record['id'], record['title']] }
67
69
  table.concat(rows)
68
70
 
69
71
  puts TabularFormatter.new(table).to_pretty_table
@@ -113,7 +115,7 @@ module Holistics
113
115
  job_manager.tail_logs job_id
114
116
  res = job_manager.fetch_job_results job_id
115
117
  unless res['status'] == 'success'
116
- raise ImportError.new("Failed Import Job #{job_id}: #{res['error']}")
118
+ raise ImportError, "Failed Import Job #{job_id}: #{res['error']}"
117
119
  end
118
120
  end
119
121
 
@@ -123,16 +125,14 @@ module Holistics
123
125
  end
124
126
 
125
127
  def generate_configs(options)
126
- unless Dir.exist?(options['output'])
127
- raise 'Output location is invalid.'
128
- end
128
+ raise 'Output location is invalid.' unless Dir.exist?(options['output'])
129
129
 
130
130
  puts "Generating transport JSON config files to #{options['output']} directory..."
131
131
 
132
132
  result = http_request.post_json 'transports/generate_configs.json', options, 'Error generating transport configs'
133
133
 
134
134
  result.each do |table_data|
135
- File.open("#{options['output']}/#{table_data['filename']}", "w") do |f|
135
+ File.open("#{options['output']}/#{table_data['filename']}", 'w') do |f|
136
136
  f.write(JSON.pretty_generate(table_data['json_content']))
137
137
  end
138
138
 
@@ -145,24 +145,28 @@ module Holistics
145
145
 
146
146
  def build_submit_params(options)
147
147
  params = options.except(:config_path)
148
- params[:configs] = parse_transport_config(options[:config_path]).to_json if options[:config_path]
148
+ if options[:config_path]
149
+ params[:configs] = parse_transport_config(options[:config_path]).to_json
150
+ end
149
151
  params
150
152
  end
151
153
 
152
154
  def parse_transport_config(filepath)
153
155
  file_ext = File.extname(filepath).downcase
154
156
  if file_ext == '.json'
155
- return JSON.parse(File.read(filepath))
157
+ JSON.parse(File.read(filepath))
156
158
  elsif file_ext == '.yml'
157
- return YAML.load(File.read(filepath))
159
+ YAML.safe_load(File.read(filepath))
158
160
  else
159
- raise StandardError.new 'Invalid config file extension. Please use either JSON or YML'
161
+ raise StandardError, 'Invalid config file extension. Please use either JSON or YML'
160
162
  end
161
163
  rescue StandardError => e
162
- STDERR.puts "Error parsing transport config file: #{e.message}"
164
+ warn "Error parsing transport config file: #{e.message}"
163
165
  exit 1
164
166
  end
165
167
 
168
+ def dbt_upload(filepath, ds_name); end
169
+
166
170
  private
167
171
 
168
172
  def file_manager
@@ -180,7 +184,5 @@ module Holistics
180
184
  def auth_info
181
185
  @auth_info ||= Helpers::AuthInfo.new
182
186
  end
183
-
184
-
185
187
  end
186
188
  end
@@ -34,7 +34,7 @@ module Holistics
34
34
  exit_if_error(msg_if_error, response)
35
35
  JSON.parse response.body
36
36
  end
37
-
37
+
38
38
  def simple_get(url, token = nil)
39
39
  HTTParty
40
40
  .get url, headers: { API_KEY_HEADER => token || auth_helper.get_token_from_gconfig }
@@ -61,11 +61,11 @@ module Holistics
61
61
  #
62
62
  # see this link for setting it
63
63
  # https://github.com/nicksieger/multipart-post/issues/18#issuecomment-171479987
64
- def post_csv url, params, file, msg_if_error = DEFAULT_ERROR_MSG
64
+ def post_file url, params, file, content_type, msg_if_error = DEFAULT_ERROR_MSG
65
65
  uri = URI.parse(endpoint_for(url))
66
- csv = UploadIO.new file, "text/csv", File.basename(file.path)
67
- params = params.merge file: csv
68
-
66
+ upload_file = UploadIO.new file, content_type, File.basename(file.path)
67
+ params = params.merge file: upload_file
68
+
69
69
  post_data = Net::HTTP::Post::Multipart.new uri.path, params
70
70
  post_data.add_field(API_KEY_HEADER, auth_helper.get_token_from_gconfig)
71
71
 
@@ -1,4 +1,4 @@
1
1
  module Holistics
2
- VERSION = '0.3.5'
3
- DATE = '2021-04-19'
2
+ VERSION = '0.4.0'
3
+ DATE = '2021-10-15'
4
4
  end
data/lib/holistics.rb CHANGED
@@ -12,6 +12,7 @@ require 'transport'
12
12
  require 'transform'
13
13
  require 'data_sources'
14
14
  require 'email_schedule'
15
+ require 'dbt'
15
16
 
16
17
  module Holistics
17
18
  def self.root
@@ -50,6 +51,7 @@ module Holistics
50
51
  register(Holistics::Transform, 'transform', 'transform <command>', "Execute transform module's commands")
51
52
  register(Holistics::DataSources, 'data_sources', 'data_sources <command>', "Execute data_sources module's commands")
52
53
  register(Holistics::EmailSchedule, 'email_schedule', 'email_schedule <command>', "Execute email schedule's commands")
54
+ register(Holistics::Dbt, 'dbt', 'dbt <comnand>', 'dbt integration with Holistics')
53
55
 
54
56
  no_commands do
55
57
  def auth_api_client
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: holistics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thanh Dinh Khac
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-04-19 00:00:00.000000000 Z
12
+ date: 2021-10-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -29,16 +29,16 @@ dependencies:
29
29
  name: activesupport
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
- version: '4.2'
34
+ version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - "~>"
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: '4.2'
41
+ version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: httparty
44
44
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,7 @@ files:
108
108
  - bin/holistics
109
109
  - holistics.gemspec
110
110
  - lib/data_sources.rb
111
+ - lib/dbt.rb
111
112
  - lib/email_schedule.rb
112
113
  - lib/holistics.rb
113
114
  - lib/holistics/api_client.rb
@@ -143,8 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  - !ruby/object:Gem::Version
144
145
  version: '0'
145
146
  requirements: []
146
- rubyforge_project:
147
- rubygems_version: 2.5.1
147
+ rubygems_version: 3.1.6
148
148
  signing_key:
149
149
  specification_version: 4
150
150
  summary: CLI interface for Holistics