mango-ruby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|