conekta 0.3.0 → 0.3.1

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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmQ0MDY4MjFjZDhlMmJiNGE0ZjM4ODg1NTEzY2I1NjAxOGM4NTg0MA==
5
+ data.tar.gz: !binary |-
6
+ MGIwODM1ZWJjNWE4N2Y2OWM3MjcyNzIxOGJmZjcwNmY0MjA2YjcyOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZTk3NDg4NDJkYWExOTgwZDM0ZTc5MzA0YWNlNWI4MWNmMzgxNTIyNTA0MmZm
10
+ ODkyM2YwMGJlZTc3N2UxNDhjZjkwZTgwYmNjOWRmZDM4ZjFlMzU0MWIzNGU0
11
+ NzgxODk4MjE3MGFjMjk3YzRhMzdjNmJjNzQ5MDIwZWNjYmE1NDk=
12
+ data.tar.gz: !binary |-
13
+ ZmE1OTFjOTU4YWJhOTQwNDIxZWFiYWNiMzQ0ZTc2YTZhNjE0NzBkZDc2ZjQ3
14
+ OWU5MmY4ZDM5YWJkNmRmMjQyOTVhZGM3MzgwYmJjNzBjM2Q4NmE5MDc0N2Ni
15
+ M2U4NDlkNDI2OWIxMWU4MWYzNjhiYWVkMWFmNmY5N2YxNDlmNjk=
data/.gitignore CHANGED
@@ -1,4 +1,9 @@
1
1
  *.gem
2
+ *.swo
3
+ *.swn
4
+ *.swm
5
+ *.swp
6
+ *~
2
7
  *.rbc
3
8
  .bundle
4
9
  .config
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- conekta (0.2.0)
4
+ conekta (0.3.1)
5
5
  multi_json (>= 1.0.4, < 2)
6
6
  rest-client (~> 1.4)
7
7
 
@@ -5,7 +5,11 @@
5
5
  You don't need this source code unless you want to modify the gem. If
6
6
  you want to install the gem via bundler you should add this line to your gemfile:
7
7
 
8
- gem 'conekta', :git => 'git://github.com/conekta/conekta-ruby.git'
8
+ gem "conekta", "~> 0.3.0"
9
+
10
+ You can also install this gem by running:
11
+
12
+ gem install conekta
9
13
 
10
14
  If you want to build the gem from source:
11
15
 
@@ -19,4 +23,4 @@ If you want to build the gem from source:
19
23
 
20
24
  == Development
21
25
 
22
- Test cases can be run with: `bundle exec rake test`
26
+ Test cases can be run with: `bundle exec rake spec`
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
@@ -15,6 +15,8 @@ require 'conekta/api_operations/create'
15
15
  require 'conekta/api_operations/update'
16
16
  require 'conekta/api_operations/delete'
17
17
  require 'conekta/api_operations/list'
18
+ require 'conekta/api_operations/modify_member'
19
+ require 'conekta/api_operations/create_member'
18
20
 
19
21
  # Resources
20
22
  require 'conekta/util'
@@ -25,6 +27,11 @@ require 'conekta/singleton_api_resource'
25
27
  require 'conekta/account'
26
28
  require 'conekta/list_object'
27
29
  require 'conekta/charge'
30
+ require 'conekta/subscription'
31
+ require 'conekta/customer'
32
+ require 'conekta/card'
33
+ require 'conekta/token'
34
+ require 'conekta/plan'
28
35
  require 'conekta/event'
29
36
  require 'conekta/log'
30
37
 
