domoscio_rails 0.3.4 → 0.3.8

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
  SHA256:
3
- metadata.gz: efcd54188f9c196af4bcfe979c6979d40eeabed22b8fb9313c0b1e96b2ef9415
4
- data.tar.gz: d1070f84b35a299e2fa4a4d528c42c5230b33718defe5f3fab6309091d04aa96
3
+ metadata.gz: 843d2aaa033b798f0fca1763630df19f72952291e71fac2ac4bc5a4bf8f23424
4
+ data.tar.gz: 1cfe0284cc12660155bedc5aed80d96bbb4a420e0e11d72480de29cb6f068982
5
5
  SHA512:
6
- metadata.gz: 18ec7ba3d002ab25a50fb05bc0b1f12d59dfa2f1f8856805de6ec7c3ebc4709740905339f322082b28f60d6747aec5049c70cb09c765751e63c483b3188e0ff1
7
- data.tar.gz: 51fa1d938065643659e2dbe404295c88416ab9bb8a4a5d444e21b06aa6a066101ff0eff8cf45260d78e04ce71084295b55db160c5a451a7d382d7a6787c2dc36
6
+ metadata.gz: 7c5e3c8bbaebb0197aaed4b4f70f3aa56e9e14a047b683b40df7c27b5eb12b8ab46346b7ad14300de747aa6b9d350de574143928db115de5dab74f32ca84c2bb
7
+ data.tar.gz: 932e4a3432820545c4a4ff966ca168fe1be9e554f655f71b59046d9f0af82231b9009e0dfabcbcb70f161b43114757db58b201cb26f122d97d5bab11a4ee31f5
@@ -13,6 +13,7 @@ require 'domoscio_rails/resource'
13
13
  require 'domoscio_rails/data/content.rb'
14
14
  require 'domoscio_rails/data/event.rb'
15
15
  require 'domoscio_rails/data/instance.rb'
16
+ require 'domoscio_rails/data/recommendation.rb'
16
17
  require 'domoscio_rails/data/learning_session.rb'
17
18
  require 'domoscio_rails/data/student.rb'
18
19
  require 'domoscio_rails/knowledge/knowledge_edge.rb'
@@ -38,11 +39,11 @@ module DomoscioRails
38
39
 
39
40
  # Refers to AdaptiveEngine Version
40
41
  def version
41
- @version || 2
42
+ @version ||= 2
42
43
  end
43
44
 
44
45
  def root_url
45
- @root_url || ""
46
+ @root_url ||= ""
46
47
  end
47
48
  end
48
49
 
@@ -63,42 +64,44 @@ module DomoscioRails
63
64
  # - +method+: HTTP method; lowercase symbol, e.g. :get, :post etc.
64
65
  # - +url+: the part after Configuration#root_url
65
66
  # - +params+: hash; entity data for creation, update etc.; will dump it by JSON and assign to Net::HTTPRequest#body
66
- # - +filters+: hash; pagination params etc.; will encode it by URI and assign to URI#query
67
- # - +headers+: hash; request_headers by default
68
- # - +before_request_proc+: optional proc; will call it passing the Net::HTTPRequest instance just before Net::HTTPRequest#request
69
67
  #
70
- # Raises DomoscioRails::ResponseError if response code != 200.
68
+ # Performs HTTP requests to Adaptive Engine
69
+ # On token issues, will try once to get a new token then will output a DomoscioRails::ReponseError with details
71
70
  #
72
- def self.request(method, url, params={}, filters={}, headers = request_headers, before_request_proc = nil)
73
- return false if @disabled
74
- #sets a default page size of 50
75
- params.merge!({'per_page': 50}) unless params['per_page']
71
+ # Raises DomoscioRails::ResponseError on Adaptive Error Status
72
+ # Raises DomoscioRails::ProcessingError on Internal Error
73
+ #
74
+ def self.request(method, url, params={})
75
+
76
+ store_tokens, headers = request_headers
77
+ params.merge!({'per_page': 2000}) unless params[:per_page]
76
78
  uri = api_uri(url)
77
- uri.query = URI.encode_www_form(filters) unless filters.empty?
78
- res = DomoscioRails.send_request(uri, method, params, headers, before_request_proc)
79
- return res if res.kind_of? DomoscioRails::ProcessingError
79
+
80
+ response = DomoscioRails.send_request(uri, method, params, headers)
81
+ return response if response.kind_of? DomoscioRails::ProcessingError
82
+
80
83
  begin
81
- raise_http_failure(uri, res, params)
82
- data = DomoscioRails::JSON.load(res.body.nil? ? '' : res.body)
83
- DomoscioRails::AuthorizationToken::Manager.storage.store({access_token: res['Accesstoken'], refresh_token: res['Refreshtoken']})
84
+ raise_http_failure(uri, response, params)
85
+ data = DomoscioRails::JSON.load(response.body.nil? ? '' : response.body)
86
+ DomoscioRails::AuthorizationToken::Manager.storage.store({access_token: response['Accesstoken'], refresh_token: response['Refreshtoken']}) if store_tokens
84
87
  rescue MultiJson::LoadError => exception
85
- data = ProcessingError.new(uri, 500, exception, res.body, params)
88
+ data = ProcessingError.new(uri, 500, exception, response.body, params)
86
89
  rescue ResponseError => exception
87
90
  data = exception
88
91
  end
89
92
 
90
- if res['Total'] && !filters[:page]
91
- pagetotal = (res['Total'].to_i / res['Per-Page'].to_f).ceil
93
+ if response['Total']
94
+ pagetotal = (response['Total'].to_i / response['Per-Page'].to_f).ceil
92
95
  for j in 2..pagetotal
93
- res = DomoscioRails.send_request(uri, method, params.merge({page: j}), headers, before_request_proc)
94
- return res if res.kind_of? DomoscioRails::ProcessingError
96
+ response = DomoscioRails.send_request(uri, method, params.merge({page: j}), headers)
97
+ return response if response.kind_of? DomoscioRails::ProcessingError
95
98
  begin
96
- raise_http_failure(uri, res, params)
97
- body = DomoscioRails::JSON.load(res.body.nil? ? '' : res.body)
99
+ raise_http_failure(uri, response, params)
100
+ body = DomoscioRails::JSON.load(response.body.nil? ? '' : response.body)
98
101
  data += body
99
102
  data.flatten!
100
103
  rescue MultiJson::LoadError => exception
101
- return ProcessingError.new(uri, 500, exception, res.body, params)
104
+ return ProcessingError.new(uri, 500, exception, response.body, params)
102
105
  rescue ResponseError => exception
103
106
  return exception
104
107
  end
@@ -107,32 +110,52 @@ module DomoscioRails
107
110
  data
108
111
  end
109
112
 
110
- def self.send_request(uri, method, params, headers, before_request_proc)
113
+ private
114
+
115
+ # This function catches usual Http errors during calls
116
+ #
117
+ def self.send_request(uri, method, params, headers)
111
118
  begin
112
- res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
113
- req = Net::HTTP::const_get(method.capitalize).new(uri.request_uri, headers)
114
- req.body = DomoscioRails::JSON.dump(params)
115
- before_request_proc.call(req) if before_request_proc
116
- http.request req
117
- end
119
+ response = perform_call(uri, method, params, headers)
120
+ response = retry_call_and_store_tokens(uri, method, params, headers) if ['401','403'].include? response.code
121
+ response
118
122
  rescue Timeout::Error, Errno::EINVAL, Errno::ECONNREFUSED, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => exception
119
- ProcessingError.new(uri, 500, exception, res)
123
+ ProcessingError.new(uri, 500, exception, response)
120
124
  end
121
125
  end
122
126
 
123
- private
124
-
125
- def self.raise_http_failure(uri, res, params)
126
- unless res.kind_of? Net::HTTPSuccess
127
- if res.blank?
127
+ # This helper will check the response status and build the correcponding DomoscioRails::ResponseError
128
+ #
129
+ def self.raise_http_failure(uri, response, params)
130
+ unless response.kind_of? Net::HTTPSuccess
131
+ if response.blank?
128
132
  raise ResponseError.new(uri, 500, {error: {status: 500, message: 'AdaptiveEngine not available'}}, {}, params)
129
133
  else
130
- body = DomoscioRails::JSON.load((res.body.nil? ? '' : res.body), :symbolize_keys => true)
131
- raise ResponseError.new(uri, res.code.to_i, body, res.body, params)
134
+ body = {error: {status: response.code, message: DomoscioRails::JSON.load((response.body.nil? ? '' : response.body), :symbolize_keys => true)}}
135
+ raise ResponseError.new(uri, response.code.to_i, body, response.body, params)
132
136
  end
133
137
  end
134
138
  end
135
139
 
140
+ # Actual HTTP call is performed here
141
+ #
142
+ def self.perform_call(uri, method, params, headers)
143
+ Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
144
+ req = Net::HTTP::const_get(method.capitalize).new(uri.request_uri, headers)
145
+ req.body = DomoscioRails::JSON.dump(params)
146
+ http.request req
147
+ end
148
+ end
149
+
150
+ # This method is called when AdaptiveEngine returns tokens errors
151
+ # Action on those errors is to retry and request new tokens, those new token are then stored
152
+ def self.retry_call_and_store_tokens(uri, method, params, headers)
153
+ headers = request_new_tokens
154
+ response = perform_call(uri, method, params, headers)
155
+ DomoscioRails::AuthorizationToken::Manager.storage.store({access_token: response['Accesstoken'], refresh_token: response['Refreshtoken']})
156
+ response
157
+ end
158
+
136
159
  def self.user_agent
