lib/nylas.rb in nylas-2.0.1 vs lib/nylas.rb in nylas-3.0.0
- old
+ new
@@ -1,9 +1,11 @@
require 'json'
require 'rest-client'
require 'yajl'
require 'em-http'
+
+
require 'ostruct'
require 'active_support/core_ext/hash'
require 'account'
require 'api_account'
@@ -19,65 +21,75 @@
require 'folder'
require 'restful_model'
require 'restful_model_collection'
require 'version'
-module Inbox
+module Nylas
Error = Class.new(::StandardError)
- AccessDenied = Class.new(Error)
- ResourceNotFound = Class.new(Error)
NoAuthToken = Class.new(Error)
UnexpectedAccountAction = Class.new(Error)
UnexpectedResponse = Class.new(Error)
class APIError < Error
- attr_accessor :error_type
+ attr_accessor :type
+ attr_accessor :message
attr_accessor :server_error
- def initialize(type, error, server_error = nil)
- super(error)
- self.error_type = type
+ def initialize(type, message, server_error = nil)
+ super(message)
+ self.type = type
+ self.message = message
self.server_error = server_error
end
end
+ AccessDenied = Class.new(APIError)
+ ResourceNotFound = Class.new(APIError)
InvalidRequest = Class.new(APIError)
MessageRejected = Class.new(APIError)
SendingQuotaExceeded = Class.new(APIError)
ServiceUnavailable = Class.new(APIError)
+ BadGateway = Class.new(APIError)
+ InternalError = Class.new(APIError)
+ MailProviderError = Class.new(APIError)
- def self.interpret_http_status(result)
- # Handle HTTP errors and RestClient errors
- raise ResourceNotFound.new if result.code.to_i == 404
- raise AccessDenied.new if result.code.to_i == 403
- end
-
HTTP_CODE_TO_EXCEPTIONS = {
400 => InvalidRequest,
402 => MessageRejected,
403 => AccessDenied,
404 => ResourceNotFound,
+ 422 => MailProviderError,
429 => SendingQuotaExceeded,
- 503 => ServiceUnavailable
+ 500 => InternalError,
+ 502 => BadGateway,
+ 503 => ServiceUnavailable,
}.freeze
def self.http_code_to_exception(http_code)
HTTP_CODE_TO_EXCEPTIONS.fetch(http_code, APIError)
end
def self.interpret_response(result, result_content, options = {})
- # Handle HTTP errors
- self.interpret_http_status(result)
- # Handle content expectation errors
+ # We expected a certain kind of object, but the API didn't return anything
raise UnexpectedResponse.new if options[:expected_class] && result_content.empty?
- json = options[:result_parsed]? result_content : JSON.parse(result_content)
- if json.is_a?(Hash) && (json['type'] == 'api_error' or json['type'] == 'invalid_request_error')
- exc = Inbox.http_code_to_exception(result.code.to_i)
- raise exc.new(json['type'], json['message'])
+
+ # If it's already parsed, or if we've received an actual raw payload on success, don't parse
+ if options[:result_parsed] || (options[:raw_response] && result.code.to_i == 200)
+ response = result_content
+ else
+ response = JSON.parse(result_content)
end
+
+ if result.code.to_i != 200
+ exc = Nylas.http_code_to_exception(result.code.to_i)
+ if response.is_a?(Hash)
+ raise exc.new(response['type'], response['message'], response.fetch('server_error', nil))
+ end
+ end
+
raise UnexpectedResponse.new(result.msg) if result.is_a?(Net::HTTPClientError)
- raise UnexpectedResponse.new if options[:expected_class] && !json.is_a?(options[:expected_class])
- json
+ raise UnexpectedResponse.new if options[:expected_class] && !response.is_a?(options[:expected_class])
+ response
rescue JSON::ParserError => e
# Handle parsing errors
raise UnexpectedResponse.new(e.message)
end
@@ -89,17 +101,17 @@
attr_reader :app_id
attr_reader :app_secret
def initialize(app_id, app_secret, access_token = nil, api_server = 'https://api.nylas.com',
service_domain = 'api.nylas.com')
- raise "When overriding the Inbox API server address, you must include https://" unless api_server.include?('://')
+ raise "When overriding the Nylas API server address, you must include https://" unless api_server.include?('://')
@api_server = api_server
@access_token = access_token
@app_secret = app_secret
@app_id = app_id
@service_domain = service_domain
- @version = Inbox::VERSION
+ @version = Nylas::VERSION
if ::RestClient.before_execution_procs.empty?
::RestClient.add_before_execution_proc do |req, params|
req.add_field('X-Inbox-API-Wrapper', 'ruby')
req['User-Agent'] = "Nylas Ruby SDK #{@version} - #{RUBY_VERSION}"
@@ -146,11 +158,11 @@
'grant_type' => 'authorization_code',
'code' => code
}
::RestClient.post("https://#{@service_domain}/oauth/token", data) do |response, request, result|
- json = Inbox.interpret_response(result, response, :expected_class => Object)
+ json = Nylas.interpret_response(result, response, :expected_class => Object)
return json['access_token']
end
end
# API Methods
@@ -192,11 +204,11 @@
def account
path = self.url_for_path("/account")
RestClient.get(path, {}) do |response,request,result|
- json = Inbox.interpret_response(result, response, {:expected_class => Object})
+ json = Nylas.interpret_response(result, response, {:expected_class => Object})
model = APIAccount.new(self)
model.inflate(json)
model
end
end
@@ -218,35 +230,35 @@
path = self.url_for_path("/delta/latest_cursor")
cursor = nil
RestClient.post(path, :content_type => :json) do |response,request,result|
- json = Inbox.interpret_response(result, response, {:expected_class => Object})
+ json = Nylas.interpret_response(result, response, {:expected_class => Object})
cursor = json["cursor"]
end
cursor
end
OBJECTS_TABLE = {
- "account" => Inbox::Account,
- "calendar" => Inbox::Calendar,
- "draft" => Inbox::Draft,
- "thread" => Inbox::Thread,
- "contact" => Inbox::Contact,
- "event" => Inbox::Event,
- "file" => Inbox::File,
- "message" => Inbox::Message,
- "folder" => Inbox::Folder,
- "label" => Inbox::Label,
+ "account" => Nylas::Account,
+ "calendar" => Nylas::Calendar,
+ "draft" => Nylas::Draft,
+ "thread" => Nylas::Thread,
+ "contact" => Nylas::Contact,
+ "event" => Nylas::Event,
+ "file" => Nylas::File,
+ "message" => Nylas::Message,
+ "folder" => Nylas::Folder,
+ "label" => Nylas::Label,
}
# It's possible to ask the API to expand objects.
# In this case, we do the right thing and return
# an expanded object.
EXPANDED_OBJECTS_TABLE = {
- "message" => Inbox::ExpandedMessage,
+ "message" => Nylas::ExpandedMessage,
}
def _build_exclude_types(exclude_types)
exclude_string = "&exclude_types="
@@ -278,11 +290,11 @@
end
json = nil
RestClient.get(path) do |response,request,result|
- json = Inbox.interpret_response(result, response, {:expected_class => Object})
+ json = Nylas.interpret_response(result, response, {:expected_class => Object})
end
start_cursor = json["cursor_start"]
end_cursor = json["cursor_end"]
@@ -330,11 +342,11 @@
path += '&view=expanded'
end
parser = Yajl::Parser.new(:symbolize_keys => false)
parser.on_parse_complete = proc do |data|
- delta = Inbox.interpret_response(OpenStruct.new(:code => '200'), data, {:expected_class => Object, :result_parsed => true})
+ delta = Nylas.interpret_response(OpenStruct.new(:code => '200'), data, {:expected_class => Object, :result_parsed => true})
if not OBJECTS_TABLE.has_key?(delta['object'])
next
end
@@ -354,22 +366,20 @@
obj.id = delta["id"]
obj.cursor = delta["cursor"]
yield delta["event"], obj
end
end
-
+
http = EventMachine::HttpRequest.new(path, :connect_timeout => 0, :inactivity_timeout => timeout).get(:keepalive => true)
- # set a callback on the HTTP stream that parses incoming chunks as they come in
+ # set a callback on the HTTP stream that parses incoming chunks as they come in
http.stream do |chunk|
parser << chunk
end
http.errback do
raise UnexpectedResponse.new http.error
end
-
+
end
end
end
-
-Nylas = Inbox.clone