conekta 1.0.0 → 1.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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG +9 -1
  4. data/Gemfile +1 -0
  5. data/README.md +68 -46
  6. data/lib/conekta.rb +20 -1
  7. data/lib/conekta/address.rb +1 -0
  8. data/lib/conekta/card.rb +17 -3
  9. data/lib/conekta/charge.rb +7 -0
  10. data/lib/conekta/conekta_object.rb +25 -8
  11. data/lib/conekta/customer.rb +55 -4
  12. data/lib/conekta/destination.rb +29 -0
  13. data/lib/conekta/discount_line.rb +32 -0
  14. data/lib/conekta/error.rb +35 -37
  15. data/lib/conekta/error_list.rb +33 -0
  16. data/lib/conekta/event.rb +4 -1
  17. data/lib/conekta/fiscal_entity.rb +37 -0
  18. data/lib/conekta/line_item.rb +30 -0
  19. data/lib/conekta/list.rb +59 -0
  20. data/lib/conekta/log.rb +4 -0
  21. data/lib/conekta/operations/create_member.rb +20 -10
  22. data/lib/conekta/operations/custom_action.rb +1 -1
  23. data/lib/conekta/operations/delete.rb +3 -1
  24. data/lib/conekta/operations/where.rb +11 -2
  25. data/lib/conekta/order.rb +90 -0
  26. data/lib/conekta/payee.rb +4 -0
  27. data/lib/conekta/payment_source.rb +30 -0
  28. data/lib/conekta/payout_method.rb +12 -3
  29. data/lib/conekta/plan.rb +5 -0
  30. data/lib/conekta/refund.rb +2 -0
  31. data/lib/conekta/requestor.rb +14 -4
  32. data/lib/conekta/resource.rb +26 -4
  33. data/lib/conekta/return.rb +25 -0
  34. data/lib/conekta/shipping_contact.rb +32 -0
  35. data/lib/conekta/shipping_line.rb +33 -0
  36. data/lib/conekta/subscription.rb +17 -3
  37. data/lib/conekta/tax_line.rb +30 -0
  38. data/lib/conekta/token.rb +2 -0
  39. data/lib/conekta/util.rb +37 -3
  40. data/lib/conekta/version.rb +1 -1
  41. data/lib/conekta/webhook.rb +2 -0
  42. data/spec/conekta/1.0.0/.DS_Store +0 -0
  43. data/spec/conekta/1.0.0/card_spec.rb +40 -0
  44. data/spec/conekta/{charge_spec.rb → 1.0.0/charge_spec.rb} +1 -0
  45. data/spec/conekta/{customer_spec.rb → 1.0.0/customer_spec.rb} +3 -2
  46. data/spec/conekta/{error_spec.rb → 1.0.0/error_spec.rb} +3 -1
  47. data/spec/conekta/{event_spec.rb → 1.0.0/event_spec.rb} +1 -0
  48. data/spec/conekta/{log_spec.rb → 1.0.0/log_spec.rb} +1 -0
  49. data/spec/conekta/{payout_spec.rb → 1.0.0/payout_spec.rb} +1 -0
  50. data/spec/conekta/{plan_spec.rb → 1.0.0/plan_spec.rb} +1 -0
  51. data/spec/conekta/{token_spec.rb → 1.0.0/token_spec.rb} +1 -0
  52. data/spec/conekta/{webhook_spec.rb → 1.0.0/webhook_spec.rb} +1 -0
  53. data/spec/conekta/2.0.0/customer_spec.rb +49 -0
  54. data/spec/conekta/2.0.0/discount_line_spec.rb +49 -0
  55. data/spec/conekta/2.0.0/error_list_spec.rb +45 -0
  56. data/spec/conekta/2.0.0/fiscal_entity_spec.rb +67 -0
  57. data/spec/conekta/2.0.0/line_item_spec.rb +53 -0
  58. data/spec/conekta/2.0.0/list_spec.rb +29 -0
  59. data/spec/conekta/2.0.0/order_spec.rb +327 -0
  60. data/spec/conekta/{payee_spec.rb → 2.0.0/payee_spec.rb} +1 -1
  61. data/spec/conekta/2.0.0/shipping_contact_spec.rb +60 -0
  62. data/spec/conekta/2.0.0/shipping_line_spec.rb +53 -0
  63. data/spec/conekta/2.0.0/source_spec.rb +31 -0
  64. data/spec/conekta/2.0.0/tax_line_spec.rb +44 -0
  65. data/spec/conekta_spec.rb +6 -0
  66. data/spec/spec_helper.rb +11 -0
  67. data/spec/support/fixtures/orders.json +2394 -0
  68. data/spec/support/shared_context.rb +49 -0
  69. metadata +62 -21
