cashstar 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -3
- data/cashstar.gemspec +5 -2
- data/lib/.DS_Store +0 -0
- data/lib/cashstar.rb +23 -20
- data/lib/cashstar/.DS_Store +0 -0
- data/lib/cashstar/api.rb +24 -0
- data/lib/cashstar/authentication.rb +23 -0
- data/lib/cashstar/client.rb +26 -0
- data/lib/cashstar/client/catalog.rb +12 -0
- data/lib/cashstar/client/faceplates.rb +14 -0
- data/lib/cashstar/client/gift_card.rb +31 -0
- data/lib/cashstar/client/merchants.rb +15 -0
- data/lib/cashstar/client/order.rb +26 -0
- data/lib/cashstar/configuration.rb +72 -0
- data/lib/cashstar/connection.rb +42 -0
- data/lib/cashstar/error.rb +36 -0
- data/lib/cashstar/request.rb +43 -0
- data/lib/cashstar/version.rb +1 -1
- data/lib/faraday/request/basic_auth.rb +17 -0
- data/lib/faraday/request/gateway.rb +18 -0
- data/lib/faraday/response/raise_http_4xx.rb +45 -0
- data/lib/faraday/response/raise_http_5xx.rb +24 -0
- metadata +92 -70
- data/lib/cashstar/entities.rb +0 -20
- data/lib/cashstar/entities/base.rb +0 -19
- data/lib/cashstar/entities/catalog.rb +0 -18
- data/lib/cashstar/entities/credit_card.rb +0 -10
- data/lib/cashstar/entities/error.rb +0 -0
- data/lib/cashstar/entities/faceplate.rb +0 -25
- data/lib/cashstar/entities/gift_certificate.rb +0 -21
- data/lib/cashstar/entities/gift_certificate_delivery.rb +0 -13
- data/lib/cashstar/entities/gift_certificate_message.rb +0 -11
- data/lib/cashstar/entities/merchant.rb +0 -31
- data/lib/cashstar/entities/order.rb +0 -39
- data/lib/cashstar/entities/payment.rb +0 -10
- data/lib/cashstar/entities/purchaser.rb +0 -10
- data/lib/cashstar/entities/purchaser_account.rb +0 -10
- data/lib/cashstar/entities/web_session.rb +0 -10
data/Gemfile
CHANGED
data/cashstar.gemspec
CHANGED
@@ -3,6 +3,11 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
require "cashstar/version"
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
|
+
s.add_dependency 'hashie', '~> 1.1.0'
|
7
|
+
s.add_dependency 'faraday', '~> 0.7.4'
|
8
|
+
s.add_dependency 'faraday_middleware', '~> 0.7.0'
|
9
|
+
s.add_dependency 'multi_json', '~> 1.0.0'
|
10
|
+
s.add_dependency 'multi_xml', '~> 0.4.0'
|
6
11
|
s.name = "cashstar"
|
7
12
|
s.version = Cashstar::VERSION
|
8
13
|
s.platform = Gem::Platform::RUBY
|
@@ -11,8 +16,6 @@ Gem::Specification.new do |s|
|
|
11
16
|
s.homepage = "http://www.cashstar.com"
|
12
17
|
s.summary = %q{Ruby Bindings for the CashStar API}
|
13
18
|
s.description = %q{CashStar's API provides a simple interface for purchasing and issuing electronic gift cards from a variety of brands}
|
14
|
-
|
15
|
-
s.add_dependency('rest-client', ">=1.6.1")
|
16
19
|
s.rubyforge_project = "cashstar"
|
17
20
|
|
18
21
|
s.files = `git ls-files`.split("\n")
|
data/lib/.DS_Store
ADDED
Binary file
|
data/lib/cashstar.rb
CHANGED
@@ -1,24 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require '
|
5
|
-
require 'active_support/core_ext/string/inflections'
|
6
|
-
require 'active_support/core_ext/hash/indifferent_access'
|
7
|
-
require 'active_support/core_ext/hash/conversions'
|
8
|
-
require 'active_support/core_ext/class/inheritable_attributes'
|
9
|
-
require 'active_support/core_ext/class/attribute_accessors'
|
10
|
-
require 'active_support/core_ext/class/delegating_attributes'
|
11
|
-
require 'active_support/core_ext/module/attribute_accessors'
|
12
|
-
require 'active_support/core_ext/kernel/requires'
|
13
|
-
require 'active_support/base64'
|
14
|
-
require 'active_support/secure_random'
|
15
|
-
require 'rest_client'
|
16
|
-
|
1
|
+
require 'cashstar/api'
|
2
|
+
require 'cashstar/client'
|
3
|
+
require 'cashstar/configuration'
|
4
|
+
require 'cashstar/error'
|
17
5
|
|
18
6
|
|
19
7
|
module Cashstar
|
20
|
-
|
8
|
+
extend Configuration
|
9
|
+
class << self
|
10
|
+
# Alias for Cashstar::Client.new
|
11
|
+
#
|
12
|
+
# @return [Cashstar::Client]
|
13
|
+
def new(options={})
|
14
|
+
Cashstar::Client.new(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Delegate to Cashstar::Client
|
18
|
+
def method_missing(method, *args, &block)
|
19
|
+
return super unless new.respond_to?(method)
|
20
|
+
new.send(method, *args, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def respond_to?(method, include_private = false)
|
24
|
+
new.respond_to?(method, include_private) || super(method, include_private)
|
25
|
+
end
|
26
|
+
end
|
21
27
|
end
|
22
|
-
|
23
|
-
|
24
|
-
require "cashstar/entities"
|
Binary file
|
data/lib/cashstar/api.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'cashstar/authentication'
|
2
|
+
require 'cashstar/configuration'
|
3
|
+
require 'cashstar/connection'
|
4
|
+
require 'cashstar/request'
|
5
|
+
|
6
|
+
module Cashstar
|
7
|
+
# @private
|
8
|
+
class API
|
9
|
+
include Connection
|
10
|
+
include Request
|
11
|
+
include Authentication
|
12
|
+
|
13
|
+
# @private
|
14
|
+
attr_accessor *Configuration::VALID_OPTIONS_KEYS
|
15
|
+
|
16
|
+
# Creates a new API
|
17
|
+
def initialize(options={})
|
18
|
+
options = Cashstar.options.merge(options)
|
19
|
+
Configuration::VALID_OPTIONS_KEYS.each do |key|
|
20
|
+
send("#{key}=", options[key])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Cashstar
|
2
|
+
# @private
|
3
|
+
module Authentication
|
4
|
+
private
|
5
|
+
|
6
|
+
# Authentication hash
|
7
|
+
#
|
8
|
+
# @return [Hash]
|
9
|
+
def authentication
|
10
|
+
{
|
11
|
+
:username => username,
|
12
|
+
:password => password,
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Check whether user is authenticated
|
17
|
+
#
|
18
|
+
# @return [Boolean]
|
19
|
+
def authenticated?
|
20
|
+
authentication.values.all?
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Cashstar
|
2
|
+
# Wrapper for the CashStar REST API
|
3
|
+
#
|
4
|
+
# @note All methods have been separated into modules
|
5
|
+
class Client < API
|
6
|
+
# Require client method modules after initializing the Client class in
|
7
|
+
# order to avoid a superclass mismatch error, allowing those modules to be
|
8
|
+
# Client-namespaced.
|
9
|
+
require 'cashstar/client/merchants'
|
10
|
+
require 'cashstar/client/catalog'
|
11
|
+
require 'cashstar/client/faceplates'
|
12
|
+
require 'cashstar/client/order'
|
13
|
+
require 'cashstar/client/gift_card'
|
14
|
+
|
15
|
+
|
16
|
+
alias :api_endpoint :endpoint
|
17
|
+
|
18
|
+
include Cashstar::Client::Merchants
|
19
|
+
include Cashstar::Client::Faceplates
|
20
|
+
include Cashstar::Client::Catalog
|
21
|
+
include Cashstar::Client::OrderMethods
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Cashstar
|
2
|
+
class Client
|
3
|
+
# Defines methods related to a Cashstar Order
|
4
|
+
module Catalog
|
5
|
+
|
6
|
+
def catalog(merchant_code)
|
7
|
+
response = get("/v2/merchant/#{merchant_code}/catalog/")
|
8
|
+
format.to_s.downcase == 'xml' ? response['catalog'] : response['catalog']
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Cashstar
|
2
|
+
class Client
|
3
|
+
# Defines methods related to a Cashstar Order
|
4
|
+
module Faceplates
|
5
|
+
|
6
|
+
def faceplates(merchant_code)
|
7
|
+
response = get("/v2/merchant/#{merchant_code}/faceplate/")
|
8
|
+
format.to_s.downcase == 'xml' ? response['merchant'] : response['faceplates']['faceplate']
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
module Cashstar
|
4
|
+
class Client
|
5
|
+
# Defines methods related to a Cashstar Order
|
6
|
+
class GiftCard < Hashie::Dash
|
7
|
+
property :merchant_code, :required => true
|
8
|
+
property :initial_balance, :required => true
|
9
|
+
property :currency, :default => 'USD'
|
10
|
+
property :challenge
|
11
|
+
property :challenge_description
|
12
|
+
property :delivery
|
13
|
+
property :message
|
14
|
+
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class Delivery < Hashie::Dash
|
19
|
+
property :delivered_by, :default => 'CASHSTAR'
|
20
|
+
property :method
|
21
|
+
property :target
|
22
|
+
property :scheduled
|
23
|
+
end
|
24
|
+
|
25
|
+
class Message < Hashie::Dash
|
26
|
+
property :from
|
27
|
+
property :to
|
28
|
+
property :body
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Cashstar
|
2
|
+
class Client
|
3
|
+
# Defines methods related to Cashstar merchants
|
4
|
+
module Merchants
|
5
|
+
|
6
|
+
|
7
|
+
def merchants
|
8
|
+
response = get("/v2/merchant/")
|
9
|
+
format.to_s.downcase == 'xml' ? response['merchant'] : response['merchants']['merchant']
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'hashie'
|
2
|
+
|
3
|
+
|
4
|
+
module Cashstar
|
5
|
+
class Client
|
6
|
+
module OrderMethods
|
7
|
+
def issue(order)
|
8
|
+
response = post("/v2/order/", order.to_json)
|
9
|
+
format.to_s.downcase == 'xml' ? response['order'] : response['order']
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# Defines methods related to a Cashstar Order
|
14
|
+
class Order < Hashie::Dash
|
15
|
+
property :audit_number, :required => true
|
16
|
+
property :gift_card, :required => true
|
17
|
+
property :payment, :default => nil
|
18
|
+
|
19
|
+
def to_json()
|
20
|
+
"{ \"order\" : { \"audit_number\" : \"#{self.audit_number}\", \"egc\" : #{self.gift_card.to_json}}}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'cashstar/version'
|
2
|
+
|
3
|
+
module Cashstar
|
4
|
+
# Defines constants and methods related to configuration
|
5
|
+
module Configuration
|
6
|
+
# An array of valid keys in the options hash when configuring a {Cashstar::API}
|
7
|
+
VALID_OPTIONS_KEYS = [
|
8
|
+
:username,
|
9
|
+
:password,
|
10
|
+
:endpoint,
|
11
|
+
:format,
|
12
|
+
:user_agent,
|
13
|
+
:adapter,
|
14
|
+
:faraday_options].freeze
|
15
|
+
|
16
|
+
# The adapter that will be used to connect if none is set
|
17
|
+
DEFAULT_ADAPTER = :net_http
|
18
|
+
|
19
|
+
# By default, don't set a username
|
20
|
+
DEFAULT_USERNAME = nil
|
21
|
+
|
22
|
+
# By default, don't set a password
|
23
|
+
DEFAULT_PASSWORD = nil
|
24
|
+
|
25
|
+
# The endpoint that will be used to connect if none is set
|
26
|
+
#
|
27
|
+
# @note This is configurable in case you want to connect to CashStar's test environment at https://api-semiprod.cashstar.com
|
28
|
+
DEFAULT_ENDPOINT = 'https://api-semiprod.cashstar.com'.freeze
|
29
|
+
|
30
|
+
# The response format appended to the path and sent in the 'Accept' header if none is set
|
31
|
+
#
|
32
|
+
# @note JSON is preferred over XML because it is more concise and faster to parse.
|
33
|
+
DEFAULT_FORMAT = :json
|
34
|
+
|
35
|
+
# The value sent in the 'User-Agent' header if none is set
|
36
|
+
DEFAULT_USER_AGENT = "CashStar Ruby Gem #{Cashstar::VERSION}".freeze
|
37
|
+
|
38
|
+
DEFAULT_FARADAY_OPTIONS = {}.freeze
|
39
|
+
|
40
|
+
# @private
|
41
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
42
|
+
|
43
|
+
# When this module is extended, set all configuration options to their default values
|
44
|
+
def self.extended(base)
|
45
|
+
base.reset
|
46
|
+
end
|
47
|
+
|
48
|
+
# Convenience method to allow configuration options to be set in a block
|
49
|
+
def configure
|
50
|
+
yield self
|
51
|
+
end
|
52
|
+
|
53
|
+
# Create a hash of options and their values
|
54
|
+
def options
|
55
|
+
options = {}
|
56
|
+
VALID_OPTIONS_KEYS.each{|k| options[k] = send(k)}
|
57
|
+
options
|
58
|
+
end
|
59
|
+
|
60
|
+
# Reset all configuration options to defaults
|
61
|
+
def reset
|
62
|
+
self.adapter = DEFAULT_ADAPTER
|
63
|
+
self.username = DEFAULT_USERNAME
|
64
|
+
self.password = DEFAULT_PASSWORD
|
65
|
+
self.endpoint = DEFAULT_ENDPOINT
|
66
|
+
self.format = DEFAULT_FORMAT
|
67
|
+
self.user_agent = DEFAULT_USER_AGENT
|
68
|
+
self.faraday_options = DEFAULT_FARADAY_OPTIONS
|
69
|
+
self
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
require 'faraday/request/gateway'
|
3
|
+
require 'faraday/request/basic_auth'
|
4
|
+
require 'faraday/response/raise_http_4xx'
|
5
|
+
require 'faraday/response/raise_http_5xx'
|
6
|
+
|
7
|
+
module Cashstar
|
8
|
+
# @private
|
9
|
+
module Connection
|
10
|
+
private
|
11
|
+
|
12
|
+
def connection(options={})
|
13
|
+
merged_options = faraday_options.merge({
|
14
|
+
:headers => {
|
15
|
+
'Accept' => "application/json",
|
16
|
+
'User-Agent' => user_agent,
|
17
|
+
'Content-Type' => "application/json"
|
18
|
+
},
|
19
|
+
:ssl => {:verify => false},
|
20
|
+
:url => options.fetch(:endpoint, api_endpoint)
|
21
|
+
})
|
22
|
+
|
23
|
+
faraday = Faraday.new(merged_options) do |builder|
|
24
|
+
builder.use Faraday::Request::BasicAuth, authentication if authenticated?
|
25
|
+
builder.use Faraday::Request::UrlEncoded
|
26
|
+
builder.use Faraday::Response::RaiseHttp4xx
|
27
|
+
unless options[:raw]
|
28
|
+
case options.fetch(:format, format).to_s.downcase
|
29
|
+
when 'json'
|
30
|
+
builder.use Faraday::Response::Mashify
|
31
|
+
builder.use Faraday::Response::ParseJson
|
32
|
+
when 'xml'
|
33
|
+
builder.use Faraday::Response::Mashify
|
34
|
+
builder.use Faraday::Response::ParseXml
|
35
|
+
end
|
36
|
+
end
|
37
|
+
builder.use Faraday::Response::RaiseHttp5xx
|
38
|
+
builder.adapter(adapter)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Cashstar
|
2
|
+
# Custom error class for rescuing from all Cashstar errors
|
3
|
+
class Error < StandardError
|
4
|
+
attr_reader :http_headers
|
5
|
+
|
6
|
+
def initialize(message, http_headers)
|
7
|
+
@http_headers = Hash[http_headers]
|
8
|
+
super message
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
# Raised when Cashstar returns the HTTP status code 400
|
14
|
+
class BadRequest < Error; end
|
15
|
+
|
16
|
+
# Raised when Cashstar returns the HTTP status code 401
|
17
|
+
class Unauthorized < Error; end
|
18
|
+
|
19
|
+
# Raised when Cashstar returns the HTTP status code 403
|
20
|
+
class Forbidden < Error; end
|
21
|
+
|
22
|
+
# Raised when Cashstar returns the HTTP status code 404
|
23
|
+
class NotFound < Error; end
|
24
|
+
|
25
|
+
# Raised when Cashstar returns the HTTP status code 406
|
26
|
+
class NotAcceptable < Error; end
|
27
|
+
|
28
|
+
# Raised when Cashstar returns the HTTP status code 500
|
29
|
+
class InternalServerError < Error; end
|
30
|
+
|
31
|
+
# Raised when Cashstar returns the HTTP status code 502
|
32
|
+
class BadGateway < Error; end
|
33
|
+
|
34
|
+
# Raised when Cashstar returns the HTTP status code 503
|
35
|
+
class ServiceUnavailable < Error; end
|
36
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Cashstar
|
2
|
+
# Defines HTTP request methods
|
3
|
+
module Request
|
4
|
+
# Perform an HTTP GET request
|
5
|
+
def get(path, params={}, options={})
|
6
|
+
request(:get, path, params, options)
|
7
|
+
end
|
8
|
+
|
9
|
+
def post(path, params={}, options={})
|
10
|
+
request(:post, path, params, options)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Perform an HTTP PUT request
|
14
|
+
def put(path, params={}, options={})
|
15
|
+
request(:put, path, params, options)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Perform an HTTP DELETE request
|
19
|
+
def delete(path, params={}, options={})
|
20
|
+
request(:delete, path, params, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# Perform an HTTP request
|
26
|
+
def request(method, path, params, options)
|
27
|
+
response = connection(options).send(method) do |request|
|
28
|
+
case method.to_sym
|
29
|
+
when :get, :delete
|
30
|
+
request.url(path, params)
|
31
|
+
when :post, :put
|
32
|
+
request.path = path
|
33
|
+
request.body = params unless params.empty?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
options[:raw] ? response : response.body
|
37
|
+
end
|
38
|
+
|
39
|
+
def formatted_path(path, options={})
|
40
|
+
#[path, options.fetch(:format, format)].compact.join('.')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/cashstar/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Faraday
|
4
|
+
class Request::BasicAuth < Faraday::Middleware
|
5
|
+
require 'base64'
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
header = Base64.encode64("#{@options[:username]}:#{@options[:password]}")
|
9
|
+
env[:request_headers]['Authorization'] = "Basic #{header.to_s}"
|
10
|
+
@app.call(env)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(app, options)
|
14
|
+
@app, @options = app, options
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
# @private
|
4
|
+
module Faraday
|
5
|
+
# @private
|
6
|
+
class Request::Gateway < Faraday::Middleware
|
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
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
# @private
|
4
|
+
module Faraday
|
5
|
+
# @private
|
6
|
+
class Response::RaiseHttp4xx < Response::Middleware
|
7
|
+
def on_complete(env)
|
8
|
+
case env[:status].to_i
|
9
|
+
when 400
|
10
|
+
raise Cashstar::BadRequest.new(error_message(env), env[:response_headers])
|
11
|
+
when 401
|
12
|
+
raise Cashstar::Unauthorized.new(error_message(env), env[:response_headers])
|
13
|
+
when 403
|
14
|
+
raise Cashstar::Forbidden.new(error_message(env), env[:response_headers])
|
15
|
+
when 404
|
16
|
+
raise Cashstar::NotFound.new(error_message(env), env[:response_headers])
|
17
|
+
when 406
|
18
|
+
raise Cashstar::NotAcceptable.new(error_message(env), env[:response_headers])
|
19
|
+
when 420
|
20
|
+
raise Cashstar::EnhanceYourCalm.new(error_message(env), env[:response_headers])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def error_message(env)
|
27
|
+
"#{env[:method].to_s.upcase} #{env[:url].to_s}: #{env[:status]}#{error_body(env[:body])}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def error_body(body)
|
31
|
+
if body.nil?
|
32
|
+
nil
|
33
|
+
elsif body['error']
|
34
|
+
": #{body['error']}"
|
35
|
+
elsif body['errors']
|
36
|
+
first = Array(body['errors']).first
|
37
|
+
if first.kind_of? Hash
|
38
|
+
": #{first['message'].chomp}"
|
39
|
+
else
|
40
|
+
": #{first.chomp}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
# @private
|
4
|
+
module Faraday
|
5
|
+
# @private
|
6
|
+
class Response::RaiseHttp5xx < Response::Middleware
|
7
|
+
def on_complete(env)
|
8
|
+
case env[:status].to_i
|
9
|
+
when 500
|
10
|
+
raise Cashstar::InternalServerError.new(error_message(env, "Something is technically wrong."), env[:response_headers])
|
11
|
+
when 502
|
12
|
+
raise Cashstar::BadGateway.new(error_message(env, "Cashstar is down or being upgraded."), env[:response_headers])
|
13
|
+
when 503
|
14
|
+
raise Cashstar::ServiceUnavailable.new(error_message(env, "(__-){ Cashstar is over capacity."), env[:response_headers])
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def error_message(env, body=nil)
|
21
|
+
"#{env[:method].to_s.upcase} #{env[:url].to_s}: #{[env[:status].to_s + ':', body].compact.join(' ')}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,103 +1,125 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cashstar
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 0.0.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Charlie White
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2011-09-30 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: hashie
|
16
|
+
requirement: &70287615158460 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.1.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70287615158460
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: faraday
|
27
|
+
requirement: &70287615157760 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.7.4
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70287615157760
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: faraday_middleware
|
38
|
+
requirement: &70287615156540 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.7.0
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70287615156540
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: multi_json
|
49
|
+
requirement: &70287615155780 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
type: :runtime
|
23
56
|
prerelease: false
|
24
|
-
|
57
|
+
version_requirements: *70287615155780
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: multi_xml
|
60
|
+
requirement: &70287615155120 !ruby/object:Gem::Requirement
|
25
61
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 1
|
32
|
-
- 6
|
33
|
-
- 1
|
34
|
-
version: 1.6.1
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.4.0
|
35
66
|
type: :runtime
|
36
|
-
|
37
|
-
|
38
|
-
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70287615155120
|
69
|
+
description: CashStar's API provides a simple interface for purchasing and issuing
|
70
|
+
electronic gift cards from a variety of brands
|
71
|
+
email:
|
39
72
|
- cwhite@cashstar.com
|
40
73
|
executables: []
|
41
|
-
|
42
74
|
extensions: []
|
43
|
-
|
44
75
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
76
|
+
files:
|
47
77
|
- .gitignore
|
48
78
|
- Gemfile
|
49
79
|
- Rakefile
|
50
80
|
- cashstar.gemspec
|
81
|
+
- lib/.DS_Store
|
51
82
|
- lib/cashstar.rb
|
52
|
-
- lib/cashstar
|
53
|
-
- lib/cashstar/
|
54
|
-
- lib/cashstar/
|
55
|
-
- lib/cashstar/
|
56
|
-
- lib/cashstar/
|
57
|
-
- lib/cashstar/
|
58
|
-
- lib/cashstar/
|
59
|
-
- lib/cashstar/
|
60
|
-
- lib/cashstar/
|
61
|
-
- lib/cashstar/
|
62
|
-
- lib/cashstar/
|
63
|
-
- lib/cashstar/
|
64
|
-
- lib/cashstar/
|
65
|
-
- lib/cashstar/entities/purchaser_account.rb
|
66
|
-
- lib/cashstar/entities/web_session.rb
|
83
|
+
- lib/cashstar/.DS_Store
|
84
|
+
- lib/cashstar/api.rb
|
85
|
+
- lib/cashstar/authentication.rb
|
86
|
+
- lib/cashstar/client.rb
|
87
|
+
- lib/cashstar/client/catalog.rb
|
88
|
+
- lib/cashstar/client/faceplates.rb
|
89
|
+
- lib/cashstar/client/gift_card.rb
|
90
|
+
- lib/cashstar/client/merchants.rb
|
91
|
+
- lib/cashstar/client/order.rb
|
92
|
+
- lib/cashstar/configuration.rb
|
93
|
+
- lib/cashstar/connection.rb
|
94
|
+
- lib/cashstar/error.rb
|
95
|
+
- lib/cashstar/request.rb
|
67
96
|
- lib/cashstar/version.rb
|
68
|
-
|
97
|
+
- lib/faraday/request/basic_auth.rb
|
98
|
+
- lib/faraday/request/gateway.rb
|
99
|
+
- lib/faraday/response/raise_http_4xx.rb
|
100
|
+
- lib/faraday/response/raise_http_5xx.rb
|
69
101
|
homepage: http://www.cashstar.com
|
70
102
|
licenses: []
|
71
|
-
|
72
103
|
post_install_message:
|
73
104
|
rdoc_options: []
|
74
|
-
|
75
|
-
require_paths:
|
105
|
+
require_paths:
|
76
106
|
- lib
|
77
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
108
|
none: false
|
79
|
-
requirements:
|
80
|
-
- -
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
|
83
|
-
|
84
|
-
- 0
|
85
|
-
version: "0"
|
86
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
114
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
|
92
|
-
segments:
|
93
|
-
- 0
|
94
|
-
version: "0"
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
95
119
|
requirements: []
|
96
|
-
|
97
120
|
rubyforge_project: cashstar
|
98
|
-
rubygems_version: 1.
|
121
|
+
rubygems_version: 1.8.10
|
99
122
|
signing_key:
|
100
123
|
specification_version: 3
|
101
124
|
summary: Ruby Bindings for the CashStar API
|
102
125
|
test_files: []
|
103
|
-
|
data/lib/cashstar/entities.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
module Cashstar
|
2
|
-
module Entities
|
3
|
-
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
|
-
require 'cashstar/entities/base'
|
8
|
-
require 'cashstar/entities/catalog'
|
9
|
-
require 'cashstar/entities/credit_card'
|
10
|
-
require 'cashstar/entities/error'
|
11
|
-
require 'cashstar/entities/faceplate'
|
12
|
-
require 'cashstar/entities/gift_certificate'
|
13
|
-
require 'cashstar/entities/gift_certificate_delivery'
|
14
|
-
require 'cashstar/entities/gift_certificate_message'
|
15
|
-
require 'cashstar/entities/merchant'
|
16
|
-
require 'cashstar/entities/order'
|
17
|
-
require 'cashstar/entities/payment'
|
18
|
-
require 'cashstar/entities/purchaser'
|
19
|
-
require 'cashstar/entities/purchaser_account'
|
20
|
-
require 'cashstar/entities/web_session'
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Cashstar
|
2
|
-
module Entities
|
3
|
-
|
4
|
-
class Base
|
5
|
-
cattr_accessor :remote_url, :headers
|
6
|
-
self.remote_url = "https://petes_dad:Eghrt3gad3@api-semiprod.cashstar.com/v2"
|
7
|
-
self.headers = {:accept => "application/json", :content_type => "application/json"}
|
8
|
-
|
9
|
-
def initialize args
|
10
|
-
args.each do |k,v|
|
11
|
-
#raise "#{k} Does Not Exist" if not instance_variable_defined? "@#{k}"
|
12
|
-
instance_variable_set("@#{k}", v) unless v.nil?
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Cashstar
|
3
|
-
module Entities
|
4
|
-
class Catalog < Base
|
5
|
-
|
6
|
-
|
7
|
-
def self.all()
|
8
|
-
json = JSON.parse RestClient.get remote_url, headers
|
9
|
-
merchants = []
|
10
|
-
json["merchants"]["merchant"].each do |merchant|
|
11
|
-
merchants << Merchant.new(merchant["merchant_code"],merchant["name"])
|
12
|
-
end
|
13
|
-
return merchants
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Cashstar
|
3
|
-
module Entities
|
4
|
-
|
5
|
-
class CreditCard < Base
|
6
|
-
attr_accessor :card_type, :account_number, :security_code, :expiration_date, :first_name, :last_name, :address, :address2, :city, :state_code, :postal_code, :country_code, :phone, :email
|
7
|
-
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
File without changes
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Cashstar
|
4
|
-
module Entities
|
5
|
-
|
6
|
-
class Faceplate < Base
|
7
|
-
|
8
|
-
attr_accessor :faceplate_code, :name, :text_color, :thumbnail, :preview, :print
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def self.all(merchant_code)
|
13
|
-
remote_url = self.remote_url + "/merchant/#{merchant_code}/faceplate/"
|
14
|
-
json = JSON.parse RestClient.get remote_url, headers
|
15
|
-
faceplates = []
|
16
|
-
json["faceplates"]["faceplate"].each do |faceplate|
|
17
|
-
faceplates << Faceplate.new(:faceplate_code => faceplate["faceplate_code"],:name => faceplate["name"],:text_color => faceplate["text_color"],
|
18
|
-
:thumbnail => faceplate["thumbnail"], :preview => faceplate["preview"], :print => faceplate["print"])
|
19
|
-
end
|
20
|
-
return faceplates
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Cashstar
|
3
|
-
module Entities
|
4
|
-
|
5
|
-
class GiftCertificate < Base
|
6
|
-
|
7
|
-
attr_accessor :egc_code, :egc_number, :access_code, :merchant_code, :initial_balance, :current_balance, :balance_last_updated
|
8
|
-
attr_accessor :balance_url, :currency, :active, :status, :url, :challenge, :challenge_description, :challenge_type, :faceplate_code
|
9
|
-
attr_accessor :audit_number, :delivery, :message
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Cashstar
|
3
|
-
module Entities
|
4
|
-
|
5
|
-
class Merchant < Base
|
6
|
-
attr_accessor :merchant_code, :name, :logo, :faceplates
|
7
|
-
|
8
|
-
|
9
|
-
def faceplates
|
10
|
-
@faceplates ||= Faceplate.all(@merchant_code)
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.all()
|
14
|
-
remote_url = self.remote_url + "/merchant/"
|
15
|
-
result = RestClient.get remote_url , headers
|
16
|
-
if result.code == 200
|
17
|
-
json = JSON.parse result
|
18
|
-
merchants = []
|
19
|
-
json["merchants"]["merchant"].each do |merchant|
|
20
|
-
merchants << Merchant.new(:merchant_code => merchant["merchant_code"], :name => merchant["name"])
|
21
|
-
end
|
22
|
-
return merchants
|
23
|
-
else
|
24
|
-
return result
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
module Cashstar
|
3
|
-
module Entities
|
4
|
-
|
5
|
-
class Order < Base
|
6
|
-
|
7
|
-
attr_accessor :order_number, :transaction_id, :audit_number, :activation_callback_url, :egc, :payment, :response
|
8
|
-
|
9
|
-
def post_json
|
10
|
-
"{ \"order\" : #{self.to_json}}"
|
11
|
-
end
|
12
|
-
|
13
|
-
def purchase
|
14
|
-
remote_url = self.remote_url + "/order/"
|
15
|
-
begin
|
16
|
-
result = RestClient.post remote_url, self.post_json, headers
|
17
|
-
self.response = result
|
18
|
-
print result.code
|
19
|
-
if result.code == 201
|
20
|
-
json = JSON.parse result
|
21
|
-
self.order_number = json["order"]["order_number"]
|
22
|
-
self.transaction_id = json["order"]["transaction_id"]
|
23
|
-
self.audit_number = json["order"]["audit_number"]
|
24
|
-
self.egc.url = json["order"]["egc"]["url"]
|
25
|
-
self.egc.status = json["order"]["egc"]["status"]
|
26
|
-
self.egc.initial_balance = json["order"]["egc"]["initial_balance"]
|
27
|
-
return true
|
28
|
-
else
|
29
|
-
return false
|
30
|
-
end
|
31
|
-
rescue => e
|
32
|
-
self.response = e.response
|
33
|
-
return false
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|