@@ -0,0 +1,25 @@
1
+ module Conekta
2
+ module APIOperations
3
+ module CreateMember
4
+ module ClassMethods
5
+ def create_member(member, params={}, api_key=nil)
6
+ path = "#{path}/#{member}"
7
+ response, api_key = Conekta.request(:post, path, api_key, params)
8
+ obj = Util.convert_to_conekta_object(response, api_key)
9
+ obj.try("#{parent}".to_sym) = self
10
+ if obj.class == ConektaObject
11
+ count = self.try("#{member}".to_sym).count
12
+ self.try("#{member}".to_sym)[count] = obj
13
+ else
14
+ self.try("#{member}".to_sym) = obj
15
+ end
16
+ obj
17
+ end
18
+ end
19
+
20
+ def self.included(base)
21
+ base.extend(ClassMethods)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ module Conekta
2
+ module APIOperations
3
+ module ModifyMember
4
+ module ClassMethods
5
+ def modify_member(parent, member, params={}, action, method, api_key=nil)
6
+ path = "#{path}/#{member}/#{action}"
7
+ response, api_key = Conekta.request(method.to_sym, path, api_key, params)
8
+ self.try("#{parent}".to_sym).try("#{member}".to_sym) = self
9
+ self
10
+ end
11
+ end
12
+
13
+ def self.included(base)
14
+ base.extend(ClassMethods)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -6,7 +6,7 @@ module Conekta
6
6
  values = {}
7
7
  @unsaved_values.each { |k| values[k] = @values[k] }
8
8
  values.delete(:id)
9
- response, api_key = Conekta.request(:post, url, @api_key, values)
9
+ response, api_key = Conekta.request(:put, url, @api_key, values)
10
10
  refresh_from(response, api_key)
11
11
  end
12
12
  self
@@ -0,0 +1,30 @@
1
+ module Conekta
2
+ class Card < APIResource
3
+ include Conekta::APIOperations::Update
4
+
5
+ def delete
6
+ response, api_key = Conekta.request(:delete, url, @api_key)
7
+ refresh_from(response, api_key)
8
+ deleted_card = self
9
+ i = 0
10
+ for card in self.customer.cards
11
+ if deleted_card.id == card.id
12
+ self.customer.cards.delete_at(i)
13
+ break
14
+ end
15
+ i = i + 1
16
+ end
17
+ deleted_card
18
+ end
19
+
20
+ def url
21
+ unless id = self['id']
22
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid ID: #{id.inspect}", 'id')
23
+ end
24
+ unless customer = self.customer
25
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
26
+ end
27
+ "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/cards/#{CGI.escape(id)}"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,17 @@
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 create_subscription(params={})
10
+ self.create_member('subscription', params)
11
+ end
12
+
13
+ def create_card(params={})
14
+ self.create_member('cards', params)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
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
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ module Conekta
2
+ class Subscription < APIResource
3
+ include Conekta::APIOperations::Update
4
+ include Conekta::APIOperations::ModifyMember
5
+
6
+ def cancel
7
+ self.modify_member("customer", "subscription", nil, "cancel", "post")
8
+ end
9
+
10
+ def pause
11
+ self.modify_member("customer", "subscription", nil, "pause", "post")
12
+ end
13
+
14
+ def resume
15
+ self.modify_member("customer", "subscription", nil, "resume", "post")
16
+ end
17
+
18
+ def url
19
+ unless customer = self.customer
20
+ raise ParameterValidationError.new("Could not determine which URL to request: #{self.class} instance has invalid customer: #{customer.inspect}", 'customer')
21
+ end
22
+ "#{Conekta::Customer.url}/#{CGI.escape(customer.id)}/subscription"
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ module Conekta
2
+ class Token < APIResource
3
+ include Conekta::APIOperations::Create
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module Conekta
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -157,7 +157,7 @@ class ConektaTest < Test::Unit::TestCase
157
157
  Conekta.api_key = nil
158
158
 
159
159
  Conekta.should_receive(:execute_request){|opts|
160
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
160
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
161
161
  test_response(test_charge)
162
162
  }
163
163
 
@@ -169,7 +169,7 @@ class ConektaTest < Test::Unit::TestCase
169
169
  Conekta.api_key = "global"
170
170
 
171
171
  Conekta.should_receive(:execute_request){|opts|
172
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
172
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
173
173
  test_response(test_charge)
174
174
  }
175
175
 
@@ -182,12 +182,12 @@ class ConektaTest < Test::Unit::TestCase
182
182
 
183
183
  Conekta.should_receive(:execute_request){|opts|
184
184
  opts[:url].should eq("#{Conekta.api_base}/charges/ch_test_charge.json")
185
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
185
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
186
186
  test_response(test_charge)
187
187
  }
