conekta 0.3.3 → 0.3.5

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