evrythng 0.0.5 → 0.1.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.
- 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
|