From ef249b7cebf9da298ed0ba7c43555e93c0295d6d Mon Sep 17 00:00:00 2001 From: wangjohn Date: Mon, 15 Dec 2014 08:57:16 -0800 Subject: [PATCH] Create the file upload api resource (+ bump version) --- History.txt | 6 ++++++ VERSION | 2 +- lib/stripe.rb | 34 ++++++++++++++++++++------------- lib/stripe/file_upload.rb | 27 ++++++++++++++++++++++++++ lib/stripe/version.rb | 2 +- test/stripe/file_upload_test.rb | 21 ++++++++++++++++++++ test/test_data.rb | 11 +++++++++++ 7 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 lib/stripe/file_upload.rb create mode 100644 test/stripe/file_upload_test.rb diff --git a/History.txt b/History.txt index 80023566..a8c765be 100644 --- a/History.txt +++ b/History.txt @@ -1,3 +1,9 @@ +=== 1.17.0 2014-12-15 + +* 1 major enhacement: + * File uploads resource was added (for uploading pdf or image documents for + disputes) + === 1.16.1 2014-12-19 * 2 minor enhancements: diff --git a/VERSION b/VERSION index 41c11ffb..092afa15 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.16.1 +1.17.0 diff --git a/lib/stripe.rb b/lib/stripe.rb index 7fcc2f3f..3a11dcca 100644 --- a/lib/stripe.rb +++ b/lib/stripe.rb @@ -30,6 +30,7 @@ require 'stripe/invoice' require 'stripe/invoice_item' require 'stripe/charge' require 'stripe/plan' +require 'stripe/file_upload' require 'stripe/coupon' require 'stripe/token' require 'stripe/event' @@ -62,11 +63,13 @@ module Stripe attr_accessor :api_key, :api_base, :verify_ssl_certs, :api_version end - def self.api_url(url='') - @api_base + url + def self.api_url(url='', api_base_url=nil) + (api_base_url || @api_base) + url end - def self.request(method, url, api_key, params={}, headers={}) + def self.request(method, url, api_key, params={}, headers={}, api_base_url=nil) + api_base_url = api_base_url || @api_base + unless api_key ||= @api_key raise AuthenticationError.new('No API key provided. ' + 'Set your API key using "Stripe.api_key = ". ' + @@ -90,11 +93,11 @@ module Stripe end if @verify_ssl_certs and !@CERTIFICATE_VERIFIED - @CERTIFICATE_VERIFIED = CertificateBlacklist.check_ssl_cert(@api_base, @ssl_bundle_path) + @CERTIFICATE_VERIFIED = CertificateBlacklist.check_ssl_cert(api_base_url, @ssl_bundle_path) end params = Util.objects_to_ids(params) - url = api_url(url) + url = api_url(url, api_base_url) case method.to_s.downcase.to_sym when :get, :head, :delete @@ -102,7 +105,11 @@ module Stripe url += "#{URI.parse(url).query ? '&' : '?'}#{uri_encode(params)}" if params && params.any? payload = nil else - payload = uri_encode(params) + if headers[:content_type] && headers[:content_type] == "multipart/form-data" + payload = params + else + payload = uri_encode(params) + end end request_opts.update(:headers => request_headers(api_key).update(headers), @@ -112,12 +119,12 @@ module Stripe begin response = execute_request(request_opts) rescue SocketError => e - handle_restclient_error(e) + handle_restclient_error(e, api_base_url) rescue NoMethodError => e # Work around RestClient bug if e.message =~ /\WRequestFailed\W/ e = APIConnectionError.new('Unexpected HTTP response code') - handle_restclient_error(e) + handle_restclient_error(e, api_base_url) else raise end @@ -125,10 +132,10 @@ module Stripe if rcode = e.http_code and rbody = e.http_body handle_api_error(rcode, rbody) else - handle_restclient_error(e) + handle_restclient_error(e, api_base_url) end rescue RestClient::Exception, Errno::ECONNREFUSED => e - handle_restclient_error(e) + handle_restclient_error(e, api_base_url) end [parse(response), api_key] @@ -258,17 +265,18 @@ module Stripe APIError.new(error[:message], rcode, rbody, error_obj) end - def self.handle_restclient_error(e) + def self.handle_restclient_error(e, api_base_url=nil) + api_base_url = @api_base unless api_base_url connection_message = "Please check your internet connection and try again. " \ "If this problem persists, you should check Stripe's service status at " \ "https://twitter.com/stripestatus, or let us know at support@stripe.com." case e when RestClient::RequestTimeout - message = "Could not connect to Stripe (#{@api_base}). #{connection_message}" + message = "Could not connect to Stripe (#{api_base_url}). #{connection_message}" when RestClient::ServerBrokeConnection - message = "The connection to the server (#{@api_base}) broke before the " \ + message = "The connection to the server (#{api_base_url}) broke before the " \ "request completed. #{connection_message}" when RestClient::SSLCertificateNotVerified diff --git a/lib/stripe/file_upload.rb b/lib/stripe/file_upload.rb new file mode 100644 index 00000000..15ab3f1a --- /dev/null +++ b/lib/stripe/file_upload.rb @@ -0,0 +1,27 @@ +module Stripe + class FileUpload < APIResource + UPLOADS_API_BASE = "https://uploads.stripe.com" + + def self.url + "/v1/files" + end + + def self.request_headers + { + :content_type => 'multipart/form-data', + } + end + + def self.create(params={}, api_key=nil) + response, api_key = Stripe.request( + :post, self.url, api_key, params, self.request_headers, UPLOADS_API_BASE) + Util.convert_to_stripe_object(response, api_key) + end + + def refresh + response, api_key = Stripe.request( + :get, url, @api_key, @retrieve_options, self.class.request_headers, UPLOADS_API_BASE) + refresh_from(response, api_key) + end + end +end diff --git a/lib/stripe/version.rb b/lib/stripe/version.rb index 5fe24006..1a9327fb 100644 --- a/lib/stripe/version.rb +++ b/lib/stripe/version.rb @@ -1,3 +1,3 @@ module Stripe - VERSION = '1.16.1' + VERSION = '1.17.0' end diff --git a/test/stripe/file_upload_test.rb b/test/stripe/file_upload_test.rb new file mode 100644 index 00000000..a0e3328d --- /dev/null +++ b/test/stripe/file_upload_test.rb @@ -0,0 +1,21 @@ +require File.expand_path('../../test_helper', __FILE__) + +module Stripe + class FileUploadTest < Test::Unit::TestCase + should "create should return a new file" do + @mock.expects(:post).once.returns(test_response(test_file)) + f = Stripe::FileUpload.create({ + :purpose => "dispute_evidence", + :file => File.new(__FILE__), + }) + assert_equal "fil_test_file", f.id + end + + should "files should be retrievable" do + @mock.expects(:get).once.returns(test_response(test_file)) + c = Stripe::FileUpload.new("fil_test_file") + c.refresh + assert_equal 1403047735, c.created + end + end +end diff --git a/test/test_data.rb b/test/test_data.rb index ba1a7d53..754fa78d 100644 --- a/test/test_data.rb +++ b/test/test_data.rb @@ -183,6 +183,17 @@ module Stripe }.merge(params) end + def test_file(params={}) + { + :id => "fil_test_file", + :created => 1403047735, + :size => 4908, + :purpose => params[:purpose] || "dispute_evidence", + :url => nil, + :mimetype => nil, + } + end + #FIXME nested overrides would be better than hardcoding plan_id def test_subscription(params = {}) plan = params.delete(:plan) || 'gold'