predicsis_ml_sdk 0.4.0 → 0.5.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
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