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/event.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Conekta
2
- class Event < APIResource
3
- include Conekta::APIOperations::List
2
+ class Event < Resource
3
+ include Conekta::Operations::Where
4
4
  end
5
5
  end
@@ -0,0 +1,19 @@
1
+ module Conekta
2
+ module Operations
3
+ module Create
4
+ module ClassMethods
5
+ def create(params)
6
+ requestor = Requestor.new
7
+ url = Util.types[self.class_name.downcase].url
8
+ response = requestor.request(:post, url, params)
9
+ instance = self.new
10
+ instance.load_from(response)
11
+ instance
12
+ end
13
+ end
14
+ def self.included(base)
15
+ base.extend(ClassMethods)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ module Operations
3
+ module CreateMember
4
+ def create_member(member, params)
5
+ url = self.url + "/" + member
6
+ member = member.to_sym
7
+ requestor = Requestor.new
8
+ response = requestor.request(:post, url, params)
9
+ if self.method(member).call and self.method(member).call.class.class_name == "ConektaObject"
10
+ arr = []
11
+ self.method(member).call.values.each do |(k,v)|
12
+ arr << v.to_hash
13
+ end
14
+ arr << response
15
+ self.method(member).call.load_from(arr)
16
+ self.load_from
17
+ instances = self.method(member).call
18
+ instance = instances.last
19
+ else
20
+ instance = Util.types[member.to_s].new()
21
+ instance.load_from(response)
22
+ self.create_attr(member.to_s, instance)
23
+ self.set_val(member.to_sym, instance)
24
+ self.load_from
25
+ end
26
+ instance
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ module Conekta
2
+ module Operations
3
+ module CustomAction
4
+ def custom_action(method, action=nil, params=nil)
5
+ requestor = Requestor.new
6
+ if action
7
+ url = self.url + "/" + action
8
+ else
9
+ url = self.url
10
+ end
11
+ response = requestor.request(method, url, params)
12
+ self.load_from(response)
13
+ self
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ module Conekta
2
+ module Operations
3
+ module Delete
4
+ def delete
5
+ self.custom_action(:delete, nil, nil)
6
+ self
7
+ end
8
+ def delete_member(parent, member)
9
+ self.custom_action(:delete, nil, nil)
10
+ parent = parent.to_sym
11
+ member = member.to_sym
12
+ obj = self.method(parent).call.method(member).call
13
+ if obj.class.class_name == "ConektaObject"
14
+ self.method(parent).call.method(member).call.each do |(k, v)|
15
+ if v.id == self.id
16
+ self.method(parent).call.method(member).call[k] = nil
17
+ # Shift hash array
18
+ shift = false
19
+ self.method(parent).call.method(member).call.each_with_index do |v,i|
20
+ if shift
21
+ self.method(parent).call.method(member).call.set_val(i-1,v[1])
22
+ self.method(parent).call.method(member).call[i-1] = v[1]
23
+ end
24
+ if v[1] == nil
25
+ shift = true
26
+ end
27
+ end
28
+ n_members = self.method(parent).call.method(member).call.count
29
+ last_index = n_members - 1
30
+ # Remove last member because the hash array was shifted
31
+ self.method(parent).call.method(member).call.unset_key(last_index)
32
+ self.method(parent).call.method(member).call.delete(last_index)
33
+ break
34
+ end
35
+ end
36
+ else
37
+ self.create_attr(member.to_s, nil)
38
+ end
39
+ self
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,28 @@
1
+ module Conekta
2
+ module Operations
3
+ module Find
4
+ module ClassMethods
5
+ def find(id)
6
+ instance = self.new(id)
7
+ url = instance.url
8
+ requestor = Requestor.new
9
+ response = requestor.request(:get, url)
10
+ instance.load_from(response)
11
+ instance
12
+ end
13
+ # <b>DEPRECATED:</b> Please use <tt>find</tt> instead.
14
+ def retrieve(id)
15
+ instance = self.new(id)
16
+ url = instance.url
17
+ requestor = Requestor.new
18
+ response = requestor.request(:get, url)
19
+ instance.load_from(response)
20
+ instance
21
+ end
22
+ end
23
+ def self.included(base)
24
+ base.extend(ClassMethods)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ module Conekta
2
+ module Operations
3
+ module Update
4
+ def update(params)
5
+ requestor = Requestor.new
6
+ url = self.url
7
+ response = requestor.request(:put, url, params)
8
+ self.load_from(response)
9
+ self
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module Conekta
2
+ module Operations
3
+ module Where
4
+ module ClassMethods
5
+ def where(params=nil)
6
+ instance = ConektaObject.new
7
+ url = Util.types[self.class_name.downcase].url
8
+ requestor = Requestor.new
9
+ response = requestor.request(:get, url)
10
+ instance.load_from(response)
11
+ instance
12
+ end
13
+ # <b>DEPRECATED:</b> Please use <tt>where</tt> instead.
14
+ def all(params=nil)
15
+ instance = ConektaObject.new
16
+ url = Util.types[self.class_name.downcase].url
17
+ requestor = Requestor.new
18
+ response = requestor.request(:get, url)
19
+ instance.load_from(response)
20
+ instance
21
+ end
22
+ end
23
+ def self.included(base)
24
+ base.extend(ClassMethods)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ module Conekta
2
+ class PaymentMethod < Resource
3
+ end
4
+ end
data/lib/conekta/plan.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  module Conekta
2
- class Plan < APIResource
3
- include Conekta::APIOperations::Create
4
- include Conekta::APIOperations::Delete
5
- include Conekta::APIOperations::List
6
- include Conekta::APIOperations::Update
2
+ class Plan < 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
7
10
  end
