diff --git a/lib/asana.rb b/lib/asana.rb index 78c8967..6bed2dc 100644 --- a/lib/asana.rb +++ b/lib/asana.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require 'asana/ruby2_0_0_compatibility' +require 'asana/compatibility_helper' require 'asana/authentication' require 'asana/resources' require 'asana/client' diff --git a/lib/asana/authentication/oauth2.rb b/lib/asana/authentication/oauth2.rb index afb9555..16863fc 100644 --- a/lib/asana/authentication/oauth2.rb +++ b/lib/asana/authentication/oauth2.rb @@ -28,8 +28,8 @@ module OAuth2 # # Note: This function reads from STDIN and writes to STDOUT. It is meant # to be used only within the context of a CLI application. - def offline_flow(client_id: required('client_id'), - client_secret: required('client_secret')) + def offline_flow(client_id: CompatibilityHelper.required('client_id'), + client_secret: CompatibilityHelper.required('client_secret')) client = Client.new(client_id: client_id, client_secret: client_secret, redirect_uri: 'urn:ietf:wg:oauth:2.0:oob') diff --git a/lib/asana/authentication/oauth2/access_token_authentication.rb b/lib/asana/authentication/oauth2/access_token_authentication.rb index 06841a8..80c6d26 100644 --- a/lib/asana/authentication/oauth2/access_token_authentication.rb +++ b/lib/asana/authentication/oauth2/access_token_authentication.rb @@ -20,9 +20,9 @@ class AccessTokenAuthentication # Returns an [AccessTokenAuthentication] instance with a refreshed # access token. def self.from_refresh_token(refresh_token, - client_id: required('client_id'), - client_secret: required('client_secret'), - redirect_uri: required('redirect_uri')) + client_id: CompatibilityHelper.required('client_id'), + client_secret: CompatibilityHelper.required('client_secret'), + redirect_uri: CompatibilityHelper.required('redirect_uri')) client = Client.new(client_id: client_id, client_secret: client_secret, redirect_uri: redirect_uri) diff --git a/lib/asana/authentication/oauth2/client.rb b/lib/asana/authentication/oauth2/client.rb index 80b71ee..a1ce16b 100644 --- a/lib/asana/authentication/oauth2/client.rb +++ b/lib/asana/authentication/oauth2/client.rb @@ -17,9 +17,9 @@ class Client # application # redirect_uri - [String] a redirect uri from the registered # application - def initialize(client_id: required('client_id'), - client_secret: required('client_secret'), - redirect_uri: required('redirect_uri')) + def initialize(client_id: CompatibilityHelper.required('client_id'), + client_secret: CompatibilityHelper.required('client_secret'), + redirect_uri: CompatibilityHelper.required('redirect_uri')) @client = ::OAuth2::Client.new(client_id, client_secret, site: 'https://app.asana.com', authorize_url: '/-/oauth_authorize', diff --git a/lib/asana/client.rb b/lib/asana/client.rb index 6865f38..64ba561 100644 --- a/lib/asana/client.rb +++ b/lib/asana/client.rb @@ -56,7 +56,7 @@ class Client # Internal: Proxies Resource classes to implement a fluent API on the Client # instances. class ResourceProxy - def initialize(client: required('client'), resource: required('resource')) + def initialize(client: CompatibilityHelper.required('client'), resource: CompatibilityHelper.required('resource')) @client = client @resource = resource end diff --git a/lib/asana/compatibility_helper.rb b/lib/asana/compatibility_helper.rb new file mode 100644 index 0000000..1668902 --- /dev/null +++ b/lib/asana/compatibility_helper.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Asana + module CompatibilityHelper + def required(name) + raise(ArgumentError, "#{name} is a required keyword argument") + end + + extend self + end +end diff --git a/lib/asana/http_client.rb b/lib/asana/http_client.rb index 06f813d..550b96e 100644 --- a/lib/asana/http_client.rb +++ b/lib/asana/http_client.rb @@ -23,7 +23,7 @@ class HttpClient # user_agent - [String] The user agent. Defaults to "ruby-asana vX.Y.Z". # config - [Proc] An optional block that yields the Faraday builder # object for customization. - def initialize(authentication: required('authentication'), + def initialize(authentication: CompatibilityHelper.required('authentication'), adapter: nil, user_agent: nil, debug_mode: false, diff --git a/lib/asana/resource_includes/collection.rb b/lib/asana/resource_includes/collection.rb index 325ba32..c1eea09 100644 --- a/lib/asana/resource_includes/collection.rb +++ b/lib/asana/resource_includes/collection.rb @@ -21,7 +21,7 @@ class Collection # client - [Asana::Client] the client to perform requests. def initialize((elements, extra), type: Resource, - client: required('client')) + client: CompatibilityHelper.required('client')) @elements = elements.map { |elem| type.new(elem, client: client) } @type = type @next_page_data = extra['next_page'] diff --git a/lib/asana/resource_includes/events.rb b/lib/asana/resource_includes/events.rb index ea283f1..e3c4585 100644 --- a/lib/asana/resource_includes/events.rb +++ b/lib/asana/resource_includes/events.rb @@ -34,8 +34,8 @@ class Events # client - [Asana::Client] a client to perform the requests. # wait - [Integer] the number of seconds to wait between each poll. # options - [Hash] the request I/O options - def initialize(resource: required('resource'), - client: required('client'), + def initialize(resource: CompatibilityHelper.required('resource'), + client: CompatibilityHelper.required('client'), wait: 1, options: {}) @resource = resource @client = client diff --git a/lib/asana/resource_includes/resource.rb b/lib/asana/resource_includes/resource.rb index c89e524..70b32bd 100644 --- a/lib/asana/resource_includes/resource.rb +++ b/lib/asana/resource_includes/resource.rb @@ -2,6 +2,7 @@ require_relative 'registry' require_relative 'response_helper' +require_relative '../compatibility_helper' module Asana module Resources @@ -10,6 +11,8 @@ module Resources class Resource include ResponseHelper extend ResponseHelper + include CompatibilityHelper + extend CompatibilityHelper def initialize(data, client: required('client')) @_client = client diff --git a/lib/asana/ruby2_0_0_compatibility.rb b/lib/asana/ruby2_0_0_compatibility.rb deleted file mode 100644 index c9c1078..0000000 --- a/lib/asana/ruby2_0_0_compatibility.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -def required(name) - raise(ArgumentError, "#{name} is a required keyword argument") -end diff --git a/spec/asana/authentication/oauth2/access_token_authentication_spec.rb b/spec/asana/authentication/oauth2/access_token_authentication_spec.rb index 3a22dec..4831711 100644 --- a/spec/asana/authentication/oauth2/access_token_authentication_spec.rb +++ b/spec/asana/authentication/oauth2/access_token_authentication_spec.rb @@ -1,6 +1,18 @@ # frozen_string_literal: true RSpec.describe Asana::Authentication::OAuth2::AccessTokenAuthentication do + describe '#from_refresh_token' do + let(:token) do + instance_double(OAuth2::AccessToken, expired?: false, token: 'TOKEN') + end + + it 'raises an ArgumentError when required fields are missing' do + expect do + described_class.from_refresh_token(token) + end.to raise_error(ArgumentError) + end + end + describe described_class do let(:auth) { described_class.new(token) } diff --git a/spec/asana/authentication/oauth2/client_spec.rb b/spec/asana/authentication/oauth2/client_spec.rb index e258aa8..8654643 100644 --- a/spec/asana/authentication/oauth2/client_spec.rb +++ b/spec/asana/authentication/oauth2/client_spec.rb @@ -7,6 +7,12 @@ redirect_uri: 'http://redirect_uri.com') end + describe '#initialize' do + it 'raises an ArgumentError when required fields are missing' do + expect { described_class.new }.to raise_error(ArgumentError) + end + end + describe '#authorize_url' do it 'returns the OAuth2 authorize url' do expect(client.authorize_url) diff --git a/spec/asana/http_client_spec.rb b/spec/asana/http_client_spec.rb index cdf21a3..e6805bb 100644 --- a/spec/asana/http_client_spec.rb +++ b/spec/asana/http_client_spec.rb @@ -9,6 +9,12 @@ described_class.new(authentication: auth, adapter: api.to_proc) end + describe '#initialize' do + it "raises an ArgumentError when required fields are missing" do + expect { described_class.new }.to raise_error(ArgumentError) + end + end + describe '#get' do it 'performs a GET request against the Asana API' do api.on(:get, '/users/me') do |response| diff --git a/spec/asana/resources/attachment_uploading_spec.rb b/spec/asana/resources/attachment_uploading_spec.rb index a783bc5..bf11360 100644 --- a/spec/asana/resources/attachment_uploading_spec.rb +++ b/spec/asana/resources/attachment_uploading_spec.rb @@ -65,5 +65,11 @@ def self.plural_name expect(attachment.gid).to eq('10') end end + + context 'without filename or mime' do + it 'raises an error' do + expect { unicorn.attach }.to raise_error(ArgumentError) + end + end end end diff --git a/spec/asana/resources/collection_spec.rb b/spec/asana/resources/collection_spec.rb index d618c9e..8d5a7df 100644 --- a/spec/asana/resources/collection_spec.rb +++ b/spec/asana/resources/collection_spec.rb @@ -18,6 +18,16 @@ include ResourcesHelper + describe '#initialize' do + context 'no client provided' do + it 'raises an ArgumentError' do + expect do + described_class.new([unicorns.take(5), {}], type: unicorn_class) + end.to raise_error(ArgumentError) + end + end + end + describe '#each' do context 'if there is more than one page' do it 'transparently iterates over all of them' do diff --git a/spec/asana/resources/events_spec.rb b/spec/asana/resources/events_spec.rb index b7a10c7..61f9a77 100644 --- a/spec/asana/resources/events_spec.rb +++ b/spec/asana/resources/events_spec.rb @@ -33,6 +33,14 @@ include ResourcesHelper + describe '#initialize' do + it 'raises an ArgumentError when required fields are missing' do + expect do + described_class.new(wait: 0).take(3) + end.to raise_error(ArgumentError) + end + end + it 'is an infinite collection of events on a resource' do api.on(:get, '/events', resource: '1') do |response| response.body = { sync: 'firstsynctoken',