# -*- coding: utf-8 -*-
from setuptools import setup

packages = \
['camply',
 'camply.config',
 'camply.containers',
 'camply.notifications',
 'camply.providers',
 'camply.providers.recreation_dot_gov',
 'camply.providers.xanterra',
 'camply.search',
 'camply.utils']

package_data = \
{'': ['*']}

install_requires = \
['PyYAML>=5.1,<7.0',
 'click>=8.0.1',
 'pandas>=1.3,<1.4',
 'pydantic>=1.2,<2.0',
 'python-dotenv>=0.10.4',
 'pytz>=2019.1',
 'requests>=2.26.0',
 'rich>=10.0.0',
 'tenacity>=5.1.0']

extras_require = \
{'all': ['twilio>=7.14.0'], 'twilio': ['twilio>=7.14.0']}

entry_points = \
{'console_scripts': ['camply = camply.cli:cli']}

setup_kwargs = {
    'name': 'camply',
    'version': '0.7.0',
    'description': 'camply, the campsite finder 🏕',
    'long_description': '<div align="center">\n<a href="https://github.com/juftin/camply">\n  <img src="https://raw.githubusercontent.com/juftin/camply/main/docs/source/_static/camply.svg"\n    width="400" height="400" alt="camply">\n</a>\n</div>\n\n`camply`, the campsite finder ⛺️, is a tool to help you book a campground online. Finding\nreservations at sold out campgrounds can be tough. That\'s where camply comes in. It searches the\nAPIs of booking services like https://recreation.gov (which indexes thousands of campgrounds across\nthe USA) to continuously check for cancellations and availabilities to pop up. Once a campsite\nbecomes available, camply sends you a notification to book your spot!\n\n___________\n___________\n\n[![PyPI](https://img.shields.io/pypi/v/camply?color=blue&label=⛺️camply)](https://github.com/juftin/camply)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/camply)](https://pypi.python.org/pypi/camply/)\n[![Docker Image Version](https://img.shields.io/docker/v/juftin/camply?color=blue&label=docker&logo=docker)](https://hub.docker.com/r/juftin/camply)\n[![Testing Status](https://github.com/juftin/camply/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/juftin/camply/actions/workflows/tests.yaml)\n[![GitHub License](https://img.shields.io/github/license/juftin/camply?color=blue&label=License)](https://github.com/juftin/camply/blob/main/LICENSE)\n[![Black Codestyle](https://img.shields.io/badge/code%20style-black-000000.svg)]()\n\n\n## [Check Out The Docs](https://juftin.com/camply/)\n\n## Table of Contents\n\n- [Installation](#installation)\n    * [PyPI](#pypi)\n    * [Docker](#docker)\n    * [Building Locally](#building-locally)\n- [Command Line Usage](#command-line-usage)\n    * [campsites](#campsites)\n    * [recreation-areas](#recreation-areas)\n    * [campgrounds](#campgrounds)\n    * [configure](#configure)\n    * [Examples](#examples)\n        + [Searching for a Campsite](#searching-for-a-campsite)\n        + [Searching for a Campsite by Campground ID](#searching-for-a-campsite-by-campground-id)\n        + [Searching for a Specific Campsite by ID](#searching-for-a-specific-campsite-by-id)\n        + [Continuously Searching for A Campsite](#continuously-searching-for-a-campsite)\n        + [Continue Looking After The First Match Is Found](#continue-looking-after-the-first-match-is-found)\n        + [Send a Push Notification](#send-a-push-notification)\n        + [Send a Text Message](#send-a-text-message)\n        + [Send a Notification to Different Services](#send-a-notification-to-different-services)\n        + [Look for Weekend Campsite Availabilities](#look-for-weekend-campsite-availabilities)\n        + [Look for Consecutive Nights at the Same Campsite](#look-for-consecutive-nights-at-the-same-campsite)\n        + [Look for a Campsite Inside of Yellowstone](#look-for-a-campsite-inside-of-yellowstone)\n        + [Look for a Campsite Across Multiple Recreation areas](#look-for-a-campsite-across-multiple-recreation-areas)\n        + [Using a YAML Configuration file to search for campsites](#using-a-yaml-configuration-file-to-search-for-campsites)\n        + [Searching for a Campsite That Fits Your Equipment](#searching-for-a-campsite-that-fits-your-equipment)\n        + [Saving the Results of a Search](#saving-the-results-of-a-search)\n        + [Search for Recreation Areas by Query String](#search-for-recreation-areas-by-query-string)\n        + [Look for Specific Campgrounds Within a Recreation Area](#look-for-specific-campgrounds-within-a-recreation-area)\n        + [Look for Specific Campgrounds by Query String](#look-for-specific-campgrounds-by-query-string)\n- [Finding Recreation Areas IDs and Campground IDs To Search Without Using the Command Line](#finding-recreation-areas-ids-and-campground-ids-to-search-without-using-the-command-line)\n- [Object-Oriented Usage (Python)](#object-oriented-usage-python)\n    * [Search for a Recreation.gov Campsite](#search-for-a-recreationgov-campsite)\n    * [Continuously Search for Recreation.gov Campsites](#continuously-search-for-recreationgov-campsites)\n- [Running in Docker](#running-in-docker)\n- [Dependencies](#dependencies)\n\n## Installation\n\n### PyPI\n\nCamply is hosted on PyPI, you can download it directly from tools like\npip and pipx.\n\n```shell\npip install camply\n```\n\nIf you\'re using camply on your command line - it\'s recommended that you use a tool\nlike [pipx](https://github.com/pypa/pipx) to easily manage the application in an isolated\nvirtual environment.\n\n```shell\npipx install camply\n```\n\n[PyPI Link](https://pypi.python.org/pypi/camply/)\n\n### Docker\n\n```shell\ndocker pull juftin/camply\n```\n\n[Docker Hub Link](https://hub.docker.com/r/juftin/camply)\n\n**_see [Running in Docker](#running-in-docker) below._\n\n## Command Line Usage\n\nWhen installed, `camply`\'s command line utility can be invoked with the command, `camply`. The CLI\ntool accepts one of four sub-arguments: `campsites`, `recreation-areas`, `campgrounds`,\nand `configure`.\n\n```text\n❯ camply --help\n\nUsage: camply [OPTIONS] COMMAND [ARGS]...\n\n  Welcome to camply, the campsite finder.\n\n  Finding reservations at sold out campgrounds can be tough. That\'s where\n  camply comes in. It searches the APIs of booking services like\n  https://recreation.gov (which indexes thousands of campgrounds across the\n  USA) to continuously check for cancellations and availabilities to pop up.\n  Once a campsite becomes available, camply sends you a notification to book\n  your spot!\n\n  visit the camply documentation at https://github.com/juftin/camply\n\nOptions:\n  --version             Show the version and exit.\n  --provider TEXT       Camping Search Provider. Options available are\n                        \'Yellowstone\' and \'RecreationDotGov\'. Defaults to\n                        \'RecreationDotGov\', not case-sensitive.\n  --debug / --no-debug  Enable extra debugging output\n  --help                Show this message and exit.\n\nCommands:\n  campgrounds       Search for Campgrounds (inside of Recreation Areas)...\n  campsites         Find available Campsites using search criteria\n  configure         Set up camply configuration file with an interactive...\n  recreation-areas  Search for Recreation Areas and list them\n```\n\n### campsites\n\nSearch for a campsite within camply. Campsites are returned based on the search criteria provided.\nCampsites contain properties like booking date, site type (tent, RV, cabin, etc), capacity, price,\nand a link to make the booking. Required parameters include `--start-date`, `--end-date`,\n`--rec-area` / `--campground` / `--campsite`. Constant searching functionality can be enabled with\n`--continuous` and notifications via Email, Pushover, Pushbullet, and Telegram can be enabled using\n`--notifications`.\n\n#### Arguments\n\n* `--rec-area`: `RECREATION_AREA_ID`\n    + Add Recreation Areas (comprised of campgrounds) by ID.\n      [**_example_](#searching-for-a-campsite)\n* `--campground`: `CAMPGROUND_ID`\n    + Add individual Campgrounds by ID.\n      [**_example_](#searching-for-a-campsite-by-campground-id)\n* `--campsite`: `CAMPSITE_ID`\n    + Add individual Campsites by ID.\n      [**_example_](#searching-for-a-specific-campsite-by-id)\n* `--start-date`: `START_DATE`\n    + `YYYY-MM-DD`: Start of Search window. You will be arriving this day.\n      [**_example_](#searching-for-a-campsite)\n* `--end-date`: `END_DATE`\n    + `YYYY-MM-DD`: End of Search window. You will be checking out this day..\n      [**_example_](#searching-for-a-campsite)\n* `--weekends`\n    + Only search for weekend bookings (Fri/Sat nights).\n      [**_example_](#look-for-weekend-campsite-availabilities)\n* `--nights`\n    + Search for campsite stays with consecutive nights. Defaults to 1 which returns all campsites\n      found.\n      [**_example_](#look-for-consecutive-nights-at-the-same-campsite)\n* `--provider`: `PROVIDER`\n    + Camping Search Provider. Options available are \'Yellowstone\' and \'RecreationDotGov\'. Defaults\n      to \'RecreationDotGov\', not case-sensitive.\n      [**_example_](#look-for-a-campsite-inside-of-yellowstone)\n* `--continuous`\n    + Continuously check for a campsite to become available, and quit once at least one campsite is\n      found.\n      [**_example_](#continuously-searching-for-a-campsite)\n* `--search-forever`\n    + If `--continuous` is activated, this method continues to search after the first availability\n      has been found. The one caveat is that it will never notify about the same identical campsite\n      for the same booking date.\n      [**_example_](#continue-looking-after-the-first-match-is-found)\n* `--notifications`: `NOTIFICATIONS`\n    + If `--continuous` is activated, types of notifications to receive. Options available\n      are`email`, `pushover`, `pushbullet`, `telegram`, or `silent`. Defaults to `silent` - which just logs\n      messages to console.\n      [**_example_](#send-a-push-notification)\n* `--equipment`\n    + Search for campsites compatible with your camping equipment. This argument accepts two\n      options, the equipment name and its length If you don\'t want to filter based on length provide\n      a length of 0. Accepted equipment names include `Tent`, `RV`. `Trailer`, `Vehicle` and are\n      not case-sensitive.\n      [**_example_](#searching-for-a-campsite-that-fits-your-equipment)\n* `--notify-first-try`\n    + If `--continuous` is activated, whether to send all non-silent notifications if more than 5\n      matching campsites are found on the first try. Defaults to false which only sends the first5.\n      [**_example_](#continuously-searching-for-a-campsite)\n* `--polling-interval`: `POLLING_INTERVAL`\n    + If `--continuous` is activated, how often to wait in between checks (in minutes). Defaults to\n      10, cannot be less than 5.\n      [**_example_](#look-for-weekend-campsite-availabilities)\n* `--yaml-config`\n    + Rather than provide arguments to the command line utility, instead pass a file path to a YAML\n      configuration file. See the documentation for more information on how to structure your\n      configuration file.\n      [**_example_](#using-a-yaml-configuration-file-to-search-for-campsites)\n\n```shell\ncamply campsites \\\n    --rec-area 2725 \\\n    --start-date 2023-07-10 \\\n    --end-date 2023-07-18\n```\n\n### recreation-areas\n\nSearch for Recreation Areas and their IDs. Recreation Areas are places like National Parks and\nNational Forests that can contain one or many campgrounds.\n\n#### Arguments:\n\n* `--search` `SEARCH`\n    + Search for Campgrounds or Recreation Areas by search string.\n* `--state` `STATE`\n    + Filter by US state code.\n\n```shell\ncamply recreation-areas --search "Yosemite National Park"\n```\n\n**_see the [examples](#search-for-recreation-areas-by-query-string) for more information_\n\n### campgrounds\n\nSearch for Campgrounds and their IDs. Campgrounds are facilities inside of Recreation Areas that\ncontain campsites. Most \'campgrounds\' are areas made up of multiple campsites, others are facilities\nlike fire towers or cabins that might only contain a single \'campsite\' to book.\n\n#### Arguments:\n\n* `--search` `SEARCH`\n    + Search for Campgrounds or Recreation Areas by search string.\n* `--state` `STATE`\n    + Filter by US state code.\n* `--rec-area`: `RECREATION_AREA_ID`\n    + Add Recreation Areas (comprised of campgrounds) by ID.\n* `--campground`: `CAMPGROUND_ID`\n    + Add individual Campgrounds by ID.\n\n```shell\ncamply campgrounds --search "Fire Tower Lookout" --state CA\n```\n\n**_see the [examples](#look-for-specific-campgrounds-by-query-string) for more information_\n\n### configure\n\nSet up `camply` configuration file with an interactive console\n\nIn order to send notifications through `camply` you must set up some authorization values. Whether\nyou need to set up [Pushover notifications](https://pushover.net)\n, [PushBullet](https://www.pushbullet.com/#settings/account), [Telegram](https://core.telegram.org/bots),\nor Email messages, everything can be done through the `configure` command. The end result is a file called\n[`.camply`](docs/examples/example.camply) in your home folder. See\nthe [Running in Docker](#running-in-docker) section to see how you can use environment variables\ninstead of a config file.\n\n```shell\ncamply configure\n```\n\n### Examples\n\nRead through the examples below to get a better understanding of `camply`, its features, and the\nfunctionality of the different arguments provided to the CLI.\n\n#### Searching for a Campsite\n\nThe below search looks for campsites inside of Recreation Area ID #2725 (Glacier National Park)\nbetween 2023-07-10 and 2023-07-17. The search will be performed once and any results will be logged\nto the console. camply searches for campsites inside of search windows in increments of one night.\n`--start-date` and `--end-date` define the bounds of the search window, you will be leaving the day\nafter `--end-date`.\n\n```shell\ncamply campsites \\\n    --rec-area 2725 \\\n    --start-date 2023-07-10 \\\n    --end-date 2023-07-18\n```\n\n#### Searching for a Campsite by Campground ID\n\nThe below search looks for across three campgrounds (all inside Glacier National Park)\nbetween 2023-07-10 and 2023-07-17. Multiple Campgrounds (and Recreation Areas too) can be found by\nsupplying the arguments more than once.\n\n```shell\ncamply campsites \\\n    --campground 232493 \\\n    --campground 251869 \\\n    --campground 232492 \\\n    --start-date 2023-07-10 \\\n    --end-date 2023-07-18\n```\n\n#### Searching for a Specific Campsite by ID\n\nSometimes you have a favorite campsite inside your favorite campground. To search for just a\nspecific campsite (and not just all campsites within a campground) you can give its ID to `camply`\nwith the `--campsite` argument. For example, site `R035` in Many Glacier Campground, MT is close to\na trailhead. Its URL\nis [https://www.recreation.gov/camping/campsites/98363](https://www.recreation.gov/camping/campsites/98363)\n, here we can see that it\'s ID is `98363`. You can search for one or many campsites by ID by\nsupplying the `--campsite` argument. You can provide the `--campsite` argument once or multiple\ntimes to search for different campsites. Note, `--campsite` arguments override any `--rec-area`\nor `--campground` parameters provided.\n\n```shell\ncamply campsites \\\n    --campsite 98363 \\\n    --start-date 2023-07-10 \\\n    --end-date 2023-07-18\n```\n\n#### Continuously Searching for A Campsite\n\nSometimes you want to look for campgrounds until an eventual match is found. The below snippet will\nsearch for matching campsites until it finds a match. It also sends a notification via `pushover`\nonce matches are found. Alternate notification methods are `email`, `pushbullet`, `telegram`, and `silent` (\ndefault).\n\n__Important Note__: When `camply` is told to run `--continuous` with non-silent notifications set up\nand it finds more than 5 matching campsites on the first try, it will only send notifications for\nthe first 5 campsites. This is to prevent thousands of campsites flooding your notifications. It\'s\nalways encouraged to perform an initial online search before setting up a `camply` search. To bypass\nthis behavior and send all notifications, pass the `--notify-first-try` argument.\n\n```shell\ncamply campsites \\\n    --rec-area 2725 \\\n    --start-date 2023-07-12 \\\n    --end-date 2023-07-13 \\\n    --continuous \\\n    --notifications pushover \\\n    --notify-first-try\n```\n\n#### Continue Looking After The First Match Is Found\n\nSometimes you want to search for all possible matches up until your arrival date. No problem. Add\nthe `--search-forever` and `camply` won\'t stop sending notifications after the first match is found.\nOne important note, `camply` will save and store all previous notifications when `--search-forever`\nis enabled, so it won\'t notify you about the exact same campsite availability twice. This can be\nproblematic when certain campsites become available more than once.\n\n```shell\ncamply campsites \\\n    --rec-area 2725 \\\n    --start-date 2023-07-01 \\\n    --end-date 2023-08-01 \\\n    --continuous \\\n    --notifications pushover \\\n    --search-forever\n```\n\n#### Send a Push Notification\n\ncamply supports notifications via `Pushbullet`, `Pushover`, `Telegram`, and `Email`. Pushbullet is a great\noption because it\'s\na [free and easy service to sign up for](https://www.pushbullet.com/#settings/account)\nand it supports notifications across different devices and operating systems. Similar to `Pushover`,\n`Pushbullet` requires that you create an account and an API token, and share that token with camply\nthrough a [configuration file](docs/examples/example.camply) (via the `camply configure`\ncommand) or though environment variables (`PUSHBULLET_API_TOKEN`).\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-09-10 \\\n    --end-date 2023-09-21 \\\n    --continuous \\\n    --notifications pushbullet\n```\n\n#### Send a Text Message\n\nIf you want to sign up for a [Twilio](https://www.twilio.com/try-twilio) account, camply also supports\nsending text messages via SMS. You can set up your Twilio configuration via `camply configure`. You will need\nto set the following config values for Twilio: `TWILIO_ACCOUNT_SID`, `TWILIO_AUTH_TOKEN`,\n`TWILIO_SOURCE_NUMBER`, `TWILIO_DEST_NUMBERS`.\n\nSending text messages via Twilio also requires the `twilio` extras:\n\n```\npip install camply[twilio]\n```\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-09-10 \\\n    --end-date 2023-09-21 \\\n    --continuous \\\n    --notifications twilio\n```\n\n#### Send a Notification to Different Services\n\ncamply supports notifications from different providers. To send notifications to multiple providers\nyou can pass the --notifications parameter multiple times. YAML config entries also\naccept an array as well.\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-09-10 \\\n    --end-date 2023-09-21 \\\n    --continuous \\\n    --notifications email \\\n    --notifications pushover\n```\n\n#### Look for Weekend Campsite Availabilities\n\nThis below search looks across larger periods of time, but only if a campground is available to book\non a Friday or Saturday night (`--weekends`). It also uses the `--polling-interval` argument which\nchecks every 5 minutes instead of the default 10 minutes.\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-05-01 \\\n    --end-date 2023-08-01 \\\n    --weekends \\\n    --continuous \\\n    --notifications email \\\n    --polling-interval 5\n```\n\n#### Look for Consecutive Nights at the Same Campsite\n\nA lot of times you need to search for consecutive nights at the same campsite. By default, any and\nall campsites with a single nights booking are returned by camply. To search for campsites with\nconsecutive night stays, pass the `--nights` argument.\n\nNote, the `--nights` argument handles issues with improper search parameters. For example, if you\nset the `--weekends` parameter the maximum number of consecutive nights possible is 2. If you supply\nmore than this your `--nights` parameter will be overwritten to 2.\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-05-01 \\\n    --end-date 2023-08-01 \\\n    --nights 4\n```\n\n#### Look for a Campsite Inside of Yellowstone\n\nYellowstone doesn\'t use https://recreation.gov to manage its campgrounds, instead it uses its own\nproprietary system. In order to search the Yellowstone API for campsites, make sure to pass\nthe `--provider "yellowstone"` argument. This flag disables `--rec-area` argument.\n\nTo learn more about using `camply` to find campsites at Yellowstone, check out\nthis [discussion](https://github.com/juftin/camply/discussions/15#discussioncomment-783657).\n\n```shell\ncamply campsites \\\n    --provider yellowstone \\\n    --start-date 2023-07-09 \\\n    --end-date 2023-07-17 \\\n    --continuous\n```\n\n#### Look for a Campsite Across Multiple Recreation areas\n\nYou don\'t have to confine your search to a single Recreation or Campground ID. Adding multiple\narguments to the command line will search across multiple IDs. Keep in mind that any `--campground`\narguments will overwrite all `--rec-area` arguments.\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --rec-area 1074 \\\n    --start-date 2023-07-09 \\\n    --end-date 2023-07-17 \\\n    --nights 5\n```\n\n#### Using a YAML Configuration file to search for campsites\n\nSometimes, using a YAML configuration file is easier to manage all of your search options. See the\nbelow [YAML example file](docs/examples/example_search.yaml) and corresponding camply command:\n\n```yaml\nprovider:         RecreationDotGov  # RecreationDotGov IF NOT PROVIDED\nrecreation_area: # (LIST OR SINGLE ENTRY)\n  - 2991  # Yosemite National Park, CA (All Campgrounds)\n  - 1074  # Sierra National Forest, CA (All Campgrounds)\ncampgrounds:      null  # ENTIRE FIELD CAN BE OMITTED IF NOT USED - (LIST OR SINGLE ENTRY)\ncampsites:        null   # OVERRIDES CAMPGROUNDS / RECREATION AREA - (LIST OR SINGLE ENTRY)\nstart_date:       2023-09-12  # YYYY-MM-DD\nend_date:         2023-09-13  # YYYY-MM-DD\nweekends:         false  # FALSE BY DEFAULT\nnights:           1  # 1 BY DEFAULT\ncontinuous:       true  # DEFAULTS TO TRUE\npolling_interval: 5  # DEFAULTS TO 10 , CAN\'T BE LESS THAN 5\nnotifications:    email  # (silent, email, pushover, pushbullet, and telegram), DEFAULTS TO `silent`\nsearch_forever:   true  # FALSE BY DEFAULT\nnotify_first_try: false  # FALSE BY DEFAULT\nequipment:        null # Array of Equipment Search Lists - DEFAULTS TO `null`\noffline_search: false    # FALSE BY DEFAULT\noffline_search_path: camply_campsites.json # Defaults to `camply_campsites.json`\n```\n\n```shell\ncamply campsites --yaml-config example_search.yaml\n```\n\n#### Searching for a Campsite That Fits Your Equipment\n\nCamply can help you filter campsites to fit your specific equipment, like a Trailer or an RV.\nMost likely, you care that the campsite fits the length of your RV so you can specify that as well.\nTo search for specific equipment and its length provide the `--equipment` option with two arguments,\nthe equipment name and the equipment length. If you don\'t want to filter based on length provide a\nlength of zero. If you provide multiple `--equipment` options, sites matching any of your search\nequipment will be returned.\n\nCurrent supported equipment names are `Vehicle`, `Tent`, `RV`, and `Trailer`. Be careful when\nfiltering on `Tents` and `Vehicle` length, sometimes Recreation.gov doesn\'t provide that information,\nit is safer to set length to 0.\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-07-09 \\\n    --end-date 2023-07-17 \\\n    --nights 5 \\\n    --equipment RV 25\n```\n\nHere\'s what the above search would look like on a YAML Config:\n\n```yaml\nrecreation_area:\n    - 2991\nstart_date:       2023-07-09\nend_date:         2023-07-17\nnights:           5\nequipment:\n    - [RV, 25]\n```\n\nFinally, here\'s a search that accommodates trailers of all lengths:\n\n```shell\ncamply campsites \\\n    --rec-area 2991 \\\n    --start-date 2023-07-09 \\\n    --end-date 2023-07-17 \\\n    --nights 5 \\\n    --equipment Trailer 0\n```\n\n#### Saving the Results of a Search\n\nIn some cases, you might want to save all the campsites found during one\nsearch and load them into a new search, so you don\'t receive duplicate notifications.\nThis can be achieved by passing the `--offline-search` flag. By default, camply will save\nthe results in a file called `camply_campsites.json`.\n\nOptionally, you can also path the `--offline-search-path` flag to specify a certain file\npath to save the results as. When a file path with a `.json` extension is passed\ncamply will export the results as a JSON file. When the `.pkl` or `.pickle` extension is\nused, camply will use a serialized Pickle file.\n\n```shell\ncamply \\\n  campsites \\\n  --campground 232064 \\\n  --start-date 2023-09-01 \\\n  --end-date 2023-10-01 \\\n  --continuous \\\n  --offline-search\n```\n\n```shell\ncamply \\\n  campsites \\\n  --campground 232064 \\\n  --start-date 2023-09-01 \\\n  --end-date 2023-10-01 \\\n  --continuous \\\n  --offline-search \\\n  --offline-search-path campsites.pkl\n```\n\n#### Search for Recreation Areas by Query String\n\nJust need to find what your local Recreation Area ID number is? This simple command allows you to\nsearch and list recreation areas. It accepts `--search` and `--state` arguments.\n\n```shell\ncamply recreation-areas --search "Yosemite National Park"\n```\n\n#### Look for Specific Campgrounds Within a Recreation Area\n\nNeed to get even more specific and search for a particular campground? This search lists campgrounds\nattached to a recreation area id `--rec-area`. It also accepts `--search` and `--state`\narguments.\n\n```shell\ncamply campgrounds --rec-area 2991\n```\n\n#### Look for Specific Campgrounds by Query String\n\nThe below search looks for Fire Lookout Towers to stay in inside of California.\n\n```shell\ncamply campgrounds --search "Fire Tower Lookout" --state CA\n```\n\n## Finding Recreation Areas IDs and Campground IDs To Search Without Using the Command Line\n\nYou can uncover campground and recreation area IDs just by using the https://recreation.gov search\nfunctionality. Use the below example for a campground within Glacier National Park.\n\nFirst, perform your search on https://recreation.gov.\n\n<div>\n<img src="https://raw.githubusercontent.com/juftin/camply/main/docs/source/_static/recreation_dot_gov.png"\n    width="500" alt="recreation_dot_gov search">\n</div>\n\nThe above search will take you to a URL like this:\nhttps://www.recreation.gov/search?q=Glacier%20National%20Park&entity_id=2725&entity_type=recarea.\nTaking a closer look at the URL components you can see that Glacier National Park has the Recreation\nArea ID #2725.\n\nSearching deeper into campgrounds inside of Glacier National Park you might find Fish Creek\nCampground at a URL like https://www.recreation.gov/camping/campgrounds/232493. Here, we can see\nthat this campground has a Campground ID of #232493.\n\n## Object-Oriented Usage (Python)\n\n### Search for a Recreation.gov Campsite\n\n```python\nfrom datetime import datetime\nimport logging\nfrom typing import List\n\nfrom camply.containers import AvailableCampsite, SearchWindow\nfrom camply.search import SearchRecreationDotGov\n\nlogging.basicConfig(format="%(asctime)s [%(levelname)8s]: %(message)s",\n                    level=logging.INFO)\n\nmonth_of_june = SearchWindow(start_date=datetime(year=2022, month=6, day=1),\n                             end_date=datetime(year=2022, month=6, day=30))\ncamping_finder = SearchRecreationDotGov(search_window=month_of_june,\n                                        recreation_area=2725,  # Glacier Ntl Park\n                                        weekends_only=False,\n                                        nights=1)\nmatches: List[AvailableCampsite] = camping_finder.get_matching_campsites(log=True, verbose=True,\n                                                                         continuous=False)\n```\n\nThe above script returns a list of any matching `AvailableCampsite` pydantic objects:\n\n```python\n[\n    AvailableCampsite(campsite_id="5391",\n                      booking_date=datetime.datetime(2022, 6, 13, 0, 0),\n                      campsite_site_name="B37",\n                      campsite_loop_name="Loop B",\n                      campsite_type="STANDARD NONELECTRIC",\n                      campsite_occupancy=(0, 8),\n                      campsite_use_type="Overnight",\n                      availability_status="Available",\n                      recreation_area="Glacier National Park, MT",\n                      recreation_area_id="2725",\n                      facility_name="Fish Creek Campground",\n                      facility_id="232493",\n                      booking_url="https://www.recreation.gov/camping/campsites/5391")\n]\n```\n\n### Continuously Search for Recreation.gov Campsites\n\nYou\'ll notice that the `get_matching_campsites` function takes accepts parameter values very similar\nto the commandline arguments.\n\n```python\nfrom datetime import datetime\nimport logging\n\nfrom camply.containers import SearchWindow\nfrom camply.search import SearchRecreationDotGov\n\nlogging.basicConfig(format="%(asctime)s [%(levelname)8s]: %(message)s",\n                    level=logging.INFO)\n\nmonth_of_june = SearchWindow(start_date=datetime(year=2022, month=6, day=1),\n                             end_date=datetime(year=2022, month=6, day=30))\ncamping_finder = SearchRecreationDotGov(search_window=month_of_june,\n                                        recreation_area=[2991, 1074],  # Multiple Rec Areas\n                                        weekends_only=False,\n                                        nights=3)\ncamping_finder.get_matching_campsites(log=True, verbose=True,\n                                      continuous=True,\n                                      polling_interval=5,\n                                      notification_provider="pushover",\n                                      search_forever=True,\n                                      notify_first_try=False)\n```\n\n## Running in Docker\n\nHere\'s an example of a detached container searching in the background (notice the `-d` flag, the\ncontainer will run detached).\n\n```shell\ndocker run -d \\\n  --name camply-detached-example \\\n  --env PUSHOVER_PUSH_TOKEN=${PUSHOVER_PUSH_TOKEN} \\\n  --env PUSHOVER_PUSH_USER=${PUSHOVER_PUSH_USER} \\\n  --env TZ="America/Denver" \\\n  juftin/camply \\\n  camply campsites \\\n      --rec-area 2991 \\\n      --start-date 2023-08-01 \\\n      --end-date 2023-09-01 \\\n      --continuous \\\n      --notifications pushover\n```\n\nThe docker image accepts the following environment variables:\n\n- Pushover Notifications\n    * `PUSHOVER_PUSH_USER`\n- Email Notifications\n    * `EMAIL_TO_ADDRESS`\n    * `EMAIL_USERNAME`\n    * `EMAIL_PASSWORD`\n    * `EMAIL_FROM_ADDRESS` (defaults to "camply@juftin.com")\n    * `EMAIL_SUBJECT_LINE` (defaults to "camply Notification")\n    * `EMAIL_SMTP_SERVER` (defaults to "smtp.gmail.com")\n    * `EMAIL_SMTP_PORT` (defaults to 465)\n- Optional Environment Variables\n    * `LOG_LEVEL` (sets logging level, defaults to "INFO")\n    * `PUSHOVER_PUSH_TOKEN` (Personal Pushover App Token)\n    * `RIDB_API_KEY` (Personal API Key\n      for [Recreation.gov API](https://ridb.recreation.gov/profile))\n    * `TZ` ([TZ Database Name](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for\n      logging, defaults to UTC)\n\nAlternatively, if you have already run `camply configure` locally, you can share\nyour [`.camply`](docs/examples/example.camply) file inside the docker container.\n\n```shell\ndocker run \\\n  --name camply-file-share-example \\\n  --env TZ="America/Denver" \\\n  --volume ${HOME}/.camply:/home/camply/.camply \\\n  juftin/camply \\\n  camply campsites \\\n      --provider yellowstone \\\n      --start-date 2023-07-22 \\\n      --end-date 2023-07-27 \\\n      --continuous \\\n      --notifications email\n```\n\nTo manage multiple searches (with different notification preferences) I like to use YAML\nconfiguration files:\n\n```shell\ndocker run -d \\\n  --name camply-email-example \\\n  --env TZ="America/Denver" \\\n  --env EMAIL_TO_ADDRESS=${EMAIL_TO_ADDRESS} \\\n  --env EMAIL_USERNAME=${EMAIL_USERNAME} \\\n  --env EMAIL_PASSWORD=${EMAIL_PASSWORD} \\\n  --volume example_search.yaml:/home/camply/example_search.yaml \\\n  juftin/camply:latest \\\n  camply campsites \\\n      --yaml-config /home/camply/example_search.yaml\n```\n\nA [docker-compose example](docs/examples/docker-compose.yaml) of the above YAML Config is also\navailable.\n\n## Dependencies\n\n`camply` is compatible with any Python version >= `3.6`. Currently, there are eight required\ndependencies:\n\n- [click](https://docs.python-requests.org/en/master/)\n    - The `click` package is used to leverage it\'s simple Command Line Interface\n      API for camply\n- [requests](https://docs.python-requests.org/en/master/)\n    - The `requests` package is used to fetch data from the APIs of Camping Booking Providers.\n- [pandas](https://pandas.pydata.org/)\n    - The `pandas` package is to group and aggregate across large data sets of campsites,\n      campgrounds, and recreation areas.\n- [tenacity](https://tenacity.readthedocs.io/en/latest/)\n    - The `tenacity` package is used for retrying data searches on the underlying campsite APIs.\n      This retrying methodology handles exceptions allowing for API downtime and facilitating\n      exponential backoff.\n- [rich](https://github.com/textualize/rich)\n    - Colorizing the CLI\n- [python-dotenv](https://github.com/theskumar/python-dotenv)\n    - The `python-dotenv` package reads key-value pairs from a `.env` file and can set them as\n      environment variables - this helps with the `.camply` configuration file.\n- [pydantic](https://github.com/samuelcolvin/pydantic)\n    - The `pydantic` package performs data validation against API responses and assists with fancy\n      data containers for `camply` objects.\n- [PyYAML](https://pyyaml.org/)\n    - PyYAML is a YAML parsing library - this helps with the YAML file campsite searches.\n\n<br/>\n\nRecreation data provided by [**Recreation.gov**](https://ridb.recreation.gov/)\n\n___________\n___________\n\n<br/>\n\n[<p align="center" ><img src="https://raw.githubusercontent.com/juftin/juftin/main/static/juftin.png" width="120" height="120"  alt="juftin logo"> </p>](https://github.com/juftin)\n',
    'author': 'Justin Flannery',
    'author_email': 'juftin@juftin.com',
    'maintainer': 'None',
    'maintainer_email': 'None',
    'url': 'https://github.com/juftin/camply',
    'packages': packages,
    'package_data': package_data,
    'install_requires': install_requires,
    'extras_require': extras_require,
    'entry_points': entry_points,
    'python_requires': '>=3.7.1,<4.0',
}


setup(**setup_kwargs)