8
11
  end
@@ -0,0 +1,55 @@
1
+ require 'faraday'
2
+ require 'base64'
3
+ module Conekta
4
+ class Requestor
5
+ require 'sys/uname'
6
+ include Sys
7
+ attr_reader :api_key
8
+ def initialize()
9
+ @api_key = Conekta.api_key
10
+ end
11
+ def api_url(url='')
12
+ api_base = Conekta.api_base
13
+ api_base + url
14
+ end
15
+ def request(meth, url, params=nil)
16
+ url = self.api_url(url)
17
+ meth = meth.downcase
18
+ begin
19
+ conn = Faraday.new(:ssl => {
20
+ :ca_file => File.dirname(__FILE__) + '/../ssl_data/ca-certificates.crt'
21
+ }) do |faraday|
22
+ faraday.adapter Faraday.default_adapter
23
+ end
24
+ response = conn.method(meth).call do |req|
25
+ req.url url
26
+
27
+ req.headers['X-Conekta-Client-User-Agent'] = set_headers.to_json
28
+ req.headers['User-Agent'] = 'Conekta/v1 RubyBindings/' + Conekta::VERSION
29
+ req.headers['Accept'] = "application/vnd.conekta-v#{Conekta.api_version}+json"
30
+ req.headers['Authorization'] = "Basic #{ Base64.encode64("#{self.api_key}" + ':')}"
31
+ if params
32
+ req.headers['Content-Type'] = 'application/json'
33
+ req.body = params.to_json
34
+ end
35
+ end
36
+ rescue Exception => e
37
+ Error.error_handler(e.message, "")
38
+ end
39
+ if response.status != 200
40
+ Error.error_handler(JSON.parse(response.body), response.status)
41
+ end
42
+ return JSON.parse(response.body)
43
+ end
44
+ private
45
+ def set_headers
46
+ headers = {}
47
+ headers[:bindings_version] = Conekta::VERSION
48
+ headers[:lang] = 'ruby'
49
+ headers[:lang_version] = RUBY_VERSION
50
+ headers[:publisher] = 'conekta'
51
+ headers[:uname] = Uname.uname
52
+ return headers
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,13 @@
1
+ module Conekta
2
+ class Resource < ConektaObject
3
+ def self.url()
4
+ "/#{CGI.escape(self.class_name.downcase)}s"
5
+ end
6
+ def url
7
+ if id == nil || id == ""
8
+ raise Error.new('Could not get the id of ' + self.class.class_name + ' instance.')
9
+ end
10
+ self.class.url + "/" + id
11
+ end
12
+ end
13
+ end
@@ -1,35 +1,21 @@
1
1
  module Conekta
2
- class Subscription < APIResource
3
- include Conekta::APIOperations::Update
4
- include Conekta::APIOperations::ModifyMember
5
-
6
- attr_accessor :customer
7
-
8
- def customer
9
- @customer
10
- end
11
-
12
- def customer=(customer)
13
- @customer = customer
14
- end
15
-
16
- def cancel
17
- self.modify_member("subscription", "cancel")
2
+ class Subscription < Resource
3
+ include Conekta::Operations::Update
4
+ include Conekta::Operations::CustomAction
5
+ def url
6
+ if id == nil || id == ""
7
+ raise Error.new('Could not get the id of ' + self.class.class_name + ' instance.')
8
+ end
9
+ self.customer.url + "/subscription"
18
10
  end
19
-
20
11
  def pause