data/lib/conekta/payee.rb CHANGED
@@ -7,6 +7,10 @@ module Conekta
7
7
  include Conekta::Operations::Update
8
8
  include Conekta::Operations::CustomAction
9
9
  include Conekta::Operations::CreateMember
10
+
11
+ attr_accessor :email, :name, :phone, :livemode, :default_destination_id,
12
+ :created_at
13
+
10
14
  def load_from(response=nil)
11
15
  if response
12
16
  super
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ class PaymentSource < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ def _url
8
+ if (id.nil? || id.to_s.empty?)
9
+ exception = Error.new({
10
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
11
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
12
+ })
13
+
14
+ if Conekta.api_version == "2.0.0"
15
+ error_list = Conekta::ErrorList.new
16
+ error_list.details << exception
17
+ exception = error_list
18
+ end
19
+
20
+ raise exception
21
+ end
22
+
23
+ self.customer._url + self.class._url + "/" + id
24
+ end
25
+
26
+ def delete
27
+ self.delete_member('customer','payment_sources')
28
+ end
29
+ end
30
+ end
@@ -4,9 +4,18 @@ module Conekta
4
4
  include Conekta::Operations::Update
5
5
  include Conekta::Operations::CustomAction
6
6
  def _url
7
- raise Error.new(
8
- I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
9
- I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })) if (id.nil? || id.empty?)
7
+ if (id.nil? || id.to_s.empty?)
8
+ exception = Error.new({
9
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
10
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
11
+ })
12
+ if Conekta.api_version == "2.0.0"
13
+ error_list = Conekta::ErrorList.new
14
+ error_list.details << exception
15
+ exception = error_list
16
+ end
17
+ raise exception
18
+ end
10
19
  self.payee._url + self.class._url + "/" + id
11
20
  end
12
21
  def delete
data/lib/conekta/plan.rb CHANGED
@@ -7,5 +7,10 @@ module Conekta
7
7
  include Conekta::Operations::Update
8
8
  include Conekta::Operations::CustomAction
9
9
  include Conekta::Operations::CreateMember
10
+
11
+ attr_accessor :livemode, :created_at, :name, :amount, :currency,
12
+ :interval, :frequency, :expiry_count, :trial_period_days,
13
+ :created_at
14
+
10
15
  end
11
16
  end
@@ -1,4 +1,6 @@
1
1
  module Conekta
2
2
  class Refund < Resource
3
+
4
+ attr_accessor :amount, :auth_code, :created_at
3
5
  end
4
6
  end
@@ -27,11 +27,17 @@ module Conekta
27
27
  (if meth == :get then req.params = params else req.body = params.to_json end) if params
28
28
  end
29
29
  rescue Exception => e
30
- Error.error_handler(e, "")
30
+ if Conekta.api_version == "2.0.0"
31
+ json_response = {"details" => []}
32
+ else
33
+ json_response = {}
34
+ end
35
+ ErrorList.error_handler(json_response, nil)
31
36
  end
32
37
 
33
- return Error.error_handler(JSON.parse(response.body), response.status) if response.status != 200
34
- JSON.parse(response.body)
38
+ json_response = JSON.parse(response.body)
39
+ return ErrorList.error_handler(json_response, response.status) if response.status != 200
40
+ json_response
35
41
  end
36
42
 
37
43
  private
@@ -59,13 +65,17 @@ module Conekta
59
65
  end
60
66
 
61
67
  def conekta_headers
62
- @conekta_headers ||= {
68
+ params = {
63
69
  bindings_version: Conekta::VERSION,
64
70
  lang: 'ruby',
65
71
  lang_version: RUBY_VERSION,
66
72
  publisher: 'conekta',
67
73
  uname: Uname.uname
68
74
  }
75
+
76
+ params.merge!(plugin: Conekta.plugin) if Conekta.plugin.to_s.length > 0
77
+
78
+ @conekta_headers ||= params
69
79
  end
70
80
  end
71
81
  end
@@ -1,14 +1,36 @@
1
1
  module Conekta
2
2
  class Resource < ConektaObject
3
+
4
+ attr_accessor :id
5
+
6
+ def initialize(id=nil)
7
+ @id = id
8
+ super()
9
+ end
10
+
3
11
  def self._url()
4
- "/#{CGI.escape(self.class_name.downcase)}s"
12
+ "/#{CGI.escape(underscored_class)}s"
5
13
  end
14
+
6
15
  def _url
7
- raise Error.new(
8
- I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
9
- I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })) if (id.nil? || id.empty?)
16
+ if (id.nil? || id.to_s.empty?)
17
+ exception = Error.new({
18
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
19
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
20
+ })
21
+ if Conekta.api_version == "2.0.0"
22
+ error_list = Conekta::ErrorList.new
23
+ error_list.details << exception
24
+ exception = error_list
25
+ end
26
+ raise exception
27
+ end
10
28
 
