mpesarb 0.3.1 → 0.3.4

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
  SHA256:
3
- metadata.gz: 68d96fb20a2f0f9d3f463f6bb4b0d6d1e520c20d1c11f2d2a938aaf451d4ef4e
4
- data.tar.gz: 92017a2a811f1f6de9f233c083be65b892ebb591bbc2c392dd31aeedac9a4212
3
+ metadata.gz: 468884d21cb1bf62fff53e71c500cda1e315b84dfb84b6db029fb5cefffad542
4
+ data.tar.gz: b83e2ffadf87e97def39ab7bdc0d9ff31c5279ba98b33a42afce0592abf03e29
5
5
  SHA512:
6
- metadata.gz: 3c23bd5e3eb258bf86062cfbdc5bde0745617c5d6cb8f59da3927333331ab231e1c6c8d6c1296d5b342594b7cc7acb73d4f1c8c6ddc218de39389a79f58e37e6
7
- data.tar.gz: ded8afec648b6cd69b45d4d0b4f958c27c43dbe7b2113e939c4c4f83aaeb807dc5e8e7c2091ed609709b32673f8f47c47c28b9e80b1c166049c91ebf0f9cd56e
6
+ metadata.gz: 8ce05d2a42c251d92c6a85e6a1f03a698d7a6f7b83b834709ca56a4f983c2363101cf2712ad466197a74ae23bca4c34d59eda297d47174c3fa7b1bc9bd9ab4ac
7
+ data.tar.gz: e10df0ee91669afb21e04f2f0762dfb4eca1c86587d105cc65af33ba1631a09257571ab1b7e2add8e97e6c7ee426dccdc362de7a57a9f4248985964e0cae7807
@@ -9,10 +9,10 @@ jobs:
9
9
 
10
10
  steps:
11
11
  - uses: actions/checkout@v1
12
- - name: Set up Ruby 2.6
12
+ - name: Set up Ruby 2.7
13
13
  uses: actions/setup-ruby@v1
14
14
  with:
15
- ruby-version: 2.6.x
15
+ ruby-version: 2.7.x
16
16
  - name: Build and test with Rake
17
17
  run: |
18
18
  gem install bundler
data/.gitpod.yml ADDED
@@ -0,0 +1,8 @@
1
+ # This configuration file was automatically generated by Gitpod.
2
+ # Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
3
+ # and commit this file to your remote git repository to share the goodness with others.
4
+
5
+ tasks:
6
+ - init: bin/setup
7
+
8
+
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
- ### Unreleased
1
+ ### 2022-05-31
2
+ - Faraday 2.0.1 or greater
3
+ ### 2022-01-04
4
+ - Support `response` `to_hash` method
5
+ ### 2020-01-20
2
6
  - Update gemspec
3
7
  - Read certificate full path
4
8
  - Return early if get access token fail
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in mpesa.gemspec
4
6
  gemspec
data/Gemfile.lock CHANGED
@@ -1,28 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mpesarb (0.3.0)
4
+ mpesarb (0.3.4)
5
5
  activesupport (>= 5.0.0)
6
- faraday (>= 1.1)
7
- faraday_middleware (~> 1.1)
6
+ faraday (>= 2.0.1)
8
7
  openssl (>= 2.1)
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
12
11
  specs:
13
- activesupport (6.1.4)
12
+ activesupport (7.0.3)
14
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
14
  i18n (>= 1.6, < 2)
16
15
  minitest (>= 5.1)
17
16
  tzinfo (~> 2.0)
18
- zeitwerk (~> 2.3)
19
17
  addressable (2.8.0)
20
18
  public_suffix (>= 2.0.2, < 5.0)
21
19
  ansi (1.5.0)
22
20
  builder (3.2.4)
23
21
  byebug (11.1.3)
24
22
  coderay (1.1.3)
25
- concurrent-ruby (1.1.9)
23
+ concurrent-ruby (1.1.10)
26
24
  coveralls (0.8.23)
27
25
  json (>= 1.8, < 3)
28
26
  simplecov (~> 0.16.1)
@@ -32,47 +30,29 @@ GEM
32
30
  crack (0.4.5)
33
31
  rexml
34
32
  docile (1.4.0)
