pagarme 0.15 → 1.0
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/Gemfile.lock +50 -0
- data/Rakefile +16 -0
- data/lib/pagarme.rb +19 -23
- data/lib/pagarme/address.rb +4 -0
- data/lib/pagarme/customer.rb +4 -0
- data/lib/pagarme/errors.rb +20 -6
- data/lib/pagarme/model.rb +53 -0
- data/lib/pagarme/pagarme_object.rb +141 -0
- data/lib/pagarme/phone.rb +4 -0
- data/lib/pagarme/plan.rb +56 -0
- data/lib/pagarme/request.rb +15 -15
- data/lib/pagarme/subscription.rb +36 -0
- data/lib/pagarme/transaction.rb +16 -153
- data/lib/pagarme/transaction_common.rb +82 -0
- data/lib/pagarme/util.rb +75 -0
- data/pagarme.gemspec +7 -5
- data/pagarme.rb +0 -40
- data/test/pagarme/plan.rb +65 -0
- data/test/pagarme/subscription.rb +29 -0
- data/test/pagarme/transaction.rb +131 -0
- data/test/test_helper.rb +166 -0
- metadata +85 -28
- data/lib/pagarme/utils.rb +0 -5
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 44500eb2b6f419659836569ebed302b4ad53fdc2
|
4
|
+
data.tar.gz: 9fd134b080deae4a281459288df9b4775f584bc5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9b3164829fee223d759a326148a7384408dc9755cfe652f0564c7c3947a8b90b3e0bb722490216d019440c5494429d9325fb501383582a1e39f7c49414fcd87
|
7
|
+
data.tar.gz: b64dccc95beff0f54b9f0c708ad76fb74a78fca7df5b397b74faed2d3045735ec45178fbe9c1bdb6b79ff408fb3cafebaafcd21ea0117fa89966c9c3f00159c8
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
pagarme (1.0)
|
5
|
+
multi_json
|
6
|
+
rest-client
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activesupport (4.0.0)
|
12
|
+
i18n (~> 0.6, >= 0.6.4)
|
13
|
+
minitest (~> 4.2)
|
14
|
+
multi_json (~> 1.3)
|
15
|
+
thread_safe (~> 0.1)
|
16
|
+
tzinfo (~> 0.3.37)
|
17
|
+
atomic (1.1.14)
|
18
|
+
bourne (1.5.0)
|
19
|
+
mocha (>= 0.13.2, < 0.15)
|
20
|
+
i18n (0.6.5)
|
21
|
+
metaclass (0.0.1)
|
22
|
+
mime-types (2.0)
|
23
|
+
minitest (4.7.5)
|
24
|
+
mocha (0.14.0)
|
25
|
+
metaclass (~> 0.0.1)
|
26
|
+
multi_json (1.8.2)
|
27
|
+
rake (10.1.0)
|
28
|
+
rest-client (1.6.7)
|
29
|
+
mime-types (>= 1.16)
|
30
|
+
shoulda (3.4.0)
|
31
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
32
|
+
shoulda-matchers (~> 1.0, >= 1.4.1)
|
33
|
+
shoulda-context (1.1.5)
|
34
|
+
shoulda-matchers (1.5.6)
|
35
|
+
activesupport (>= 3.0.0)
|
36
|
+
bourne (~> 1.3)
|
37
|
+
test-unit (2.5.5)
|
38
|
+
thread_safe (0.1.3)
|
39
|
+
atomic
|
40
|
+
tzinfo (0.3.38)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
bundler (~> 1.3)
|
47
|
+
pagarme!
|
48
|
+
rake
|
49
|
+
shoulda (~> 3.4.0)
|
50
|
+
test-unit
|
data/Rakefile
CHANGED
@@ -1 +1,17 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
task :default => [:all]
|
4
|
+
|
5
|
+
task :test do
|
6
|
+
ret = true
|
7
|
+
Dir["test/**/*.rb"].each do |f|
|
8
|
+
ret = ret && ruby(f, '')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
task :all do
|
13
|
+
Rake::Task["test"].invoke
|
14
|
+
require 'active_support/all'
|
15
|
+
Rake::Task["test"].reenable
|
16
|
+
Rake::Task["test"].invoke
|
17
|
+
end
|
data/lib/pagarme.rb
CHANGED
@@ -1,48 +1,44 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'pagarme/pagarme_object'
|
2
|
+
require 'pagarme/util'
|
3
|
+
require 'pagarme/model'
|
4
|
+
require 'pagarme/transaction_common'
|
5
|
+
require 'pagarme/customer'
|
6
|
+
require 'pagarme/phone'
|
7
|
+
require 'pagarme/address'
|
8
|
+
require 'pagarme/subscription'
|
9
|
+
require 'pagarme/transaction'
|
10
|
+
require 'pagarme/plan'
|
11
|
+
require 'pagarme/request'
|
12
|
+
require 'pagarme/errors'
|
4
13
|
|
5
14
|
module PagarMe
|
6
|
-
|
7
15
|
@@api_key = nil
|
8
|
-
@@api_endpoint = 'https://
|
16
|
+
@@api_endpoint = 'https://api.pagar.me'
|
9
17
|
@@api_version = '1'
|
10
18
|
@@live = true
|
11
19
|
@@api_card_encryption_public_key = File.join(File.dirname(__FILE__), '..', 'certs/public_key.pem')
|
12
20
|
|
13
21
|
def self.api_key=(api_key)
|
14
|
-
|
22
|
+
@@api_key = api_key
|
15
23
|
end
|
16
24
|
|
17
25
|
def self.api_key
|
18
|
-
|
26
|
+
@@api_key
|
19
27
|
end
|
20
28
|
|
21
29
|
def self.api_card_encryption_public_key
|
22
|
-
|
30
|
+
@@api_card_encryption_public_key
|
23
31
|
end
|
24
32
|
|
25
33
|
def self.full_api_url(relative_path)
|
26
|
-
|
34
|
+
"#{@@api_endpoint}/#{@@api_version}#{relative_path}"
|
27
35
|
end
|
28
36
|
|
29
37
|
def self.live
|
30
|
-
|
38
|
+
@@live
|
31
39
|
end
|
32
40
|
|
33
41
|
def self.live=(live)
|
34
|
-
|
42
|
+
@@live = live
|
35
43
|
end
|
36
|
-
|
37
|
-
# def self.request(method, url, parameters)
|
38
|
-
# request_options = {
|
39
|
-
# :method => method,
|
40
|
-
# :url => self.full_api_url(url)
|
41
|
-
# :headers => nil,
|
42
|
-
# :open_timeout => 30,
|
43
|
-
# :payload => payload,
|
44
|
-
# :timeout => 80,
|
45
|
-
# }
|
46
|
-
# end
|
47
|
-
|
48
44
|
end
|
data/lib/pagarme/errors.rb
CHANGED
@@ -1,11 +1,25 @@
|
|
1
1
|
module PagarMe
|
2
2
|
class PagarMeError < StandardError
|
3
|
-
|
4
|
-
|
3
|
+
attr_accessor :message
|
4
|
+
attr_accessor :parameter_name
|
5
|
+
attr_accessor :type
|
6
|
+
attr_accessor :url
|
7
|
+
attr_accessor :errors
|
5
8
|
|
6
|
-
def initialize(message=
|
7
|
-
|
8
|
-
|
9
|
+
def initialize(message = "", parameter_name = "", type = "", url = "")
|
10
|
+
self.message = message
|
11
|
+
self.type = type
|
12
|
+
self.parameter_name = parameter_name
|
13
|
+
self.errors = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.initFromServerResponse(response = {})
|
17
|
+
object = self.new
|
18
|
+
response['errors'].map do |error|
|
19
|
+
object.message += error['message'] + ', '
|
20
|
+
object.errors << PagarMeError.new(error['message'], error['parameter_name'], error['type'], response['url'])
|
21
|
+
end
|
22
|
+
object
|
9
23
|
end
|
10
24
|
|
11
25
|
def to_s
|
@@ -13,7 +27,7 @@ module PagarMe
|
|
13
27
|
end
|
14
28
|
end
|
15
29
|
|
16
|
-
class
|
30
|
+
class RequestError < PagarMeError
|
17
31
|
end
|
18
32
|
|
19
33
|
class ConnectionError < PagarMeError
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module PagarMe
|
2
|
+
class Model < PagarMeObject
|
3
|
+
|
4
|
+
def self.class_name
|
5
|
+
self.name.split('::')[-1]
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.url()
|
9
|
+
if self == Model
|
10
|
+
raise PagarMeError.new('Cant request for model')
|
11
|
+
end
|
12
|
+
"/#{CGI.escape(class_name.downcase)}s"
|
13
|
+
end
|
14
|
+
|
15
|
+
def url
|
16
|
+
raise PagarMeError.new("ID invalido", 'id') if !self.id
|
17
|
+
"#{self.class.url}/#{CGI.escape(id.to_s)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
request = PagarMe::Request.new(self.class.url, 'POST')
|
22
|
+
request.parameters = self.to_hash
|
23
|
+
response = request.run
|
24
|
+
update(response)
|
25
|
+
end
|
26
|
+
|
27
|
+
def save
|
28
|
+
request = PagarMe::Request.new(self.url, 'PUT')
|
29
|
+
request.parameters = self.unsaved_values
|
30
|
+
response = request.run
|
31
|
+
update(response)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.find_by_id(id)
|
35
|
+
request = PagarMe::Request.new(self.url + "/#{id}", 'GET')
|
36
|
+
response = request.run
|
37
|
+
PagarMe::Util.convert_to_pagarme_object(response)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.all(page = 1, count = 10)
|
41
|
+
raise RequestError.new("Invalid page count") if page < 1 or count < 1
|
42
|
+
|
43
|
+
request = PagarMe::Request.new(url, 'GET')
|
44
|
+
request.parameters = {
|
45
|
+
:page => page,
|
46
|
+
:count => count
|
47
|
+
}
|
48
|
+
|
49
|
+
response = request.run
|
50
|
+
response.map { |obj_response| self.new(obj_response) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module PagarMe
|
5
|
+
class PagarMeObject
|
6
|
+
|
7
|
+
def initialize(response = {})
|
8
|
+
#init @attributes - which are the attributes in the object
|
9
|
+
@attributes = {}
|
10
|
+
|
11
|
+
# filters - which are the filters that will be called when appropriate , such as before_set
|
12
|
+
@filters = {}
|
13
|
+
|
14
|
+
# Values that were changed in the object but weren't saved
|
15
|
+
@unsaved_values = Set.new
|
16
|
+
|
17
|
+
#Update object
|
18
|
+
update(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.build(attributes)
|
22
|
+
object = self.new(attributes)
|
23
|
+
return object
|
24
|
+
end
|
25
|
+
|
26
|
+
def update(attributes)
|
27
|
+
|
28
|
+
removed = Set.new(@attributes.keys - attributes.keys)
|
29
|
+
added = Set.new(attributes.keys - @attributes.keys)
|
30
|
+
|
31
|
+
instance_eval do
|
32
|
+
remove_attribute(removed)
|
33
|
+
add_attribute(added)
|
34
|
+
end
|
35
|
+
|
36
|
+
removed.each do |key|
|
37
|
+
@attributes.delete(key)
|
38
|
+
@unsaved_values.delete(key)
|
39
|
+
end
|
40
|
+
|
41
|
+
attributes.each do |key, value|
|
42
|
+
@attributes[key] = Util.convert_to_pagarme_object(value)
|
43
|
+
@unsaved_values.delete(key)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def each(&block)
|
48
|
+
@attributes.each(&block)
|
49
|
+
end
|
50
|
+
|
51
|
+
def []=(key,value)
|
52
|
+
@attributes[key] = value
|
53
|
+
end
|
54
|
+
|
55
|
+
def [](key)
|
56
|
+
@attributes[key.to_sym]
|
57
|
+
end
|
58
|
+
|
59
|
+
def unsaved_values
|
60
|
+
values = {}
|
61
|
+
@unsaved_values.each do |k|
|
62
|
+
if(@attributes[k].kind_of?(PagarMeObject))
|
63
|
+
values[k] = @attributes[k].unsaved_values
|
64
|
+
else
|
65
|
+
values[k] = @attributes[k]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
values
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_hash
|
72
|
+
ret_attributes = {}
|
73
|
+
@attributes.each do |k,v|
|
74
|
+
if @attributes[k].kind_of?(PagarMeObject)
|
75
|
+
ret_attributes[k] = @attributes[k].to_hash if @attributes[k].kind_of?(PagarMeObject)
|
76
|
+
else
|
77
|
+
ret_attributes[k] = @attributes[k]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
return ret_attributes
|
81
|
+
end
|
82
|
+
|
83
|
+
protected
|
84
|
+
|
85
|
+
def metaclass
|
86
|
+
class << self; self; end
|
87
|
+
end
|
88
|
+
|
89
|
+
def remove_attribute(keys)
|
90
|
+
metaclass.instance_eval do
|
91
|
+
keys.each do |key|
|
92
|
+
key_sym = :"#{key}="
|
93
|
+
remove_method(key) if method_defined?(key)
|
94
|
+
remove_method(key_sym) if method_defined?(key_sym)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def add_attribute(keys)
|
100
|
+
metaclass.instance_eval do
|
101
|
+
keys.each do |key|
|
102
|
+
key_set = "#{key}="
|
103
|
+
define_method(key) { @attributes[key] }
|
104
|
+
define_method(key_set) do |value|
|
105
|
+
if @filters[key]
|
106
|
+
@filters[key].each do |meth|
|
107
|
+
if methods.include?(meth)
|
108
|
+
@attributes[key] = method(meth).call(value)
|
109
|
+
@unsaved_values.add(key)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
else
|
113
|
+
@attributes[key] = value
|
114
|
+
@unsaved_values.add(key)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def before_set_filter(attribute, method)
|
122
|
+
@filters[attribute.to_sym] = Array.new unless @filters[attribute.to_sym]
|
123
|
+
@filters[attribute.to_sym] << method.to_sym
|
124
|
+
end
|
125
|
+
|
126
|
+
def method_missing(name, *args)
|
127
|
+
if name.to_s.end_with?('=')
|
128
|
+
attr = name.to_s[0...-1].to_sym
|
129
|
+
add_attribute([attr])
|
130
|
+
begin
|
131
|
+
mth = method(name)
|
132
|
+
rescue NameError
|
133
|
+
raise NoMethodError.new("O atributo #{name} nao e permitido.")
|
134
|
+
end
|
135
|
+
return mth.call(args[0])
|
136
|
+
else
|
137
|
+
return @attributes[name] if @attributes.has_key?(name)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
data/lib/pagarme/plan.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module PagarMe
|
4
|
+
class Plan < Model
|
5
|
+
def initialize(response = {})
|
6
|
+
super
|
7
|
+
before_set_filter :amount, :format_amount
|
8
|
+
end
|
9
|
+
|
10
|
+
def create
|
11
|
+
validate
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def save
|
16
|
+
raise PagarMeError.new('O plano precisa estar criado para poder ser atualizado!', 'internal_error') unless self.id
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def format_amount(amount)
|
21
|
+
if amount.kind_of?(String)
|
22
|
+
value = amount.gsub(/\./, "")
|
23
|
+
value = value.strip
|
24
|
+
value = value.match(/\d+/)[0]
|
25
|
+
amount = value
|
26
|
+
end
|
27
|
+
amount
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def validate
|
33
|
+
error = PagarMeError.new
|
34
|
+
if !self[:amount] || self.amount.to_i <= 0
|
35
|
+
error.errors << PagarMeError.new('Valor invalido', 'amount')
|
36
|
+
end
|
37
|
+
if !self[:days] || self.days.to_i <= 0
|
38
|
+
error.errors << PagarMeError.new('Numero de dias invalido', 'days')
|
39
|
+
end
|
40
|
+
if !self[:name] || self.name.length <= 0
|
41
|
+
error.errors << PagarMeError.new('Nome invalido', 'name')
|
42
|
+
end
|
43
|
+
if self[:trial_days] && self.trial_days.to_i < 0
|
44
|
+
error.errors << PagarMeError.new('Dias de teste invalido', 'trial_days')
|
45
|
+
end
|
46
|
+
|
47
|
+
if(error.errors.any?)
|
48
|
+
error.message = error.errors.map {|e| e.message}
|
49
|
+
error.message = error.message.join(',')
|
50
|
+
raise error
|
51
|
+
else
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|