11
29
  return [self.class._url, id].join('/')
12
30
  end
31
+
32
+ def self.underscored_class
33
+ Conekta::Util.underscore(self.to_s)
34
+ end
13
35
  end
14
36
  end
@@ -0,0 +1,25 @@
1
+ module Conekta
2
+ class Return < Resource
3
+
4
+ attr_accessor :livemode, :amount, :currency, :charge_id, :reason,
5
+ :created_at, :parent_id
6
+ def _url
7
+ if (id.nil? || id.to_s.empty?)
8
+ exception = Error.new({
9
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
10
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
11
+ })
12
+
13
+ if Conekta.api_version == "2.0.0"
14
+ error_list = Conekta::ErrorList.new
15
+ error_list.details << exception
16
+ exception = error_list
17
+ end
18
+
19
+ raise exception
20
+ end
21
+
22
+ "#{self.order._url}#{self.class._url}/#{id}"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,32 @@
1
+ module Conekta
2
+ class ShippingContact < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :receiver, :phone, :between_streets, :parent_id, :default
8
+
9
+ def _url
10
+ if (id.nil? || id.to_s.empty?)
11
+ exception = Error.new({
12
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
13
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
14
+ })
15
+
16
+ if Conekta.api_version == "2.0.0"
17
+ error_list = Conekta::ErrorList.new
18
+ error_list.details << exception
19
+ exception = error_list
20
+ end
21
+
22
+ raise exception
23
+ end
24
+
25
+ self.customer._url + self.class._url + "/" + id
26
+ end
27
+
28
+ def delete
29
+ self.delete_member('customer', 'shipping_contacts')
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ module Conekta
2
+ class ShippingLine < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :description, :amount, :carrier, :shipping_line_method, :tracking_number,
8
+ :parent_id, :metadata
9
+
10
+ def _url
11
+ if (id.nil? || id.to_s.empty?)
12
+ exception = Error.new({
13
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
14
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
15
+ })
16
+
17
+ if Conekta.api_version == "2.0.0"
18
+ error_list = Conekta::ErrorList.new
19
+ error_list.details << exception
20
+ exception = error_list
21
+ end
22
+
23
+ raise exception
24
+ end
25
+
26
+ "#{self.order._url}#{self.class._url}/#{id}"
27
+ end
28
+
29
+ def delete
30
+ self.delete_member('order', 'shipping_lines')
31
+ end
32
+ end
33
+ end
@@ -2,10 +2,24 @@ module Conekta
2
2
  class Subscription < Resource
3
3
  include Conekta::Operations::Update
4
4
  include Conekta::Operations::CustomAction
5
+
6
+ attr_accessor :created_at, :subscription_start, :canceled_at, :paused_at,
7
+ :billing_cycle_start, :billing_cycle_end, :trial_start,
8
+ :trial_end, :plan_id, :customer_id, :card_id
9
+
5
10
  def _url
6
- raise Error.new(
7
- I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
8
- I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })) if (id.nil? || id.empty?)
11
+ if (id.nil? || id.to_s.empty?)
12
+ exception = Error.new({
13
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
14
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
15
+ })
16
+ if Conekta.api_version == "2.0.0"
17
+ error_list = Conekta::ErrorList.new
18
+ error_list.details << exception
19
+ exception = error_list
20
+ end
21
+ raise exception
22
+ end
9
23
  self.customer._url + "/subscription"
10
24
  end
11
25
  def pause
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ class TaxLine < Resource
3
+ include Conekta::Operations::Delete
4
+ include Conekta::Operations::Update
5
+ include Conekta::Operations::CustomAction
6
+
7
+ attr_accessor :description, :amount, :parent_id, :metadata
8
+
9
+ def _url
10
+ if (id.nil? || id.to_s.empty?)
11
+ exception = Error.new({
12
+ "message" => I18n.t('error.resource.id', { resource: self.class.class_name, locale: :en }),
13
+ "message_to_purchaser" => I18n.t('error.resource.id_purchaser', { locale: Conekta.locale.to_sym })
14
+ })
15
+ if Conekta.api_version == "2.0.0"
16
+ error_list = Conekta::ErrorList.new
17
+ error_list.details << exception
18
+ exception = error_list
19
+ end
20
+ raise exception
21
+ end
22
+
23
+ "#{self.order._url}#{self.class._url}/#{id}"
24
+ end
25
+
26
+ def delete
27
+ self.delete_member('order', 'tax_lines')
28
+ end
29
+ end
30
+ end
data/lib/conekta/token.rb CHANGED
@@ -2,5 +2,7 @@ module Conekta
2
2
  class Token < Resource