35
- faraday (1.7.1)
36
- faraday-em_http (~> 1.0)
37
- faraday-em_synchrony (~> 1.0)
38
- faraday-excon (~> 1.1)
39
- faraday-httpclient (~> 1.0.1)
40
- faraday-net_http (~> 1.0)
41
- faraday-net_http_persistent (~> 1.1)
42
- faraday-patron (~> 1.0)
43
- faraday-rack (~> 1.0)
44
- multipart-post (>= 1.2, < 3)
33
+ faraday (2.3.0)
34
+ faraday-net_http (~> 2.0)
45
35
  ruby2_keywords (>= 0.0.4)
46
- faraday-em_http (1.0.0)
47
- faraday-em_synchrony (1.0.0)
48
- faraday-excon (1.1.0)
49
- faraday-httpclient (1.0.1)
50
- faraday-net_http (1.0.1)
51
- faraday-net_http_persistent (1.2.0)
52
- faraday-patron (1.0.0)
53
- faraday-rack (1.0.0)
54
- faraday_middleware (1.1.0)
55
- faraday (~> 1.0)
36
+ faraday-net_http (2.0.3)
56
37
  hashdiff (1.0.1)
57
- i18n (1.8.10)
38
+ i18n (1.10.0)
58
39
  concurrent-ruby (~> 1.0)
59
- json (2.5.1)
40
+ json (2.6.2)
60
41
  method_source (1.0.0)
61
- minitest (5.14.4)
62
- minitest-reporters (1.4.3)
42
+ minitest (5.15.0)
43
+ minitest-reporters (1.5.0)
63
44
  ansi
64
45
  builder
65
46
  minitest (>= 5.0)
66
47
  ruby-progressbar
67
- multipart-post (2.1.1)
68
- openssl (2.2.0)
48
+ openssl (3.0.0)
69
49
  pry (0.13.1)
70
50
  coderay (~> 1.1)
71
51
  method_source (~> 1.0)
72
52
  pry-byebug (3.9.0)
73
53
  byebug (~> 11.0)
74
54
  pry (~> 0.13.0)
75
- public_suffix (4.0.6)
55
+ public_suffix (4.0.7)
76
56
  rake (13.0.6)
77
57
  rexml (3.2.5)
78
58
  ruby-progressbar (1.11.0)
@@ -85,20 +65,20 @@ GEM
85
65
  sync (0.5.0)
86
66
  term-ansicolor (1.7.1)
87
67
  tins (~> 1.0)
88
- thor (1.1.0)
89
- tins (1.29.1)
68
+ thor (1.2.1)
69
+ tins (1.31.1)
90
70
  sync
91
71
  tzinfo (2.0.4)
92
72
  concurrent-ruby (~> 1.0)
93
- vcr (6.0.0)
73
+ vcr (6.1.0)
94
74
  webmock (3.14.0)
95
75
  addressable (>= 2.8.0)
96
76
  crack (>= 0.3.2)
97
77
  hashdiff (>= 0.4.0, < 2.0.0)
98
- zeitwerk (2.4.2)
99
78
 
100
79
  PLATFORMS
101
80
  x86_64-darwin-19
81
+ x86_64-darwin-20
102
82
 
103
83
  DEPENDENCIES
104
84
  bundler (>= 2.1.4)
@@ -113,4 +93,4 @@ DEPENDENCIES
113
93
  webmock (~> 3.7)
114
94
 
115
95
  BUNDLED WITH
116
- 2.2.17
96
+ 2.2.27
data/README.md CHANGED
@@ -12,7 +12,7 @@ This Gem provides an interface that developers can use to convert JSON to `OpenS
12
12
 
13
13
  Install via `Gemfile`
14
14
  ```
15
- gem 'mpesarb', '~> 0.3.0'
15
+ gem 'mpesarb', '~> 0.3.2'
16
16
  ```
17
17
 
18
18
  Or
@@ -42,6 +42,7 @@ Optional
42
42
  - `adapter` - Faraday HTTP adapter. Default `:net_http`
43
43
  - `shortcode` - Mpesa shortcode
44
44
  - `pass_key` - LPNMO pass Key( used by STK API)
45
+ - `raise_errors` - `Boolean` raise errors if response status code is not 200. Default: `true`
45
46
 
46
47
 
47
48
  ### Register Urls
@@ -100,6 +101,44 @@ respose.ResponseDescription # "Accept the service request successfully."
100
101
 
101
102
  ```
102
103
 