21
- subscription = self.modify_member("subscription", "pause")
12
+ custom_action(:post, 'pause')
22
13
  end
23
-
24
14
  def resume
25
- subscription = self.modify_member("subscription", "resume")
15
+ custom_action(:post, 'resume')
26
16
  end
27
-
28
- def url
29
- unless customer = self.customer
30
- raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
31
- end
32
- "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/subscription"
17
+ def cancel
18
+ custom_action(:post, 'cancel')
33
19
  end
34
20
  end
35
21
  end
data/lib/conekta/token.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Conekta
2
- class Token < APIResource
3
- include Conekta::APIOperations::Create
2
+ class Token < Resource
3
+ include Conekta::Operations::Find
4
+ include Conekta::Operations::Create
4
5
  end
5
6
  end
data/lib/conekta/util.rb CHANGED
@@ -1,103 +1,31 @@
1
1
  module Conekta
2
2
  module Util
3
- def self.objects_to_ids(h)
4
- case h
5
- when APIResource
6
- h.id
7
- when Hash
8
- res = {}
9
- h.each { |k, v| res[k] = objects_to_ids(v) unless v.nil? }
10
- res
11
- when Array
12
- h.map { |v| objects_to_ids(v) }
13
- else
14
- h
15
- end
16
- end
17
-
18
- def self.object_classes
19
- @object_classes ||= {
3
+ def self.types
4
+ @types ||= {
5
+ 'bank_transfer_payment' => PaymentMethod,
6
+ 'card_payment' => PaymentMethod,
7
+ 'cash_payment' => PaymentMethod,
20
8
  'charge' => Charge,
21
- 'list' => ListObject,
9
+ 'customer' => Customer,
22
10
  'card' => Card,
23
11
  'subscription' => Subscription,
24
- 'customer' => Customer,
25
- 'plan' => Plan
12
+ 'plan' => Plan,
13
+ 'token' => Token,
14
+ 'event' => Event
26
15
  }
27
16
  end
28
-
29
- def self.convert_to_conekta_object(resp, api_key)
30
- case resp
31
- when Array
32
- resp.map { |i| convert_to_conekta_object(i, api_key) }
33
- when Hash
34
- # Try converting to a known object class. If none available, fall back to generic ConektaObject
35
- object_classes.fetch(resp[:object], ConektaObject).construct_from(resp, api_key)
36
- else
37
- resp
38
- end
39
- end
40
-
41
- def self.file_readable(file)
42
- # This is nominally equivalent to File.readable?, but that can
43
- # report incorrect results on some more oddball filesystems
44
- # (such as AFS)
45
- begin
46
- File.open(file) { |f| }
47
- rescue
48
- false
49
- else
50
- true
17
+ def self.convert_to_conekta_object(resp)
18
+ if resp.kind_of?(Hash) and resp.has_key?('object') and types[resp['object']]
19
+ instance = types[resp['object']].new()
20
+ instance.load_from(resp)
21
+ return instance
51
22
  end
52
- end
53
-
54
- def self.symbolize_names(object)
55
- case object
56
- when Hash
57
- new = {}
58
- object.each do |key, value|
59
- key = (key.to_sym rescue key) || key
60
- new[key] = symbolize_names(value)
61
- end
62
- new
63
- when Array
64
- object.map { |value| symbolize_names(value) }
65
- else
66
- object
67
- end
68
- end
69
-
70
- def self.url_encode(key)
71
- URI.escape(key.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
72
- end
73
-
74
- def self.flatten_params(params, parent_key=nil)
75
- result = []
76
- params.each do |key, value|
77
- calculated_key = parent_key ? "#{parent_key}[#{url_encode(key)}]" : url_encode(key)
78
- if value.is_a?(Hash)
79
- result += flatten_params(value, calculated_key)
80
- elsif value.is_a?(Array)
81
- result += flatten_params_array(value, calculated_key)
82
- else
83
- result << [calculated_key, value]
84
- end
85
- end
86
- result
87
- end
88
-
89
- def self.flatten_params_array(value, calculated_key)
90
- result = []
91
- value.each do |elem|
92
- if elem.is_a?(Hash)
93
- result += flatten_params(elem, calculated_key)
94
- elsif elem.is_a?(Array)
95
- result += flatten_params_array(elem, calculated_key)
96
- else
97
- result << ["#{calculated_key}[]", elem]
98
- end
23
+ if resp.respond_to? :each
24
+ instance = ConektaObject.new
25
+ instance.load_from(resp)
26
+ return instance
99
27
  end
100
- result
28
+ return instance
101
29
  end
102
30
  end
103
31
  end