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 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