evrythng 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -2
- data/evrythng.gemspec +12 -16
- data/lib/evrythng/authenticatable.rb +21 -0
- data/lib/evrythng/client/collections.rb +6 -14
- data/lib/evrythng/client/properties.rb +45 -0
- data/lib/evrythng/client/search.rb +22 -0
- data/lib/evrythng/client/thngs.rb +20 -16
- data/lib/evrythng/client.rb +31 -6
- data/lib/evrythng/config.rb +69 -0
- data/lib/evrythng/connection.rb +22 -23
- data/lib/evrythng/core_ext/hash.rb +19 -0
- data/lib/evrythng/error/bad_gateway.rb +7 -0
- data/lib/evrythng/error/bad_request.rb +7 -0
- data/lib/evrythng/error/client_error.rb +7 -0
- data/lib/evrythng/error/enhance_your_calm.rb +11 -0
- data/lib/evrythng/error/forbidden.rb +7 -0
- data/lib/evrythng/error/internal_server_error.rb +7 -0
- data/lib/evrythng/error/not_acceptable.rb +7 -0
- data/lib/evrythng/error/not_found.rb +7 -0
- data/lib/evrythng/error/server_error.rb +7 -0
- data/lib/evrythng/error/service_unavailable.rb +7 -0
- data/lib/evrythng/error/unauthorized.rb +7 -0
- data/lib/evrythng/error.rb +10 -33
- data/lib/evrythng/request/gateway.rb +20 -0
- data/lib/evrythng/request/token_authentication.rb +22 -0
- data/lib/evrythng/request.rb +17 -17
- data/lib/evrythng/response/parse_json.rb +23 -0
- data/lib/evrythng/response/raise_client_error.rb +49 -0
- data/lib/evrythng/response/raise_server_error.rb +23 -0
- data/lib/evrythng/version.rb +1 -2
- data/lib/evrythng.rb +5 -7
- metadata +65 -96
- data/lib/evrythng/api.rb +0 -24
- data/lib/evrythng/authentication.rb +0 -25
- data/lib/evrythng/configuration.rb +0 -102
- data/lib/evrythng/search.rb +0 -173
- data/lib/faraday/request/basic_authentication.rb +0 -15
- data/lib/faraday/request/evrythng_oauth.rb +0 -24
- data/lib/faraday/request/gateway.rb +0 -18
- data/lib/faraday/request/multipart_with_file.rb +0 -34
- data/lib/faraday/response/raise_http_4xx.rb +0 -45
- data/lib/faraday/response/raise_http_5xx.rb +0 -24
data/README.md
CHANGED
@@ -9,6 +9,5 @@ This is a Ruby wrapper for the Evrythng API. Do not consider it as stable, that'
|
|
9
9
|
## Usage
|
10
10
|
|
11
11
|
Evrythng.configure do |config|
|
12
|
-
config.
|
13
|
-
config.password = 'passw0rd' # your Evrythng password
|
12
|
+
config.token = 't0ken' # your Evrythng authentication token
|
14
13
|
end
|
data/evrythng.gemspec
CHANGED
@@ -8,26 +8,22 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.version = Evrythng::VERSION.dup
|
9
9
|
s.authors = ["beawesomeinstead"]
|
10
10
|
s.email = "graf.otodrakula@gmail.com"
|
11
|
-
s.homepage = "http://github.com/bai/evrythng
|
12
|
-
s.summary = "
|
13
|
-
s.description = "A Ruby wrapper for Evrythng API.
|
11
|
+
s.homepage = "http://github.com/bai/evrythng"
|
12
|
+
s.summary = "Evrythng API wrapper"
|
13
|
+
s.description = "A Ruby wrapper for Evrythng API."
|
14
14
|
|
15
15
|
s.files = `git ls-files`.split("\n")
|
16
16
|
s.platform = Gem::Platform::RUBY
|
17
17
|
s.require_path = 'lib'
|
18
18
|
|
19
|
-
s.add_development_dependency '
|
20
|
-
s.add_development_dependency '
|
21
|
-
s.add_development_dependency '
|
22
|
-
s.add_development_dependency '
|
23
|
-
s.add_development_dependency '
|
24
|
-
s.add_development_dependency '
|
25
|
-
s.add_development_dependency 'yard', '~> 0.7'
|
26
|
-
s.add_development_dependency 'ZenTest', '~> 4.5'
|
19
|
+
s.add_development_dependency 'rake'
|
20
|
+
s.add_development_dependency 'rspec'
|
21
|
+
s.add_development_dependency 'simplecov'
|
22
|
+
s.add_development_dependency 'webmock'
|
23
|
+
s.add_development_dependency 'yard'
|
24
|
+
s.add_development_dependency 'json'
|
27
25
|
|
28
|
-
s.
|
29
|
-
s.
|
30
|
-
s.
|
31
|
-
s.add_runtime_dependency 'multi_json', '~> 1.0.0'
|
32
|
-
s.add_runtime_dependency 'simple_oauth', '~> 0.1.5'
|
26
|
+
s.add_dependency 'activesupport', ['>= 2.3.9', '< 4']
|
27
|
+
s.add_dependency 'faraday', '~> 0.8.0.rc2'
|
28
|
+
s.add_dependency 'multi_json', '~> 1.0.0'
|
33
29
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Evrythng
|
2
|
+
module Authenticatable
|
3
|
+
|
4
|
+
# Credentials hash
|
5
|
+
#
|
6
|
+
# @return [Hash]
|
7
|
+
def credentials
|
8
|
+
{
|
9
|
+
:token => token
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
# Check whether credentials are present
|
14
|
+
#
|
15
|
+
# @return [Boolean]
|
16
|
+
def credentials?
|
17
|
+
credentials.values.all?
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -4,34 +4,26 @@ module Evrythng
|
|
4
4
|
module Collections
|
5
5
|
# Returns a list of collections
|
6
6
|
#
|
7
|
-
# @format :json, :xml
|
8
|
-
# @authenticated true
|
9
|
-
# @rate_limited true
|
10
7
|
# @param options [Hash] A customizable set of options.
|
11
|
-
# @return [
|
12
|
-
# @see http://dev.evrythng.
|
8
|
+
# @return [Array] The requested list of collections.
|
9
|
+
# @see http://dev.evrythng.com/collections
|
13
10
|
# @example Return the list of collections
|
14
11
|
# Evrythng.collections
|
15
12
|
def collections(options={})
|
16
|
-
|
17
|
-
format.to_s.downcase == 'xml' ? response['collections'] : response
|
13
|
+
get('collections', options)
|
18
14
|
end
|
19
15
|
|
20
16
|
# Creates a collection
|
21
17
|
#
|
22
|
-
# @format :json, :xml
|
23
|
-
# @authenticated true
|
24
|
-
# @rate_limited false
|
25
18
|
# @param name [String] The name of collection.
|
26
19
|
# @param description [String] The description of collection.
|
27
20
|
# @param options [Hash] A customizable set of options.
|
28
|
-
# @return [
|
29
|
-
# @see http://dev.evrythng.
|
21
|
+
# @return [Hash] The created collection.
|
22
|
+
# @see http://dev.evrythng.com/collections
|
30
23
|
# @example Create the authenticating user's collection
|
31
24
|
# Evrythng.collection_create("This is a new collection!", "Here comes the description.")
|
32
25
|
def collection_create(name, description=nil, options={})
|
33
|
-
|
34
|
-
format.to_s.downcase == 'xml' ? response['collection'] : response
|
26
|
+
post('collections', options.merge(:name => name, :description => description))
|
35
27
|
end
|
36
28
|
end
|
37
29
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Evrythng
|
2
|
+
class Client
|
3
|
+
# Defines methods related to properties
|
4
|
+
module Properties
|
5
|
+
# Returns a list of properties for a given thng
|
6
|
+
#
|
7
|
+
# @param thng_id [String] The id of the thng to get properties for.
|
8
|
+
# @param options [Hash] A customizable set of options.
|
9
|
+
# @return [Array] The requested list of properties.
|
10
|
+
# @see http://dev.evrythng.com/properties
|
11
|
+
# @example Return the list of properties for thng 4f2133f39f5c550c2000016a
|
12
|
+
# Evrythng.properties('4f2133f39f5c550c2000016a')
|
13
|
+
def properties(thng_id, options={})
|
14
|
+
get("thngs/#{thng_id}/properties", options)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns a single property, specified by key
|
18
|
+
#
|
19
|
+
# @param thng_id [String] The id of the thng to get property for.
|
20
|
+
# @param key [String] The key of a property to fetch.
|
21
|
+
# @param options [Hash] A customizable set of options.
|
22
|
+
# @return [Hash] The requested property.
|
23
|
+
# @see http://dev.evrythng.com/properties
|
24
|
+
# @example Return the property with key 'Volume' for the thng with id 4f2133f39f5c550c2000016a
|
25
|
+
# Evrythng.property('4f2133f39f5c550c2000016a', 'Volume')
|
26
|
+
def property(thng_id, key, options={})
|
27
|
+
get("thngs/#{thng_id}/properties/#{key}", options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Creates a property
|
31
|
+
#
|
32
|
+
# @param thng_id [String] The id of the thng to create property for.
|
33
|
+
# @param key [String] The key of property.
|
34
|
+
# @param value [String] The value of property.
|
35
|
+
# @param options [Hash] A customizable set of options.
|
36
|
+
# @return [Hash] The created property.
|
37
|
+
# @see http://dev.evrythng.com/properties
|
38
|
+
# @example Create a property for a thng with id 4f2133f39f5c550c2000016a
|
39
|
+
# Evrythng.property_create('4f2133f39f5c550c2000016a', 'Volume', '30')
|
40
|
+
def property_create(thng_id, key, value, options={})
|
41
|
+
post("thngs/#{thng_id}/properties", options.merge(:key => key, :value => value))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Evrythng
|
2
|
+
class Client
|
3
|
+
# Defines methods related to Search
|
4
|
+
module Search
|
5
|
+
|
6
|
+
# Returns thngs that match a specified query.
|
7
|
+
#
|
8
|
+
# @see https://dev.evrythng.com/search
|
9
|
+
# @param q [String] A search term.
|
10
|
+
# @param options [Hash] A customizable set of options.
|
11
|
+
# @option options [String] :geocode Returns thngs located within a given radius of the given latitude/longitude. The parameter value is specified by "latitude,longitude,radius", where radius units must be specified as either "mi" (miles) or "km" (kilometers).
|
12
|
+
# @option options [Integer] :page The page number (starting at 1) to return.
|
13
|
+
# @option options [Integer] :per_page The number of thngs to return per page, up to a max of 100.
|
14
|
+
# @return [Array] Return thngs that match a specified query
|
15
|
+
# @example Returns thngs that contain 'bike' in their name or description
|
16
|
+
# Evrythng.search('bike')
|
17
|
+
def search(q, options={})
|
18
|
+
get('search', options.merge(:q => q))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -4,34 +4,38 @@ module Evrythng
|
|
4
4
|
module Thngs
|
5
5
|
# Returns a list of thngs
|
6
6
|
#
|
7
|
-
# @format :json, :xml
|
8
|
-
# @authenticated true
|
9
|
-
# @rate_limited true
|
10
7
|
# @param options [Hash] A customizable set of options.
|
11
|
-
# @return [
|
12
|
-
# @see http://
|
8
|
+
# @return [Array] The requested list of thngs.
|
9
|
+
# @see http://dev.evrythng.com/thngs
|
13
10
|
# @example Return the list of thngs
|
14
11
|
# Evrythng.thngs
|
15
12
|
def thngs(options={})
|
16
|
-
|
17
|
-
|
13
|
+
get('thngs', options)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns a single thng, specified by id
|
17
|
+
#
|
18
|
+
# @param id [String] The id of the desired thng.
|
19
|
+
# @param options [Hash] A customizable set of options.
|
20
|
+
# @return [Hash] The requested thng.
|
21
|
+
# @see http://dev.evrythng.com/thngs
|
22
|
+
# @example Return the thng with the id 4f2133f39f5c550c2000016a
|
23
|
+
# Evrythng.thng('4f2133f39f5c550c2000016a')
|
24
|
+
def thng(id, options={})
|
25
|
+
get("thngs/#{id}", options)
|
18
26
|
end
|
19
27
|
|
20
28
|
# Creates a thng
|
21
29
|
#
|
22
|
-
# @
|
23
|
-
# @authenticated true
|
24
|
-
# @rate_limited false
|
25
|
-
# @param identifier [String] The identifier of thng.
|
30
|
+
# @param name [String] The name of thng.
|
26
31
|
# @param description [String] The description of thng.
|
27
32
|
# @param options [Hash] A customizable set of options.
|
28
|
-
# @return [
|
29
|
-
# @see http://
|
33
|
+
# @return [Hash] The created thng.
|
34
|
+
# @see http://dev.evrythng.com/thngs
|
30
35
|
# @example Create the authenticating user's thng
|
31
36
|
# Evrythng.thng_create("my.test.thng", "Here comes the description.")
|
32
|
-
def thng_create(
|
33
|
-
|
34
|
-
format.to_s.downcase == 'xml' ? response['thng'] : response
|
37
|
+
def thng_create(name, description=nil, options={})
|
38
|
+
post('thngs', options.merge(:name => name, :description => description))
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
data/lib/evrythng/client.rb
CHANGED
@@ -1,13 +1,38 @@
|
|
1
|
+
require 'evrythng/authenticatable'
|
2
|
+
require 'evrythng/config'
|
3
|
+
require 'evrythng/connection'
|
4
|
+
require 'evrythng/request'
|
5
|
+
|
1
6
|
module Evrythng
|
2
7
|
# Wrapper for the Evrythng REST API
|
3
|
-
class Client
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
require 'evrythng/client/thngs'
|
8
|
-
require 'evrythng/client/collections'
|
8
|
+
class Client
|
9
|
+
include Evrythng::Authenticatable
|
10
|
+
include Evrythng::Connection
|
11
|
+
include Evrythng::Request
|
9
12
|
|
13
|
+
require 'evrythng/client/thngs'
|
10
14
|
include Evrythng::Client::Thngs
|
15
|
+
|
16
|
+
require 'evrythng/client/collections'
|
11
17
|
include Evrythng::Client::Collections
|
18
|
+
|
19
|
+
require 'evrythng/client/properties'
|
20
|
+
include Evrythng::Client::Properties
|
21
|
+
|
22
|
+
require 'evrythng/client/search'
|
23
|
+
include Evrythng::Client::Search
|
24
|
+
|
25
|
+
attr_accessor *Config::VALID_OPTIONS_KEYS
|
26
|
+
|
27
|
+
# Initializes a new API object
|
28
|
+
#
|
29
|
+
# @param attrs [Hash]
|
30
|
+
# @return [Evrythng::Client]
|
31
|
+
def initialize(attrs={})
|
32
|
+
attrs = Evrythng.options.merge(attrs)
|
33
|
+
Config::VALID_OPTIONS_KEYS.each do |key|
|
34
|
+
instance_variable_set("@#{key}".to_sym, attrs[key])
|
35
|
+
end
|
36
|
+
end
|
12
37
|
end
|
13
38
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'evrythng/version'
|
2
|
+
|
3
|
+
module Evrythng
|
4
|
+
# Defines constants and methods related to configuration
|
5
|
+
module Config
|
6
|
+
# An array of valid keys in the options hash when configuring a {Evrythng::API}
|
7
|
+
VALID_OPTIONS_KEYS = [
|
8
|
+
:adapter,
|
9
|
+
:connection_options,
|
10
|
+
:token,
|
11
|
+
:endpoint,
|
12
|
+
:gateway,
|
13
|
+
:proxy,
|
14
|
+
:user_agent]
|
15
|
+
|
16
|
+
# The adapter that will be used to connect if none is set
|
17
|
+
DEFAULT_ADAPTER = :net_http
|
18
|
+
|
19
|
+
# The Faraday connection options if none is set
|
20
|
+
DEFAULT_CONNECTION_OPTIONS = {}
|
21
|
+
|
22
|
+
# By default, don't set a token
|
23
|
+
DEFAULT_TOKEN = nil
|
24
|
+
|
25
|
+
# The endpoint that will be used to connect if none is set
|
26
|
+
DEFAULT_ENDPOINT = 'http://evrythng.com'
|
27
|
+
|
28
|
+
# By default, don't use a proxy server
|
29
|
+
DEFAULT_PROXY = nil
|
30
|
+
|
31
|
+
# The user agent that will be sent to the API endpoint if none is set
|
32
|
+
DEFAULT_USER_AGENT = "Evrythng Ruby Gem #{Evrythng::VERSION}"
|
33
|
+
|
34
|
+
# By default, don't use a gateway server
|
35
|
+
DEFAULT_GATEWAY = nil
|
36
|
+
|
37
|
+
# @private
|
38
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
39
|
+
|
40
|
+
# When this module is extended, set all configuration options to their default values
|
41
|
+
def self.extended(base)
|
42
|
+
base.reset
|
43
|
+
end
|
44
|
+
|
45
|
+
# Convenience method to allow configuration options to be set in a block
|
46
|
+
def configure
|
47
|
+
yield self
|
48
|
+
end
|
49
|
+
|
50
|
+
# Create a hash of options and their values
|
51
|
+
def options
|
52
|
+
options = {}
|
53
|
+
VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
|
54
|
+
options
|
55
|
+
end
|
56
|
+
|
57
|
+
# Reset all configuration options to defaults
|
58
|
+
def reset
|
59
|
+
self.adapter = DEFAULT_ADAPTER
|
60
|
+
self.connection_options = DEFAULT_CONNECTION_OPTIONS
|
61
|
+
self.token = DEFAULT_TOKEN
|
62
|
+
self.endpoint = DEFAULT_ENDPOINT
|
63
|
+
self.proxy = DEFAULT_PROXY
|
64
|
+
self.user_agent = DEFAULT_USER_AGENT
|
65
|
+
self.gateway = DEFAULT_GATEWAY
|
66
|
+
self
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/evrythng/connection.rb
CHANGED
@@ -1,38 +1,37 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
1
|
+
require 'faraday'
|
2
|
+
require 'evrythng/core_ext/hash'
|
3
|
+
require 'evrythng/request/gateway'
|
4
|
+
require 'evrythng/request/token_authentication'
|
5
|
+
require 'evrythng/response/parse_json'
|
6
|
+
require 'evrythng/response/raise_client_error'
|
7
|
+
require 'evrythng/response/raise_server_error'
|
8
8
|
|
9
9
|
module Evrythng
|
10
|
-
# @private
|
11
10
|
module Connection
|
12
11
|
private
|
13
12
|
|
14
|
-
|
15
|
-
|
13
|
+
# Returns a Faraday::Connection object
|
14
|
+
#
|
15
|
+
# @param options [Hash] A hash of options
|
16
|
+
# @return [Faraday::Connection]
|
17
|
+
def connection(options={})
|
18
|
+
default_options = {
|
16
19
|
:headers => {
|
17
|
-
:accept =>
|
18
|
-
:user_agent => user_agent
|
20
|
+
:accept => 'application/vnd.evrythng-v2+json',
|
21
|
+
:user_agent => user_agent,
|
19
22
|
},
|
20
23
|
:proxy => proxy,
|
21
24
|
:ssl => {:verify => false},
|
22
|
-
:url =>
|
25
|
+
:url => options.fetch(:endpoint, endpoint),
|
23
26
|
}
|
24
|
-
|
25
|
-
Faraday.new(options) do |builder|
|
26
|
-
builder.use Faraday::Request::MultipartWithFile
|
27
|
-
# builder.use Faraday::Request::EvrythngOAuth, authentication if authenticated?
|
28
|
-
builder.use Faraday::Request::BasicAuthentication, username, password
|
27
|
+
Faraday.new(default_options.deep_merge(connection_options)) do |builder|
|
29
28
|
builder.use Faraday::Request::Multipart
|
30
29
|
builder.use Faraday::Request::UrlEncoded
|
31
|
-
builder.use
|
32
|
-
builder.use
|
33
|
-
builder.use
|
34
|
-
builder.use
|
35
|
-
builder.use
|
30
|
+
builder.use Evrythng::Request::Gateway, gateway if gateway
|
31
|
+
builder.use Evrythng::Request::TokenAuthentication, token
|
32
|
+
builder.use Evrythng::Response::RaiseClientError
|
33
|
+
builder.use Evrythng::Response::ParseJson unless options[:raw]
|
34
|
+
builder.use Evrythng::Response::RaiseServerError
|
36
35
|
builder.adapter(adapter)
|
37
36
|
end
|
38
37
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
# Merges self with another hash, recursively
|
4
|
+
#
|
5
|
+
# @param hash [Hash] The hash to merge
|
6
|
+
# @return [Hash]
|
7
|
+
def deep_merge(hash)
|
8
|
+
target = self.dup
|
9
|
+
hash.keys.each do |key|
|
10
|
+
if hash[key].is_a?(Hash) && self[key].is_a?(Hash)
|
11
|
+
target[key] = target[key].deep_merge(hash[key])
|
12
|
+
next
|
13
|
+
end
|
14
|
+
target[key] = hash[key]
|
15
|
+
end
|
16
|
+
target
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'evrythng/error/client_error'
|
2
|
+
|
3
|
+
module Evrythng
|
4
|
+
# Raised when Evrythng returns the HTTP status code 420
|
5
|
+
class Error::EnhanceYourCalm < Evrythng::Error::ClientError
|
6
|
+
# The number of seconds your application should wait before requesting date from the Search API again
|
7
|
+
def retry_after
|
8
|
+
@http_headers.values_at('retry-after', 'Retry-After').detect{|value| value }.to_i
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/evrythng/error.rb
CHANGED
@@ -3,57 +3,34 @@ module Evrythng
|
|
3
3
|
class Error < StandardError
|
4
4
|
attr_reader :http_headers
|
5
5
|
|
6
|
+
# Initializes a new Error object
|
7
|
+
#
|
8
|
+
# @param message [String]
|
9
|
+
# @param http_headers [Hash]
|
10
|
+
# @return [Evrythng::Error]
|
6
11
|
def initialize(message, http_headers)
|
7
12
|
@http_headers = Hash[http_headers]
|
8
|
-
super
|
13
|
+
super(message)
|
9
14
|
end
|
10
15
|
|
16
|
+
# @return [Time]
|
11
17
|
def ratelimit_reset
|
12
18
|
Time.at(@http_headers.values_at('x-ratelimit-reset', 'X-RateLimit-Reset').detect{|value| value}.to_i)
|
13
19
|
end
|
14
20
|
|
21
|
+
# @return [Integer]
|
15
22
|
def ratelimit_limit
|
16
23
|
@http_headers.values_at('x-ratelimit-limit', 'X-RateLimit-Limit').detect{|value| value}.to_i
|
17
24
|
end
|
18
25
|
|
26
|
+
# @return [Integer]
|
19
27
|
def ratelimit_remaining
|
20
28
|
@http_headers.values_at('x-ratelimit-remaining', 'X-RateLimit-Remaining').detect{|value| value}.to_i
|
21
29
|
end
|
22
30
|
|
31
|
+
# @return [Integer]
|
23
32
|
def retry_after
|
24
33
|
[(ratelimit_reset - Time.now).ceil, 0].max
|
25
34
|
end
|
26
35
|
end
|
27
|
-
|
28
|
-
# Raised when Evrythng returns the HTTP status code 400
|
29
|
-
class BadRequest < Error; end
|
30
|
-
|
31
|
-
# Raised when Evrythng returns the HTTP status code 401
|
32
|
-
class Unauthorized < Error; end
|
33
|
-
|
34
|
-
# Raised when Evrythng returns the HTTP status code 403
|
35
|
-
class Forbidden < Error; end
|
36
|
-
|
37
|
-
# Raised when Evrythng returns the HTTP status code 404
|
38
|
-
class NotFound < Error; end
|
39
|
-
|
40
|
-
# Raised when Evrythng returns the HTTP status code 406
|
41
|
-
class NotAcceptable < Error; end
|
42
|
-
|
43
|
-
# Raised when Evrythng returns the HTTP status code 420
|
44
|
-
class EnhanceYourCalm < Error
|
45
|
-
# The number of seconds your application should wait before requesting date from the Search API again
|
46
|
-
def retry_after
|
47
|
-
@http_headers.values_at('retry-after', 'Retry-After').detect {|value| value }.to_i
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Raised when Evrythng returns the HTTP status code 500
|
52
|
-
class InternalServerError < Error; end
|
53
|
-
|
54
|
-
# Raised when Evrythng returns the HTTP status code 502
|
55
|
-
class BadGateway < Error; end
|
56
|
-
|
57
|
-
# Raised when Evrythng returns the HTTP status code 503
|
58
|
-
class ServiceUnavailable < Error; end
|
59
36
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Evrythng
|
4
|
+
module Request
|
5
|
+
class Gateway < Faraday::Middleware
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
url = env[:url].dup
|
9
|
+
url.host = @gateway
|
10
|
+
env[:url] = url
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(app, gateway)
|
15
|
+
@app, @gateway = app, gateway
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Evrythng
|
4
|
+
module Request
|
5
|
+
class TokenAuthentication < Faraday::Middleware
|
6
|
+
|
7
|
+
def initialize(app, token, options={})
|
8
|
+
super(app)
|
9
|
+
|
10
|
+
@header_value = token
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
unless env[:request_headers]['X-Evrythng-Token']
|
15
|
+
env[:request_headers]['X-Evrythng-Token'] = @header_value
|
16
|
+
end
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|