t2_airtime 0.2.1 → 0.2.2

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: 380883694d9e2012b6a23f88879f44a05005efad
4
- data.tar.gz: 3ed077121a1271feb7f0966d3d519315277c072d
3
+ metadata.gz: 38e4e557218b14ad7121726d230ab461c023086c
4
+ data.tar.gz: a28342602169af97f687efe81c7a21c69b55ff5e
5
5
  SHA512:
6
- metadata.gz: ebb27cede9bea986e496a2e0dcd05a3f46fff44bf33b3e020e20f723a44c6d53c9fe7c7038d9c1974ba6ffe3936b5079897a6a42447e9f1948d080152b1ded2b
7
- data.tar.gz: a08ded72071d2d07c2dd85960051602ba70fb67f5c480b43b9e9372ffe27343778a6f3cea7249d341251071accbd2018aa3afc745c4e5daf533d1754a4afd7ac
6
+ metadata.gz: 89da1d5f2631d4b9444516ca44ea0d5a9dbd9b3055fbacf3b5d0a3a11c5a5850ae052a95489d6f0948d34020f1ce84d40425113d499b73fdbc60cd965d38b635
7
+ data.tar.gz: c847a4b2391449383ef123fb6aa367fd3b7df770ade4842244c6269d038de7478245fe05c83c28a0518293bf2afaaaf4861f4211b363d15a316e2811fdb29906
@@ -1,81 +1,96 @@
1
1
  module T2Airtime
2
2
  class AirtimeController < ActionController::API
3
3
 
4
+ def account
5
+ reply = T2Airtime::API.api.account_info
6
+ if reply.success?
7
+ render_data T2Airtime::Account.serialize reply.data,
8
+ reply.headers[:date]
9
+ else
10
+ render_error T2Airtime::Error.new reply.error_code,
11
+ reply.error_message
12
+ end
13
+ end
14
+
15
+
4
16
  def countries
5
17
  reply = T2Airtime::API.api.country_list
6
18
  if reply.success?
7
- data = T2Airtime::Country.serialize(reply.data)
8
- render json: {
9
- links: {
10
- self: request.path
11
- },
12
- data: data,
13
- status: :ok
14
- }
19
+ render_data T2Airtime::Country.serialize reply.data,
20
+ reply.headers[:date]
15
21
  else
16
- render_error(T2Airtime::Error.new(reply.error_code, reply.error_message))
22
+ render_error T2Airtime::Error.new reply.error_code,
23
+ reply.error_message
17
24
  end
18
25
  end
19
26
 
20
27
  def operators
21
- reply = T2Airtime::API.api.operator_list(params[:country_aid])
28
+ reply = T2Airtime::API.api.operator_list(params[:id])
22
29
  if reply.success?
23
- data = T2Airtime::Operator.serialize(reply.data)
24
- render json: {
25
- operators: data,
26
- status: :ok
27
- }
30
+ render_data T2Airtime::Operator.serialize reply.data,
31
+ reply.headers[:date]
28
32
  else
29
- render_error(T2Airtime::Error.new(reply.error_code, reply.error_message))
33
+ render_error T2Airtime::Error.new reply.error_code,
34
+ reply.error_message
30
35
  end
31
36
  end
32
37
 
33
38
  def products
34
- reply = T2Airtime::API.api.product_list(params[:operator_aid])
39
+ reply = T2Airtime::API.api.product_list(params[:id])
35
40
  if reply.success?
36
- data = T2Airtime::Product.serialize(reply.data)
37
- render json: {
38
- products: data,
39
- status: :ok
40
- }
41
+ render_data T2Airtime::Product.serialize reply.data,
42
+ reply.headers[:date]
41
43
  else
42
- render_error(T2Airtime::Error.new(reply.error_code, reply.error_message))
44
+ render_error T2Airtime::Error.new reply.error_code,
45
+ reply.error_message
43
46
  end
44
47
  end
45
48
 
46
49
  def transactions
47
- reply = T2Airtime::API.api.trans_list(params[:start], params[:stop], params[:msisdn], params[:destination], params[:code])
50
+ reply = T2Airtime::API.api.transaction_list parse_time_param(params[:start]),
51
+ parse_time_param(params[:stop]),
52
+ params[:msisdn],
53
+ params[:destination],
54
+ params[:code]
48
55
  if reply.success?
