gillbus 0.17.6 → 0.18.1

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
  SHA1:
3
- metadata.gz: 39981156aa20418b3109add8e3d94c63077bd44c
4
- data.tar.gz: 50e5710aa809acc6203119011b706034fbdd100f
3
+ metadata.gz: 061717304c911054d7958701d0453ae6243f1efc
4
+ data.tar.gz: 481cf904061a7696bdfabc23359710e0a0d83707
5
5
  SHA512:
6
- metadata.gz: 512923d49ef42592d7f3d1d2fbd4a6e97b888d15980cd1b1ebeee82ded1908cda2fa820e07d8a2769ebf797f2557e7d8beb1395e34dee02f54298705d2c2f4ab
7
- data.tar.gz: 15d286724cead0805000c7d4d29c9abea2f7b59ca11561bc8cc6515a2e037cf616df9cbfa6284d9f90c418723de581c00ef6b3ad7d95add3171a6cb0a11c261d
6
+ metadata.gz: cfc65005717460f4f77283acf4b572b8b45c94d2d67445d89b39fc2a4845fd53adf446e1b3783182615afabb346c487e8d48c28f331fb628d2dc40016a86f955
7
+ data.tar.gz: 4af31b24aa23bf174da9d40d9abd7f0b9219d8016a6592a9fa62d733b9b033f378181ff815d0204707fc4d9a966e80ced0cbb544bfde3cfbff05e6e98277a424
data/Gemfile CHANGED
@@ -2,7 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in gillbus.gemspec
4
4
  gemspec
5
-
6
- group :development do
7
- gem 'ox'
8
- end
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_dependency 'faraday'
23
23
  spec.add_dependency 'monetize'
24
24
  spec.add_dependency 'money'
25
- spec.add_dependency 'multi_xml'
25
+ spec.add_dependency 'ox', '~> 2.9'
26
26
 
27
27
  spec.add_development_dependency 'bundler', '~> 1.6'
28
28
  spec.add_development_dependency 'minitest'
@@ -1,4 +1,4 @@
1
- require 'multi_xml'
1
+ require 'ox'
2
2
 
3
3
  class Gillbus
4
4
  class BaseResponse
@@ -32,12 +32,12 @@ class Gillbus
32
32
  end
33
33
 
34
34
  def self.parse_string(xml_string, **options)
35
- xml = MultiXml.parse(xml_string)
35
+ xml = Ox.load(xml_string, mode: :hash, symbolize_keys: false)
36
36
  # <DATA/> is a valid response
37
37
  return ParseError.new(xml_string, 'DATA attribute missing') unless xml.key?('DATA')
38
38
  data = xml['DATA'] || {}
39
39
  parse(data, instance: new, options: options)
40
- rescue MultiXml::ParseError, ArgumentError => e
40
+ rescue Ox::ParseError, ArgumentError => e
41
41
  ParseError.new(xml_string, e.message)
42
42
  end
43
43
  end
@@ -3,6 +3,13 @@ require 'active_support/time'
3
3
 
4
4
  class Gillbus
5
5
  class Parser
6
+ NULL_CONST = 'null'.freeze
7
+ TRUE_CONST = 'true'.freeze
8
+ YES_CONST = 'Y'.freeze
9
+ DATE_FORMAT_CONST = '%d.%m.%Y'.freeze
10
+ TIME_FORMAT_REGEXP = /^ ( \d\d:\d\d ) (?: :\d\d )? $/x.freeze
11
+ DEFAULT_TIMEZONE = 'Europe/Kiev'.freeze
12
+
6
13
  attr_accessor :doc
7
14
  attr_accessor :instance
8
15
  attr_accessor :fields
@@ -45,6 +52,9 @@ class Gillbus
45
52
  def make_one_or_many(type, val)
46
53
  # [:type]
47
54
  if type.is_a? Array
55
+ if val.is_a?(Array) && val[0].is_a?(Hash) && !val[0].has_key?('__content__')
56
+ val = [val] if val[1].is_a?(String) # hack to handle attribute parsing by Ox
57
+ end
48
58
  array(val).map { |v| make_one type.first, v }
49
59
  # :type
50
60
  else
@@ -70,16 +80,16 @@ class Gillbus
70
80
  end
71
81
 
72
82
  def string(val)
73
- return if val == 'null'
83
+ return if val == NULL_CONST
74
84
  val
75
85
  end
76
86
 
77
87
  def bool(val)
78
- val == 'true'
88
+ val == TRUE_CONST
79
89
  end
80
90
 
81
91
  def yesno_bool(val)
82
- val == 'Y'
92
+ val == YES_CONST
83
93
  end
84
94
 
85
95
  def int(val)
@@ -87,12 +97,12 @@ class Gillbus
87
97
  end
88
98
 
89
99
  def date(val)
90
- Date.strptime(val, '%d.%m.%Y')
100
+ Date.strptime(val, DATE_FORMAT_CONST)
91
101
  end
92
102
 
93
103
  # rubocop:disable Style/GuardClause, Style/IfUnlessModifier
94
104
  def time(val)
95
- if val =~ /^ ( \d\d:\d\d ) (?: :\d\d )? $/x
105
+ if val =~ TIME_FORMAT_REGEXP
96
106
  $1
97
107
  end
98
108
  end
@@ -109,7 +119,7 @@ class Gillbus
109
119
  end
110
120
 
111
121
  def default_timezone
112
- @options[:timezone] || 'Europe/Kiev'
122
+ @options[:timezone] || DEFAULT_TIMEZONE
113
123
  end
114
124
 
115
125
  def decimal(val)
@@ -14,7 +14,7 @@ class Gillbus
14
14
 
15
15
  parser do
16
16
  def money(val)
17
- Monetize.parse(val, doc[:_currency])
17
+ Monetize.parse(val, parent.sale_cur_code)
18
18
  end
19
19
  end
20
20
  end
@@ -1,6 +1,8 @@
1
1
  class Gillbus
2
2
  class Tariff
3
3
  class ReturnCause
4
+ LOSSLESS = 'lossless'.freeze
5
+
4
6
  extend Fields
5
7
  include UpdateAttrs
6
8
 
@@ -10,10 +12,13 @@ class Gillbus
10
12
 
11
13
  # rubocop:disable Lint/UnusedMethodArgument
12
14
  def self.parse(doc, instance: nil, parent: nil, options: {})
13
- instance = super
14
- if doc.is_a? Hash
15
+ instance = new
16
+ if doc.is_a?(Array) && doc.size == 2 && doc.first.is_a?(Hash) && doc.last.is_a?(String)
17
+ instance.lossless = doc.first[LOSSLESS] == Parser::TRUE_CONST
18
+ instance.cause = doc.last
19
+ elsif doc.is_a?(Hash) && doc.has_key?('__content__')
20
+ instance.lossless = (doc['lossless'] == 'true')
15
21
  instance.cause = doc['__content__']
16
- instance.lossless = doc['lossless'] == 'true'
17
22
  else
18
23
  instance.cause = doc
19
24
  instance.lossless = false
@@ -256,7 +256,7 @@ class Gillbus
256
256
  # Array of commissions only for us (with additional fields)
257
257
  field :all_commissions, [Commission], key: 'COMMISSION', root: 'ALL_COMMISSIONS'
258
258
 
259
- field :return_causes, [:return_cause], key: 'RETURN_CAUSE'
259
+ field :return_causes, [ReturnCause], key: 'RETURN_CAUSE'
260
260
 
261
261
  # Date to pay reserved ticket
262
262
  field :date_to_pay, :datetime
@@ -181,6 +181,7 @@ class Gillbus
181
181
  def self.parse(doc, instance: nil, parent: nil, options: {})
182
182
  instance = super
183
183
  instance.data = doc
184
+ instance.options = TripOptions.build_blank if instance.options.nil?
184
185
  instance
185
186
  end
186
187
  end
@@ -39,5 +39,13 @@ class Gillbus
39
39
  vals.include?('BUSFOR_RECOMMEND')
40
40
  end
41
41
  end
42
+
43
+ def self.build_blank
44
+ options = new
45
+ field_definitions.each do |name:, type:, key:, root:|
46
+ options.send(:"#{name}=", []) if type.is_a?(Array)
47
+ end
48
+ options
49
+ end
42
50
  end
43
51
  end
@@ -7,6 +7,21 @@ class Gillbus
7
7
  field :id, :int, key: 'ID'
8
8
 
9
9
  # название услуги в автобусе
10
- field :name, :string, key: '__content__'
10
+ field :name, :string, key: :__content__
11
+
12
+ def self.parse(doc, instance: nil, parent: nil, options: {})
13
+ instance = new
14
+ if doc.is_a?(Array)
15
+ raise ArgumentError, "Unable to parse TripService: #{doc.inspect}" unless doc.size == 2
16
+ instance.id = doc.first.fetch('ID').to_i
17
+ instance.name = doc.last
18
+ elsif doc.is_a?(Hash) #legacy data made with MultiXML
19
+ instance.id = doc.fetch('ID')
20
+ instance.name = doc.fetch('__content__')
21
+ else
22
+ raise ArgumentError, "Unable to parse TripService: #{doc.inspect}"
23
+ end
24
+ instance
25
+ end
11
26
  end
12
27
  end
@@ -1,3 +1,3 @@
1
1
  class Gillbus
2
- VERSION = '0.17.6'.freeze
2
+ VERSION = '0.18.1'.freeze
3
3
  end
@@ -22,7 +22,7 @@ class ErrorTest < Minitest::Test
22
22
 
23
23
  def test_malformed_errorness
24
24
  assert malformed_response.error?
25
- assert_equal "Malformed response: Not Terminated: text not terminated at 0:10", malformed_response.error_message
25
+ assert_equal "Malformed response: invalid format, expected < at line 1, column 1 [parse.c:146]\n", malformed_response.error_message
26
26
  end
27
27
 
28
28
  def test_malformed_2_errorness
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ class ParseTripYAML < Minitest::Test
4
+ def test_content_1
5
+ response = Gillbus::Trip.parse(YAML.load(File.read('test/responses/legacy_trip.yml')))
6
+ expected_causes = [
7
+ 'Без потерь, более чем за 2 ч., до отправления рейса. Возвращается 100% стоимости тарифа. Ориентировочная сумма возврата 550',
8
+ 'Добровольно, менее чем за 2 ч., до отправления рейса. Удерживается при возврате: 15% тарифа. Ориентировочная сумма возврата 425',
9
+ 'Возврат маршрутной квитанции в случае опоздания к отправлению (стоимость не возвращается). Удерживается при возврате: 100% тарифа. Ориентировочная сумма возврата 0',
10
+ 'Возврат маршрутной квитанции по отмене отправления т/с, задержки отправления т/с более чем на час и непредставления пассажиру указанного в билете места. СРОК ОБРАЩЕНИЯ для возврата билета 24 часа с времени отправления. . Возвращается 100% стоимости билета. Ориентировочная сумма возврата 550'
11
+ ]
12
+
13
+ assert_equal true, response.tariffs.first.return_cause.first.lossless
14
+ assert_equal expected_causes, response.tariffs.first.return_cause.map(&:cause)
15
+ end
16
+
17
+ def test_content_2
18
+ response = Gillbus::Trip.parse(YAML.load(File.read('test/responses/legacy_trip_2.yml')))
19
+ assert_equal ["Принудительно, при отмене рейса. Ориентировочная сумма возврата 1044.95RUB",
20
+ "Добровільно ДБ 4, менш ніж за 10 хвилин до відправлення рейсу. Ориентировочная сумма возврата 574.72RUB",
21
+ "ДБ 3, не менш ніж за 10 хвилин до відправлення рейсу. Ориентировочная сумма возврата 679.21RUB",
22
+ "Добровольно, более чем за 2 ч., до отправления рейса. Ориентировочная сумма возврата 783.71RUB",
23
+ "не менше ніж за 24 години до відправлення рейсу. Ориентировочная сумма возврата 888.2RUB"], response.tariffs.first.return_cause.map(&:cause)
24
+ end
25
+ end
@@ -0,0 +1,217 @@
1
+ ---
2
+ ID: '3436521222122325532'
3
+ RES_ID: '0'
4
+ NUMBER: STAGE - ATM 002 Москва - Киев
5
+ START_CITY_NAME: Москва
6
+ END_CITY_NAME: Киев Автовокзал "Центральный"
7
+ START_TIMEZONE:
8
+ END_TIMEZONE:
9
+ START_DATE: 10.06.2017
10
+ END_DATE: 11.06.2017
11
+ START_TIME: '21:20'
12
+ END_TIME: '15:30'
13
+ BUS_MODEL: 'Неоплан '
14
+ BUS_CLASS:
15
+ BUS_ID:
16
+ PLATFORM:
17
+ TRIP_SEATS_MAP: 'true'
18
+ SHOW_PICKUP_DROPOFF: 'false'
19
+ BRANDED: 'false'
20
+ HAS_TRANSFER: 'false'
21
+ PLACES_COUNT: '49'
22
+ FREE_PLACES_COUNT: '10'
23
+ FREE_BUSY_PLACES: 10/49
24
+ CARRIER_ID: 4A5DC2609C320E39E0530300F00A7BFB
25
+ CARRIER_NAME: '"АТМ Транс" ООО'
26
+ TIME_IN_ROAD: '18:10'
27
+ FAKE_TIME_IN_ROAD: 'false'
28
+ STATION_BEGIN_ID: 3206819326B763A8E0530300F00AA4FB
29
+ STATION_BEGIN_NAME: Международный автовокзал "Южные Ворота"
30
+ STATION_BEGIN_ADDRESS: '19-й км МКАД, владение 20, стр. 1, Москва, Россия
31
+
32
+ '
33
+ STATION_END_ID: 1C7DB38A37BCCE21E0508E5B35570395
34
+ STATION_END_NAME: Центральный автовокзал
35
+ STATION_END_ADDRESS: проспект Науки; дом 1/2
36
+ RESERVATION_ENABLED: 'false'
37
+ SALE_ENABLED: 'true'
38
+ RETURN_ENABLED: 'false'
39
+ TIME_FOR_CANCEL: '40'
40
+ TRIP_FULL_SALE: 'false'
41
+ CAN_DISCOUNT: 'true'
42
+ RECOMMENDED: 'false'
43
+ INTERNATIONAL: 'true'
44
+ JOIN_BOOK_BUY: 'true'
45
+ TRIP_MODE: '1'
46
+ SPECIAL_CONDITIONS:
47
+ IMAGE_URL: 'null'
48
+ START_POINT_TYPE: 'null'
49
+ VEHICLE_DESCRIPTION: 'null'
50
+ VEHICLE_FEATURES: 'null'
51
+ TOTAL_COST: '1044.95'
52
+ CURRENCY: RUB
53
+ CURRENCY_CODE: '643'
54
+ TARIFF:
55
+ SHORT_NAME: Y
56
+ FULL_NAME: Базовый тариф
57
+ START_DATE:
58
+ END_DATE:
59
+ DESCRIPTION: |+
60
+ Базовый тариф стоимости проезда одного пассажиров в одном направлении
61
+ В стоимость билета включена стоимость перевозки одного места багажа, весом до 30 кг., на 1 лицо и ручной поклажи весом до 5 кг. размером до 60х40х20 см. При превышении данных лимитов относительно веса и размеров, берется доплата как за дополнительный багаж. Дополнительный багаж перевозится при наличии свободного места в багажном отделении автобуса, за который берется доплата в размере 10 % от стоимости билета за одно дополнительное багажное место.
62
+
63
+ TIME_TO_BUY_RESERVED: '24'
64
+ TIME_TO_STOP_BOOKING: '48'
65
+ TIME_TO_PAY_RESERVATION:
66
+ COST: '1044.95'
67
+ INSURANCE_COST: '0'
68
+ INSURANCE_ID:
69
+ INSURANCE_SUM: '0'
70
+ INSURANCE_CUR:
71
+ AFTER_DISPATCH_NO_RETURN: 'true'
72
+ PASSENGER_BIRTHDAY:
73
+ PASSENGER_ISIC_NUMBER:
74
+ PASSENGER_STUDENT_TICKET:
75
+ NOTE:
76
+ RETURN_CAUSE:
77
+ - max_time: '10'
78
+ min_time: "-1440000"
79
+ percent: '0'
80
+ __content__: Принудительно, при отмене рейса. Ориентировочная сумма возврата 1044.95RUB
81
+ - max_time: '10'
82
+ min_time: '10'
83
+ percent: '45.00'
84
+ __content__: Добровільно ДБ 4, менш ніж за 10 хвилин до відправлення рейсу. Ориентировочная
85
+ сумма возврата 574.72RUB
86
+ - max_time: '120'
87
+ min_time: '10'
88
+ percent: '35.00'
89
+ __content__: ДБ 3, не менш ніж за 10 хвилин до відправлення рейсу. Ориентировочная
90
+ сумма возврата 679.21RUB
91
+ - max_time: '1440'
92
+ min_time: '120'
93
+ percent: '25.00'
94
+ __content__: Добровольно, более чем за 2 ч., до отправления рейса. Ориентировочная
95
+ сумма возврата 783.71RUB
96
+ - min_time: '1440'
97
+ percent: '15.00'
98
+ __content__: не менше ніж за 24 години до відправлення рейсу. Ориентировочная
99
+ сумма возврата 888.2RUB
100
+ PROMOTE: 'false'
101
+ POINT:
102
+ - NUMBER: '0'
103
+ GEOGRAPHY_NAME: Москва
104
+ NAME: Международный автовокзал "Южные Ворота"
105
+ ADDRESS: '19-й км МКАД, владение 20, стр. 1, Москва, Россия
106
+
107
+ '
108
+ TIMEZONE:
109
+ ARRIVAL_DATE: 10.06.2017
110
+ ARRIVAL_TIME:
111
+ DISPATCH_DATE: 10.06.2017
112
+ DISPATCH_TIME: '21:20'
113
+ CHECK_POINT: 'false'
114
+ DISTANCE: '0'
115
+ TRANSFER_POINT: 'false'
116
+ PLATFORM:
117
+ BUSMODEL: 'Неоплан '
118
+ - NUMBER: '1'
119
+ GEOGRAPHY_NAME: Москва
120
+ NAME: Автостанция "Красногвардейская"
121
+ ADDRESS: метро Красногвардейская; бульвар Ореховый; дом 24к1Г
122
+ TIMEZONE:
123
+ ARRIVAL_DATE: 10.06.2017
124
+ ARRIVAL_TIME: '21:40'
125
+ DISPATCH_DATE: 10.06.2017
126
+ DISPATCH_TIME: '22:00'
127
+ CHECK_POINT: 'false'
128
+ DISTANCE: '5'
129
+ TRANSFER_POINT: 'false'
130
+ PLATFORM:
131
+ BUSMODEL: 'Неоплан '
132
+ - NUMBER: '2'
133
+ GEOGRAPHY_NAME: Орел
134
+ NAME: Автовокзал "Орел"
135
+ ADDRESS: улица Автовокзальная; дом 1
136
+ TIMEZONE:
137
+ ARRIVAL_DATE: 11.06.2017
138
+ ARRIVAL_TIME: '05:05'
139
+ DISPATCH_DATE: 11.06.2017
140
+ DISPATCH_TIME: '05:30'
141
+ CHECK_POINT: 'false'
142
+ DISTANCE: '371'
143
+ TRANSFER_POINT: 'false'
144
+ PLATFORM:
145
+ BUSMODEL: 'Неоплан '
146
+ - NUMBER: '3'
147
+ GEOGRAPHY_NAME: Железногорск
148
+ NAME: Автовокзал "Железногорск"
149
+ ADDRESS: улица Советской Армии; дом 8
150
+ TIMEZONE:
151
+ ARRIVAL_DATE: 11.06.2017
152
+ ARRIVAL_TIME: '07:20'
153
+ DISPATCH_DATE: 11.06.2017
154
+ DISPATCH_TIME: '07:30'
155
+ CHECK_POINT: 'false'
156
+ DISTANCE: '466'
157
+ TRANSFER_POINT: 'false'
158
+ PLATFORM:
159
+ BUSMODEL: 'Неоплан '
160
+ - NUMBER: '4'
161
+ GEOGRAPHY_NAME: Хомутовка
162
+ NAME: АС
163
+ ADDRESS: ул. Ленина, 5
164
+ TIMEZONE:
165
+ ARRIVAL_DATE: 11.06.2017
166
+ ARRIVAL_TIME: '08:45'
167
+ DISPATCH_DATE: 11.06.2017
168
+ DISPATCH_TIME: '08:50'
169
+ CHECK_POINT: 'false'
170
+ DISTANCE: '534'
171
+ TRANSFER_POINT: 'false'
172
+ PLATFORM:
173
+ BUSMODEL: 'Неоплан '
174
+ - NUMBER: '5'
175
+ GEOGRAPHY_NAME: Бачевск КПП(Украина-Россия)
176
+ NAME:
177
+ ADDRESS:
178
+ TIMEZONE:
179
+ ARRIVAL_DATE: 11.06.2017
180
+ ARRIVAL_TIME: '09:05'
181
+ DISPATCH_DATE: 11.06.2017
182
+ DISPATCH_TIME: '09:45'
183
+ CHECK_POINT: 'true'
184
+ DISTANCE: '557'
185
+ TRANSFER_POINT: 'false'
186
+ PLATFORM:
187
+ BUSMODEL: 'Неоплан '
188
+ - NUMBER: '6'
189
+ GEOGRAPHY_NAME: Глухов
190
+ NAME: Остановка Глухов
191
+ ADDRESS: улица Путивльская; дом 39А
192
+ TIMEZONE:
193
+ ARRIVAL_DATE: 11.06.2017
194
+ ARRIVAL_TIME: '10:15'
195
+ DISPATCH_DATE: 11.06.2017
196
+ DISPATCH_TIME: '10:35'
197
+ CHECK_POINT: 'false'
198
+ DISTANCE: '594'
199
+ TRANSFER_POINT: 'false'
200
+ PLATFORM:
201
+ BUSMODEL: 'Неоплан '
202
+ - NUMBER: '7'
203
+ GEOGRAPHY_NAME: Киев
204
+ NAME: Центральный автовокзал
205
+ ADDRESS: проспект Науки; дом 1/2
206
+ TIMEZONE:
207
+ ARRIVAL_DATE: 11.06.2017
208
+ ARRIVAL_TIME: '15:30'
209
+ DISPATCH_DATE: 11.06.2017
210
+ DISPATCH_TIME: '16:00'
211
+ CHECK_POINT: 'false'
212
+ DISTANCE: '914'
213
+ TRANSFER_POINT: 'false'
214
+ PLATFORM:
215
+ BUSMODEL: 'Неоплан '
216
+ EXTRA_CHARGE: '0.0'
217
+
@@ -84,6 +84,7 @@ class SearchTripsResponseTest < Minitest::Test
84
84
 
85
85
  def test_fields_parsing
86
86
  response = get_successful_search_trips
87
+ assert_equal '3451212695530327295', response.trips.first.id
87
88
  assert_equal Date.new(2014, 8, 23), response.trips.first.start_date
88
89
  assert_equal Money.new(1410_00, 'RUB'), response.trips.first.total_cost
89
90
  assert_equal Money.new(1410_00, 'RUB'), response.trips.first.tariffs.first.cost
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gillbus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.6
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey "codesnik" Trofimenko
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-04-27 00:00:00.000000000 Z
12
+ date: 2018-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -68,19 +68,19 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
- name: multi_xml
71
+ name: ox
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - ">="
74
+ - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0'
76
+ version: '2.9'
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
- version: '0'
83
+ version: '2.9'
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: bundler
86
86
  requirement: !ruby/object:Gem::Requirement
@@ -237,6 +237,7 @@ files:
237
237
  - test/get_trip_seats_test.rb
238
238
  - test/get_trip_segments_test.rb
239
239
  - test/lock_seats_test.rb
240
+ - test/parse_trip_test.rb
240
241
  - test/reserve_tickets_test.rb
241
242
  - test/responses/bookingDifferentCurrencies.xml
242
243
  - test/responses/buyBooking.xml
@@ -253,6 +254,7 @@ files:
253
254
  - test/responses/getTripSeats-segments.xml
254
255
  - test/responses/getTripSeats.xml
255
256
  - test/responses/getTripSegments.xml
257
+ - test/responses/legacy_trip_2.yml
256
258
  - test/responses/lockSeats.xml
257
259
  - test/responses/reserveTickets.xml
258
260
  - test/responses/reserveTickets.yml
@@ -313,6 +315,7 @@ test_files:
313
315
  - test/get_trip_seats_test.rb
314
316
  - test/get_trip_segments_test.rb
315
317
  - test/lock_seats_test.rb
318
+ - test/parse_trip_test.rb
316
319
  - test/reserve_tickets_test.rb
317
320
  - test/responses/bookingDifferentCurrencies.xml
318
321
  - test/responses/buyBooking.xml
@@ -329,6 +332,7 @@ test_files:
329
332
  - test/responses/getTripSeats-segments.xml
330
333
  - test/responses/getTripSeats.xml
331
334
  - test/responses/getTripSegments.xml
335
+ - test/responses/legacy_trip_2.yml
332
336
  - test/responses/lockSeats.xml
333
337
  - test/responses/reserveTickets.xml
334
338
  - test/responses/reserveTickets.yml