conekta 0.3.3 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +5 -11
  3. data/CHANGELOG +5 -0
  4. data/Gemfile +6 -1
  5. data/LICENSE.txt +22 -0
  6. data/README.md +59 -0
  7. data/Rakefile +1 -14
  8. data/conekta.gemspec +22 -22
  9. data/lib/conekta.rb +36 -290
  10. data/lib/conekta/card.rb +10 -34
  11. data/lib/conekta/charge.rb +14 -38
  12. data/lib/conekta/conekta_object.rb +64 -136
  13. data/lib/conekta/customer.rb +23 -25
  14. data/lib/conekta/error.rb +65 -0
  15. data/lib/conekta/event.rb +2 -2
  16. data/lib/conekta/operations/create.rb +19 -0
  17. data/lib/conekta/operations/create_member.rb +30 -0
  18. data/lib/conekta/operations/custom_action.rb +17 -0
  19. data/lib/conekta/operations/delete.rb +43 -0
  20. data/lib/conekta/operations/find.rb +28 -0
  21. data/lib/conekta/operations/update.rb +13 -0
  22. data/lib/conekta/operations/where.rb +28 -0
  23. data/lib/conekta/payment_method.rb +4 -0
  24. data/lib/conekta/plan.rb +8 -5
  25. data/lib/conekta/requestor.rb +55 -0
  26. data/lib/conekta/resource.rb +13 -0
  27. data/lib/conekta/subscription.rb +12 -26
  28. data/lib/conekta/token.rb +3 -2
  29. data/lib/conekta/util.rb +19 -91
  30. data/lib/conekta/version.rb +1 -1
  31. data/lib/ssl_data/ca_bundle.crt +66 -0
  32. data/spec/conekta_spec.rb +299 -808
  33. data/spec/spec_helper.rb +12 -0
  34. metadata +55 -72
  35. data/CONTRIBUTORS +0 -9
  36. data/Gemfile.lock +0 -57
  37. data/History.txt +0 -4
  38. data/LICENSE +0 -23
  39. data/README.rdoc +0 -30
  40. data/VERSION +0 -1
  41. data/bin/conekta-console +0 -7
  42. data/bin/test calls +0 -205
  43. data/gemfiles/default-with-activesupport.gemfile +0 -3
  44. data/gemfiles/json.gemfile +0 -4
  45. data/gemfiles/yajl.gemfile +0 -4
  46. data/lib/conekta/account.rb +0 -4
  47. data/lib/conekta/api_operations/create.rb +0 -16
  48. data/lib/conekta/api_operations/create_member.rb +0 -18
  49. data/lib/conekta/api_operations/delete.rb +0 -11
  50. data/lib/conekta/api_operations/list.rb +0 -16
  51. data/lib/conekta/api_operations/modify_member.rb +0 -12
  52. data/lib/conekta/api_operations/update.rb +0 -22
  53. data/lib/conekta/api_resource.rb +0 -33
  54. data/lib/conekta/errors/api_connection_error.rb +0 -4
  55. data/lib/conekta/errors/api_error.rb +0 -4
  56. data/lib/conekta/errors/authentication_error.rb +0 -4
  57. data/lib/conekta/errors/card_error.rb +0 -11
  58. data/lib/conekta/errors/conekta_error.rb +0 -20
  59. data/lib/conekta/errors/malformed_request_error.rb +0 -10
  60. data/lib/conekta/errors/parameter_validation_error.rb +0 -10
  61. data/lib/conekta/errors/resource_not_found_error.rb +0 -10
  62. data/lib/conekta/json.rb +0 -21
  63. data/lib/conekta/list_object.rb +0 -35
  64. data/lib/conekta/log.rb +0 -5
  65. data/lib/conekta/singleton_api_resource.rb +0 -20
  66. data/lib/data/ca-certificates.crt +0 -3918
  67. data/spec/conekta_with_active_support_spec.rb +0 -3
  68. data/spec/test_helper.rb +0 -338
data/lib/conekta/card.rb CHANGED
@@ -1,40 +1,16 @@
1
1
  module Conekta
2
- class Card < APIResource
3
- include Conekta::APIOperations::Update
4
-
5
- attr_accessor :customer
6
-
7
- def customer
8
- @customer
9
- end
10
-
11
- def customer=(customer)
12
- @customer = customer
13
- end
14
-
15
- def delete
16
- response, api_key = Conekta.request(:delete, url, @api_key)
17
- refresh_from(response, api_key)
18
- deleted_card = self
19
- i = 0
20
- for card in self.customer.cards
21
- if deleted_card.id == card.id
22
- self.customer.cards.delete_at(i)
23
- break
24
- end
25
- i = i + 1
26
- end
27
- deleted_card
28
- end
29
-
2
+ class Card < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
30
6
  def url