3
3
  include Conekta::Operations::Find
4
4
  include Conekta::Operations::Create
5
+
6
+ attr_accessor :livemode, :used
5
7
  end
6
8
  end
data/lib/conekta/util.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module Conekta
2
2
  module Util
3
+
3
4
  def self.types
4
5
  @types ||= {
5
6
  'bank_transfer_payment' => PaymentMethod,
@@ -14,6 +15,7 @@ module Conekta
14
15
  'payee' => Payee,
15
16
  'payout' => Payout,
16
17
  'payout_method' => PayoutMethod,
18
+ 'destination' => Destination,
17
19
  'plan' => Plan,
18
20
  'subscription' => Subscription,
19
21
  'token' => Token,
@@ -21,16 +23,34 @@ module Conekta
21
23
  'webhook_log' => WebhookLog,
22
24
  'refund' => Refund,
23
25
  'line_item' => LineItem,
24
- 'address' => Address
26
+ 'address' => Address,
27
+ 'order' => Order,
28
+ 'payment_source' => PaymentSource,
29
+ 'tax_line' => TaxLine,
30
+ 'shipping_line' => ShippingLine,
31
+ 'discount_line' => DiscountLine,
32
+ 'fiscal_entity' => FiscalEntity,
33
+ 'shipping_contact' => ShippingContact,
34
+ 'list' => List,
35
+ 'return' => Return
25
36
  }
26
37
  end
38
+
27
39
  def self.convert_to_conekta_object(name,resp)
28
- if resp.kind_of?(Hash)
40
+ return resp if name == "data" # event data should not be parsed into objects
41
+ if resp.kind_of?(Hash)
29
42
  if resp.has_key?('object') and types[resp['object']]
30
- instance = types[resp['object']].new()
43
+ if resp['object'] == "list"
44
+ instance = types[resp['object']].new(name, resp)
45
+ else
46
+ instance = types[resp['object']].new()
47
+ end
48
+
31
49
  instance.load_from(resp)
50
+
32
51
  return instance
33
52
  elsif name.instance_of? String
53
+ name = "shippin_line_method" if name == "method"
34
54
  name = "event_data" if camelize(name) == "Data"
35
55
  name = "obj" if camelize(name) == "Object"
36
56
  if !Object.const_defined?(camelize(name))
@@ -38,10 +58,13 @@ module Conekta
38
58
  else
39
59
  instance = constantize(camelize(name)).new
40
60
  end
61
+
41
62
  instance.load_from(resp)
63
+
42
64
  return instance
43
65
  end
44
66
  end
67
+
45
68
  if resp.kind_of?(Array)
46
69
  instance = ConektaObject.new
47
70
  instance.load_from(resp)
@@ -56,10 +79,21 @@ module Conekta
56
79
  end
57
80
  return instance
58
81
  end
82
+
83
+ def self.underscore(str)
84
+ str.split(/::/).last.
85
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
86
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
87
+ tr("-", "_").
88
+ downcase
89
+ end
90
+
59
91
  protected
92
+
60
93
  def self.camelize(str)
61
94
  str.split('_').map{|e| e.capitalize}.join
62
95
  end
96
+
63
97
  def self.constantize(camel_cased_word)
64
98
  names = camel_cased_word.split('::')
65
99
 
@@ -1,3 +1,3 @@
1
1
  module Conekta
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -6,5 +6,7 @@ module Conekta
6
6
  include Conekta::Operations::Delete
7
7
  include Conekta::Operations::Update
8
8
  include Conekta::Operations::CustomAction
9
+
10
+ attr_accessor :url, :status, :production_enabled, :development_enabled, :subscribed_events
9
11
  end
10
12
  end
Binary file
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe Conekta::Card do
4
+ include_context "API 1.0.0"
5
+ let(:customer_data) do
6
+ {
7
+ email: "hola@hola.com",
8
+ name: "John Constantine",
9
+ cards: ["tok_test_visa_4242"]
10
+ }
11
+ end
12
+
13
+ let(:customer) do
14
+ Conekta::Customer.create(customer_data)
15
+ end
16
+
17
+ let(:card) { customer.cards.first }
18
+
19
+ context "deleting cards" do
20
+ it "successful card delete" do
21
+ card.delete
22
+
23
+ expect(card.deleted).to eq(true)
24
+ end
25
+ end
26
+
27
+ context "updating cards" do
28
+ it "successful card update" do
29
+ card.update(active: false)
30
+
31
+ expect(card.active).to eq(false)
32
+ end
33
+
34
+ it "unsuccessful card update" do
35
+ expect {
36
+ card.update(token: "tok_test_visa_4241")
37
+ }.to raise_error(Conekta::ParameterValidationError)
38
+ end
39
+ end
40
+ end