juftin / camply

camply, the campsite finder โ›บ๏ธ - a tool to find campsites at sold out campgrounds through sites like recreation.gov
https://juftin.com/camply/
MIT License
486 stars 94 forks source link

Scanning Yellowstone crashes with "AttributeError: 'list' object has no attribute 'items' #344

Closed zhazell closed 7 months ago

zhazell commented 7 months ago

Describe the bug

When having a continuous scan run, it seems to error quite frequently with "list object has no attribute items" error. Requires me to start the command again. It has happened over the last 2 weeks a dozen times.

Original Camply Command (with --debug)

camply --provider Yellowstone campsites --campground YLYF:RV --campground YLYM:RV --start-date 2024-06-13 --end-date 2024-06-16 --nights 3 --search-forever --notifications pushover --polling-interval 5 --debug

Additional context


[2024-05-01 07:37:59] INFO     โ›ฐ  Yellowstone National Park, USA (#1) - ๐Ÿ•  Fishing Bridge RV Park (YLYF:RV)
[2024-05-01 07:37:59] INFO     โ›ฐ  Yellowstone National Park, USA (#1) - ๐Ÿ•  Madison Campground (YLYM:RV)
[2024-05-01 07:37:59] INFO     Searching for Yellowstone Lodging Availability: June, 2024
[2024-05-01 07:37:59] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 07:38:00] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/availability/hotels/yellowstonenationalparklodges?date=2024-06-01&limit=31&rate_code=INTERNET&nights=3
                               HTTP/1.1" 200 None
[2024-05-01 07:38:00] INFO     Exception encountered, emitting notification last gasp.
[2024-05-01 07:38:00] DEBUG    SilentNotification: camply encountered an error and exited ๐Ÿ˜Ÿ [2024-05-01 07:38:00] - (AttributeError) 'list' object has no attribute 'items'
[2024-05-01 07:38:00] DEBUG    Starting new HTTPS connection (1): api.pushover.net:443
[2024-05-01 07:38:00] DEBUG    https://api.pushover.net:443 "POST
                               /1/messages.json?token=REMOVED&user=HIDDEN&message=camply+encountered+an+error+and+exited+%F0%9F%98%
                               9F+%5B2024-05-01+07%3A38%3A00%5D+-+%28AttributeError%29+%27list%27+object+has+no+attribute+%27items%27 HTTP/1.1" 200 None
[2024-05-01 07:38:00] CAMPLY   Exiting camply ๐Ÿ‘‹

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/base_search.py:57 โ”‚
โ”‚ 4 in get_matching_campsites                                                                      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    571 โ”‚   โ”‚   """                                                                               โ”‚
โ”‚    572 โ”‚   โ”‚   if continuous is True or search_once is True:                                     โ”‚
โ”‚    573 โ”‚   โ”‚   โ”‚   try:                                                                          โ”‚
โ”‚ โฑ  574 โ”‚   โ”‚   โ”‚   โ”‚   self._search_campsites_continuous(                                        โ”‚
โ”‚    575 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   log=log,                                                              โ”‚
โ”‚    576 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   verbose=verbose,                                                      โ”‚
โ”‚    577 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   polling_interval=polling_interval,                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚            continuous = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚                   log = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚ notification_provider = ['pushover']                                                         โ”‚ โ”‚
โ”‚ โ”‚      notify_first_try = False                                                                โ”‚ โ”‚
โ”‚ โ”‚      polling_interval = 5.0                                                                  โ”‚ โ”‚
โ”‚ โ”‚        search_forever = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚           search_once = False                                                                โ”‚ โ”‚
โ”‚ โ”‚                  self = <camply.search.search_yellowstone.SearchYellowstone object at        โ”‚ โ”‚
โ”‚ โ”‚                         0x7f8451804a00>                                                      โ”‚ โ”‚
โ”‚ โ”‚               verbose = True                                                                 โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/base_search.py:50 โ”‚
โ”‚ 8 in _search_campsites_continuous                                                                โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    505 โ”‚   โ”‚   continuous_search_attempts = 1                                                    โ”‚
โ”‚    506 โ”‚   โ”‚   while continuous_search is True:                                                  โ”‚
โ”‚    507 โ”‚   โ”‚   โ”‚   starting_count = len(self.campsites_found)                                    โ”‚
โ”‚ โฑ  508 โ”‚   โ”‚   โ”‚   self._continuous_search_retry(                                                โ”‚
โ”‚    509 โ”‚   โ”‚   โ”‚   โ”‚   log=log,                                                                  โ”‚
โ”‚    510 โ”‚   โ”‚   โ”‚   โ”‚   verbose=verbose,                                                          โ”‚
โ”‚    511 โ”‚   โ”‚   โ”‚   โ”‚   polling_interval=polling_interval,                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚          continuous_search = True                                                            โ”‚ โ”‚
โ”‚ โ”‚ continuous_search_attempts = 1                                                               โ”‚ โ”‚
โ”‚ โ”‚                        log = True                                                            โ”‚ โ”‚
โ”‚ โ”‚      notification_provider = ['pushover']                                                    โ”‚ โ”‚
โ”‚ โ”‚           notify_first_try = False                                                           โ”‚ โ”‚
โ”‚ โ”‚           polling_interval = 5.0                                                             โ”‚ โ”‚
โ”‚ โ”‚   polling_interval_minutes = 5                                                               โ”‚ โ”‚
โ”‚ โ”‚             search_forever = True                                                            โ”‚ โ”‚
โ”‚ โ”‚                search_once = False                                                           โ”‚ โ”‚
โ”‚ โ”‚                       self = <camply.search.search_yellowstone.SearchYellowstone object at   โ”‚ โ”‚
โ”‚ โ”‚                              0x7f8451804a00>                                                 โ”‚ โ”‚
โ”‚ โ”‚             starting_count = 0                                                               โ”‚ โ”‚
โ”‚ โ”‚                    verbose = True                                                            โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/base_search.py:35 โ”‚
โ”‚ 4 in _continuous_search_retry                                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    351 โ”‚   โ”‚   โ”‚   retry=tenacity.retry_if_exception_type(CampsiteNotFoundError),                โ”‚
โ”‚    352 โ”‚   โ”‚   โ”‚   wait=tenacity.wait.wait_fixed(int(polling_interval_minutes) * 60),            โ”‚
โ”‚    353 โ”‚   โ”‚   )                                                                                 โ”‚
โ”‚ โฑ  354 โ”‚   โ”‚   matching_campsites = retryer.__call__(                                            โ”‚
โ”‚    355 โ”‚   โ”‚   โ”‚   fn=self._search_matching_campsites_available,                                 โ”‚
โ”‚    356 โ”‚   โ”‚   โ”‚   log=False,                                                                    โ”‚
โ”‚    357 โ”‚   โ”‚   โ”‚   verbose=False,                                                                โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚ continuous_search_attempts = 1                                                               โ”‚ โ”‚
โ”‚ โ”‚                        log = True                                                            โ”‚ โ”‚
โ”‚ โ”‚      notification_provider = ['pushover']                                                    โ”‚ โ”‚
โ”‚ โ”‚           notify_first_try = False                                                           โ”‚ โ”‚
โ”‚ โ”‚           polling_interval = 5.0                                                             โ”‚ โ”‚
โ”‚ โ”‚   polling_interval_minutes = 5                                                               โ”‚ โ”‚
โ”‚ โ”‚                    retryer = <Retrying object at 0x7f8451805ff0                              โ”‚ โ”‚
โ”‚ โ”‚                              (stop=<tenacity.stop._stop_never object at 0x7f845a4f3850>,     โ”‚ โ”‚
โ”‚ โ”‚                              wait=<tenacity.wait.wait_fixed object at 0x7f8451805f90>,       โ”‚ โ”‚
โ”‚ โ”‚                              sleep=<function sleep at 0x7f845a50b640>,                       โ”‚ โ”‚
โ”‚ โ”‚                              retry=<tenacity.retry.retry_if_exception_type object at         โ”‚ โ”‚
โ”‚ โ”‚                              0x7f8451805b10>, before=<function before_nothing at             โ”‚ โ”‚
โ”‚ โ”‚                              0x7f845a52d1b0>, after=<function after_nothing at               โ”‚ โ”‚
โ”‚ โ”‚                              0x7f845a52d480>)>                                               โ”‚ โ”‚
โ”‚ โ”‚                search_once = False                                                           โ”‚ โ”‚
โ”‚ โ”‚                       self = <camply.search.search_yellowstone.SearchYellowstone object at   โ”‚ โ”‚
โ”‚ โ”‚                              0x7f8451804a00>                                                 โ”‚ โ”‚
โ”‚ โ”‚                    verbose = True                                                            โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/tenacity/__init__.py:379 in     โ”‚
โ”‚ __call__                                                                                         โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   376 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   377 โ”‚   โ”‚   retry_state = RetryCallState(retry_object=self, fn=fn, args=args, kwargs=kwargs)   โ”‚
โ”‚   378 โ”‚   โ”‚   while True:                                                                        โ”‚
โ”‚ โฑ 379 โ”‚   โ”‚   โ”‚   do = self.iter(retry_state=retry_state)                                        โ”‚
โ”‚   380 โ”‚   โ”‚   โ”‚   if isinstance(do, DoAttempt):                                                  โ”‚
โ”‚   381 โ”‚   โ”‚   โ”‚   โ”‚   try:                                                                       โ”‚
โ”‚   382 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   result = fn(*args, **kwargs)                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚        args = ()                                                                             โ”‚ โ”‚
โ”‚ โ”‚          do = <tenacity.DoAttempt object at 0x7f84547965c0>                                  โ”‚ โ”‚
โ”‚ โ”‚          fn = <bound method BaseCampingSearch._search_matching_campsites_available of        โ”‚ โ”‚
โ”‚ โ”‚               <camply.search.search_yellowstone.SearchYellowstone object at 0x7f8451804a00>> โ”‚ โ”‚
โ”‚ โ”‚      kwargs = {'log': False, 'verbose': False, 'raise_error': True}                          โ”‚ โ”‚
โ”‚ โ”‚ retry_state = <RetryCallState 140206279776608: attempt #16; slept for 4500.0; last result:   โ”‚ โ”‚
โ”‚ โ”‚               failed (AttributeError 'list' object has no attribute 'items')>                โ”‚ โ”‚
โ”‚ โ”‚        self = <Retrying object at 0x7f8451805ff0 (stop=<tenacity.stop._stop_never object at  โ”‚ โ”‚
โ”‚ โ”‚               0x7f845a4f3850>, wait=<tenacity.wait.wait_fixed object at 0x7f8451805f90>,     โ”‚ โ”‚
โ”‚ โ”‚               sleep=<function sleep at 0x7f845a50b640>,                                      โ”‚ โ”‚
โ”‚ โ”‚               retry=<tenacity.retry.retry_if_exception_type object at 0x7f8451805b10>,       โ”‚ โ”‚
โ”‚ โ”‚               before=<function before_nothing at 0x7f845a52d1b0>, after=<function            โ”‚ โ”‚
โ”‚ โ”‚               after_nothing at 0x7f845a52d480>)>                                             โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/tenacity/__init__.py:314 in     โ”‚
โ”‚ iter                                                                                             โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   311 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   312 โ”‚   โ”‚   is_explicit_retry = fut.failed and isinstance(fut.exception(), TryAgain)           โ”‚
โ”‚   313 โ”‚   โ”‚   if not (is_explicit_retry or self.retry(retry_state)):                             โ”‚
โ”‚ โฑ 314 โ”‚   โ”‚   โ”‚   return fut.result()                                                            โ”‚
โ”‚   315 โ”‚   โ”‚                                                                                      โ”‚
โ”‚   316 โ”‚   โ”‚   if self.after is not None:                                                         โ”‚
โ”‚   317 โ”‚   โ”‚   โ”‚   self.after(retry_state)                                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚               fut = <Future at 0x7f8452024d00 state=finished raised AttributeError>          โ”‚ โ”‚
โ”‚ โ”‚ is_explicit_retry = False                                                                    โ”‚ โ”‚
โ”‚ โ”‚       retry_state = <RetryCallState 140206279776608: attempt #16; slept for 4500.0; last     โ”‚ โ”‚
โ”‚ โ”‚                     result: failed (AttributeError 'list' object has no attribute 'items')>  โ”‚ โ”‚
โ”‚ โ”‚              self = <Retrying object at 0x7f8451805ff0 (stop=<tenacity.stop._stop_never      โ”‚ โ”‚
โ”‚ โ”‚                     object at 0x7f845a4f3850>, wait=<tenacity.wait.wait_fixed object at      โ”‚ โ”‚
โ”‚ โ”‚                     0x7f8451805f90>, sleep=<function sleep at 0x7f845a50b640>,               โ”‚ โ”‚
โ”‚ โ”‚                     retry=<tenacity.retry.retry_if_exception_type object at 0x7f8451805b10>, โ”‚ โ”‚
โ”‚ โ”‚                     before=<function before_nothing at 0x7f845a52d1b0>, after=<function      โ”‚ โ”‚
โ”‚ โ”‚                     after_nothing at 0x7f845a52d480>)>                                       โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /usr/lib/python3.10/concurrent/futures/_base.py:451 in result                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   448 โ”‚   โ”‚   โ”‚   โ”‚   if self._state in [CANCELLED, CANCELLED_AND_NOTIFIED]:                     โ”‚
โ”‚   449 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   raise CancelledError()                                                 โ”‚
โ”‚   450 โ”‚   โ”‚   โ”‚   โ”‚   elif self._state == FINISHED:                                              โ”‚
โ”‚ โฑ 451 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   return self.__get_result()                                             โ”‚
โ”‚   452 โ”‚   โ”‚   โ”‚   โ”‚                                                                              โ”‚
โ”‚   453 โ”‚   โ”‚   โ”‚   โ”‚   self._condition.wait(timeout)                                              โ”‚
โ”‚   454                                                                                            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ•ฎ                                                                               โ”‚
โ”‚ โ”‚    self = None โ”‚                                                                               โ”‚
โ”‚ โ”‚ timeout = None โ”‚                                                                               โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                                                               โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /usr/lib/python3.10/concurrent/futures/_base.py:403 in __get_result                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   400 โ”‚   def __get_result(self):                                                                โ”‚
โ”‚   401 โ”‚   โ”‚   if self._exception:                                                                โ”‚
โ”‚   402 โ”‚   โ”‚   โ”‚   try:                                                                           โ”‚
โ”‚ โฑ 403 โ”‚   โ”‚   โ”‚   โ”‚   raise self._exception                                                      โ”‚
โ”‚   404 โ”‚   โ”‚   โ”‚   finally:                                                                       โ”‚
โ”‚   405 โ”‚   โ”‚   โ”‚   โ”‚   # Break a reference cycle with the exception in self._exception            โ”‚
โ”‚   406 โ”‚   โ”‚   โ”‚   โ”‚   self = None                                                                โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€ locals โ”€โ”€โ”€โ•ฎ                                                                                  โ”‚
โ”‚ โ”‚ self = None โ”‚                                                                                  โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/tenacity/__init__.py:382 in     โ”‚
โ”‚ __call__                                                                                         โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   379 โ”‚   โ”‚   โ”‚   do = self.iter(retry_state=retry_state)                                        โ”‚
โ”‚   380 โ”‚   โ”‚   โ”‚   if isinstance(do, DoAttempt):                                                  โ”‚
โ”‚   381 โ”‚   โ”‚   โ”‚   โ”‚   try:                                                                       โ”‚
โ”‚ โฑ 382 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   result = fn(*args, **kwargs)                                           โ”‚
โ”‚   383 โ”‚   โ”‚   โ”‚   โ”‚   except BaseException:  # noqa: B902                                        โ”‚
โ”‚   384 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   retry_state.set_exception(sys.exc_info())  # type: ignore[arg-type]    โ”‚
โ”‚   385 โ”‚   โ”‚   โ”‚   โ”‚   else:                                                                      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚        args = ()                                                                             โ”‚ โ”‚
โ”‚ โ”‚          do = <tenacity.DoAttempt object at 0x7f84547965c0>                                  โ”‚ โ”‚
โ”‚ โ”‚          fn = <bound method BaseCampingSearch._search_matching_campsites_available of        โ”‚ โ”‚
โ”‚ โ”‚               <camply.search.search_yellowstone.SearchYellowstone object at 0x7f8451804a00>> โ”‚ โ”‚
โ”‚ โ”‚      kwargs = {'log': False, 'verbose': False, 'raise_error': True}                          โ”‚ โ”‚
โ”‚ โ”‚ retry_state = <RetryCallState 140206279776608: attempt #16; slept for 4500.0; last result:   โ”‚ โ”‚
โ”‚ โ”‚               failed (AttributeError 'list' object has no attribute 'items')>                โ”‚ โ”‚
โ”‚ โ”‚        self = <Retrying object at 0x7f8451805ff0 (stop=<tenacity.stop._stop_never object at  โ”‚ โ”‚
โ”‚ โ”‚               0x7f845a4f3850>, wait=<tenacity.wait.wait_fixed object at 0x7f8451805f90>,     โ”‚ โ”‚
โ”‚ โ”‚               sleep=<function sleep at 0x7f845a50b640>,                                      โ”‚ โ”‚
โ”‚ โ”‚               retry=<tenacity.retry.retry_if_exception_type object at 0x7f8451805b10>,       โ”‚ โ”‚
โ”‚ โ”‚               before=<function before_nothing at 0x7f845a52d1b0>, after=<function            โ”‚ โ”‚
โ”‚ โ”‚               after_nothing at 0x7f845a52d480>)>                                             โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/base_search.py:24 โ”‚
โ”‚ 6 in _search_matching_campsites_available                                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    243 โ”‚   โ”‚   List[AvailableCampsite]                                                           โ”‚
โ”‚    244 โ”‚   โ”‚   """                                                                               โ”‚
โ”‚    245 โ”‚   โ”‚   matching_campgrounds = []                                                         โ”‚
โ”‚ โฑ  246 โ”‚   โ”‚   for camp in self.get_all_campsites():                                             โ”‚
โ”‚    247 โ”‚   โ”‚   โ”‚   if all(                                                                       โ”‚
โ”‚    248 โ”‚   โ”‚   โ”‚   โ”‚   [                                                                         โ”‚
โ”‚    249 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   self._compare_date_overlap(campsite=camp) is True,                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚                  log = False                                                                 โ”‚ โ”‚
โ”‚ โ”‚ matching_campgrounds = []                                                                    โ”‚ โ”‚
โ”‚ โ”‚          raise_error = True                                                                  โ”‚ โ”‚
โ”‚ โ”‚                 self = <camply.search.search_yellowstone.SearchYellowstone object at         โ”‚ โ”‚
โ”‚ โ”‚                        0x7f8451804a00>                                                       โ”‚ โ”‚
โ”‚ โ”‚              verbose = False                                                                 โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/search_yellowston โ”‚
โ”‚ e.py:87 in get_all_campsites                                                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    84 โ”‚   โ”‚   this_month = datetime.now().date().replace(day=1)                                  โ”‚
โ”‚    85 โ”‚   โ”‚   for month in self.search_months:                                                   โ”‚
โ”‚    86 โ”‚   โ”‚   โ”‚   if month >= this_month:                                                        โ”‚
โ”‚ โฑ  87 โ”‚   โ”‚   โ”‚   โ”‚   all_campsites += self.campsite_finder.get_monthly_campsites(               โ”‚
โ”‚    88 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   month=month, nights=None if self.nights == 1 else self.nights          โ”‚
โ”‚    89 โ”‚   โ”‚   โ”‚   โ”‚   )                                                                          โ”‚
โ”‚    90 โ”‚   โ”‚   matching_campsites = self._filter_campsites_to_campgrounds(                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚          all_campsites = []                                                                  โ”‚ โ”‚
โ”‚ โ”‚                  month = datetime.date(2024, 6, 1)                                           โ”‚ โ”‚
โ”‚ โ”‚ searchable_campgrounds = {'YLYF:RV', 'YLYM:RV'}                                              โ”‚ โ”‚
โ”‚ โ”‚                   self = <camply.search.search_yellowstone.SearchYellowstone object at       โ”‚ โ”‚
โ”‚ โ”‚                          0x7f8451804a00>                                                     โ”‚ โ”‚
โ”‚ โ”‚             this_month = datetime.date(2024, 5, 1)                                           โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/providers/xanterra/yello โ”‚
โ”‚ wstone_lodging.py:417 in get_monthly_campsites                                                   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   414 โ”‚   โ”‚   availability_found = self._get_monthly_availability(                               โ”‚
โ”‚   415 โ”‚   โ”‚   โ”‚   month=search_date, nights=nights                                               โ”‚
โ”‚   416 โ”‚   โ”‚   )                                                                                  โ”‚
โ”‚ โฑ 417 โ”‚   โ”‚   availability = XantResortData(**availability_found)                                โ”‚
โ”‚   418 โ”‚   โ”‚   monthly_campsites = self._compile_campground_availabilities(                       โ”‚
โ”‚   419 โ”‚   โ”‚   โ”‚   availability=availability                                                      โ”‚
โ”‚   420 โ”‚   โ”‚   )                                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                               โ”‚
โ”‚ โ”‚ availability_found = {'availability': []}      โ”‚                                               โ”‚
โ”‚ โ”‚              month = datetime.date(2024, 6, 1) โ”‚                                               โ”‚
โ”‚ โ”‚             nights = 3                         โ”‚                                               โ”‚
โ”‚ โ”‚                now = datetime.date(2024, 5, 1) โ”‚                                               โ”‚
โ”‚ โ”‚        search_date = datetime.date(2024, 6, 1) โ”‚                                               โ”‚
โ”‚ โ”‚               self = <Yellowstone>             โ”‚                                               โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                               โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ in pydantic.main.BaseModel.__init__:339                                                          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ in pydantic.main.validate_model:1074                                                             โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ in pydantic.fields.ModelField.validate:864                                                       โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ in pydantic.fields.ModelField._apply_validators:1154                                             โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ in pydantic.class_validators._generic_validator_cls.lambda4:304                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/containers/api_responses โ”‚
โ”‚ .py:440 in parse_datetime                                                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   437 โ”‚   โ”‚   """                                                                                โ”‚
โ”‚   438 โ”‚   โ”‚   return {                                                                           โ”‚
โ”‚   439 โ”‚   โ”‚   โ”‚   datetime.datetime.strptime(x, "%m/%d/%Y").date(): y                            โ”‚
โ”‚ โฑ 440 โ”‚   โ”‚   โ”‚   for x, y in value.items()                                                      โ”‚
โ”‚   441 โ”‚   โ”‚   }                                                                                  โ”‚
โ”‚   442                                                                                            โ”‚
โ”‚   443                                                                                            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                             โ”‚
โ”‚ โ”‚   cls = <class 'camply.containers.api_responses.XantResortData'> โ”‚                             โ”‚
โ”‚ โ”‚ value = []                                                       โ”‚                             โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                             โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
AttributeError: 'list' object has no attribute 'items'

The above exception was the direct cause of the following exception:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ /home/zach/.local/bin/camply:8 in <module>                                                       โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   5 from camply.cli import cli                                                                   โ”‚
โ”‚   6 if __name__ == '__main__':                                                                   โ”‚
โ”‚   7 โ”‚   sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])                         โ”‚
โ”‚ โฑ 8 โ”‚   sys.exit(cli())                                                                          โ”‚
โ”‚   9                                                                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                         โ”‚
โ”‚ โ”‚ cli = <function cli at 0x7f84517f9240>               โ”‚                                         โ”‚
โ”‚ โ”‚  re = <module 're' from '/usr/lib/python3.10/re.py'> โ”‚                                         โ”‚
โ”‚ โ”‚ sys = <module 'sys' (built-in)>                      โ”‚                                         โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                         โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/cli.py:883 in cli        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   880 โ”‚   Camply Command Line Utility Wrapper                                                    โ”‚
โ”‚   881 โ”‚   """                                                                                    โ”‚
โ”‚   882 โ”‚   try:                                                                                   โ”‚
โ”‚ โฑ 883 โ”‚   โ”‚   camply_command_line()                                                              โ”‚
โ”‚   884 โ”‚   except KeyboardInterrupt:                                                              โ”‚
โ”‚   885 โ”‚   โ”‚   logger.debug("Handling Exit Request")                                              โ”‚
โ”‚   886 โ”‚   finally:                                                                               โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/core.py:1157 in __call__  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/rich_click/rich_group.py:21 in  โ”‚
โ”‚ main                                                                                             โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/core.py:1078 in main      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/core.py:1688 in invoke    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/core.py:1434 in invoke    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/core.py:783 in invoke     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/click/decorators.py:45 in       โ”‚
โ”‚ new_func                                                                                         โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/cli.py:775 in campsites  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   772 โ”‚   โ”‚   )                                                                                  โ”‚
โ”‚   773 โ”‚   provider_class: Type[BaseCampingSearch] = CAMPSITE_SEARCH_PROVIDER[provider]           โ”‚
โ”‚   774 โ”‚   camping_finder: BaseCampingSearch = provider_class(**provider_kwargs)                  โ”‚
โ”‚ โฑ 775 โ”‚   camping_finder.get_matching_campsites(**search_kwargs)                                 โ”‚
โ”‚   776                                                                                            โ”‚
โ”‚   777                                                                                            โ”‚
โ”‚   778 @camply_command_line.command(cls=RichCommand)                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚          campground = ('YLYF:RV', 'YLYM:RV')                                                 โ”‚ โ”‚
โ”‚ โ”‚      camping_finder = <camply.search.search_yellowstone.SearchYellowstone object at          โ”‚ โ”‚
โ”‚ โ”‚                       0x7f8451804a00>                                                        โ”‚ โ”‚
โ”‚ โ”‚            campsite = ()                                                                     โ”‚ โ”‚
โ”‚ โ”‚             context = CamplyContext(debug=True, provider='Yellowstone')                      โ”‚ โ”‚
โ”‚ โ”‚          continuous = False                                                                  โ”‚ โ”‚
โ”‚ โ”‚                 day = ()                                                                     โ”‚ โ”‚
โ”‚ โ”‚               debug = True                                                                   โ”‚ โ”‚
โ”‚ โ”‚            end_date = ('2024-06-16',)                                                        โ”‚ โ”‚
โ”‚ โ”‚           equipment = ()                                                                     โ”‚ โ”‚
โ”‚ โ”‚        equipment_id = None                                                                   โ”‚ โ”‚
โ”‚ โ”‚              nights = 3                                                                      โ”‚ โ”‚
โ”‚ โ”‚       notifications = ('pushover',)                                                          โ”‚ โ”‚
โ”‚ โ”‚    notify_first_try = None                                                                   โ”‚ โ”‚
โ”‚ โ”‚      offline_search = False                                                                  โ”‚ โ”‚
โ”‚ โ”‚ offline_search_path = None                                                                   โ”‚ โ”‚
โ”‚ โ”‚    polling_interval = 5                                                                      โ”‚ โ”‚
โ”‚ โ”‚            provider = 'Yellowstone'                                                          โ”‚ โ”‚
โ”‚ โ”‚      provider_class = <class 'camply.search.search_yellowstone.SearchYellowstone'>           โ”‚ โ”‚
โ”‚ โ”‚     provider_kwargs = {                                                                      โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'search_window': SearchWindow(                                     โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   โ”‚   start_date=datetime.date(2024, 6, 13),                         โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   โ”‚   end_date=datetime.date(2024, 6, 16)                            โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   ),                                                                 โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'recreation_area': [],                                             โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'campgrounds': ['YLYF:RV', 'YLYM:RV'],                             โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'campsites': [],                                                   โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'weekends_only': False,                                            โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'nights': 3,                                                       โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'offline_search': False,                                           โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'offline_search_path': None,                                       โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'equipment': (),                                                   โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'equipment_id': None,                                              โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   ... +1                                                             โ”‚ โ”‚
โ”‚ โ”‚                       }                                                                      โ”‚ โ”‚
โ”‚ โ”‚            rec_area = ()                                                                     โ”‚ โ”‚
โ”‚ โ”‚      search_forever = 'FLAG-SET'                                                             โ”‚ โ”‚
โ”‚ โ”‚       search_kwargs = {                                                                      โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'log': True,                                                       โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'verbose': True,                                                   โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'continuous': True,                                                โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'polling_interval': 5.0,                                           โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'notify_first_try': False,                                         โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'notification_provider': ['pushover'],                             โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'search_forever': True,                                            โ”‚ โ”‚
โ”‚ โ”‚                       โ”‚   'search_once': False                                               โ”‚ โ”‚
โ”‚ โ”‚                       }                                                                      โ”‚ โ”‚
โ”‚ โ”‚         search_once = False                                                                  โ”‚ โ”‚
โ”‚ โ”‚          start_date = ('2024-06-13',)                                                        โ”‚ โ”‚
โ”‚ โ”‚            weekends = False                                                                  โ”‚ โ”‚
โ”‚ โ”‚         yaml_config = None                                                                   โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/search/base_search.py:58 โ”‚
โ”‚ 4 in get_matching_campsites                                                                      โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    581 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   search_once=search_once,                                              โ”‚
โ”‚    582 โ”‚   โ”‚   โ”‚   โ”‚   )                                                                         โ”‚
โ”‚    583 โ”‚   โ”‚   โ”‚   except Exception as e:                                                        โ”‚
โ”‚ โฑ  584 โ”‚   โ”‚   โ”‚   โ”‚   self.notifier.last_gasp(error=e)                                          โ”‚
โ”‚    585 โ”‚   โ”‚   โ”‚   โ”‚   raise e                                                                   โ”‚
โ”‚    586 โ”‚   โ”‚   else:                                                                             โ”‚
โ”‚    587 โ”‚   โ”‚   โ”‚   starting_count = len(self.campsites_found)                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚            continuous = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚                   log = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚ notification_provider = ['pushover']                                                         โ”‚ โ”‚
โ”‚ โ”‚      notify_first_try = False                                                                โ”‚ โ”‚
โ”‚ โ”‚      polling_interval = 5.0                                                                  โ”‚ โ”‚
โ”‚ โ”‚        search_forever = True                                                                 โ”‚ โ”‚
โ”‚ โ”‚           search_once = False                                                                โ”‚ โ”‚
โ”‚ โ”‚                  self = <camply.search.search_yellowstone.SearchYellowstone object at        โ”‚ โ”‚
โ”‚ โ”‚                         0x7f8451804a00>                                                      โ”‚ โ”‚
โ”‚ โ”‚               verbose = True                                                                 โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/notifications/multi_prov โ”‚
โ”‚ ider_notifications.py:130 in last_gasp                                                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   127 โ”‚   โ”‚   for provider in self.providers:                                                    โ”‚
โ”‚   128 โ”‚   โ”‚   โ”‚   if provider.last_gasp is True:                                                 โ”‚
โ”‚   129 โ”‚   โ”‚   โ”‚   โ”‚   provider.send_message(error_message)                                       โ”‚
โ”‚ โฑ 130 โ”‚   โ”‚   raise RuntimeError(error_message) from error                                       โ”‚
โ”‚   131                                                                                            โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   date_string = '2024-05-01 07:38:00'                                                        โ”‚ โ”‚
โ”‚ โ”‚         error = AttributeError("'list' object has no attribute 'items'")                     โ”‚ โ”‚
โ”‚ โ”‚ error_message = 'camply encountered an error and exited ๐Ÿ˜Ÿ [2024-05-01 07:38:00] -           โ”‚ โ”‚
โ”‚ โ”‚                 (AttributeError'+40                                                          โ”‚ โ”‚
โ”‚ โ”‚  error_string = "'list' object has no attribute 'items'"                                     โ”‚ โ”‚
โ”‚ โ”‚      provider = <PushoverNotifications>                                                      โ”‚ โ”‚
โ”‚ โ”‚          self = <MultiNotifierProvider>                                                      โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
RuntimeError: camply encountered an error and exited ๐Ÿ˜Ÿ [2024-05-01 07:38:00] - (AttributeError) 'list' object has no attribute 'items'
juftin commented 7 months ago

Thanks for reporting this. It's been a while since I've worked with the Yellowstone provider, sounds like their API is returning inconsistent results. I'll dig into this and see if I can't get it fixed up soon.

zhazell commented 7 months ago

May not be related but I was looking over the console logs as it was running and noticed that it seems to be searching 3 campgrounds and I only specified two. YLYM and YLYF, but it's also doing an API call for YLYB (Bridge Bay Campground).


[2024-05-01 08:45:41] INFO     2 Matching Campgrounds Found
[2024-05-01 08:45:41] INFO     โ›ฐ  Yellowstone National Park, USA (#1) - ๐Ÿ•  Madison Campground (YLYM:RV)
[2024-05-01 08:45:41] INFO     โ›ฐ  Yellowstone National Park, USA (#1) - ๐Ÿ•  Fishing Bridge RV Park (YLYF:RV)
[2024-05-01 08:45:41] INFO     Searching for Yellowstone Lodging Availability: June, 2024
[2024-05-01 08:45:41] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:46] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/availability/hotels/yellowstonenationalparklodges?date=2024-06-01&limit=31&rate_code=INTERNET&nights=3 HTTP/1.1" 200 None
[2024-05-01 08:45:47] INFO             โ›บ๏ธ      4 sites found.
[2024-05-01 08:45:47] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:48] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/availability/rooms/yellowstonenationalparklodges/YLYB:RV?date=2024-06-01&limit=31&nights=3 HTTP/1.1" 200 None
[2024-05-01 08:45:48] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:49] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/availability/rooms/yellowstonenationalparklodges/YLYF:RV?date=2024-06-01&limit=31&nights=3 HTTP/1.1" 200 None
[2024-05-01 08:45:49] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:50] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/availability/rooms/yellowstonenationalparklodges/YLYM:RV?date=2024-06-01&limit=31&nights=3 HTTP/1.1" 200 None
[2024-05-01 08:45:51] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:51] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/property/rooms/yellowstonenationalparklodges/YLYB:RV HTTP/1.1" 200 None
[2024-05-01 08:45:51] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:52] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/property/rooms/yellowstonenationalparklodges/YLYF:RV HTTP/1.1" 200 None
[2024-05-01 08:45:52] DEBUG    Starting new HTTPS connection (1): webapi.xanterra.net:443
[2024-05-01 08:45:53] DEBUG    https://webapi.xanterra.net:443 "GET /v1/api/property/rooms/yellowstonenationalparklodges/YLYM:RV HTTP/1.1" 200 None
[2024-05-01 08:45:53] INFO     โŒ โŒ โŒ โŒ 0 Reservable Campsites Matching Search Preferences
[2024-05-01 08:45:53] INFO     No Campsites were found, we'll continue checking````
juftin commented 7 months ago

