touringplans 0.2.9 → 0.3.1

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: b4a5e0a87f8867cbaa7be8227ac9eb882f54f31cebcd2c6ecb41349ef2771bbe
4
- data.tar.gz: 862facc7e52628971cef5a425647537a11558329acc81856c7854a246a7ce39f
3
+ metadata.gz: 23b9e7a9427dc9c29f110192664421209833190bd7f2036dc44d03bbf9cee89b
4
+ data.tar.gz: 1fd63dfcd635132295b7914f79b41342f3c9ca1e56de5ab2d4afc56f14a54b11
5
5
  SHA512:
6
- metadata.gz: 3471c89d2e5486077d1b133578fad58bdb0be3d0db12fb72a98e9864f86e4a8a078599ccca7b9ea25d58ede468e8d1136da3ced631114344d63eeae31c64bff8
7
- data.tar.gz: fa0d2478a3b533959a056e7656223d7e659fd356848edc13ecfec6a579be5e448402fb087fe63079edee9b8423e57103579c88bcc4913c6670e3ba262f2cd382
6
+ metadata.gz: 73cf31a52342039349a62edd41100d566f6012365b2a226a52289971519d86452f5c633baaf85d5e0d3bdf7f6b04778c4ebfa7959d9358a8805f3185ddfc395b
7
+ data.tar.gz: 89b41c5db23cf5140a5a91f98b4b3973669c9bae197e2cfa3896e8cf901a9a2163d2ab736ea3d3b1372a74cd24c3a19d86a155941cff457399c2faaa5efdf6c0
data/.version CHANGED
@@ -1 +1 @@
1
- 0.2.9
1
+ 0.3.1
data/lib/routes.yml CHANGED
@@ -419,6 +419,9 @@ epcot_attractions_mission_space_orange:
419
419
  epcot_attractions_reflections_of_china:
420
420
  method: get
421
421
  path: "/epcot/attractions/reflections-of-china.json"
422
+ epcot_attractions_remys_ratatouille_adventure:
423
+ method: get
424
+ path: "/epcot/attractions/remys-ratatouille-adventure.json"
422
425
  epcot_attractions_the_seas_main_tank_and_exhibits:
423
426
  method: get
424
427
  path: "/epcot/attractions/the-seas-main-tank-and-exhibits.json"
@@ -800,3 +803,117 @@ hollywood_studios_dining_roundup_rodeo_bbq:
800
803
  hollywood_studios_dining_scifi_dine_in_theater_restaurant:
801
804
  method: get
802
805
  path: "/hollywood-studios/dining/scifi-dine-in-theater-restaurant.json"
806
+ walt_disney_world_hotels_fort_wilderness_campsites:
807
+ method: get
808
+ path: "/walt-disney-world/hotels/fort-wilderness-campsites.json"
809
+ walt_disney_world_hotels_disneys_animal_kingdom_lodge:
810
+ method: get
811
+ path: "/walt-disney-world/hotels/disneys-animal-kingdom-lodge.json"
812
+ walt_disney_world_hotels_disneys_beach_club_resort:
813
+ method: get
814
+ path: "/walt-disney-world/hotels/disneys-beach-club-resort.json"
815
+ walt_disney_world_hotels_disneys_boardwalk_inn:
816
+ method: get
817
+ path: "/walt-disney-world/hotels/disneys-boardwalk-inn.json"
818
+ walt_disney_world_hotels_disneys_contemporary_resort:
819
+ method: get
820
+ path: "/walt-disney-world/hotels/disneys-contemporary-resort.json"
821
+ walt_disney_world_hotels_disneys_grand_floridian_resort:
822
+ method: get
823
+ path: "/walt-disney-world/hotels/disneys-grand-floridian-resort.json"
824
+ walt_disney_world_hotels_disneys_polynesian_resort:
825
+ method: get
826
+ path: "/walt-disney-world/hotels/disneys-polynesian-resort.json"
827
+ walt_disney_world_hotels_disneys_wilderness_lodge:
828
+ method: get
829
+ path: "/walt-disney-world/hotels/disneys-wilderness-lodge.json"
830
+ walt_disney_world_hotels_disneys_yacht_club_resort:
831
+ method: get
832
+ path: "/walt-disney-world/hotels/disneys-yacht-club-resort.json"
833
+ walt_disney_world_hotels_shades_of_green_at_walt_disney_world:
834
+ method: get
835
+ path: "/walt-disney-world/hotels/shades-of-green-at-walt-disney-world.json"
836
+ walt_disney_world_hotels_star_wars_galactic_starcruiser:
837
+ method: get
838
+ path: "/walt-disney-world/hotels/star-wars-galactic-starcruiser.json"
839
+ walt_disney_world_hotels_dolphin_at_walt_disney_world:
840
+ method: get
841
+ path: "/walt-disney-world/hotels/dolphin-at-walt-disney-world.json"
842
+ walt_disney_world_hotels_swan_at_walt_disney_world:
843
+ method: get
844
+ path: "/walt-disney-world/hotels/swan-at-walt-disney-world.json"
845
+ walt_disney_world_hotels_disney_world_swan_reserve:
846
+ method: get
847
+ path: "/walt-disney-world/hotels/disney-world-swan-reserve.json"
848
+ walt_disney_world_hotels_bay_lake_tower_at_disneys_contemporary_resort:
849
+ method: get
850
+ path: "/walt-disney-world/hotels/bay-lake-tower-at-disneys-contemporary-resort.json"
851
+ walt_disney_world_hotels_disneys_wilderness_lodge_villas:
852
+ method: get
853
+ path: "/walt-disney-world/hotels/disneys-wilderness-lodge-villas.json"
854
+ walt_disney_world_hotels_copper_creek_villas:
855
+ method: get
856
+ path: "/walt-disney-world/hotels/copper-creek-villas.json"
857
+ walt_disney_world_hotels_animal_kingdom_villas_jambo:
858
+ method: get
859
+ path: "/walt-disney-world/hotels/animal-kingdom-villas-jambo.json"
860
+ walt_disney_world_hotels_disneys_animal_kingdom_villas:
861
+ method: get
862
+ path: "/walt-disney-world/hotels/disneys-animal-kingdom-villas.json"
863
+ walt_disney_world_hotels_disneys_beach_club_villas:
864
+ method: get
865
+ path: "/walt-disney-world/hotels/disneys-beach-club-villas.json"
866
+ walt_disney_world_hotels_disneys_boardwalk_villas:
867
+ method: get
868
+ path: "/walt-disney-world/hotels/disneys-boardwalk-villas.json"
869
+ walt_disney_world_hotels_disneys_old_key_west_resort:
870
+ method: get
871
+ path: "/walt-disney-world/hotels/disneys-old-key-west-resort.json"
872
+ walt_disney_world_hotels_disneys_polynesian_villas_bungalows:
873
+ method: get
874
+ path: "/walt-disney-world/hotels/disneys-polynesian-villas-bungalows.json"
875
+ walt_disney_world_hotels_disneys_riviera_resort:
876
+ method: get
877
+ path: "/walt-disney-world/hotels/disneys-riviera-resort.json"
878
+ walt_disney_world_hotels_disneys_saratoga_springs_resort_spa:
879
+ method: get
880
+ path: "/walt-disney-world/hotels/disneys-saratoga-springs-resort-spa.json"
881
+ walt_disney_world_hotels_disney_reflections:
882
+ method: get
883
+ path: "/walt-disney-world/hotels/disney-reflections.json"
884
+ walt_disney_world_hotels_the_villas_at_disneys_grand_floridian_resort_and_spa:
885
+ method: get
886
+ path: "/walt-disney-world/hotels/the-villas-at-disneys-grand-floridian-resort-and-spa.json"
887
+ walt_disney_world_hotels_treehouse_villas_at_disneys_saratoga_springs_resort:
888
+ method: get
889
+ path: "/walt-disney-world/hotels/treehouse-villas-at-disneys-saratoga-springs-resort.json"
890
+ walt_disney_world_hotels_disneys_caribbean_beach_resort:
891
+ method: get
892
+ path: "/walt-disney-world/hotels/disneys-caribbean-beach-resort.json"
893
+ walt_disney_world_hotels_disneys_coronado_springs_resort:
894
+ method: get
895
+ path: "/walt-disney-world/hotels/disneys-coronado-springs-resort.json"
896
+ walt_disney_world_hotels_disneys_port_orleans_resort_french_quarter:
897
+ method: get
898
+ path: "/walt-disney-world/hotels/disneys-port-orleans-resort-french-quarter.json"
899
+ walt_disney_world_hotels_disneys_port_orleans_resort_riverside:
900
+ method: get
901
+ path: "/walt-disney-world/hotels/disneys-port-orleans-resort-riverside.json"
902
+ walt_disney_world_hotels_fort_wilderness_resort_cabins:
903
+ method: get
904
+ path: "/walt-disney-world/hotels/fort-wilderness-resort-cabins.json"
905
+ walt_disney_world_hotels_disneys_all_star_movies_resort:
906
+ method: get
907
+ path: "/walt-disney-world/hotels/disneys-all-star-movies-resort.json"
908
+ walt_disney_world_hotels_disneys_all_star_music_resort:
909
+ method: get
910
+ path: "/walt-disney-world/hotels/disneys-all-star-music-resort.json"
911
+ walt_disney_world_hotels_disneys_all_star_sports_resort:
912
+ method: get
913
+ path: "/walt-disney-world/hotels/disneys-all-star-sports-resort.json"
914
+ walt_disney_world_hotels_disneys_art_of_animation_resort:
915
+ method: get
916
+ path: "/walt-disney-world/hotels/disneys-art-of-animation-resort.json"
917
+ walt_disney_world_hotels_disneys_pop_century_resort:
918
+ method: get
919
+ path: "/walt-disney-world/hotels/disneys-pop-century-resort.json"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Touringplans
4
- VERSION = "0.2.9"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/touringplans.rb CHANGED
@@ -12,16 +12,6 @@ module Touringplans
12
12
  include Dry.Types()
13
13
  end
14
14
 
15
- GEM_ROOT = File.expand_path("../", __FILE__)
16
-
17
- include HTTParty
18
- # currently Touring Plans has no verision in its API
19
- DEFAULT_API_VERSION = "1"
20
- DEFAULT_BASE_URI = "https://touringplans.com/"
21
- DEFAULT_QUERY = {}
22
-
23
- base_uri DEFAULT_BASE_URI
24
-
25
15
  ROUTES = {
26
16
  magic_kingdom_dining: {
27
17
  method: "get",
@@ -82,13 +72,13 @@ module Touringplans
82
72
  walt_disney_world_disney_springs_resorts: {
83
73
  method: "get",
84
74
  path: "/walt-disney-world/hotels.json"
85
- },
86
- }
75
+ }
76
+ }.freeze
87
77
 
88
78
  def self.routes
89
79
  ROUTES
90
80
  end
91
-
81
+
92
82
  # deals solely with how to create access to the resource, the lock of "lock & key"
93
83
  class Connection
94
84
  # concerned only on where it gets the info it needs
@@ -98,6 +88,7 @@ module Touringplans
98
88
  # currently Touring Plans has no verision in its API
99
89
  DEFAULT_API_VERSION = "1"
100
90
  DEFAULT_BASE_URI = "https://touringplans.com/"
91
+ # do not freeze DEFAULT_QUERY
101
92
  DEFAULT_QUERY = {}
102
93
 
103
94
  base_uri DEFAULT_BASE_URI
@@ -160,12 +151,13 @@ module Touringplans
160
151
  end
161
152
  end
162
153
 
154
+ # Generates and updates routes for all types of venues in a YAML document.
163
155
  class RoutesTable
164
- require 'fileutils'
165
- def initialize(filename: "routes_table.yml")
166
- @filename = filename
156
+ require "fileutils"
157
+ def initialize(filename: "routes_table.yml")
158
+ @filename = filename
167
159
  end
168
-
160
+
169
161
  def self.original_routes
170
162
  # this method exists so that we can create a yaml file of routes
171
163
  tpr = Touringplans.routes
@@ -179,9 +171,9 @@ module Touringplans
179
171
  # # create new hash with string keys
180
172
  # string_keys.zip(rt_values).to_h
181
173
  end
182
-
174
+
183
175
  def self.symbolize_keys(hash)
184
- hash.inject({}){|result, (key, value)|
176
+ hash.each_with_object({}) do |(key, value), result|
185
177
  new_key = case key
186
178
  when String then key.to_sym
187
179
  else key
@@ -191,13 +183,12 @@ module Touringplans
191
183
  else value
192
184
  end
193
185
  result[new_key] = new_value
194
- result
195
- }
186
+ end
196
187
  end
197
188
 
198
189
  def self.stringify_keys(hash)
199
190
  # inspired by https://avdi.codes/recursively-symbolize-keys/
200
- hash.inject({}){|result, (key, value)|
191
+ hash.each_with_object({}) do |(key, value), result|
201
192
  new_key = case key
202
193
  when Symbol then key.to_s
203
194
  else key
@@ -207,22 +198,20 @@ module Touringplans
207
198
  else value
208
199
  end
209
200
  result[new_key] = new_value
210
- result
211
- }
212
- end
201
+ end
202
+ end
213
203
 
214
204
  def self.load_routes_file(routes_relative_file_path: "/routes.yml")
215
- tp_path = $LOAD_PATH.grep(/touringplans/).last
216
- routes_file = "#{tp_path}#{routes_relative_file_path}"
217
- YAML.load(File.read(routes_file))
205
+ tp_path = $LOAD_PATH.grep(/touringplans/).last
206
+ routes_file = "#{tp_path}#{routes_relative_file_path}"
207
+ YAML.safe_load(File.read(routes_file))
218
208
  end
219
-
220
-
209
+
221
210
  def self.update_file
222
211
  # gather info into hashes
223
212
  attractions_routes = _generate_interest_routes_hash("attractions")
224
213
  dining_routes = _generate_interest_routes_hash("dining")
225
- hotels_routes = {} #_generate_interest_routes_hash("hotels")
214
+ hotels_routes = _generate_interest_routes_hash("hotels")
226
215
  updated_routes = original_routes.merge(attractions_routes, dining_routes, hotels_routes)
227
216
 
228
217
  updated_routes_yaml = _convert_hash_to_yaml(updated_routes)
@@ -233,12 +222,13 @@ module Touringplans
233
222
 
234
223
  def self._initialize_file
235
224
  # delete old file if it exits
236
- lib_dir = FileUtils.getwd() + "/lib"
225
+ lib_dir = FileUtils.getwd + "/lib"
237
226
  routes_file = "#{lib_dir}/routes.yml"
238
227
 
239
228
  # ensure the file exists
240
229
  touched_routes_file_array = FileUtils.touch(routes_file)
241
- touched_routes_file = touched_routes_file_array.first
230
+ # we want the first string value
231
+ touched_routes_file_array.first
242
232
  end
243
233
 
244
234
  def self._generate_interest_routes_hash(interest)
@@ -246,7 +236,7 @@ module Touringplans
246
236
  interest_routes = {}
247
237
 
248
238
  interest_venues.each do |iv|
249
- new_route = self._generate_interest_route(iv.venue_permalink, interest, iv.permalink)
239
+ new_route = _generate_interest_route(iv.venue_permalink, interest, iv.permalink)
250
240
  key = new_route.keys.first
251
241
  values = new_route[key]
252
242
  interest_routes[key] = values
@@ -254,7 +244,7 @@ module Touringplans
254
244
 
255
245
  interest_routes
256
246
  end
257
-
247
+
258
248
  def self._generate_interest_route(venue_permalink, interest_permalink, place_permalink)
259
249
  # {magic_kingdom_attractions_haunted_mansion: {
260
250
  # method: "get",
@@ -267,12 +257,8 @@ module Touringplans
267
257
  method = "get"
268
258
  format = "json"
269
259
 
270
- hash = { key => { "method".to_s => "get",
271
- "path".to_s => "#{path}.#{format}"
272
- }
273
- }
274
-
275
- hash
260
+ { key => { "method".to_s => method,
261
+ "path".to_s => "#{path}.#{format}" } }
276
262
  end
277
263
 
278
264
  def self._convert_hash_to_yaml(hash)
@@ -284,13 +270,13 @@ module Touringplans
284
270
  new_file.write(content)
285
271
  new_file.close
286
272
  end
287
-
273
+
288
274
  def self._read_file_to_terminal(file)
289
275
  new_file = File.open(file, "r")
290
276
  new_file.close
291
277
  end
292
-
293
278
  end
279
+
294
280
  # model with the attributes
295
281
  class CounterServiceLocation < Dry::Struct
296
282
  transform_keys(&:to_sym)
@@ -350,7 +336,7 @@ module Touringplans
350
336
  attribute :kosher_available, Types::Params::Bool
351
337
  attribute :dinable_id, Types::Params::Integer
352
338
  attribute :dinable_type, Types::String.optional
353
- attribute :venue_permalink, Types::String.optional
339
+ attribute :venue_permalink, Types::String.optional
354
340
  end
355
341
 
356
342
  # model with the attributes
@@ -383,11 +369,11 @@ module Touringplans
383
369
  attribute :house_specialties, Types::String.optional
384
370
  attribute :counter_quality_rating, Types::String.optional
385
371
  attribute :counter_value_rating, Types::String.optional
386
- attribute :table_quality_rating, Types::Params::Decimal.optional
387
- attribute :table_value_rating, Types::Params::Decimal.optional
388
- attribute :overall_rating, Types::Params::Decimal.optional
389
- attribute :service_rating, Types::Params::Decimal.optional
390
- attribute :friendliness_rating, Types::Params::Decimal.optional
372
+ attribute :table_quality_rating, Types::Params::Float.optional
373
+ attribute :table_value_rating, Types::Params::Float.optional
374
+ attribute :overall_rating, Types::Params::Float.optional
375
+ attribute :service_rating, Types::Params::Float.optional
376
+ attribute :friendliness_rating, Types::Params::Float.optional
391
377
  attribute :adult_breakfast_menu_url, Types::String.optional
392
378
  attribute :adult_lunch_menu_url, Types::String.optional
393
379
  attribute :adult_dinner_menu_url, Types::String.optional
@@ -415,6 +401,70 @@ module Touringplans
415
401
  attribute :venue_permalink, Types::String.optional
416
402
  end
417
403
 
404
+ # model with the attributes
405
+ class DiningVenueFull < Dry::Struct
406
+ transform_keys(&:to_sym)
407
+
408
+ attribute :name, Types::String
409
+ attribute :permalink, Types::String
410
+ attribute :category_code, Types::String
411
+ attribute :portion_size, Types::String.optional
412
+ attribute :cost_code, Types::String.optional
413
+ attribute :cuisine, Types::String
414
+ attribute :phone_number, Types::String.optional
415
+ attribute :entree_range, Types::String.optional
416
+ attribute :when_to_go, Types::String.optional
417
+ attribute :parking, Types::String.optional
418
+ attribute :bar, Types::String.optional
419
+ attribute :wine_list, Types::String.optional
420
+ attribute :dress, Types::String.optional
421
+ attribute :awards, Types::String.optional
422
+ attribute :breakfast_hours, Types::String.optional
423
+ attribute :lunch_hours, Types::String.optional
424
+ attribute :dinner_hours, Types::String.optional
425
+ attribute :house_specialties, Types::String.optional
426
+ attribute :counter_quality_rating, Types::String.optional
427
+ attribute :counter_value_rating, Types::String.optional
428
+ attribute :table_quality_rating, Types::Float.optional
429
+ attribute :table_value_rating, Types::Float.optional
430
+ attribute :overall_rating, Types::Float.optional
431
+ attribute :service_rating, Types::Float.optional
432
+ attribute :friendliness_rating, Types::Float.optional
433
+ attribute :adult_breakfast_menu_url, Types::String.optional
434
+ attribute :adult_lunch_menu_url, Types::String.optional
435
+ attribute :adult_dinner_menu_url, Types::String.optional
436
+ attribute :child_breakfast_menu_url, Types::String.optional
437
+ attribute :child_lunch_menu_url, Types::String.optional
438
+ attribute :child_dinner_menu_url, Types::String.optional
439
+ attribute :requires_credit_card, Types::Params::Bool
440
+ attribute :requires_pre_payment, Types::Params::Bool
441
+ attribute :created_at, Types::Params::DateTime
442
+ attribute :updated_at, Types::Params::DateTime
443
+ attribute :extinct_on, Types::Params::DateTime.optional
444
+ attribute :opened_on, Types::Params::DateTime.optional
445
+ attribute :disney_permalink, Types::String.optional
446
+ attribute :code, Types::String.optional
447
+ attribute :short_name, Types::String.optional
448
+ attribute :accepts_reservations, Types::Params::Bool
449
+ attribute :kosher_available, Types::Params::Bool
450
+
451
+ attribute :operator_id, Types::Integer
452
+ attribute :operator_url, Types::String.optional
453
+ attribute :operator_type, Types::String.optional
454
+ attribute :walking_time_proxy_id, Types::String.optional
455
+ attribute :sort_name, Types::String.optional
456
+ attribute :mobile_ordering, Types::Bool.optional
457
+ attribute :extinct_on_uncertain, Types::String.optional
458
+ attribute :opened_on_uncertain, Types::String.optional
459
+ attribute :opened_on_known, Types::String.optional
460
+ attribute :operational_notes, Types::String.optional
461
+ attribute :latitude, Types::String.optional
462
+ attribute :longitude, Types::String.optional
463
+ attribute :summary_at_top, Types::Bool.optional
464
+
465
+ end
466
+
467
+
418
468
  # model with the attributes
419
469
  class ParkAttraction < Dry::Struct
420
470
  transform_keys(&:to_sym)
@@ -423,7 +473,91 @@ module Touringplans
423
473
  attribute :short_name, Types::String
424
474
  attribute :permalink, Types::String
425
475
  attribute :venue_permalink, Types::String
426
-
476
+ end
477
+
478
+ # model with the attributes
479
+ class ParkAttractionFull < Dry::Struct
480
+ transform_keys(&:to_sym)
481
+
482
+ attribute :name, Types::String
483
+ attribute :fastpass_booth, Types::Bool
484
+ attribute :short_name, Types::String
485
+ attribute :created_at, Types::Params::DateTime
486
+ attribute :updated_at, Types::Params::DateTime
487
+ attribute :open_emh_morning, Types::Bool
488
+ attribute :open_emh_evening, Types::Bool
489
+ attribute :single_rider, Types::Bool
490
+ attribute :time_zone, Types::String
491
+ attribute :seasonal, Types::Bool
492
+ attribute :open_very_merry, Types::Bool
493
+ attribute :open_not_so_scary, Types::Bool
494
+ attribute :category_code, Types::String
495
+ attribute :duration, Types::Float
496
+ attribute :scheduled_code, Types::String.optional
497
+ attribute :what_it_is, Types::String
498
+ attribute :scope_and_scale_code, Types::String
499
+ attribute :when_to_go, Types::String
500
+ attribute :average_wait_per_hundred, Types::Float
501
+ attribute :average_wait_assumes, Types::String.optional
502
+ attribute :loading_speed, Types::String
503
+ attribute :probable_wait_time, Types::Float.optional
504
+ attribute :special_needs, Types::String.optional
505
+ attribute :height_restriction, Types::Float.optional
506
+ attribute :intense, Types::Bool
507
+ attribute :extinct_on, Types::Params::DateTime.optional
508
+ attribute :opened_on, Types::Params::DateTime.optional
509
+ attribute :frightening, Types::Bool
510
+ attribute :physical_considerations, Types::Bool
511
+ attribute :handheld_captioning, Types::Bool
512
+ attribute :video_captioning, Types::Bool
513
+ attribute :reflective_captioning, Types::Bool
514
+ attribute :assistive_listening, Types::Bool
515
+ attribute :audio_description, Types::Bool
516
+ attribute :wheelchair_transfer_code, Types::String
517
+ attribute :no_service_animals, Types::Bool
518
+ attribute :sign_language, Types::Bool
519
+ attribute :service_animal_check, Types::Bool
520
+ attribute :not_to_be_missed, Types::Bool
521
+ attribute :rider_swap, Types::Bool
522
+ attribute :ultimate_code, Types::String
523
+ attribute :ultimate_task, Types::String
524
+ attribute :park_entrance, Types::Bool
525
+ attribute :relative_open, Types::Bool.optional
526
+ attribute :relative_close, Types::Bool.optional
527
+ attribute :close_at_dusk, Types::Bool.optional
528
+ attribute :crowd_calendar_version, Types::Integer
529
+ attribute :match_name, Types::String
530
+ attribute :crazy_threshold, Types::Integer.optional
531
+ attribute :fastpass_only, Types::Bool
532
+ attribute :allow_showtimes_after_close, Types::Bool
533
+ attribute :disconnected_fastpass_booth, Types::Bool
534
+ attribute :arrive_before, Types::Bool.optional
535
+ attribute :arrive_before_fp, Types::Bool.optional
536
+ attribute :allow_time_restriction, Types::Bool
537
+ attribute :relative_open_to_sunset, Types::Bool.optional
538
+ attribute :relative_close_to_sunset, Types::Bool.optional
539
+ attribute :closing_round_code, Types::Bool.optional
540
+ attribute :walking_time_proxy_id, Types::Integer.optional
541
+ attribute :flexible_duration, Types::Bool
542
+ attribute :operator_id, Types::Integer
543
+ attribute :operator_type, Types::String
544
+ attribute :hide_app, Types::Bool
545
+ attribute :showtime_proxy_id, Types::Integer.optional
546
+ attribute :sort_name, Types::String
547
+ attribute :extinct_on_uncertain, Types::Bool.optional
548
+ attribute :opened_on_uncertain, Types::Bool.optional
549
+ attribute :ignore_scrapes, Types::Bool.optional
550
+ attribute :extra_cost, Types::Bool
551
+ attribute :climate_controlled, Types::Bool
552
+ attribute :wet, Types::Bool.optional
553
+ attribute :operational_notes, Types::String.optional
554
+ attribute :masthead_circle_x, Types::Integer
555
+ attribute :masthead_circle_y, Types::Integer
556
+ attribute :latitude, Types::String
557
+ attribute :longitude, Types::String
558
+ attribute :open_early, Types::Bool
559
+ attribute :themeparks_entity_id, Types::String
560
+ attribute :has_virtual_queue, Types::Bool
427
561
  end
428
562
 
429
563
  # model with the attributes
@@ -437,49 +571,78 @@ module Touringplans
437
571
  attribute :venue_permalink, Types::String.optional
438
572
  end
439
573
 
440
- PLACE_KEYS = %i[magic_kingdom
441
- animal_kingdom
442
- epcot
443
- hollywood_studios
444
- walt_disney_world
445
- ].freeze
446
- # {interest:"interest_type"}
447
- INTERESTS = %i[counter_services
448
- table_services
449
- attractions
450
- hotels
451
- campground
452
- deluxe_hotels
453
- deluxe_villas
454
- moderate_hotels
455
- value_hotels
456
- disney_springs_resorts
457
- ].freeze
458
- HOTEL_CATEGORIES = %i[campground
459
- deluxe_hotels
460
- deluxe_villas
461
- moderate_hotels
462
- value_hotels
463
- disney_springs_resorts]
574
+ # model with the attributes
575
+ class HotelFull < Dry::Struct
576
+ transform_keys(&:to_sym)
577
+
578
+ attribute :name, Types::String
579
+ attribute :address, Types::String
580
+ attribute :city, Types::String
581
+ attribute :state_code, Types::String
582
+ attribute :zip_code, Types::String
583
+ attribute :phone_number, Types::String
584
+ attribute :url, Types::String
585
+ attribute :off_site, Types::Bool
586
+ attribute :water_sports, Types::Bool
587
+ attribute :marina, Types::Bool
588
+ attribute :beach, Types::Bool
589
+ attribute :tennis, Types::Bool
590
+ attribute :biking, Types::Bool
591
+ attribute :suites, Types::Bool
592
+ attribute :concierge_floor, Types::Bool
593
+ attribute :room_service, Types::Bool
594
+ attribute :wired_internet, Types::Bool
595
+ attribute :wireless_internet, Types::Bool
596
+ attribute :num_rooms, Types::Integer
597
+ attribute :theme, Types::String
598
+ attribute :cost_range, Types::String
599
+ attribute :shuttle_to_parks, Types::Bool
600
+ attribute :cost_estimate, Types::String.optional
601
+ attribute :lodging_area_code, Types::String
602
+ attribute :category_code, Types::String
603
+ end
604
+
605
+ PLACE_KEYS = %i[magic_kingdom
606
+ animal_kingdom
607
+ epcot
608
+ hollywood_studios
609
+ walt_disney_world].freeze
610
+ # {interest:"interest_type"}
611
+ INTERESTS = %i[counter_services
612
+ table_services
613
+ dining
614
+ attractions
615
+ hotels
616
+ campground
617
+ deluxe_hotels
618
+ deluxe_villas
619
+ moderate_hotels
620
+ value_hotels
621
+ disney_springs_resorts].freeze
622
+ HOTEL_CATEGORIES = %i[campground
623
+ deluxe_hotels
624
+ deluxe_villas
625
+ moderate_hotels
626
+ value_hotels
627
+ disney_springs_resorts].freeze
464
628
 
465
629
  # list interest at location
466
630
  # current interest are "counter service" "table service", and "attractions"
467
631
  # current locations are the four parks
468
632
  def self.list(interest, location)
469
633
  return "The location is not on Disney property" unless PLACE_KEYS.include? _symbolize(location)
470
- return "The interest is not valid" unless INTERESTS.include? _symbolize(interest)
634
+ return "The interest is not valid" unless INTERESTS.include? _symbolize(interest)
471
635
 
472
636
  client = _setup_client
473
637
  listings = []
474
638
  interest_type = _determine_interest_type(interest)
475
- route = _assemble_route(location, interest_type)
639
+ route = _assemble_route(location, interest_type, "list")
476
640
  response = client.send(route).parsed_response
477
641
  listing_hashes = _collect_listing_hashes_from_response(interest, response)
478
642
  listing_hashes.each do |item|
479
- item["venue_permalink"] = location.to_s.downcase.gsub(" ", "-")
643
+ item["venue_permalink"] = location.to_s.downcase.gsub(" ", "-").gsub("_", "-")
480
644
  end
481
645
 
482
- listing_hashes
483
646
  listing_hashes.each do |hash|
484
647
  listing = _set_model_from_hash(interest, hash)
485
648
  listings << listing
@@ -522,22 +685,22 @@ module Touringplans
522
685
  places.flatten
523
686
  end
524
687
 
525
- def self.show(interest_type, short_name)
526
- return "The interest_type is not valid" unless %i[dining attractions hotels].include? _symbolize(interest_type)
527
-
528
- # get a list of every model of one kind of interest_type (dining, attractions, hotels)
529
- places = list_all(interest_type)
688
+ def self.show(place, interest_type, permalink)
689
+ # see specs for examples
690
+ return "The location is not on Disney property" unless PLACE_KEYS.include? _symbolize(place)
691
+ return "The interest_type is not valid" unless INTERESTS.include? _symbolize(interest_type)
530
692
 
531
- # filter by short_name
532
- places.find { |place| place.short_name == short_name }
693
+ client = _setup_client
694
+ route = _assemble_route(place, interest_type, permalink)
695
+ response = client.send(route).parsed_response
696
+ _set_model_from_hash(interest_type, response)
533
697
  end
534
698
 
535
699
  def self._setup_client
536
700
  connection = Connection.new
537
701
  connection.query(key: "HowdyLen")
538
- routes = Touringplans::RoutesTable.symbolize_keys(Touringplans::RoutesTable.load_routes_file)
702
+ routes = Touringplans::RoutesTable.symbolize_keys(Touringplans::RoutesTable.load_routes_file)
539
703
  Client.new(connection: connection, routes: routes)
540
-
541
704
  end
542
705
 
543
706
  def self._format_location_name(location_name)
@@ -549,8 +712,7 @@ module Touringplans
549
712
 
550
713
  interest_type = "dining" if interest == "counter services"
551
714
  interest_type = "dining" if interest == "table services"
552
- interest_type = "hotels" if %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts
553
- ].include? _symbolize(interest)
715
+ interest_type = "hotels" if %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts].include? _symbolize(interest)
554
716
 
555
717
  interest_type
556
718
  end
@@ -564,11 +726,16 @@ module Touringplans
564
726
  str.to_sym
565
727
  end
566
728
 
567
-
568
- def self._assemble_route(location, interest_type)
569
- formatted_location = location.to_s.downcase.gsub(" ", "_")
570
- formatted_interest_type = interest_type.to_s.downcase.gsub(" ", "_")
571
- "#{formatted_location}_#{formatted_interest_type}"
729
+ def self._assemble_route(collection, interest_type, venue)
730
+ # format route
731
+ collection = collection.to_s.downcase.gsub(" ", "_").gsub("-", "_")
732
+ interest_type = interest_type.to_s.downcase.gsub(" ", "_").gsub("-", "_")
733
+ venue = venue.to_s.downcase.gsub(" ", "_").gsub("-", "_")
734
+
735
+ route = [collection, interest_type, venue].join("_")
736
+ route = [collection, interest_type].join("_") if venue == "list"
737
+
738
+ route
572
739
  end
573
740
 
574
741
  def self._collect_listing_hashes_from_response(interest, response)
@@ -584,15 +751,13 @@ module Touringplans
584
751
 
585
752
  listing_hashes
586
753
  end
587
-
754
+
588
755
  def self.list_all_hotels(response_from_touringplans_hotels_url)
589
756
  listing_hashes = []
590
757
 
591
758
  response_from_touringplans_hotels_url.each do |child|
592
759
  child.each do |grandchild|
593
- if "#{grandchild.class}" == "Array"
594
- listing_hashes << grandchild
595
- end
760
+ listing_hashes << grandchild if grandchild.class.to_s == "Array"
596
761
  end
597
762
  end
598
763
 
@@ -600,39 +765,43 @@ module Touringplans
600
765
  end
601
766
 
602
767
  # search for hotels of a category_code
603
- def self.list_hotels_of_a_category(hotels, interest)
604
- hotel_categories = {campground:"campground", deluxe_hotels:"deluxe",
605
- deluxe_villas:"deluxe_villa", moderate_hotels:"moderate",
606
- value_hotels:"value", disney_springs_resorts: NilClass}
768
+ def self.list_hotels_of_a_category(hotels, interest)
769
+ hotel_categories = { campground: "campground", deluxe_hotels: "deluxe",
770
+ deluxe_villas: "deluxe_villa", moderate_hotels: "moderate",
771
+ value_hotels: "value", disney_springs_resorts: NilClass }
607
772
  # get a list of every hotel model
608
773
 
609
774
  # filter by category_code
610
- # disney springs category code is null. We need to find a rule for finding those that don't have any of the values of
775
+ # disney springs category code is null. We need to find a rule for finding those that don't have any of the values of
611
776
  # hotel categories
612
777
  if interest == "disney springs resorts"
613
- target_hotels = hotels.find_all { |hotel| hotel.category_code.class == NilClass }
614
-
778
+ hotels.find_all { |hotel| hotel.category_code.instance_of?(NilClass) }
779
+
615
780
  else
616
- target_hotels = hotels.find_all { |hotel| hotel.category_code == hotel_categories[_symbolize(interest)] }
617
-
618
- end
781
+ hotels.find_all { |hotel| hotel.category_code == hotel_categories[_symbolize(interest)] }
619
782
 
620
- target_hotels
783
+ end
621
784
  end
622
-
785
+
623
786
  def generate_route_table
624
787
  # initial_routes = ROUTES
625
-
626
788
  end
627
-
628
-
789
+
629
790
  def self._set_model_from_hash(interest, hash)
630
791
  hotel_categories = %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts hotels]
631
792
 
632
- listing = CounterServiceLocation.new(hash) if interest == "counter services"
633
- listing = TableServiceLocation.new(hash) if interest == "table services"
634
- listing = ParkAttraction.new(hash) if interest == "attractions"
635
- listing = Hotel.new(hash) if hotel_categories.include? _symbolize(interest)
793
+ if hash["permalink"].to_s.length > 1
794
+ listing = CounterServiceLocation.new(hash) if interest == "counter services"
795
+ listing = TableServiceLocation.new(hash) if interest == "table services"
796
+ listing = ParkAttraction.new(hash) if interest == "attractions"
797
+ listing = DiningVenueFull.new(hash) if interest == "dining"
798
+ listing = Hotel.new(hash) if hotel_categories.include? _symbolize(interest)
799
+ else
800
+ listing = DiningVenueFull.new(hash) if interest == "dining"
801
+ listing = ParkAttractionFull.new(hash) if interest == "attractions"
802
+ listing = HotelFull.new(hash) if hotel_categories.include? _symbolize(interest)
803
+ end
804
+
636
805
  listing
637
806
  end
638
807
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: touringplans
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - captproton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-14 00:00:00.000000000 Z
11
+ date: 2021-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print