crystal_sdk 1.0.1 → 1.0.2
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/Gemfile.lock +1 -1
- data/lib/crystal_sdk/profile.rb +1 -32
- data/lib/crystal_sdk/profile/errors.rb +25 -0
- data/lib/crystal_sdk/profile/request.rb +24 -5
- data/lib/crystal_sdk/version.rb +1 -1
- data/spec/crystal_sdk/profile/request_spec.rb +72 -0
- data/spec/crystal_sdk/profile_spec.rb +61 -52
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dea48c45c081f3af807b9d3d23f1c67cbc6419b
|
4
|
+
data.tar.gz: 4b7c406415da2322c4c11200f2e4fb68389e2754
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ec2f1e41105835b55dd790e543bb9ba5066f4c57a1faf0817bd578e55884041fc09a51892c61d48b64d0721c10497e56648600a1546a8616171572bc5d0c4c0
|
7
|
+
data.tar.gz: 99acff4789f52394971b2e0e9a585c76755fa6de6fae8991611a7431ecfa5e9e5ef174ba03d4a1c6099cab9cfa37bc8578cc6b47a7008067e5b8f420594ff4d0
|
data/Gemfile.lock
CHANGED
data/lib/crystal_sdk/profile.rb
CHANGED
@@ -1,30 +1,9 @@
|
|
1
1
|
require 'timeout'
|
2
|
+
require_relative 'profile/errors'
|
2
3
|
require_relative 'profile/request'
|
3
4
|
|
4
5
|
module CrystalSDK
|
5
6
|
class Profile
|
6
|
-
class NotFoundError < StandardError; end
|
7
|
-
class RateLimitHitError < StandardError; end
|
8
|
-
class UnexpectedError < StandardError; end
|
9
|
-
|
10
|
-
class NotAuthedError < StandardError
|
11
|
-
attr_reader :token
|
12
|
-
|
13
|
-
def initialize(token, msg = 'Organization Token was invalid')
|
14
|
-
@token = token
|
15
|
-
super(msg)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class NotFoundYetError < StandardError
|
20
|
-
attr_reader :request
|
21
|
-
|
22
|
-
def initialize(request, msg = 'Profile not found in time')
|
23
|
-
@request = request
|
24
|
-
super(msg)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
7
|
attr_reader :info, :recommendations
|
29
8
|
|
30
9
|
def initialize(info, recommendations)
|
@@ -56,18 +35,8 @@ module CrystalSDK
|
|
56
35
|
end
|
57
36
|
rescue Timeout::Error
|
58
37
|
raise NotFoundYetError.new(request)
|
59
|
-
|
60
|
-
rescue Nestful::ResponseError => e
|
61
|
-
check_for_error(e.response)
|
62
|
-
raise e
|
63
38
|
end
|
64
39
|
end
|
65
|
-
|
66
|
-
def check_for_error(resp)
|
67
|
-
raise RateLimitHitError if resp.code == '429'
|
68
|
-
raise NotAuthedError.new(Base.key) if resp.code == '401'
|
69
|
-
raise NotFoundError if resp.code == '404'
|
70
|
-
end
|
71
40
|
end
|
72
41
|
end
|
73
42
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CrystalSDK
|
2
|
+
class Profile
|
3
|
+
class NotFoundError < StandardError; end
|
4
|
+
class RateLimitHitError < StandardError; end
|
5
|
+
class UnexpectedError < StandardError; end
|
6
|
+
|
7
|
+
class NotAuthedError < StandardError
|
8
|
+
attr_reader :token
|
9
|
+
|
10
|
+
def initialize(token, msg = 'Organization Token was invalid')
|
11
|
+
@token = token
|
12
|
+
super(msg)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class NotFoundYetError < StandardError
|
17
|
+
attr_reader :request
|
18
|
+
|
19
|
+
def initialize(request, msg = 'Profile not found in time')
|
20
|
+
@request = request
|
21
|
+
super(msg)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -10,17 +10,36 @@ module CrystalSDK
|
|
10
10
|
@id = id
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
class << self
|
14
|
+
def from_search(query)
|
15
|
+
begin
|
16
|
+
resp = Api.make_request(:post, 'profile_search/async', params: query)
|
17
|
+
rescue Nestful::ResponseError => e
|
18
|
+
check_for_error(e.response)
|
19
|
+
raise e
|
20
|
+
end
|
16
21
|
|
17
|
-
|
22
|
+
body = JSON.parse(resp.body || '{}', symbolize_names: true)
|
23
|
+
Profile::Request.new(body[:request_id])
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_for_error(resp)
|
27
|
+
raise Profile::RateLimitHitError if resp.code == '429'
|
28
|
+
raise Profile::NotAuthedError.new(Base.key) if resp.code == '401'
|
29
|
+
raise Profile::NotFoundError if resp.code == '404'
|
30
|
+
end
|
18
31
|
end
|
19
32
|
|
20
33
|
def fetch_request_info
|
21
34
|
return @cached_data if @cached_data
|
22
35
|
|
23
|
-
|
36
|
+
begin
|
37
|
+
resp = Api.make_request(:get, "results/#{@id}")
|
38
|
+
rescue Nestful::ResponseError => e
|
39
|
+
Request.check_for_error(e.response)
|
40
|
+
raise e
|
41
|
+
end
|
42
|
+
|
24
43
|
body = resp.body ? JSON.parse(resp.body, symbolize_names: true) : nil
|
25
44
|
|
26
45
|
if body[:status] == 'complete' || body[:status] == 'error'
|
data/lib/crystal_sdk/version.rb
CHANGED
@@ -22,6 +22,17 @@ describe CrystalSDK::Profile::Request do
|
|
22
22
|
|
23
23
|
expect { subject }.to raise_error('SomeRandomError')
|
24
24
|
end
|
25
|
+
|
26
|
+
it 'should pass Nestful exceptions to check_for_error' do
|
27
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
28
|
+
.with(request_type, endpoint, params: query)
|
29
|
+
.and_raise(Nestful::ResponseError.new(nil, nil))
|
30
|
+
|
31
|
+
expect(CrystalSDK::Profile::Request).to receive(:check_for_error)
|
32
|
+
.and_raise('CheckForErrorCalled')
|
33
|
+
|
34
|
+
expect { subject }.to raise_error('CheckForErrorCalled')
|
35
|
+
end
|
25
36
|
end
|
26
37
|
|
27
38
|
context 'CrystalSDK::Api returns invalid json body' do
|
@@ -249,4 +260,65 @@ describe CrystalSDK::Profile::Request do
|
|
249
260
|
end
|
250
261
|
end
|
251
262
|
end
|
263
|
+
|
264
|
+
describe '.check_for_error' do
|
265
|
+
subject { CrystalSDK::Profile::Request.check_for_error(resp) }
|
266
|
+
|
267
|
+
context '200' do
|
268
|
+
let(:resp) do
|
269
|
+
double(code: '200')
|
270
|
+
end
|
271
|
+
|
272
|
+
it 'should raise no error' do
|
273
|
+
expect { subject }.to_not raise_error
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
context '202' do
|
278
|
+
let(:resp) { double(code: '202') }
|
279
|
+
|
280
|
+
it 'should raise no error' do
|
281
|
+
expect { subject }.to_not raise_error
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
context '401' do
|
286
|
+
let(:resp) { double(code: '401') }
|
287
|
+
|
288
|
+
before(:each) do
|
289
|
+
@orig_key = CrystalSDK.key
|
290
|
+
CrystalSDK.key = 'SomeKey'
|
291
|
+
end
|
292
|
+
|
293
|
+
after(:each) do
|
294
|
+
CrystalSDK.key = @orig_key
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'should raise NotAuthedError' do
|
298
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotAuthedError)
|
299
|
+
|
300
|
+
begin
|
301
|
+
subject
|
302
|
+
rescue CrystalSDK::Profile::NotAuthedError => e
|
303
|
+
expect(e.token).to eql('SomeKey')
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
context '404' do
|
309
|
+
let(:resp) { double(code: '404') }
|
310
|
+
|
311
|
+
it 'should raise NotFoundError' do
|
312
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotFoundError)
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
context '429' do
|
317
|
+
let(:resp) { double(code: '429') }
|
318
|
+
|
319
|
+
it 'should raise RateLimitHitError' do
|
320
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::RateLimitHitError)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
252
324
|
end
|
@@ -43,20 +43,10 @@ describe CrystalSDK::Profile do
|
|
43
43
|
.and_return(req)
|
44
44
|
|
45
45
|
allow(req).to receive(:did_finish?)
|
46
|
-
.and_raise(
|
46
|
+
.and_raise(StandardError.new)
|
47
47
|
end
|
48
48
|
|
49
|
-
it 'should
|
50
|
-
expect(CrystalSDK::Profile).to receive(:check_for_error)
|
51
|
-
.and_raise('CheckForErrorCalled')
|
52
|
-
|
53
|
-
expect { subject }.to raise_error('CheckForErrorCalled')
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'should still raise exception if passed check_for_error' do
|
57
|
-
expect(CrystalSDK::Profile).to receive(:check_for_error)
|
58
|
-
.and_return(nil)
|
59
|
-
|
49
|
+
it 'should raise exception' do
|
60
50
|
expect { subject }.to raise_error
|
61
51
|
end
|
62
52
|
end
|
@@ -78,7 +68,7 @@ describe CrystalSDK::Profile do
|
|
78
68
|
end
|
79
69
|
|
80
70
|
context 'request did not finish before timeout expired' do
|
81
|
-
subject { CrystalSDK::Profile.search(query, timeout:
|
71
|
+
subject { CrystalSDK::Profile.search(query, timeout: 0.01) }
|
82
72
|
|
83
73
|
before(:each) do
|
84
74
|
allow(CrystalSDK::Profile::Request).to receive(:from_search)
|
@@ -100,66 +90,85 @@ describe CrystalSDK::Profile do
|
|
100
90
|
end
|
101
91
|
end
|
102
92
|
end
|
103
|
-
end
|
104
93
|
|
105
|
-
|
106
|
-
|
94
|
+
context 'ApiSDK threw errors during initial request creation' do
|
95
|
+
context '401 error' do
|
96
|
+
before(:each) do
|
97
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
98
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
99
|
+
end
|
100
|
+
let(:resp) { OpenStruct.new(code: '401') }
|
107
101
|
|
108
|
-
|
109
|
-
|
110
|
-
|
102
|
+
it 'should raise NotAuthedError' do
|
103
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotAuthedError)
|
104
|
+
end
|
111
105
|
end
|
112
106
|
|
113
|
-
|
114
|
-
|
107
|
+
context '404 error' do
|
108
|
+
before(:each) do
|
109
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
110
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
111
|
+
end
|
112
|
+
let(:resp) { OpenStruct.new(code: '404') }
|
113
|
+
|
114
|
+
it 'should raise NotFoundError' do
|
115
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotFoundError)
|
116
|
+
end
|
115
117
|
end
|
116
|
-
end
|
117
118
|
|
118
|
-
|
119
|
-
|
119
|
+
context '429 error' do
|
120
|
+
before(:each) do
|
121
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
122
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
123
|
+
end
|
124
|
+
let(:resp) { OpenStruct.new(code: '429') }
|
120
125
|
|
121
|
-
|
122
|
-
|
126
|
+
it 'should raise RateLimitHitError' do
|
127
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::RateLimitHitError)
|
128
|
+
end
|
123
129
|
end
|
124
130
|
end
|
125
131
|
|
126
|
-
context '
|
127
|
-
|
132
|
+
context 'ApiSDK threw errors during polling' do
|
133
|
+
context '401 error' do
|
134
|
+
before(:each) do
|
135
|
+
allow(CrystalSDK::Profile::Request).to receive(:from_search)
|
136
|
+
.and_return(CrystalSDK::Profile::Request.new('some_id'))
|
128
137
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
138
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
139
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
140
|
+
end
|
141
|
+
let(:resp) { OpenStruct.new(code: '401') }
|
133
142
|
|
134
|
-
|
135
|
-
|
143
|
+
it 'should raise NotAuthedError' do
|
144
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotAuthedError)
|
145
|
+
end
|
136
146
|
end
|
137
147
|
|
138
|
-
|
139
|
-
|
148
|
+
context '404 error' do
|
149
|
+
before(:each) do
|
150
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
151
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
152
|
+
end
|
153
|
+
let(:resp) { OpenStruct.new(code: '404') }
|
140
154
|
|
141
|
-
|
142
|
-
subject
|
143
|
-
rescue CrystalSDK::Profile::NotAuthedError => e
|
144
|
-
expect(e.token).to eql('SomeKey')
|
155
|
+
it 'should raise NotFoundError' do
|
156
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::NotFoundError)
|
145
157
|
end
|
146
158
|
end
|
147
|
-
end
|
148
159
|
|
149
|
-
|
150
|
-
|
160
|
+
context '429 error' do
|
161
|
+
before(:each) do
|
162
|
+
allow(CrystalSDK::Api).to receive(:make_request)
|
163
|
+
.and_raise(Nestful::ResponseError.new(nil, resp))
|
164
|
+
end
|
165
|
+
let(:resp) { OpenStruct.new(code: '429') }
|
151
166
|
|
152
|
-
|
153
|
-
|
167
|
+
it 'should raise RateLimitHitError' do
|
168
|
+
expect { subject }.to raise_error(CrystalSDK::Profile::RateLimitHitError)
|
169
|
+
end
|
154
170
|
end
|
155
171
|
end
|
156
172
|
|
157
|
-
context '429' do
|
158
|
-
let(:resp) { double(code: '429') }
|
159
|
-
|
160
|
-
it 'should raise RateLimitHitError' do
|
161
|
-
expect { subject }.to raise_error(CrystalSDK::Profile::RateLimitHitError)
|
162
|
-
end
|
163
|
-
end
|
164
173
|
end
|
165
174
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crystal_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cory Finger
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- lib/crystal_sdk/api.rb
|
87
87
|
- lib/crystal_sdk/base.rb
|
88
88
|
- lib/crystal_sdk/profile.rb
|
89
|
+
- lib/crystal_sdk/profile/errors.rb
|
89
90
|
- lib/crystal_sdk/profile/request.rb
|
90
91
|
- lib/crystal_sdk/version.rb
|
91
92
|
- spec/crystal_sdk/api_spec.rb
|