49
- data = T2Airtime::Transaction.serialize(reply.data)
50
- render json: {
51
- transactions: data,
52
- status: :ok
53
- }
56
+ render_data T2Airtime::Transaction.serialize reply.data
54
57
  else
55
- render_error(T2Airtime::Error.new(reply.error_code, reply.error_message))
58
+ render_error T2Airtime::Error.new reply.error_code,
59
+ reply.error_message
56
60
  end
57
61
  end
58
62
 
59
63
  def transaction
60
- reply = T2Airtime::API.api.trans_info(params[:id])
64
+ reply = T2Airtime::API.api.transaction_info(params[:id])
61
65
  if reply.success?
62
- data = T2Airtime::Transaction.serialize_one(reply.data)
63
- render json: {
64
- transaction: data,
65
- status: :ok
66
- }
66
+ render_data T2Airtime::Transaction.serialize_one reply.data,
67
+ reply.headers[:date]
67
68
  else
68
- render_error(T2Airtime::Error.new(reply.error_code, reply.error_message))
69
+ render_error T2Airtime::Error.new reply.error_code,
70
+ reply.error_message
69
71
  end
70
72
  end
71
73
 
72
74
  protected
73
75
 
76
+ def parse_time_param(timestr)
77
+ Time.zone.parse(timestr)
78
+ end
79
+
80
+
81
+ def render_data(data)
82
+ render json: {
83
+ data: data,
84
+ status: :ok
85
+ }
86
+ end
87
+
74
88
  def render_error(error)
75
89
  render json: {
76
90
  errors: [{
77
91
  code: error.code,
78
- detail: error.message
92
+ detail: error.message,
93
+ title: "Error!"
79
94
  }],
80
95
  status: :bad_request
81
96
  }
@@ -8,7 +8,7 @@ module T2Airtime
8
8
 
9
9
  # Returns the balance in your TransferTo account.
10
10
  # This method shall not be used more than 24 times per day.
11
- def check_wallet
11
+ def account_info
12
12
  run_action :check_wallet
13
13
  end
14
14
 
@@ -196,7 +196,7 @@ module T2Airtime
196
196
  # stop_date
197
197
  # ---------
198
198
  # Defines the end date of the search (included). Format must be YYYY-MM-DD.
199
- def trans_list(start=(Time.now-24.hours), stop=Time.now, msisdn=nil, destination=nil, code=nil)
199
+ def transaction_list(start=(Time.now-24.hours), stop=Time.now, msisdn=nil, destination=nil, code=nil)
200
200
  @params[:code] = code unless code
201
201
  @params[:msisdn] = msisdn unless msisdn
202
202
  @params[:stop_date] = to_yyyymmdd(stop)
@@ -209,7 +209,7 @@ module T2Airtime
209
209
  # “debit_amount_validated” are rounded to 2 digits after the comma but are
210
210
  # the same as the values returned in the fields “input_value” and
211
211
  # “validated_input_value” of the “topup” method response.
212
- def trans_info(id)
212
+ def transaction_info(id)
213
213
  @params = { transactionid: id }
214
214
  run_action :trans_info
215
215
  end
@@ -1,6 +1,11 @@
1
1
  module T2Airtime
2
2
  class Base
3
3
 
4
+ attr_reader :user,
5
+ :password,
6
+ :url,
7
+ :params
8
+
4
9
  def initialize(user, password, url)
5
10
  @user, @password, @url, @params = user, password, url, {}
6
11
  end
@@ -3,20 +3,25 @@ module T2Airtime
3
3
  class Account
4
4
 
5
5
  def self.info
6
- reply = T2Airtime::API.api.check_wallet
7
- reply.success? ? serialize(reply.data) : {}
6
+ reply = T2Airtime::API.api.account_info
7
+ reply.success? ? serialize(reply.data, reply.headers[:date]) : []
8
8
  end
9
9
 
