pensio_api 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8df2a4f55de1b2a15095fcb0eae66ec28a0556f2
4
- data.tar.gz: 1e65cb234c4d22f00599fcc15821519322ebe2c6
3
+ metadata.gz: f9543dfa7d71a3752517ac385c643f887f78bdb4
4
+ data.tar.gz: 0fe99ac756ee3145f76f29eae0a993d5e36af8d0
5
5
  SHA512:
6
- metadata.gz: 808300554a974100f949ec893f789cc36ca686c9e8b5d6a8afd36ea890e884847e5ff6837b86b4cdba5f8c3c3c91da8be81894f1f4053e259ece8105814f01db
7
- data.tar.gz: 96af16fe19782e17c5f6be0cbc3ca625ac1faee1fb57036f956f2b7a3a5e32d95decde08fb09954fcc2ad1c8e6fe2209efea79073e874bb1a04cb5447b50e47e
6
+ metadata.gz: 630b0086874a418ca44e8f9a0eb34174a89bbabd840e0fa8571ffea67a6179d45b83551b36239c3ac066a8fd0e05e335c9e7c389473b33e2c2a9aeadeb50bfd0
7
+ data.tar.gz: 3c0f93a5fca86731e5b784c32d9dfebae6a43b94274d06ac839ad9f61b1373cca937d491615bb6e9f126b6775dc297e9b832de46b86c8eb3a160a917e25948c1
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pensio_api (0.3.0)
4
+ pensio_api (0.3.1)
5
5
  activesupport (>= 3.2)
6
6
  httparty (>= 0.12.0)
7
7
  multi_xml (>= 0.5.2)
@@ -9,12 +9,12 @@ PATH
9
9
  GEM
10
10
  remote: https://www.rubygems.org/
11
11
  specs:
12
- activesupport (4.0.4)
13
- i18n (~> 0.6, >= 0.6.9)
14
- minitest (~> 4.2)
15
- multi_json (~> 1.3)
16
- thread_safe (~> 0.1)
17
- tzinfo (~> 0.3.37)
12
+ activesupport (4.2.1)
13
+ i18n (~> 0.7)
14
+ json (~> 1.7, >= 1.7.7)
15
+ minitest (~> 5.1)
16
+ thread_safe (~> 0.3, >= 0.3.4)
17
+ tzinfo (~> 1.1)
18
18
  addressable (2.3.5)
19
19
  celluloid (0.15.2)
20
20
  timers (~> 1.1.0)
@@ -36,16 +36,15 @@ GEM
36
36
  httparty (0.13.0)
37
37
  json (~> 1.8)
38
38
  multi_xml (>= 0.5.2)
39
- i18n (0.6.9)
40
- json (1.8.1)
39
+ i18n (0.7.0)
40
+ json (1.8.2)
41
41
  listen (2.4.0)
42
42
  celluloid (>= 0.15.2)
43
43
  rb-fsevent (>= 0.9.3)
44
44
  rb-inotify (>= 0.9)
45
45
  lumberjack (1.0.4)
46
46
  method_source (0.8.2)
47
- minitest (4.7.5)
48
- multi_json (1.9.2)
47
+ minitest (5.5.1)
49
48
  multi_xml (0.5.5)
50
49
  pry (0.9.12.4)
51
50
  coderay (~> 1.0)
@@ -65,9 +64,10 @@ GEM
65
64
  safe_yaml (0.9.7)
66
65
  slop (3.4.7)
67
66
  thor (0.18.1)
68
- thread_safe (0.3.2)
67
+ thread_safe (0.3.5)
69
68
  timers (1.1.0)
70
- tzinfo (0.3.39)
69
+ tzinfo (1.2.2)
70
+ thread_safe (~> 0.1)
71
71
  webmock (1.16.1)
72
72
  addressable (>= 2.2.7)
73
73
  crack (>= 0.3.2)
data/README.md CHANGED
@@ -11,6 +11,10 @@ PensioAPI::Credentials.username = 'Your pensio username'
11
11
  PensioAPI::Credentials.password = 'Your pensio password'
12
12
  ```
13
13
 
14
+ This is sufficient in the simple case where you only have a single integration with Pensio, using a single set of credentials.
15
+
16
+ If you require support for multiple connections to Pensio's API, using different sets of credentials, you must define named 'credentials sets' - see below under [Multiple Credentials Sets](#multiple-credentials-sets).
17
+
14
18
  ## Transactions
15
19
 
16
20
  To query transactions in your Pensio gateway, use the method `PensioAPI::Transaction.find`. This takes a number of parameters as defined in the Pensio documentation. For example:
@@ -67,6 +71,38 @@ The library provides two generic error classes for requests.
67
71
 
68
72
  Additionally, a third error class `PensioAPI::NoCredentials` is raised if credentials have not been provided. See "Getting Started" for more details.
69
73
 
74
+ ## Multiple Credentials Sets
75
+
76
+ If you require multiple connections to Pensio's API using different credentials, you must set up named credentials sets. For example, if you need separate credentials for your membership payments and ticket sales, you can configure them as follows:
77
+
78
+ ```
79
+ PensioAPI::Credentials.for(:membership).base_uri = 'Your pensio gateway URI for memberships'
80
+ PensioAPI::Credentials.for(:membership).username = 'Your pensio username for memberships'
81
+ PensioAPI::Credentials.for(:membership).password = 'Your pensio password for memberships'
82
+ ```
83
+
84
+ ```
85
+ PensioAPI::Credentials.for(:tickets).base_uri = 'Your pensio gateway URI for tickets'
86
+ PensioAPI::Credentials.for(:tickets).username = 'Your pensio username for tickets'
87
+ PensioAPI::Credentials.for(:tickets).password = 'Your pensio password for tickets'
88
+ ```
89
+
90
+ In this case, you *must* also pass the credential set to each request, by including a 'credentials' key in the options hash. The value should be a String or Symbol with the credential set name (e.g. :tickets, 'tickets'), or the PensioAPI::Credentials instance itself (e.g. PensioAPI::Credentials.for(:tickets)). For example, these three examples are equivalent:
91
+
92
+ ```
93
+ PensioAPI::Transaction.find(credentials: :tickets, transaction_id: '123')
94
+ PensioAPI::Transaction.find(credentials: 'tickets', transaction_id: '123')
95
+ PensioAPI::Transaction.find(credentials: PensioAPI::Credentials.for(:tickets), transaction_id: '123')
96
+ ```
97
+
98
+ Typically if you have multiple credentials sets, the default credentials (i.e. PensioAPI::Credentials.base_uri etc) are ignored, and making any Pensio API requests without explicitly passing a 'credentials' argument will raise `PensioAPI::NoCredentials`. However, if you have an existing Pensio integration using the simple default credentials approach and now want to also use a named credentials set, you can tell the library to explicitly allow this, by setting:
99
+
100
+ ```
101
+ PensioAPI::Credentials.allow_defaults = true
102
+ ```
103
+
104
+ In this scenario, requests performed without an explicit credentials set will use the default set, and those with named credentials will use those. BE CAREFUL: If you accidentally omit the 'credentials' options key when making a request, it will use the default credentials set, which could lead to undesired behaviour. This is why, by default, if you have multiple credentials sets, the default set is disabled.
105
+
70
106
  ## TODO
71
107
 
72
108
  * Better documentation - more examples, RDoc docs
@@ -1,7 +1,53 @@
1
1
  module PensioAPI
2
- module Credentials
2
+ class Credentials
3
3
  class << self
4
- attr_accessor :base_uri, :username, :password
4
+ attr_accessor :credentials_sets, :allow_defaults
5
+
6
+ # backwards compatability - set default credentials
7
+
8
+ def base_uri
9
+ default_credentials.base_uri
10
+ end
11
+
12
+ def base_uri=(value)
13
+ default_credentials.base_uri = value
14
+ end
15
+
16
+ def username
17
+ default_credentials.username
18
+ end
19
+
20
+ def username=(value)
21
+ default_credentials.username = value
22
+ end
23
+
24
+ def password
25
+ default_credentials.password
26
+ end
27
+
28
+ def password=(value)
29
+ default_credentials.password = value
30
+ end
31
+
32
+ def for(context)
33
+ self.credentials_sets ||= {}
34
+ self.credentials_sets[context.to_sym] ||= PensioAPI::Credentials.new
35
+ end
36
+
37
+ def default_credentials
38
+ self.for(:default)
39
+ end
40
+
41
+ def credentials_mode
42
+ self.for(:default)
43
+ self.credentials_sets.count == 1 ? :default : :multiple
44
+ end
5
45
  end
46
+
47
+ def supplied?
48
+ !!(base_uri && username && password)
49
+ end
50
+
51
+ attr_accessor :base_uri, :username, :password
6
52
  end
7
53
  end
@@ -23,8 +23,8 @@ module PensioAPI
23
23
  @download_link = @raw['DownloadLink']
24
24
  end
25
25
 
26
- def download
27
- @result ||= FundingListRequest.new(@download_link).result
26
+ def download(options={})
27
+ @result ||= FundingListRequest.new(@download_link, options).result
28
28
  end
29
29
  end
30
30
  end
@@ -4,13 +4,7 @@ module PensioAPI
4
4
  def self.included(base)
5
5
  base.send(:include, HTTParty)
6
6
  base.send(:attr_reader, :response)
7
- base.extend(ClassMethods)
8
- end
9
-
10
- module ClassMethods
11
- def set_base_uri
12
- self.base_uri PensioAPI::Credentials.base_uri unless self.base_uri
13
- end
7
+ base.send(:attr_accessor, :credentials)
14
8
  end
15
9
 
16
10
  HEADERS = {
@@ -18,9 +12,12 @@ module PensioAPI
18
12
  }
19
13
 
20
14
  def initialize(path, options={})
21
- self.class.set_base_uri
22
-
23
- raise Errors::NoCredentials unless credentials_supplied?
15
+ @credentials = options.delete(:credentials)
16
+ @credentials = PensioAPI::Credentials.for(@credentials.to_sym) unless @credentials.nil? || @credentials.is_a?(PensioAPI::Credentials)
17
+ @credentials ||= PensioAPI::Credentials.default_credentials if PensioAPI::Credentials.credentials_mode == :default || PensioAPI::Credentials.allow_defaults
18
+ raise Errors::NoCredentials unless @credentials && @credentials.supplied?
19
+
20
+ self.class.base_uri @credentials.base_uri unless self.class.base_uri
24
21
 
25
22
  @response = self.class.post(path, request_options(options))
26
23
  end
@@ -37,14 +34,11 @@ module PensioAPI
37
34
 
38
35
  def auth
39
36
  {
40
- username: PensioAPI::Credentials.username,
41
- password: PensioAPI::Credentials.password
37
+ username: @credentials.username,
38
+ password: @credentials.password
42
39
  }
43
40
  end
44
41
 
45
- def credentials_supplied?
46
- Credentials.base_uri && Credentials.username && Credentials.password
47
- end
48
42
  end
49
43
  end
50
44
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'pensio_api'
3
- s.version = '0.3.0'
3
+ s.version = '0.3.1'
4
4
  s.license = 'BSD-3-Clause'
5
5
  s.summary = "Provides integration for the Pensio Merchant API"
6
6
  s.authors = ['Michael Sell', 'Rory Sinclair']
@@ -18,8 +18,8 @@ describe PensioAPI::Request do
18
18
  before :each do
19
19
  PensioAPI::Request.stub(:post).and_return(
20
20
  construct_response({
21
- 'Test' => 'true'
22
- })
21
+ 'Test' => 'true'
22
+ })
23
23
  )
24
24
  end
25
25
 
@@ -82,6 +82,27 @@ describe PensioAPI::Request do
82
82
  expect(p.send(:request_options, {transaction_id: 5432})[:body][:transaction_id]).to eq(5432)
83
83
  end
84
84
  end
85
+
86
+ context 'with alternative credentials' do
87
+ it 'sends the correct credentials' do
88
+ creds = PensioAPI::Credentials.for(:ticketing)
89
+ creds.base_uri = 'https://www.test.com'
90
+ creds.username = 'ticketing_username'
91
+ creds.password = 'ticketing_password'
92
+
93
+ # pass credentials instance
94
+ req1 = PensioAPI::Request.new('/test', credentials: creds)
95
+
96
+ # or pass credentials set name
97
+ req2 = PensioAPI::Request.new('/test', credentials: :ticketing)
98
+
99
+ expect(req1.send(:request_options, {})[:basic_auth]).to_not be_nil
100
+ expect(req1.send(:request_options, {})[:basic_auth]).to eq({ username: creds.username, password: creds.password})
101
+
102
+ expect(req2.send(:request_options, {})[:basic_auth]).to_not be_nil
103
+ expect(req2.send(:request_options, {})[:basic_auth]).to eq({ username: creds.username, password: creds.password})
104
+ end
105
+ end
85
106
  end
86
107
 
87
108
  describe 'error handling' do
@@ -107,11 +128,7 @@ describe PensioAPI::Request do
107
128
 
108
129
  context 'with incomplete credentials' do
109
130
  before :each do
110
- PensioAPI::Credentials = OpenStruct.new({
111
- base_uri: nil,
112
- username: nil,
113
- password: nil
114
- })
131
+ PensioAPI::Credentials.base_uri = nil
115
132
  end
116
133
 
117
134
  it 'raises a PensioAPI::Errors::NoCredentials error' do
@@ -16,6 +16,7 @@ RSpec.configure do |config|
16
16
  PensioAPI::Credentials.base_uri = 'https://testgateway.pensio.com'
17
17
  PensioAPI::Credentials.username = 'test_user'
18
18
  PensioAPI::Credentials.password = 'password'
19
+ PensioAPI::Credentials.allow_defaults = true # because some spec examples set up additional creds
19
20
  end
20
21
 
21
22
  # Run specs in random order to surface order dependencies. If you find an
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pensio_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Sell
@@ -9,104 +9,104 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-11-25 00:00:00.000000000 Z
12
+ date: 2015-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '2.14'
21
21
  type: :development
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '2.14'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: webmock
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: 1.16.1
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: 1.16.1
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: guard
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: 2.2.5
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
55
  version: 2.2.5
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: guard-rspec
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ~>
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: 4.2.4
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ~>
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: 4.2.4
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: httparty
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: 0.12.0
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
82
  - !ruby/object:Gem::Version
83
83
  version: 0.12.0
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: activesupport
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '>='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
90
  version: '3.2'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '3.2'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: multi_xml
100
100
  requirement: !ruby/object:Gem::Requirement
101
101
  requirements:
102
- - - '>='
102
+ - - ">="
103
103
  - !ruby/object:Gem::Version
104
104
  version: 0.5.2
105
105
  type: :runtime
106
106
  prerelease: false
107
107
  version_requirements: !ruby/object:Gem::Requirement
108
108
  requirements:
109
- - - '>='
109
+ - - ">="
110
110
  - !ruby/object:Gem::Version
111
111
  version: 0.5.2
112
112
  description:
@@ -115,7 +115,7 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - .rspec
118
+ - ".rspec"
119
119
  - Gemfile
120
120
  - Gemfile.lock
121
121
  - Guardfile
@@ -217,17 +217,17 @@ require_paths:
217
217
  - lib
218
218
  required_ruby_version: !ruby/object:Gem::Requirement
219
219
  requirements:
220
- - - '>='
220
+ - - ">="
221
221
  - !ruby/object:Gem::Version
222
222
  version: '0'
223
223
  required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  requirements:
225
- - - '>='
225
+ - - ">="
226
226
  - !ruby/object:Gem::Version
227
227
  version: '0'
228
228
  requirements: []
229
229
  rubyforge_project:
230
- rubygems_version: 2.0.14
230
+ rubygems_version: 2.2.2
231
231
  signing_key:
232
232
  specification_version: 4
233
233
  summary: Provides integration for the Pensio Merchant API