31
- unless id = self['id']
32
- raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{id.inspect}", 'id')
33
- end
34
- unless customer = self.customer
35
- raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
7
+ if id == nil || id == ""
8
+ raise Error.new('Could not get the id of ' + self.class.class_name + ' instance.')
36
9
  end
37
- "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/cards/#{CGI.escape(id)}"
10
+ self.customer.url + self.class.url + "/" + id
11
+ end
12
+ def delete
13
+ self.delete_member('customer','cards')
38
14
  end
39
15
  end
40
16
  end
@@ -1,43 +1,19 @@
1
1
  module Conekta
2
- class Charge < APIResource
3
- include Conekta::APIOperations::List
4
- include Conekta::APIOperations::Create
5
- include Conekta::APIOperations::Update
6
-
7
- def refund(params={})
8
- response, api_key = Conekta.request(:post, refund_url, @api_key, params)
9
- refresh_from(response, api_key)
10
- self
2
+ class Charge < Resource
3
+ include Conekta::Operations::Find
4
+ include Conekta::Operations::Where
5
+ include Conekta::Operations::Create
6
+ include Conekta::Operations::CustomAction
7
+ def capture
8
+ custom_action(:post, 'capture', nil)
11
9
  end
12
-
13
- def capture(params={})
14
- response, api_key = Conekta.request(:post, capture_url, @api_key, params)
15
- refresh_from(response, api_key)
16
- self
17
- end
18
-
19
- def update_dispute(params)
20
- response, api_key = Conekta.request(:post, dispute_url, @api_key, params)
21
- refresh_from({ :dispute => response }, api_key, true)
22
- dispute
23
- end
24
-
25
- private
26
-
27
- def refund_url
28
- url + '/refund'
29
- end
30
-
31
- def capture_url
32
- url + '/capture'
33
- end
34
-
35
- def dispute_url
36
- url + '/dispute'
37
- end
38
-
39
- def charges
40
- Event.all({ :charge_id => id }, @api_key)
10
+ def refund(params=nil)
11
+ if params == nil
12
+ params = {"amount" => self.amount}
13
+ else
14
+ params = {"amount" => params}
15
+ end
16
+ custom_action(:post, 'refund', params)
41
17
  end
42
18
  end
43
19
  end
@@ -1,158 +1,86 @@
1
1
  module Conekta
2
- class ConektaObject
3
- include Enumerable
4
-
5
- attr_accessor :api_key
6
- @@permanent_attributes = Set.new([:api_key, :id])
7
-
8
- # The default :id method is deprecated and isn't useful to us
9
- if method_defined?(:id)
10
- undef :id
2
+ class ConektaObject < Hash
3
+ attr_reader :id
4
+ attr_reader :values
5
+ def initialize(id=nil)
6
+ @values = Hash.new
7
+ @id = id.to_s
11
8
  end
12
-
13
- def initialize(id=nil, api_key=nil)
14
- # parameter overloading!
15
- if id.kind_of?(Hash)
16
- @retrieve_options = id.dup
17
- @retrieve_options.delete(:id)
18
- id = id[:id]
19
- else
20
- @retrieve_options = {}
21
- end
22
-
23
- @api_key = api_key
24
- @values = {}
25
- # This really belongs in APIResource, but not putting it there allows us
26
- # to have a unified inspect method
27
- @unsaved_values = Set.new
28
- @transient_values = Set.new
29
- self.id = id if id
9
+ def set_val(k,v)
10
+ @values[k] = v
30
11
  end
31
-
32
- def self.construct_from(values, api_key=nil)
33
- obj = self.new(values[:id], api_key)
34
- obj.refresh_from(values, api_key)
35
- obj
12
+ def unset_key(k)
13
+ @values.delete(k)
36
14
  end
37
-
38
- def to_s(*args)
39
- Conekta::JSON.dump(@values, :pretty => true)
15
+ def first
16
+ self[0]
40
17
  end
41
-
42
- def inspect()
43
- id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
44
- "#<#{self.class}:0x#{self.object_id.to_s(16)}#{id_string}> JSON: " + Conekta::JSON.dump(@values, :pretty => true)
18
+ def last
19
+ self[self.count - 1]
45
20
  end
