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