137
160
  @uname ||= get_uname
138
161
  {
@@ -150,22 +173,39 @@ module DomoscioRails
150
173
  'uname lookup failed'
151
174
  end
152
175
 
176
+ # Process the token loading and analyze
177
+ # will return the processed headers and a token store flag
178
+ #
153
179
  def self.request_headers
154
- auth_token = DomoscioRails::AuthorizationToken::Manager.get_token
155
- if !auth_token.is_a? String
156
- headers = {
157
- 'user_agent' => "#{DomoscioRails.user_agent}",
158
- 'AccessToken' => "#{auth_token[:access_token]}",
159
- 'RefreshToken' => "#{auth_token[:refresh_token]}",
160
- 'Content-Type' => 'application/json'
161
- }
162
- else
163
- headers = {
164
- 'user_agent' => "#{DomoscioRails.user_agent}",
165
- 'Authorization' => "Token token=#{DomoscioRails.configuration.client_passphrase}",
166
- 'Content-Type' => 'application/json'
167
- }
180
+ begin
181
+ auth_token = DomoscioRails::AuthorizationToken::Manager.get_token
182
+ if auth_token && auth_token[:access_token] && auth_token[:refresh_token]
183
+ [false, send_current_tokens(auth_token)]
184
+ else
185
+ [true, request_new_tokens]
186
+ end
187
+ rescue SyntaxError, StandardError
188
+ [true, request_new_tokens]
168
189
  end
169
- headers
190
+ end
191
+
192
+ # If stored token successfully loaded we build the header with them
193
+ #
194
+ def self.send_current_tokens(auth_token)
195
+ {
196
+ 'user_agent' => "#{DomoscioRails.user_agent}",
197
+ 'AccessToken' => "#{auth_token[:access_token]}",
198
+ 'RefreshToken' => "#{auth_token[:refresh_token]}",
199
+ 'Content-Type' => 'application/json'
200
+ }
201
+ end
202
+
203
+ # If we cant find tokens of they are corrupted / expired, then we set headers to request new ones
204
+ def self.request_new_tokens
205
+ {
206
+ 'user_agent' => "#{DomoscioRails.user_agent}",
207
+ 'Authorization' => "Token token=#{DomoscioRails.configuration.client_passphrase}",
208
+ 'Content-Type' => 'application/json'
209
+ }
170
210
  end
171
211
  end
@@ -11,9 +11,7 @@ module DomoscioRails
11
11
  end
12
12
 
13
13
  def get_token
14
- token = storage.get
15
- token = DomoscioRails.configuration.client_passphrase if token.nil?
16
- token
14
+ storage.get
17
15
  end
18
16
  end
19
17
  end
@@ -29,13 +27,9 @@ module DomoscioRails
29
27
 
30
28
  class FileStorage
31
29
  require 'yaml'
32
- @temp_dir
33
30
 
34
- def initialize(temp_dir = nil)
35
- @temp_dir = temp_dir || DomoscioRails.configuration.temp_dir
36
- if !@temp_dir
37
- raise "Path to temporary folder is not defined"
38
- end
31
+ def initialize
32
+ raise "Path to temporary folder is not defined" unless DomoscioRails.configuration.temp_dir
39
33
  end
40
34
 
41
35
  def get
@@ -60,8 +54,7 @@ module DomoscioRails
60
54
  end
61
55
 
62
56
  def file_path
63
- @temp_dir = DomoscioRails.configuration.temp_dir
64
- File.join(@temp_dir, "DomoscioRails.AuthorizationToken.FileStore.tmp")
57
+ File.join(DomoscioRails.configuration.temp_dir, "DomoscioRails.AuthorizationToken.FileStore.tmp")
65
58
  end
66
59
  end
67
60
  end
@@ -1,10 +1,11 @@
1
1
  module DomoscioRails
2
- # A Content.
3
2
  class Content < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
8
  include DomoscioRails::HTTPCalls::Util
9
+
9
10
  end
10
11
  end
@@ -1,5 +1,4 @@
1
1
  module DomoscioRails
2
- # A Student Result on a KnowledgeNode.
3
2
  class Event < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A company.
3
2
  class Instance < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::UpdateSelf
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,10 +1,10 @@
1
1
  module DomoscioRails
2
- # A LearningSession is basicly a group of events.
3
2
  class LearningSession < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
6
5
  include DomoscioRails::HTTPCalls::Fetch
7
6
  include DomoscioRails::HTTPCalls::Destroy
7
+ include DomoscioRails::HTTPCalls::Util
8
8
 
9
9
  end
10
10
  end
@@ -0,0 +1,7 @@
1
+ module DomoscioRails
2
+ class Recommendation < Resource
3
+
4
+ include DomoscioRails::HTTPCalls::Fetch
5
+
6
+ end
7
+ end
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A company.
3
2
  class Student < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -10,7 +10,7 @@ module DomoscioRails
10
10
  @request_url, @code, @details, @body, @request_params = request_url, code, details, body, request_params
11
11
  super(message) if message
12
12
  end
13
- def message; @details.is_a?(Hash) ? @details.dig(:error, :message) : @details; end
13
+ def message; (@details.is_a?(Hash) && @details[:error].is_a?(Hash)) ? @details.dig(:error, :message) : @details; end
14
14
  end
15
15
 
16
16
  # ProcessingError from DomoscioRails
@@ -1,5 +1,4 @@
1
1
  module DomoscioRails
2
- # A Knowledge Edge.
3
2
  class KnowledgeEdge < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
@@ -1,5 +1,4 @@
1
1
  module DomoscioRails
2
- # A Knowledge Graph.
3
2
  class KnowledgeGraph < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
@@ -1,5 +1,4 @@
1
1
  module DomoscioRails
2
- # A Knowledge Node.
3
2
  class KnowledgeNode < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A KnowledgeNodeContent.
3
2
  class KnowledgeNodeContent < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,5 +1,4 @@
1
1
  module DomoscioRails
2
- # A Knowledge Edge.
3
2
  class KnowledgeNodeStudent < Resource
4
3
 
5
4
  include DomoscioRails::HTTPCalls::Create
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # An objective.
3
2
  class Objective < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,6 +1,7 @@
1
1
  module DomoscioRails
2
- # An objective knowledge node.
3
- class ObjectiveKnowledgeNode < Resource
4
- include DomoscioRails::HTTPCalls::Fetch
5
- end
2
+ class ObjectiveKnowledgeNode < Resource
3
+
4
+ include DomoscioRails::HTTPCalls::Fetch
5
+
6
6
  end
7
+ end
@@ -1,6 +1,8 @@
1
1
  module DomoscioRails
2
- class ObjectiveKnowledgeNodeStudent < Resource
3
- include DomoscioRails::HTTPCalls::Fetch
4
- include DomoscioRails::HTTPCalls::Update
5
- end
6
- end
2
+ class ObjectiveKnowledgeNodeStudent < Resource
3
+
4
+ include DomoscioRails::HTTPCalls::Fetch
5
+ include DomoscioRails::HTTPCalls::Update
6
+
7
+ end
8
+ end
@@ -1,10 +1,11 @@
1
1
  module DomoscioRails
2
- # An objective student.
3
2
  class ObjectiveStudent < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
8
  include DomoscioRails::HTTPCalls::Util
9
+
9
10
  end
10
11
  end
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A Tag.
3
2
  class Tag < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A TagEdge.
3
2
  class TagEdge < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A TagSet.
3
2
  class TagSet < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,9 +1,10 @@
1
1
  module DomoscioRails
2
- # A Tagging.
3
2
  class Tagging < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Create
5
5
  include DomoscioRails::HTTPCalls::Fetch
6
6
  include DomoscioRails::HTTPCalls::Update
7
7
  include DomoscioRails::HTTPCalls::Destroy
8
+
8
9
  end
9
10
  end
@@ -1,6 +1,7 @@
1
1
  module DomoscioRails
2
- # A company.
3
2
  class GameplayUtil < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Util
5
+
5
6
  end
6
7
  end
@@ -1,6 +1,7 @@
1
1
  module DomoscioRails
2
- # A company.
3
- class RecommendationUtil < Resource
4
- include DomoscioRails::HTTPCalls::Util
5
- end
6
- end
2
+ class RecommendationUtil < Resource
3
+
4
+ include DomoscioRails::HTTPCalls::Util
5
+
6
+ end
7
+ end
@@ -1,6 +1,7 @@
1
1
  module DomoscioRails
2
- # A company.
3
2
  class ReviewUtil < Resource
3
+
4
4
  include DomoscioRails::HTTPCalls::Util
5
+
5
6
  end
6
7
  end
@@ -1,3 +1,3 @@
1
1
  module DomoscioRails
2
- VERSION = "0.3.4"
2
+ VERSION = "0.3.8"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: domoscio_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benoit Praly
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-02 00:00:00.000000000 Z
11
+ date: 2021-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -41,6 +41,7 @@ files:
41
41
  - lib/domoscio_rails/data/event.rb
42
42
  - lib/domoscio_rails/data/instance.rb
43
43
  - lib/domoscio_rails/data/learning_session.rb
44
+ - lib/domoscio_rails/data/recommendation.rb
44
45
  - lib/domoscio_rails/data/student.rb
45
46
  - lib/domoscio_rails/errors.rb
46
47
  - lib/domoscio_rails/http_calls.rb