188
188
  Conekta.should_receive(:execute_request){|opts|
189
189
  opts[:url].should eq("#{Conekta.api_base}/charges/ch_test_charge/refund.json")
190
- opts[:headers][:authorization].should eq("Token token='sk_test_local'")
190
+ opts[:headers][:authorization].should eq("Basic c2tfdGVzdF9sb2NhbDo=\n")
191
191
  test_response(test_charge)
192
192
  }
193
193
 
@@ -352,7 +352,7 @@ class ConektaTest < Test::Unit::TestCase
352
352
  @mock.should_receive(:post){|url, api_key, params|
353
353
  "#{Conekta.api_base}/charges.json".should eq(url)
354
354
  api_key.should eq(nil)
355
- {:amount => 50, :currency=>'usd', :card=>{}}.should eq(params)
355
+ {:amount => 50, :currency=>'usd', :card=>{}}.should eq(JSON.parse(params).symbolize_keys)
356
356
 
357
357
  test_response({ :count => 1, :data => [test_charge] })
358
358
  }
@@ -405,7 +405,7 @@ class ConektaTest < Test::Unit::TestCase
405
405
  params = { :amount => 100, :currency => 'usd', :card => 'sc_token' }
406
406
  @mock.should_receive(:post){|url, get, post|
407
407
  get.should eq(nil)
408
- post.should eq({:amount => 100, :currency => 'usd', :card => 'sc_token'})
408
+ JSON.parse(post).symbolize_keys.should eq({:amount => 100, :currency => 'usd', :card => 'sc_token'})
409
409
  test_response(test_charge)
410
410
  }
411
411
  c = Conekta::Charge.create(params)
@@ -463,7 +463,7 @@ class ConektaTest < Test::Unit::TestCase
463
463
  @mock.should_receive(:post){|url, api_key, params|
464
464
  url.should eq("#{Conekta.api_base}/charges/ch_test_charge.json")
465
465
  api_key.should eq(nil)
466
- params.should eq({:mnemonic => 'another_mn'})
466
+ JSON.parse(params).symbolize_keys.should eq({:mnemonic => 'another_mn'})
467
467
  test_response(test_charge)
468
468
  }.once
469
469
  c = Conekta::Charge.construct_from(test_charge)
@@ -582,6 +582,102 @@ class ConektaTest < Test::Unit::TestCase
582
582
  end
583
583
  end
584
584
 
585
+ describe "customer with token tests" do
586
+ it "execute should return a new customer" do
587
+ @mock = double
588
+ Conekta.mock_rest_client = @mock
589
+
590
+ @mock.should_receive(:post){|url, api_key, params|
591
+ url.should eq("#{Conekta.api_base}/customers.json")
592
+ api_key.should eq(nil)
593
+ JSON.parse(params).symbolize_keys.should eq({
594
+ :cards=>["TOKEN_ID"]
595
+ })
596
+
597
+ test_response(test_customer)
598
+ }.once
599
+
600
+ c = Conekta::Customer.create({
601
+ :cards => ["TOKEN_ID"],
602
+ })
603
+ c.cards.first.last4.should eq("4242")
604
+
605
+ Conekta.mock_rest_client = nil
606
+ end
607
+ end
608
+
609
+ describe "plan tests" do
610
+ it "execute should return a new plan" do
611
+ @mock = double
612
+ Conekta.mock_rest_client = @mock
613
+
614
+ @mock.should_receive(:post){|url, api_key, params|
615
+ url.should eq("#{Conekta.api_base}/plans.json")
616
+ api_key.should eq(nil)
617
+ JSON.parse(params).symbolize_keys.should eq({
618
+ :id => "gold-plan",
619
+ :name => "Gold Plan",
620
+ :amount => 10000,
621
+ :currency => "MXN",
622
+ :interval => "month",
623
+ :frequency => 1,
624
+ :trial_period_days => 15,
625
+ :expiry_count => 12
626
+ })
627
+
628
+ test_response(test_plan)
629
+ }.once
630
+
631
+ p = Conekta::Plan.create({
632
+ :id => "gold-plan",
633
+ :name => "Gold Plan",
634
+ :amount => 10000,
635
+ :currency => "MXN",
636
+ :interval => "month",
637
+ :frequency => 1,
638
+ :trial_period_days => 15,
639
+ :expiry_count => 12
640
+ })
641
+ p.id.should eq("gold-plan")
642
+
643
+ Conekta.mock_rest_client = nil
644
+ end
645
+ end
646
+
647
+ describe "token tests" do
648
+ it "execute should return a new token" do
649
+ @mock = double
650
+ Conekta.mock_rest_client = @mock
651
+
652
+ @mock.should_receive(:post){|url, api_key, params|
653
+ url.should eq("#{Conekta.api_base}/tokens.json")
654
+ api_key.should eq(nil)
655
+ params = JSON.parse(params).symbolize_keys
656
+ params[:card] = params[:card].symbolize_keys
657
+ params.should eq({
658
+ :card => {
659
+ :number => "4242424242424242",
660
+ :exp_month => 11,
661
+ :exp_year => 2012,
662
+ }
663
+ })
664
+
665
+ test_response(test_token)
666
+ }.once
667
+
668
+ t = Conekta::Token.create({
669
+ :card => {
670
+ :number => "4242424242424242",
671
+ :exp_month => 11,
672
+ :exp_year => 2012,
673
+ }
674
+ })
675
+ t.used.should eq(false)
676
+
677
+ Conekta.mock_rest_client = nil
678
+ end
679
+ end
680
+
585
681
 
