mango-ruby 0.0.1

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