46
-
47
- def refresh_from(values, api_key, partial=false)
48
- @api_key = api_key
49
-
50
- removed = partial ? Set.new : Set.new(@values.keys - values.keys)
51
- added = Set.new(values.keys - @values.keys)
52
- # Wipe old state before setting new. This is useful for e.g. updating a
53
- # customer, where there is no persistent card parameter. Mark those values
54
- # which don't persist as transient
55
-
56
- instance_eval do
57
- remove_accessors(removed)
58
- add_accessors(added)
59
- end
60
- removed.each do |k|
61
- @values.delete(k)
62
- @transient_values.add(k)
63
- @unsaved_values.delete(k)
64
- end
65
- values.each do |k, v|
66
- @values[k] = Util.convert_to_conekta_object(v, api_key)
67
- @transient_values.delete(k)
68
- @unsaved_values.delete(k)
21
+ def load_from(response)
22
+ if response.instance_of?(Array)
23
+ response.each_with_index do |v, i|
24
+ load_from_enumerable(i,v)
25
+ end
26
+ elsif response.kind_of?(Hash)
27
+ response = response.to_hash if response.class != Hash
28
+ response.each do |k,v|
29
+ load_from_enumerable(k,v)
30
+ end
69
31
  end
70
32
  end
71
-
72
- def [](k)
73
- @values[k.to_sym]
74
- end
75
-
76
- def []=(k, v)
77
- send(:"#{k}=", v)
33
+ def to_s
34
+ @values.inspect
78
35
  end
79
-
80
- def keys
81
- @values.keys
82
- end
83
-
84
- def values
85
- @values.values
86
- end
87
-
88
- def to_json(*a)
89
- Conekta::JSON.dump(@values)
36
+ def inspect
37
+ if self.respond_to? :each
38
+ if self.class.class_name != "ConektaObject"
39
+ self.to_s
40
+ else
41
+ self.to_a.map{|x| x[1] }
42
+ end
43
+ else
44
+ super
45
+ end
90
46
  end
91
-
92
- def as_json(*a)
93
- @values.as_json(*a)
47
+ def self.class_name
48
+ self.name.split('::')[-1]
94
49
  end
95
-
96
- def to_hash
97
- @values
50
+ def class_name
51
+ self.class.name.split('::')[-1]
98
52
  end
99
-
100
- def each(&blk)
101
- @values.each(&blk)
53
+ def create_attr(k,v)
54
+ create_method( "#{k}=".to_sym ) { |val|
55
+ instance_variable_set( "@" + k, val)
56
+ }
57
+ self.send("#{k}=".to_sym, v)
58
+ self.class.send(:remove_method, "#{k}=".to_sym)
59
+ create_method( k.to_sym ) {
60
+ instance_variable_get( "@" + k )
61
+ }
102
62
  end
103
-
104
63
  protected
105
-
106
- def metaclass
107
- class << self; self; end
108
- end
109
-
110
- def remove_accessors(keys)
111
- metaclass.instance_eval do
112
- keys.each do |k|
113
- next if @@permanent_attributes.include?(k)
114
- k_eq = :"#{k}="
115
- remove_method(k) if method_defined?(k)
116
- remove_method(k_eq) if method_defined?(k_eq)
117
- end
64
+ def to_hash
65
+ hash = Hash.new
66
+ self.values.each do |k,v|
67
+ hash[k] = v
118
68
  end
69
+ hash
119
70
  end
120
-
121
- def add_accessors(keys)
122
- metaclass.instance_eval do
123
- keys.each do |k|
124
- next if @@permanent_attributes.include?(k)
125
- k_eq = :"#{k}="
126
- define_method(k) { @values[k] }
127
- define_method(k_eq) do |v|
128
- @values[k] = v
129
- @unsaved_values.add(k)
130
- end
131
- end
132
- end
71
+ def create_method( name, &block )
72
+ self.class.send( :define_method, name, &block )
133
73
  end
134
-
135
- def method_missing(name, *args)
136
- # TODO: only allow setting in updateable classes.
137
- if name.to_s.end_with?('=')
138
- attr = name.to_s[0...-1].to_sym
139
- @values[attr] = args[0]
140
- @unsaved_values.add(attr)
141
- add_accessors([attr])
142
- return
143
- else
144
- return @values[name] if @values.has_key?(name)
74
+ def load_from_enumerable(k,v)
75
+ if v.respond_to? :each and !v.instance_of?(ConektaObject)
76
+ v = Conekta::Util.convert_to_conekta_object(v)
145
77
  end
146
-
147
- begin
148
- super
149
- rescue NoMethodError => e
150
- if @transient_values.include?(name)
151
- raise NoMethodError.new(e.message + ". HINT: The '#{name}' attribute was set in the past, however. It was then wiped when refreshing the object with the result returned by Conekta's API, probably as a result of a save(). The attributes currently available on this object are: #{@values.keys.join(', ')}")
152
- else
153
- raise
154
- end
78
+ if self.instance_of?(ConektaObject)
79
+ self[k] = v
80
+ else
81
+ self.create_attr(k,v)
155
82
  end
83
+ self.set_val(k,v)
156
84
  end
157
85
  end
158
86
  end
@@ -1,34 +1,32 @@
1
1
  module Conekta
2
- class Customer < APIResource
3
- include Conekta::APIOperations::Create
4
- include Conekta::APIOperations::Delete
5
- include Conekta::APIOperations::Update
6
- include Conekta::APIOperations::List
7
- include Conekta::APIOperations::CreateMember
8
-
9
- def refresh_from(values, api_key, partial=false)
10
- super
2
+ class Customer < Resource
3
+ include Conekta::Operations::Find
4
+ include Conekta::Operations::Where
5
+ include Conekta::Operations::Create
6
+ include Conekta::Operations::Delete
7
+ include Conekta::Operations::Update
8
+ include Conekta::Operations::CustomAction
9
+ include Conekta::Operations::CreateMember
10
+ def load_from(response=nil)
11
+ if response
12
+ super
13
+ end
11
14
  customer = self
12
- for i in 0..(customer.cards.count - 1)
13
- customer.cards[i].customer = customer
15
+ self.cards.each do |k,v|
16
+ if !v.respond_to? :deleted or !v.deleted
17
+ v.create_attr('customer', customer)
18
+ self.cards.set_val(k,v)
19
+ end
14
20
  end
15
- if customer.subscription
16
- customer.subscription.customer = customer
21
+ if self.respond_to? :subscription and self.subscription
22
+ self.subscription.create_attr('customer', customer)
17
23
  end
18
24
  end
19
-
20
- def create_subscription(params={})
21
- subscription = create_member('subscription', params)
22
- subscription.customer = self
23
- self.subscription = subscription
24
- subscription
25
+ def create_card(params)
26
+ self.create_member('cards', params)
25
27
  end
26
-
27
- def create_card(params={})
28
- card = create_member('cards', params)
29
- card.customer = self
30
- self.cards << card
31
- card
28
+ def create_subscription(params)
29
+ self.create_member('subscription', params)
32
30
  end
33
31
  end
34
32
  end
@@ -0,0 +1,65 @@
1
+ module Conekta
2
+ class Error < Exception
3
+ attr_reader :message
4
+ attr_reader :type
5
+ attr_reader :code
6
+ attr_reader :param
7
+
8
+ def initialize(message=nil, type=nil, code=nil, param=nil)
9
+ @message = message
10
+ @type = type
11
+ @code = code
12
+ @param = param
13
+ end
14
+ def class_name
15
+ self.class.name.split('::')[-1]
16
+ end
17
+ def self.error_handler(resp, code)
18
+ if resp.instance_of?(Hash)
19
+ @message = resp["message"] if resp.has_key?('message')
20
+ @type = resp["type"] if resp.has_key?('type')
21
+ @code = resp["code"] if resp.has_key?('code')
22
+ @param = resp["param"] if resp.has_key?('param')
23
+ end
24
+ if code == nil or code == 0 or code == nil or code == ""
25
+ raise NoConnectionError.new("Could not connect to #{Conekta.api_base}", @type, @code, @param)
26
+ end
27
+ case code
28
+ when 400
29
+ raise MalformedRequestError.new(@message, @type, @code, @params)
30
+ when 401
31
+ raise AuthenticationError.new(@message, @type, @code, @params)
32
+ when 402
33
+ raise ProcessingError.new(@message, @type, @code, @params)
34
+ when 404
35
+ raise ResourceNotFoundError.new(@message, @type, @code, @params)
36
+ when 422
37
+ raise ParameterValidationError.new(@message, @type, @code, @params)
38
+ when 500
39
+ raise ApiError.new(@message, @type, @code, @params)
40
+ else
41
+ raise Error.new(@message, @type, @code, @params)
42
+ end
43
+ end
44
+ end
45
+ class ApiError < Error
46
+ end
47
+
48
+ class NoConnectionError < Error
49
+ end
50
+
51
+ class AuthenticationError < Error
52
+ end
53
+
54
+ class ParameterValidationError < Error
55
+ end
56
+
57
+ class ProcessingError < Error
58
+ end
59
+
60
+ class ResourceNotFoundError < Error
61
+ end
62
+
63
+ class MalformedRequestError < Error
64
+ end
65
+ end