parking_ticket 0.1.2 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 906db147921e6dd895fb32a8a19655f32534cd5e2fd0b1dde3994993bcf363a0
4
- data.tar.gz: 9e8a41a807f6554296ad6af378d9013f7e53d092cfac81a835a151c778e0b52c
3
+ metadata.gz: b2316d548e3f47bee94290a6e0b4399150d1db6948217c4a0434cae0b3ab5ebd
4
+ data.tar.gz: 31cbaee19c0e458085ef5ab1c142d2fe5f24a82ff152e9e797c1a8e4ddd03782
5
5
  SHA512:
6
- metadata.gz: 644057915b6735bde424f2ced14484adc60cda036224b9c9865ba20626dab10efcd36728726b5130be34d82f12c955faa2aa1cebb01dfc06d6034dd82e79f582
7
- data.tar.gz: f46361fced56944c3926ab1cbdd48ba2534879c32693d7b4427b7d2338b3c07c82414978331464547732502d20c43d50c0b8bbc10e689a9b2696564fd01d5831
6
+ metadata.gz: e5c572a25ce7df3ab41f449dbaf1999df4efde403ccad560c87bf284ceb1e08ae3c072a4950a06244ffe94086b147fb0fb56d779a16315cdae05a34e5f39450f
7
+ data.tar.gz: a1e55ec8f66f0909c49bd53d5cc89ceb243cd6f72d6070befe77f9f57c8b10d4650a396a5f7054cdec7959400e0cb2dd64f42415300bf168f74ebed8715d6e2a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- parking_ticket (0.1.2)
4
+ parking_ticket (1.0.0)
5
5
  faraday
6
6
 
7
7
  GEM
@@ -33,6 +33,7 @@ GEM
33
33
 
34
34
  PLATFORMS
35
35
  arm64-darwin-20
36
+ x86_64-linux
36
37
 
37
38
  DEPENDENCIES
38
39
  faraday (~> 2.7, >= 2.7.2)
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # ParkingTicket
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/parking_ticket`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ This gem is a wrapper around the majors residential parking tickets api (for now only PayByPhone is supported).
6
4
 
7
5
  ## Installation
8
6
 
@@ -22,22 +20,45 @@ Or install it yourself as:
22
20
 
23
21
  ## Usage
24
22
 
25
- TODO: Write usage instructions here
23
+ To make the gem work above your parking account you need set some environment variables :
26
24
 
27
- ## Development
25
+ #PayByPhone :
26
+ - `PAYBYPHONE_PASSWORD` : your PayByPhone password
27
+ - `PAYBYPHONE_USERNAME` : your PayByPhone username (usually your phone number)
28
+ - `PAYBYPHONE_LICENSEPLATE` : tyhe license plate of the car that must be covered
29
+ - `PAYBYPHONE_ZIPCODE` : the zipcode you're resident in
30
+ - `PAYBYPHONE_CARDNUMBER` : the credit card used to pay parking tickets (must be formated as folow xxxxxx------xxxx)
28
31
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
32
+ #Other apis to come
30
33
 
31
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
34
+ Two methods comes with the gem :
32
35
 
33
- ## Contributing
36
+ #`ParkingTicket.current_ticket`
37
+ => returns an object representing a currently running residential ticket for your car. It returns nil if no ticket are found.
34
38
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/parking_ticket. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/parking_ticket/blob/master/CODE_OF_CONDUCT.md).
39
+ #`ParkingTicket.renew`
40
+ => register a new residential ticket for your car, this won't work if current_ticket returns something.
36
41
 
37
- ## License
42
+ Then you can create a scrypt like this one :
38
43
 
39
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
44
+ ```
45
+ #your_scrypt.rb
46
+ require 'parking_ticket'
40
47
 
