algorithmia 0.9.4 → 1.0.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 +4 -4
- data/README.md +137 -120
- data/lib/algorithmia.rb +2 -2
- data/lib/algorithmia/algorithm.rb +11 -30
- data/lib/algorithmia/data_file.rb +1 -12
- data/lib/algorithmia/errors.rb +9 -1
- data/lib/algorithmia/requester.rb +30 -47
- data/lib/algorithmia/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58520146bbbd4bf21f0d0c7c7accc707d70c4026
|
4
|
+
data.tar.gz: 3833bedd5cc9467ab53359501e0604da85df5b9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 18d2c1fe796f70c1c61ca7d59b0cb7545c8f3ff4ab0ef96ea525826485654f7bc2974821e6995cacc3c5fa63d7cb8872e8a15187c0e1301483babbee8b35e541
|
7
|
+
data.tar.gz: 967c7bdea28778abb6777dc15f9318e145919be74621a12c07931659662739a25b10a54afd1c1965c4a74687271d41a4cd64dddd0f1032cc9ac5a388d1a51a8d
|
data/README.md
CHANGED
@@ -4,172 +4,192 @@ The Algorithmia Ruby client is a wrapper for making calls to the Algorithmia API
|
|
4
4
|
|
5
5
|
With Algorithmia, you can leverage algorithms written in any language by including them in your Ruby project with a simple API call! Browse the collection of algorithms available on [Algorithmia.com](http://algorithmia.com).
|
6
6
|
|
7
|
-
##
|
8
|
-
|
7
|
+
## Getting started
|
8
|
+
|
9
|
+
The Algorithmia ruby client is [available on rubygems](https://rubygems.org/gems/algorithmia).
|
10
|
+
Simply add `gem 'algorithmia'` to your application's Gemfile and run `bundle install`.
|
11
|
+
|
12
|
+
Then create an Algorithmia client and authenticate with your API key:
|
9
13
|
|
10
14
|
```ruby
|
11
|
-
|
15
|
+
require 'algorithmia'
|
16
|
+
|
17
|
+
client = Algorithmia.client('YOUR_API_KEY')
|
12
18
|
```
|
13
19
|
|
14
|
-
|
20
|
+
You are now ready to call algorithms.
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
|
22
|
+
## Calling algorithms
|
23
|
+
|
24
|
+
The following examples of calling algorithms are organized by type of input/output which vary between algorithms.
|
25
|
+
|
26
|
+
Note: a single algorithm may have different input and output types, or accept multiple types of input,
|
27
|
+
so consult the algorithm's description for usage examples specific to that algorithm.
|
28
|
+
|
29
|
+
### Text input/output
|
30
|
+
|
31
|
+
Call an algorithm with text input by simply passing a string into its `pipe` method.
|
32
|
+
If the algorithm output is text, then the result field of the response will be a string.
|
19
33
|
|
20
|
-
|
21
|
-
|
22
|
-
|
34
|
+
```ruby
|
35
|
+
algo = client.algo('demo/Hello/0.1.1')
|
36
|
+
puts algo.pipe('HAL 9000').result
|
37
|
+
# -> Hello HAL 900
|
23
38
|
```
|
24
39
|
|
25
|
-
|
40
|
+
### JSON input/output
|
26
41
|
|
27
|
-
|
42
|
+
Call an algorithm with JSON input by simply passing in a type that can be serialized to JSON, like an `Array` or `Hash`.
|
43
|
+
For algorithms that return JSON, the result field of the response will be the appropriate deserialized type.
|
28
44
|
|
29
45
|
```ruby
|
30
|
-
|
46
|
+
algo = client.algo('WebPredict/ListAnagrams/0.1.0')
|
47
|
+
result = algo.pipe(["transformer", "terraforms", "retransform"]).result
|
48
|
+
# -> ["transformer","retransform"]
|
49
|
+
```
|
31
50
|
|
32
|
-
|
33
|
-
client = Algorithmia.client('YOUR_API_KEY')
|
51
|
+
Alternatively, if your input is already serialized to JSON, you may call `pipe_json`:
|
34
52
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
#
|
53
|
+
```ruby
|
54
|
+
algo = client.algo('WebPredict/ListAnagrams/0.1.0')
|
55
|
+
result = algo.pipe_json('["transformer", "terraforms", "retransform"]').result
|
56
|
+
# -> ["transformer","retransform"]
|
39
57
|
```
|
40
58
|
|
41
|
-
###
|
59
|
+
### Binary input/output
|
42
60
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
- `set_options`: set query parameters on your request
|
61
|
+
Call an algorithm with Binary input by passing an `ASCII-8BIT`-encoded string into the `pipe` method.
|
62
|
+
Similarly, if the algorithm response is binary data, then the result field of the response will be an `ASCII-8BIT` string.
|
63
|
+
In practice, this involves working with methods like `IO.binread` and `IO.binwrite`.
|
47
64
|
|
48
65
|
```ruby
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# Pass in a hash of options to override the default query parameters
|
53
|
-
algorithm.set_options({'timeout': 500})
|
54
|
-
# => {:timeout=>500, :stdout=>false, :output=>"default"}
|
55
|
-
|
56
|
-
# Use these helper methods to enable stdout or change the timeout value
|
57
|
-
algorithm.set_timeout(500)
|
58
|
-
# => 500
|
59
|
-
algorithm.enable_stdout
|
60
|
-
# => true
|
61
|
-
algorithm
|
62
|
-
# => #<Algorithmia::Algorithm:0x007fa008b02de0 @client=Algorithmia::Client, @endpoint="demo/hello", @query_options={:timeout=>500, :stdout=>true, :output=>"default"}>
|
63
|
-
|
64
|
-
# Pass the input to the algorithm
|
65
|
-
result = algorithm.pipe('HAL 9000')
|
66
|
-
# => Hello HAL 9000
|
66
|
+
input = File.binread("/path/to/bender.png")
|
67
|
+
result = client.algo("opencv/SmartThumbnail/0.1").pipe(input).result
|
68
|
+
# -> [ASCII-8BIT string of binary data]
|
67
69
|
```
|
68
70
|
|
69
|
-
###
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
```
|
74
|
-
|
75
|
-
|
76
|
-
puts algorithm_response
|
77
|
-
# => #<Algorithmia::Response:0x007f9fc2845850 @json={:result=>0.14970585904042558, :metadata=>{:content_type=>"json", :duration=>0.0006857780000000001}}>
|
78
|
-
|
79
|
-
# Get the raw json returned from the API
|
80
|
-
puts algorithm_response.json
|
81
|
-
# => {:result=>0.14970585904042558, :metadata=>{:content_type=>"json", :duration=>0.0006857780000000001}}
|
82
|
-
|
83
|
-
# Use any one of the following helper methods to understand the response
|
84
|
-
puts algorithm_response.result
|
85
|
-
# => 0.14970585904042558
|
86
|
-
puts algorithm_response.metadata
|
87
|
-
# => {:content_type=>"json", :duration=>0.0006857780000000001}
|
88
|
-
puts algorithm_response.duration
|
89
|
-
# => 0.0006857780000000001
|
90
|
-
puts algorithm_response.content_type
|
91
|
-
# => "json"
|
92
|
-
puts algorithm_response.stdout
|
93
|
-
# => nil
|
94
|
-
puts algorithm_response.alerts
|
95
|
-
# => nil
|
71
|
+
### Error handling
|
72
|
+
|
73
|
+
API errors and Algorithm exceptions will be raised when calling `pipe`:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
client.algo('util/whoopsWrongAlgo').pipe('Hello, world!')
|
77
|
+
# -> Algorithmia::Errors::NotFoundError: algorithm algo://util/whoopsWrongAlgo not found
|
96
78
|
```
|
97
79
|
|
98
|
-
|
80
|
+
And you can rescue Algorithm errors separate from other errors:
|
99
81
|
|
100
|
-
|
82
|
+
```ruby
|
83
|
+
begin
|
84
|
+
client.algo('demo/Hello').pipe('world!')
|
85
|
+
rescue Algorithmia::Errors::AlgorithmError => e
|
86
|
+
puts "Algorithm Error: #{e.message}"
|
87
|
+
puts e.stacktrace
|
88
|
+
rescue => e
|
89
|
+
puts "Error: #{e.message}"
|
90
|
+
end
|
101
91
|
|
102
|
-
|
92
|
+
```
|
93
|
+
|
94
|
+
### Request options
|
95
|
+
|
96
|
+
The client exposes options that can configure algorithm requests.
|
97
|
+
This includes support for changing the timeout or indicating that the API should include stdout in the response.
|
103
98
|
|
104
99
|
```ruby
|
105
|
-
|
106
|
-
|
100
|
+
algo = client.algo('demo/Hello/0.1.1').set(timeout: 10, stdout: true)
|
101
|
+
response = algo.pipe('HAL 9000')
|
102
|
+
stdout = response.stdout
|
103
|
+
```
|
107
104
|
|
108
|
-
|
109
|
-
# => true
|
105
|
+
Note: `stdout: true` is ignored if you do not have access to the algorithm source.
|
110
106
|
|
111
|
-
file.exists?
|
112
|
-
# => true
|
113
107
|
|
114
|
-
|
115
|
-
file.put("This is the contents of the file.")
|
116
|
-
# => true
|
108
|
+
## Working with data
|
117
109
|
|
118
|
-
|
119
|
-
|
120
|
-
# => #<File:/var/folders/yl/vv6ws5196cvb61xzwrg8l3vm0000gp/T/test.txt20160328-94761-i8cqxg>
|
110
|
+
The Algorithmia Java client also provides a way to manage both Algorithmia hosted data
|
111
|
+
and data from Dropbox or S3 accounts that you've connected to you Algorithmia account.
|
121
112
|
|
122
|
-
file
|
123
|
-
|
113
|
+
This client provides a `DataFile` type (generally created by `client.file(uri)`)
|
114
|
+
and a `DataDir` type (generally created by `client.dir(uri)`) that provide methods for managing your data.
|
124
115
|
|
125
|
-
|
126
|
-
|
116
|
+
### Create directories
|
117
|
+
|
118
|
+
Create directories by instantiating a `DataDirectory` object and calling `create`:
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
client.dir("data://.my/robots").create
|
122
|
+
client.dir("dropbox://robots").create
|
127
123
|
```
|
128
124
|
|
129
|
-
|
125
|
+
### Upload files to a directory
|
126
|
+
|
127
|
+
Upload files by calling `put` on a `DataFile` object, or by calling `putFile` on a `DataDirectory` object.
|
130
128
|
|
131
129
|
```ruby
|
132
|
-
|
133
|
-
|
134
|
-
#
|
130
|
+
robots = client.dir("data://.my/robots")
|
131
|
+
|
132
|
+
# Upload local file
|
133
|
+
robots.put_file("/path/to/Optimus_Prime.png")
|
134
|
+
# Write a text file
|
135
|
+
robots.file("Optimus_Prime.txt").put("Leader of the Autobots")
|
136
|
+
# Write a binary file
|
137
|
+
robots.file("Optimus_Prime.key").put([71, 101, 101, 107].pack('C*'))
|
138
|
+
```
|
139
|
+
|
140
|
+
### Download contents of file
|
135
141
|
|
136
|
-
|
137
|
-
|
138
|
-
|
142
|
+
Download files by calling `get` or `get_file` on a `DataFile` object:
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
# Download file and get the file handle
|
146
|
+
t800File = client.file("data://.my/robots/T-800.png").get_file
|
139
147
|
|
140
|
-
|
141
|
-
|
148
|
+
# Get file's contents as a string
|
149
|
+
t800Text = client.file("data://.my/robots/T-800.txt").get
|
142
150
|
|
143
|
-
# Get
|
144
|
-
|
145
|
-
|
151
|
+
# Get file's contents as JSON
|
152
|
+
t800JsonString = client.file("data://.my/robots/T-800.txt").get
|
153
|
+
t800Json = JSON.parse(t800JsonString)
|
146
154
|
|
147
|
-
#
|
148
|
-
|
149
|
-
# => true
|
155
|
+
# Get file's contents as a byte array
|
156
|
+
t800Bytes = client.file("data://.my/robots/T-800.png").get
|
150
157
|
```
|
151
158
|
|
152
|
-
|
159
|
+
### Delete files and directories
|
153
160
|
|
154
|
-
|
161
|
+
Delete files and directories by calling delete on their respective `DataFile` or `DataDirectory` object.
|
162
|
+
DataDirectories take an optional `force` parameter that indicates whether the directory should be deleted
|
163
|
+
if it contains files or other directories.
|
155
164
|
|
156
165
|
```ruby
|
157
|
-
|
158
|
-
|
159
|
-
dir.
|
160
|
-
dir.each_file
|
161
|
-
# => #<Enumerator: #<Algorithmia::DataDirectory:0x007ffba89bbcd8 @client=#<Algorithmia::Client:0x007ffbab0fc798 @api_key="YOUR_API_KEY">, @data_uri="data://test_user/test_two", @url="/data/test_user/test_two">:each>
|
162
|
-
|
163
|
-
# Iterate all directory contents, each sub-directory, or each file in the directory
|
164
|
-
dir.each { |item| block }
|
165
|
-
dir.each_directory { |dir| block }
|
166
|
-
dir.each_file { |file| block }
|
166
|
+
client.file("data://.my/robots/C-3PO.txt").delete
|
167
|
+
|
168
|
+
client.dir("data://.my/robots").delete(false)
|
167
169
|
```
|
168
170
|
|
171
|
+
### List directory contents
|
169
172
|
|
170
|
-
|
173
|
+
Iterate over the contents of a directory using the iterated returned
|
174
|
+
by calling `each`, `each_directory`, or `each_file` on a `DataDirectory` object.
|
175
|
+
If no block is given to the method, an enumerator will be returned.
|
171
176
|
|
172
|
-
|
177
|
+
```ruby
|
178
|
+
# List top level directories
|
179
|
+
client.dir("data://.my").each_dir do |dir|
|
180
|
+
puts "Directory " + dir.data_uri
|
181
|
+
end
|
182
|
+
|
183
|
+
# List files in the 'robots' directory
|
184
|
+
client.dir("data://.my/robots").each_file do |file|
|
185
|
+
puts "File " + file.data_uri
|
186
|
+
end
|
187
|
+
|
188
|
+
# Iterate all directory contents
|
189
|
+
client.dir("dropbox://").each do |item|
|
190
|
+
puts file.data_uri
|
191
|
+
end
|
192
|
+
```
|
173
193
|
|
174
194
|
## Development
|
175
195
|
|
@@ -181,6 +201,3 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
181
201
|
|
182
202
|
Bug reports and pull requests are welcome on [GitHub](https://github.com/algorithmiaio/algorithmia-ruby). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
183
203
|
|
184
|
-
## Not Yet Implemented:
|
185
|
-
- Tests! :scream:
|
186
|
-
|
data/lib/algorithmia.rb
CHANGED
@@ -4,46 +4,27 @@ module Algorithmia
|
|
4
4
|
def initialize(client, endpoint)
|
5
5
|
@client = client
|
6
6
|
@endpoint = '/v1/algo/' + endpoint
|
7
|
-
@query = {
|
8
|
-
timeout: 300,
|
9
|
-
stdout: false,
|
10
|
-
output: 'default'
|
11
|
-
}
|
7
|
+
@query = {}
|
12
8
|
end
|
13
9
|
|
14
|
-
def
|
10
|
+
def set(options_hash)
|
15
11
|
@query.update(options_hash)
|
16
|
-
|
17
|
-
|
18
|
-
def set_timeout(timeout)
|
19
|
-
@query[:timeout] = timeout.to_i
|
20
|
-
end
|
21
|
-
|
22
|
-
def enable_stdout
|
23
|
-
@query[:stdout] = true
|
12
|
+
self
|
24
13
|
end
|
25
14
|
|
26
15
|
def pipe(input)
|
27
|
-
|
28
|
-
|
29
|
-
'application/octet-stream'
|
30
|
-
when input.kind_of?(String)
|
31
|
-
'text/plain'
|
32
|
-
else
|
33
|
-
'application/json'
|
34
|
-
end
|
35
|
-
|
36
|
-
headers = {
|
37
|
-
'Content-Type' => content_type
|
38
|
-
}
|
39
|
-
|
40
|
-
response = Algorithmia::Requester.new(@client).post(@endpoint, input, query: @query, headers: headers)
|
16
|
+
client_timeout = (@query[:timeout] || 300) + 10
|
17
|
+
response = Algorithmia::Requester.new(@client).post(@endpoint, input, query: @query, headers: {}, timeout: client_timeout)
|
41
18
|
Algorithmia::Response.new(response.parsed_response, @query[:output])
|
42
19
|
end
|
43
20
|
|
44
21
|
def pipe_json(input)
|
45
|
-
|
46
|
-
|
22
|
+
client_timeout = (@query[:timeout] || 300) + 10
|
23
|
+
headers = {
|
24
|
+
'Content-Type' => 'application/json'
|
25
|
+
}
|
26
|
+
response = Algorithmia::Requester.new(@client).post(@endpoint, input, query: @query, headers: headers, timeout: client_timeout)
|
27
|
+
Algorithmia::Response.new(response.parsed_response, @query[:output])
|
47
28
|
end
|
48
29
|
end
|
49
30
|
end
|
@@ -26,18 +26,7 @@ module Algorithmia
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def put(data)
|
29
|
-
|
30
|
-
when data.kind_of?(String) && data.encoding == Encoding::ASCII_8BIT
|
31
|
-
'application/octet-stream'
|
32
|
-
when data.kind_of?(String)
|
33
|
-
'text/plain'
|
34
|
-
else
|
35
|
-
'application/json'
|
36
|
-
end
|
37
|
-
|
38
|
-
headers = {'Content-Type' => content_type }
|
39
|
-
Algorithmia::Requester.new(@client).put(@url, data, headers: headers)
|
40
|
-
true
|
29
|
+
Algorithmia::Requester.new(@client).put(@url, data, headers: {})
|
41
30
|
end
|
42
31
|
|
43
32
|
alias_method :put_json, :put
|
data/lib/algorithmia/errors.rb
CHANGED
@@ -9,12 +9,20 @@ module Algorithmia
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
class AlgorithmError < Error;
|
13
|
+
attr_reader :stacktrace
|
14
|
+
def initialize(message, response, stacktrace)
|
15
|
+
super(message, response)
|
16
|
+
@stacktrace = stacktrace
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
12
20
|
class ApiKeyEmptyError < Error; end
|
13
21
|
class ApiKeyInvalidError < Error; end
|
14
22
|
class InternalServerError < Error; end
|
15
23
|
class JsonParseError < Error; end
|
16
24
|
class NotFoundError < Error; end
|
17
25
|
class UnauthorizedError < Error; end
|
18
|
-
class
|
26
|
+
class ApiError < Error; end
|
19
27
|
end
|
20
28
|
end
|
@@ -8,7 +8,6 @@ module Algorithmia
|
|
8
8
|
self.class.base_uri client.api_address
|
9
9
|
@client = client
|
10
10
|
@default_headers = {
|
11
|
-
'Content-Type' => 'application/json',
|
12
11
|
'User-Agent' => 'Algorithmia Ruby Client'
|
13
12
|
}
|
14
13
|
unless @client.api_key.nil?
|
@@ -24,14 +23,20 @@ module Algorithmia
|
|
24
23
|
response
|
25
24
|
end
|
26
25
|
|
27
|
-
def post(endpoint, body, query: {}, headers: {})
|
26
|
+
def post(endpoint, body, query: {}, headers: {}, timeout: 60)
|
28
27
|
headers = merge_headers(headers)
|
29
28
|
|
30
|
-
|
31
|
-
body
|
29
|
+
headers['Content-Type'] ||= case
|
30
|
+
when body.kind_of?(String) && body.encoding == Encoding::ASCII_8BIT
|
31
|
+
'application/octet-stream'
|
32
|
+
when body.kind_of?(String)
|
33
|
+
'text/plain'
|
34
|
+
else
|
35
|
+
body = body.to_json
|
36
|
+
'application/json'
|
32
37
|
end
|
33
38
|
|
34
|
-
response = self.class.post(endpoint, body: body, query: query, headers: headers)
|
39
|
+
response = self.class.post(endpoint, body: body, query: query, headers: headers, timeout: timeout)
|
35
40
|
check_for_errors(response)
|
36
41
|
response
|
37
42
|
end
|
@@ -39,8 +44,14 @@ module Algorithmia
|
|
39
44
|
def put(endpoint, body, query: {}, headers: {})
|
40
45
|
headers = merge_headers(headers)
|
41
46
|
|
42
|
-
|
43
|
-
body
|
47
|
+
headers['Content-Type'] ||= case
|
48
|
+
when body.kind_of?(String) && body.encoding == Encoding::ASCII_8BIT
|
49
|
+
'application/octet-stream'
|
50
|
+
when body.kind_of?(String)
|
51
|
+
'text/plain'
|
52
|
+
else
|
53
|
+
body = body.to_json
|
54
|
+
'application/json'
|
44
55
|
end
|
45
56
|
|
46
57
|
response = self.class.put(endpoint, body: body, query: query, headers: headers)
|
@@ -67,55 +78,27 @@ module Algorithmia
|
|
67
78
|
def check_for_errors(response)
|
68
79
|
if response.code >= 200 && response.code < 300
|
69
80
|
if response.is_a?(Hash) and response['error']
|
70
|
-
|
81
|
+
error = response['error']
|
82
|
+
raise Errors::AlgorithmError.new(error["message"], response, error["stacktrace"])
|
71
83
|
end
|
72
84
|
return
|
73
85
|
end
|
74
86
|
|
87
|
+
message = response.dig("error", "message") if response.is_a?(Hash)
|
75
88
|
|
76
89
|
case response.code
|
77
90
|
when 401
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
raise Errors::UnauthorizedError.new(response["error"]["message"], response)
|
82
|
-
when 400
|
83
|
-
if response.nil?
|
84
|
-
raise Errors::NotFoundError.new("The request was invalid", nil)
|
85
|
-
end
|
86
|
-
parse_error_message(response)
|
91
|
+
message ||= "The request you are making requires authorization. Please check that you have permissions & that you've set your API key."
|
92
|
+
raise Errors::UnauthorizedError.new(message, response)
|
87
93
|
when 404
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
if response.nil?
|
94
|
-
raise Errors::InternalServerError.new("Whoops! Something is broken.", nil)
|
95
|
-
end
|
96
|
-
raise Errors::InternalServerError.new(response["error"]["message"], response)
|
97
|
-
else
|
98
|
-
if response.nil?
|
99
|
-
raise Errors::UnknownError.new("An unknown error occurred", nil)
|
100
|
-
end
|
101
|
-
raise Errors::UnknownError.new("message: #{response["error"]["message"]} stacktrace: #{error["stacktrace"]}", response)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def parse_error_message(response)
|
106
|
-
error = response['error']
|
107
|
-
|
108
|
-
case error["message"]
|
109
|
-
when 'authorization required'
|
110
|
-
raise Errors::ApiKeyInvalidError.new("The API key you sent is invalid! Please set `Algorithmia::Client.api_key` with the key provided with your account.", response)
|
111
|
-
when 'Failed to parse input, input did not parse as valid json'
|
112
|
-
raise Errors::JsonParseError.new("Unable to parse the input. Please make sure it matches the expected input of the algorithm and can be parsed into JSON.", response)
|
94
|
+
message ||= "The URI requested is invalid or the resource requested does not exist."
|
95
|
+
raise Errors::NotFoundError.new(message, response)
|
96
|
+
when 500..599
|
97
|
+
message ||= "Whoops! Something is broken."
|
98
|
+
raise Errors::InternalServerError.new(message, response)
|
113
99
|
else
|
114
|
-
|
115
|
-
|
116
|
-
else
|
117
|
-
raise Errors::UnknownError.new("message: #{error["message"]} stacktrace: #{error["stacktrace"]}", response)
|
118
|
-
end
|
100
|
+
message ||= "#{response.code} - an unknown error occurred"
|
101
|
+
raise Errors::ApiError.new(message, response)
|
119
102
|
end
|
120
103
|
end
|
121
104
|
|
data/lib/algorithmia/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algorithmia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Algorithmia
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
130
|
version: '0'
|
131
131
|
requirements: []
|
132
132
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.
|
133
|
+
rubygems_version: 2.5.1
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: A Ruby client for making API calls to Algorithmia
|