Looks like the API for Yellowstone had some kind of behavior change. Rather than returning {"availability": {}} when no availabilities are found it started returning {"availability": []}

I was only able to replicate this once, but I can see it in your debug logging:

โ”‚ /home/zach/.local/pipx/venvs/camply/lib/python3.10/site-packages/camply/providers/xanterra/yello โ”‚
โ”‚ wstone_lodging.py:417 in get_monthly_campsites                                                   โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   414 โ”‚   โ”‚   availability_found = self._get_monthly_availability(                               โ”‚
โ”‚   415 โ”‚   โ”‚   โ”‚   month=search_date, nights=nights                                               โ”‚
โ”‚   416 โ”‚   โ”‚   )                                                                                  โ”‚
โ”‚ โฑ 417 โ”‚   โ”‚   availability = XantResortData(**availability_found)                                โ”‚
โ”‚   418 โ”‚   โ”‚   monthly_campsites = self._compile_campground_availabilities(                       โ”‚
โ”‚   419 โ”‚   โ”‚   โ”‚   availability=availability                                                      โ”‚
โ”‚   420 โ”‚   โ”‚   )                                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                               โ”‚
โ”‚ โ”‚ availability_found = {'availability': []}      โ”‚                                               โ”‚
โ”‚ โ”‚              month = datetime.date(2024, 6, 1) โ”‚                                               โ”‚
โ”‚ โ”‚             nights = 3                         โ”‚                                               โ”‚
โ”‚ โ”‚                now = datetime.date(2024, 5, 1) โ”‚                                               โ”‚
โ”‚ โ”‚        search_date = datetime.date(2024, 6, 1) โ”‚                                               โ”‚
โ”‚ โ”‚               self = <Yellowstone>             โ”‚                                               โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                               โ”‚

https://github.com/juftin/camply/pull/346 will resolve this

juftin commented 7 months ago

The PR will auto-close this issue when it's merged momentarily and you can resolve this on your end by upgrading camply to the newest version. Please let me know if you encounter any other issues ๐Ÿค

juftin commented 7 months ago

:tada: This issue has been resolved in version 0.32.6 :tada:

The release is available on GitHub release

Your semantic-release bot :package::rocket: