touringplans 0.2.8 → 0.3.6

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: 18bdc82546dc61c15dedbeea0caa0c42d9337d98c19cd090f92aae6ee04bfa82
4
- data.tar.gz: c8ac7e30d3b70db10ecbf5d9b36b9b893ab594459a193754d4e605567f1a8c1c
3
+ metadata.gz: c9faa64dfb3990694d6e1df2f3960204f06259b8a351a6c0b8f903cddecab837
4
+ data.tar.gz: 51cc48038a1a405813c10887afd48a95aa2a39511dfefbcf3b31188a4e5e3a25
5
5
  SHA512:
6
- metadata.gz: e2f3c1221c397553267e76725e270ec4643c0ba0642b2d59809b07e82c3a9d10cb33af39a441092f43b425f1c2a75a8628419065d031abe0a83c7f8bf406d7dd
7
- data.tar.gz: 4b5f1dbb102c6391540c1354cfaea06fdc2750824f3ae5815f591645c0a242ac8d106aaef9752f73097b4274d79459474139a63810eed56171719aea27ece75d
6
+ metadata.gz: a891f6f431e1f7eedd8296ad8b27f51e6245ad71d9c794ff84967b656b61d3bd280931b67a5e6dd91f8b07f2c7cdcc3feb2ecfecef8b29fe3fdd8cd17e31e7c6
7
+ data.tar.gz: e7db10e55f39302e8d882632891a9e073c807a150278f8ba06827c3e0cbc91187a563c423fae951125747a130323b397f5cd9c3e32c8f2d82c12a9bc17455ba1
data/.version CHANGED
@@ -1 +1 @@
1
- 0.2.8
1
+ 0.3.6
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.8"
4
+ VERSION = "0.3.6"
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,25 +198,20 @@ module Touringplans
207
198
  else value
208
199
  end
209
200
  result[new_key] = new_value
210
- result
211
- }
212
- end
213
-
214
- def self.load_routes_file(routes_relative_file_path: "/lib/routes.yml")
215
- tp_path = $LOAD_PATH.grep(/touringplans/).first.split("/")
216
- tp_path.reject! {|k| k=="spec"}
217
- tp_path.pop
218
- tp_path = tp_path.join("/")
219
- routes_file = "#{tp_path}#{routes_relative_file_path}"
220
- YAML.load(File.read(routes_file))
201
+ end
202
+ end
203
+
204
+ def self.load_routes_file(routes_relative_file_path: "/routes.yml")
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))
221
208
  end
222
-
223
-
209
+
224
210
  def self.update_file
225
211
  # gather info into hashes
226
212
  attractions_routes = _generate_interest_routes_hash("attractions")
227
213
  dining_routes = _generate_interest_routes_hash("dining")
228
- hotels_routes = {} #_generate_interest_routes_hash("hotels")
214
+ hotels_routes = _generate_interest_routes_hash("hotels")
229
215
  updated_routes = original_routes.merge(attractions_routes, dining_routes, hotels_routes)
230
216
 
231
217
  updated_routes_yaml = _convert_hash_to_yaml(updated_routes)
@@ -236,12 +222,13 @@ module Touringplans
236
222
 
237
223
  def self._initialize_file
238
224
  # delete old file if it exits
239
- lib_dir = FileUtils.getwd() + "/lib"
225
+ lib_dir = FileUtils.getwd + "/lib"
240
226
  routes_file = "#{lib_dir}/routes.yml"
241
227
 
242
228
  # ensure the file exists
243
229
  touched_routes_file_array = FileUtils.touch(routes_file)
244
- touched_routes_file = touched_routes_file_array.first
230
+ # we want the first string value
231
+ touched_routes_file_array.first
245
232
  end
246
233
 
247
234
  def self._generate_interest_routes_hash(interest)
@@ -249,7 +236,7 @@ module Touringplans
249
236
  interest_routes = {}
250
237
 
251
238
  interest_venues.each do |iv|
252
- new_route = self._generate_interest_route(iv.venue_permalink, interest, iv.permalink)
239
+ new_route = _generate_interest_route(iv.venue_permalink, interest, iv.permalink)
253
240
  key = new_route.keys.first
254
241
  values = new_route[key]
255
242
  interest_routes[key] = values
@@ -257,7 +244,7 @@ module Touringplans
257
244
 
258
245
  interest_routes
259
246
  end
260
-
247
+
261
248
  def self._generate_interest_route(venue_permalink, interest_permalink, place_permalink)
262
249
  # {magic_kingdom_attractions_haunted_mansion: {
263
250
  # method: "get",
@@ -270,12 +257,8 @@ module Touringplans
270
257
  method = "get"
271
258
  format = "json"
272
259
 
273
- hash = { key => { "method".to_s => "get",
274
- "path".to_s => "#{path}.#{format}"
275
- }
276
- }
277
-
278
- hash
260
+ { key => { "method".to_s => method,
261
+ "path".to_s => "#{path}.#{format}" } }
279
262
  end
280
263
 
281
264
  def self._convert_hash_to_yaml(hash)
@@ -287,13 +270,13 @@ module Touringplans
287
270
  new_file.write(content)
288
271
  new_file.close
289
272
  end
290
-
273
+
291
274
  def self._read_file_to_terminal(file)
292
275
  new_file = File.open(file, "r")
293
276
  new_file.close
294
277
  end
295
-
296
278
  end
279
+
297
280
  # model with the attributes
298
281
  class CounterServiceLocation < Dry::Struct
299
282
  transform_keys(&:to_sym)
@@ -353,7 +336,7 @@ module Touringplans
353
336
  attribute :kosher_available, Types::Params::Bool
354
337
  attribute :dinable_id, Types::Params::Integer
355
338
  attribute :dinable_type, Types::String.optional
356
- attribute :venue_permalink, Types::String.optional
339
+ attribute :venue_permalink, Types::String.optional
357
340
  end
358
341
 
359
342
  # model with the attributes
@@ -386,11 +369,11 @@ module Touringplans
386
369
  attribute :house_specialties, Types::String.optional
387
370
  attribute :counter_quality_rating, Types::String.optional
388
371
  attribute :counter_value_rating, Types::String.optional
389
- attribute :table_quality_rating, Types::Params::Decimal.optional
390
- attribute :table_value_rating, Types::Params::Decimal.optional
391
- attribute :overall_rating, Types::Params::Decimal.optional
392
- attribute :service_rating, Types::Params::Decimal.optional
393
- 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
394
377
  attribute :adult_breakfast_menu_url, Types::String.optional
395
378
  attribute :adult_lunch_menu_url, Types::String.optional
396
379
  attribute :adult_dinner_menu_url, Types::String.optional
@@ -418,6 +401,69 @@ module Touringplans
418
401
  attribute :venue_permalink, Types::String.optional
419
402
  end
420
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
+ attribute :operator_id, Types::Coercible::Integer.optional
451
+ attribute :operator_url, Types::String.optional
452
+ attribute :operator_type, Types::String.optional
453
+ attribute :walking_time_proxy_id, Types::Integer.optional
454
+ attribute :sort_name, Types::String.optional
455
+ attribute :mobile_ordering, Types::Bool.optional
456
+ attribute :extinct_on_uncertain, Types::String.optional
457
+ attribute :opened_on_uncertain, Types::String.optional
458
+ attribute :opened_on_known, Types::String.optional
459
+ attribute :operational_notes, Types::String.optional
460
+ attribute :latitude, Types::String.optional
461
+ attribute :longitude, Types::String.optional
462
+ attribute :summary_at_top, Types::Bool.optional
463
+
464
+ end
465
+
466
+
421
467
  # model with the attributes
422
468
  class ParkAttraction < Dry::Struct
423
469
  transform_keys(&:to_sym)
@@ -426,7 +472,91 @@ module Touringplans
426
472
  attribute :short_name, Types::String
427
473
  attribute :permalink, Types::String
428
474
  attribute :venue_permalink, Types::String
429
-
475
+ end
476
+
477
+ # model with the attributes
478
+ class ParkAttractionFull < Dry::Struct
479
+ transform_keys(&:to_sym)
480
+
481
+ attribute :name, Types::String
482
+ attribute :fastpass_booth, Types::Bool
483
+ attribute :short_name, Types::String.optional
484
+ attribute :created_at, Types::Params::DateTime
485
+ attribute :updated_at, Types::Params::DateTime
486
+ attribute :open_emh_morning, Types::Bool
487
+ attribute :open_emh_evening, Types::Bool
488
+ attribute :single_rider, Types::Bool
489
+ attribute :time_zone, Types::String.optional
490
+ attribute :seasonal, Types::Bool
491
+ attribute :open_very_merry, Types::Bool
492
+ attribute :open_not_so_scary, Types::Bool
493
+ attribute :category_code, Types::String.optional
494
+ attribute :duration, Types::Float.optional
495
+ attribute :scheduled_code, Types::String.optional
496
+ attribute :what_it_is, Types::String.optional
497
+ attribute :scope_and_scale_code, Types::String.optional
498
+ attribute :when_to_go, Types::String.optional
499
+ attribute :average_wait_per_hundred, Types::Float.optional
500
+ attribute :average_wait_assumes, Types::String.optional
501
+ attribute :loading_speed, Types::String.optional
502
+ attribute :probable_wait_time, Types::String.optional
503
+ attribute :special_needs, Types::String.optional
504
+ attribute :height_restriction, Types::Coercible::Integer.optional
505
+ attribute :intense, Types::Bool
506
+ attribute :extinct_on, Types::Params::DateTime.optional
507
+ attribute :opened_on, Types::Params::DateTime.optional
508
+ attribute :frightening, Types::Bool
509
+ attribute :physical_considerations, Types::Bool
510
+ attribute :handheld_captioning, Types::Bool
511
+ attribute :video_captioning, Types::Bool
512
+ attribute :reflective_captioning, Types::Bool
513
+ attribute :assistive_listening, Types::Bool
514
+ attribute :audio_description, Types::Bool
515
+ attribute :wheelchair_transfer_code, Types::String.optional
516
+ attribute :no_service_animals, Types::Bool
517
+ attribute :sign_language, Types::Bool
518
+ attribute :service_animal_check, Types::Bool
519
+ attribute :not_to_be_missed, Types::Bool
520
+ attribute :rider_swap, Types::Bool
521
+ attribute :ultimate_code, Types::String.optional
522
+ attribute :ultimate_task, Types::String.optional
523
+ attribute :park_entrance, Types::Bool
524
+ # attribute :relative_open, Types::Float.optional
525
+ # attribute :relative_close, Types::Bool.optional
526
+ attribute :close_at_dusk, Types::Bool.optional
527
+ attribute :crowd_calendar_version, Types::Integer
528
+ attribute :match_name, Types::String.optional
529
+ attribute :crazy_threshold, Types::Integer.optional
530
+ attribute :fastpass_only, Types::Bool
531
+ attribute :allow_showtimes_after_close, Types::Bool
532
+ attribute :disconnected_fastpass_booth, Types::Bool
533
+ attribute :arrive_before, Types::Integer.optional
534
+ attribute :arrive_before_fp, Types::Integer.optional
535
+ attribute :allow_time_restriction, Types::Bool
536
+ attribute :relative_open_to_sunset, Types::Integer.optional
537
+ attribute :relative_close_to_sunset, Types::Integer.optional
538
+ attribute :closing_round_code, Types::String.optional
539
+ attribute :walking_time_proxy_id, Types::Integer.optional
540
+ # attribute :flexible_duration, Types::Bool
541
+ attribute :operator_id, Types::Coercible::Integer.optional
542
+ attribute :operator_type, Types::String.optional
543
+ attribute :hide_app, Types::Bool
544
+ attribute :showtime_proxy_id, Types::Integer.optional
545
+ attribute :sort_name, Types::String
546
+ attribute :extinct_on_uncertain, Types::Bool.optional
547
+ attribute :opened_on_uncertain, Types::Bool.optional
548
+ attribute :ignore_scrapes, Types::Bool.optional
549
+ attribute :extra_cost, Types::Bool
550
+ attribute :climate_controlled, Types::Bool
551
+ attribute :wet, Types::Bool.optional
552
+ attribute :operational_notes, Types::String.optional
553
+ # attribute :masthead_circle_x, Types::Integer
554
+ # attribute :masthead_circle_y, Types::Integer
555
+ attribute :latitude, Types::String.optional
556
+ attribute :longitude, Types::String.optional
557
+ attribute :open_early, Types::Bool
558
+ attribute :themeparks_id, Types::String.optional
559
+ attribute :has_virtual_queue, Types::Bool
430
560
  end
431
561
 
432
562
  # model with the attributes
@@ -440,49 +570,78 @@ module Touringplans
440
570
  attribute :venue_permalink, Types::String.optional
441
571
  end
442
572
 
443
- PLACE_KEYS = %i[magic_kingdom
444
- animal_kingdom
445
- epcot
446
- hollywood_studios
447
- walt_disney_world
448
- ].freeze
449
- # {interest:"interest_type"}
450
- INTERESTS = %i[counter_services
451
- table_services
452
- attractions
453
- hotels
454
- campground
455
- deluxe_hotels
456
- deluxe_villas
457
- moderate_hotels
458
- value_hotels
459
- disney_springs_resorts
460
- ].freeze
461
- HOTEL_CATEGORIES = %i[campground
462
- deluxe_hotels
463
- deluxe_villas
464
- moderate_hotels
465
- value_hotels
466
- disney_springs_resorts]
573
+ # model with the attributes
574
+ class HotelFull < Dry::Struct
575
+ transform_keys(&:to_sym)
576
+
577
+ attribute :name, Types::Coercible::String
578
+ attribute :address, Types::Coercible::String.optional
579
+ attribute :city, Types::Coercible::String.optional
580
+ attribute :state_code, Types::Coercible::String.optional
581
+ attribute :zip_code, Types::Coercible::String.optional
582
+ attribute :phone_number, Types::Coercible::String.optional
583
+ attribute :url, Types::Coercible::String.optional
584
+ attribute :off_site, Types::Bool
585
+ attribute :water_sports, Types::Bool
586
+ attribute :marina, Types::Bool
587
+ attribute :beach, Types::Bool
588
+ attribute :tennis, Types::Bool
589
+ attribute :biking, Types::Bool
590
+ attribute :suites, Types::Bool
591
+ attribute :concierge_floor, Types::Bool
592
+ attribute :room_service, Types::Bool
593
+ attribute :wired_internet, Types::Bool
594
+ attribute :wireless_internet, Types::Bool
595
+ attribute :num_rooms, Types::Coercible::Integer
596
+ attribute :theme, Types::Coercible::String.optional
597
+ attribute :cost_range, Types::Coercible::String.optional
598
+ attribute :shuttle_to_parks, Types::Bool
599
+ attribute :cost_estimate, Types::Coercible::String.optional
600
+ attribute :lodging_area_code, Types::Coercible::String.optional
601
+ attribute :category_code, Types::Coercible::String.optional
602
+ end
603
+
604
+ PLACE_KEYS = %i[magic_kingdom
605
+ animal_kingdom
606
+ epcot
607
+ hollywood_studios
608
+ walt_disney_world].freeze
609
+ # {interest:"interest_type"}
610
+ INTERESTS = %i[counter_services
611
+ table_services
612
+ dining
613
+ attractions
614
+ hotels
615
+ campground
616
+ deluxe_hotels
617
+ deluxe_villas
618
+ moderate_hotels
619
+ value_hotels
620
+ disney_springs_resorts].freeze
621
+ HOTEL_CATEGORIES = %i[campground
622
+ deluxe_hotels
623
+ deluxe_villas
624
+ moderate_hotels
625
+ value_hotels
626
+ disney_springs_resorts].freeze
467
627
 
468
628
  # list interest at location
469
629
  # current interest are "counter service" "table service", and "attractions"
470
630
  # current locations are the four parks
471
631
  def self.list(interest, location)
472
632
  return "The location is not on Disney property" unless PLACE_KEYS.include? _symbolize(location)
473
- return "The interest is not valid" unless INTERESTS.include? _symbolize(interest)
633
+ return "The interest is not valid" unless INTERESTS.include? _symbolize(interest)
474
634
 
475
635
  client = _setup_client
476
636
  listings = []
477
637
  interest_type = _determine_interest_type(interest)
478
- route = _assemble_route(location, interest_type)
638
+ route = _assemble_route(location, interest_type, "list")
479
639
  response = client.send(route).parsed_response
480
640
  listing_hashes = _collect_listing_hashes_from_response(interest, response)
481
641
  listing_hashes.each do |item|
482
- item["venue_permalink"] = location.to_s.downcase.gsub(" ", "-")
642
+ item["venue_permalink"] = location.to_s.downcase.gsub(" ", "-").gsub("_", "-")
483
643
  end
484
644
 
485
- listing_hashes
486
645
  listing_hashes.each do |hash|
487
646
  listing = _set_model_from_hash(interest, hash)
488
647
  listings << listing
@@ -525,22 +684,22 @@ module Touringplans
525
684
  places.flatten
526
685
  end
527
686
 
528
- def self.show(interest_type, short_name)
529
- return "The interest_type is not valid" unless %i[dining attractions hotels].include? _symbolize(interest_type)
530
-
531
- # get a list of every model of one kind of interest_type (dining, attractions, hotels)
532
- places = list_all(interest_type)
687
+ def self.show(place, interest_type, permalink)
688
+ # see specs for examples
689
+ return "The location is not on Disney property" unless PLACE_KEYS.include? _symbolize(place)
690
+ return "The interest_type is not valid" unless INTERESTS.include? _symbolize(interest_type)
533
691
 
534
- # filter by short_name
535
- places.find { |place| place.short_name == short_name }
692
+ client = _setup_client
693
+ route = _assemble_route(place, interest_type, permalink)
694
+ response = client.send(route).parsed_response
695
+ _set_model_from_hash(interest_type, response)
536
696
  end
537
697
 
538
698
  def self._setup_client
539
699
  connection = Connection.new
540
700
  connection.query(key: "HowdyLen")
541
- routes = Touringplans::RoutesTable.symbolize_keys(Touringplans::RoutesTable.load_routes_file)
701
+ routes = Touringplans::RoutesTable.symbolize_keys(Touringplans::RoutesTable.load_routes_file)
542
702
  Client.new(connection: connection, routes: routes)
543
-
544
703
  end
545
704
 
546
705
  def self._format_location_name(location_name)
@@ -552,8 +711,7 @@ module Touringplans
552
711
 
553
712
  interest_type = "dining" if interest == "counter services"
554
713
  interest_type = "dining" if interest == "table services"
555
- interest_type = "hotels" if %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts
556
- ].include? _symbolize(interest)
714
+ interest_type = "hotels" if %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts].include? _symbolize(interest)
557
715
 
558
716
  interest_type
559
717
  end
@@ -567,11 +725,16 @@ module Touringplans
567
725
  str.to_sym
568
726
  end
569
727
 
570
-
571
- def self._assemble_route(location, interest_type)
572
- formatted_location = location.to_s.downcase.gsub(" ", "_")
573
- formatted_interest_type = interest_type.to_s.downcase.gsub(" ", "_")
574
- "#{formatted_location}_#{formatted_interest_type}"
728
+ def self._assemble_route(collection, interest_type, venue)
729
+ # format route
730
+ collection = collection.to_s.downcase.gsub(" ", "_").gsub("-", "_")
731
+ interest_type = interest_type.to_s.downcase.gsub(" ", "_").gsub("-", "_")
732
+ venue = venue.to_s.downcase.gsub(" ", "_").gsub("-", "_")
733
+
734
+ route = [collection, interest_type, venue].join("_")
735
+ route = [collection, interest_type].join("_") if venue == "list"
736
+
737
+ route
575
738
  end
576
739
 
577
740
  def self._collect_listing_hashes_from_response(interest, response)
@@ -587,15 +750,13 @@ module Touringplans
587
750
 
588
751
  listing_hashes
589
752
  end
590
-
753
+
591
754
  def self.list_all_hotels(response_from_touringplans_hotels_url)
592
755
  listing_hashes = []
593
756
 
594
757
  response_from_touringplans_hotels_url.each do |child|
595
758
  child.each do |grandchild|
596
- if "#{grandchild.class}" == "Array"
597
- listing_hashes << grandchild
598
- end
759
+ listing_hashes << grandchild if grandchild.class.to_s == "Array"
599
760
  end
600
761
  end
601
762
 
@@ -603,39 +764,43 @@ module Touringplans
603
764
  end
604
765
 
605
766
  # search for hotels of a category_code
606
- def self.list_hotels_of_a_category(hotels, interest)
607
- hotel_categories = {campground:"campground", deluxe_hotels:"deluxe",
608
- deluxe_villas:"deluxe_villa", moderate_hotels:"moderate",
609
- value_hotels:"value", disney_springs_resorts: NilClass}
767
+ def self.list_hotels_of_a_category(hotels, interest)
768
+ hotel_categories = { campground: "campground", deluxe_hotels: "deluxe",
769
+ deluxe_villas: "deluxe_villa", moderate_hotels: "moderate",
770
+ value_hotels: "value", disney_springs_resorts: NilClass }
610
771
  # get a list of every hotel model
611
772
 
612
773
  # filter by category_code
613
- # disney springs category code is null. We need to find a rule for finding those that don't have any of the values of
774
+ # disney springs category code is null. We need to find a rule for finding those that don't have any of the values of
614
775
  # hotel categories
615
776
  if interest == "disney springs resorts"
616
- target_hotels = hotels.find_all { |hotel| hotel.category_code.class == NilClass }
617
-
777
+ hotels.find_all { |hotel| hotel.category_code.instance_of?(NilClass) }
778
+
618
779
  else
619
- target_hotels = hotels.find_all { |hotel| hotel.category_code == hotel_categories[_symbolize(interest)] }
620
-
621
- end
780
+ hotels.find_all { |hotel| hotel.category_code == hotel_categories[_symbolize(interest)] }
622
781
 
623
- target_hotels
782
+ end
624
783
  end
625
-
784
+
626
785
  def generate_route_table
627
786
  # initial_routes = ROUTES
628
-
629
787
  end
630
-
631
-
788
+
632
789
  def self._set_model_from_hash(interest, hash)
633
790
  hotel_categories = %i[campground deluxe_hotels deluxe_villas moderate_hotels value_hotels disney_springs_resorts hotels]
634
791
 
635
- listing = CounterServiceLocation.new(hash) if interest == "counter services"
636
- listing = TableServiceLocation.new(hash) if interest == "table services"
637
- listing = ParkAttraction.new(hash) if interest == "attractions"
638
- listing = Hotel.new(hash) if hotel_categories.include? _symbolize(interest)
792
+ if hash["permalink"].to_s.length > 1
793
+ listing = CounterServiceLocation.new(hash) if interest == "counter services"
794
+ listing = TableServiceLocation.new(hash) if interest == "table services"
795
+ listing = ParkAttraction.new(hash) if interest == "attractions"
796
+ listing = DiningVenueFull.new(hash) if interest == "dining"
797
+ listing = Hotel.new(hash) if hotel_categories.include? _symbolize(interest)
798
+ else
799
+ listing = DiningVenueFull.new(hash) if interest == "dining"
800
+ listing = ParkAttractionFull.new(hash) if interest == "attractions"
801
+ listing = HotelFull.new(hash) if hotel_categories.include? _symbolize(interest)
802
+ end
803
+
639
804
  listing
640
805
  end
641
806
  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.8
4
+ version: 0.3.6
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-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print