predicsis_ml_sdk 0.4.0 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e55b4f098812ce79e77599cd388e0502cd0d3772
4
- data.tar.gz: 7ea659bbdb0850bdddf69c132c03fa5517b76233
3
+ metadata.gz: b87641f7e72fc46a71a5de47b8af15c5b99b77fd
4
+ data.tar.gz: 95af5340f3616ea52d27fc6a3ffb49d256a65d98
5
5
  SHA512:
6
- metadata.gz: 35ebefab33c0d30b75a274fdc719a71b432089cc31e839e6397ff15754c7828823ed8717fbd80c5c5cb0d1aff7bcdbc87a63cc6e58f49b183e5f2fc5b593542c
7
- data.tar.gz: 7bfb8c00039e235d5cac7a92132a7b723284a8d4e9e03961b2f3c9bf36dc3ab9483f1948f74b165bb81b3faa5d40b2016913c7226a655b2978183ad536983267
6
+ metadata.gz: 1e710b701347f0705c8fe52c38f593a3c0e88f844c0487a1701a9c93b8ccbc3b7f959e4c5d27d70a011a379ff97faf194f22aea8343c0f16698a65fe576b816b
7
+ data.tar.gz: dc432ea91885fdd1a67f86899591b789c25133ce15902fa6084f5d2d570ade11b74d649791608eaf12870d9deaca9f78a59f25fd47a369fe29da8de1c50a909b
@@ -6,27 +6,25 @@ require 'predicsis_ml_sdk/configuration'
6
6
  require 'predicsis_ml_sdk/core_ext'
7
7
  require 'predicsis_ml_sdk/errors'
8
8
  require 'predicsis_ml_sdk/util'
9
- require 'predicsis_ml_sdk/requests'
10
9
 
11
10
  module PredicsisMlSdk
12
- class << self
13
- attr_accessor :config
14
- end
11
+ module_function
12
+ attr_accessor :config
15
13
 
16
- def self.config
14
+ def config
17
15
  @config ||= Configuration.new
18
16
  end
19
17
 
20
- def self.configure
18
+ def configure
21
19
  yield config
22
20
  end
23
21
 
24
- def self.logger
22
+ def logger
25
23
  config.logger
26
24
  end
27
25
 
28
26
  autoload :AccessToken, 'predicsis_ml_sdk/access_token'
29
- autoload :Credentials, 'predicsis_ml_sdk/credentials'
27
+ autoload :Upload, 'predicsis_ml_sdk/upload'
30
28
  autoload :DataFile, 'predicsis_ml_sdk/data_file'
31
29
  autoload :Dataset, 'predicsis_ml_sdk/dataset'
32
30
  autoload :Dictionary, 'predicsis_ml_sdk/dictionary'
@@ -38,4 +36,5 @@ module PredicsisMlSdk
38
36
  autoload :Report, 'predicsis_ml_sdk/report'
39
37
  autoload :Source, 'predicsis_ml_sdk/source'
40
38
  autoload :Variable, 'predicsis_ml_sdk/variable'
39
+ autoload :Requests, 'predicsis_ml_sdk/requests'
41
40
  end
@@ -1,6 +1,7 @@
1
1
  class PredicsisMlSdk::Configuration
2
2
  attr_accessor :logger
3
3
  attr_accessor :predicsis_api_host
4
+ attr_accessor :storage_host
4
5
  attr_accessor :bearer_token
5
6
 
6
7
  def initialize
@@ -4,11 +4,6 @@ module PredicsisMlSdk
4
4
 
5
5
  attr_accessor :id
6
6
 
7
- def self.upload(params = {})
8
- params.delete('expires_at')
9
- Requests.upload(params)
10
- end
11
-
12
7
  def self.get(id, token = bearer_token)
13
8
  new(id, token).get
14
9
  end
@@ -1,26 +1,29 @@
1
- require 'httmultiparty'
1
+ require 'rest-client'
2
2
  require 'nokogiri'
3
3
 
4
4
  module PredicsisMlSdk
5
5
  class Requests
6
6
  extend Util
7
- HTTParty::Basement.default_options.update(verify: false)
8
7
 
9
8
  MODELS = %w(source dataset dictionary preparation_rules_set modalities_set report model data_file)
10
9
 
11
10
  class << self
12
11
  %w(get post patch delete).each do |method|
13
12
  define_method("#{method}") do |url, params, headers = {}|
14
- options = { body: params, headers: headers }
15
13
  with_captured_console do
16
- begin
17
- response = HTTParty.send(method.to_sym, url, options)
18
- if [200, 201, 204].include? response.code
19
- return response
20
- else
21
- fail RequestError.new(response['message'],
22
- JSON.parse(response.body))
23
- end
14
+ uri = URI(PredicsisMlSdk.config.predicsis_api_host + url)
15
+ res = Net::HTTP.start(uri.host, uri.port) do |http|
16
+ request = Net::HTTP.const_get(method.capitalize).new(uri, headers)
17
+ request.body = params if params
18
+
19
+ http.request(request)
20
+ end
21
+
22
+ case res
23
+ when Net::HTTPSuccess, Net::HTTPRedirection
24
+ return JSON.parse(res.body) unless res.body.empty?
25
+ else
26
+ fail RequestError.new(res['message'], res.body.empty? ? res.body : JSON.parse(res.body))
24
27
  end
25
28
  end
26
29
  end
@@ -29,108 +32,108 @@ module PredicsisMlSdk
29
32
  def post_token(token, params)
30
33
  PredicsisMlSdk.logger.debug 'POST settings/tokens'
31
34
  params = { token: params }.to_json
32
- response = post("#{api_host}/settings/tokens", params, headers(token))
35
+ response = post('/settings/tokens', params, headers(token))
33
36
  PredicsisMlSdk.logger.debug "Personal Access Token: #{response['token']['token']}"
34
37
  response['token']
35
38
  end
36
39
 
37
40
  def get_token(token, id)
38
41
  PredicsisMlSdk.logger.debug "GET settings/tokens/#{id}"
39
- get("#{api_host}/settings/tokens/#{id}", nil, headers(token))['token']
42
+ get("/settings/tokens/#{id}", nil, headers(token))['token']
40
43
  end
41
44
 
42
45
  def get_tokens(token)
43
46
  PredicsisMlSdk.logger.debug 'GET settings/tokens'
44
- get("#{api_host}/settings/tokens", nil, headers(token))['tokens']
47
+ get('/settings/tokens', nil, headers(token))['tokens']
45
48
  end
46
49
 
47
50
  def delete_token(token, id)
48
51
  PredicsisMlSdk.logger.debug "DELETE settings/tokens/#{id}"
49
- delete("#{api_host}/settings/tokens/#{id}", nil, headers(token))
52
+ delete("/settings/tokens/#{id}", nil, headers(token))
50
53
  end
51
54
 
52
- def get_credentials(type, token)
53
- PredicsisMlSdk.logger.debug 'GET credentials'
54
- get("#{api_host}/sources/credentials/#{type}", nil, headers(token))['credentials']
55
+ def initiate_upload(token)
56
+ PredicsisMlSdk.logger.debug 'INIT upload'
57
+ post('/uploads', nil, headers(token))['upload']
55
58
  end
56
59
 
57
- def upload(params = {})
58
- filename = params.delete('file')
59
- endpoint = params.delete('signed_url')
60
- PredicsisMlSdk.logger.debug "UPLOAD #{filename}"
61
- response = HTTParty.put(endpoint, body_stream: File.open(filename),
62
- headers: { 'Content-Length' => File.size(filename).to_s })
63
- if [200, 201, 204].include? response.code
64
- params
65
- else
66
- fail RequestError.new(response['message'], JSON.parse(response.body))
67
- end
60
+ def get_part_url(token, id, part_number, path)
61
+ get("/uploads/#{id}?part_number=#{part_number}&path=#{path}", nil, headers(token))['upload']
62
+ end
63
+
64
+ def complete_upload(token, id, path)
65
+ PredicsisMlSdk.logger.debug 'COMPLETE upload'
66
+ patch("/uploads/#{id}?path=#{path}", nil, headers(token))
67
+ end
68
+
69
+ def upload(endpoint, path, part)
70
+ RestClient.put(endpoint, File.open(path), { 'Content-Length' => File.size(path).to_s })
68
71
  end
69
72
 
70
73
  def get_job(token, id)
71
- get("#{api_host}/jobs/#{id}", nil, headers(token))['job']
74
+ get("/jobs/#{id}", nil, headers(token))['job']
72
75
  end
73
76
 
74
77
  def get_jobs(token)
75
78
  PredicsisMlSdk.logger.debug 'GET jobs'
76
- get("#{api_host}/jobs", nil, headers(token))['jobs']
79
+ get('/jobs', nil, headers(token))['jobs']
77
80
  end
78
81
 
79
82
  def delete_job(token, id)
80
83
  PredicsisMlSdk.logger.debug "DELETE job/#{id}"
81
- delete("#{api_host}/jobs/#{id}", nil, headers(token))
84
+ delete("/jobs/#{id}", nil, headers(token))
82
85
  end
83
86
 
84
87
  def get_variables(token, parent_id)
85
88
  PredicsisMlSdk.logger.debug "GET dictionaries/#{parent_id}/variables"
86
- get("#{api_host}/dictionaries/#{parent_id}/variables", nil, headers(token))['variables']
89
+ get("/dictionaries/#{parent_id}/variables", nil, headers(token))['variables']
87
90
  end
88
91
 
89
92
  def get_variable(token, id, parent_id)
90
93
  PredicsisMlSdk.logger.debug "GET dictionaries/#{parent_id}/variables/#{id}"
91
- get("#{api_host}/dictionaries/#{parent_id}/variables/#{id}", nil, headers(token))['variable']
94
+ get("/dictionaries/#{parent_id}/variables/#{id}", nil, headers(token))['variable']
92
95
  end
93
96
 
94
97
  def patch_variable(token, id, parent_id, params = {})
95
98
  PredicsisMlSdk.logger.debug "PATCH dictionaries/#{parent_id}/variables/#{id}"
96
99
  params = { variable: params }.to_json
97
- patch("#{api_host}/dictionaries/#{parent_id}/variables/#{id}",
100
+ patch("/dictionaries/#{parent_id}/variables/#{id}",
98
101
  params, headers(token))['variable']
99
102
  end
100
103
 
101
104
  def get_signed_url(token, id)
102
105
  PredicsisMlSdk.logger.debug "GET data_files/#{id}/signed_url"
103
- get("#{api_host}/data_files/#{id}/signed_url", nil, headers(token))['data_file']
106
+ get("/data_files/#{id}/signed_url", nil, headers(token))['data_file']
104
107
  end
105
108
 
106
109
  MODELS.each do |model|
107
110
  define_method("post_#{model}") do |token, params = {}, other_params = {}|
108
111
  PredicsisMlSdk.logger.debug "POST #{model.pluralize}"
109
112
  params = { :"#{model}" => params }.merge(other_params)
110
- response = post("#{api_host}/#{model.pluralize}", params.to_json, headers(token))
113
+ response = post("/#{model.pluralize}", params.to_json, headers(token))
111
114
  PredicsisMlSdk.logger.info("#{model}_id: #{response[model]['id']}")
112
115
  response[model]
113
116
  end
114
117
 
115
118
  define_method("delete_#{model}") do |token, id|
116
119
  PredicsisMlSdk.logger.debug "DELETE #{model.pluralize}/#{id}"
117
- delete("#{api_host}/#{model.pluralize}/#{id}", nil, headers(token))
120
+ delete("/#{model.pluralize}/#{id}", nil, headers(token))
118
121
  end
119
122
 
120
123
  define_method("get_#{model}") do |token, id|
121
124
  PredicsisMlSdk.logger.debug "GET #{model.pluralize}/#{id}"
122
- get("#{api_host}/#{model.pluralize}/#{id}", nil, headers(token))[model]
125
+ get("/#{model.pluralize}/#{id}", nil, headers(token))[model]
123
126
  end
124
127
 
125
128
  define_method("get_#{model.pluralize}") do |token|
126
129
  PredicsisMlSdk.logger.debug "GET #{model.pluralize}"
127
- get("#{api_host}/#{model.pluralize}", nil, headers(token))[model.pluralize]
130
+ get("/#{model.pluralize}", nil, headers(token))[model.pluralize]
128
131
  end
129
132
 
130
133
  define_method("patch_#{model}") do |token, id, params = {}|
131
134
  params = { :"#{model}" => params }.to_json
132
135
  PredicsisMlSdk.logger.debug "PATCH #{model.pluralize}/#{id}"
133
- patch("#{api_host}/#{model.pluralize}/#{id}", params, headers(token))[model]
136
+ patch("/#{model.pluralize}/#{id}", params, headers(token))[model]
134
137
  end
135
138
  end
136
139
 
@@ -143,10 +146,6 @@ module PredicsisMlSdk
143
146
  'Authorization' => "Bearer #{token}"
144
147
  }
145
148
  end
146
-
147
- def api_host
148
- PredicsisMlSdk.config.predicsis_api_host
149
- end
150
149
  end
151
150
  end
152
151
  end
@@ -0,0 +1,70 @@
1
+ require 'predicsis_ml_sdk/upload_helper'
2
+ require 'ruby-progressbar'
3
+
4
+ module PredicsisMlSdk
5
+ class Upload
6
+ include Util
7
+ include UploadHelper
8
+
9
+ def self.start(file, token = bearer_token)
10
+ Upload.initiate.tap do |u|
11
+ u.upload(file)
12
+ end
13
+ end
14
+
15
+ def self.initiate(token = bearer_token)
16
+ data = Requests.initiate_upload(token)
17
+ new(data['id'], data['path'], token).tap do |upload|
18
+ upload.define_attributes(data)
19
+ end
20
+ end
21
+
22
+ def self.get_part_url(id, path, part_number, token = bearer_token)
23
+ new(id, path, token).get_part_url(part_number)
24
+ end
25
+
26
+ def self.complete(id, path, token = bearer_token)
27
+ new(id, path, token).complete
28
+ end
29
+
30
+ def initialize(id, path, token = bearer_token)
31
+ @id = id
32
+ @path = path
33
+ @token = token
34
+ end
35
+
36
+ def upload(file)
37
+ path = split_into_files(file)
38
+ nb_of_parts(file).times do |i|
39
+ tmp_path = path + i.to_s.rjust(5, '0')
40
+ sleep(1) until exists?(tmp_path, i, file)
41
+ Requests.upload(get_part_url(i + 1), tmp_path, i + 1)
42
+ progressbar.increment
43
+ end
44
+ Thread.new { FileUtils.rm_rf Dir.glob(path.gsub('part_', '')) }
45
+ complete
46
+ end
47
+
48
+ def get_part_url(part_number)
49
+ Requests.get_part_url(token, id, part_number, path)['part_url']
50
+ end
51
+
52
+ def complete
53
+ Requests.complete_upload(token, id, path)
54
+ end
55
+
56
+ def to_h
57
+ instance_variables.each_with_object({}) do |var, hash|
58
+ hash[var.to_s.delete("@")] = instance_variable_get(var) unless var.to_s == '@token'
59
+ end
60
+ end
61
+
62
+ def path
63
+ @path ||= defined?(key) ? key : object
64
+ end
65
+
66
+ def progressbar
67
+ @progressbar ||= ProgressBar.create(format: '|%b>%i| %p%% %t', starting_at: 0, :total => @nb_of_parts)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,32 @@
1
+ module PredicsisMlSdk
2
+ module UploadHelper
3
+ OFFSET = 52_428_800
4
+
5
+ def nb_of_parts(file)
6
+ @nb_of_parts ||= (File.size(file).to_f / OFFSET).ceil
7
+ end
8
+
9
+ def split_into_files(file_path, offset = OFFSET)
10
+ dir = "tmp/multiparts/#{Time.now.to_i}"
11
+ FileUtils.mkdir_p(dir)
12
+ path = dir + '/part_'
13
+ Thread.new(abort_on_exception: true) do
14
+ nb_of_parts(file_path).times do |i|
15
+ File.open(path + i.to_s.rjust(5, '0'), 'wb') do |tmp_file|
16
+ tmp_file.write(IO.binread(file_path, offset, offset * i))
17
+ end
18
+ end
19
+ end
20
+ path
21
+ end
22
+
23
+ def exists?(part_path, part_number, file_path)
24
+ if @nb_of_parts == part_number + 1
25
+ File.exist?(part_path) &&
26
+ File.size(part_path) == File.size(file_path).to_f - ((@nb_of_parts - 1) * OFFSET)
27
+ else
28
+ File.exist?(part_path) && File.size(part_path) == OFFSET
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,3 +1,3 @@
1
1
  module PredicsisMlSdk
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: predicsis_ml_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Armand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-26 00:00:00.000000000 Z
11
+ date: 2016-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -51,25 +51,19 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: 2.7.1
53
53
  - !ruby/object:Gem::Dependency
54
- name: httmultiparty
54
+ name: rest-client
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: '0.3'
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: 0.3.16
59
+ version: '1.8'
63
60
  type: :runtime
64
61
  prerelease: false
65
62
  version_requirements: !ruby/object:Gem::Requirement
66
63
  requirements:
67
64
  - - "~>"
68
65
  - !ruby/object:Gem::Version
69
- version: '0.3'
70
- - - ">="
71
- - !ruby/object:Gem::Version
72
- version: 0.3.16
66
+ version: '1.8'
73
67
  - !ruby/object:Gem::Dependency
74
68
  name: nokogiri
75
69
  requirement: !ruby/object:Gem::Requirement
@@ -90,6 +84,26 @@ dependencies:
90
84
  - - ">="
91
85
  - !ruby/object:Gem::Version
92
86
  version: 1.6.3
87
+ - !ruby/object:Gem::Dependency
88
+ name: ruby-progressbar
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.7'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.7.3
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.7'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.7.3
93
107
  description: 'PredicSis ML SDK is the official SDK for PredicSis API: http://launch.predicsis.com/'
94
108
  email:
95
109
  - armand.bourquin@predicsis.com
@@ -102,7 +116,6 @@ files:
102
116
  - lib/predicsis_ml_sdk/configuration.rb
103
117
  - lib/predicsis_ml_sdk/core_ext.rb
104
118
  - lib/predicsis_ml_sdk/core_ext/string.rb
105
- - lib/predicsis_ml_sdk/credentials.rb
106
119
  - lib/predicsis_ml_sdk/data_file.rb
107
120
  - lib/predicsis_ml_sdk/dataset.rb
108
121
  - lib/predicsis_ml_sdk/dictionary.rb
@@ -115,6 +128,8 @@ files:
115
128
  - lib/predicsis_ml_sdk/report.rb
116
129
  - lib/predicsis_ml_sdk/requests.rb
117
130
  - lib/predicsis_ml_sdk/source.rb
131
+ - lib/predicsis_ml_sdk/upload.rb
132
+ - lib/predicsis_ml_sdk/upload_helper.rb
118
133
  - lib/predicsis_ml_sdk/util.rb
119
134
  - lib/predicsis_ml_sdk/variable.rb
120
135
  - lib/predicsis_ml_sdk/version.rb
@@ -1,25 +0,0 @@
1
- module PredicsisMlSdk
2
- class Credentials
3
- include Util
4
-
5
- def self.get(type = 's3', token = bearer_token)
6
- new(token).get(type)
7
- end
8
-
9
- def initialize(token = bearer_token)
10
- @token = token
11
- end
12
-
13
- def get(type = 's3')
14
- data = Requests.get_credentials(type, token)
15
- define_attributes(data)
16
- self
17
- end
18
-
19
- def to_h
20
- instance_variables.each_with_object({}) do |var, hash|
21
- hash[var.to_s.delete("@")] = instance_variable_get(var) unless var.to_s == '@token'
22
- end
23
- end
24
- end
25
- end