10
- def self.serialize(data)
10
+ def self.serialize(data, ts="#{Time.zone.now}")
11
11
  {
12
- type: data[:type],
13
- name: data[:name],
14
- currency: data[:currency],
15
- balance: Float(data[:balance]),
16
- wallet: Float(data[:wallet]),
17
- balance_display: T2Airtime::Util.format_price(data[:balance], data[:currency]),
18
- wallet_display: T2Airtime::Util.format_price(data[:wallet], data[:currency]),
19
- }
12
+ type: "accounts",
13
+ id: T2Airtime::API.api.user,
14
+ attributes: {
15
+ type: data[:type],
16
+ name: data[:name],
17
+ currency: data[:currency],
18
+ balance: Float(data[:balance]),
19
+ wallet: Float(data[:wallet]),
20
+ "balance-display": T2Airtime::Util.format_price(data[:balance], data[:currency]),
21
+ "wallet-display": T2Airtime::Util.format_price(data[:wallet], data[:currency]),
22
+ "fetched-at": T2Airtime::Util.format_time(ts)
23
+ }
24
+ }.as_json
20
25
  end
21
26
 
22
27
  end
@@ -25,11 +30,11 @@ module T2Airtime
25
30
 
26
31
  def self.take(qty=5)
27
32
  reply = T2Airtime::API.api.country_list
28
- reply.success? ? serialize(reply.data, qty, reply.headers[:date]) : []
33
+ reply.success? ? serialize(reply.data, reply.headers[:date], qty) : []
29
34
  end
30
35
 
31
- def self.serialize(data, qty=nil, ts=nil)
32
- ts = ts.nil? ? Time.now : ts
36
+ def self.serialize(data, ts="#{Time.zone.now}", qty=nil)
37
+ return [] if data[:countryid].nil?
33
38
  names = data[:country].split(",")
34
39
  ids = data[:countryid].split(",")
35
40
  ids.take(qty.nil? ? ids.count : qty).each_with_index.map{|id, n| {
@@ -39,8 +44,15 @@ module T2Airtime
39
44
  "name": names[n],
40
45
  "alpha3": alpha3(names[n]),
41
46
  "fetched-at": T2Airtime::Util.format_time(ts)
47
+ },
48
+ relationships: {
49
+ operators: {
50
+ links: {
51
+ related: "/countries/#{id}/operators"
52
+ }
53
+ }
42
54
  }
43
- }}
55
+ }}.as_json
44
56
  end
45
57
 
46
58
  def self.normalize(name)
@@ -81,23 +93,50 @@ module T2Airtime
81
93
  countries = T2Airtime::Country.take(country_qty).shuffle
82
94
  unless countries.empty?
83
95
  countries.flat_map{|country| (
84
- reply = T2Airtime::API.api.operator_list(country[:aid])
85
- reply.success? ? serialize(reply.data, qty) : []
96
+ reply = T2Airtime::API.api.operator_list(country["id"])
97
+ reply.success? ? serialize(reply.data, reply.headers[:date], qty) : []
86
98
  )}
87
99
  end
88
100
  end
89
101
 
90
- def self.serialize(data, qty=nil)
102
+ def self.serialize(data, ts="#{Time.zone.now}", qty=nil)
103
+ return [] if data[:operator].nil?
91
104
  names = data[:operator].split(",")
92
105
  ids = data[:operatorid].split(",")
93
106
  ids.take(qty.nil? ? ids.count : qty).each_with_index.map{|id, n| {
94
- country: data[:country],
95
- country_aid: Integer(data[:countryid]),
96
- alpha3: T2Airtime::Country.alpha3(data[:country]),
97
- name: names[n],
98
- logo_url: T2Airtime::Util.operator_logo_url(id),
99
- aid: Integer(id)
100
- }}
107
+ type: "operators",
108
+ id: Integer(id),
109
+ attributes: {
110
+ "name": names[n],
111
+ "fetched-at": T2Airtime::Util.format_time(ts)
112
+ },
113
+ links: {
114
+ logo: T2Airtime::Util.operator_logo_url(id)
115
+ },
116
+ relationships: {
117
+ country: {
118
+ data: {
119
+ type: "countries",
120
+ id: Integer(data[:countryid])
121
+ }
122
+ },
123
+ products: {
124
+ links: {
125
+ related: "/countries/#{data[:countryid]}/operators/#{id}/products"
126
+ }
127
+ }
128
+ },
129
+ included: [
130
+ {
131
+ type: "countries",
132
+ id: Integer(data[:countryid]),
133
+ attributes: {
134
+ "name": data[:country],
135
+ "alpha3": T2Airtime::Country.alpha3(data[:country])
136
+ }
137
+ }
138
+ ]
139
+ }}.as_json
101
140
  end
