paytureman 0.5.0 → 0.7.0

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: ecfb2af79747d781ab577d9424ec75fa87b0aed5
4
- data.tar.gz: 3cacba04b75c0ee01b23ea637011c4d76985aa3a
3
+ metadata.gz: cab53a95a5cb505acc786ae18db994f36b2b5f2b
4
+ data.tar.gz: 6195ca545af50b0edbb0ee007704991494bf617b
5
5
  SHA512:
6
- metadata.gz: 4dc7562f7b30eedfae776d7e1f5d3227134972b7cd18278b35e6fe2d91023de33ba412d47820c650280da0a34ec5101c84db296ae7c942d02728b034a043877c
7
- data.tar.gz: dc4fa2ff9f82487982cdeccd3d9a11a3204cbd4d53259badc409b8416d76a796b984d7056a158c15bf9e389d4de4d18afa9f5b551b0b4d5e0f335240608915ca
6
+ metadata.gz: aa7323cddc4e9a62fad4a86f5f44b0002bc3cbccfc9b9b93eab0594135554846f69104ed04f6173fa32747f6473edb589b5bac5975c34ae75f6f2f5227ed2fbb
7
+ data.tar.gz: 2f6c25408ebecb50ee21d0ecafc1700c6ba9bd85440f43d39ee26010654b76563dfbc8da8e78614260412e909b14005e06913c581fe7334a8b86de1666e060aa
data/README.md CHANGED
@@ -21,6 +21,19 @@ Or install it yourself as:
21
21
  ```ruby
22
22
  require 'paytureman'
23
23
 
24
+ Paytureman::Configuration.setup do |config|
25
+ config.host = "sandbox"
26
+ config.key = "MerchantKey"
27
+ config.password = "123"
28
+ end
29
+
30
+ # or you can use several configs
31
+ Paytureman::Configuration.setup :production do |config|
32
+ config.host = "secure"
33
+ config.key = "Merchant12345"
34
+ config.password = "password"
35
+ end
36
+
24
37
  order_id = SecureRandom.uuid # generate an order ID
25
38
  amount = 123.15 # amount to be charged
26
39
  customer_ip = "123.45.67.89" # customer's IP address
@@ -28,8 +41,15 @@ customer_ip = "123.45.67.89" # customer's IP address
28
41
  # create initial payment
29
42
  payment = Paytureman::PaymentNew.new(order_id, amount, customer_ip)
30
43
 
44
+ # in case with several configs
45
+ payment = Paytureman::PaymentNew.new(order_id, amount, customer_ip, :production)
46
+
31
47
  # prepare it
32
- payment = payment.prepare
48
+ description = Paytureman::PaymentDescription.new
49
+ description.product = 'Paytureman demo payment'
50
+ description.total = amount
51
+
52
+ payment = payment.prepare(description)
33
53
  # ... assert(payment.kind_of?(Paytureman::PaymentPrepared))
34
54
 
35
55
  puts "Please, visit #{payment.url} to proceed with the payment. Then press Enter."
@@ -51,4 +71,4 @@ payment = payment.charge
51
71
  2. Create your feature branch (`git checkout -b my-new-feature`)
52
72
  3. Commit your changes (`git commit -am 'Add some feature'`)
53
73
  4. Push to the branch (`git push origin my-new-feature`)
54
- 5. Create new Pull Request
74
+ 5. Create new Pull Request
@@ -2,18 +2,24 @@ module Paytureman
2
2
 
3
3
  class Payment
4
4
 
5
+ attr_accessor :gateway
5
6
  attr_reader :order_id
7
+ attr_writer :configuration
6
8
 
7
- def initialize(order_id, amount, ip)
8
- @order_id, @amount, @ip = order_id, amount, ip
9
+ def initialize(order_id, amount, gateway = nil)
10
+ @order_id = order_id
11
+ @amount = amount
12
+ @gateway = gateway
9
13
  end
10
14
 
11
15
  def save_to_memento(memento)
12
- memento.order_id, memento.amount, memento.ip = order_id, amount, ip
16
+ memento.order_id = order_id
17
+ memento.amount = amount
18
+ memento.gateway = gateway
13
19
  end
14
20
 
15
21
  def self.new_from_memento(memento)
16
- new(memento.order_id, memento.amount, memento.ip)
22
+ new(memento.order_id, memento.amount, memento.gateway)
17
23
  end
18
24
 
19
25
  def self.new_from_payment(donor)
@@ -34,17 +40,23 @@ module Paytureman
34
40
  current_payment_type.new_from_payment(self)
35
41
  end
36
42
 
37
- attr_accessor :payture
38
-
39
43
  protected
40
44
 
41
- attr_accessor :amount, :ip
45
+ attr_accessor :amount
42
46
  attr_writer :order_id
43
47
 
48
+ def amount_in_cents
49
+ (amount * 100).round
50
+ end
51
+
52
+ def configuration
53
+ @configuration ||= Configuration.instance
54
+ end
55
+
44
56
  def payture
45
- @payture ||= Api.instance
57
+ @payture ||= configuration.api_for(gateway)
46
58
  end
47
59
 
48
60
  end
49
61
 
50
- end
62
+ end
@@ -3,16 +3,16 @@ module Paytureman
3
3
  class PaymentBlocked < PaymentWithSession
4
4
 
5
5
  def unblock
6
- if payture.unblock(order_id, (self.amount*100).round)
7
- PaymentCancelled.new(order_id, amount, ip, session_id)
6
+ if payture.unblock(order_id, amount_in_cents)
7
+ PaymentCancelled.new(order_id, amount, session_id, gateway)
8
8
  else
9
9
  self
10
10
  end
11
11
  end
12
12
 
13
13
  def charge
14
- if payture.charge(order_id, session_id)
15
- PaymentCharged.new(order_id, amount, ip, session_id)
14
+ if payture.charge(order_id)
15
+ PaymentCharged.new(order_id, amount, session_id, gateway)
16
16
  else
17
17
  self
18
18
  end
@@ -2,12 +2,12 @@ module Paytureman
2
2
 
3
3
  class PaymentCharged < PaymentWithSession
4
4
  def refund
5
- if payture.refund(order_id, (self.amount*100).round)
6
- PaymentRefunded.new(order_id, amount, ip, session_id)
5
+ if payture.refund(order_id, amount_in_cents)
6
+ PaymentRefunded.new(order_id, amount, session_id, gateway)
7
7
  else
8
8
  self
9
9
  end
10
10
  end
11
11
  end
12
12
 
13
- end
13
+ end
@@ -10,15 +10,33 @@ module Paytureman
10
10
 
11
11
  class PaymentNew < Payment
12
12
 
13
+ def initialize(order_id, amount, ip, gateway = nil)
14
+ super(order_id, amount, gateway)
15
+ @ip = ip
16
+ end
17
+
18
+ def save_to_memento(memento)
19
+ super
20
+ memento.ip = ip
21
+ end
22
+
23
+ def self.new_from_memento(memento)
24
+ new(memento.order_id, memento.amount, memento.ip, memento.gateway)
25
+ end
26
+
13
27
  def prepare(description = PaymentDescription.new)
14
- session_id = payture.init(self.order_id, (self.amount*100).round, self.ip, description.to_h)
28
+ session_id = payture.init(order_id, amount_in_cents, ip, description.to_h)
15
29
  if session_id
16
- PaymentPrepared.new(self.order_id, self.amount, self.ip, session_id)
30
+ PaymentPrepared.new(order_id, amount, session_id, gateway)
17
31
  else
18
32
  self
19
33
  end
20
34
  end
21
35
 
36
+ protected
37
+
38
+ attr_reader :ip
39
+
22
40
  end
23
41
 
24
- end
42
+ end
@@ -3,13 +3,13 @@ module Paytureman
3
3
  class PaymentPrepared < PaymentWithSession
4
4
 
5
5
  def url
6
- "https://sandbox.payture.com/apim/Pay?SessionId=#{session_id}"
6
+ payture.pay_url(session_id)
7
7
  end
8
8
 
9
9
  def block
10
- PaymentBlocked.new(order_id, amount, ip, session_id)
10
+ PaymentBlocked.new(order_id, amount, session_id, gateway)
11
11
  end
12
12
 
13
13
  end
14
14
 
15
- end
15
+ end
@@ -2,9 +2,9 @@ module Paytureman
2
2
 
3
3
  class PaymentWithSession < Payment
4
4
 
5
- def initialize(order_id, amount, ip, session_id)
5
+ def initialize(order_id, amount, session_id, gateway = nil)
6
+ super(order_id, amount, gateway)
6
7
  @session_id = session_id
7
- super(order_id, amount, ip)
8
8
  end
9
9
 
10
10
  def save_to_memento(memento)
@@ -13,7 +13,7 @@ module Paytureman
13
13
  end
14
14
 
15
15
  def self.new_from_memento(memento)
16
- new(memento.order_id, memento.amount, memento.ip, memento.session_id)
16
+ new(memento.order_id, memento.amount, memento.session_id, memento.gateway)
17
17
  end
18
18
 
19
19
  protected
@@ -22,4 +22,4 @@ module Paytureman
22
22
 
23
23
  end
24
24
 
25
- end
25
+ end
data/lib/payture/api.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  module Paytureman
2
2
  class Api
3
- include Singleton
4
-
5
3
  attr_accessor :rest_client
6
4
 
5
+ def initialize(host, key, password)
6
+ @host = host
7
+ @key = key
8
+ @password = password
9
+ end
10
+
7
11
  def init(order_id, amount, ip, description = {})
8
12
 
9
13
  data = { SessionType: :Block, OrderId: order_id, Amount: amount, IP: ip }
@@ -17,18 +21,22 @@ module Paytureman
17
21
  response[:success] && response[:session_id]
18
22
  end
19
23
 
20
- def charge(order_id, session_id)
21
- response = make_request(:charge, order_id: order_id, password: '123')
24
+ def pay_url(session_id)
25
+ "#{url_for(:pay)}?SessionId=#{session_id}"
26
+ end
27
+
28
+ def charge(order_id)
29
+ response = make_request(:charge, order_id: order_id, password: @password)
22
30
  response[:success]
23
31
  end
24
32
 
25
33
  def refund(order_id, amount)
26
- response = make_request(:refund, order_id: order_id, amount: amount, password: '123')
34
+ response = make_request(:refund, order_id: order_id, amount: amount, password: @password)
27
35
  response[:success]
28
36
  end
29
37
 
30
38
  def unblock(order_id, amount)
31
- response = make_request(:unblock, order_id: order_id, amount: amount, password: '123')
39
+ response = make_request(:unblock, order_id: order_id, amount: amount, password: @password)
32
40
  response[:success]
33
41
  end
34
42
 
@@ -46,10 +54,10 @@ module Paytureman
46
54
 
47
55
  def make_request(method, params)
48
56
  params = Hash[
49
- params.merge(key: 'MerchantRutravel').
57
+ params.merge(key: @key).
50
58
  map { |k, v| [ k.to_s.camelize, v ] }
51
59
  ]
52
- response = rest_client.post "https://sandbox.payture.com/apim/#{method.to_s.camelize}", params
60
+ response = rest_client.post url_for(method), params
53
61
  puts response.body
54
62
  return nil if response.body.empty?
55
63
  doc = REXML::Document.new(response.body)
@@ -69,6 +77,10 @@ module Paytureman
69
77
  return result
70
78
  end
71
79
 
80
+ def url_for(method)
81
+ "https://#@host.payture.com/apim/#{method.to_s.camelize}"
82
+ end
83
+
72
84
  end
73
85
  end
74
86
 
data/lib/paytureman.rb CHANGED
@@ -17,4 +17,5 @@ require_relative 'payments/payment_refunded'
17
17
  require_relative 'payments/payment_cancelled'
18
18
  require_relative 'payments/payment_unknown'
19
19
 
20
- require_relative 'service/payment_persistence'
20
+ require_relative 'service/payment_persistence'
21
+ require_relative 'service/configuration'
@@ -0,0 +1,56 @@
1
+ module Paytureman
2
+ class Configuration
3
+ include Singleton
4
+
5
+ class << self
6
+ def setup(namespace = nil)
7
+ settings = Settings.new
8
+ yield settings
9
+ instance.add_settings(namespace, settings)
10
+ end
11
+ end
12
+
13
+ attr_accessor :configurations
14
+
15
+ def initialize
16
+ @configurations = {}
17
+ add_settings(nil, Settings.new)
18
+ end
19
+
20
+ def add_settings(namespace, settings)
21
+ configurations[gateway_name(namespace)] = settings
22
+ end
23
+
24
+ def settings(namespace)
25
+ configurations[gateway_name(namespace)]
26
+ end
27
+
28
+ def api_for(namespace)
29
+ config = settings(namespace) or raise GatewayNotFoundException.new(namespace)
30
+ Paytureman::Api.new(config.host, config.key, config.password)
31
+ end
32
+
33
+ private
34
+
35
+ def gateway_name(key)
36
+ key.to_s.to_sym
37
+ end
38
+ end
39
+
40
+ class Settings
41
+ attr_accessor :host, :key, :password
42
+
43
+ def initialize
44
+ @host = 'sandbox'
45
+ @key = 'MerchantRutravel'
46
+ @password = '123'
47
+ end
48
+ end
49
+
50
+ class GatewayNotFoundException < Exception
51
+ def initialize(name)
52
+ super("Gateway #{name} has not been defined in the configuration")
53
+ end
54
+ end
55
+
56
+ end
data/paytureman.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "paytureman"
7
- spec.version = "0.5.0"
7
+ spec.version = "0.7.0"
8
8
  spec.authors = ["Ivan Kasatenko", "Nickolay Sverchkov", "Alexander Fomin"]
9
9
  spec.email = ["contact@uniqsystems.ru"]
10
10
  spec.summary = %q{Payture API implementation}
@@ -8,16 +8,14 @@ describe "Payment" do
8
8
  let(:session_id) { SecureRandom.uuid }
9
9
 
10
10
  let(:payture_mock) {
11
- double("Payture").tap do |mock|
12
- expect(mock).to receive(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
13
- end
11
+ Api.any_instance
14
12
  }
15
13
 
16
14
  it "should charge successfully" do
17
- expect(payture_mock).to receive(:charge).with(order_id, session_id).and_return(true)
15
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
16
+ payture_mock.stub(:charge).with(order_id).and_return(true)
18
17
 
19
18
  payment = PaymentNew.new(order_id, amount, ip)
20
- payment.payture = payture_mock
21
19
 
22
20
  payment = payment.prepare
23
21
 
@@ -26,16 +24,16 @@ describe "Payment" do
26
24
  payment = payment.block
27
25
  expect(payment).to be_kind_of(PaymentBlocked)
28
26
 
29
- payment.payture = payture_mock
27
+
30
28
  payment = payment.charge
31
29
  expect(payment).to be_kind_of(PaymentCharged)
32
30
  end
33
31
 
34
32
  it "should unblock successfully" do
35
- expect(payture_mock).to receive(:unblock).with(order_id, amount*100).and_return(true)
33
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
34
+ payture_mock.stub(:unblock).with(order_id, amount*100).and_return(true)
36
35
 
37
36
  payment = PaymentNew.new(order_id, amount, ip)
38
- payment.payture = payture_mock
39
37
 
40
38
  payment = payment.prepare
41
39
  expect(payment).to be_kind_of(PaymentPrepared)
@@ -43,17 +41,16 @@ describe "Payment" do
43
41
  payment = payment.block
44
42
  expect(payment).to be_kind_of(PaymentBlocked)
45
43
 
46
- payment.payture = payture_mock
47
44
  payment = payment.unblock
48
45
  expect(payment).to be_kind_of(PaymentCancelled)
49
46
  end
50
47
 
51
48
  it "should refund successfully" do
52
- expect(payture_mock).to receive(:charge).with(order_id, session_id).and_return(true)
53
- expect(payture_mock).to receive(:refund).with(order_id, amount*100).and_return(true)
49
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
50
+ payture_mock.stub(:charge).with(order_id).and_return(true)
51
+ payture_mock.stub(:refund).with(order_id, amount*100).and_return(true)
54
52
 
55
53
  payment = PaymentNew.new(order_id, amount, ip)
56
- payment.payture = payture_mock
57
54
 
58
55
  payment = payment.prepare
59
56
  expect(payment).to be_kind_of(PaymentPrepared)
@@ -61,11 +58,9 @@ describe "Payment" do
61
58
  payment = payment.block
62
59
  expect(payment).to be_kind_of(PaymentBlocked)
63
60
 
64
- payment.payture = payture_mock
65
61
  payment = payment.charge
66
62
  expect(payment).to be_kind_of(PaymentCharged)
67
63
 
68
- payment.payture = payture_mock
69
64
  payment = payment.refund
70
65
  expect(payment).to be_kind_of(PaymentRefunded)
71
66
  end
@@ -99,22 +94,92 @@ describe "Payment" do
99
94
  ).and_return(empty_response)
100
95
 
101
96
  payment = PaymentNew.new(order_id, amount, ip)
97
+
102
98
  payment.prepare(PaymentDescription.new(nil, nil, nil, nil))
103
99
  end
104
100
 
101
+ let(:real_configuration) {
102
+ double('configuration').tap do |config|
103
+ allow(config).to receive(:api_for).with(:real).and_return(Api.new('secure', 'MERCHANT100100', 'password'))
104
+ end
105
+ }
106
+
105
107
  it "should send valid params" do
106
108
  expect(RestClient).to receive(:post).with(
107
- "https://sandbox.payture.com/apim/Charge",
108
- {
109
- "OrderId" => order_id,
110
- "Password" => "123",
111
- "Key" => "MerchantRutravel"
112
- }
109
+ "https://secure.payture.com/apim/Charge",
110
+ {
111
+ "OrderId" => order_id,
112
+ "Password" => "password",
113
+ "Key" => "MERCHANT100100"
114
+ }
113
115
  ).and_return(empty_response)
114
116
 
115
- payment = PaymentBlocked.new(order_id, amount, ip, 'session')
117
+ payment = PaymentBlocked.new(order_id, amount, 'session', :real)
118
+ payment.configuration = real_configuration
116
119
 
117
120
  payment.charge
118
121
  end
119
122
 
123
+ describe 'using same gateway when status changing' do
124
+ before do
125
+ Configuration.setup :settings do |config|
126
+ config.host = 'host'
127
+ config.key = 'key'
128
+ config.password = 'password'
129
+ end
130
+ end
131
+
132
+ it 'when charged' do
133
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
134
+ payture_mock.stub(:charge).with(order_id).and_return(true)
135
+
136
+ payment = PaymentNew.new(order_id, amount, ip, :settings)
137
+
138
+ payment = payment.prepare
139
+ expect(payment.gateway).to eq :settings
140
+
141
+ payment = payment.block
142
+ expect(payment.gateway).to eq :settings
143
+
144
+ payment = payment.charge
145
+ expect(payment.gateway).to eq :settings
146
+ end
147
+
148
+ it "when unblocked" do
149
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
150
+ payture_mock.stub(:unblock).with(order_id, amount*100).and_return(true)
151
+
152
+ payment = PaymentNew.new(order_id, amount, ip, :settings)
153
+
154
+ payment = payment.prepare
155
+ expect(payment.gateway).to eq :settings
156
+
157
+ payment = payment.block
158
+ expect(payment.gateway).to eq :settings
159
+
160
+ payment = payment.unblock
161
+ expect(payment.gateway).to eq :settings
162
+ end
163
+
164
+ it "when refunded" do
165
+ payture_mock.stub(:init).with(order_id, amount*100, ip, {}).and_return(session_id)
166
+ payture_mock.stub(:charge).with(order_id).and_return(true)
167
+ payture_mock.stub(:refund).with(order_id, amount*100).and_return(true)
168
+
169
+ payment = PaymentNew.new(order_id, amount, ip, :settings)
170
+
171
+ payment = payment.prepare
172
+ expect(payment.gateway).to eq :settings
173
+
174
+ payment = payment.block
175
+ expect(payment.gateway).to eq :settings
176
+
177
+ payment = payment.charge
178
+ expect(payment.gateway).to eq :settings
179
+
180
+ payment = payment.refund
181
+ expect(payment.gateway).to eq :settings
182
+ end
183
+ end
184
+
120
185
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Api do
4
+
5
+ let(:empty_response) { double('Request', body: '<xml />') }
6
+ let(:host) { 'secure' }
7
+ let(:key) { 'merchant' }
8
+ let(:password) { 'password' }
9
+
10
+ describe 'send request with defined host and key' do
11
+ subject { Api.new(host, key, password) }
12
+
13
+ it 'should send request with settings' do
14
+ expect(RestClient).to receive(:post).with(
15
+ "https://#{host}.payture.com/apim/Charge",
16
+ {
17
+ "OrderId" => 1,
18
+ "Password" => password,
19
+ "Key" => key
20
+ }
21
+ ).and_return(empty_response)
22
+
23
+ subject.charge(1)
24
+ end
25
+ end
26
+
27
+
28
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Configuration do
4
+ context 'with default configuration' do
5
+ describe 'settings' do
6
+ subject { Configuration.instance.settings(nil) }
7
+
8
+ its(:host) { should eq 'sandbox' }
9
+ its(:key) { should eq 'MerchantRutravel' }
10
+ its(:password) { should eq '123' }
11
+
12
+ it 'should build api' do
13
+ allow(Api.any_instance).to receive(:new).with('sandbox', 'MerchantRutravel', '123')
14
+ Configuration.instance.api_for(nil)
15
+ end
16
+ end
17
+ end
18
+
19
+ context 'set up' do
20
+ context 'host' do
21
+ before do
22
+ Configuration.setup :settings do |config|
23
+ config.host = 'host'
24
+ config.key = 'key'
25
+ config.password = 'password'
26
+ end
27
+ end
28
+
29
+ subject { Configuration.instance.settings(:settings) }
30
+
31
+ its(:host) { should eq 'host' }
32
+ its(:key) { should eq 'key' }
33
+ its(:password) { should eq 'password' }
34
+
35
+
36
+ it 'should build api' do
37
+ allow(Api.any_instance).to receive(:new).with('host', 'key', 'password')
38
+ Configuration.instance.api_for(nil)
39
+ end
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paytureman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kasatenko
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-04-28 00:00:00.000000000 Z
13
+ date: 2014-05-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rest_client
@@ -134,9 +134,12 @@ files:
134
134
  - lib/payments/payment_with_session.rb
135
135
  - lib/payture/api.rb
136
136
  - lib/paytureman.rb
137
+ - lib/service/configuration.rb
137
138
  - lib/service/payment_persistence.rb
138
139
  - paytureman.gemspec
139
140
  - spec/requests/payment_process_spec.rb
141
+ - spec/requests/payture/api_spec.rb
142
+ - spec/requests/service/configuration_spec.rb
140
143
  - spec/spec_helper.rb
141
144
  homepage: ''
142
145
  licenses:
@@ -164,4 +167,6 @@ specification_version: 4
164
167
  summary: Payture API implementation
165
168
  test_files:
166
169
  - spec/requests/payment_process_spec.rb
170
+ - spec/requests/payture/api_spec.rb
171
+ - spec/requests/service/configuration_spec.rb
167
172
  - spec/spec_helper.rb