104
+ ### Transaction Status
105
+ Check Transation Status
106
+
107
+ ```rb
108
+ response = client.status(
109
+ shortcode: '600426',
110
+ transaction_id: 'OEI2AK4Q16',
111
+ identifier_type: 1,
112
+ initiator_username: 'testapi',
113
+ initiator_password: 'Safaricom426!',
114
+ timeout_url: 'https://example.com/result',
115
+ result_url: 'https://example.com/result'
116
+ )
117
+
118
+ response.ConversationID
119
+ response.ResponseCode
120
+ ```
121
+
122
+ ### Reversal
123
+ Initiate a reversal
124
+
125
+ ```
126
+ response = client.reversal(
127
+ initiator_password: 'Safaricom426!',
128
+ initiator_username: 'testapi',
129
+ transaction_id: 'OEI2AK4Q16',
130
+ amount: '100',
131
+ receiver: '600610',
132
+ receiver_type: '4',
133
+ timeout_url: 'https://example.com/result',
134
+ result_url: 'https://example.com/result'
135
+ )
136
+
137
+ response.ConversationID
138
+ response.ResponseCode
139
+
140
+ ```
141
+
103
142
 
104
143
  ## Development
105
144
 
data/Rakefile CHANGED
@@ -1,10 +1,12 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
3
5
 
4
6
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
8
10
  end
9
11
 
10
- task :default => :test
12
+ task default: :test
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'mpesa'
@@ -10,7 +11,13 @@ require 'mpesa'
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- client = Mpesa::Client.new(key: 'ZtkRW6ATbVtFpNml5w5SfG26Adfyagn9', secret: 'dosFI1yQ8bvHEVFw', env: 'sandbox')
14
+ client = Mpesa::Client.new(
15
+ key: 'ZtkRW6ATbVtFpNml5w5SfG26Adfyagn9',
16
+ secret: 'dosFI1yQ8bvHEVFw',
17
+ env: 'sandbox',
18
+ shortcode: '174379',
19
+ pass_key: 'bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919'
20
+ )
14
21
 
15
22
  require 'irb'
16
23
  IRB.start(__FILE__)
data/lib/mpesa/client.rb CHANGED
@@ -1,17 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
- require 'faraday_middleware'
3
4
 
4
5
  module Mpesa
5
6
  class Client
6
- attr_reader :key, :secret, :env, :adapter, :shortcode, :pass_key
7
+ attr_reader :key, :secret, :env, :adapter, :shortcode, :pass_key, :raise_errors
7
8
 
8
- def initialize(key:, secret:, shortcode: nil, pass_key: nil, env: 'production', adapter: Faraday.default_adapter)
9
+ def initialize(key:, secret:, shortcode: nil, pass_key: nil, env: 'production', adapter: Faraday.default_adapter, raise_errors: true)
9
10
  @key = key
10
11
  @secret = secret
11
12
  @env = env
12
13
  @adapter = adapter
13
14
  @pass_key = pass_key
14
15
  @shortcode = shortcode
16
+ @raise_errors = raise_errors
15
17
  end
16
18
 
17
19
  def auth
@@ -30,14 +32,26 @@ module Mpesa
30
32
  Payout.new(self, args).call
31
33
  end
32
34
 
35
+ def status(**args)
36
+ Status.new(self, args).call
37
+ end
38
+
39
+ def balance(**args)
40
+ Balance.new(self, args).call
41
+ end
42
+
43
+ def reversal(**args)
44
+ Reversal.new(self, args).call
45
+ end
46
+
33
47
  def connection(basic_auth: false)
34
48
  @connection ||= Faraday.new do |conn|
35
49
  conn.url_prefix = "https://#{subdomain}.safaricom.co.ke"
36
50
  conn.request :json
37
51
  conn.response :json, content_type: 'application/json'
38
52
  conn.adapter adapter
39
- conn.request :basic_auth, key, secret if basic_auth
40
- conn.request :authorization, :Bearer, auth.access_token unless basic_auth
53
+ conn.request :authorization, :basic, key, secret if basic_auth
54
+ conn.request :authorization, 'Bearer', auth.access_token unless basic_auth
41
55
  end
42
56
  end
43
57
 
data/lib/mpesa/error.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Error < StandardError; end
3
5
  end
data/lib/mpesa/object.rb CHANGED
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ostruct'
2
4
 
3
5
  module Mpesa
4
6
  class Object
7
+ attr_reader :attributes
8
+
5
9
  def initialize(attributes)
6
10
  @attributes = OpenStruct.new(attributes)
7
11
  end
@@ -14,5 +18,9 @@ module Mpesa
14
18
  def respond_to_missing?(_method, _include_private = false)
15
19
  true
16
20
  end
21
+
22
+ def to_hash
23
+ attributes.to_h
24
+ end
17
25
  end
18
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Intance < Object
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Resource
3
5
  attr_reader :client, :args
@@ -16,6 +18,8 @@ module Mpesa
16
18
  end
17
19
 
18
20
  def handle_response(response)
21
+ return response unless client.raise_errors
22
+
19
23
  case response.status
20
24
  when 400
21
25
  raise Error, "Your request was malformed. #{response.body['errorMessage']}"
@@ -30,5 +34,12 @@ module Mpesa
30
34
  end
31
35
  response
32
36
  end
37
+
38
+ def format_phone(phone)
39
+ phone = phone.to_s
40
+ return phone if phone.match?(/\A254/)
41
+
42
+ phone.sub(/\A[+0]?(254)?(\d+)/, '254\2')
43
+ end
33
44
  end
34
45
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Status < Resource
3
5
  PATH = 'mpesa/transactionstatus/v1/query'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Payout < Resource
3
- PATH = 'mpesa/b2c/v1/paymentrequest'.freeze
5
+ PATH = 'mpesa/b2c/v1/paymentrequest'
4
6
 
5
7
  def call
6
8
  Object.new post_request(url: PATH, body: body).body
@@ -13,7 +15,7 @@ module Mpesa
13
15
  'CommandID': args[:command_id],
14
16
  'Amount': args[:amount],
15
17
  'PartyA': client.shortcode || args[:shortcode],
16
- 'PartyB': args[:phone],
18
+ 'PartyB': format_phone(args[:phone]),
17
19
  'Remarks': args[:remarks],
18
20
  'QueueTimeOutURL': args[:timeout_url],
19
21
  'ResultURL': args[:result_url],
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Register < Resource
3
- PATH = 'mpesa/c2b/v1/registerurl'.freeze
5
+ PATH = 'mpesa/c2b/v1/registerurl'
4
6
 
5
7
  def call
6
8
  Object.new post_request(url: PATH, body: body).body
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mpesa
4
+ class Reversal < Resource
5
+ PATH = 'mpesa/reversal/v1/request'
6
+
7
+ def call
8
+ Object.new post_request(url: PATH, body: body).body
9
+ end
10
+
11
+ def body
12
+ {
13
+ "Initiator": args[:initiator_username],
14
+ "SecurityCredential": credentials,
15
+ "CommandID": 'TransactionReversal',
16
+ "TransactionID": args[:transaction_id],
17
+ "Amount": args[:amount],
18
+ "ReceiverParty": args[:receiver],
19
+ "RecieverIdentifierType": args[:receiver_type],
20
+ "Remarks": args[:remarks] || 'check status',
21
+ "QueueTimeOutURL": args[:timeout_url],
22
+ "ResultURL": args[:result_url],
23
+ "Occasion": args[:occasion] || 'check status'
24
+ }
25
+ end
26
+
27
+ def credentials
28
+ SecurityCred.new(args[:initiator_password], client.env).password_credential
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Status < Resource
3
5
  PATH = 'mpesa/transactionstatus/v1/query'
@@ -7,8 +9,21 @@ module Mpesa
7
9
 
8
10
  def body
9
11
  {
10
-
12
+ "CommandID": 'TransactionStatusQuery',
13
+ "PartyA": args[:shortcode] || client.shortcode,
14
+ "IdentifierType": args[:identifier_type],
15
+ "Remarks": args[:remarks] || 'check status',
16
+ "Initiator": args[:initiator_username],
17
+ "SecurityCredential": credentials,
18
+ "QueueTimeOutURL": args[:timeout_url],
19
+ "ResultURL": args[:result_url],
20
+ "TransactionID": args[:transaction_id],
21
+ "Occasion": args[:occasion] || 'check status'
11
22
  }
12
23
  end
24
+
25
+ def credentials
26
+ SecurityCred.new(args[:initiator_password], client.env).password_credential
27
+ end
13
28
  end
14
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module Mpesa
@@ -10,14 +12,14 @@ module Mpesa
10
12
 
11
13
  def body
12
14
  {
13
- 'BusinessShortCode': args[:shortcode] || client.shortcode,
15
+ 'BusinessShortCode': shortcode,
14
16
  'Password': password,
15
- 'Timestamp': timestamp.to_s,
17
+ 'Timestamp': timestamp,
16
18
  'TransactionType': 'CustomerPayBillOnline',
17
19
  'Amount': args[:amount],
18
- 'PartyA': args[:phone],
19
- 'PartyB': args[:shortcode] || client.shortcode,
20
- 'PhoneNumber': args[:phone],
20
+ 'PartyA': format_phone(args[:phone]),
21
+ 'PartyB': shortcode,
22
+ 'PhoneNumber': format_phone(args[:phone]),
21
23
  'CallBackURL': args[:callback_url],
22
24
  'AccountReference': args[:reference],
23
25
  'TransactionDesc': args[:trans_desc]
@@ -25,11 +27,15 @@ module Mpesa
25
27
  end
26
28
 
27
29
  def password
28
- Base64.strict_encode64("#{args[:shortcode]}#{client.pass_key || args[:pass_key]}#{timestamp}")
30
+ Base64.strict_encode64("#{shortcode}#{args[:pass_key] || client.pass_key}#{timestamp}")
29
31
  end
30
32
 
31
33
  def timestamp
32
- Time.now.strftime('%Y%m%d%H%M%S').to_i
34
+ Time.now.strftime('%Y%m%d%H%M%S')
35
+ end
36
+
37
+ def shortcode
38
+ args[:shortcode] || client.shortcode
33
39
  end
34
40
  end
35
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/cache'
2
4
  require 'active_support/cache/memory_store'
3
5
  require 'active_support/notifications'
data/lib/mpesa/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
- VERSION = '0.3.1'
4
+ VERSION = '0.3.4'
3
5
  end
data/lib/mpesa.rb CHANGED
@@ -16,6 +16,7 @@ module Mpesa
16
16
  autoload :Payout, 'mpesa/resources/payout'
17
17
  autoload :Status, 'mpesa/resources/status'
18
18
  autoload :Balance, 'mpesa/resources/balance'
19
+ autoload :Reversal, 'mpesa/resources/reversal'
19
20
 
20
21
  autoload :Instance, 'mpesa/objects/instace'
21
22
  end
data/mpesa.gemspec CHANGED
@@ -31,8 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'rake', '>= 12.3'
32
32
  # dependancies
33
33
  spec.add_runtime_dependency 'activesupport', '>= 5.0.0'
34
- spec.add_runtime_dependency 'faraday', '>= 1.1'
35
- spec.add_runtime_dependency 'faraday_middleware', '~> 1.1'
34
+ spec.add_runtime_dependency 'faraday', '>= 2.0.1'
36
35
  spec.add_runtime_dependency 'openssl', '>= 2.1'
37
36
  # request
38
37
  spec.add_development_dependency 'minitest'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mpesarb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moses Gathuku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-15 00:00:00.000000000 Z
11
+ date: 2022-06-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,28 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1.1'
61
+ version: 2.0.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: faraday_middleware
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.1'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.1'
68
+ version: 2.0.1
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: openssl
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -201,6 +187,7 @@ extra_rdoc_files: []
201
187
  files:
202
188
  - ".github/workflows/mpesa.yml"
203
189
  - ".gitignore"
190
+ - ".gitpod.yml"
204
191
  - ".travis.yml"
205
192
  - CHANGELOG.md
206
193
  - CODE_OF_CONDUCT.md
@@ -224,6 +211,7 @@ files:
224
211
  - lib/mpesa/resources/balance.rb
225
212
  - lib/mpesa/resources/payout.rb
226
213
  - lib/mpesa/resources/register.rb
214
+ - lib/mpesa/resources/reversal.rb
227
215
  - lib/mpesa/resources/status.rb
228
216
  - lib/mpesa/resources/stk.rb
229
217
  - lib/mpesa/resources/token.rb
@@ -252,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
252
240
  - !ruby/object:Gem::Version
253
241
  version: '0'
254
242
  requirements: []
255
- rubygems_version: 3.2.15
243
+ rubygems_version: 3.3.7
256
244
  signing_key:
257
245
  specification_version: 4
258
246
  summary: a simple gem to integrate ruby with mpesa Apis