102
141
 
103
142
  end
@@ -108,95 +147,174 @@ module T2Airtime
108
147
  operators = T2Airtime::Operator.take(operator_qty).shuffle
109
148
  unless operators.empty?
110
149
  operators.flat_map{|operator| (
111
- reply = T2Airtime::API.api.product_list(operator[:aid])
112
- reply.success? ? serialize(reply.data, qty) : []
150
+ reply = T2Airtime::API.api.product_list(operator["id"])
151
+ reply.success? ? serialize(reply.data, reply.headers[:date], qty) : []
113
152
  )}
114
153
  end
115
154
  end
116
155
 
117
- def self.serialize(data, qty=nil)
156
+ def self.serialize(data, ts="#{Time.zone.now}", qty=nil)
157
+ return [] if data[:product_list].nil?
118
158
  currency = data[:destination_currency]
119
159
  retail_prices = data[:retail_price_list].split(",")
120
160
  wholesale_prices = data[:wholesale_price_list].split(",")
121
161
  ids = data[:product_list].split(",")
122
162
  ids.take(qty.nil? ? ids.count : qty).each_with_index.map{|id, n| {
123
- country: data[:country],
124
- country_aid: Integer(data[:countryid]),
125
- alpha3: T2Airtime::Country.alpha3(data[:country]),
126
- operator: data[:operator],
127
- operator_aid: Integer(data[:operatorid]),
128
- operator_logo_url: T2Airtime::Util.operator_logo_url(data[:operatorid]),
129
- name: "#{id}#{currency}",
130
- currency: currency,
131
- local_price: Float(id),
132
- retail_price: Float(retail_prices[n]),
133
- wholesale_price: Float(wholesale_prices[n]),
134
- local_price_display: T2Airtime::Util.format_price(id, currency),
135
- retail_price_display: T2Airtime::Util.format_price(retail_prices[n]),
136
- wholesale_price_display: T2Airtime::Util.format_price(wholesale_prices[n]),
137
- aid: Integer(id)
138
- }}
163
+ type: "products",
164
+ id: Integer(id),
165
+ attributes: {
166
+ "name": "#{id}#{currency}",
167
+ "currency": currency,
168
+ "local-price": Float(id),
169
+ "retail-price": Float(retail_prices[n]),
170
+ "wholesale-price": Float(wholesale_prices[n]),
171
+ "local-price-display": T2Airtime::Util.format_price(id, currency),
172
+ "retail-price-display": T2Airtime::Util.format_price(retail_prices[n]),
173
+ "wholesale-price-display": T2Airtime::Util.format_price(wholesale_prices[n]),
174
+ "fetched-at": T2Airtime::Util.format_time(ts)
175
+ },
176
+ relationships: {
177
+ country: {
178
+ data: {
179
+ type: "countries",
180
+ id: Integer(data[:countryid])
181
+ }
182
+ },
183
+ operator: {
184
+ data: {
185
+ type: "operators",
186
+ id: Integer(data[:operatorid])
187
+ }
188
+ }
189
+ },
190
+ included: [
191
+ {
192
+ type: "countries",
193
+ id: Integer(data[:countryid]),
194
+ attributes: {
195
+ "name": data[:country],
196
+ "alpha3": T2Airtime::Country.alpha3(data[:country])
197
+ }
198
+ },
199
+ {
200
+ type: "operators",
201
+ id: Integer(data[:operatorid]),
202
+ attributes: {
203
+ "name": data[:operator]
204
+ },
205
+ links: {
206
+ logo: T2Airtime::Util.operator_logo_url(data[:operatorid])
207
+ }
208
+ }
209
+ ]
210
+ }}.as_json
139
211
  end