586
682
  describe "charge tests" do
587
683
  it "charges should be listable" do
@@ -657,7 +753,9 @@ class ConektaTest < Test::Unit::TestCase
657
753
 
658
754
  @mock.should_receive(:post){|url, api_key, params|
659
755
  url.should eq("#{Conekta.api_base}/charges.json")
660
- api_key.should eq(nil)
756
+ api_key.should eq(nil)
757
+ params = JSON.parse(params).symbolize_keys
758
+ params[:card] = params[:card].symbolize_keys
661
759
  params.should eq({
662
760
  :currency => 'usd',
663
761
  :amount => 100,
@@ -34,6 +34,29 @@ def test_response(body, code=200)
34
34
  m
35
35
  end
36
36
 
37
+ def test_plan(params={})
38
+ {
39
+ :id => "gold-plan",
40
+ :name => "Gold Plan",
41
+ :amount => 10000,
42
+ :frequency => "month",
43
+ :trial_period_days => 15,
44
+ :object => "plan",
45
+ :expiry_count => 12
46
+ }
47
+ end
48
+
49
+ def test_token(params={})
50
+ {
51
+ :livemode => false,
52
+ :used => false,
53
+ :object => "token",
54
+ :id => "c_test_token",
55
+ :created => 1304114758,
56
+ :card => test_token_card
57
+ }.merge(params)
58
+ end
59
+
37
60
  def test_customer(params={})
38
61
  {
39
62
  :subscription_history => [],
@@ -103,6 +126,19 @@ def test_card_array(customer_id)
103
126
  }
104
127
  end
105
128
 
129
+ def test_token_card(params={})
130
+ {
131
+ :type => "Visa",
132
+ :last4 => "4242",
133
+ :exp_month => 11,
134
+ :country => "US",
135
+ :exp_year => 2012,
136
+ :id => "cc_test_card",
137
+ :customer => 'c_test_token',
138
+ :object => "card"
139
+ }.merge(params)
140
+ end
141
+
106
142
  def test_card(params={})
107
143
  {
108
144
  :type => "Visa",
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conekta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
5
- prerelease:
4
+ version: 0.3.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Leo Fischer
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-12-13 00:00:00.000000000 Z
12
+ date: 2013-12-18 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rest-client
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: multi_json
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ! '>='
37
33
  - !ruby/object:Gem::Version
@@ -42,7 +38,6 @@ dependencies:
42
38
  type: :runtime
43
39
  prerelease: false
44
40
  version_requirements: !ruby/object:Gem::Requirement
45
- none: false
46
41
  requirements:
47
42
  - - ! '>='
48
43
  - !ruby/object:Gem::Version
@@ -53,7 +48,6 @@ dependencies:
53
48
  - !ruby/object:Gem::Dependency
54
49
  name: shoulda
55
50
  requirement: !ruby/object:Gem::Requirement
56
- none: false
57
51
  requirements:
58
52
  - - ~>
59
53
  - !ruby/object:Gem::Version
@@ -61,7 +55,6 @@ dependencies:
61
55
  type: :development
62
56
  prerelease: false
63
57
  version_requirements: !ruby/object:Gem::Requirement
64
- none: false
65
58
  requirements:
66
59
  - - ~>
67
60
  - !ruby/object:Gem::Version
@@ -69,7 +62,6 @@ dependencies:
69
62
  - !ruby/object:Gem::Dependency
70
63
  name: rspec
71
64
  requirement: !ruby/object:Gem::Requirement
72
- none: false
73
65
  requirements:
74
66
  - - ! '>='
75
67
  - !ruby/object:Gem::Version
@@ -77,7 +69,6 @@ dependencies:
77
69
  type: :development
78
70
  prerelease: false
79
71
  version_requirements: !ruby/object:Gem::Requirement
80
- none: false
81
72
  requirements:
82
73
  - - ! '>='
83
74
  - !ruby/object:Gem::Version
@@ -85,7 +76,6 @@ dependencies:
85
76
  - !ruby/object:Gem::Dependency
86
77
  name: rake
87
78
  requirement: !ruby/object:Gem::Requirement
88
- none: false
89
79
  requirements:
90
80
  - - ! '>='
91
81
  - !ruby/object:Gem::Version
@@ -93,7 +83,6 @@ dependencies:
93
83
  type: :development
94
84
  prerelease: false
95
85
  version_requirements: !ruby/object:Gem::Requirement
96
- none: false
97
86
  requirements:
98
87
  - - ! '>='
99
88
  - !ruby/object:Gem::Version
@@ -124,12 +113,16 @@ files:
124
113
  - lib/conekta.rb
125
114
  - lib/conekta/account.rb
126
115
  - lib/conekta/api_operations/create.rb
116
+ - lib/conekta/api_operations/create_member.rb
127
117
  - lib/conekta/api_operations/delete.rb
128
118
  - lib/conekta/api_operations/list.rb
119
+ - lib/conekta/api_operations/modify_member.rb
129
120
  - lib/conekta/api_operations/update.rb
130
121
  - lib/conekta/api_resource.rb
122
+ - lib/conekta/card.rb
131
123
  - lib/conekta/charge.rb
132
124
  - lib/conekta/conekta_object.rb
125
+ - lib/conekta/customer.rb
133
126
  - lib/conekta/errors/api_connection_error.rb
134
127
  - lib/conekta/errors/api_error.rb
135
128
  - lib/conekta/errors/authentication_error.rb
@@ -142,7 +135,10 @@ files:
142
135
  - lib/conekta/json.rb
143
136
  - lib/conekta/list_object.rb
144
137
  - lib/conekta/log.rb
138
+ - lib/conekta/plan.rb
145
139
  - lib/conekta/singleton_api_resource.rb
140
+ - lib/conekta/subscription.rb
141
+ - lib/conekta/token.rb
146
142
  - lib/conekta/util.rb
147
143
  - lib/conekta/version.rb
148
144
  - lib/data/ca-certificates.crt
@@ -151,27 +147,26 @@ files:
151
147
  - spec/test_helper.rb
152
148
  homepage: http://conekta.mx/doc
153
149
  licenses: []
150
+ metadata: {}
154
151
  post_install_message:
155
152
  rdoc_options: []
156
153
  require_paths:
157
154
  - lib
158
155
  required_ruby_version: !ruby/object:Gem::Requirement
159
- none: false
160
156
  requirements:
161
157
  - - ! '>='
162
158
  - !ruby/object:Gem::Version
163
159
  version: '0'
164
160
  required_rubygems_version: !ruby/object:Gem::Requirement
165
- none: false
166
161
  requirements:
167
162
  - - ! '>='
168
163
  - !ruby/object:Gem::Version
169
164
  version: '0'
170
165
  requirements: []
171
166
  rubyforge_project:
172
- rubygems_version: 1.8.23
167
+ rubygems_version: 2.1.11
173
168
  signing_key:
174
- specification_version: 3
169
+ specification_version: 4
175
170
  summary: Ruby bindings for the Conekta API
176
171
  test_files: []
177
172
  has_rdoc: