mango-ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/mango +1 -0
- data/lib/mango-ruby.rb +1 -0
- data/lib/mango.rb +71 -0
- data/lib/mango/operations.rb +44 -0
- data/lib/mango/resources.rb +37 -0
- data/test/mango_test.rb +57 -0
- data/test/test_helper.rb +62 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a06ece607502eda117d34c1913965520aa100b91
|
4
|
+
data.tar.gz: 36823a1833cd35ddd5c620e43d4c0fe99fdf6902
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ec69b30720dd1ca9492fbacf69820cab7553a8f070cceebcf97e67c1db296ccf857df6bf86139106b6674c4fdf919fceb4961ee7bfcb9a3a47bdd25b47cb3307
|
7
|
+
data.tar.gz: 2d7cc20e6ba1023689969646db61da12212493fd997d1c5f6f8fbd83080d807de4e2da9008d76a1d1c68b6ef049fe8c9b5cc8c4d04d63c66c241c0e966d8ea00
|
data/bin/mango
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
data/lib/mango-ruby.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/mango'
|
data/lib/mango.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'rest_client'
|
2
|
+
require 'json'
|
3
|
+
require_relative 'mango/resources'
|
4
|
+
|
5
|
+
module Mango
|
6
|
+
|
7
|
+
class Error < StandardError
|
8
|
+
include Enumerable
|
9
|
+
attr_accessor :errors
|
10
|
+
|
11
|
+
def initialize message, errors={}
|
12
|
+
super message
|
13
|
+
@errors = errors
|
14
|
+
end
|
15
|
+
|
16
|
+
# Yield [error_code, message] pairs
|
17
|
+
def each
|
18
|
+
@errors.each { |e| yield *e.first }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
@api_base = 'https://api.getmango.com/v1'
|
23
|
+
|
24
|
+
class << self
|
25
|
+
attr_accessor :api_key, :api_base
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.request(method, url, api_key=nil, params={}, headers={})
|
29
|
+
method = method.to_sym
|
30
|
+
|
31
|
+
url = @api_base + url
|
32
|
+
|
33
|
+
unless api_key ||= @api_key
|
34
|
+
raise Error.new('No API key provided')
|
35
|
+
end
|
36
|
+
|
37
|
+
payload = JSON.generate(params) if method == :post || method == :patch
|
38
|
+
|
39
|
+
headers = {
|
40
|
+
:content_type => 'application/json'
|
41
|
+
}.merge(headers)
|
42
|
+
|
43
|
+
options = {
|
44
|
+
:headers => headers,
|
45
|
+
:user => api_key,
|
46
|
+
:method => method,
|
47
|
+
:url => url,
|
48
|
+
:payload => payload
|
49
|
+
}
|
50
|
+
|
51
|
+
begin
|
52
|
+
response = execute_request(options)
|
53
|
+
return {} if response.code == 204 and method == :delete
|
54
|
+
JSON.parse(response.body, :symbolize_names => true)
|
55
|
+
rescue RestClient::Exception => e
|
56
|
+
handle_errors e
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def self.execute_request(options)
|
63
|
+
RestClient::Request.execute(options)
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.handle_errors exception
|
67
|
+
body = JSON.parse exception.http_body
|
68
|
+
raise Error.new(exception.to_s, body['errors'])
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Mango
|
2
|
+
module Operations
|
3
|
+
module ClassMethods
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def create params={}, api_key=nil
|
8
|
+
Mango.request :post, url, api_key, params
|
9
|
+
end
|
10
|
+
|
11
|
+
def list params={}, api_key=nil
|
12
|
+
Mango.request :get, url, api_key, params
|
13
|
+
end
|
14
|
+
|
15
|
+
def retrieve uid, params={}, api_key=nil
|
16
|
+
require_uid uid
|
17
|
+
Mango.request :get, url(uid), api_key, params
|
18
|
+
end
|
19
|
+
|
20
|
+
def update uid, params={}, api_key=nil
|
21
|
+
require_uid uid
|
22
|
+
Mango.request :patch, url(uid), api_key, params
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete uid, params={}, api_key=nil
|
26
|
+
require_uid uid
|
27
|
+
Mango.request :delete, url(uid), api_key, params
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete_all params={}, api_key=nil
|
31
|
+
Mango.request :delete, url, api_key, params
|
32
|
+
end
|
33
|
+
|
34
|
+
def require_uid uid
|
35
|
+
raise Error.new('UID is required') if uid.nil? || uid == ''
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.included(base)
|
41
|
+
base.extend(ClassMethods)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative 'operations'
|
2
|
+
|
3
|
+
module Mango
|
4
|
+
class Resource
|
5
|
+
include Operations
|
6
|
+
|
7
|
+
def self.url id=nil
|
8
|
+
resource_name = self.name.split('::').last.downcase
|
9
|
+
id ? "/#{resource_name}/#{id}/" : "/#{resource_name}/"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Customers < Resource
|
14
|
+
public_class_method :create, :retrieve, :list, :update, :delete
|
15
|
+
end
|
16
|
+
|
17
|
+
class Charges < Resource
|
18
|
+
public_class_method :create, :retrieve, :list
|
19
|
+
end
|
20
|
+
|
21
|
+
class Refunds < Resource
|
22
|
+
public_class_method :create, :retrieve, :list
|
23
|
+
end
|
24
|
+
|
25
|
+
class Cards < Resource
|
26
|
+
public_class_method :create, :retrieve, :list, :update, :delete
|
27
|
+
end
|
28
|
+
|
29
|
+
class Queue < Resource
|
30
|
+
public_class_method :create, :retrieve, :list, :delete, :delete_all
|
31
|
+
end
|
32
|
+
|
33
|
+
class Installments < Resource
|
34
|
+
public_class_method :retrieve
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/test/mango_test.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path("../lib/mango", File.dirname(__FILE__))
|
2
|
+
require File.expand_path("test_helper", File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require "cutest"
|
5
|
+
require "mocha/api"
|
6
|
+
include Mocha::API
|
7
|
+
|
8
|
+
prepare do
|
9
|
+
Mango.api_key = '1234'
|
10
|
+
end
|
11
|
+
|
12
|
+
setup do
|
13
|
+
Mango.mock_rest_client = mock
|
14
|
+
end
|
15
|
+
|
16
|
+
test "resource url" do
|
17
|
+
assert_equal '/customers/', Mango::Customers.url
|
18
|
+
assert_equal '/customers/123/', Mango::Customers.url(123)
|
19
|
+
end
|
20
|
+
|
21
|
+
test "operation retrieve" do |mock|
|
22
|
+
mock.expects(:get).once.with('https://api.getmango.com/v1/customers/123/').returns(test_response(test_customer))
|
23
|
+
customer = Mango::Customers.retrieve 123
|
24
|
+
assert_equal "customer_hash", customer[:uid]
|
25
|
+
end
|
26
|
+
|
27
|
+
test "operation list" do |mock|
|
28
|
+
mock.expects(:get).once.with('https://api.getmango.com/v1/customers/').returns(test_response([test_customer]))
|
29
|
+
customers = Mango::Customers.list
|
30
|
+
assert_equal "customer_hash", customers.first[:uid]
|
31
|
+
end
|
32
|
+
|
33
|
+
test "operation create" do |mock|
|
34
|
+
mock.expects(:post).once.with('https://api.getmango.com/v1/customers/', anything).returns(test_response(test_customer))
|
35
|
+
customer = Mango::Customers.create customer_params
|
36
|
+
assert_equal "customer_hash", customer[:uid]
|
37
|
+
end
|
38
|
+
|
39
|
+
test "operation update" do |mock|
|
40
|
+
mock.expects(:patch).once.with('https://api.getmango.com/v1/customers/123/', anything).returns(test_response(test_customer))
|
41
|
+
customer = Mango::Customers.update 123, customer_params
|
42
|
+
assert_equal "customer_hash", customer[:uid]
|
43
|
+
end
|
44
|
+
|
45
|
+
test "operation delete" do |mock|
|
46
|
+
mock.expects(:delete).once.with('https://api.getmango.com/v1/customers/123/').returns(test_response(test_customer))
|
47
|
+
customer = Mango::Customers.delete 123
|
48
|
+
assert_equal "customer_hash", customer[:uid]
|
49
|
+
end
|
50
|
+
|
51
|
+
test "exception handle" do |mock|
|
52
|
+
mock.expects(:post).once.raises(bad_request)
|
53
|
+
exception = assert_raise(Mango::Error) do
|
54
|
+
Mango::Customers.create({number: "error"})
|
55
|
+
end
|
56
|
+
assert_equal ['4051', 'Bad Request: The request could not be understood by the server due to malformed syntax.'], exception.first
|
57
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
module Mango
|
2
|
+
@mock_rest_client = nil
|
3
|
+
|
4
|
+
def self.mock_rest_client=(mock_client)
|
5
|
+
@mock_rest_client = mock_client
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.execute_request(options)
|
9
|
+
case options[:method]
|
10
|
+
when :get
|
11
|
+
@mock_rest_client.get options[:url]
|
12
|
+
when :post
|
13
|
+
@mock_rest_client.post options[:url], options[:payload]
|
14
|
+
when :patch
|
15
|
+
@mock_rest_client.patch options[:url], options[:payload]
|
16
|
+
when :delete
|
17
|
+
@mock_rest_client.delete options[:url]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Response = Struct.new :body, :code
|
23
|
+
|
24
|
+
def test_response body, code=200
|
25
|
+
Response.new JSON.generate(body), code
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_customer(params={})
|
29
|
+
{
|
30
|
+
uid: "customer_hash",
|
31
|
+
name: "John Doe",
|
32
|
+
email: "johndoe@example.com",
|
33
|
+
live: false,
|
34
|
+
meta: "",
|
35
|
+
default_card: "card_id",
|
36
|
+
cards: [{
|
37
|
+
exp_year: 2020,
|
38
|
+
cardtype: "visa",
|
39
|
+
exp_month: 1,
|
40
|
+
uid: "card_id",
|
41
|
+
last4: "0010"
|
42
|
+
}],
|
43
|
+
created_at: "2014-11-26 04:53:36",
|
44
|
+
updated_at: "2014-11-26 04:53:36"
|
45
|
+
}.merge(params)
|
46
|
+
end
|
47
|
+
|
48
|
+
def customer_params
|
49
|
+
{
|
50
|
+
email: "johndoe@email.com",
|
51
|
+
name: "John Doe"
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def bad_request
|
56
|
+
json = {
|
57
|
+
"errors" => [{
|
58
|
+
"4051" => "Bad Request: The request could not be understood by the server due to malformed syntax."
|
59
|
+
}]
|
60
|
+
}
|
61
|
+
RestClient::Exception.new(test_response(json, 404), 400)
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mango-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mango development team
|
8
|
+
- Joaquín Vicente
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-12-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rest-client
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.7'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '1.7'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: cutest
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ~>
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.2'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.2'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: mocha
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.1'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '1.1'
|
56
|
+
description: |-
|
57
|
+
API to interact with Mango
|
58
|
+
https://getmango.com/
|
59
|
+
email:
|
60
|
+
- support@getmango.com
|
61
|
+
executables:
|
62
|
+
- mango
|
63
|
+
extensions: []
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
66
|
+
- bin/mango
|
67
|
+
- lib/mango.rb
|
68
|
+
- lib/mango-ruby.rb
|
69
|
+
- lib/mango/resources.rb
|
70
|
+
- lib/mango/operations.rb
|
71
|
+
- test/mango_test.rb
|
72
|
+
- test/test_helper.rb
|
73
|
+
homepage: https://getmango.com/
|
74
|
+
licenses:
|
75
|
+
- MIT
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.0.3
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: Ruby wrapper for Mango API
|
97
|
+
test_files:
|
98
|
+
- test/mango_test.rb
|
99
|
+
- test/test_helper.rb
|