140
212
 
141
213
  end
142
214
 
143
215
  class Transaction
144
216
 
145
- def self.take(start, stop, msisdn=nil, destination=nil, code=nil, qty=5)
146
- reply = T2Airtime::API.api.trans_list(start, stop, msisdn, destination, code)
217
+ def self.take(start=(Time.now-24.hours), stop=Time.now, msisdn=nil, destination=nil, code=nil, qty=5)
218
+ reply = T2Airtime::API.api.transaction_list(start, stop, msisdn, destination, code)
147
219
  reply.success? ? serialize(reply.data, qty) : []
148
220
  end
149
221
 
150
222
  def self.serialize(data, qty=nil)
223
+ return [] if data[:transaction_list].nil?
151
224
  ids = data[:transaction_list].split(",")
152
- ids.empty? ? {} : ids.take(qty.nil? ? ids.count : qty).each.map{ |id| show(id) }
225
+ ids.take(qty.nil? ? ids.count : qty).each.map{ |id| show(id) }
153
226
  end
154
227
 
155
228
 
156
229
  def self.show(id)
157
- reply = T2Airtime::API.api.trans_info(id)
158
- reply.success? ? serialize_one(reply.data) : {}
230
+ reply = T2Airtime::API.api.transaction_info(id)
231
+ reply.success? ? serialize_one(reply.data, reply.headers[:date]) : {}
159
232
  end
160
233
 
161
- def self.serialize_one(t)
234
+ def self.serialize_one(data, ts="#{Time.zone.now}")
162
235
  {
163
- id: Integer(t[:transactionid]),
164
- msisdn: t[:msisdn],
165
- destination_msisdn: t[:destination_msisdn],
166
- transaction_authentication_key: t[:transaction_authentication_key],
167
- transaction_error_code: Integer(t[:transaction_error_code]),
168
- transaction_error_txt: t[:transaction_error_txt],
169
- country: t[:country],
170
- country_aid: Integer(t[:countryid]),
171
- alpha3: T2Airtime::Country.alpha3(t[:country]),
172
- operator: t[:operator],
173
- operator_aid: Integer(t[:operatorid]),
174
- operator_logo_url: T2Airtime::Util.operator_logo_url(t[:operatorid]),
175
- reference_operator: t[:reference_operator],
176
- product_requested: t[:product_requested],
177
- product_requested_display: T2Airtime::Util.format_price(t[:product_requested], t[:destination_currency]),
178
- actual_product_sent: t[:actual_product_sent],
179
- actual_product_sent_display: T2Airtime::Util.format_price(t[:actual_product_sent], t[:destination_currency]),
180
- wholesale_price: t[:wholesale_price],
181
- wholesale_price_display: T2Airtime::Util.format_price(t[:wholesale_price], t[:originating_currency]),
182
- retail_price: t[:retail_price],
183
- retail_price_display: T2Airtime::Util.format_price(t[:retail_price], t[:originating_currency]),
184
- sms: t[:sms],
185
- cid1: t[:cid1],
186
- cid2: t[:cid2],
187
- cid3: t[:cid3],
188
- date: t[:date],
189
- originating_currency: t[:originating_currency],
190
- destination_currency: t[:destination_currency],
191
- pin_based: t[:pin_based],
192
- local_info_amount: t[:local_info_amount],
193
- local_info_amount_display: T2Airtime::Util.format_price(t[:local_info_amount], t[:local_info_currency]),
194
- local_info_currency: t[:local_info_currency],
195
- local_info_value: t[:local_info_value],
196
- local_info_value_display: T2Airtime::Util.format_price(t[:local_info_value], t[:local_info_currency]),
197
- error_code: t[:error_code],
198
- error_txt: t[:error_txt]
199
- }
236
+ type: "transactions",
237
+ id: Integer(data[:transactionid]),
238
+ attributes: {
239
+ "msisdn": data[:msisdn],
240
+ "destination-msisdn": data[:destination_msisdn],
241
+ "transaction-authentication-key": data[:transaction_authentication_key],
242
+ "transaction-error-code": Integer(data[:transaction_error_code]),
243
+ "transaction-error-txt": data[:transaction_error_txt],
244
+ "reference-operator": data[:reference_operator],
245
+ "product-requested-display": T2Airtime::Util.format_price(data[:product_requested], data[:destination_currency]),
246
+ "actual-product-sent": data[:actual_product_sent],
247
+ "actual-product-sent-display": T2Airtime::Util.format_price(data[:actual_product_sent], data[:destination_currency]),
248
+ "sms": data[:sms],
249
+ "cid1": data[:cid1],
250
+ "cid2": data[:cid2],
251
+ "cid3": data[:cid3],
252
+ "date": data[:date],
253
+ "originating-currency": data[:originating_currency],
254
+ "destination-currency": data[:destination_currency],
255
+ "pin-based": data[:pin_based],
256
+ "local-info-amount": data[:local_info_amount],
257
+ "local-info-amount-display": T2Airtime::Util.format_price(data[:local_info_amount], data[:local_info_currency]),
258
+ "local-info-currency": data[:local_info_currency],
259
+ "error-code": data[:error_code],
260
+ "error-txt": data[:error_txt],
261
+ "fetched-at": T2Airtime::Util.format_time(ts)
262
+ },
263
+ relationships: {
264
+ country: {
265
+ data: {
266
+ type: "countries",
267
+ id: Integer(data[:countryid])
268
+ }
269
+ },
270
+ operator: {
271
+ data: {
272
+ type: "operators",
273
+ id: Integer(data[:operatorid])
274
+ }
275
+ },
276
+ product: {
277
+ data: {
278
+ type: "products",
279
+ id: Integer(data[:product_requested])
280
+ }
281
+ }
282
+ },
283
+ included: [
284
+ {
285
+ type: "countries",
286
+ id: Integer(data[:countryid]),
287
+ attributes: {
288
+ "name": data[:country],
289
+ "alpha3": T2Airtime::Country.alpha3(data[:country])
290
+ }
291
+ },
292
+ {
293
+ type: "operators",
294
+ id: Integer(data[:operatorid]),
295
+ attributes: {
296
+ "name": data[:operator]
297
+ },
298
+ links: {
299
+ logo: T2Airtime::Util.operator_logo_url(data[:operatorid])
300
+ }
301
+ },
302
+ {
303
+ type: "products",
304
+ id: Integer(data[:product_requested]),
305
+ attributes: {
306
+ "name": "#{data[:product_requested]}#{data[:destination_currency]}",
307
+ "currency": data[:destination_currency],
308
+ "wholesale-price": data[:wholesale_price],
309
+ "wholesale-price-display": T2Airtime::Util.format_price(data[:wholesale_price], data[:originating_currency]),
310
+ "retail-price": data[:retail_price],
311
+ "retail-price-display": T2Airtime::Util.format_price(data[:retail_price], data[:originating_currency]),
312
+ "local-price": data[:local_info_value],
313
+ "local-price-display": T2Airtime::Util.format_price(data[:local_info_value], data[:local_info_currency])
314
+ }
315
+ }
316
+ ]
317
+ }.as_json
200
318
  end
201
319
 
202
320
 
@@ -1,3 +1,3 @@
1
1
  module T2Airtime
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
data/release CHANGED
@@ -4,3 +4,4 @@ set -e
4
4
  git add .
5
5
  git commit -am "Bump to v${0}"
6
6
  git push origin master
7
+ gem release
data/t2_airtime.gemspec CHANGED
@@ -25,7 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
 
28
- spec.add_runtime_dependency 'dotenv-rails', '~> 2.2', '>= 2.2.1'
28
+ spec.add_dependency 'rails', '~> 5.1.3'
29
+ spec.add_runtime_dependency 'dotenv-rails', '~> 2.2', '>= 2.2.1'
29
30
  spec.add_dependency "faraday", "0.9.1"
30
31
  spec.add_dependency "countries", "2.1.2"
31
32
  spec.add_dependency "money", "6.9.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: t2_airtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - matteolc
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-04 00:00:00.000000000 Z
11
+ date: 2017-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 5.1.3
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 5.1.3
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: dotenv-rails
57
71
  requirement: !ruby/object:Gem::Requirement