adyen 0.3.8 → 1.0.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.
- data/.gitignore +4 -0
- data/.kick +35 -0
- data/LICENSE +3 -2
- data/README.rdoc +8 -4
- data/Rakefile +10 -0
- data/TODO +14 -4
- data/adyen.gemspec +9 -15
- data/lib/adyen.rb +10 -59
- data/lib/adyen/api.rb +281 -0
- data/lib/adyen/api/cacert.pem +3509 -0
- data/lib/adyen/api/payment_service.rb +258 -0
- data/lib/adyen/api/recurring_service.rb +126 -0
- data/lib/adyen/api/response.rb +54 -0
- data/lib/adyen/api/simple_soap_client.rb +118 -0
- data/lib/adyen/api/templates/payment_service.rb +103 -0
- data/lib/adyen/api/templates/recurring_service.rb +34 -0
- data/lib/adyen/api/test_helpers.rb +133 -0
- data/lib/adyen/api/xml_querier.rb +94 -0
- data/lib/adyen/configuration.rb +139 -0
- data/lib/adyen/form.rb +37 -109
- data/lib/adyen/formatter.rb +0 -10
- data/lib/adyen/matchers.rb +1 -1
- data/lib/adyen/notification_generator.rb +30 -0
- data/lib/adyen/railtie.rb +13 -0
- data/lib/adyen/templates/notification_migration.rb +29 -0
- data/lib/adyen/templates/notification_model.rb +70 -0
- data/spec/adyen_spec.rb +3 -45
- data/spec/api/api_spec.rb +139 -0
- data/spec/api/payment_service_spec.rb +439 -0
- data/spec/api/recurring_service_spec.rb +105 -0
- data/spec/api/response_spec.rb +35 -0
- data/spec/api/simple_soap_client_spec.rb +91 -0
- data/spec/api/spec_helper.rb +417 -0
- data/spec/api/test_helpers_spec.rb +83 -0
- data/spec/form_spec.rb +27 -23
- data/spec/functional/api_spec.rb +90 -0
- data/spec/functional/initializer.rb.sample +3 -0
- data/spec/spec_helper.rb +5 -5
- data/tasks/github-gem.rake +49 -55
- data/yard_extensions.rb +16 -0
- metadata +63 -82
- data/init.rb +0 -1
- data/lib/adyen/notification.rb +0 -151
- data/lib/adyen/soap.rb +0 -649
- data/spec/notification_spec.rb +0 -97
- data/spec/soap_spec.rb +0 -340
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'api/spec_helper'
|
4
|
+
require 'adyen/api/test_helpers'
|
5
|
+
|
6
|
+
describe "Test helpers" do
|
7
|
+
include APISpecHelper
|
8
|
+
|
9
|
+
after do
|
10
|
+
Net::HTTP.stubbing_enabled = false
|
11
|
+
end
|
12
|
+
|
13
|
+
describe Adyen::API::PaymentService do
|
14
|
+
before do
|
15
|
+
@params = {
|
16
|
+
:reference => 'order-id',
|
17
|
+
:amount => {
|
18
|
+
:currency => 'EUR',
|
19
|
+
:value => '1234',
|
20
|
+
},
|
21
|
+
:shopper => {
|
22
|
+
:email => 's.hopper@example.com',
|
23
|
+
:reference => 'user-id',
|
24
|
+
:ip => '61.294.12.12',
|
25
|
+
},
|
26
|
+
:card => {
|
27
|
+
:expiry_month => 12,
|
28
|
+
:expiry_year => 2012,
|
29
|
+
:holder_name => 'Simon わくわく Hopper',
|
30
|
+
:number => '4444333322221111',
|
31
|
+
:cvc => '737',
|
32
|
+
# Maestro UK/Solo only
|
33
|
+
#:issue_number => ,
|
34
|
+
#:start_month => ,
|
35
|
+
#:start_year => ,
|
36
|
+
}
|
37
|
+
}
|
38
|
+
@payment = @object = Adyen::API::PaymentService.new(@params)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns an `authorized' response" do
|
42
|
+
stub_net_http(AUTHORISATION_DECLINED_RESPONSE)
|
43
|
+
Adyen::API::PaymentService.stub_success!
|
44
|
+
@payment.authorise_payment.should be_authorized
|
45
|
+
|
46
|
+
@payment.authorise_payment.should_not be_authorized
|
47
|
+
end
|
48
|
+
|
49
|
+
it "returns a `refused' response" do
|
50
|
+
stub_net_http(AUTHORISE_RESPONSE)
|
51
|
+
Adyen::API::PaymentService.stub_refused!
|
52
|
+
response = @payment.authorise_payment
|
53
|
+
response.should_not be_authorized
|
54
|
+
response.should_not be_invalid_request
|
55
|
+
|
56
|
+
@payment.authorise_payment.should be_authorized
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns a `invalid request' response" do
|
60
|
+
stub_net_http(AUTHORISE_RESPONSE)
|
61
|
+
Adyen::API::PaymentService.stub_invalid!
|
62
|
+
response = @payment.authorise_payment
|
63
|
+
response.should_not be_authorized
|
64
|
+
response.should be_invalid_request
|
65
|
+
|
66
|
+
@payment.authorise_payment.should be_authorized
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe Adyen::API::RecurringService do
|
71
|
+
before do
|
72
|
+
@params = { :shopper => { :reference => 'user-id' } }
|
73
|
+
@recurring = @object = Adyen::API::RecurringService.new(@params)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "returns a `disabled' response" do
|
77
|
+
stub_net_http(DISABLE_RESPONSE % 'nope')
|
78
|
+
Adyen::API::RecurringService.stub_disabled!
|
79
|
+
@recurring.disable.should be_disabled
|
80
|
+
@recurring.disable.should_not be_disabled
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/spec/form_spec.rb
CHANGED
@@ -1,35 +1,38 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
4
|
+
require 'adyen/form'
|
2
5
|
|
3
6
|
describe Adyen::Form do
|
4
7
|
|
5
8
|
before(:all) do
|
6
|
-
Adyen
|
7
|
-
Adyen
|
9
|
+
Adyen.configuration.register_form_skin(:testing, '4aD37dJA', 'Kah942*$7sdp0)')
|
10
|
+
Adyen.configuration.default_form_params[:merchant_account] = 'TestMerchant'
|
8
11
|
end
|
9
12
|
|
10
13
|
describe 'Action URLs' do
|
11
14
|
|
12
15
|
before(:each) do
|
13
16
|
# Use autodetection for the environment unless otherwise specified
|
14
|
-
Adyen.environment = nil
|
17
|
+
Adyen.configuration.environment = nil
|
15
18
|
end
|
16
19
|
|
17
20
|
it "should generate correct the testing url" do
|
18
|
-
Adyen::Form.url.should
|
21
|
+
Adyen::Form.url.should == 'https://test.adyen.com/hpp/select.shtml'
|
19
22
|
end
|
20
23
|
|
21
24
|
it "should generate a live url if the environemtn is set top live" do
|
22
|
-
Adyen.environment = :live
|
23
|
-
Adyen::Form.url.should
|
25
|
+
Adyen.configuration.environment = :live
|
26
|
+
Adyen::Form.url.should == 'https://live.adyen.com/hpp/select.shtml'
|
24
27
|
end
|
25
28
|
|
26
29
|
it "should generate correct live url in a production environment" do
|
27
|
-
Adyen.stub!(:autodetect_environment).and_return('live')
|
28
|
-
Adyen::Form.url.should
|
30
|
+
Adyen.configuration.stub!(:autodetect_environment).and_return('live')
|
31
|
+
Adyen::Form.url.should. == 'https://live.adyen.com/hpp/select.shtml'
|
29
32
|
end
|
30
33
|
|
31
34
|
it "should generate correct live url if explicitely asked for" do
|
32
|
-
Adyen::Form.url(:live).should
|
35
|
+
Adyen::Form.url(:live).should == 'https://live.adyen.com/hpp/select.shtml'
|
33
36
|
end
|
34
37
|
end
|
35
38
|
|
@@ -44,11 +47,11 @@ describe Adyen::Form do
|
|
44
47
|
end
|
45
48
|
|
46
49
|
it "should calculate the signature string correctly" do
|
47
|
-
Adyen::Form.redirect_signature_string(@params).should
|
50
|
+
Adyen::Form.redirect_signature_string(@params).should == 'AUTHORISED1211992213193029Internet Order 123454aD37dJA'
|
48
51
|
end
|
49
52
|
|
50
53
|
it "should calculate the signature correctly" do
|
51
|
-
Adyen::Form.redirect_signature(@params).should
|
54
|
+
Adyen::Form.redirect_signature(@params).should == @params[:merchantSig]
|
52
55
|
end
|
53
56
|
|
54
57
|
it "should check the signature correctly with explicit shared signature" do
|
@@ -74,7 +77,7 @@ describe Adyen::Form do
|
|
74
77
|
before(:each) do
|
75
78
|
@attributes = { :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
|
76
79
|
:merchant_reference => 'Internet Order 12345', :skin => :testing,
|
77
|
-
:session_validity =>
|
80
|
+
:session_validity => Time.now + 3600 }
|
78
81
|
|
79
82
|
@redirect_url = Adyen::Form.redirect_url(@attributes)
|
80
83
|
end
|
@@ -85,7 +88,7 @@ describe Adyen::Form do
|
|
85
88
|
|
86
89
|
it "should include all provided attributes" do
|
87
90
|
params = @redirect_url.split('?', 2).last.split('&').map { |param| param.split('=', 2).first }
|
88
|
-
params.should include(*(@attributes.keys.map { |k|
|
91
|
+
params.should include(*(@attributes.keys.map { |k| Adyen::Form.camelize(k) }))
|
89
92
|
end
|
90
93
|
|
91
94
|
it "should include the merchant signature" do
|
@@ -96,17 +99,18 @@ describe Adyen::Form do
|
|
96
99
|
|
97
100
|
describe 'hidden fields generation' do
|
98
101
|
|
99
|
-
include ActionView::Helpers::TagHelper
|
100
|
-
|
101
102
|
before(:each) do
|
102
103
|
@attributes = { :currency_code => 'GBP', :payment_amount => 10000, :ship_before_date => Date.today,
|
103
104
|
:merchant_reference => 'Internet Order 12345', :skin => :testing,
|
104
|
-
:session_validity =>
|
105
|
+
:session_validity => Time.now + 3600 }
|
105
106
|
end
|
106
107
|
|
107
108
|
it "should generate a valid payment form" do
|
108
|
-
|
109
|
-
|
109
|
+
html_snippet = <<-HTML
|
110
|
+
<form action="#{CGI.escapeHTML(Adyen::Form.url)}" method="post">#{Adyen::Form.hidden_fields(@attributes)}</form>
|
111
|
+
HTML
|
112
|
+
|
113
|
+
html_snippet.should have_adyen_payment_form
|
110
114
|
end
|
111
115
|
end
|
112
116
|
|
@@ -125,12 +129,12 @@ describe Adyen::Form do
|
|
125
129
|
|
126
130
|
it "should construct the signature string correctly" do
|
127
131
|
signature_string = Adyen::Form.calculate_signature_string(@parameters)
|
128
|
-
signature_string.should
|
132
|
+
signature_string.should == "10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Z"
|
129
133
|
end
|
130
134
|
|
131
135
|
it "should calculate the signature correctly" do
|
132
136
|
signature = Adyen::Form.calculate_signature(@parameters)
|
133
|
-
signature.should
|
137
|
+
signature.should == 'x58ZcRVL1H6y+XSeBGrySJ9ACVo='
|
134
138
|
end
|
135
139
|
|
136
140
|
it "should calculate the signature correctly for a recurring payment" do
|
@@ -138,7 +142,7 @@ describe Adyen::Form do
|
|
138
142
|
@parameters.merge!(:recurring_contract => 'DEFAULT', :shopper_reference => 'grasshopper52', :shopper_email => 'gras.shopper@somewhere.org')
|
139
143
|
|
140
144
|
signature_string = Adyen::Form.calculate_signature_string(@parameters)
|
141
|
-
signature_string.should
|
145
|
+
signature_string.should == "10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Zgras.shopper@somewhere.orggrasshopper52DEFAULT"
|
142
146
|
end
|
143
147
|
|
144
148
|
it "should calculate the signature correctly for a recurring payment" do
|
@@ -146,7 +150,7 @@ describe Adyen::Form do
|
|
146
150
|
@parameters.merge!(:recurring_contract => 'DEFAULT', :shopper_reference => 'grasshopper52', :shopper_email => 'gras.shopper@somewhere.org')
|
147
151
|
|
148
152
|
signature = Adyen::Form.calculate_signature(@parameters)
|
149
|
-
signature.should
|
153
|
+
signature.should == 'F2BQEYbE+EUhiRGuPtcD16Gm7JY='
|
150
154
|
end
|
151
155
|
end
|
152
|
-
end
|
156
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
API_SPEC_INITIALIZER = File.expand_path("../initializer.rb", __FILE__)
|
8
|
+
|
9
|
+
if File.exist?(API_SPEC_INITIALIZER)
|
10
|
+
|
11
|
+
describe Adyen::API, "with an actual remote connection" do
|
12
|
+
before :all do
|
13
|
+
require API_SPEC_INITIALIZER
|
14
|
+
Net::HTTP.stubbing_enabled = false
|
15
|
+
@order_id = @user_id = Time.now.to_i
|
16
|
+
perform_payment_request
|
17
|
+
end
|
18
|
+
|
19
|
+
after :all do
|
20
|
+
Net::HTTP.stubbing_enabled = true
|
21
|
+
end
|
22
|
+
|
23
|
+
def perform_payment_request
|
24
|
+
@payment_response = Adyen::API.authorise_payment(
|
25
|
+
@order_id,
|
26
|
+
{ :currency => 'EUR', :value => '1234' },
|
27
|
+
{ :email => "#{@user_id}@example.com", :reference => @user_id },
|
28
|
+
{ :expiry_month => 12, :expiry_year => 2012, :holder_name => "Simon #{@user_id} Hopper", :number => '4444333322221111', :cvc => '737' },
|
29
|
+
true
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "performs a payment request" do
|
34
|
+
@payment_response.should be_authorized
|
35
|
+
@payment_response.psp_reference.should_not be_empty
|
36
|
+
end
|
37
|
+
|
38
|
+
it "performs a recurring payment request" do
|
39
|
+
response = Adyen::API.authorise_recurring_payment(
|
40
|
+
@order_id,
|
41
|
+
{ :currency => 'EUR', :value => '1234' },
|
42
|
+
{ :email => "#{@user_id}@example.com", :reference => @user_id }
|
43
|
+
)
|
44
|
+
response.should be_authorized
|
45
|
+
response.psp_reference.should_not be_empty
|
46
|
+
end
|
47
|
+
|
48
|
+
it "performs a one-click payment request" do
|
49
|
+
detail = Adyen::API.list_recurring_details(@user_id).references.last
|
50
|
+
response = Adyen::API.authorise_one_click_payment(
|
51
|
+
@order_id,
|
52
|
+
{ :currency => 'EUR', :value => '1234' },
|
53
|
+
{ :email => "#{@user_id}@example.com", :reference => @user_id },
|
54
|
+
'737',
|
55
|
+
detail
|
56
|
+
)
|
57
|
+
response.should be_authorized
|
58
|
+
response.psp_reference.should_not be_empty
|
59
|
+
end
|
60
|
+
|
61
|
+
it "captures a payment" do
|
62
|
+
response = Adyen::API.capture_payment(@payment_response.psp_reference, { :currency => 'EUR', :value => '1234' })
|
63
|
+
response.should be_success
|
64
|
+
end
|
65
|
+
|
66
|
+
it "refunds a payment" do
|
67
|
+
response = Adyen::API.refund_payment(@payment_response.psp_reference, { :currency => 'EUR', :value => '1234' })
|
68
|
+
response.should be_success
|
69
|
+
end
|
70
|
+
|
71
|
+
it "cancels or refunds a payment" do
|
72
|
+
response = Adyen::API.cancel_or_refund_payment(@payment_response.psp_reference)
|
73
|
+
response.should be_success
|
74
|
+
end
|
75
|
+
|
76
|
+
it "cancels a payment" do
|
77
|
+
response = Adyen::API.cancel_payment(@payment_response.psp_reference)
|
78
|
+
response.should be_success
|
79
|
+
end
|
80
|
+
|
81
|
+
it "disables a recurring contract" do
|
82
|
+
response = Adyen::API.disable_recurring_contract(@user_id)
|
83
|
+
response.should be_success
|
84
|
+
response.should be_disabled
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
else
|
89
|
+
puts "[!] To run the functional tests you'll need to create `spec/functional/initializer.rb' and configure with your test account settings. See `spec/functional/initializer.rb.sample'."
|
90
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require '
|
5
|
-
|
6
|
-
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
7
7
|
|
8
8
|
require 'adyen'
|
9
9
|
require 'adyen/matchers'
|
10
10
|
|
11
|
-
|
11
|
+
RSpec.configure do |config|
|
12
12
|
config.include Adyen::Matchers
|
13
13
|
end
|
data/tasks/github-gem.rake
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'rake/tasklib'
|
4
4
|
require 'date'
|
5
|
-
require '
|
5
|
+
require 'set'
|
6
6
|
|
7
7
|
module GithubGem
|
8
8
|
|
@@ -24,7 +24,7 @@ module GithubGem
|
|
24
24
|
|
25
25
|
class RakeTasks
|
26
26
|
|
27
|
-
attr_reader :gemspec, :modified_files
|
27
|
+
attr_reader :gemspec, :modified_files
|
28
28
|
attr_accessor :gemspec_file, :task_namespace, :main_include, :root_dir, :spec_pattern, :test_pattern, :remote, :remote_branch, :local_branch
|
29
29
|
|
30
30
|
# Initializes the settings, yields itself for configuration
|
@@ -33,7 +33,7 @@ module GithubGem
|
|
33
33
|
@gemspec_file = GithubGem.detect_gemspec_file
|
34
34
|
@task_namespace = task_namespace
|
35
35
|
@main_include = GithubGem.detect_main_include
|
36
|
-
@modified_files =
|
36
|
+
@modified_files = Set.new
|
37
37
|
@root_dir = Dir.pwd
|
38
38
|
@test_pattern = 'test/**/*_test.rb'
|
39
39
|
@spec_pattern = 'spec/**/*_spec.rb'
|
@@ -43,13 +43,16 @@ module GithubGem
|
|
43
43
|
|
44
44
|
yield(self) if block_given?
|
45
45
|
|
46
|
-
@git = Git.open(@root_dir)
|
47
46
|
load_gemspec!
|
48
47
|
define_tasks!
|
49
48
|
end
|
50
49
|
|
51
50
|
protected
|
52
51
|
|
52
|
+
def git
|
53
|
+
@git ||= ENV['GIT'] || 'git'
|
54
|
+
end
|
55
|
+
|
53
56
|
# Define Unit test tasks
|
54
57
|
def define_test_tasks!
|
55
58
|
require 'rake/testtask'
|
@@ -68,23 +71,23 @@ module GithubGem
|
|
68
71
|
|
69
72
|
# Defines RSpec tasks
|
70
73
|
def define_rspec_tasks!
|
71
|
-
require '
|
74
|
+
require 'rspec/core/rake_task'
|
72
75
|
|
73
76
|
namespace(:spec) do
|
74
77
|
desc "Verify all RSpec examples for #{gemspec.name}"
|
75
|
-
|
76
|
-
t.
|
78
|
+
RSpec::Core::RakeTask.new(:basic) do |t|
|
79
|
+
t.pattern = spec_pattern
|
77
80
|
end
|
78
81
|
|
79
82
|
desc "Verify all RSpec examples for #{gemspec.name} and output specdoc"
|
80
|
-
|
81
|
-
t.
|
82
|
-
t.
|
83
|
+
RSpec::Core::RakeTask.new(:specdoc) do |t|
|
84
|
+
t.pattern = spec_pattern
|
85
|
+
t.rspec_opts = ['--format', 'documentation', '--color']
|
83
86
|
end
|
84
87
|
|
85
88
|
desc "Run RCov on specs for #{gemspec.name}"
|
86
|
-
|
87
|
-
t.
|
89
|
+
RSpec::Core::RakeTask.new(:rcov) do |t|
|
90
|
+
t.pattern = spec_pattern
|
88
91
|
t.rcov = true
|
89
92
|
t.rcov_opts = ['--exclude', '"spec/*,gems/*"', '--rails']
|
90
93
|
end
|
@@ -165,7 +168,7 @@ module GithubGem
|
|
165
168
|
# in the repository and the spec/test file pattern.
|
166
169
|
def manifest_task
|
167
170
|
# Load all the gem's files using "git ls-files"
|
168
|
-
repository_files = git
|
171
|
+
repository_files = `#{git} ls-files`.split("\n")
|
169
172
|
test_files = Dir[test_pattern] + Dir[spec_pattern]
|
170
173
|
|
171
174
|
update_gemspec(:files, repository_files)
|
@@ -180,7 +183,7 @@ module GithubGem
|
|
180
183
|
end
|
181
184
|
|
182
185
|
def newest_version
|
183
|
-
git.
|
186
|
+
`#{git} tag`.split("\n").map { |tag| tag.split('-').last }.compact.map { |v| Gem::Version.new(v) }.max || Gem::Version.new('0.0.0')
|
184
187
|
end
|
185
188
|
|
186
189
|
def next_version(increment = nil)
|
@@ -217,72 +220,58 @@ module GithubGem
|
|
217
220
|
|
218
221
|
def check_version_task
|
219
222
|
raise "#{ENV['VERSION']} is not a valid version number!" if ENV['VERSION'] && !Gem::Version.correct?(ENV['VERSION'])
|
220
|
-
proposed_version = Gem::Version.new(ENV['VERSION']
|
223
|
+
proposed_version = Gem::Version.new((ENV['VERSION'] || gemspec.version).dup)
|
221
224
|
raise "This version (#{proposed_version}) is not higher than the highest tagged version (#{newest_version})" if newest_version >= proposed_version
|
222
225
|
end
|
223
226
|
|
224
227
|
# Checks whether the current branch is not diverged from the remote branch
|
225
228
|
def check_not_diverged_task
|
226
|
-
raise "The current branch is diverged from the remote branch!" if git
|
229
|
+
raise "The current branch is diverged from the remote branch!" if `#{git} rev-list HEAD..#{remote}/#{remote_branch}`.split("\n").any?
|
227
230
|
end
|
228
231
|
|
229
232
|
# Checks whether the repository status ic clean
|
230
233
|
def check_clean_status_task
|
231
|
-
raise "The current working copy contains modifications" if git.
|
234
|
+
raise "The current working copy contains modifications" if `#{git} ls-files -m`.split("\n").any?
|
232
235
|
end
|
233
236
|
|
234
237
|
# Checks whether the current branch is correct
|
235
238
|
def check_current_branch_task
|
236
|
-
raise "Currently not on #{local_branch} branch!" unless git
|
239
|
+
raise "Currently not on #{local_branch} branch!" unless `#{git} branch`.split("\n").detect { |b| /^\* / =~ b } == "* #{local_branch}"
|
237
240
|
end
|
238
241
|
|
239
242
|
# Fetches the latest updates from Github
|
240
243
|
def fetch_origin_task
|
241
|
-
git
|
244
|
+
sh git, 'fetch', remote
|
242
245
|
end
|
243
246
|
|
244
247
|
# Commits every file that has been changed by the release task.
|
245
248
|
def commit_modified_files_task
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
+
really_modified = `#{git} ls-files -m #{modified_files.entries.join(' ')}`.split("\n")
|
250
|
+
if really_modified.any?
|
251
|
+
really_modified.each { |file| sh git, 'add', file }
|
252
|
+
sh git, 'commit', '-m', "Released #{gemspec.name} gem version #{gemspec.version}."
|
249
253
|
end
|
250
254
|
end
|
251
255
|
|
252
256
|
# Adds a tag for the released version
|
253
257
|
def tag_version_task
|
254
|
-
git
|
258
|
+
sh git, 'tag', '-a', "#{gemspec.name}-#{gemspec.version}", '-m', "Released #{gemspec.name} gem version #{gemspec.version}."
|
255
259
|
end
|
256
260
|
|
257
261
|
# Pushes the changes and tag to github
|
258
262
|
def github_release_task
|
259
|
-
git
|
263
|
+
sh git, 'push', '--tags', remote, remote_branch
|
260
264
|
end
|
261
265
|
|
262
|
-
# # Checks whether Rubyforge is configured properly
|
263
|
-
# def check_rubyforge_task
|
264
|
-
# # Login no longer necessary when using rubyforge 2.0.0 gem
|
265
|
-
# # raise "Could not login on rubyforge!" unless `rubyforge login 2>&1`.strip.empty?
|
266
|
-
# output = `rubyforge names`.split("\n")
|
267
|
-
# raise "Rubyforge group not found!" unless output.any? { |line| %r[^groups\s*\:.*\b#{Regexp.quote(gemspec.rubyforge_project)}\b.*] =~ line }
|
268
|
-
# raise "Rubyforge package not found!" unless output.any? { |line| %r[^packages\s*\:.*\b#{Regexp.quote(gemspec.name)}\b.*] =~ line }
|
269
|
-
# end
|
270
|
-
|
271
|
-
# # Task to release the .gem file toRubyforge.
|
272
|
-
# def rubyforge_release_task
|
273
|
-
# sh 'rubyforge', 'add_release', gemspec.rubyforge_project, gemspec.name, gemspec.version.to_s, "pkg/#{gemspec.name}-#{gemspec.version}.gem"
|
274
|
-
# end
|
275
|
-
|
276
266
|
def gemcutter_release_task
|
277
|
-
sh "gem push pkg/#{gemspec.name}-#{gemspec.version}.gem"
|
267
|
+
sh "gem", 'push', "pkg/#{gemspec.name}-#{gemspec.version}.gem"
|
278
268
|
end
|
279
269
|
|
280
270
|
# Gem release task.
|
281
271
|
# All work is done by the task's dependencies, so just display a release completed message.
|
282
272
|
def release_task
|
283
273
|
puts
|
284
|
-
puts
|
285
|
-
puts "Released #{gemspec.name} version #{gemspec.version}"
|
274
|
+
puts "Release successful."
|
286
275
|
end
|
287
276
|
|
288
277
|
private
|
@@ -342,30 +331,35 @@ module GithubGem
|
|
342
331
|
|
343
332
|
# Reload the gemspec so the changes are incorporated
|
344
333
|
load_gemspec!
|
334
|
+
|
335
|
+
# Also mark the Gemfile.lock file as changed because of the new version.
|
336
|
+
modified_files << 'Gemfile.lock' if File.exist?(File.join(root_dir, 'Gemfile.lock'))
|
345
337
|
end
|
346
338
|
end
|
347
339
|
|
348
340
|
# Updates the tasks file using the latest file found on Github
|
349
341
|
def update_tasks_task
|
350
|
-
require 'net/
|
342
|
+
require 'net/https'
|
343
|
+
require 'uri'
|
351
344
|
|
352
|
-
|
353
|
-
|
345
|
+
uri = URI.parse('https://github.com/wvanbergen/github-gem/raw/master/tasks/github-gem.rake')
|
346
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
347
|
+
http.use_ssl = true
|
348
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
349
|
+
response = http.request(Net::HTTP::Get.new(uri.path))
|
354
350
|
|
355
|
-
Net::
|
356
|
-
response = http.get(path)
|
351
|
+
if Net::HTTPSuccess === response
|
357
352
|
open(__FILE__, "w") { |file| file.write(response.body) }
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
353
|
+
relative_file = File.expand_path(__FILE__).sub(%r[^#{@root_dir}/], '')
|
354
|
+
if `#{git} ls-files -m #{relative_file}`.split("\n").any?
|
355
|
+
sh git, 'add', relative_file
|
356
|
+
sh git, 'commit', '-m', "Updated to latest gem release management tasks."
|
357
|
+
else
|
358
|
+
puts "Release managament tasks already are at the latest version."
|
359
|
+
end
|
365
360
|
else
|
366
|
-
|
361
|
+
raise "Download failed with HTTP status #{response.code}!"
|
367
362
|
end
|
368
363
|
end
|
369
|
-
|
370
364
|
end
|
371
365
|
end
|