nexosis_api 2.0.0 → 2.0.1
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.
- checksums.yaml +4 -4
- data/lib/nexosis_api/algorithm.rb +22 -22
- data/lib/nexosis_api/algorithm_contestant.rb +43 -43
- data/lib/nexosis_api/calendar_jointarget.rb +35 -35
- data/lib/nexosis_api/classifier_result.rb +25 -25
- data/lib/nexosis_api/client/contest.rb +66 -66
- data/lib/nexosis_api/client/datasets.rb +155 -155
- data/lib/nexosis_api/client/imports.rb +141 -141
- data/lib/nexosis_api/client/models.rb +108 -108
- data/lib/nexosis_api/client/sessions.rb +213 -213
- data/lib/nexosis_api/client/views.rb +105 -105
- data/lib/nexosis_api/client.rb +118 -118
- data/lib/nexosis_api/column.rb +50 -50
- data/lib/nexosis_api/column_options.rb +38 -38
- data/lib/nexosis_api/column_role.rb +19 -19
- data/lib/nexosis_api/column_type.rb +23 -19
- data/lib/nexosis_api/dataset_data.rb +22 -22
- data/lib/nexosis_api/dataset_jointarget.rb +18 -18
- data/lib/nexosis_api/dataset_model.rb +26 -26
- data/lib/nexosis_api/dataset_summary.rb +33 -33
- data/lib/nexosis_api/http_exception.rb +28 -28
- data/lib/nexosis_api/impact_metric.rb +22 -22
- data/lib/nexosis_api/imports_response.rb +74 -79
- data/lib/nexosis_api/join.rb +63 -63
- data/lib/nexosis_api/link.rb +18 -18
- data/lib/nexosis_api/message.rb +19 -19
- data/lib/nexosis_api/metric.rb +16 -16
- data/lib/nexosis_api/model_summary.rb +66 -66
- data/lib/nexosis_api/paged_array.rb +35 -35
- data/lib/nexosis_api/predict_response.rb +35 -35
- data/lib/nexosis_api/session.rb +118 -118
- data/lib/nexosis_api/session_contest.rb +30 -30
- data/lib/nexosis_api/session_response.rb +33 -33
- data/lib/nexosis_api/session_result.rb +27 -27
- data/lib/nexosis_api/session_selection_metrics.rb +20 -20
- data/lib/nexosis_api/time_interval.rb +15 -15
- data/lib/nexosis_api/view_data.rb +14 -14
- data/lib/nexosis_api/view_definition.rb +64 -64
- data/lib/nexosis_api.rb +11 -11
- data/nexosisapi.gemspec +20 -20
- metadata +3 -3
@@ -1,155 +1,155 @@
|
|
1
|
-
require 'csv'
|
2
|
-
|
3
|
-
module NexosisApi
|
4
|
-
class Client
|
5
|
-
# Dataset-based API operations
|
6
|
-
#
|
7
|
-
# @see http://docs.nexosis.com/
|
8
|
-
module Datasets
|
9
|
-
# save data in a named dataset
|
10
|
-
#
|
11
|
-
# @param dataset_name [String] name to save the dataset
|
12
|
-
# @param json_data [Hash] parsed json data
|
13
|
-
# @return [NexosisApi::DatasetSummary] information about your upload
|
14
|
-
# @note input json is to be a hash, do not send a json string via to_json.
|
15
|
-
def create_dataset_json(dataset_name, json_data)
|
16
|
-
create_dataset dataset_name, json_data.to_json, 'application/json'
|
17
|
-
end
|
18
|
-
|
19
|
-
# save data in a named dataset from csv content
|
20
|
-
#
|
21
|
-
# @param dataset_name [String] name to save the dataset
|
22
|
-
# @param csv [CSV] csv content ready for reading
|
23
|
-
# @return [NexosisApi::DatasetSummary] information about your upload
|
24
|
-
def create_dataset_csv(dataset_name, csv)
|
25
|
-
content = process_csv_to_s csv
|
26
|
-
create_dataset dataset_name, content, 'text/csv'
|
27
|
-
end
|
28
|
-
|
29
|
-
# Gets the list of data sets that have been saved to the system, optionally filtering by partial name match.
|
30
|
-
#
|
31
|
-
# @param partial_name [String] if provided, all datasets returned will contain this string
|
32
|
-
# @param page [int] page number for items in list
|
33
|
-
# @param page_size [int] number of items in each page
|
34
|
-
# @return [NexosisApi::PagedArray of NexosisApi::DatasetSummary] array of datasets found
|
35
|
-
# @since 1.4 - added paging parameters
|
36
|
-
def list_datasets(partial_name = '', page = 0, page_size = 50)
|
37
|
-
list_dataset_url = '/data'
|
38
|
-
query = {
|
39
|
-
page: page,
|
40
|
-
pageSize: page_size
|
41
|
-
}
|
42
|
-
query['partialName'] = partial_name unless partial_name.empty?
|
43
|
-
response = self.class.get(list_dataset_url, headers: @headers, query: query)
|
44
|
-
if response.success?
|
45
|
-
NexosisApi::PagedArray.new(response.parsed_response,
|
46
|
-
response.parsed_response['items']
|
47
|
-
.map { |dr| NexosisApi::DatasetSummary.new(dr) })
|
48
|
-
else
|
49
|
-
raise HttpException.new("There was a problem listing datasets: #{response.code}.", "listing datasets with partial name #{partial_name}", response)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Get the data in the set, with paging, and optional projection.
|
54
|
-
#
|
55
|
-
# @param dataset_name [String] name of the dataset for which to retrieve data.
|
56
|
-
# @param page_number [Integer] zero-based page number of results to retrieve
|
57
|
-
# @param page_size [Integer] Count of results to retrieve in each page (max 1000).
|
58
|
-
# @param query_options [Hash] options hash for limiting and projecting returned results
|
59
|
-
# @note Query Options includes start_date as a DateTime or ISO 8601 compliant string,
|
60
|
-
# end_date, also as a DateTime or string, and :include as an Array of strings indicating the columns to return.
|
61
|
-
# The dates can be used independently and are inclusive. Lack of options returns all values within the given page.
|
62
|
-
def get_dataset(dataset_name, page_number = 0, page_size = 50, query_options = {})
|
63
|
-
response = get_dataset_internal(dataset_name, page_number, page_size, query_options)
|
64
|
-
return NexosisApi::DatasetData.new(response.parsed_response) if response.success?
|
65
|
-
raise HttpException.new("There was a problem getting the dataset: #{response.code}.", "getting dataset #{dataset_name}", response)
|
66
|
-
end
|
67
|
-
|
68
|
-
# Get the data in the set, written to a CSV file, optionally filtering it.
|
69
|
-
#
|
70
|
-
# @param dataset_name [String] name of the dataset for which to retrieve data.
|
71
|
-
# @param page_number [Integer] zero-based page number of results to retrieve
|
72
|
-
# @param page_size [Integer] Count of results to retrieve in each page (max 1000).
|
73
|
-
# @param query_options [Hash] options hash for limiting and projecting returned results
|
74
|
-
# @note Query Options includes start_date as a DateTime or ISO 8601 compliant string,
|
75
|
-
# end_date, also as a DateTime or string, and :include as an Array of strings indicating the columns to return.
|
76
|
-
# The dates can be used independently and are inclusive. Lack of options returns all values within the given page.
|
77
|
-
# @example get page 1 with 20 results each page
|
78
|
-
# NexosisApi.client.get_dataset_csv('MyDataset', 1, 20, {:include => 'sales'})
|
79
|
-
def get_dataset_csv(dataset_name, page_number = 0, page_size = 50, query_options = {})
|
80
|
-
response = get_dataset_internal(dataset_name, page_number, page_size, query_options, 'text/csv')
|
81
|
-
return response.body if response.success?
|
82
|
-
raise HttpException.new("There was a problem getting the dataset: #{response.code}.", "getting dataset #{dataset_name}", response)
|
83
|
-
end
|
84
|
-
|
85
|
-
# Remove data from a data set or the entire set.
|
86
|
-
#
|
87
|
-
# @param dataset_name [String] the name of the dataset from which to remove data
|
88
|
-
# @param filter_options [Hash] filtering which data to remove
|
89
|
-
# @note Options: start_date, end_date, cascade_forecast, cascade_sessions, cascade
|
90
|
-
# - start_date - the first date on which to start removing data
|
91
|
-
# - end_date - the last date on which to finish removing data
|
92
|
-
# - cascade_forecast - will cascade deletes to all related forecasts
|
93
|
-
# - cascade_session - will cascade deletes to all related sessions
|
94
|
-
# - cascade_view - will cascade deletes to all related views (any part of join - think twice)
|
95
|
-
# - cascase_model - will cascade deletes to all models created from this dataset
|
96
|
-
# - cascade - will cascade deletes to all related forecasts and sessions
|
97
|
-
# @example - request delete with cascade forecast
|
98
|
-
# NexosisApi.client.remove_dataset('mydataset', {:cascade_forecast => true})
|
99
|
-
def remove_dataset(dataset_name, filter_options = {})
|
100
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional ' if dataset_name.to_s.empty?
|
101
|
-
dataset_remove_url = "/data/#{dataset_name}"
|
102
|
-
query = {}
|
103
|
-
if filter_options.empty? == false
|
104
|
-
cascade_query = create_cascade_options(filter_options)
|
105
|
-
query['cascade'] = cascade_query unless cascade_query.nil?
|
106
|
-
query['startDate'] = [filter_options[:start_date].to_s] unless filter_options[:start_date].nil?
|
107
|
-
query['endDate'] = [filter_options[:end_date].to_s] unless filter_options[:end_date].nil?
|
108
|
-
end
|
109
|
-
# normalizer = proc { |query_set| query_set.map { |key, value| value.map { |v| "#{key}=#{v}" } }.join('&') }
|
110
|
-
response = self.class.delete(dataset_remove_url,
|
111
|
-
headers: @headers,
|
112
|
-
query: query,
|
113
|
-
query_string_normalizer: ->(query_map) {array_query_normalizer(query_map)})
|
114
|
-
return if response.success?
|
115
|
-
raise HttpException.new("There was a problem removing the dataset: #{response.code}.", "removing dataset #{dataset_name}", response)
|
116
|
-
end
|
117
|
-
|
118
|
-
private
|
119
|
-
|
120
|
-
# @private
|
121
|
-
def create_dataset(dataset_name, content, content_type)
|
122
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional ' if dataset_name.to_s.empty?
|
123
|
-
dataset_url = "/data/#{dataset_name}"
|
124
|
-
headers = { 'api-key' => @api_key, 'Content-Type' => content_type }
|
125
|
-
response = self.class.put(dataset_url, headers: headers, body: content)
|
126
|
-
if response.success?
|
127
|
-
NexosisApi::DatasetSummary.new(response)
|
128
|
-
else
|
129
|
-
raise HttpException.new("There was a problem uploading the dataset: #{response.code}.", "uploading dataset #{dataset_name}", response)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
# @private
|
134
|
-
def get_dataset_internal(dataset_name, page_number = 0, page_size = 50, query_options = {}, content_type = 'application/json')
|
135
|
-
raise ArgumentError, 'page size must be <= 1000 items per page' unless page_size <= 1000
|
136
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional' unless dataset_name.to_s.empty? == false
|
137
|
-
dataset_url = "/data/#{dataset_name}"
|
138
|
-
headers = { 'api-key' => @api_key, 'Accept' => content_type }
|
139
|
-
self.class.get(dataset_url, headers: headers,
|
140
|
-
query: create_query(page_number, page_size, query_options),
|
141
|
-
query_string_normalizer: ->(query_map) { array_query_normalizer(query_map) })
|
142
|
-
end
|
143
|
-
|
144
|
-
# @private
|
145
|
-
def create_cascade_options(option_hash)
|
146
|
-
return nil if option_hash.nil?
|
147
|
-
return %w[session view forecast model] if option_hash.key?(:cascade)
|
148
|
-
options_set = []
|
149
|
-
option_hash.each_key { |k| options_set << k.to_s.gsub(/cascade_/, '') if k.to_s.include? 'cascade_' }
|
150
|
-
# HACK: required to be backward compatible with incorrect key names
|
151
|
-
options_set.map { |s| s.chomp('s') }
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
module NexosisApi
|
4
|
+
class Client
|
5
|
+
# Dataset-based API operations
|
6
|
+
#
|
7
|
+
# @see http://docs.nexosis.com/
|
8
|
+
module Datasets
|
9
|
+
# save data in a named dataset
|
10
|
+
#
|
11
|
+
# @param dataset_name [String] name to save the dataset
|
12
|
+
# @param json_data [Hash] parsed json data
|
13
|
+
# @return [NexosisApi::DatasetSummary] information about your upload
|
14
|
+
# @note input json is to be a hash, do not send a json string via to_json.
|
15
|
+
def create_dataset_json(dataset_name, json_data)
|
16
|
+
create_dataset dataset_name, json_data.to_json, 'application/json'
|
17
|
+
end
|
18
|
+
|
19
|
+
# save data in a named dataset from csv content
|
20
|
+
#
|
21
|
+
# @param dataset_name [String] name to save the dataset
|
22
|
+
# @param csv [CSV] csv content ready for reading
|
23
|
+
# @return [NexosisApi::DatasetSummary] information about your upload
|
24
|
+
def create_dataset_csv(dataset_name, csv)
|
25
|
+
content = process_csv_to_s csv
|
26
|
+
create_dataset dataset_name, content, 'text/csv'
|
27
|
+
end
|
28
|
+
|
29
|
+
# Gets the list of data sets that have been saved to the system, optionally filtering by partial name match.
|
30
|
+
#
|
31
|
+
# @param partial_name [String] if provided, all datasets returned will contain this string
|
32
|
+
# @param page [int] page number for items in list
|
33
|
+
# @param page_size [int] number of items in each page
|
34
|
+
# @return [NexosisApi::PagedArray of NexosisApi::DatasetSummary] array of datasets found
|
35
|
+
# @since 1.4 - added paging parameters
|
36
|
+
def list_datasets(partial_name = '', page = 0, page_size = 50)
|
37
|
+
list_dataset_url = '/data'
|
38
|
+
query = {
|
39
|
+
page: page,
|
40
|
+
pageSize: page_size
|
41
|
+
}
|
42
|
+
query['partialName'] = partial_name unless partial_name.empty?
|
43
|
+
response = self.class.get(list_dataset_url, headers: @headers, query: query)
|
44
|
+
if response.success?
|
45
|
+
NexosisApi::PagedArray.new(response.parsed_response,
|
46
|
+
response.parsed_response['items']
|
47
|
+
.map { |dr| NexosisApi::DatasetSummary.new(dr) })
|
48
|
+
else
|
49
|
+
raise HttpException.new("There was a problem listing datasets: #{response.code}.", "listing datasets with partial name #{partial_name}", response)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Get the data in the set, with paging, and optional projection.
|
54
|
+
#
|
55
|
+
# @param dataset_name [String] name of the dataset for which to retrieve data.
|
56
|
+
# @param page_number [Integer] zero-based page number of results to retrieve
|
57
|
+
# @param page_size [Integer] Count of results to retrieve in each page (max 1000).
|
58
|
+
# @param query_options [Hash] options hash for limiting and projecting returned results
|
59
|
+
# @note Query Options includes start_date as a DateTime or ISO 8601 compliant string,
|
60
|
+
# end_date, also as a DateTime or string, and :include as an Array of strings indicating the columns to return.
|
61
|
+
# The dates can be used independently and are inclusive. Lack of options returns all values within the given page.
|
62
|
+
def get_dataset(dataset_name, page_number = 0, page_size = 50, query_options = {})
|
63
|
+
response = get_dataset_internal(dataset_name, page_number, page_size, query_options)
|
64
|
+
return NexosisApi::DatasetData.new(response.parsed_response) if response.success?
|
65
|
+
raise HttpException.new("There was a problem getting the dataset: #{response.code}.", "getting dataset #{dataset_name}", response)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Get the data in the set, written to a CSV file, optionally filtering it.
|
69
|
+
#
|
70
|
+
# @param dataset_name [String] name of the dataset for which to retrieve data.
|
71
|
+
# @param page_number [Integer] zero-based page number of results to retrieve
|
72
|
+
# @param page_size [Integer] Count of results to retrieve in each page (max 1000).
|
73
|
+
# @param query_options [Hash] options hash for limiting and projecting returned results
|
74
|
+
# @note Query Options includes start_date as a DateTime or ISO 8601 compliant string,
|
75
|
+
# end_date, also as a DateTime or string, and :include as an Array of strings indicating the columns to return.
|
76
|
+
# The dates can be used independently and are inclusive. Lack of options returns all values within the given page.
|
77
|
+
# @example get page 1 with 20 results each page
|
78
|
+
# NexosisApi.client.get_dataset_csv('MyDataset', 1, 20, {:include => 'sales'})
|
79
|
+
def get_dataset_csv(dataset_name, page_number = 0, page_size = 50, query_options = {})
|
80
|
+
response = get_dataset_internal(dataset_name, page_number, page_size, query_options, 'text/csv')
|
81
|
+
return response.body if response.success?
|
82
|
+
raise HttpException.new("There was a problem getting the dataset: #{response.code}.", "getting dataset #{dataset_name}", response)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Remove data from a data set or the entire set.
|
86
|
+
#
|
87
|
+
# @param dataset_name [String] the name of the dataset from which to remove data
|
88
|
+
# @param filter_options [Hash] filtering which data to remove
|
89
|
+
# @note Options: start_date, end_date, cascade_forecast, cascade_sessions, cascade
|
90
|
+
# - start_date - the first date on which to start removing data
|
91
|
+
# - end_date - the last date on which to finish removing data
|
92
|
+
# - cascade_forecast - will cascade deletes to all related forecasts
|
93
|
+
# - cascade_session - will cascade deletes to all related sessions
|
94
|
+
# - cascade_view - will cascade deletes to all related views (any part of join - think twice)
|
95
|
+
# - cascase_model - will cascade deletes to all models created from this dataset
|
96
|
+
# - cascade - will cascade deletes to all related forecasts and sessions
|
97
|
+
# @example - request delete with cascade forecast
|
98
|
+
# NexosisApi.client.remove_dataset('mydataset', {:cascade_forecast => true})
|
99
|
+
def remove_dataset(dataset_name, filter_options = {})
|
100
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional ' if dataset_name.to_s.empty?
|
101
|
+
dataset_remove_url = "/data/#{dataset_name}"
|
102
|
+
query = {}
|
103
|
+
if filter_options.empty? == false
|
104
|
+
cascade_query = create_cascade_options(filter_options)
|
105
|
+
query['cascade'] = cascade_query unless cascade_query.nil?
|
106
|
+
query['startDate'] = [filter_options[:start_date].to_s] unless filter_options[:start_date].nil?
|
107
|
+
query['endDate'] = [filter_options[:end_date].to_s] unless filter_options[:end_date].nil?
|
108
|
+
end
|
109
|
+
# normalizer = proc { |query_set| query_set.map { |key, value| value.map { |v| "#{key}=#{v}" } }.join('&') }
|
110
|
+
response = self.class.delete(dataset_remove_url,
|
111
|
+
headers: @headers,
|
112
|
+
query: query,
|
113
|
+
query_string_normalizer: ->(query_map) {array_query_normalizer(query_map)})
|
114
|
+
return if response.success?
|
115
|
+
raise HttpException.new("There was a problem removing the dataset: #{response.code}.", "removing dataset #{dataset_name}", response)
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
|
120
|
+
# @private
|
121
|
+
def create_dataset(dataset_name, content, content_type)
|
122
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional ' if dataset_name.to_s.empty?
|
123
|
+
dataset_url = "/data/#{dataset_name}"
|
124
|
+
headers = { 'api-key' => @api_key, 'Content-Type' => content_type }
|
125
|
+
response = self.class.put(dataset_url, headers: headers, body: content)
|
126
|
+
if response.success?
|
127
|
+
NexosisApi::DatasetSummary.new(response)
|
128
|
+
else
|
129
|
+
raise HttpException.new("There was a problem uploading the dataset: #{response.code}.", "uploading dataset #{dataset_name}", response)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
# @private
|
134
|
+
def get_dataset_internal(dataset_name, page_number = 0, page_size = 50, query_options = {}, content_type = 'application/json')
|
135
|
+
raise ArgumentError, 'page size must be <= 1000 items per page' unless page_size <= 1000
|
136
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional' unless dataset_name.to_s.empty? == false
|
137
|
+
dataset_url = "/data/#{dataset_name}"
|
138
|
+
headers = { 'api-key' => @api_key, 'Accept' => content_type }
|
139
|
+
self.class.get(dataset_url, headers: headers,
|
140
|
+
query: create_query(page_number, page_size, query_options),
|
141
|
+
query_string_normalizer: ->(query_map) { array_query_normalizer(query_map) })
|
142
|
+
end
|
143
|
+
|
144
|
+
# @private
|
145
|
+
def create_cascade_options(option_hash)
|
146
|
+
return nil if option_hash.nil?
|
147
|
+
return %w[session view forecast model] if option_hash.key?(:cascade)
|
148
|
+
options_set = []
|
149
|
+
option_hash.each_key { |k| options_set << k.to_s.gsub(/cascade_/, '') if k.to_s.include? 'cascade_' }
|
150
|
+
# HACK: required to be backward compatible with incorrect key names
|
151
|
+
options_set.map { |s| s.chomp('s') }
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -1,141 +1,141 @@
|
|
1
|
-
require 'json'
|
2
|
-
module NexosisApi
|
3
|
-
class Client
|
4
|
-
# Imports-based API operations
|
5
|
-
#
|
6
|
-
# @see http://docs.nexosis.com/
|
7
|
-
module Imports
|
8
|
-
|
9
|
-
# List all existing import requests
|
10
|
-
#
|
11
|
-
# @param dataset_name [String] optional name filter of dataset which was imported
|
12
|
-
# @param page [int] page number for items in list
|
13
|
-
# @param page_size [int] number of items in each page
|
14
|
-
# @return [NexosisApi::PagedArray of NexosisApi::ImportsResponse]
|
15
|
-
# @since 1.4 added paging parameters
|
16
|
-
def list_imports(dataset_name = '', page = 0, page_size = 50)
|
17
|
-
imports_url = '/imports'
|
18
|
-
query = {
|
19
|
-
dataSetName: dataset_name,
|
20
|
-
page: page,
|
21
|
-
pageSize: page_size
|
22
|
-
}
|
23
|
-
response = self.class.get(imports_url, headers: @headers, query: query)
|
24
|
-
if (response.success?)
|
25
|
-
NexosisApi::PagedArray.new(response.parsed_response,
|
26
|
-
response.parsed_response['items']
|
27
|
-
.map { |i| NexosisApi::ImportsResponse.new(i) })
|
28
|
-
else
|
29
|
-
raise HttpException.new("There was a problem getting the imports: #{response.code}.", "uploading dataset from s3 #{dataset_name}", response)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Import a file from AWS s3 as your dataset
|
34
|
-
#
|
35
|
-
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
36
|
-
# @param bucket_name [String] the AWS S3 bucket name in which the path will be found
|
37
|
-
# @param path [String] the path within the bucket (usually file name)
|
38
|
-
# @param region [String] the region in which your bucket exists. Defaults to us-east-1
|
39
|
-
# @param credentials [Hash] :access_key_id and :secret_access_key for user with rights to read the target file.
|
40
|
-
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
41
|
-
# @return [NexosisApi::ImportsResponse]
|
42
|
-
# @see http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region for information on region names
|
43
|
-
# @note If credentials are provided they will be encrypted at the server, used once, and then removed from storage.
|
44
|
-
def import_from_s3(dataset_name, bucket_name, path, region = 'us-east-1', credentials = {}, column_metadata = [])
|
45
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.to_s.empty? == false
|
46
|
-
raise ArgumentError, 'bucket_name was not provided and is not optional ' unless bucket_name.to_s.empty? == false
|
47
|
-
raise ArgumentError, 'path was not provided and is not optional ' unless path.to_s.empty? == false
|
48
|
-
s3_import_url = '/imports/s3'
|
49
|
-
column_json = Column.to_json(column_metadata)
|
50
|
-
body = {
|
51
|
-
'dataSetName' => dataset_name,
|
52
|
-
'bucket' => bucket_name,
|
53
|
-
'path' => path,
|
54
|
-
'region' => region,
|
55
|
-
'columns' => column_json
|
56
|
-
}
|
57
|
-
body['accessKeyId'] = credentials[:access_key_id] unless credentials.nil? || credentials[:access_key_id].nil?
|
58
|
-
body['secretAccessKey'] = credentials[:secret_access_key] unless credentials.nil? || credentials[:secret_access_key].nil?
|
59
|
-
response = self.class.post(s3_import_url, headers: @headers, body: body.to_json)
|
60
|
-
raise HttpException.new("There was a problem importing from s3: #{response.code}.",
|
61
|
-
"uploading dataset from s3 #{dataset_name}",
|
62
|
-
response) unless response.success?
|
63
|
-
NexosisApi::ImportsResponse.new(response.parsed_response)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Get response back from import created previously. Presumably to check status.
|
67
|
-
#
|
68
|
-
# @param import_id [String] The id returned from a previous request to import
|
69
|
-
# @return [NexosisApi::ImportsResponse]
|
70
|
-
# @example get import
|
71
|
-
# NexosisApi.client.retrieve_import('740dca2a-b488-4322-887e-fa473b1caa54')
|
72
|
-
def retrieve_import(import_id)
|
73
|
-
raise ArgumentError, 'import_id was not provided and is not optional ' unless import_id.to_s.empty? == false
|
74
|
-
imports_url = "/imports/#{import_id}"
|
75
|
-
response = self.class.get(imports_url, headers: @headers)
|
76
|
-
raise HttpException.new("There was a problem getting the import #{response.code}.",
|
77
|
-
"requesting an import #{import_id}", response) unless response.success?
|
78
|
-
NexosisApi::ImportsResponse.new(response.parsed_response)
|
79
|
-
end
|
80
|
-
|
81
|
-
# Import a csv, json file (gzip'd or raw) from a Microsoft Azure storage blob
|
82
|
-
#
|
83
|
-
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
84
|
-
# @param connection_string [String] the azure blob storage connection string providing access to the file resource
|
85
|
-
# @param container [String] the container in which the object is located.
|
86
|
-
# @param blob_name [String] the name of the object to import, usually a file. Always csv or json content.
|
87
|
-
# If folders have been used this will contain the full path within the container.
|
88
|
-
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
89
|
-
# @return [NexosisApi::ImportsResponse]
|
90
|
-
# @since 2.0.0
|
91
|
-
# @note the connection string provided will be encrypted at the server, used once, and then removed from storage.
|
92
|
-
def import_from_azure(dataset_name, connection_string, container, blob_name, column_metadata = [])
|
93
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
|
94
|
-
raise ArgumentError, 'connection_string was not provided and is not optional ' unless connection_string.empty? == false
|
95
|
-
raise ArgumentError, 'container was not provided and is not optional ' unless container.empty? == false
|
96
|
-
raise ArgumentError, 'blob_name was not provided and is not optional ' unless blob_name.empty? == false
|
97
|
-
azure_url = '/imports/azure'
|
98
|
-
column_json = Column.to_json(column_metadata)
|
99
|
-
body = {
|
100
|
-
'dataSetName' => dataset_name,
|
101
|
-
'connectionString' => connection_string,
|
102
|
-
'container' => container,
|
103
|
-
'blob' => blob_name,
|
104
|
-
'columns' => column_json
|
105
|
-
}
|
106
|
-
response = self.class.post(azure_url, headers: @headers, body: body.to_json)
|
107
|
-
raise HttpException.new("There was a problem importing from azure: #{response.code}.",
|
108
|
-
"uploading dataset from azure #{dataset_name}",
|
109
|
-
response) unless response.success?
|
110
|
-
NexosisApi::ImportsResponse.new(response.parsed_response)
|
111
|
-
end
|
112
|
-
|
113
|
-
# Import a csv or json file directly from any avaiable and reachable public endpoint.
|
114
|
-
#
|
115
|
-
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
116
|
-
# @param url [String] the url indicating where to find the file resource to import
|
117
|
-
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
118
|
-
# @param options [Hash] may provide basic auth credentials or a 'content-type' value to identify csv or json content.
|
119
|
-
# @return [NexosisApi::ImportsResponse]
|
120
|
-
# @note imports depend on file extensions, so use a content type indicator if json or csv cannot be inferred.
|
121
|
-
# @note Urls protected by basic auth can be accessed if given a userid and password in options
|
122
|
-
# @since 2.0.0
|
123
|
-
def import_from_url(dataset_name, url, column_metadata = [], options = {})
|
124
|
-
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
|
125
|
-
raise ArgumentError, 'url was not provided and is not optional ' unless url.empty? == false
|
126
|
-
endpoint_url = '/imports/url'
|
127
|
-
column_json = Column.to_json(column_metadata)
|
128
|
-
body = {
|
129
|
-
'dataSetName' => dataset_name,
|
130
|
-
'url' => url,
|
131
|
-
'columns' => column_json
|
132
|
-
}
|
133
|
-
response = self.class.post(endpoint_url, headers: @headers, body: body.to_json)
|
134
|
-
raise HttpException.new("There was a problem importing from url: #{response.code}.",
|
135
|
-
"uploading dataset from #{url}",
|
136
|
-
response) unless response.success?
|
137
|
-
NexosisApi::ImportsResponse.new(response.parsed_response)
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
1
|
+
require 'json'
|
2
|
+
module NexosisApi
|
3
|
+
class Client
|
4
|
+
# Imports-based API operations
|
5
|
+
#
|
6
|
+
# @see http://docs.nexosis.com/
|
7
|
+
module Imports
|
8
|
+
|
9
|
+
# List all existing import requests
|
10
|
+
#
|
11
|
+
# @param dataset_name [String] optional name filter of dataset which was imported
|
12
|
+
# @param page [int] page number for items in list
|
13
|
+
# @param page_size [int] number of items in each page
|
14
|
+
# @return [NexosisApi::PagedArray of NexosisApi::ImportsResponse]
|
15
|
+
# @since 1.4 added paging parameters
|
16
|
+
def list_imports(dataset_name = '', page = 0, page_size = 50)
|
17
|
+
imports_url = '/imports'
|
18
|
+
query = {
|
19
|
+
dataSetName: dataset_name,
|
20
|
+
page: page,
|
21
|
+
pageSize: page_size
|
22
|
+
}
|
23
|
+
response = self.class.get(imports_url, headers: @headers, query: query)
|
24
|
+
if (response.success?)
|
25
|
+
NexosisApi::PagedArray.new(response.parsed_response,
|
26
|
+
response.parsed_response['items']
|
27
|
+
.map { |i| NexosisApi::ImportsResponse.new(i) })
|
28
|
+
else
|
29
|
+
raise HttpException.new("There was a problem getting the imports: #{response.code}.", "uploading dataset from s3 #{dataset_name}", response)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Import a file from AWS s3 as your dataset
|
34
|
+
#
|
35
|
+
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
36
|
+
# @param bucket_name [String] the AWS S3 bucket name in which the path will be found
|
37
|
+
# @param path [String] the path within the bucket (usually file name)
|
38
|
+
# @param region [String] the region in which your bucket exists. Defaults to us-east-1
|
39
|
+
# @param credentials [Hash] :access_key_id and :secret_access_key for user with rights to read the target file.
|
40
|
+
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
41
|
+
# @return [NexosisApi::ImportsResponse]
|
42
|
+
# @see http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region for information on region names
|
43
|
+
# @note If credentials are provided they will be encrypted at the server, used once, and then removed from storage.
|
44
|
+
def import_from_s3(dataset_name, bucket_name, path, region = 'us-east-1', credentials = {}, column_metadata = [])
|
45
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.to_s.empty? == false
|
46
|
+
raise ArgumentError, 'bucket_name was not provided and is not optional ' unless bucket_name.to_s.empty? == false
|
47
|
+
raise ArgumentError, 'path was not provided and is not optional ' unless path.to_s.empty? == false
|
48
|
+
s3_import_url = '/imports/s3'
|
49
|
+
column_json = Column.to_json(column_metadata)
|
50
|
+
body = {
|
51
|
+
'dataSetName' => dataset_name,
|
52
|
+
'bucket' => bucket_name,
|
53
|
+
'path' => path,
|
54
|
+
'region' => region,
|
55
|
+
'columns' => column_json
|
56
|
+
}
|
57
|
+
body['accessKeyId'] = credentials[:access_key_id] unless credentials.nil? || credentials[:access_key_id].nil?
|
58
|
+
body['secretAccessKey'] = credentials[:secret_access_key] unless credentials.nil? || credentials[:secret_access_key].nil?
|
59
|
+
response = self.class.post(s3_import_url, headers: @headers, body: body.to_json)
|
60
|
+
raise HttpException.new("There was a problem importing from s3: #{response.code}.",
|
61
|
+
"uploading dataset from s3 #{dataset_name}",
|
62
|
+
response) unless response.success?
|
63
|
+
NexosisApi::ImportsResponse.new(response.parsed_response)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Get response back from import created previously. Presumably to check status.
|
67
|
+
#
|
68
|
+
# @param import_id [String] The id returned from a previous request to import
|
69
|
+
# @return [NexosisApi::ImportsResponse]
|
70
|
+
# @example get import
|
71
|
+
# NexosisApi.client.retrieve_import('740dca2a-b488-4322-887e-fa473b1caa54')
|
72
|
+
def retrieve_import(import_id)
|
73
|
+
raise ArgumentError, 'import_id was not provided and is not optional ' unless import_id.to_s.empty? == false
|
74
|
+
imports_url = "/imports/#{import_id}"
|
75
|
+
response = self.class.get(imports_url, headers: @headers)
|
76
|
+
raise HttpException.new("There was a problem getting the import #{response.code}.",
|
77
|
+
"requesting an import #{import_id}", response) unless response.success?
|
78
|
+
NexosisApi::ImportsResponse.new(response.parsed_response)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Import a csv, json file (gzip'd or raw) from a Microsoft Azure storage blob
|
82
|
+
#
|
83
|
+
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
84
|
+
# @param connection_string [String] the azure blob storage connection string providing access to the file resource
|
85
|
+
# @param container [String] the container in which the object is located.
|
86
|
+
# @param blob_name [String] the name of the object to import, usually a file. Always csv or json content.
|
87
|
+
# If folders have been used this will contain the full path within the container.
|
88
|
+
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
89
|
+
# @return [NexosisApi::ImportsResponse]
|
90
|
+
# @since 2.0.0
|
91
|
+
# @note the connection string provided will be encrypted at the server, used once, and then removed from storage.
|
92
|
+
def import_from_azure(dataset_name, connection_string, container, blob_name, column_metadata = [])
|
93
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
|
94
|
+
raise ArgumentError, 'connection_string was not provided and is not optional ' unless connection_string.empty? == false
|
95
|
+
raise ArgumentError, 'container was not provided and is not optional ' unless container.empty? == false
|
96
|
+
raise ArgumentError, 'blob_name was not provided and is not optional ' unless blob_name.empty? == false
|
97
|
+
azure_url = '/imports/azure'
|
98
|
+
column_json = Column.to_json(column_metadata)
|
99
|
+
body = {
|
100
|
+
'dataSetName' => dataset_name,
|
101
|
+
'connectionString' => connection_string,
|
102
|
+
'container' => container,
|
103
|
+
'blob' => blob_name,
|
104
|
+
'columns' => column_json
|
105
|
+
}
|
106
|
+
response = self.class.post(azure_url, headers: @headers, body: body.to_json)
|
107
|
+
raise HttpException.new("There was a problem importing from azure: #{response.code}.",
|
108
|
+
"uploading dataset from azure #{dataset_name}",
|
109
|
+
response) unless response.success?
|
110
|
+
NexosisApi::ImportsResponse.new(response.parsed_response)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Import a csv or json file directly from any avaiable and reachable public endpoint.
|
114
|
+
#
|
115
|
+
# @param dataset_name [String] the name to give to the new dataset or existing dataset to which this data will be upserted
|
116
|
+
# @param url [String] the url indicating where to find the file resource to import
|
117
|
+
# @param column_metadata [Array of NexosisApi::Column] description of each column in target dataset. Optional.
|
118
|
+
# @param options [Hash] may provide basic auth credentials or a 'content-type' value to identify csv or json content.
|
119
|
+
# @return [NexosisApi::ImportsResponse]
|
120
|
+
# @note imports depend on file extensions, so use a content type indicator if json or csv cannot be inferred.
|
121
|
+
# @note Urls protected by basic auth can be accessed if given a userid and password in options
|
122
|
+
# @since 2.0.0
|
123
|
+
def import_from_url(dataset_name, url, column_metadata = [], options = {})
|
124
|
+
raise ArgumentError, 'dataset_name was not provided and is not optional ' unless dataset_name.empty? == false
|
125
|
+
raise ArgumentError, 'url was not provided and is not optional ' unless url.empty? == false
|
126
|
+
endpoint_url = '/imports/url'
|
127
|
+
column_json = Column.to_json(column_metadata)
|
128
|
+
body = {
|
129
|
+
'dataSetName' => dataset_name,
|
130
|
+
'url' => url,
|
131
|
+
'columns' => column_json
|
132
|
+
}
|
133
|
+
response = self.class.post(endpoint_url, headers: @headers, body: body.to_json)
|
134
|
+
raise HttpException.new("There was a problem importing from url: #{response.code}.",
|
135
|
+
"uploading dataset from #{url}",
|
136
|
+
response) unless response.success?
|
137
|
+
NexosisApi::ImportsResponse.new(response.parsed_response)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|