algorithmia 0.9.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|