41
- ## Code of Conduct
48
+ ticket_client = ParkingTicket.new
49
+
50
+ unless ticket_client.current_ticket
51
+ ticket_client.renew
52
+ end
53
+
54
+ ```
42
55
 
43
- Everyone interacting in the ParkingTicket project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/parking_ticket/blob/master/CODE_OF_CONDUCT.md).
56
+ And play as often as you want to ensure that you always have a ticket for your car.
57
+ (But this is very HTTP request consuming, a lot of wasted request will be performed, i am sure that you can do better than that.)
58
+
59
+ Exemple of application : [parkautomat](https://github.com/troptropcontent/parkautomat)
60
+
61
+
62
+ ## License
63
+
64
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -1,71 +1,61 @@
1
- require_relative '../pay_by_phone'
2
-
3
- class PayByPhone::Adapter
4
- class Error < StandardError; end
5
-
6
- def initialize
7
- check_required_configuarion!
8
- end
9
-
10
- def covered?
11
- !!current_ticket
12
- end
13
-
14
- def current_ticket
15
- ticket = client.tickets(account_id).find do |ticket|
16
- ticket.dig('vehicle', 'licensePlate') == ENV['PAYBYPHONE_LICENSEPLATE']
1
+ module ParkingTicket
2
+ module Client
3
+ module PayByPhone
4
+ class Adapter
5
+ def initialize(configuration)
6
+ @configuration = configuration
7
+ end
8
+
9
+ def covered?
10
+ !!current_ticket
11
+ end
12
+
13
+ def current_ticket
14
+ ticket = request.tickets(account_id).find do |ticket|
15
+ ticket.dig('vehicle', 'licensePlate') == @configuration.license_plate
16
+ end
17
+
18
+ return unless ticket
19
+
20
+ {
21
+ starts_on: DateTime.parse(ticket['startTime']),
22
+ ends_on: DateTime.parse(ticket['expireTime']),
23
+ license_plate: ticket.dig('vehicle', 'licensePlate'),
24
+ cost: ticket.dig('segments', 0, 'cost'),
25
+ client: 'PayByPhone',
26
+ client_ticket_id: ticket['parkingSessionId']
27
+ }
28
+ end
29
+
30
+ def renew
31
+ return if covered?
32
+
33
+ quote = request.new_quote(rate_option_id, account_id)
34
+ request.new_ticket(account_id, quote['parkingStartTime'], quote['quoteId'], payment_method_id)
35
+ end
36
+
37
+ private
38
+
39
+ def request
40
+ @request ||= Request.new(@configuration)
41
+ end
42
+
43
+ def account_id
44
+ @account_id ||= request.accounts.dig(0, 'id')
45
+ end
46
+
47
+ def payment_method_id
48
+ request.payment_methods['items'].find do |payment_method|
49
+ payment_method['maskedCardNumber'] == @configuration.card_number
50
+ end['id']
51
+ end
52
+
53
+ def rate_option_id
54
+ request.rate_options(account_id).find do |rate_option|
55
+ rate_option['type'] == 'RES' && rate_option['licensePlate'] == @configuration.license_plate
56
+ end['rateOptionId']
57
+ end
58
+ end
17
59
  end
18
- return unless ticket
19
-
20
- {
21
- starts_on: DateTime.parse(ticket['startTime']),
22
- ends_on: DateTime.parse(ticket['expireTime']),
23
- license_plate: ticket.dig('vehicle', 'licensePlate'),
24
- cost: ticket.dig('segments', 0, 'cost'),
25
- client: 'PayByPhone',
26
- client_ticket_id: ticket['parkingSessionId']
27
- }
28
- end
29
-
30
- def renew
31
- return if covered?
32
-
33
- quote = client.new_quote(rate_option_id, account_id)
34
- puts client.new_ticket(account_id, quote['parkingStartTime'], quote['quoteId'], payment_method_id)
35
- end
36
-
37
- private
38
-
39
- def client
40
- @client ||= PayByPhone.new
41
- end
42
-
43
- def account_id
44
- @account_id ||= client.accounts.dig(0, 'id')
45
- end
46
-
47
- def payment_method_id
48
- client.payment_methods['items'].find do |payment_method|
49
- payment_method['maskedCardNumber'] == ENV['PAYBYPHONE_CARDNUMBER']
50
- end['id']
51
- end
52
-
53
- def rate_option_id
54
- client.rate_options(account_id).find do |rate_option|
55
- rate_option['type'] == 'RES' && rate_option['licensePlate'] == ENV['PAYBYPHONE_LICENSEPLATE']
56
- end['rateOptionId']
57
- end
58
-
59
- def check_required_configuarion!
60
- return if %w[
61
- PAYBYPHONE_PASSWORD
62
- PAYBYPHONE_USERNAME
63
- PAYBYPHONE_LICENSEPLATE
64
- PAYBYPHONE_ZIPCODE
65
- PAYBYPHONE_CARDNUMBER
66
- ].all? { |required_environement_variable| ENV[required_environement_variable] }
67
-
68
- raise Error,
69
- 'The required configuation are not set properly, the following environnment variable must be set : PAYBYPHONE_PASSWORD, PAYBYPHONE_USERNAME, PAYBYPHONE_LICENSEPLATE, PAYBYPHONE_ZIPCODE, PAYBYPHONE_CARDNUMBER'
70
60
  end
71
61
  end
@@ -0,0 +1,9 @@
1
+ module ParkingTicket
2
+ module Client
3
+ module PayByPhone
4
+ class Configuration < ParkingTicket::Configuration
5
+ attr_required :username, :password, :license_plate, :zipcode, :card_number
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,121 @@
1
+ require 'faraday'
2
+ module ParkingTicket
3
+ module Client
4
+ module PayByPhone
5
+ class Request
6
+ def initialize(configuration)
7
+ @configuration = configuration
8
+ end
9
+
10
+ def tickets(account_id)
11
+ connection.get("/parking/accounts/#{account_id}/sessions?periodType=Current").body
12
+ end
13
+
14
+ def new_ticket(_account_id, _parking_start_time, _quote_id, _payment_method_id)
15
+ connection.post(
16
+ "/parking/accounts/#{account_id}/sessions/",
17
+ {
18
+ "expireTime": nil,
19
+ "duration": {
20
+ "quantity": '1',
21
+ "timeUnit": 'days'
22
+ },
23
+ "licensePlate": @configuration.license_plate,
24
+ "locationId": @configuration.zipcode,
25
+ "rateOptionId": '75101',
26
+ "startTime": parking_start_time,
27
+ "quoteId": quote_id,
28
+ "parkingAccountId": account_id,
29
+ "paymentMethod": {
30
+ "paymentMethodType": 'PaymentAccount',
31
+ "payload": {
32
+ "paymentAccountId": payment_method_id,
33
+ "clientBrowserDetails": {
34
+ "browserAcceptHeader": 'text/html',
35
+ "browserColorDepth": '30',
36
+ "browserJavaEnabled": 'false',
37
+ "browserLanguage": 'fr-FR',
38
+ "browserScreenHeight": '900',
39
+ "browserScreenWidth": '1440',
40
+ "browserTimeZone": '-60',
41
+ "browserUserAgent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
42
+ }
43
+ }
44
+ }
45
+ }.to_json
46
+ ).body
47
+ end
48
+
49
+ def accounts
50
+ connection.get('/parking/accounts').body
51
+ end
52
+
53
+ def vehicles
54
+ connection.get('/identity/profileservice/v1/members/vehicles/paybyphone').body
55
+ end
56
+
57
+ def rate_options(account_id)
58
+ connection.get("/parking/locations/#{@configuration.zipcode}/rateOptions",
59
+ {
60
+ parkingAccountId: account_id,
61
+ licensePlate: @configuration.license_plate
62
+ }).body
63
+ end
64
+
65
+ def new_quote(rate_option_id, account_id)
66
+ connection.get(
67
+ "/parking/accounts/#{account_id}/quote",
68
+ {
69
+ locationId: @configuration.zipcode,
70
+ licensePlate: @configuration.license_plate,
71
+ rateOptionId: rate_option_id,
72
+ durationTimeUnit: 'Days',
73
+ durationQuantity: 1,
74
+ isParkUntil: false,
75
+ parkingAccountId: account_id
76
+ }
77
+ ).body
78
+ end
79
+
80
+ def member
81
+ connection.get('/identity/profileservice/v1/members').body
82
+ end
83
+
84
+ def payment_methods
85
+ connection.get('/payment/v3/accounts').body
86
+ end
87
+
88
+ def connection
89
+ @connection ||= Faraday.new(
90
+ url: 'https://consumer.paybyphoneapis.com',
91
+ headers: {
92
+ 'Content-Type' => 'application/json',
93
+ 'Authorization' => "Bearer #{token}"
94
+ }
95
+ ) do |f|
96
+ f.response :json
97
+ end
98
+ end
99
+
100
+ def token
101
+ conn = Faraday.new('https://auth.paybyphoneapis.com') do |f|
102
+ f.response :json
103
+ end
104
+ conn.post(
105
+ '/token',
106
+ URI.encode_www_form({
107
+ grant_type: 'password',
108
+ username: @configuration.username,
109
+ password: @configuration.password,
110
+ client_id: 'paybyphone_web'
111
+ }),
112
+ {
113
+ 'Accept' => 'application/json, text/plain, */*',
114
+ 'X-Pbp-ClientType' => 'WebApp'
115
+ }
116
+ ).body['access_token']
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,26 @@
1
+ module ParkingTicket
2
+ class Configuration
3
+ def self.attr_required(*configuration_keys)
4
+ define_method('attr_required') do
5
+ configuration_keys
6
+ end
7
+ configuration_keys.each do |configuration_key|
8
+ define_method configuration_key.to_s do
9
+ instance_variable_get("@#{configuration_key}")
10
+ end
11
+ define_method "#{configuration_key}=" do |value|
12
+ instance_variable_set("@#{configuration_key}", value)
13
+ end
14
+ end
15
+ end
16
+
17
+ def initialize
18
+ @attr_required = defined?(attr_required) ? attr_required : []
19
+ yield(self)
20
+ end
21
+
22
+ def completed?
23
+ @attr_required.all? { |attribute_required| instance_variable_get("@#{attribute_required}") }
24
+ end
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ParkingTicket
4
- VERSION = '0.1.2'
4
+ VERSION = '1.0.0'
5
5
  end
@@ -1,28 +1,66 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'parking_ticket/version'
4
- require_relative 'client/pay_by_phone'
5
- require_relative 'client/pay_by_phone/adapter'
3
+ require 'parking_ticket/configuration'
4
+ require 'parking_ticket/version'
5
+
6
+ # PayByPhone wrapper
7
+ require 'client/pay_by_phone/configuration'
8
+ require 'client/pay_by_phone/adapter'
9
+ require 'client/pay_by_phone/request'
6
10
 
7
11
  module ParkingTicket
8
- class Error < StandardError; end
12
+ class Base
13
+ attr_reader :configuration
9
14
 
10
- def self.renew
11
- if current_ticket
12
- puts '❌ Can not renew ticket as already covered by a ticket at this time'
13
- else
14
- puts '🔄 Renewing ticket'
15
- adapter.renew
16
- puts '✅ Ticket renewed'
15
+ class Error < StandardError
17
16
  end
18
- end
19
17
 
20
- def self.current_ticket
21
- puts '🕵️ Retrieving current_ticket'
22
- adapter.current_ticket
23
- end
18
+ def initialize(adapter_name, configuration_attributes)
19
+ @adapter_name = adapter_name
20
+ @configuration_attributes = configuration_attributes
21
+ @result = {}
22
+ end
23
+
24
+ def adapter
25
+ @adapter ||= load_adapter!
26
+ end
27
+
28
+ def renew
29
+ adapter.renew unless current_ticket
30
+ end
31
+
32
+ def current_ticket
33
+ adapter.current_ticket
34
+ end
24
35
 
25
- def self.adapter
26
- @@adapter ||= PayByPhone::Adapter.new
36
+ private
37
+
38
+ def load_adapter!
39
+ return prepare_pay_by_phone_adapter! if @adapter_name == 'pay_by_phone'
40
+ return prepare_easy_park_adapter! if @adapter_name == 'easy_park'
41
+
42
+ raise Error, "Unhandled adapter : #{@adapter_name}"
43
+ end
44
+
45
+ def prepare_pay_by_phone_adapter!
46
+ configuration = pay_by_phone_configuration
47
+ return Client::PayByPhone::Adapter.new(configuration) if configuration.completed?
48
+
49
+ raise Error, 'Uncompleted configuration'
50
+ end
51
+
52
+ def pay_by_phone_configuration
53
+ Client::PayByPhone::Configuration.new do |config|
54
+ config.username = @configuration_attributes[:username]
55
+ config.password = @configuration_attributes[:password]
56
+ config.license_plate = @configuration_attributes[:license_plate]
57
+ config.zipcode = @configuration_attributes[:zipcode]
58
+ config.card_number = @configuration_attributes[:card_number]
59
+ end
60
+ end
61
+
62
+ def prepare_easy_park_adapter!
63
+ raise Error, 'EasyPark will be handled in the next major release'
64
+ end
27
65
  end
28
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parking_ticket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Ecrepont
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-09 00:00:00.000000000 Z
11
+ date: 2023-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -40,12 +40,12 @@ files:
40
40
  - Rakefile
41
41
  - bin/console
42
42
  - bin/setup
43
- - lib/client/pay_by_phone.rb
44
43
  - lib/client/pay_by_phone/adapter.rb
44
+ - lib/client/pay_by_phone/configuration.rb
45
+ - lib/client/pay_by_phone/request.rb
45
46
  - lib/parking_ticket.rb
46
- - lib/parking_ticket/ticket.rb
47
+ - lib/parking_ticket/configuration.rb
47
48
  - lib/parking_ticket/version.rb
48
- - parking_ticket.gemspec
49
49
  homepage: https://github.com/troptropcontent/parking_ticket
50
50
  licenses:
51
51
  - MIT
@@ -1,113 +0,0 @@
1
- require 'faraday'
2
- class PayByPhone
3
- def tickets(account_id)
4
- connection.get("/parking/accounts/#{account_id}/sessions?periodType=Current").body
5
- end
6
-
7
- def new_ticket(account_id, parking_start_time, quote_id, payment_method_id)
8
- connection.post(
9
- "/parking/accounts/#{account_id}/sessions/",
10
- {
11
- "expireTime": nil,
12
- "duration": {
13
- "quantity": '1',
14
- "timeUnit": 'days'
15
- },
16
- "licensePlate": ENV['PAYBYPHONE_LICENSEPLATE'],
17
- "locationId": ENV['PAYBYPHONE_ZIPCODE'],
18
- "rateOptionId": '75101',
19
- "startTime": parking_start_time,
20
- "quoteId": quote_id,
21
- "parkingAccountId": account_id,
22
- "paymentMethod": {
23
- "paymentMethodType": 'PaymentAccount',
24
- "payload": {
25
- "paymentAccountId": payment_method_id,
26
- "clientBrowserDetails": {
27
- "browserAcceptHeader": 'text/html',
28
- "browserColorDepth": '30',
29
- "browserJavaEnabled": 'false',
30
- "browserLanguage": 'fr-FR',
31
- "browserScreenHeight": '900',
32
- "browserScreenWidth": '1440',
33
- "browserTimeZone": '-60',
34
- "browserUserAgent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
35
- }
36
- }
37
- }
38
- }.to_json
39
- ).body
40
- end
41
-
42
- def accounts
43
- connection.get('/parking/accounts').body
44
- end
45
-
46
- def vehicles
47
- connection.get('/identity/profileservice/v1/members/vehicles/paybyphone').body
48
- end
49
-
50
- def rate_options(account_id)
51
- connection.get("/parking/locations/#{ENV['PAYBYPHONE_ZIPCODE']}/rateOptions",
52
- {
53
- parkingAccountId: account_id,
54
- licensePlate: ENV['PAYBYPHONE_LICENSEPLATE']
55
- }).body
56
- end
57
-
58
- def new_quote(rate_option_id, account_id)
59
- connection.get(
60
- "/parking/accounts/#{account_id}/quote",
61
- {
62
- locationId: ENV['PAYBYPHONE_ZIPCODE'],
63
- licensePlate: ENV['PAYBYPHONE_LICENSEPLATE'],
64
- rateOptionId: rate_option_id,
65
- durationTimeUnit: 'Days',
66
- durationQuantity: 1,
67
- isParkUntil: false,
68
- parkingAccountId: account_id
69
- }
70
- ).body
71
- end
72
-
73
- def member
74
- connection.get('/identity/profileservice/v1/members').body
75
- end
76
-
77
- def payment_methods
78
- connection.get('/payment/v3/accounts').body
79
- end
80
-
81
- private
82
-
83
- def connection
84
- @connection ||= Faraday.new(
85
- url: 'https://consumer.paybyphoneapis.com',
86
- headers: {
87
- 'Content-Type' => 'application/json',
88
- 'Authorization' => "Bearer #{token}"
89
- }
90
- ) do |f|
91
- f.response :json
92
- end
93
- end
94
-
95
- def token
96
- conn = Faraday.new('https://auth.paybyphoneapis.com') do |f|
97
- f.response :json
98
- end
99
- conn.post(
100
- '/token',
101
- URI.encode_www_form({
102
- grant_type: 'password',
103
- username: ENV['PAYBYPHONE_USERNAME'],
104
- password: ENV['PAYBYPHONE_PASSWORD'],
105
- client_id: 'paybyphone_web'
106
- }),
107
- {
108
- 'Accept' => 'application/json, text/plain, */*',
109
- 'X-Pbp-ClientType' => 'WebApp'
110
- }
111
- ).body['access_token']
112
- end
113
- end
@@ -1,21 +0,0 @@
1
- class ParkingTicket::Ticket
2
- def initialize(attributes)
3
- @starts_on = attributes[:starts_on]
4
- @ends_on = attributes[:ends_on]
5
- @license_plate = attributes[:license_plate]
6
- @cost = attributes[:cost]
7
- @client = attributes[:client]
8
- @client_ticket_id = attributes[:client_ticket_id]
9
- end
10
-
11
- def to_h
12
- {
13
- starts_on: @starts_on,
14
- ends_on: @ends_on,
15
- license_plate: @license_plate,
16
- cost: @cost,
17
- client: @client,
18
- client_ticket_id: @client_ticket_id
19
- }
20
- end
21
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'lib/parking_ticket/version'
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = 'parking_ticket'
7
- spec.version = ParkingTicket::VERSION
8
- spec.authors = ['Tom Ecrepont']
9
- spec.email = ['tomecrepont@gmail.com']
10
-
11
- spec.summary = 'Never forget to take a parking ticket again.'
12
- spec.description = 'Automatically renew your parking ticket when it expires.'
13
- spec.homepage = 'https://github.com/troptropcontent/parking_ticket'
14
- spec.license = 'MIT'
15
- spec.required_ruby_version = '>= 3.0.0'
16
-
17
- spec.metadata['homepage_uri'] = spec.homepage
18
- spec.metadata['source_code_uri'] = 'https://github.com/troptropcontent/parking_ticket'
19
-
20
- # Specify which files should be added to the gem when it is released.
21
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
- `git ls-files -z`.split("\x0").reject do |f|
24
- (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
25
- end
26
- end
27
- spec.bindir = 'exe'
28
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
- spec.require_paths = ['lib']
30
-
31
- # dependancies
32
- spec.add_dependency 'faraday'
33
- end