diff --git a/README.md b/README.md index 61bae8cd..bdca4711 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ This Nautobot application framework includes the following integrations: - Infoblox - IPFabric - Itential +- Cisco Meraki - ServiceNow Read more about integrations [here](https://docs.nautobot.com/projects/ssot/en/latest/user/integrations). To enable and configure integrations follow the instructions from [the install guide](https://docs.nautobot.com/projects/ssot/en/latest/admin/install/#integrations-configuration). @@ -42,16 +43,19 @@ Read more about integrations [here](https://docs.nautobot.com/projects/ssot/en/l --- The dashboard view of the app. + ![Dashboard View](https://raw.githubusercontent.com/nautobot/nautobot-app-ssot/develop/docs/images/dashboard_initial.png) --- The detailed view of the example data source that is prepackaged within this app. + ![Data Source Detail View](https://raw.githubusercontent.com/nautobot/nautobot-app-ssot/develop/docs/images/data_source_detail.png) --- The detailed view of an executed sync. + ![Sync Detail View](https://raw.githubusercontent.com/nautobot/nautobot-app-ssot/develop/docs/images/sync_detail.png) --- @@ -83,6 +87,7 @@ The SSoT framework includes a number of integrations with external Systems of Re * Cisco DNA Center * Infoblox * Itential +* Cisco Meraki * ServiceNow > Note that the Arista CloudVision integration is currently incompatible with the [Arista Labs](https://labs.arista.com/) environment due to a TLS issue. It has been confirmed to work in on-prem environments previously. diff --git a/changes/574.added b/changes/574.added new file mode 100644 index 00000000..554a15aa --- /dev/null +++ b/changes/574.added @@ -0,0 +1 @@ +Added integration with Cisco Meraki. \ No newline at end of file diff --git a/changes/574.changed b/changes/574.changed new file mode 100644 index 00000000..1076d956 --- /dev/null +++ b/changes/574.changed @@ -0,0 +1 @@ +Updated DNA Center Job to use SSoT verify_controller_managed_device_group utility function so code is more DRY. \ No newline at end of file diff --git a/changes/574.documentation b/changes/574.documentation new file mode 100644 index 00000000..96e74bc3 --- /dev/null +++ b/changes/574.documentation @@ -0,0 +1 @@ +Added documentation for Meraki integration. \ No newline at end of file diff --git a/changes/574.fixed b/changes/574.fixed new file mode 100644 index 00000000..73941fd6 --- /dev/null +++ b/changes/574.fixed @@ -0,0 +1 @@ +Fixed the ACI integration's retrieval of Controller Managed Device Group name that was breaking ACI adapter. diff --git a/development/creds.example.env b/development/creds.example.env index 42aa42b8..45757d45 100644 --- a/development/creds.example.env +++ b/development/creds.example.env @@ -52,3 +52,6 @@ IPFABRIC_API_TOKEN=secrettoken NAUTOBOT_SSOT_ENABLE_BOOTSTRAP="False" NAUTOBOT_BOOTSTRAP_SSOT_ENVIRONMENT_BRANCH=develop NAUTOBOT_BOOTSTRAP_SSOT_LOAD_SOURCE=file # or git + +MERAKI_ORG_ID='123456' +MERAKI_TOKEN='vtx01710aa0fn452740055y1hs60ns8c107ho168' diff --git a/development/development.env b/development/development.env index 4e4bde26..04f1bbfb 100644 --- a/development/development.env +++ b/development/development.env @@ -94,6 +94,8 @@ NAUTOBOT_SSOT_INFOBLOX_USERNAME="changeme" NAUTOBOT_SSOT_INFOBLOX_VERIFY_SSL="True" # NAUTOBOT_SSOT_INFOBLOX_WAPI_VERSION="" +NAUTOBOT_SSOT_ENABLE_MERAKI="False" + NAUTOBOT_SSOT_ENABLE_SERVICENOW="False" SERVICENOW_INSTANCE="" SERVICENOW_USERNAME="" diff --git a/development/nautobot_config.py b/development/nautobot_config.py index 2069a54c..7210ce59 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -227,6 +227,7 @@ "enable_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_INFOBLOX")), "enable_ipfabric": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_IPFABRIC")), "enable_itential": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ITENTIAL")), + "enable_meraki": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_MERAKI")), "enable_servicenow": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SERVICENOW")), "hide_example_jobs": is_truthy(os.getenv("NAUTOBOT_SSOT_HIDE_EXAMPLE_JOBS")), "device42_defaults": { diff --git a/docs/admin/install.md b/docs/admin/install.md index a674b892..d520a47d 100644 --- a/docs/admin/install.md +++ b/docs/admin/install.md @@ -97,4 +97,5 @@ Set up each integration using the specific guides: - [Infoblox](./integrations/infoblox_setup.md) - [IPFabric](./integrations/ipfabric_setup.md) - [Itential](./integrations/itential_setup.md) +- [Cisco Meraki](./integrations/meraki_setup.md) - [ServiceNow](./integrations/servicenow_setup.md) diff --git a/docs/admin/integrations/index.md b/docs/admin/integrations/index.md index ce610d82..e8c23e27 100644 --- a/docs/admin/integrations/index.md +++ b/docs/admin/integrations/index.md @@ -10,4 +10,5 @@ This Nautobot app supports the following integrations: - [Infoblox](./infoblox_setup.md) - [IPFabric](./ipfabric_setup.md) - [Itential](./itential_setup.md) +- [Cisco Meraki](./meraki_setup.md) - [ServiceNow](./servicenow_setup.md) diff --git a/docs/admin/integrations/meraki_setup.md b/docs/admin/integrations/meraki_setup.md new file mode 100644 index 00000000..d08f48fd --- /dev/null +++ b/docs/admin/integrations/meraki_setup.md @@ -0,0 +1,25 @@ +# Cisco Meraki Integration Setup + +This guide will walk you through steps to set up Cisco Meraki integration with the `nautobot_ssot` app. + +## Prerequisites + +Before configuring the integration, please ensure, that `nautobot-ssot` app was [installed with Cisco Meraki integration extra dependencies](../install.md#install-guide). + +```shell +pip install nautobot-ssot[meraki] +``` + +## Configuration + +Connecting to a Meraki instance is handled through the Nautobot [Controller](https://docs.nautobot.com/projects/core/en/stable/development/core/controllers/) object. There is an expectation that you will create an [ExternalIntegration](https://docs.nautobot.com/projects/core/en/stable/user-guide/platform-functionality/externalintegration/) with the requisite connection information for your Meraki dashboard attached to that Controller object. All imported Devices will be associated to a [ControllerManagedDeviceGroup](https://docs.nautobot.com/projects/core/en/stable/user-guide/core-data-model/dcim/controllermanageddevicegroup/) that is found or created during each Job run. It will update the group name to be " Managed Devices" if it exists. When running the Sync Job you will specify which Meraki Controller instance you wish to synchronize with along with other settings for the synchronization. + +Below is an example snippet from `nautobot_config.py` that demonstrates how to enable the Meraki integration: + +```python +PLUGINS_CONFIG = { + "nautobot_ssot": { + "enable_meraki": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_MERAKI", "true")), + } +} +``` diff --git a/docs/images/meraki_controller.png b/docs/images/meraki_controller.png new file mode 100644 index 00000000..8e7a7c22 Binary files /dev/null and b/docs/images/meraki_controller.png differ diff --git a/docs/images/meraki_dashboard.png b/docs/images/meraki_dashboard.png new file mode 100644 index 00000000..fe2cb528 Binary files /dev/null and b/docs/images/meraki_dashboard.png differ diff --git a/docs/images/meraki_detail-view.png b/docs/images/meraki_detail-view.png new file mode 100644 index 00000000..91ae1972 Binary files /dev/null and b/docs/images/meraki_detail-view.png differ diff --git a/docs/images/meraki_enabled_job.png b/docs/images/meraki_enabled_job.png new file mode 100644 index 00000000..ae68c09b Binary files /dev/null and b/docs/images/meraki_enabled_job.png differ diff --git a/docs/images/meraki_external_integration.png b/docs/images/meraki_external_integration.png new file mode 100644 index 00000000..65bcbb0d Binary files /dev/null and b/docs/images/meraki_external_integration.png differ diff --git a/docs/images/meraki_job_form.png b/docs/images/meraki_job_form.png new file mode 100644 index 00000000..92a952dc Binary files /dev/null and b/docs/images/meraki_job_form.png differ diff --git a/docs/images/meraki_job_list.png b/docs/images/meraki_job_list.png new file mode 100644 index 00000000..7fbdc215 Binary files /dev/null and b/docs/images/meraki_job_list.png differ diff --git a/docs/images/meraki_job_settings.png b/docs/images/meraki_job_settings.png new file mode 100644 index 00000000..619436b0 Binary files /dev/null and b/docs/images/meraki_job_settings.png differ diff --git a/docs/images/meraki_jobresult.png b/docs/images/meraki_jobresult.png new file mode 100644 index 00000000..be7b4b68 Binary files /dev/null and b/docs/images/meraki_jobresult.png differ diff --git a/docs/images/meraki_network_loctype.png b/docs/images/meraki_network_loctype.png new file mode 100644 index 00000000..8aad630b Binary files /dev/null and b/docs/images/meraki_network_loctype.png differ diff --git a/docs/images/meraki_org_id_secret.png b/docs/images/meraki_org_id_secret.png new file mode 100644 index 00000000..9ed86009 Binary files /dev/null and b/docs/images/meraki_org_id_secret.png differ diff --git a/docs/images/meraki_secretsgroup.png b/docs/images/meraki_secretsgroup.png new file mode 100644 index 00000000..197c2e4d Binary files /dev/null and b/docs/images/meraki_secretsgroup.png differ diff --git a/docs/images/meraki_token_secret.png b/docs/images/meraki_token_secret.png new file mode 100644 index 00000000..9f7430e9 Binary files /dev/null and b/docs/images/meraki_token_secret.png differ diff --git a/docs/user/integrations/index.md b/docs/user/integrations/index.md index 19dd72b7..961403d2 100644 --- a/docs/user/integrations/index.md +++ b/docs/user/integrations/index.md @@ -10,4 +10,5 @@ This Nautobot app supports the following integrations: - [Infoblox](./infoblox.md) - [IPFabric](./ipfabric.md) - [Itential](./itential.md) +- [Cisco Meraki](./meraki.md) - [ServiceNow](./servicenow.md) diff --git a/docs/user/integrations/meraki.md b/docs/user/integrations/meraki.md new file mode 100644 index 00000000..de364ef4 --- /dev/null +++ b/docs/user/integrations/meraki.md @@ -0,0 +1,87 @@ +# Cisco Meraki SSoT Integration + +The Cisco Meraki SSoT integration is built as part of the [Nautobot Single Source of Truth (SSoT)](https://github.com/nautobot/nautobot-app-ssot) app. The SSoT app enables Nautobot to be the aggregation point for data coming from multiple systems of record (SoR). + +From Cisco Meraki into Nautobot, it synchronizes the following objects: + +| Meraki | Nautobot | +| ----------------------- | ---------------------------- | +| Networks | Location* | +| Devices | Devices | +| Hardwares | DeviceTypes | +| OSVersions | SoftwareVersions | +| Ports | Interfaces | +| Prefixes | Prefixes | +| IP Addresses | IP Addresses | + +`*` As of SSoT 3.2.0 the LocationType for Networks can be defined in the Job form. + +## Usage + +Once the app is installed and configured, you will be able to perform an inventory ingestion from Meraki into Nautobot. From the Nautobot SSoT Dashboard view (`/plugins/ssot/`), Meraki will show as a Data Source. + +![Dashboard View](../../images/meraki_dashboard.png) + +From the Dashboard, you can also view more information about the App by clicking on the `Meraki to Nautobot` link and see the Detail view. This view will show the mappings of Meraki objects to Nautobot objects, the sync history, and other configuration details for the App: + +![Detail View](../../images/meraki_detail-view.png) + +In order to utilize this integration you must first enable the Job. You can find the available installed Jobs under Jobs -> Jobs: + +![Job List](../../images/meraki_job_list.png) + +To enable the Job you must click on the orange pencil icon to the right of the `Meraki to Nautobot` Job. You will be presented with the settings for the Job as shown below: + +![Job Settings](../../images/meraki_job_settings.png) + +You'll need to check the `Enabled` checkbox and then the `Update` button at the bottom of the page. You will then see that the play button next to the Job changes to blue and becomes functional, linking to the Job form. + +![Enabled Job](../../images/meraki_enabled_job.png) + +Once the Job is enabled, you'll need to manually create a few objects in Nautobot to use with the Job. First, you'll need to create a Secret that contains your organization ID and token for authenticating to your desired Meraki instance: + +![Org ID Secret](../../images/meraki_org_id_secret.png) + +![Token Secret](../../images/meraki_token_secret.png) + +Once the required Secrets are created, you'll need to create a SecretsGroup that pairs them together and defines the Access Type of HTTP(S) like shown below: + +![DNAC SecretsGroup](../../images/meraki_secretsgroup.png) + +With the SecretsGroup defined containing your instance credentials you'll then need to create an ExternalIntegration object to store the information about the Meraki instance you wish to synchronize with. + +![DNAC ExternalIntegration](../../images/meraki_external_integration.png) + +> The only required portions are the Name, Remote URL, Verify SSL, and Secrets Group. + +The final step before running the Job is to create a Controller that references the ExternalIntegration that you just created. You can attach a `Managed Device Group` to the Controller for all imported Devices to be placed in. If you don't create a Managed Device Group, one will be created automatically and associated to the specified Controller with the name of ` Managed Devices`. + +![DNAC Controller](../../images/meraki_controller.png) + +> You can utilize multiple Meraki Controllers with this integration as long as you specify a unique Tenant per Controller. The failure to use differing Tenants will have the Devices, Prefixes, and IPAddresses potentially removed if they are non-existent on the additional Controller. Locations should remain unaffected. + +With those configured, you will then need to define a LocationType to use for the imported Networks. With those created, you can run the Job to start the synchronization: + +![Job Form](../../images/meraki_job_form.png) + +If you wish to just test the synchronization but not have any data created in Nautobot you'll want to select the `Dryrun` toggle. Clicking the `Debug` toggle will enable more verbose logging to inform you of what is occuring behind the scenes. After those toggles there are also dropdowns that allow you to specify the Meraki Controller to synchronize with and to define the LocationType to use for the imported Networks from Meraki. In addition, there are also some optional settings on the Job form: + +- Should the LocationType that you specify for the imported Networks require a parent Location to be assigned, you can define this parent one of two ways: + +1. The Parent Location field allows you to define a singular Location that will be assigned as the parent for all imported Network Locations. + +2. The Location Mapping field allows you to define a dictionary of Location mappings. This feature is intended for specifying parent Locations for the Network Locations in Meraki. This is useful if this information is missing from Meraki but required for Nautobot or to allow you to change the information as it's imported to match information from another System of Record. The expected pattern for this field is `{"": {"parent": ""}}`. + +In addition, there are two methods provided to assign Roles to your imported Devices: + +1. The Hostname Mapping field allows you to specify list of tuples containing a regular expression pattern to match against Device hostnames and the Role to assign if matched. Ex: [(".*FW.*", "Firewall")] + +2. The DeviceType Mapping field allows you to specify a list of tuples containing a string to match against the Device model and the Role to assign when matched. The string to match can simply be the series letters, ie MX for firewalls, or explicit models like MX84. Ex: [("MS", "Switch")] + +- Finally there is an option to specify a Tenant to be assigned to the imported Devices, Prefixes, and IPAddreses. This is handy for cases where you have multiple Meraki instances that are used by differing business units. + +Running this Job will redirect you to a `Nautobot Job Result` view. + +![JobResult View](../../images/meraki_jobresult.png) + +Once the Job has finished you can click on the `SSoT Sync Details` button at the top right of the Job Result page to see detailed information about the data that was synchronized from Meraki and the outcome of the sync Job. diff --git a/mkdocs.yml b/mkdocs.yml index 51264d4f..2e3b1187 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -116,6 +116,7 @@ nav: - Infoblox: "user/integrations/infoblox.md" - IPFabric: "user/integrations/ipfabric.md" - Itential: "user/integrations/itential.md" + - Cisco Meraki: "user/integrations/meraki.md" - ServiceNow: "user/integrations/servicenow.md" - Modeling: "user/modeling.md" - Performance: "user/performance.md" @@ -133,6 +134,7 @@ nav: - Infoblox: "admin/integrations/infoblox_setup.md" - IPFabric: "admin/integrations/ipfabric_setup.md" - Itential: "admin/integrations/itential_setup.md" + - Cisco Meraki: "admin/integrations/meraki_setup.md" - ServiceNow: "admin/integrations/servicenow_setup.md" - Upgrade: "admin/upgrade.md" - Uninstall: "admin/uninstall.md" diff --git a/nautobot_ssot/__init__.py b/nautobot_ssot/__init__.py index c3b47ce4..b769fbee 100644 --- a/nautobot_ssot/__init__.py +++ b/nautobot_ssot/__init__.py @@ -22,6 +22,8 @@ "nautobot_ssot_dna_center", "nautobot_ssot_infoblox", "nautobot_ssot_ipfabric", + "nautobot_ssot_itential", + "nautobot_ssot_meraki", "nautobot_ssot_servicenow", ] diff --git a/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py b/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py index f8d9ab89..6f490054 100644 --- a/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py +++ b/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py @@ -435,8 +435,8 @@ def load_devices(self): site=self.site, site_tag=self.site, controller_group=( - self.job.apic.controller_managed_device_groups.name - if self.job.apic.controller_managed_device_groups + self.job.apic.controller_managed_device_groups.first().name + if self.job.apic.controller_managed_device_groups.count() != 0 else "" ), ) diff --git a/nautobot_ssot/integrations/dna_center/jobs.py b/nautobot_ssot/integrations/dna_center/jobs.py index 282770ff..7767a9ce 100644 --- a/nautobot_ssot/integrations/dna_center/jobs.py +++ b/nautobot_ssot/integrations/dna_center/jobs.py @@ -4,7 +4,7 @@ from django.urls import reverse from nautobot.apps.jobs import BooleanVar, JSONVar, ObjectVar from nautobot.core.celery import register_jobs -from nautobot.dcim.models import Controller, ControllerManagedDeviceGroup, LocationType +from nautobot.dcim.models import Controller, LocationType from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices from nautobot.tenancy.models import Tenant @@ -12,6 +12,7 @@ from nautobot_ssot.integrations.dna_center.diffsync.adapters import dna_center, nautobot from nautobot_ssot.integrations.dna_center.utils.dna_center import DnaCenterClient from nautobot_ssot.jobs.base import DataMapping, DataSource +from nautobot_ssot.utils import verify_controller_managed_device_group name = "DNA Center SSoT" # pylint: disable=invalid-name @@ -107,16 +108,10 @@ def data_mappings(cls): DataMapping("IP Addresses", None, "IP Addresses", reverse("ipam:ipaddress_list")), ) - def get_controller_group(self): - """Method to get or create ControllerManagedDeviceGroup for imported Devices.""" - self.controller_group = ControllerManagedDeviceGroup.objects.update_or_create( - controller=self.dnac, defaults={"name": f"{self.dnac.name} Managed Devices"} - )[0] - def load_source_adapter(self): """Load data from DNA Center into DiffSync models.""" self.logger.info(f"Loading data from {self.dnac.name}") - self.get_controller_group() + verify_controller_managed_device_group(controller=self.dnac) _sg = self.dnac.external_integration.secrets_group username = _sg.get_secret_value( access_type=SecretsGroupAccessTypeChoices.TYPE_HTTP, diff --git a/nautobot_ssot/integrations/meraki/__init__.py b/nautobot_ssot/integrations/meraki/__init__.py new file mode 100644 index 00000000..e67c01b6 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/__init__.py @@ -0,0 +1 @@ +"""Base module for Meraki integration.""" diff --git a/nautobot_ssot/integrations/meraki/diffsync/__init__.py b/nautobot_ssot/integrations/meraki/diffsync/__init__.py new file mode 100644 index 00000000..4a2396be --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/__init__.py @@ -0,0 +1 @@ +"""DiffSync models and adapters for Meraki SSoT.""" diff --git a/nautobot_ssot/integrations/meraki/diffsync/adapters/__init__.py b/nautobot_ssot/integrations/meraki/diffsync/adapters/__init__.py new file mode 100644 index 00000000..35a90f04 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/adapters/__init__.py @@ -0,0 +1 @@ +"""Adapter classes for loading DiffSyncModels with data from Meraki or Nautobot.""" diff --git a/nautobot_ssot/integrations/meraki/diffsync/adapters/meraki.py b/nautobot_ssot/integrations/meraki/diffsync/adapters/meraki.py new file mode 100644 index 00000000..5c1205f6 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/adapters/meraki.py @@ -0,0 +1,371 @@ +"""Nautobot SSoT for Meraki Adapter for Meraki SSoT plugin.""" + +from diffsync import Adapter, DiffSyncModel +from diffsync.exceptions import ObjectNotFound +from netutils.ip import ipaddress_interface, netmask_to_cidr + +from nautobot_ssot.exceptions import JobException +from nautobot_ssot.integrations.meraki.diffsync.models.meraki import ( + MerakiDevice, + MerakiHardware, + MerakiIPAddress, + MerakiIPAssignment, + MerakiNetwork, + MerakiOSVersion, + MerakiPort, + MerakiPrefix, +) +from nautobot_ssot.integrations.meraki.utils.meraki import get_role_from_devicetype, parse_hostname_for_role + + +class MerakiAdapter(Adapter): + """DiffSync adapter for Meraki.""" + + network = MerakiNetwork + hardware = MerakiHardware + osversion = MerakiOSVersion + device = MerakiDevice + port = MerakiPort + prefix = MerakiPrefix + ipaddress = MerakiIPAddress + ipassignment = MerakiIPAssignment + + top_level = ["network", "hardware", "osversion", "device", "prefix", "ipaddress", "ipassignment"] + + def __init__(self, job, sync, client, tenant=None): + """Initialize Meraki. + + Args: + job (object): Meraki SSoT job. + sync (object): Meraki DiffSync. + client (object): Meraki API client connection object. + tenant (object): Tenant specified in Job form to attach to imported Devices. + """ + super().__init__() + self.job = job + self.sync = sync + self.conn = client + self.tenant = tenant + self.device_map = {} + self.org_uplink_statuses = self.conn.get_org_uplink_statuses() + + def load_networks(self): + """Load networks from Meraki dashboard into DiffSync models.""" + for net in self.conn.get_org_networks(): + parent_name = None + if self.job.network_loctype.parent: + if self.job.parent_location: + parent_name = self.job.parent_location.name + elif self.job.location_map and net in self.job.location_map: + parent_name = self.job.location_map[net]["parent"] + else: + self.job.logger.error( + f"Parent Location is required for {self.job.network_loctype.name} but can't determine parent to be assigned to {net}." + ) + continue + self.get_or_instantiate( + self.network, + ids={"name": net["name"], "parent": parent_name}, + attrs={ + "timezone": net["timeZone"], + "notes": net["notes"].rstrip() if net.get("notes") else "", + "tags": net["tags"], + "tenant": self.tenant.name if self.tenant else None, + "uuid": None, + }, + ) + + def load_devices(self): # pylint: disable=too-many-branches + """Load devices from Meraki dashboard into DiffSync models.""" + self.device_map = {dev["name"]: dev for dev in self.conn.get_org_devices()} + statuses = self.conn.get_org_device_statuses() + status = "Offline" + for dev in self.device_map.values(): + if dev.get("name"): + if dev["name"] in statuses: + if statuses[dev["name"]] == "online": + status = "Active" + try: + self.get(self.device, dev["name"]) + self.job.logger.warning(f"Duplicate device {dev['name']} found and being skipped.") + except ObjectNotFound: + if self.job.hostname_mapping and len(self.job.hostname_mapping) > 0: + if self.job.debug: + self.job.logger.debug(f"Parsing hostname for device {dev['name']} to determine role.") + role = parse_hostname_for_role(dev_hostname=dev["name"], hostname_map=self.job.hostname_mapping) + elif self.job.devicetype_mapping and len(self.job.devicetype_mapping) > 0: + if self.job.debug: + self.job.logger.debug(f"Parsing device model for device {dev['name']} to determine role.") + role = get_role_from_devicetype( + dev_model=dev["model"], devicetype_map=self.job.devicetype_mapping + ) + else: + role = "Unknown" + self.load_hardware_model(device_info=dev) + self.get_or_instantiate(self.osversion, ids={"version": dev["firmware"]}) + new_dev, loaded = self.get_or_instantiate( + self.device, + ids={"name": dev["name"]}, + attrs={ + "controller_group": self.job.instance.controller_managed_device_groups.first().name + if self.job.instance.controller_managed_device_groups.count() != 0 + else "", + "notes": dev["notes"].rstrip(), + "serial": dev["serial"], + "status": status, + "role": role, + "model": dev["model"], + "network": self.conn.network_map[dev["networkId"]]["name"], + "tenant": self.tenant.name if self.tenant else None, + "uuid": None, + "version": dev["firmware"], + }, + ) + if loaded: + if dev["model"].startswith(("MX", "MG", "Z")): + self.load_firewall_ports(device=new_dev, serial=dev["serial"], network_id=dev["networkId"]) + if dev["model"].startswith("MS"): + self.load_switch_ports(device=new_dev, serial=dev["serial"]) + if dev["model"].startswith("MR"): + self.load_ap_ports(device=new_dev, serial=dev["serial"]) + else: + self.job.logger.warning(f"Device serial {dev['serial']} is missing hostname so will be skipped.") + + def load_hardware_model(self, device_info: dict): + """Load hardware model from device information.""" + try: + self.get(self.hardware, device_info["model"]) + except ObjectNotFound: + new_hardware = self.hardware( + model=device_info["model"], + uuid=None, + ) + self.add(new_hardware) + + def load_firewall_ports(self, device: DiffSyncModel, serial: str, network_id: str): # pylint: disable=too-many-locals + """Load ports of a firewall, cellular, or teleworker device from Meraki dashboard into DiffSync models.""" + mgmt_ports = self.conn.get_management_ports(serial=serial) + uplink_settings = self.conn.get_uplink_settings(serial=serial) + lan_ports = self.conn.get_appliance_switchports(network_id=network_id) + + # keep track of whether a primary IP has already been found since we can only assign one + primary_found = False + for port in mgmt_ports.keys(): + uplink_status = "Planned" + if serial in self.org_uplink_statuses: + uplinks = self.org_uplink_statuses[serial]["uplinks"] + for link in uplinks: + if link["interface"] == port and link["status"] == "active": + uplink_status = "Active" + port_uplink_settings = uplink_settings[port] + new_port, loaded = self.get_or_instantiate( + self.port, + ids={"name": port, "device": device.name}, + attrs={ + "management": True, + "enabled": port_uplink_settings["enabled"], + "port_type": "1000base-t", + "port_status": uplink_status, + "tagging": port_uplink_settings["vlanTagging"]["enabled"], + "uuid": None, + }, + ) + if loaded: + self.add(new_port) + device.add_child(new_port) + if port_uplink_settings["svis"]["ipv4"]["assignmentMode"] == "static": + port_svis = port_uplink_settings["svis"]["ipv4"] + prefix = ipaddress_interface(ip=port_svis["address"], attr="network.with_prefixlen") + self.load_prefix( + location=self.conn.network_map[network_id]["name"], + prefix=prefix, + ) + self.load_ipaddress( + address=port_svis["address"], + prefix=prefix, + ) + self.load_ipassignment( + address=port_svis["address"], + dev_name=device.name, + port=port, + primary=bool(uplink_status == "Active" and not primary_found), + ) + if uplink_status == "Active": + primary_found = True + if lan_ports: + self.process_lan_ports(device, lan_ports) + + def process_lan_ports(self, device: DiffSyncModel, lan_ports: dict): + """Load the switchports for a Device into DiffSync models. + + Args: + device (DiffSyncModel): Loaded Device DiffSyncModel to associate with Port to be loaded. + lan_ports (dict): Dictionary of switchport data. + """ + for port in lan_ports: + new_port, loaded = self.get_or_instantiate( + self.port, + ids={"name": str(port["number"]), "device": device.name}, + attrs={ + "management": False, + "enabled": port["enabled"], + "port_type": "1000base-t", + "port_status": "Active", + "tagging": bool(port["type"] == "trunk"), + "uuid": None, + }, + ) + if loaded: + self.add(new_port) + device.add_child(new_port) + + def load_switch_ports(self, device: DiffSyncModel, serial: str): + """Load ports of a switch device from Meraki dashboard into DiffSync models.""" + mgmt_ports = self.conn.get_management_ports(serial=serial) + org_switchports = self.conn.get_org_switchports() + + for port in mgmt_ports.keys(): + try: + self.get(self.port, {"name": port, "device": device.name}) + except ObjectNotFound: + mgmt_port = self.port( + name=port, + device=device.name, + management=True, + enabled=True, + port_type="1000base-t", + port_status="Active", + tagging=False, + uuid=None, + ) + self.add(mgmt_port) + device.add_child(mgmt_port) + if mgmt_ports[port].get("usingStaticIp"): + prefix = ipaddress_interface( + ip=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(netmask=mgmt_ports[port]['staticSubnetMask'])}", + attr="network.with_prefixlen", + ) + self.load_prefix( + location=self.conn.network_map[self.device_map[device.name]["networkId"]]["name"], + prefix=prefix, + ) + self.load_ipaddress( + address=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(mgmt_ports[port]['staticSubnetMask'])}", + prefix=prefix, + ) + self.load_ipassignment( + address=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(mgmt_ports[port]['staticSubnetMask'])}", + dev_name=device.name, + port=port, + primary=True, + ) + if serial in org_switchports: + for port in org_switchports[serial]["ports"]: + new_port = self.port( + name=port["portId"], + device=device.name, + management=False, + enabled=port["enabled"], + port_type="1000base-t", + port_status="Active", + tagging=bool(port["type"] == "trunk"), + uuid=None, + ) + self.add(new_port) + device.add_child(new_port) + + def load_ap_ports(self, device: DiffSyncModel, serial: str): + """Load ports of a MR device from Meraki dashboard into DiffSync models.""" + mgmt_ports = self.conn.get_management_ports(serial=serial) + + for port in mgmt_ports.keys(): + try: + self.get(self.port, {"name": port, "device": device.name}) + except ObjectNotFound: + new_port = self.port( + name=port, + device=device.name, + management=True, + enabled=True, + port_type="1000base-t", + port_status="Active", + tagging=False, + uuid=None, + ) + self.add(new_port) + device.add_child(new_port) + if mgmt_ports[port].get("usingStaticIp"): + prefix = ipaddress_interface( + ip=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(netmask=mgmt_ports[port]['staticSubnetMask'])}", + attr="network.with_prefixlen", + ) + self.load_prefix( + location=self.conn.network_map[self.device_map[device.name]["networkId"]]["name"], + prefix=prefix, + ) + self.load_ipaddress( + address=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(mgmt_ports[port]['staticSubnetMask'])}", + prefix=prefix, + ) + self.load_ipassignment( + address=f"{mgmt_ports[port]['staticIp']}/{netmask_to_cidr(mgmt_ports[port]['staticSubnetMask'])}", + dev_name=device.name, + port=port, + primary=True, + ) + + def load_prefix(self, location: str, prefix: str): + """Load Prefixes of devices into DiffSync models.""" + if self.tenant: + namespace = self.tenant.name + else: + namespace = "Global" + try: + self.get(self.prefix, {"prefix": prefix, "namespace": namespace}) + except ObjectNotFound: + new_pf = self.prefix( + prefix=prefix, + location=location, + namespace=namespace, + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + self.add(new_pf) + + def load_ipaddress(self, address: str, prefix: str): + """Load IPAddresses of devices into DiffSync models.""" + try: + self.get(self.ipaddress, {"address": address, "prefix": prefix}) + except ObjectNotFound: + new_ip = self.ipaddress( + address=address, + prefix=prefix, + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + self.add(new_ip) + + def load_ipassignment(self, address: str, dev_name: str, port: str, primary: bool): + """Load IPAddressesToInterface of devices into DiffSync models.""" + namespace = self.tenant.name if self.tenant else "Global" + try: + self.get(self.ipassignment, {"address": address, "device": dev_name, "namespace": namespace, "port": port}) + except ObjectNotFound: + new_map = self.ipassignment( + address=address, + namespace=namespace, + device=dev_name, + port=port, + primary=primary, + uuid=None, + ) + self.add(new_map) + + def load(self): + """Load data from Meraki into DiffSync models.""" + if self.conn.validate_organization_exists(): + self.load_networks() + self.load_devices() + else: + self.job.logger.error("Specified organization ID not found in Meraki dashboard.") + raise JobException("Incorrect Organization ID specified.") diff --git a/nautobot_ssot/integrations/meraki/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/meraki/diffsync/adapters/nautobot.py new file mode 100644 index 00000000..3af64c44 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/adapters/nautobot.py @@ -0,0 +1,362 @@ +"""Nautobot Adapter for Meraki SSoT plugin.""" + +from collections import defaultdict +from typing import Optional + +from diffsync import Adapter +from diffsync.enum import DiffSyncModelFlags +from diffsync.exceptions import ObjectNotFound +from django.contrib.contenttypes.models import ContentType +from django.db.models import ProtectedError +from nautobot.dcim.models import ( + Device, + DeviceType, + Interface, + Location, + LocationType, + Manufacturer, + Platform, + SoftwareVersion, +) +from nautobot.extras.models import Note, Role, Status +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Namespace, Prefix +from nautobot.tenancy.models import Tenant + +from nautobot_ssot.integrations.meraki.diffsync.models.nautobot import ( + NautobotDevice, + NautobotHardware, + NautobotIPAddress, + NautobotIPAssignment, + NautobotNetwork, + NautobotOSVersion, + NautobotPort, + NautobotPrefix, +) +from nautobot_ssot.integrations.meraki.utils.nautobot import get_tag_strings + + +class NautobotAdapter(Adapter): # pylint: disable=too-many-instance-attributes + """DiffSync adapter for Nautobot.""" + + network = NautobotNetwork + hardware = NautobotHardware + osversion = NautobotOSVersion + device = NautobotDevice + port = NautobotPort + prefix = NautobotPrefix + ipaddress = NautobotIPAddress + ipassignment = NautobotIPAssignment + + top_level = ["network", "hardware", "osversion", "device", "prefix", "ipaddress", "ipassignment"] + + status_map = {} + tenant_map = {} + locationtype_map = {} + region_map = {} + site_map = {} + platform_map = {} + manufacturer_map = {} + devicerole_map = {} + devicetype_map = {} + device_map = {} + port_map = {} + namespace_map = {} + prefix_map = {} + ipaddr_map = {} + contenttype_map = {} + version_map = {} + + def __init__(self, job, sync=None, tenant: Optional[Tenant] = None): + """Initialize Nautobot. + + Args: + job (object): Nautobot job. + sync (object, optional): Nautobot DiffSync. Defaults to None. + tenant (Tenant, optional): Nautobot Tenant to assign to loaded objects. Defaults to None. + """ + super().__init__() + self.job = job + self.sync = sync + self.tenant = tenant + self.objects_to_create = defaultdict(list) + self.objects_to_delete = defaultdict(list) + + def load_sites(self): + """Load Site data from Nautobot into DiffSync model.""" + for site in Location.objects.filter(location_type=self.job.network_loctype): + self.site_map[site.name] = site + new_site, _ = self.get_or_instantiate( + self.network, + ids={"name": site.name, "parent": site.parent.name if site.parent else None}, + attrs={ + "notes": "", + "tags": get_tag_strings(list_tags=site.tags), + "timezone": str(site.time_zone) if site.time_zone else None, + "tenant": site.tenant.name if site.tenant else None, + "uuid": site.id, + }, + ) + if site.notes: + note = site.notes.last() + new_site.notes = note.note.rstrip() + + def load_devicetypes(self): + """Load DeviceType data from Nautobot into DiffSync model.""" + for devtype in DeviceType.objects.filter(manufacturer__name="Cisco Meraki"): + try: + self.get(self.hardware, devtype.model) + except ObjectNotFound: + new_dt = self.hardware(model=devtype.model, uuid=devtype.id) + if self.tenant: + new_dt.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_dt) + self.devicetype_map[devtype.model] = devtype.id + + def load_softwareversions(self): + """Load SoftwareVersion data from Nautobot into DiffSync model.""" + for ver in SoftwareVersion.objects.filter(platform__name="Cisco Meraki"): + self.get_or_instantiate(self.osversion, ids={"version": ver.version}, attrs={"uuid": ver.id}) + self.version_map[ver.version] = ver.id + + def load_devices(self): + """Load Device data from Nautobot into DiffSync model.""" + if self.tenant: + devices = Device.objects.filter(tenant=self.tenant) + else: + devices = Device.objects.filter(_custom_field_data__system_of_record="Meraki SSoT") + for dev in devices: + try: + self.get(self.device, dev.name) + except ObjectNotFound: + self.device_map[dev.name] = dev.id + self.port_map[dev.name] = {} + new_dev = self.device( + name=dev.name, + controller_group=dev.controller_managed_device_group.name + if dev.controller_managed_device_group + else None, + serial=dev.serial, + status=dev.status.name, + role=dev.role.name, + model=dev.device_type.model, + notes="", + network=dev.location.name, + tenant=dev.tenant.name if dev.tenant else None, + uuid=dev.id, + version=dev.software_version.version if dev.software_version else None, + ) + if dev.notes: + note = dev.notes.last() + new_dev.notes = note.note.rstrip() + if self.tenant: + new_dev.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_dev) + + def load_ports(self): + """Load Port data from Nautobot into DiffSync model.""" + if self.tenant: + ports = Interface.objects.filter(device__tenant=self.tenant) + else: + ports = Interface.objects.filter(_custom_field_data__system_of_record="Meraki SSoT") + for intf in ports: + try: + self.get(self.port, {"name": intf.name, "device": intf.device.name}) + except ObjectNotFound: + self.port_map[intf.device.name][intf.name] = intf.id + new_port = self.port( + name=intf.name, + device=intf.device.name, + management=intf.mgmt_only, + enabled=intf.enabled, + port_type=intf.type, + port_status=intf.status.name, + tagging=bool(intf.mode != "access"), + uuid=intf.id, + ) + if self.tenant: + new_port.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_port) + dev = self.get(self.device, intf.device.name) + dev.add_child(new_port) + + def load_prefixes(self): + """Load Prefixes from Nautobot into DiffSync models.""" + if self.tenant: + prefixes = Prefix.objects.filter(tenant=self.tenant) + else: + prefixes = Prefix.objects.filter(_custom_field_data__system_of_record="Meraki SSoT") + for prefix in prefixes: + new_pf = self.prefix( + prefix=str(prefix.prefix), + location=prefix.location.name if prefix.location else "", + namespace=prefix.namespace.name, + tenant=prefix.tenant.name if prefix.tenant else None, + uuid=prefix.id, + ) + if self.tenant: + new_pf.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_pf) + self.prefix_map[str(prefix.prefix)] = prefix.id + + def load_ipaddresses(self): + """Load IPAddresses from Nautobot into DiffSync models.""" + if self.tenant: + addresses = IPAddress.objects.filter(tenant=self.tenant) + else: + addresses = IPAddress.objects.filter(_custom_field_data__system_of_record="Meraki SSoT") + for ipaddr in addresses: + if str(ipaddr.parent.namespace) not in self.ipaddr_map: + self.ipaddr_map[str(ipaddr.parent.namespace)] = {} + self.ipaddr_map[str(ipaddr.parent.namespace)][str(ipaddr.address)] = ipaddr.id + new_ip = self.ipaddress( + address=str(ipaddr.address), + prefix=str(ipaddr.parent.prefix) if ipaddr.parent else "", + tenant=ipaddr.tenant.name if ipaddr.tenant else None, + uuid=ipaddr.id, + ) + if self.tenant: + new_ip.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_ip) + + def load_ipassignments(self): + """Load IPAddressToInterface from Nautobot into DiffSync models.""" + if self.tenant: + mappings = IPAddressToInterface.objects.filter(ip_address__tenant=self.tenant) + else: + mappings = IPAddressToInterface.objects.filter( + ip_address___custom_field_data__system_of_record="Meraki SSoT" + ) + for ipassignment in mappings: + new_map = self.ipassignment( + address=str(ipassignment.ip_address.address), + namespace=ipassignment.ip_address.parent.namespace.name, + device=ipassignment.interface.device.name, + port=ipassignment.interface.name, + primary=len(ipassignment.ip_address.primary_ip4_for.all()) > 0 + or len(ipassignment.ip_address.primary_ip6_for.all()) > 0, + uuid=ipassignment.id, + ) + if self.tenant: + new_map.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_map) + + def sync_complete(self, source: Adapter, *args, **kwargs): + """Clean up function for DiffSync sync. + + Once the sync is complete, this function runs deleting any objects + from Nautobot that need to be deleted in a specific order. + + Args: + source (Adapter): Source DiffSync Adapter. + args (dict): Positional arguments. + kwargs (dict): Keyword arguments. + """ + for grouping in ( + "ipaddrs", + "prefixes", + "ports", + "devices", + "devicetypes", + ): + for nautobot_object in self.objects_to_delete[grouping]: + try: + if self.job.debug: + self.job.logger.info(f"Deleting {nautobot_object}.") + nautobot_object.delete() + except ProtectedError: + self.job.logger.warning(f"Deletion failed protected object: {nautobot_object}") + self.objects_to_delete[grouping] = [] + + self.process_objects_to_create() + return super().sync_complete(source, *args, **kwargs) + + def process_objects_to_create(self): # pylint: disable=too-many-branches + """Process all of the objects that have been added to the objects_to_create dictionary.""" + if len(self.objects_to_create["devicetypes"]) > 0: + self.job.logger.info("Performing bulk create of DeviceTypes in Nautobot") + DeviceType.objects.bulk_create(self.objects_to_create["devicetypes"], batch_size=250) + if len(self.objects_to_create["devices"]) > 0: + self.job.logger.info("Performing bulk create of Devices in Nautobot") + Device.objects.bulk_create(self.objects_to_create["devices"], batch_size=250) + if len(self.objects_to_create["ports"]) > 0: + self.job.logger.info("Performing bulk create of Interfaces in Nautobot") + Interface.objects.bulk_create(self.objects_to_create["ports"], batch_size=250) + if len(self.objects_to_create["prefixes"]) > 0: + self.job.logger.info("Performing bulk create of Prefixes in Nautobot") + Prefix.objects.bulk_create(self.objects_to_create["prefixes"], batch_size=250) + if len(self.objects_to_create["prefix_locs"]) > 0: + self.job.logger.info("Performing assignment of Locations to Prefixes in Nautobot") + for pair in self.objects_to_create["prefix_locs"]: + update_pf = Prefix.objects.get(id=pair[0]) + update_pf.locations.add(pair[1]) + if len(self.objects_to_create["ipaddrs"]) > 0: + self.job.logger.info("Performing bulk create of IP Addresses in Nautobot") + IPAddress.objects.bulk_create(self.objects_to_create["ipaddrs"], batch_size=250) + if len(self.objects_to_create["ipaddrs-to-prefixes"]) > 0: + self.job.logger.info("Assigning parent Prefix to IPAddresses with bulk_update.") + assigned_parents = [] + for pair in self.objects_to_create["ipaddrs-to-prefixes"]: + ipaddr = pair[0] + ipaddr.parent_id = pair[1] + assigned_parents.append(ipaddr) + IPAddress.objects.bulk_update(assigned_parents, ["parent_id"], batch_size=250) + if len(self.objects_to_create["ipaddrs-to-intfs"]) > 0: + self.job.logger.info("Performing assignment of IPAddress to Port.") + IPAddressToInterface.objects.bulk_create(self.objects_to_create["ipaddrs-to-intfs"], batch_size=250) + if len(self.objects_to_create["device_primary_ip4"]) > 0: + self.job.logger.info("Performing bulk update of IPv4 addresses in Nautobot.") + device_primary_ip_objs = [] + for devip in self.objects_to_create["device_primary_ip4"]: + dev = Device.objects.get(id=devip[0]) + dev.primary_ip4_id = devip[1] + device_primary_ip_objs.append(dev) + Device.objects.bulk_update(device_primary_ip_objs, ["primary_ip4_id"], batch_size=250) + if len(self.objects_to_create["device_primary_ip6"]) > 0: + self.job.logger.info("Performing bulk update of IPv6 addresses in Nautobot.") + device_primary_ip_objs = [] + for devip in self.objects_to_create["device_primary_ip6"]: + dev = Device.objects.get(id=devip[0]) + dev.primary_ip6_id = devip[1] + device_primary_ip_objs.append(dev) + Device.objects.bulk_update(device_primary_ip_objs, ["primary_ip6_id"], batch_size=250) + if len(self.objects_to_create["notes"]) > 0: + self.job.logger.info("Performing bulk create of Notes in Nautobot") + Note.objects.bulk_create(self.objects_to_create["notes"], batch_size=250) + + def load(self): + """Load data from Nautobot into DiffSync models.""" + if self.job.tenant: + Namespace.objects.get_or_create(name=self.job.tenant.name) + if self.job.hostname_mapping and len(self.job.hostname_mapping) > 0: + for mapping in self.job.hostname_mapping: + new_role, _ = Role.objects.get_or_create(name=mapping[1]) + new_role.content_types.add(ContentType.objects.get_for_model(Device)) + if self.job.devicetype_mapping and len(self.job.devicetype_mapping) > 0: + for mapping in self.job.devicetype_mapping: + new_role, _ = Role.objects.get_or_create(name=mapping[1]) + new_role.content_types.add(ContentType.objects.get_for_model(Device)) + self.status_map = {s.name: s.id for s in Status.objects.only("id", "name")} + self.locationtype_map = {lt.name: lt.id for lt in LocationType.objects.only("id", "name")} + self.platform_map = {p.name: p.id for p in Platform.objects.only("id", "name")} + self.manufacturer_map = {m.name: m.id for m in Manufacturer.objects.only("id", "name")} + self.devicerole_map = {d.name: d.id for d in Role.objects.only("id", "name")} + self.namespace_map = {ns.name: ns.id for ns in Namespace.objects.only("id", "name")} + self.contenttype_map = {c.model: c.id for c in ContentType.objects.only("id", "model")} + + if self.job.parent_location: + self.region_map[self.job.parent_location.name] = Location.objects.get(name=self.job.parent_location).id + else: + self.region_map = { + loc_data["parent"]: Location.objects.get(name=loc_data["parent"]).id + for _, loc_data in self.job.location_map.items() + } + self.tenant_map = {t.name: t.id for t in Tenant.objects.only("id", "name")} + + self.load_sites() + self.load_devicetypes() + self.load_softwareversions() + self.load_devices() + self.load_ports() + self.load_prefixes() + self.load_ipaddresses() + self.load_ipassignments() diff --git a/nautobot_ssot/integrations/meraki/diffsync/models/__init__.py b/nautobot_ssot/integrations/meraki/diffsync/models/__init__.py new file mode 100644 index 00000000..e27fdbb6 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/models/__init__.py @@ -0,0 +1 @@ +"""DiffSync models and adapters for the Meraki SSoT app.""" diff --git a/nautobot_ssot/integrations/meraki/diffsync/models/base.py b/nautobot_ssot/integrations/meraki/diffsync/models/base.py new file mode 100644 index 00000000..a8aeedc6 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/models/base.py @@ -0,0 +1,146 @@ +"""DiffSyncModel subclasses for Nautobot-to-Meraki data sync.""" + +from typing import List, Optional +from uuid import UUID + +from diffsync import DiffSyncModel +from diffsync.enum import DiffSyncModelFlags + + +class Network(DiffSyncModel): + """DiffSync model for Meraki networks.""" + + model_flags: DiffSyncModelFlags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + + _modelname = "network" + _identifiers = ( + "name", + "parent", + ) + _attributes = ("timezone", "notes", "tags", "tenant") + _children = {} + + name: str + parent: Optional[str] = None + timezone: Optional[str] = None + notes: Optional[str] = None + tags: Optional[List[str]] = None + tenant: Optional[str] = None + + uuid: Optional[UUID] = None + + +class Hardware(DiffSyncModel): + """DiffSync model for Meraki models.""" + + _modelname = "hardware" + _identifiers = ("model",) + _attributes = () + _children = {} + + model: str + + uuid: Optional[UUID] = None + + +class OSVersion(DiffSyncModel): + """DiffSync model for Meraki device software versions.""" + + _modelname = "osversion" + _identifiers = ("version",) + _attributes = () + _children = {} + + version: str + + uuid: Optional[UUID] = None + + +class Device(DiffSyncModel): + """DiffSync model for Meraki devices.""" + + _modelname = "device" + _identifiers = ("name",) + _attributes = ("controller_group", "notes", "serial", "status", "role", "model", "network", "tenant", "version") + _children = {"port": "ports"} + + name: str + controller_group: Optional[str] = None + notes: Optional[str] = None + serial: Optional[str] = None + status: Optional[str] = None + role: Optional[str] = None + model: Optional[str] = None + network: str + tenant: Optional[str] = None + version: Optional[str] = None + ports: List["Port"] = [] + + uuid: Optional[UUID] = None + + +class Port(DiffSyncModel): + """DiffSync model for Meraki device ports.""" + + _modelname = "port" + _identifiers = ("name", "device") + _attributes = ("management", "enabled", "port_type", "port_status", "tagging") + _children = {} + + name: str + device: str + management: bool + enabled: bool + port_type: str + port_status: str + tagging: bool + + uuid: Optional[UUID] = None + + +class Prefix(DiffSyncModel): + """DiffSync model for Meraki Prefixes.""" + + _modelname = "prefix" + _identifiers = ("prefix", "namespace") + _attributes = ("location", "tenant") + _children = {} + + prefix: str + namespace: str + location: str + tenant: Optional[str] = None + + uuid: Optional[UUID] = None + + +class IPAddress(DiffSyncModel): + """DiffSync model for Meraki IP Addresses.""" + + _modelname = "ipaddress" + _identifiers = ("address", "prefix") + _attributes = ("tenant",) + _children = {} + + address: str + prefix: str + tenant: Optional[str] = None + + uuid: Optional[UUID] = None + + +class IPAssignment(DiffSyncModel): + """DiffSync model for Citrix ADM tracking IPAddress on particular Device interfaces.""" + + _modelname = "ipassignment" + _identifiers = ("address", "device", "namespace", "port") + _attributes = ("primary",) + _children = {} + + address: str + namespace: str + device: str + port: str + primary: bool + + uuid: Optional[UUID] = None diff --git a/nautobot_ssot/integrations/meraki/diffsync/models/meraki.py b/nautobot_ssot/integrations/meraki/diffsync/models/meraki.py new file mode 100644 index 00000000..f9d788a2 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/models/meraki.py @@ -0,0 +1,149 @@ +# pylint: disable=useless-parent-delegation +"""Nautobot SSoT for Meraki DiffSync models for Nautobot SSoT for Meraki SSoT.""" + +from nautobot_ssot.integrations.meraki.diffsync.models.base import ( + Device, + Hardware, + IPAddress, + IPAssignment, + Network, + OSVersion, + Port, + Prefix, +) + + +class MerakiNetwork(Network): + """Meraki implementation of Network DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Network in Meraki from MerakiNetwork object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Network in Meraki from MerakiNetwork object.""" + return super().update(attrs) + + def delete(self): + """Delete Network in Meraki from MerakiNetwork object.""" + return self + + +class MerakiHardware(Hardware): + """Meraki implementation of Hardware DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Hardware in Meraki from MerakiHardware object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Hardware in Meraki from MerakiHardware object.""" + return super().update(attrs) + + def delete(self): + """Delete Hardware in Meraki from MerakiHardware object.""" + return self + + +class MerakiOSVersion(OSVersion): + """Meraki implementation of OSVersion DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create OSVersion in Meraki from MerakiOSVersion object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update OSVersion in Meraki from MerakiOSVersion object.""" + return super().update(attrs) + + def delete(self): + """Delete OSVersion in Meraki from MerakiOSVersion object.""" + return self + + +class MerakiDevice(Device): + """Meraki implementation of Device DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Device in Meraki from MerakiDevice object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Device in Meraki from MerakiDevice object.""" + return super().update(attrs) + + def delete(self): + """Delete Device in Meraki from MerakiDevice object.""" + return self + + +class MerakiPort(Port): + """Meraki implementation of Port DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Port in Meraki from MerakiPort object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Port in Meraki from MerakiPort object.""" + return super().update(attrs) + + def delete(self): + """Delete Port in Meraki from MerakiPort object.""" + return self + + +class MerakiPrefix(Prefix): + """Meraki implementation of Prefix DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Prefix in Meraki from MerakiPrefix object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Prefix in Meraki from MerakiPrefix object.""" + return super().update(attrs) + + def delete(self): + """Delete Prefix in Meraki from MerakiPrefix object.""" + return self + + +class MerakiIPAddress(IPAddress): + """Meraki implementation of IPAddress DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create IPAddress in Meraki from MerakiIPAddress object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddress in Meraki from MerakiIPAddress object.""" + return super().update(attrs) + + def delete(self): + """Delete IPAddress in Meraki from MerakiIPAddress object.""" + return self + + +class MerakiIPAssignment(IPAssignment): + """Meraki implementation of IPAddress DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create IPAddressToInterface in Meraki from MerakiIPAssignment object.""" + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddressToInterface in Meraki from MerakiIPAssignment object.""" + return super().update(attrs) + + def delete(self): + """Delete IPAddressToInterface in Meraki from MerakiIPAssignment object.""" + return self diff --git a/nautobot_ssot/integrations/meraki/diffsync/models/nautobot.py b/nautobot_ssot/integrations/meraki/diffsync/models/nautobot.py new file mode 100644 index 00000000..5fc6c976 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/diffsync/models/nautobot.py @@ -0,0 +1,397 @@ +"""Nautobot DiffSync models for Meraki SSoT.""" + +from datetime import datetime + +from nautobot.dcim.models import Device as NewDevice +from nautobot.dcim.models import DeviceType, Interface, Location, SoftwareVersion +from nautobot.extras.models import Note, Role +from nautobot.ipam.models import IPAddress as OrmIPAddress +from nautobot.ipam.models import IPAddressToInterface +from nautobot.ipam.models import Prefix as OrmPrefix + +from nautobot_ssot.integrations.meraki.diffsync.models.base import ( + Device, + Hardware, + IPAddress, + IPAssignment, + Network, + OSVersion, + Port, + Prefix, +) + + +class NautobotNetwork(Network): + """Nautobot implementation of Network DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Site in Nautobot from NautobotNetwork object.""" + new_site = Location( + name=ids["name"], + location_type=adapter.job.network_loctype, + parent_id=adapter.region_map[ids["parent"]] if ids.get("parent") else None, + status_id=adapter.status_map["Active"], + time_zone=attrs["timezone"], + ) + if attrs.get("notes"): + new_note = Note( + note=attrs["notes"], + user=adapter.job.user, + assigned_object_type_id=adapter.contenttype_map["location"], + assigned_object_id=new_site.id, + ) + adapter.objects_to_create["notes"].append(new_note) + if attrs.get("tags"): + new_site.tags.set(attrs["tags"]) + for tag in new_site.tags.all(): + tag.content_types.add(adapter.contenttype_map["location"]) + if attrs.get("tenant"): + new_site.tenant_id = adapter.tenant_map[attrs["tenant"]] + new_site.validated_save() + adapter.site_map[ids["name"]] = new_site + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Site in Nautobot from NautobotNetwork object.""" + site = Location.objects.get(id=self.uuid) + if "timezone" in attrs: + site.time_zone = attrs["timezone"] + if attrs.get("notes"): + new_note = Note( + note=attrs["notes"], + user=self.adapter.job.user, + assigned_object_type_id=self.adapter.contenttype_map["location"], + assigned_object_id=site.id, + ) + new_note.validated_save() + if "tags" in attrs: + site.tags.set(attrs["tags"]) + for tag in site.tags.all(): + tag.content_types.add(self.adapter.contenttype_map["location"]) + if "tenant" in attrs: + if attrs.get("tenant"): + site.tenant_id = self.adapter.tenant_map[attrs["tenant"]] + else: + site.tenant = None + site.validated_save() + return super().update(attrs) + + +class NautobotHardware(Hardware): + """Nautobot implementation of Hardware DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create DeviceType in Nautobot from NautobotHardware object.""" + new_dt = DeviceType(model=ids["model"], manufacturer_id=adapter.manufacturer_map["Cisco Meraki"]) + adapter.objects_to_create["devicetypes"].append(new_dt) + adapter.devicetype_map[ids["model"]] = new_dt.id + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def delete(self): + """Delete DeviceType in Nautobot from NautobotHardware object.""" + super().delete() + devicetype = DeviceType.objects.get(id=self.uuid) + self.adapter.objects_to_delete["devicetypes"].append(devicetype) + return self + + +class NautobotOSVersion(OSVersion): + """Nautobot implementation of Hardware DiffSync model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create SoftwareVersion in Nautobot from NautobotOSVersion object.""" + new_ver = SoftwareVersion( + version=ids["version"], + status_id=adapter.status_map["Active"], + platform_id=adapter.platform_map["Cisco Meraki"], + ) + new_ver.validated_save() + adapter.version_map[ids["version"]] = new_ver.id + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def delete(self): + """Delete DeviceType in Nautobot from NautobotHardware object.""" + super().delete() + osversion = SoftwareVersion.objects.get(id=self.uuid) + osversion.delete() + return self + + +class NautobotDevice(Device): + """Nautobot implementation of Meraki Device model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Device in Nautobot from NautobotDevice object.""" + dev_role, created = Role.objects.get_or_create(name=attrs["role"]) + if created: + dev_role.content_types.add(adapter.contenttype_map["device"]) + adapter.devicerole_map[attrs["role"]] = dev_role.id + new_device = NewDevice( + name=ids["name"], + platform_id=adapter.platform_map["Cisco Meraki"], + serial=attrs["serial"], + status_id=adapter.status_map[attrs["status"]], + role_id=adapter.devicerole_map[attrs["role"]], + device_type_id=adapter.devicetype_map[attrs["model"]], + location=adapter.site_map[attrs["network"]], + controller_managed_device_group=adapter.job.instance.controller_managed_device_groups.first(), + ) + if attrs.get("notes"): + new_note = Note( + note=attrs["notes"], + user=adapter.job.user, + assigned_object_type_id=adapter.contenttype_map["device"], + assigned_object_id=new_device.id, + ) + adapter.objects_to_create["notes"].append(new_note) + if attrs.get("tags"): + new_device.tags.set(attrs["tags"]) + for tag in new_device.tags.all(): + tag.content_types.add(adapter.contenttype_map["device"]) + if "tenant" in attrs: + if attrs.get("tenant"): + new_device.tenant_id = adapter.tenant_map[attrs["tenant"]] + else: + new_device.tenant = None + if attrs.get("version"): + new_device.software_version_id = adapter.version_map[attrs["version"]] + new_device.cf["system_of_record"] = "Meraki SSoT" + new_device.cf["last_synced_from_sor"] = datetime.today().date().isoformat() + adapter.objects_to_create["devices"].append(new_device) + adapter.device_map[new_device.name] = new_device.id + adapter.port_map[new_device.name] = {} + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): # pylint: disable=too-many-branches + """Update Device in Nautobot from NautobotDevice object.""" + device = NewDevice.objects.get(id=self.uuid) + if "controller_group" in attrs: + device.controller_managed_device_group = self.adapter.job.instance.controller_managed_device_groups.first() + if "serial" in attrs: + device.serial = attrs["serial"] + if "status" in attrs: + device.status_id = self.adapter.status_map[attrs["status"]] + if "role" in attrs: + device.role_id = self.adapter.devicerole_map[attrs["role"]] + if "model" in attrs: + device.device_type_id = self.adapter.devicetype_map[attrs["model"]] + if "network" in attrs: + device.location = self.adapter.site_map[attrs["network"]] + if attrs.get("notes"): + new_note = Note( + note=attrs["notes"], + user=self.adapter.job.user, + assigned_object_type_id=self.adapter.contenttype_map["device"], + assigned_object_id=device.id, + ) + new_note.validated_save() + if "tags" in attrs: + device.tags.set(attrs["tags"]) + for tag in device.tags.all(): + tag.content_types.add(self.adapter.contenttype_map["device"]) + if "tenant" in attrs: + if attrs.get("tenant"): + device.tenant_id = self.adapter.tenant_map[attrs["tenant"]] + else: + device.tenant = None + if "version" in attrs: + device.software_version_id = self.adapter.version_map[attrs["version"]] + device.cf["system_of_record"] = "Meraki SSoT" + device.cf["last_synced_from_sor"] = datetime.today().date().isoformat() + device.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Device in Nautobot from NautobotDevice object.""" + dev = NewDevice.objects.get(id=self.uuid) + super().delete() + self.adapter.objects_to_delete["devices"].append(dev) + return self + + +class NautobotPort(Port): + """Nautobot implementation of Meraki Port model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Interface in Nautobot from NautobotDevice object.""" + new_port = Interface( + name=ids["name"], + device_id=adapter.device_map[ids["device"]], + enabled=attrs["enabled"], + mode="access" if not attrs["tagging"] else "tagged", + mgmt_only=attrs["management"], + type=attrs["port_type"], + status_id=adapter.status_map[attrs["port_status"]], + ) + new_port.custom_field_data["system_of_record"] = "Meraki SSoT" + new_port.custom_field_data["last_synced_from_sor"] = datetime.today().date().isoformat() + adapter.objects_to_create["ports"].append(new_port) + adapter.port_map[ids["device"]][ids["name"]] = new_port.id + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Interface in Nautobot from NautobotDevice object.""" + port = Interface.objects.get(id=self.uuid) + if "enabled" in attrs: + port.enabled = attrs["enabled"] + if "tagging" in attrs: + port.mode = "access" if not attrs["tagging"] else "tagged" + if "management" in attrs: + port.mgmt_only = attrs["management"] + if "port_type" in attrs: + port.type = attrs["port_type"] + if "port_status" in attrs: + port.status_id = self.adapter.status_map[attrs["port_status"]] + port.custom_field_data["system_of_record"] = "Meraki SSoT" + port.custom_field_data["last_synced_from_sor"] = datetime.today().date().isoformat() + port.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Interface in Nautobot from NautobotDevice object.""" + port = Interface.objects.get(id=self.uuid) + super().delete() + self.adapter.objects_to_delete["ports"].append(port) + return self + + +class NautobotPrefix(Prefix): + """Nautobot implementation of Meraki Port model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create Prefix in Nautobot from NautobotPrefix object.""" + new_pf = OrmPrefix( + prefix=ids["prefix"], + namespace_id=adapter.namespace_map[ids["namespace"]], + status_id=adapter.status_map["Active"], + tenant_id=adapter.tenant_map[attrs["tenant"]] if attrs.get("tenant") else None, + ) + if attrs.get("location"): + adapter.objects_to_create["prefix_locs"].append((new_pf.id, adapter.site_map[attrs["location"]])) + new_pf.custom_field_data["system_of_record"] = "Meraki SSoT" + new_pf.custom_field_data["last_synced_from_sor"] = datetime.today().date().isoformat() + adapter.objects_to_create["prefixes"].append(new_pf) + adapter.prefix_map[ids["prefix"]] = new_pf.id + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Prefix in Nautobot from NautobotPrefix object.""" + prefix = OrmPrefix.objects.get(id=self.uuid) + if "location" in attrs: + if attrs.get("location"): + prefix.locations.add(self.adapter.site_map[attrs["location"]]) + else: + prefix.locations.remove(self.adapter.site_map[self.location]) + if "tenant" in attrs: + if attrs.get("tenant"): + prefix.tenant_id = self.adapter.tenant_map[attrs["tenant"]] + else: + prefix.tenant = None + prefix.custom_field_data["system_of_record"] = "Meraki SSoT" + prefix.custom_field_data["last_synced_from_sor"] = datetime.today().date().isoformat() + prefix.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Prefix in Nautobot from NautobotPrefix object.""" + del_pf = OrmPrefix.objects.get(id=self.uuid) + super().delete() + self.adapter.objects_to_delete["prefixes"].append(del_pf) + return self + + +class NautobotIPAddress(IPAddress): + """Nautobot implementation of Meraki Port model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create IPAddress in Nautobot from NautobotIPAddress object.""" + namespace = attrs["tenant"] if attrs.get("tenant") else "Global" + new_ip = OrmIPAddress( + address=ids["address"], + namespace=adapter.namespace_map[namespace], + status_id=adapter.status_map["Active"], + tenant_id=adapter.tenant_map[attrs["tenant"]] if attrs.get("tenant") else None, + ) + adapter.objects_to_create["ipaddrs-to-prefixes"].append((new_ip, adapter.prefix_map[ids["prefix"]])) + new_ip.cf["system_of_record"] = "Meraki SSoT" + new_ip.cf["last_synced_from_sor"] = datetime.today().date().isoformat() + adapter.objects_to_create["ipaddrs"].append(new_ip) + if namespace not in adapter.ipaddr_map: + adapter.ipaddr_map[namespace] = {} + adapter.ipaddr_map[namespace][ids["address"]] = new_ip.id + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddress in Nautobot from NautobotIPAddress object.""" + ipaddr = OrmIPAddress.objects.get(id=self.uuid) + if "tenant" in attrs: + if attrs.get("tenant"): + ipaddr.tenant_id = self.adapter.tenant_map[attrs["tenant"]] + else: + ipaddr.tenant = None + ipaddr.cf["system_of_record"] = "Meraki SSoT" + ipaddr.cf["last_synced_from_sor"] = datetime.today().date().isoformat() + ipaddr.validated_save() + return super().update(attrs) + + def delete(self): + """Delete IPAddress in Nautobot from NautobotIPAddress object.""" + ipaddr = OrmIPAddress.objects.get(id=self.uuid) + super().delete() + self.adapter.objects_to_delete["ipaddrs"].append(ipaddr) + return self + + +class NautobotIPAssignment(IPAssignment): + """Nautobot implementation of Citrix ADM IPAddressOnInterface model.""" + + @classmethod + def create(cls, adapter, ids, attrs): + """Create IPAddressToInterface in Nautobot from IPAddressOnInterface object.""" + new_map = IPAddressToInterface( + ip_address_id=adapter.ipaddr_map[ids["namespace"]][ids["address"]], + interface_id=adapter.port_map[ids["device"]][ids["port"]], + ) + adapter.objects_to_create["ipaddrs-to-intfs"].append(new_map) + if attrs.get("primary"): + if ":" in ids["address"]: + adapter.objects_to_create["device_primary_ip6"].append( + (adapter.device_map[ids["device"]], adapter.ipaddr_map[ids["namespace"]][ids["address"]]) + ) + else: + adapter.objects_to_create["device_primary_ip4"].append( + (adapter.device_map[ids["device"]], adapter.ipaddr_map[ids["namespace"]][ids["address"]]) + ) + return super().create(adapter=adapter, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IP Address in Nautobot from IPAddressOnInterface object.""" + mapping = IPAddressToInterface.objects.get(id=self.uuid) + if attrs.get("primary"): + if mapping.ip_address.ip_version == 4: + self.adapter.objects_to_create["device_primary_ip4"].append( + (mapping.interface.device.id, mapping.ip_address.id) + ) + else: + self.adapter.objects_to_create["device_primary_ip6"].append( + (mapping.interface.device.id, mapping.ip_address.id) + ) + mapping.validated_save() + return super().update(attrs) + + def delete(self): + """Delete IPAddressToInterface in Nautobot from NautobotIPAddressOnInterface object.""" + mapping = IPAddressToInterface.objects.get(id=self.uuid) + super().delete() + self.adapter.job.logger.info( + f"Deleting IPAddress to Interface mapping between {self.address} and {self.device}'s {self.port} port." + ) + mapping.delete() + return self diff --git a/nautobot_ssot/integrations/meraki/jobs.py b/nautobot_ssot/integrations/meraki/jobs.py new file mode 100644 index 00000000..66d58735 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/jobs.py @@ -0,0 +1,169 @@ +"""Jobs for Meraki SSoT integration.""" + +from ast import literal_eval + +from diffsync.enum import DiffSyncFlags +from django.urls import reverse +from nautobot.core.celery import register_jobs +from nautobot.dcim.models import Controller, Location, LocationType +from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.extras.jobs import BooleanVar, JSONVar, ObjectVar, StringVar +from nautobot.tenancy.models import Tenant + +from nautobot_ssot.exceptions import JobException +from nautobot_ssot.integrations.meraki.diffsync.adapters import meraki, nautobot +from nautobot_ssot.integrations.meraki.utils.meraki import DashboardClient +from nautobot_ssot.jobs.base import DataMapping, DataSource +from nautobot_ssot.utils import verify_controller_managed_device_group + +name = "Meraki SSoT" # pylint: disable=invalid-name + + +class MerakiDataSource(DataSource): # pylint: disable=too-many-instance-attributes + """Meraki SSoT Data Source.""" + + instance = ObjectVar( + model=Controller, + queryset=Controller.objects.all(), + description="Controller with ExternalIntegration containing information for connecting to Meraki dashboard.", + display_field="display", + label="Meraki Controller", + required=True, + ) + network_loctype = ObjectVar( + model=LocationType, + queryset=LocationType.objects.all(), + description="LocationType to use for imported Networks.", + display_field="display", + label="Network LocationType", + required=True, + ) + parent_location = ObjectVar( + model=Location, + queryset=Location.objects.all(), + query_params={"location_type": "$network_loctype.parent"}, + description="Default parent Location to assign imported Networks as.", + display_field="display", + label="Parent Location", + required=False, + ) + location_map = JSONVar( + label="Location Mapping", + required=False, + default={}, + description="Map of information regarding Networks in Meraki and their parent Location(s).", + ) + hostname_mapping = StringVar( + label="Hostname Mapping", + required=False, + default=[], + description="List of tuples containing Device hostnames to assign to specified Role. ex: [('core-router.com', 'router')]", + ) + devicetype_mapping = StringVar( + label="DeviceType Mapping", + required=False, + default=[], + description="List of tuples containing DeviceTypes to assign to a specified Role. ex: [('MX', 'Firewall')]", + ) + debug = BooleanVar(description="Enable for more verbose debug logging", default=False) + tenant = ObjectVar(model=Tenant, label="Tenant", required=False) + + def __init__(self): + """Initialize job objects.""" + super().__init__() + self.data = None + self.diffsync_flags = DiffSyncFlags.CONTINUE_ON_FAILURE + + class Meta: # pylint: disable=too-few-public-methods + """Meta data for Meraki.""" + + name = "Meraki => Nautobot" + data_source = "Meraki" + data_target = "Nautobot" + description = "Sync information from Meraki to Nautobot" + field_order = [ + "dryrun", + "debug", + "instance", + "network_loctype", + "parent_location", + "location_map", + "hostname_mapping", + "devicetype_mapping", + "tenant", + ] + + @classmethod + def config_information(cls): + """Dictionary describing the configuration of this DataSource.""" + return {} + + @classmethod + def data_mappings(cls): + """List describing the data mappings involved in this DataSource.""" + return ( + DataMapping("Networks", None, "Locations", reverse("dcim:location_list")), + DataMapping("Devices", None, "Devices", reverse("dcim:device_list")), + DataMapping("Ports", None, "Interfaces", reverse("dcim:interface_list")), + DataMapping("Prefixes", None, "Prefixes", reverse("ipam:prefix_list")), + DataMapping("IP Addresses", None, "IP Addresses", reverse("ipam:ipaddress_list")), + ) + + def validate_settings(self): + """Confirm the settings in the Job form are valid.""" + if self.network_loctype.parent and ( + not self.parent_location + and (not self.location_map or not all("parent" in value for value in self.location_map.values())) + ): + network_loctype = self.network_loctype.name + self.logger.error( + f"{network_loctype} requires a parent Location be provided when creating {network_loctype} Locations and the Parent Location and Location Mapping fields are undefined." + ) + raise JobException(message="Parent Location is required but undefined in Job form.") + + def load_source_adapter(self): + """Load data from Meraki into DiffSync models.""" + verify_controller_managed_device_group(controller=self.instance) + self.validate_settings() + _sg = self.instance.external_integration.secrets_group + org_id = _sg.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_HTTP, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + token = _sg.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_HTTP, + secret_type=SecretsGroupSecretTypeChoices.TYPE_TOKEN, + ) + client = DashboardClient(logger=self, org_id=org_id, token=token) + self.source_adapter = meraki.MerakiAdapter(job=self, sync=self.sync, client=client, tenant=self.tenant) + self.source_adapter.load() + + def load_target_adapter(self): + """Load data from Nautobot into DiffSync models.""" + self.target_adapter = nautobot.NautobotAdapter(job=self, sync=self.sync, tenant=self.tenant) + self.target_adapter.load() + + def run( + self, + dryrun, + memory_profiling, + debug, + *args, + **kwargs, + ): # pylint: disable=arguments-differ + """Perform data synchronization.""" + self.dryrun = dryrun + self.memory_profiling = memory_profiling + self.instance = kwargs["instance"] + self.network_loctype = kwargs["network_loctype"] + self.parent_location = kwargs["parent_location"] + self.location_map = kwargs["location_map"] + self.debug = debug + self.tenant = kwargs["tenant"] + self.hostname_mapping = literal_eval(kwargs["hostname_mapping"]) + self.devicetype_mapping = literal_eval(kwargs["devicetype_mapping"]) + super().run(dryrun=self.dryrun, memory_profiling=self.memory_profiling, *args, **kwargs) + + +jobs = [MerakiDataSource] +register_jobs(*jobs) diff --git a/nautobot_ssot/integrations/meraki/signals.py b/nautobot_ssot/integrations/meraki/signals.py new file mode 100644 index 00000000..6285fd84 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/signals.py @@ -0,0 +1,53 @@ +"""Signals triggered when Nautobot starts to perform certain actions.""" + +from nautobot.core.signals import nautobot_database_ready +from nautobot.extras.choices import CustomFieldTypeChoices + + +def register_signals(sender): + """Register signals for DNA Center integration.""" + nautobot_database_ready.connect(nautobot_database_ready_callback, sender=sender) + + +def nautobot_database_ready_callback(sender, *, apps, **kwargs): # pylint: disable=unused-argument + """Adds OS Version and Physical Address CustomField to Devices and System of Record and Last Sync'd to Device, and IPAddress. + + Callback function triggered by the nautobot_database_ready signal when the Nautobot database is fully ready. + """ + # pylint: disable=invalid-name, too-many-locals + ContentType = apps.get_model("contenttypes", "ContentType") + CustomField = apps.get_model("extras", "CustomField") + Device = apps.get_model("dcim", "Device") + Interface = apps.get_model("dcim", "Interface") + Prefix = apps.get_model("ipam", "Prefix") + IPAddress = apps.get_model("ipam", "IPAddress") + Manufacturer = apps.get_model("dcim", "Manufacturer") + Platform = apps.get_model("dcim", "Platform") + + cisco_manu = Manufacturer.objects.get_or_create(name="Cisco Meraki")[0] + plat_dict = { + "name": "Cisco Meraki", + "manufacturer": cisco_manu, + "network_driver": "cisco_meraki", + } + Platform.objects.update_or_create(name__icontains="Meraki", defaults=plat_dict) + + sysrecord_cf_dict = { + "type": CustomFieldTypeChoices.TYPE_TEXT, + "key": "system_of_record", + "label": "System of Record", + } + sysrecord_custom_field, _ = CustomField.objects.update_or_create( + key=sysrecord_cf_dict["key"], defaults=sysrecord_cf_dict + ) + last_sync_cf_dict = { + "type": CustomFieldTypeChoices.TYPE_DATE, + "key": "last_synced_from_sor", + "label": "Last sync from System of Record", + } + last_sync_custom_field, _ = CustomField.objects.update_or_create( + key=last_sync_cf_dict["key"], defaults=last_sync_cf_dict + ) + for model in [Device, Interface, Prefix, IPAddress]: + sysrecord_custom_field.content_types.add(ContentType.objects.get_for_model(model)) + last_sync_custom_field.content_types.add(ContentType.objects.get_for_model(model)) diff --git a/nautobot_ssot/integrations/meraki/utils/__init__.py b/nautobot_ssot/integrations/meraki/utils/__init__.py new file mode 100644 index 00000000..a2ea3b2f --- /dev/null +++ b/nautobot_ssot/integrations/meraki/utils/__init__.py @@ -0,0 +1 @@ +"""Utility functions for working with Meraki and Nautobot.""" diff --git a/nautobot_ssot/integrations/meraki/utils/meraki.py b/nautobot_ssot/integrations/meraki/utils/meraki.py new file mode 100644 index 00000000..cfd58ede --- /dev/null +++ b/nautobot_ssot/integrations/meraki/utils/meraki.py @@ -0,0 +1,240 @@ +"""Utility functions for working with Meraki.""" + +import re + +import meraki + + +class DashboardClient: + """Client for interacting with Meraki dashboard.""" + + def __init__(self, logger, org_id: str, token: str, *args, **kwargs): + """Initialize Meraki dashboard client.""" + self.logger = logger + self.org_id = org_id + self.token = token + self.conn = self.connect_dashboard() + self.network_map = {} + + def connect_dashboard(self) -> meraki.DashboardAPI: # pylint: disable=inconsistent-return-statements + """Connect to Meraki dashboard and return connection object. + + Raises: + err: APIError if issue with connecting to Meraki dashboard. + + Returns: + meraki.DashboardAPI: Connection to Meraki dashboard. + """ + try: + dashboard = meraki.DashboardAPI( + api_key=self.token, + base_url="https://api.meraki.com/api/v1/", + output_log=False, + print_console=False, + ) + return dashboard + except meraki.APIError as err: + self.logger.log.error(f"Unable to connect to Meraki dashboard: {err.message}") + raise err + + def validate_organization_exists(self) -> bool: + """Confirm defined organization ID is seen in Dashboard to confirm we have access. + + Returns: + bool: Whether Organiztion ID was found in Dashboard. + """ + orgs = self.conn.organizations.getOrganizations() + ids = [org["id"] for org in orgs] + if self.org_id in ids: + return True + return False + + def get_org_networks(self) -> list: + """Retrieve all networks for specified Organization ID. + + Returns: + list: List of found networks. Empty list if error retrieving networks. + """ + networks = [] + try: + networks = self.conn.organizations.getOrganizationNetworks(organizationId=self.org_id) + self.network_map = {net["id"]: net for net in networks} + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return networks + + def get_org_devices(self) -> list: + """Retrieve all devices for specified Organization ID. + + Returns: + list: List of found devices. Empty list if error retrieving devices. + """ + devices = [] + try: + devices = self.conn.organizations.getOrganizationDevices(organizationId=self.org_id) + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return devices + + def get_org_uplink_statuses(self) -> dict: + """Retrieve appliance uplink statuses for MX, MG, and Z devices for specified Organization ID. + + Returns: + dict: Map of Device serial to uplink settings for those MX, MG, and Z devices in specified organization ID. + """ + settings_map = {} + try: + result = self.conn.organizations.getOrganizationUplinksStatuses(organizationId=self.org_id) + settings_map = {net["serial"]: net for net in result} + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return settings_map + + def get_org_switchports(self) -> dict: + """Retrieve all ports for switches in specified organization ID. + + Returns: + dict: Map of Device serial to switchport information for specified organization ID. + """ + port_map = {} + try: + result = self.conn.switch.getOrganizationSwitchPortsBySwitch(organizationId=self.org_id) + port_map = {switch["serial"]: switch for switch in result} + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return port_map + + def get_org_device_statuses(self) -> dict: + """Retrieve device statuses from Meraki dashboard. + + Returns: + dict: Dictionary of Device name with its status as value. + """ + statuses = {} + try: + response = self.conn.organizations.getOrganizationDevicesStatuses(organizationId=self.org_id) + statuses = {dev["name"]: dev["status"] for dev in response} + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return statuses + + def get_management_ports(self, serial: str) -> dict: + """Retrieve device management ports from Meraki dashboard. + + Args: + serial (str): Serial of device to retrieve management ports for. + + Returns: + list: List of management ports and associated information. + """ + ports = {} + try: + ports = self.conn.devices.getDeviceManagementInterface(serial=serial) + if ports.get("ddnsHostnames"): + ports.pop("ddnsHostnames") + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return ports + + def get_uplink_settings(self, serial: str) -> dict: + """Retrieve settings for uplink ports from Meraki dashboard. + + Args: + serial (str): Serial of device to retrieve uplink settings for. + + Returns: + dict: Dictionary of uplink settings for device with specified serial. + """ + ports = {} + try: + ports = self.conn.appliance.getDeviceApplianceUplinksSettings(serial=serial) + ports = ports["interfaces"] + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return ports + + def get_switchport_statuses(self, serial: str) -> dict: + """Retrieve statuses for all switchports on specified MS Device. + + Args: + serial (str): Serial of MS device in question. + + Returns: + dict: Map of switch ports and associated information. + """ + port_statuses = {} + try: + result = self.conn.switch.getDeviceSwitchPortsStatuses(serial=serial) + port_statuses = {port["portId"]: port for port in result} + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return port_statuses + + def get_appliance_switchports(self, network_id: str) -> list: + """Retrieve switchports for MX devices in specified network ID. + + Args: + network_id (str): Network ID that MX device belongs to. + + Returns: + list: List of switchports for network that MX device belongs to. + """ + ports = [] + try: + ports = self.conn.appliance.getNetworkAppliancePorts(networkId=network_id) + except meraki.APIError as err: + self.logger.logger.warning( + f"Meraki API error: {err}\nstatus code = {err.status}\nreason = {err.reason}\nerror = {err.message}" + ) + return ports + + +def parse_hostname_for_role(dev_hostname: str, hostname_map: dict) -> str: + """Parse device hostname to get Device Role. + + Args: + dev_hostname (str): Hostname of Device to determine role of. + hostname_map (dict): Dictionary of hostname's mapped to their Role. + + Returns: + str: Name of DeviceRole. Defaults to Unknown. + """ + dev_role = "Unknown" + for entry in hostname_map: + match = re.match(pattern=entry[0], string=dev_hostname) + if match: + dev_role = entry[1] + return dev_role + + +def get_role_from_devicetype(dev_model: str, devicetype_map: dict) -> str: + """Get Device Role using DeviceType from devicetype_mapping Setting. + + Args: + dev_model (str): Hardware model of Device to determine role of. + devicetype_map (dict): Dictionary of DeviceType's mapped to their Role. + + Returns: + str: Name of DeviceRole. Defaults to Unknown. + """ + dev_role = "Unknown" + for entry in devicetype_map: + if entry[0] in dev_model: + dev_role = entry[1] + return dev_role diff --git a/nautobot_ssot/integrations/meraki/utils/nautobot.py b/nautobot_ssot/integrations/meraki/utils/nautobot.py new file mode 100644 index 00000000..a6972f72 --- /dev/null +++ b/nautobot_ssot/integrations/meraki/utils/nautobot.py @@ -0,0 +1,22 @@ +"""Utility functions for working with Nautobot.""" + +from typing import List + +from taggit.managers import TaggableManager + + +def get_tag_strings(list_tags: TaggableManager) -> List[str]: + """Gets string values of all Tags in a list. + + This is the opposite of the `get_tags` function. + + Args: + list_tags (TaggableManager): List of Tag objects to convert to strings. + + Returns: + List[str]: List of string values matching the Tags passed in. + """ + _strings = list(list_tags.names()) + if len(_strings) > 1: + _strings.sort() + return _strings diff --git a/nautobot_ssot/jobs/__init__.py b/nautobot_ssot/jobs/__init__.py index ea85964f..8da1b6b4 100644 --- a/nautobot_ssot/jobs/__init__.py +++ b/nautobot_ssot/jobs/__init__.py @@ -19,6 +19,7 @@ _MIN_NAUTOBOT_VERSION = { "nautobot_ssot_aci": "2.2", "nautobot_ssot_dna_center": "2.2", + "nautobot_ssot_meraki": "2.2", } diff --git a/nautobot_ssot/tests/meraki/__init__.py b/nautobot_ssot/tests/meraki/__init__.py new file mode 100644 index 00000000..aec6aabc --- /dev/null +++ b/nautobot_ssot/tests/meraki/__init__.py @@ -0,0 +1 @@ +"""Unit tests for Meraki SSoT app.""" diff --git a/nautobot_ssot/tests/meraki/fixtures/__init__.py b/nautobot_ssot/tests/meraki/fixtures/__init__.py new file mode 100644 index 00000000..c7221233 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/__init__.py @@ -0,0 +1 @@ +"""Fixtures for unit tests.""" diff --git a/nautobot_ssot/tests/meraki/fixtures/fixtures.py b/nautobot_ssot/tests/meraki/fixtures/fixtures.py new file mode 100644 index 00000000..7dd17242 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/fixtures.py @@ -0,0 +1,35 @@ +"""Collection of fixtures to be used for unit testing.""" + +import json + + +def load_json(path): + """Load a json file.""" + with open(path, encoding="utf-8") as file: + return json.loads(file.read()) + + +GET_ORG_NETWORKS_SENT_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_org_networks_sent.json") +GET_ORG_NETWORKS_RECV_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_org_networks_recv.json") +NETWORK_MAP_FIXTURE = load_json("./nautobot_ssot/tests/meraki//fixtures/network_map.json") +GET_ORG_DEVICES_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_org_devices.json") +GET_ORG_DEVICE_STATUSES_SENT_FIXTURE = load_json( + "./nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_sent.json" +) +GET_ORG_DEVICE_STATUSES_RECV_FIXTURE = load_json( + "./nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_recv.json" +) +GET_MANAGEMENT_PORTS_SENT_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_management_ports_sent.json") +GET_MANAGEMENT_PORTS_RECV_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_management_ports_recv.json") +GET_ORG_SWITCHPORTS_SENT_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_org_switchports_sent.json") +GET_ORG_SWITCHPORTS_RECV_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_org_switchports_recv.json") +GET_ORG_UPLINK_STATUSES_SENT_FIXTURE = load_json( + "./nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_sent.json" +) +GET_ORG_UPLINK_STATUSES_RECV_FIXTURE = load_json( + "./nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_recv.json" +) +GET_SWITCHPORT_STATUSES = load_json("./nautobot_ssot/tests/meraki/fixtures/get_switchport_statuses.json") +GET_UPLINK_SETTINGS_SENT = load_json("./nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_sent.json") +GET_UPLINK_SETTINGS_RECV = load_json("./nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_recv.json") +GET_APPLIANCE_SWITCHPORTS_FIXTURE = load_json("./nautobot_ssot/tests/meraki/fixtures/get_appliance_switchports.json") diff --git a/nautobot_ssot/tests/meraki/fixtures/get_appliance_switchports.json b/nautobot_ssot/tests/meraki/fixtures/get_appliance_switchports.json new file mode 100644 index 00000000..8d24778c --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_appliance_switchports.json @@ -0,0 +1,83 @@ +[ + { + "number": 3, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 10, + "accessPolicy": "open" + }, + { + "number": 4, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 20, + "accessPolicy": "open" + }, + { + "number": 5, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 30, + "accessPolicy": "open" + }, + { + "number": 6, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 7, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 8, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 9, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 10, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 11, + "enabled": true, + "type": "access", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open" + }, + { + "number": 12, + "enabled": true, + "type": "trunk", + "dropUntaggedTraffic": false, + "vlan": 1000, + "accessPolicy": "open", + "allowedVlans": "all" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_management_ports_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_management_ports_recv.json new file mode 100644 index 00000000..e30165c9 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_management_ports_recv.json @@ -0,0 +1,19 @@ +{ + "wan1": { + "wanEnabled": "not configured", + "usingStaticIp": true, + "staticIp": "10.1.15.10", + "staticSubnetMask": "255.255.255.0", + "staticGatewayIp": "10.1.15.1", + "staticDns": [ + "1.1.1.1", + "1.0.0.1" + ], + "vlan": null + }, + "wan2": { + "wanEnabled": "not configured", + "usingStaticIp": false, + "vlan": null + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_management_ports_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_management_ports_sent.json new file mode 100644 index 00000000..6a6fa2bf --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_management_ports_sent.json @@ -0,0 +1,24 @@ +{ + "wan1": { + "wanEnabled": "not configured", + "usingStaticIp": true, + "staticIp": "10.1.15.10", + "staticSubnetMask": "255.255.255.0", + "staticGatewayIp": "10.1.15.1", + "staticDns": [ + "1.1.1.1", + "1.0.0.1" + ], + "vlan": null + }, + "wan2": { + "wanEnabled": "not configured", + "usingStaticIp": false, + "vlan": null + }, + "ddnsHostnames": { + "activeDdnsHostname": "ioa-epaliuc-ivab-ycnx-scvautuhqs.vcjrawe-a.com", + "ddnsHostnameWan1": "mkg-qsuobwv-esae-pvtl-gikqpgktwj-1.hkykafr-u.com", + "ddnsHostnameWan2": "lij-ukwthgu-gskj-akup-avposljtgm-4.eymrwab-p.com" + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_recv.json new file mode 100644 index 00000000..554d53d8 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_recv.json @@ -0,0 +1,6 @@ +{ + "Lab01": "online", + "HQ01": "online", + "Lab Switch": "online", + "HQ AP": "online" +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_sent.json new file mode 100644 index 00000000..b328fe33 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_device_statuses_sent.json @@ -0,0 +1,89 @@ +[ + { + "name": "Lab01", + "serial": "D7JB-OH13-QFAG", + "mac": "60:00:4j:7j:5s:00", + "publicIp": "47.88.30.14", + "networkId": "H_203630551508078460", + "status": "online", + "lastReportedAt": "2877-54-74T26:13:64K", + "productType": "appliance", + "components": { + "powerSupplies": [] + }, + "model": "MX400", + "tags": [], + "usingCellularFailover": false, + "wan1Ip": "47.88.30.14", + "wan1Gateway": "47.88.30.1", + "wan1IpType": "static", + "wan1PrimaryDns": "1.1.1.1", + "wan1SecondaryDns": "1.0.0.1", + "wan2Ip": null + }, + { + "name": "HQ01", + "serial": "V4GD-ABDP-YVCK", + "mac": "07:77:7i:8x:2a:nj", + "publicIp": "36.54.12.32", + "networkId": "L_165471703274884707", + "status": "online", + "lastReportedAt": "7376-34-61L20:55:35X", + "productType": "appliance", + "components": { + "powerSupplies": [] + }, + "model": "MX400", + "tags": [], + "usingCellularFailover": false, + "wan1Ip": "36.54.12.32", + "wan1Gateway": "36.54.12.1", + "wan1IpType": "static", + "wan1PrimaryDns": "1.1.1.1", + "wan1SecondaryDns": "1.0.0.1", + "wan2Ip": null + }, + { + "name": "Lab Switch", + "serial": "N0BA-AWBF-DCWP", + "mac": "66:76:4h:6p:4p:tw", + "publicIp": "47.88.30.15", + "networkId": "L_165471703274884707", + "status": "online", + "lastReportedAt": "7376-34-61L20:55:35X", + "productType": "switch", + "components": { + "powerSupplies": [] + }, + "model": "MS225-24", + "tags": [], + "usingCellularFailover": false, + "wan1Ip": "47.88.30.15", + "wan1Gateway": "47.88.30.1", + "wan1IpType": "static", + "wan1PrimaryDns": "1.1.1.1", + "wan1SecondaryDns": "1.0.0.1", + "wan2Ip": null + }, + { + "name": "HQ AP", + "serial": "L6XI-2BIN-EUTI", + "mac": "sl:31:m3:57:i0:1g", + "publicIp": "", + "networkId": "L_165471703274884707", + "status": "online", + "lastReportedAt": "7376-34-61L20:55:35X", + "productType": "wireless", + "components": { + "powerSupplies": [] + }, + "model": "MR42", + "tags": [], + "usingCellularFailover": false, + "lanIp": "10.5.52.3", + "gateway": "10.5.52.1", + "ipType": "static", + "primaryDns": "1.1.1.1", + "secondaryDns": "1.0.0.1" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_devices.json b/nautobot_ssot/tests/meraki/fixtures/get_org_devices.json new file mode 100644 index 00000000..7098fee2 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_devices.json @@ -0,0 +1,73 @@ +[ + { + "name": "Lab01", + "serial": "D7JB-OH13-QFAG", + "mac": "60:00:4j:7j:5s:00", + "networkId": "H_203630551508078460", + "productType": "appliance", + "model": "MX400", + "address": "123 Main St, New York, NY", + "lat": 28.5881, + "lng": -84.25263, + "notes": "Lab device", + "tags": [], + "wan1Ip": "47.88.30.14", + "wan2Ip": null, + "configurationUpdatedAt": "2877-54-74T26:13:64K", + "firmware": "wired-16-16-9", + "url": "https://i384.meraki.com/Lab/n/iWFBbj2y/manage/nodes/new_list/2664516" + }, + { + "name": "HQ01", + "serial": "V4GD-ABDP-YVCK", + "mac": "07:77:7i:8x:2a:nj", + "networkId": "L_165471703274884707", + "productType": "appliance", + "model": "MX400", + "address": "123 Main St, DFW, TX", + "lat": 21.7321, + "lng": -13.64218, + "notes": "HQ device", + "tags": [], + "wan1Ip": "36.54.12.32", + "wan2Ip": null, + "configurationUpdatedAt": "7376-34-61L20:55:35X", + "firmware": "wired-16-16-9", + "url": "https://g488.meraki.com/HQ/n/dJBOpa0s/manage/nodes/new_list/7648103" + }, + { + "name": "Lab Switch", + "serial": "N0BA-AWBF-DCWP", + "mac": "66:76:4h:6p:4p:tw", + "networkId": "H_203630551508078460", + "productType": "switch", + "model": "MS225-24", + "address": "123 Main St, DFW, TX", + "lat": 28.5881, + "lng": -84.25263, + "notes": "Lab switch", + "tags": [], + "wan1Ip": "47.88.30.15", + "wan2Ip": null, + "configurationUpdatedAt": "2877-54-74T26:13:64K", + "firmware": "switch-15-21-1", + "url": "https://i384.meraki.com/Lab/n/bCUOar1a/manage/nodes/new_list/5738451" + }, + { + "name": "HQ AP", + "serial": "L6XI-2BIN-EUTI", + "mac": "sl:31:m3:57:i0:1g", + "networkId": "L_165471703274884707", + "productType": "wireless", + "model": "MR42", + "address": "", + "lat": 21.7321, + "lng": -13.64218, + "notes": "", + "tags": [], + "lanIp": "10.5.52.3", + "configurationUpdatedAt": "7376-34-61L20:55:35X", + "firmware": "wireless-29-5-1", + "url": "https://v363.meraki.com/HQ/n/cJub4qYk/manage/nodes/new_list/033568336184840" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_networks_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_org_networks_recv.json new file mode 100644 index 00000000..3e075067 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_networks_recv.json @@ -0,0 +1,37 @@ +{ + "H_203630551508078460": { + "id": "H_203630551508078460", + "organizationId": "123456", + "name": "Lab", + "productTypes": [ + "appliance", + "wireless" + ], + "timeZone": "US/Eastern", + "tags": [ + "Lab" + ], + "enrollmentString": null, + "url": "https://s875.meraki.com/Lab/n/AYWjEr1b/manage/usage/list", + "notes": "Lab", + "isBoundToConfigTemplate": false + }, + "L_165471703274884707": { + "id": "L_165471703274884707", + "organizationId": "123456", + "name": "HQ", + "productTypes": [ + "appliance", + "switch", + "wireless" + ], + "timeZone": "US/Central", + "tags": [ + "HQ" + ], + "enrollmentString": null, + "url": "https://o217.meraki.com/HQ/n/fpwVLq4i/manage/usage/list", + "notes": "", + "isBoundToConfigTemplate": false + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_networks_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_org_networks_sent.json new file mode 100644 index 00000000..822cb047 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_networks_sent.json @@ -0,0 +1,37 @@ +[ + { + "id": "H_203630551508078460", + "organizationId": "123456", + "name": "Lab", + "productTypes": [ + "appliance", + "wireless" + ], + "timeZone": "US/Eastern", + "tags": [ + "Lab" + ], + "enrollmentString": null, + "url": "https://s875.meraki.com/Lab/n/AYWjEr1b/manage/usage/list", + "notes": "Lab", + "isBoundToConfigTemplate": false + }, + { + "id": "L_165471703274884707", + "organizationId": "123456", + "name": "HQ", + "productTypes": [ + "appliance", + "switch", + "wireless" + ], + "timeZone": "US/Central", + "tags": [ + "HQ" + ], + "enrollmentString": null, + "url": "https://o217.meraki.com/HQ/n/fpwVLq4i/manage/usage/list", + "notes": "", + "isBoundToConfigTemplate": false + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_recv.json new file mode 100644 index 00000000..3228d619 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_recv.json @@ -0,0 +1,464 @@ +{ + "N0BA-AWBF-DCWP": { + "name": "Lab Switch", + "serial": "N0BA-AWBF-DCWP", + "mac": "66:76:4h:6p:4p:tw", + "network": { + "id": "H_203630551508078460", + "name": "Lab" + }, + "model": "MS225-24", + "ports": [ + { + "portId": "1", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "2", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "3", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "4", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "5", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "6", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "7", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "8", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "9", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "10", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "11", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "12", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "13", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "14", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "15", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "16", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "17", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "18", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "19", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "20", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "21", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "22", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "23", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "24", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 2305, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "25", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "26", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "27", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "28", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "29", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "30", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + } + ] + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_sent.json new file mode 100644 index 00000000..154f1555 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_switchports_sent.json @@ -0,0 +1,464 @@ +[ + { + "name": "Lab Switch", + "serial": "N0BA-AWBF-DCWP", + "mac": "66:76:4h:6p:4p:tw", + "network": { + "id": "H_203630551508078460", + "name": "Lab" + }, + "model": "MS225-24", + "ports": [ + { + "portId": "1", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "2", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "3", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "4", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "5", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "6", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "7", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "8", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "9", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "10", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "11", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "12", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "13", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "14", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "15", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "16", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "17", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "18", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "19", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "20", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "21", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "22", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "23", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 444, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "24", + "name": "", + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "access", + "vlan": 2305, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "25", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "26", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "27", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "28", + "name": "", + "tags": [], + "enabled": false, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "29", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + }, + { + "portId": "30", + "name": null, + "tags": [], + "enabled": true, + "poeEnabled": false, + "type": "trunk", + "vlan": 1, + "voiceVlan": null, + "allowedVlans": "all", + "rstpEnabled": true, + "stpGuard": "disabled", + "linkNegotiation": "Auto negotiate", + "accessPolicyType": "Open" + } + ] + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_recv.json new file mode 100644 index 00000000..e0d3ecf3 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_recv.json @@ -0,0 +1,66 @@ +{ + "D7JB-OH13-QFAG": { + "networkId": "H_203630551508078460", + "serial": "D7JB-OH13-QFAG", + "model": "MX400", + "highAvailability": { + "enabled": true, + "role": "spare" + }, + "lastReportedAt": "2877-54-74T26:13:64K", + "uplinks": [ + { + "interface": "wan1", + "status": "active", + "ip": "47.88.30.14", + "gateway": "47.88.30.1", + "publicIp": "47.88.30.14", + "primaryDns": "1.1.1.1", + "secondaryDns": "1.0.0.1", + "ipAssignedBy": "static" + }, + { + "interface": "wan2", + "status": "not connected", + "ip": null, + "gateway": null, + "publicIp": null, + "primaryDns": null, + "secondaryDns": null, + "ipAssignedBy": null + } + ] + }, + "V4GD-ABDP-YVCK": { + "networkId": "L_165471703274884707", + "serial": "V4GD-ABDP-YVCK", + "model": "MX400", + "highAvailability": { + "enabled": true, + "role": "spare" + }, + "lastReportedAt": "7376-34-61L20:55:35X", + "uplinks": [ + { + "interface": "wan1", + "status": "active", + "ip": "36.54.12.32", + "gateway": "36.54.12.1", + "publicIp": "36.54.12.32", + "primaryDns": "1.1.1.1", + "secondaryDns": "1.0.0.1", + "ipAssignedBy": "static" + }, + { + "interface": "wan2", + "status": "not connected", + "ip": null, + "gateway": null, + "publicIp": null, + "primaryDns": null, + "secondaryDns": null, + "ipAssignedBy": null + } + ] + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_sent.json new file mode 100644 index 00000000..710eadc3 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_org_uplink_statuses_sent.json @@ -0,0 +1,66 @@ +[ + { + "networkId": "H_203630551508078460", + "serial": "D7JB-OH13-QFAG", + "model": "MX400", + "highAvailability": { + "enabled": true, + "role": "spare" + }, + "lastReportedAt": "2877-54-74T26:13:64K", + "uplinks": [ + { + "interface": "wan1", + "status": "active", + "ip": "47.88.30.14", + "gateway": "47.88.30.1", + "publicIp": "47.88.30.14", + "primaryDns": "1.1.1.1", + "secondaryDns": "1.0.0.1", + "ipAssignedBy": "static" + }, + { + "interface": "wan2", + "status": "not connected", + "ip": null, + "gateway": null, + "publicIp": null, + "primaryDns": null, + "secondaryDns": null, + "ipAssignedBy": null + } + ] + }, + { + "networkId": "L_165471703274884707", + "serial": "V4GD-ABDP-YVCK", + "model": "MX400", + "highAvailability": { + "enabled": true, + "role": "spare" + }, + "lastReportedAt": "7376-34-61L20:55:35X", + "uplinks": [ + { + "interface": "wan1", + "status": "active", + "ip": "36.54.12.32", + "gateway": "36.54.12.1", + "publicIp": "36.54.12.32", + "primaryDns": "1.1.1.1", + "secondaryDns": "1.0.0.1", + "ipAssignedBy": "static" + }, + { + "interface": "wan2", + "status": "not connected", + "ip": null, + "gateway": null, + "publicIp": null, + "primaryDns": null, + "secondaryDns": null, + "ipAssignedBy": null + } + ] + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_switchport_statuses.json b/nautobot_ssot/tests/meraki/fixtures/get_switchport_statuses.json new file mode 100644 index 00000000..098c0b06 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_switchport_statuses.json @@ -0,0 +1,1603 @@ +[ + { + "portId": "1", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "2", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "lldp": { + "portId": "70:30:h1:03:1i:65", + "chassisId": "61:18:t2:78:5e:24" + }, + "clientCount": 2, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "3", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "1 Gbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "4", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "5", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "6", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "7", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "8", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "9", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "lldp": { + "portId": "g1:54:f2:0j:62:6y", + "chassisId": "r7:54:j4:1q:44:5b" + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "10", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "11", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "12", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "13", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "1 Gbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "lldp": { + "portId": "p6:so:1r:k2:60:5b", + "chassisId": "s6:pi:3c:h4:84:7y" + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "14", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "15", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "16", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "17", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "18", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "lldp": { + "portId": "30:70:7q:21:j8:6g", + "chassisId": "50:13:6e:10:j1:1d" + }, + "clientCount": 2, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "19", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "20", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "21", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "22", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "23", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "24", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "25", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "26", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "27", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "28", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "29", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "30", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "31", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "32", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "33", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "34", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "35", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "36", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "1 Gbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "37", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "38", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "39", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "40", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "41", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "42", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "43", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "44", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "45", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "46", + "enabled": true, + "status": "Connected", + "isUplink": false, + "errors": [], + "warnings": [], + "speed": "100 Mbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 1, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "47", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "48", + "enabled": true, + "status": "Connected", + "isUplink": true, + "errors": [], + "warnings": [], + "speed": "1 Gbps", + "duplex": "full", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "lldp": { + "chassisId": "e7:7c:78:04:35:06" + }, + "clientCount": 5, + "powerUsageInWh": 0.0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "49", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "50", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "51", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "52", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "53", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + }, + { + "portId": "54", + "enabled": true, + "status": "Disconnected", + "isUplink": false, + "errors": [ + "Port disconnected" + ], + "warnings": [], + "speed": "", + "duplex": "", + "usageInKb": { + "total": 0, + "sent": 0, + "recv": 0 + }, + "clientCount": 0, + "trafficInKbps": { + "total": 0.0, + "sent": 0.0, + "recv": 0.0 + }, + "securePort": { + "enabled": false, + "active": false, + "authenticationStatus": "Disabled", + "configOverrides": {} + } + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_recv.json b/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_recv.json new file mode 100644 index 00000000..f4ae8966 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_recv.json @@ -0,0 +1,38 @@ +{ + "wan1": { + "enabled": true, + "vlanTagging": { + "enabled": false + }, + "svis": { + "ipv4": { + "assignmentMode": "static", + "gateway": "10.1.15.1", + "address": "10.1.15.34/24", + "nameservers": { + "addresses": [ + "1.1.1.1", + "1.0.0.1" + ] + } + } + }, + "pppoe": { + "enabled": false + } + }, + "wan2": { + "enabled": true, + "vlanTagging": { + "enabled": false + }, + "svis": { + "ipv4": { + "assignmentMode": "dynamic" + } + }, + "pppoe": { + "enabled": false + } + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_sent.json b/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_sent.json new file mode 100644 index 00000000..6dd9942c --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/get_uplink_settings_sent.json @@ -0,0 +1,40 @@ +{ + "interfaces": { + "wan1": { + "enabled": true, + "vlanTagging": { + "enabled": false + }, + "svis": { + "ipv4": { + "assignmentMode": "static", + "gateway": "10.1.15.1", + "address": "10.1.15.34/24", + "nameservers": { + "addresses": [ + "1.1.1.1", + "1.0.0.1" + ] + } + } + }, + "pppoe": { + "enabled": false + } + }, + "wan2": { + "enabled": true, + "vlanTagging": { + "enabled": false + }, + "svis": { + "ipv4": { + "assignmentMode": "dynamic" + } + }, + "pppoe": { + "enabled": false + } + } + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/fixtures/network_map.json b/nautobot_ssot/tests/meraki/fixtures/network_map.json new file mode 100644 index 00000000..3e075067 --- /dev/null +++ b/nautobot_ssot/tests/meraki/fixtures/network_map.json @@ -0,0 +1,37 @@ +{ + "H_203630551508078460": { + "id": "H_203630551508078460", + "organizationId": "123456", + "name": "Lab", + "productTypes": [ + "appliance", + "wireless" + ], + "timeZone": "US/Eastern", + "tags": [ + "Lab" + ], + "enrollmentString": null, + "url": "https://s875.meraki.com/Lab/n/AYWjEr1b/manage/usage/list", + "notes": "Lab", + "isBoundToConfigTemplate": false + }, + "L_165471703274884707": { + "id": "L_165471703274884707", + "organizationId": "123456", + "name": "HQ", + "productTypes": [ + "appliance", + "switch", + "wireless" + ], + "timeZone": "US/Central", + "tags": [ + "HQ" + ], + "enrollmentString": null, + "url": "https://o217.meraki.com/HQ/n/fpwVLq4i/manage/usage/list", + "notes": "", + "isBoundToConfigTemplate": false + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/meraki/test_adapters_meraki.py b/nautobot_ssot/tests/meraki/test_adapters_meraki.py new file mode 100644 index 00000000..31aa8d24 --- /dev/null +++ b/nautobot_ssot/tests/meraki/test_adapters_meraki.py @@ -0,0 +1,99 @@ +"""Test Meraki adapter.""" + +from unittest.mock import MagicMock + +from django.contrib.contenttypes.models import ContentType +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, LocationType +from nautobot.extras.models import JobResult + +from nautobot_ssot.integrations.meraki.diffsync.adapters.meraki import MerakiAdapter +from nautobot_ssot.integrations.meraki.jobs import MerakiDataSource +from nautobot_ssot.tests.meraki.fixtures import fixtures as fix + + +class TestMerakiAdapterTestCase(TransactionTestCase): + """Test NautobotSsotMerakiAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Initialize test case.""" + self.meraki_client = MagicMock() + self.meraki_client.get_org_networks.return_value = fix.GET_ORG_NETWORKS_SENT_FIXTURE + self.meraki_client.network_map = fix.NETWORK_MAP_FIXTURE + self.meraki_client.get_org_devices.return_value = fix.GET_ORG_DEVICES_FIXTURE + self.meraki_client.get_org_device_statuses.return_value = fix.GET_ORG_DEVICE_STATUSES_RECV_FIXTURE + self.meraki_client.get_management_ports.return_value = fix.GET_MANAGEMENT_PORTS_RECV_FIXTURE + self.meraki_client.get_uplink_settings.return_value = fix.GET_UPLINK_SETTINGS_RECV + self.meraki_client.get_switchport_statuses.return_value = fix.GET_SWITCHPORT_STATUSES + self.meraki_client.get_org_uplink_statuses.return_value = fix.GET_ORG_UPLINK_STATUSES_RECV_FIXTURE + self.meraki_client.get_appliance_switchports.return_value = fix.GET_APPLIANCE_SWITCHPORTS_FIXTURE + self.meraki_client.get_org_switchports.return_value = fix.GET_ORG_SWITCHPORTS_RECV_FIXTURE + + site_loctype = LocationType.objects.get_or_create(name="Site")[0] + site_loctype.content_types.add(ContentType.objects.get_for_model(Device)) + self.job = MerakiDataSource() + self.job.logger.warning = MagicMock() + self.job.instance = MagicMock() + self.job.instance.controller_managed_device_groups = MagicMock() + self.job.instance.controller_managed_device_groups.first().name = "Meraki Managed Device Group" + self.job.instance.controller_managed_device_groups.count().return_value = 1 + self.job.hostname_mapping = [] + self.job.devicetype_mapping = [("MS", "Switch"), ("MX", "Firewall")] + self.job.network_loctype = site_loctype + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, task_name="fake task", worker="default" + ) + self.meraki = MerakiAdapter(job=self.job, sync=None, client=self.meraki_client) + + def test_data_loading(self): + """Test Nautobot SSoT for Meraki load() function.""" + self.meraki_client.validate_organization_exists.return_value = True + self.meraki.load() + self.assertEqual( + {f"{net['name']}__None" for net in fix.GET_ORG_NETWORKS_SENT_FIXTURE}, + {net.get_unique_id() for net in self.meraki.get_all("network")}, + ) + self.assertEqual( + {dev["name"] for dev in fix.GET_ORG_DEVICES_FIXTURE}, + {dev.get_unique_id() for dev in self.meraki.get_all("device")}, + ) + wan1_ports = [ + f"wan1__{dev['name']}" + for dev in fix.GET_ORG_DEVICES_FIXTURE + if dev["model"].startswith(("MX", "MG", "MR", "MS", "Z")) + ] + wan2_ports = [ + f"wan2__{dev['name']}" + for dev in fix.GET_ORG_DEVICES_FIXTURE + if dev["model"].startswith(("MX", "MG", "MR", "MS", "Z")) + ] + lan_ports = [] + for port in fix.GET_APPLIANCE_SWITCHPORTS_FIXTURE: + for dev in fix.GET_ORG_DEVICES_FIXTURE: + if dev["model"].startswith(("MX", "MG", "Z")): + lan_ports.append(f"{port['number']}__{dev['name']}") + for switch in fix.GET_ORG_SWITCHPORTS_SENT_FIXTURE: + for port in switch["ports"]: + lan_ports.append(f"{port['portId']}__Lab Switch") + expected_ports = set(wan1_ports + wan2_ports + lan_ports) + self.assertEqual(expected_ports, {port.get_unique_id() for port in self.meraki.get_all("port")}) + self.assertEqual({"10.1.15.0/24__Global"}, {pf.get_unique_id() for pf in self.meraki.get_all("prefix")}) + self.assertEqual( + { + "10.1.15.10/24__10.1.15.0/24", + "10.1.15.34/24__10.1.15.0/24", + }, + {ip.get_unique_id() for ip in self.meraki.get_all("ipaddress")}, + ) + + def test_duplicate_device_loading_error(self): + """Validate error thrown when duplicate device attempts to be loaded.""" + self.meraki.load_devices() + self.meraki.load_devices() + self.job.logger.warning.assert_called() + self.job.logger.warning.calls[0].contains(message="Duplicate device Lab01 found and being skipped.") + self.job.logger.warning.calls[1].contains(message="Duplicate device HQ01 found and being skipped.") + self.job.logger.warning.calls[2].contains(message="Duplicate device Lab Switch found and being skipped.") + self.job.logger.warning.calls[3].contains(message="Duplicate device HQ AP found and being skipped.") diff --git a/nautobot_ssot/tests/meraki/test_adapters_nautobot.py b/nautobot_ssot/tests/meraki/test_adapters_nautobot.py new file mode 100644 index 00000000..f772611f --- /dev/null +++ b/nautobot_ssot/tests/meraki/test_adapters_nautobot.py @@ -0,0 +1,144 @@ +"""Unit tests for the Nautobot DiffSync adapter.""" + +from unittest.mock import MagicMock + +from django.contrib.auth import get_user_model +from django.contrib.contenttypes.models import ContentType +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform +from nautobot.extras.models import JobResult, Note, Role, Status +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Namespace, Prefix + +from nautobot_ssot.integrations.meraki.diffsync.adapters.nautobot import NautobotAdapter +from nautobot_ssot.integrations.meraki.jobs import MerakiDataSource + +User = get_user_model() + + +class NautobotDiffSyncTestCase(TransactionTestCase): + """Test the NautobotAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): # pylint: disable=too-many-locals + """Per-test-case data setup.""" + super().setUp() + self.status_active = Status.objects.get(name="Active") + + self.region_type = LocationType.objects.get_or_create(name="Region", defaults={"nestable": True})[0] + global_region = Location.objects.create( + name="Global Region", + location_type=self.region_type, + status=self.status_active, + ) + global_region.validated_save() + self.site_type = LocationType.objects.get_or_create(name="Site")[0] + self.site_type.content_types.add(ContentType.objects.get_for_model(Device)) + self.site_type.content_types.add(ContentType.objects.get_for_model(Prefix)) + site1 = Location.objects.create( + name="Lab", + location_type=self.site_type, + status=self.status_active, + time_zone="America/Chicago", + ) + site1.validated_save() + site1.tags.set(["Test"]) + site1.validated_save() + site_note = Note.objects.create( + note="Test", + user=User.objects.first(), + assigned_object_type=ContentType.objects.get_for_model(Location), + assigned_object_id=site1.id, + ) + site_note.validated_save() + + cisco_manu = Manufacturer.objects.get_or_create(name="Cisco Meraki")[0] + cisco_manu.validated_save() + + meraki_plat = Platform.objects.get_or_create(name="Cisco Meraki")[0] + + mx84 = DeviceType.objects.create(model="MX84", manufacturer=cisco_manu) + mx84.validated_save() + + core_role = Role.objects.get_or_create(name="CORE")[0] + core_role.content_types.add(ContentType.objects.get_for_model(Device)) + + lab01 = Device.objects.create( + name="Lab01", + serial="ABC-123-456", + status=self.status_active, + role=core_role, + device_type=mx84, + platform=meraki_plat, + location=site1, + ) + lab01.validated_save() + lab01.custom_field_data["system_of_record"] = "Meraki SSoT" + lab01.custom_field_data["os_version"] = "10.1.1" + lab01.validated_save() + lab01_note = Note.objects.create( + note="Lab01 Test Note", + user=User.objects.first(), + assigned_object_type=ContentType.objects.get_for_model(Device), + assigned_object_id=lab01.id, + ) + lab01_note.validated_save() + + lab01_mgmt = Interface.objects.create( + name="wan1", + device=lab01, + enabled=True, + mode="access", + mgmt_only=True, + type="1000base-t", + status=self.status_active, + ) + lab01_mgmt.validated_save() + lab01_mgmt.custom_field_data["system_of_record"] = "Meraki SSoT" + lab01_mgmt.validated_save() + + test_ns = Namespace.objects.create(name="Test") + lab_prefix = Prefix.objects.create( + prefix="10.0.0.0/24", location=site1, namespace=test_ns, status=self.status_active + ) + lab01_mgmt_ip = IPAddress.objects.create(address="10.0.0.1/24", parent=lab_prefix, status=self.status_active) + lab_prefix.custom_field_data["system_of_record"] = "Meraki SSoT" + lab_prefix.validated_save() + lab01_mgmt_ip.custom_field_data["system_of_record"] = "Meraki SSoT" + lab01_mgmt_ip.validated_save() + IPAddressToInterface.objects.create(ip_address=lab01_mgmt_ip, interface=lab01_mgmt) + + job = MerakiDataSource() + job.logger.warning = MagicMock() + job.parent_location = global_region + job.hostname_mapping = [] + job.devicetype_mapping = [("MS", "Switch"), ("MX", "Firewall")] + job.network_loctype = self.site_type + job.tenant = None + job.job_result = JobResult.objects.create(name=job.class_path, task_name="fake task", worker="default") + self.nb_adapter = NautobotAdapter(job=job, sync=None) + + def test_data_loading(self): + """Test the load() function.""" + self.nb_adapter.load() + self.assertEqual( + {f"{site.name}__None" for site in Location.objects.filter(location_type=self.site_type)}, + {site.get_unique_id() for site in self.nb_adapter.get_all("network")}, + ) + self.assertEqual( + {dev.name for dev in Device.objects.all()}, + {dev.get_unique_id() for dev in self.nb_adapter.get_all("device")}, + ) + self.assertEqual({"wan1__Lab01"}, {port.get_unique_id() for port in self.nb_adapter.get_all("port")}) + self.assertEqual( + {f"{pf.prefix}__{pf.namespace.name}" for pf in Prefix.objects.all()}, + {pf.get_unique_id() for pf in self.nb_adapter.get_all("prefix")}, + ) + self.assertEqual( + {f"{ipaddr.address}__{ipaddr.parent.prefix}" for ipaddr in IPAddress.objects.all()}, + {ipaddr.get_unique_id() for ipaddr in self.nb_adapter.get_all("ipaddress")}, + ) + self.assertEqual( + {"10.0.0.1/24__Lab01__Test__wan1"}, + {map.get_unique_id() for map in self.nb_adapter.get_all("ipassignment")}, + ) diff --git a/nautobot_ssot/tests/meraki/test_models_nautobot.py b/nautobot_ssot/tests/meraki/test_models_nautobot.py new file mode 100644 index 00000000..998e5601 --- /dev/null +++ b/nautobot_ssot/tests/meraki/test_models_nautobot.py @@ -0,0 +1,95 @@ +"""Unit tests for Nautobot IPAM model CRUD functions.""" + +from unittest.mock import patch + +from diffsync import Adapter +from django.contrib.contenttypes.models import ContentType +from django.test import override_settings +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Location, LocationType +from nautobot.extras.models import Status +from nautobot.ipam.models import Namespace, Prefix +from nautobot.tenancy.models import Tenant + +from nautobot_ssot.integrations.meraki.diffsync.models.nautobot import NautobotPrefix + + +@override_settings(PLUGINS_CONFIG={"nautobot_ssot": {"enable_meraki": True}}) +class TestNautobotPrefix(TransactionTestCase): # pylint: disable=too-many-instance-attributes + """Test the NautobotPrefix class.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Configure common variables and objects for tests.""" + super().setUp() + self.status_active = Status.objects.get(name="Active") + site_lt = LocationType.objects.get_or_create(name="Site")[0] + site_lt.content_types.add(ContentType.objects.get_for_model(Prefix)) + self.test_site = Location.objects.get_or_create(name="Test", location_type=site_lt, status=self.status_active)[ + 0 + ] + self.update_site = Location.objects.get_or_create( + name="Update", location_type=site_lt, status=self.status_active + )[0] + self.test_tenant = Tenant.objects.get_or_create(name="Test")[0] + self.update_tenant = Tenant.objects.get_or_create(name="Update")[0] + self.test_ns = Namespace.objects.get_or_create(name="Test")[0] + self.prefix = Prefix.objects.create( + prefix="10.0.0.0/24", namespace=self.test_ns, status=self.status_active, tenant=self.test_tenant + ) + self.adapter = Adapter() + self.adapter.namespace_map = {"Test": self.test_ns.id, "Update": self.update_site.id} + self.adapter.site_map = {"Test": self.test_site, "Update": self.update_site} + self.adapter.tenant_map = {"Test": self.test_tenant.id, "Update": self.update_tenant.id} + self.adapter.status_map = {"Active": self.status_active.id} + self.adapter.prefix_map = {} + self.adapter.objects_to_create = {"prefixes": [], "prefix_locs": []} + self.adapter.objects_to_delete = {"prefixes": []} + + def test_create(self): + """Validate the NautobotPrefix create() method creates a Prefix.""" + self.prefix.delete() + ids = {"prefix": "10.0.0.0/24", "namespace": "Test"} + attrs = {"location": "Test", "tenant": "Test"} + result = NautobotPrefix.create(self.adapter, ids, attrs) + self.assertIsInstance(result, NautobotPrefix) + self.assertEqual(len(self.adapter.objects_to_create["prefixes"]), 1) + self.assertEqual(len(self.adapter.objects_to_create["prefix_locs"]), 1) + subnet = self.adapter.objects_to_create["prefixes"][0] + self.assertEqual(str(subnet.prefix), ids["prefix"]) + self.assertEqual(self.adapter.prefix_map[ids["prefix"]], subnet.id) + self.assertEqual(subnet.custom_field_data["system_of_record"], "Meraki SSoT") + + def test_update(self): + """Validate the NautobotPrefix update() method updates a Prefix.""" + test_pf = NautobotPrefix( + prefix="10.0.0.0/24", + namespace="Test", + location="Test", + tenant="Test", + uuid=self.prefix.id, + ) + test_pf.adapter = self.adapter + update_attrs = {"location": "Update", "tenant": "Update"} + actual = NautobotPrefix.update(self=test_pf, attrs=update_attrs) + self.prefix.refresh_from_db() + self.assertEqual(self.prefix.location, self.update_site) + self.assertEqual(self.prefix.tenant, self.update_tenant) + self.assertEqual(actual, test_pf) + + @patch("nautobot_ssot.integrations.meraki.diffsync.models.nautobot.OrmPrefix.objects.get") + def test_delete(self, mock_prefix): + """Validate the NautobotPrefix delete() deletes a Prefix.""" + test_pf = NautobotPrefix( + prefix="10.0.0.0/24", + namespace="Test", + location="Test", + tenant="Test", + uuid=self.prefix.id, + ) + test_pf.adapter = self.adapter + mock_prefix.return_value = self.prefix + test_pf.delete() + self.assertEqual(len(self.adapter.objects_to_delete["prefixes"]), 1) + self.assertEqual(self.adapter.objects_to_delete["prefixes"][0].id, self.prefix.id) diff --git a/nautobot_ssot/tests/meraki/test_utils_meraki.py b/nautobot_ssot/tests/meraki/test_utils_meraki.py new file mode 100644 index 00000000..499400c4 --- /dev/null +++ b/nautobot_ssot/tests/meraki/test_utils_meraki.py @@ -0,0 +1,126 @@ +"""Unit tests for Meraki utility functions.""" + +from unittest import TestCase +from unittest.mock import MagicMock, patch + +import meraki + +from nautobot_ssot.integrations.meraki.utils.meraki import DashboardClient +from nautobot_ssot.tests.meraki.fixtures import fixtures as fix + + +class TestDashboardClient(TestCase): + """Unit tests for the DashboardClient class.""" + + @patch("meraki.DashboardAPI") + def test_successful_connection(self, mock_api): + """Test successful connection to Meraki dashboard with valid API key and base URL.""" + logger = MagicMock() + org_id = "12345" + token = "valid_token" # noqa: S105 + dashboard_client = DashboardClient(logger, org_id, token) + + mock_api.assert_called_once_with( + api_key=token, base_url="https://api.meraki.com/api/v1/", output_log=False, print_console=False + ) + + self.assertIsNotNone(dashboard_client.conn) + self.assertEqual(dashboard_client.logger, logger) + self.assertEqual(dashboard_client.org_id, org_id) + self.assertEqual(dashboard_client.token, token) + + @patch("meraki.DashboardAPI") + def test_invalid_api_key(self, mock_api): + """Test that an Raises an exception of type 'meraki.APIError' if API key is invalid or missing.""" + mock_response = MagicMock() + mock_response.status_code = 401 + mock_response.reason = "Invalid API key" + mock_api.side_effect = meraki.APIError( + metadata={"operation": "GET", "tags": ["Failed"]}, response=mock_response + ) + + logger = MagicMock() + org_id = "12345" + token = "invalid_token" # noqa: S105 + + with self.assertRaises(meraki.APIError): + DashboardClient(logger, org_id, token) + + def test_validate_organization_exists_success_response(self): + """Test the validate_organization_exists() response is true if org ID found.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + dashboard_client = DashboardClient(logger, org_id, token) + dashboard_client.conn.organizations.getOrganizations = MagicMock() + dashboard_client.conn.organizations.getOrganizations.return_value = [{"id": "123456789"}, {"id": "987654321"}] + + organization_exists = dashboard_client.validate_organization_exists() + + self.assertTrue(organization_exists) + + def test_validate_organization_exists_failure_response(self): + """Test the validate_organization_exists() response is false if wrong org ID.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + dashboard_client = DashboardClient(logger, org_id, token) + dashboard_client.conn.organizations.getOrganizations = MagicMock() + dashboard_client.conn.organizations.getOrganizations.return_value = [{"id": "987654321"}] + + organization_exists = dashboard_client.validate_organization_exists() + + self.assertFalse(organization_exists) + + def test_get_org_networks(self): + """Test the get_org_networks() response is as expected.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + client = DashboardClient(logger, org_id, token) + client.conn.organizations.getOrganizationNetworks = MagicMock() + client.conn.organizations.getOrganizationNetworks.return_value = fix.GET_ORG_NETWORKS_SENT_FIXTURE + + actual = client.get_org_networks() + expected = fix.GET_ORG_NETWORKS_SENT_FIXTURE + self.assertEqual(actual, expected) + self.assertEqual(client.network_map, fix.GET_ORG_NETWORKS_RECV_FIXTURE) + + def test_get_org_devices(self): + """Test the get_org_devices() response is as expected.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + client = DashboardClient(logger, org_id, token) + client.conn.organizations.getOrganizationDevices = MagicMock() + client.conn.organizations.getOrganizationDevices.return_value = fix.GET_ORG_DEVICES_FIXTURE + + actual = client.get_org_devices() + expected = fix.GET_ORG_DEVICES_FIXTURE + self.assertEqual(actual, expected) + + def test_get_org_switchports(self): + """Test the get_org_switchports() response is as expected.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + client = DashboardClient(logger, org_id, token) + client.conn.switch.getOrganizationSwitchPortsBySwitch = MagicMock() + client.conn.switch.getOrganizationSwitchPortsBySwitch.return_value = fix.GET_ORG_SWITCHPORTS_SENT_FIXTURE + + actual = client.get_org_switchports() + expected = fix.GET_ORG_SWITCHPORTS_RECV_FIXTURE + self.assertEqual(actual, expected) + + def test_get_org_device_statuses(self): + """Test the get_org_device_statuses() response is as expected.""" + logger = MagicMock() + org_id = "123456789" + token = "your_api_token" # noqa: S105 + client = DashboardClient(logger, org_id, token) + client.conn.organizations.getOrganizationDevicesStatuses = MagicMock() + client.conn.organizations.getOrganizationDevicesStatuses.return_value = fix.GET_ORG_DEVICE_STATUSES_SENT_FIXTURE + + actual = client.get_org_device_statuses() + expected = fix.GET_ORG_DEVICE_STATUSES_RECV_FIXTURE + self.assertEqual(actual, expected) diff --git a/poetry.lock b/poetry.lock index 7925c3f4..ac2828d1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,142 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "aiohappyeyeballs" +version = "2.4.3" +description = "Happy Eyeballs for asyncio" +optional = true +python-versions = ">=3.8" +files = [ + {file = "aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572"}, + {file = "aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586"}, +] + +[[package]] +name = "aiohttp" +version = "3.10.10" +description = "Async http client/server framework (asyncio)" +optional = true +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, + {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, + {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, + {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, + {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, + {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, + {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, + {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, + {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, + {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, + {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, + {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, + {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, + {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, + {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, + {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, + {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, + {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, + {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, + {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, + {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, + {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, + {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, + {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, + {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, + {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, + {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, + {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, + {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, + {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, + {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, +] + +[package.dependencies] +aiohappyeyeballs = ">=2.3.0" +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.12.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = true +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "alabaster" version = "0.7.13" @@ -52,13 +189,13 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} [[package]] name = "anyio" -version = "4.4.0" +version = "4.5.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = true python-versions = ">=3.8" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, ] [package.dependencies] @@ -68,9 +205,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -258,13 +395,13 @@ tzdata = ["tzdata"] [[package]] name = "billiard" -version = "4.2.0" +version = "4.2.1" description = "Python multiprocessing fork with improvements and bugfixes" optional = false python-versions = ">=3.7" files = [ - {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, - {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, + {file = "billiard-4.2.1-py3-none-any.whl", hash = "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb"}, + {file = "billiard-4.2.1.tar.gz", hash = "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f"}, ] [[package]] @@ -426,101 +563,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -957,13 +1109,13 @@ redis = ["redis (>=4.3,<5.0)"] [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -1251,6 +1403,7 @@ files = [ [package.dependencies] asgiref = ">=3.6.0" +celery = {version = ">=5.1", optional = true, markers = "extra == \"celery\""} django = ">=4.2" django-ipware = ">=6.0.2" structlog = ">=21.4.0" @@ -1357,13 +1510,13 @@ django = ">=4.2" [[package]] name = "dnacentersdk" -version = "2.7.3" +version = "2.7.4" description = "Cisco DNA Center Platform SDK" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "dnacentersdk-2.7.3-py3-none-any.whl", hash = "sha256:292fcf65638843977658024fa41888cb736a2ef58a601ac167e9bfdca97b4fcd"}, - {file = "dnacentersdk-2.7.3.tar.gz", hash = "sha256:e3dd541f580a1f33e22e9a402d67629467b530c54c3cdb5356aa4744ee71b048"}, + {file = "dnacentersdk-2.7.4-py3-none-any.whl", hash = "sha256:befab14a8a7a2dc3e6f4a51e66ec3bf3937f97dbad091098670d1a0620eb87a3"}, + {file = "dnacentersdk-2.7.4.tar.gz", hash = "sha256:91cbe7c7664afd59afca9150819cf45c5b6d0705e218dadf21fee1882a2f0802"}, ] [package.dependencies] @@ -1516,53 +1669,59 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.53.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] @@ -1579,6 +1738,92 @@ ufo = ["fs (>=2.2.0,<3)"] unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = true +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -1748,61 +1993,70 @@ colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.65.5" +version = "1.67.0" description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.8" files = [ - {file = "grpcio-1.65.5-cp310-cp310-linux_armv7l.whl", hash = "sha256:b67d450f1e008fedcd81e097a3a400a711d8be1a8b20f852a7b8a73fead50fe3"}, - {file = "grpcio-1.65.5-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:a70a20eed87bba647a38bedd93b3ce7db64b3f0e8e0952315237f7f5ca97b02d"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f79c87c114bf37adf408026b9e2e333fe9ff31dfc9648f6f80776c513145c813"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17f9fa2d947dbfaca01b3ab2c62eefa8240131fdc67b924eb42ce6032e3e5c1"}, - {file = "grpcio-1.65.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d60e18ff7c34fe3f6db3d35ad5c6dc99f5b43ff3982cb26fad4174462d10b1"}, - {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fe6505376f5b00bb008e4e1418152e3ad3d954b629da286c7913ff3cfc0ff740"}, - {file = "grpcio-1.65.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33158e56c6378063923c417e9fbdb28660b6e0e2835af42e67f5a7793f587af7"}, - {file = "grpcio-1.65.5-cp310-cp310-win32.whl", hash = "sha256:1cbc208edb9acf1cc339396a1a36b83796939be52f34e591c90292045b579fbf"}, - {file = "grpcio-1.65.5-cp310-cp310-win_amd64.whl", hash = "sha256:bc74f3f745c37e2c5685c9d2a2d5a94de00f286963f5213f763ae137bf4f2358"}, - {file = "grpcio-1.65.5-cp311-cp311-linux_armv7l.whl", hash = "sha256:3207ae60d07e5282c134b6e02f9271a2cb523c6d7a346c6315211fe2bf8d61ed"}, - {file = "grpcio-1.65.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a2f80510f99f82d4eb825849c486df703f50652cea21c189eacc2b84f2bde764"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:a80e9a5e3f93c54f5eb82a3825ea1fc4965b2fa0026db2abfecb139a5c4ecdf1"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b2944390a496567de9e70418f3742b477d85d8ca065afa90432edc91b4bb8ad"}, - {file = "grpcio-1.65.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3655139d7be213c32c79ef6fb2367cae28e56ef68e39b1961c43214b457f257"}, - {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05f02d68fc720e085f061b704ee653b181e6d5abfe315daef085719728d3d1fd"}, - {file = "grpcio-1.65.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1c4caafe71aef4dabf53274bbf4affd6df651e9f80beedd6b8e08ff438ed3260"}, - {file = "grpcio-1.65.5-cp311-cp311-win32.whl", hash = "sha256:84c901cdec16a092099f251ef3360d15e29ef59772150fa261d94573612539b5"}, - {file = "grpcio-1.65.5-cp311-cp311-win_amd64.whl", hash = "sha256:11f8b16121768c1cb99d7dcb84e01510e60e6a206bf9123e134118802486f035"}, - {file = "grpcio-1.65.5-cp312-cp312-linux_armv7l.whl", hash = "sha256:ee6ed64a27588a2c94e8fa84fe8f3b5c89427d4d69c37690903d428ec61ca7e4"}, - {file = "grpcio-1.65.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:76991b7a6fb98630a3328839755181ce7c1aa2b1842aa085fd4198f0e5198960"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:89c00a18801b1ed9cc441e29b521c354725d4af38c127981f2c950c796a09b6e"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:078038e150a897e5e402ed3d57f1d31ebf604cbed80f595bd281b5da40762a92"}, - {file = "grpcio-1.65.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97962720489ef31b5ad8a916e22bc31bba3664e063fb9f6702dce056d4aa61b"}, - {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b8270b15b99781461b244f5c81d5c2bc9696ab9189fb5ff86c841417fb3b39fe"}, - {file = "grpcio-1.65.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e5c4c15ac3fe1eb68e46bc51e66ad29be887479f231f8237cf8416058bf0cc1"}, - {file = "grpcio-1.65.5-cp312-cp312-win32.whl", hash = "sha256:f5b5970341359341d0e4c789da7568264b2a89cd976c05ea476036852b5950cd"}, - {file = "grpcio-1.65.5-cp312-cp312-win_amd64.whl", hash = "sha256:238a625f391a1b9f5f069bdc5930f4fd71b74426bea52196fc7b83f51fa97d34"}, - {file = "grpcio-1.65.5-cp38-cp38-linux_armv7l.whl", hash = "sha256:6c4e62bcf297a1568f627f39576dbfc27f1e5338a691c6dd5dd6b3979da51d1c"}, - {file = "grpcio-1.65.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d7df567b67d16d4177835a68d3f767bbcbad04da9dfb52cbd19171f430c898bd"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:b7ca419f1462390851eec395b2089aad1e49546b52d4e2c972ceb76da69b10f8"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa36dd8496d3af0d40165252a669fa4f6fd2db4b4026b9a9411cbf060b9d6a15"}, - {file = "grpcio-1.65.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a101696f9ece90a0829988ff72f1b1ea2358f3df035bdf6d675dd8b60c2c0894"}, - {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2a6d8169812932feac514b420daffae8ab8e36f90f3122b94ae767e633296b17"}, - {file = "grpcio-1.65.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:47d0aaaab82823f0aa6adea5184350b46e2252e13a42a942db84da5b733f2e05"}, - {file = "grpcio-1.65.5-cp38-cp38-win32.whl", hash = "sha256:85ae8f8517d5bcc21fb07dbf791e94ed84cc28f84c903cdc2bd7eaeb437c8f45"}, - {file = "grpcio-1.65.5-cp38-cp38-win_amd64.whl", hash = "sha256:770bd4bd721961f6dd8049bc27338564ba8739913f77c0f381a9815e465ff965"}, - {file = "grpcio-1.65.5-cp39-cp39-linux_armv7l.whl", hash = "sha256:ab5ec837d8cee8dbce9ef6386125f119b231e4333cc6b6d57b6c5c7c82a72331"}, - {file = "grpcio-1.65.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cabd706183ee08d8026a015af5819a0b3a8959bdc9d1f6fdacd1810f09200f2a"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ec71fc5b39821ad7d80db7473c8f8c2910f3382f0ddadfbcfc2c6c437107eb67"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a9e35bcb045e39d7cac30464c285389b9a816ac2067e4884ad2c02e709ef8e"}, - {file = "grpcio-1.65.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d750e9330eb14236ca11b78d0c494eed13d6a95eb55472298f0e547c165ee324"}, - {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2b91ce647b6307f25650872454a4d02a2801f26a475f90d0b91ed8110baae589"}, - {file = "grpcio-1.65.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8da58ff80bc4556cf29bc03f5fff1f03b8387d6aaa7b852af9eb65b2cf833be4"}, - {file = "grpcio-1.65.5-cp39-cp39-win32.whl", hash = "sha256:7a412959aa5f08c5ac04aa7b7c3c041f5e4298cadd4fcc2acff195b56d185ebc"}, - {file = "grpcio-1.65.5-cp39-cp39-win_amd64.whl", hash = "sha256:55714ea852396ec9568f45f487639945ab674de83c12bea19d5ddbc3ae41ada3"}, - {file = "grpcio-1.65.5.tar.gz", hash = "sha256:ec6f219fb5d677a522b0deaf43cea6697b16f338cb68d009e30930c4aa0d2209"}, + {file = "grpcio-1.67.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:bd79929b3bb96b54df1296cd3bf4d2b770bd1df6c2bdf549b49bab286b925cdc"}, + {file = "grpcio-1.67.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:16724ffc956ea42967f5758c2f043faef43cb7e48a51948ab593570570d1e68b"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:2b7183c80b602b0ad816315d66f2fb7887614ead950416d60913a9a71c12560d"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe32b45dd6d118f5ea2e5deaed417d8a14976325c93812dd831908522b402c9"}, + {file = "grpcio-1.67.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe89295219b9c9e47780a0f1c75ca44211e706d1c598242249fe717af3385ec8"}, + {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa8d025fae1595a207b4e47c2e087cb88d47008494db258ac561c00877d4c8f8"}, + {file = "grpcio-1.67.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f95e15db43e75a534420e04822df91f645664bf4ad21dfaad7d51773c80e6bb4"}, + {file = "grpcio-1.67.0-cp310-cp310-win32.whl", hash = "sha256:a6b9a5c18863fd4b6624a42e2712103fb0f57799a3b29651c0e5b8119a519d65"}, + {file = "grpcio-1.67.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6eb68493a05d38b426604e1dc93bfc0137c4157f7ab4fac5771fd9a104bbaa6"}, + {file = "grpcio-1.67.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:e91d154689639932305b6ea6f45c6e46bb51ecc8ea77c10ef25aa77f75443ad4"}, + {file = "grpcio-1.67.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cb204a742997277da678611a809a8409657b1398aaeebf73b3d9563b7d154c13"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:ae6de510f670137e755eb2a74b04d1041e7210af2444103c8c95f193340d17ee"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74b900566bdf68241118f2918d312d3bf554b2ce0b12b90178091ea7d0a17b3d"}, + {file = "grpcio-1.67.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4e95e43447a02aa603abcc6b5e727d093d161a869c83b073f50b9390ecf0fa8"}, + {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bb94e66cd8f0baf29bd3184b6aa09aeb1a660f9ec3d85da615c5003154bc2bf"}, + {file = "grpcio-1.67.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:82e5bd4b67b17c8c597273663794a6a46a45e44165b960517fe6d8a2f7f16d23"}, + {file = "grpcio-1.67.0-cp311-cp311-win32.whl", hash = "sha256:7fc1d2b9fd549264ae585026b266ac2db53735510a207381be509c315b4af4e8"}, + {file = "grpcio-1.67.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac11ecb34a86b831239cc38245403a8de25037b448464f95c3315819e7519772"}, + {file = "grpcio-1.67.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:227316b5631260e0bef8a3ce04fa7db4cc81756fea1258b007950b6efc90c05d"}, + {file = "grpcio-1.67.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d90cfdafcf4b45a7a076e3e2a58e7bc3d59c698c4f6470b0bb13a4d869cf2273"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:77196216d5dd6f99af1c51e235af2dd339159f657280e65ce7e12c1a8feffd1d"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15c05a26a0f7047f720da41dc49406b395c1470eef44ff7e2c506a47ac2c0591"}, + {file = "grpcio-1.67.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3840994689cc8cbb73d60485c594424ad8adb56c71a30d8948d6453083624b52"}, + {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a1e03c3102b6451028d5dc9f8591131d6ab3c8a0e023d94c28cb930ed4b5f81"}, + {file = "grpcio-1.67.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:682968427a63d898759474e3b3178d42546e878fdce034fd7474ef75143b64e3"}, + {file = "grpcio-1.67.0-cp312-cp312-win32.whl", hash = "sha256:d01793653248f49cf47e5695e0a79805b1d9d4eacef85b310118ba1dfcd1b955"}, + {file = "grpcio-1.67.0-cp312-cp312-win_amd64.whl", hash = "sha256:985b2686f786f3e20326c4367eebdaed3e7aa65848260ff0c6644f817042cb15"}, + {file = "grpcio-1.67.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:8c9a35b8bc50db35ab8e3e02a4f2a35cfba46c8705c3911c34ce343bd777813a"}, + {file = "grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:323741b6699cd2b04a71cb38f502db98f90532e8a40cb675393d248126a268af"}, + {file = "grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c"}, + {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f6bd2ab135c64a4d1e9e44679a616c9bc944547357c830fafea5c3caa3de5153"}, + {file = "grpcio-1.67.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:2f55c1e0e2ae9bdd23b3c63459ee4c06d223b68aeb1961d83c48fb63dc29bc03"}, + {file = "grpcio-1.67.0-cp313-cp313-win32.whl", hash = "sha256:fd6bc27861e460fe28e94226e3673d46e294ca4673d46b224428d197c5935e69"}, + {file = "grpcio-1.67.0-cp313-cp313-win_amd64.whl", hash = "sha256:cf51d28063338608cd8d3cd64677e922134837902b70ce00dad7f116e3998210"}, + {file = "grpcio-1.67.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:7f200aca719c1c5dc72ab68be3479b9dafccdf03df530d137632c534bb6f1ee3"}, + {file = "grpcio-1.67.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0892dd200ece4822d72dd0952f7112c542a487fc48fe77568deaaa399c1e717d"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:f4d613fbf868b2e2444f490d18af472ccb47660ea3df52f068c9c8801e1f3e85"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c69bf11894cad9da00047f46584d5758d6ebc9b5950c0dc96fec7e0bce5cde9"}, + {file = "grpcio-1.67.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9bca3ca0c5e74dea44bf57d27e15a3a3996ce7e5780d61b7c72386356d231db"}, + {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:014dfc020e28a0d9be7e93a91f85ff9f4a87158b7df9952fe23cc42d29d31e1e"}, + {file = "grpcio-1.67.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d4ea4509d42c6797539e9ec7496c15473177ce9abc89bc5c71e7abe50fc25737"}, + {file = "grpcio-1.67.0-cp38-cp38-win32.whl", hash = "sha256:9d75641a2fca9ae1ae86454fd25d4c298ea8cc195dbc962852234d54a07060ad"}, + {file = "grpcio-1.67.0-cp38-cp38-win_amd64.whl", hash = "sha256:cff8e54d6a463883cda2fab94d2062aad2f5edd7f06ae3ed030f2a74756db365"}, + {file = "grpcio-1.67.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:62492bd534979e6d7127b8a6b29093161a742dee3875873e01964049d5250a74"}, + {file = "grpcio-1.67.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eef1dce9d1a46119fd09f9a992cf6ab9d9178b696382439446ca5f399d7b96fe"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:f623c57a5321461c84498a99dddf9d13dac0e40ee056d884d6ec4ebcab647a78"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54d16383044e681f8beb50f905249e4e7261dd169d4aaf6e52eab67b01cbbbe2"}, + {file = "grpcio-1.67.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2a44e572fb762c668e4812156b81835f7aba8a721b027e2d4bb29fb50ff4d33"}, + {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:391df8b0faac84d42f5b8dfc65f5152c48ed914e13c522fd05f2aca211f8bfad"}, + {file = "grpcio-1.67.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cfd9306511fdfc623a1ba1dc3bc07fbd24e6cfbe3c28b4d1e05177baa2f99617"}, + {file = "grpcio-1.67.0-cp39-cp39-win32.whl", hash = "sha256:30d47dbacfd20cbd0c8be9bfa52fdb833b395d4ec32fe5cff7220afc05d08571"}, + {file = "grpcio-1.67.0-cp39-cp39-win_amd64.whl", hash = "sha256:f55f077685f61f0fbd06ea355142b71e47e4a26d2d678b3ba27248abfe67163a"}, + {file = "grpcio-1.67.0.tar.gz", hash = "sha256:e090b2553e0da1c875449c8e75073dd4415dd71c9bde6a406240fdf4c0ee467c"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.65.5)"] +protobuf = ["grpcio-tools (>=1.67.0)"] [[package]] name = "h11" @@ -1843,13 +2097,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.6" description = "A minimal low-level HTTP client." optional = true python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f"}, + {file = "httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f"}, ] [package.dependencies] @@ -1860,7 +2114,7 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" @@ -1899,15 +2153,18 @@ files = [ [[package]] name = "idna" -version = "3.7" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, - {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "ijson" version = "3.3.0" @@ -2024,22 +2281,26 @@ files = [ [[package]] name = "importlib-metadata" -version = "8.4.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-8.4.0-py3-none-any.whl", hash = "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1"}, - {file = "importlib_metadata-8.4.0.tar.gz", hash = "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" @@ -2101,13 +2362,13 @@ files = [ [[package]] name = "ipfabric" -version = "6.9.4" +version = "6.9.10" description = "Python package for interacting with IP Fabric" optional = true python-versions = "<4.0,>=3.8" files = [ - {file = "ipfabric-6.9.4-py3-none-any.whl", hash = "sha256:31d65d4de544233ddc1278b651c1ccf2ac798bde2ce20528ce232e5db602d2f1"}, - {file = "ipfabric-6.9.4.tar.gz", hash = "sha256:6733e0b7447f7c4274735d1010d5879a3952cf540a3f3f458d256aff6a4a1b92"}, + {file = "ipfabric-6.9.10-py3-none-any.whl", hash = "sha256:88b262a53605fcd7e4dd5bf771cb6cb23940f2d2ba9ee5514f81d9d4dd82e9a6"}, + {file = "ipfabric-6.9.10.tar.gz", hash = "sha256:f60ba883ea5e5ce830b79dfaf553ea4afd3d32c7aa6033694d591d1f5c727316"}, ] [package.dependencies] @@ -2126,9 +2387,11 @@ pytz = ">=2023.1,<2025" typing-extensions = {version = ">=4.9.0,<5.0.0", markers = "python_version < \"3.9\""} [package.extras] -all = ["openpyxl (>=3.1.2,<4.0.0)", "pandas (>=2.0.0,<3.0.0)", "pandas (>=2.1.4,<3.0.0)", "python-json-logger (>=2.0.7,<3.0.0)", "pyyaml (>=6.0.1,<7.0.0)", "rich (>=13.7.0,<14.0.0)", "tabulate (>=0.8.9,<0.10.0)"] -cli = ["rich (>=13.7.0,<14.0.0)"] +all = ["jinja2 (>=3.1.4,<4.0.0)", "openpyxl (>=3.1.2,<4.0.0)", "pandas (>=2.0.0,<3.0.0)", "pandas (>=2.1.4,<3.0.0)", "python-json-logger (>=2.0.7,<3.0.0)", "pyyaml (>=6.0.1,<7.0.0)", "rich (>=13.7.0,<14.0.0)", "tabulate (>=0.8.9,<0.10.0)"] +cli = ["openpyxl (>=3.1.2,<4.0.0)", "rich (>=13.7.0,<14.0.0)"] +cve = ["openpyxl (>=3.1.2,<4.0.0)"] examples = ["openpyxl (>=3.1.2,<4.0.0)", "pandas (>=2.0.0,<3.0.0)", "pandas (>=2.1.4,<3.0.0)", "python-json-logger (>=2.0.7,<3.0.0)", "pyyaml (>=6.0.1,<7.0.0)", "rich (>=13.7.0,<14.0.0)", "tabulate (>=0.8.9,<0.10.0)"] +matrix = ["jinja2 (>=3.1.4,<4.0.0)", "openpyxl (>=3.1.2,<4.0.0)"] pd = ["pandas (>=2.0.0,<3.0.0)", "pandas (>=2.1.4,<3.0.0)"] [[package]] @@ -2372,19 +2635,20 @@ files = [ [[package]] name = "kombu" -version = "5.4.0" +version = "5.4.2" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.4.0-py3-none-any.whl", hash = "sha256:c8dd99820467610b4febbc7a9e8a0d3d7da2d35116b67184418b51cc520ea6b6"}, - {file = "kombu-5.4.0.tar.gz", hash = "sha256:ad200a8dbdaaa2bbc5f26d2ee7d707d9a1fded353a0f4bd751ce8c7d9f449c60"}, + {file = "kombu-5.4.2-py3-none-any.whl", hash = "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763"}, + {file = "kombu-5.4.2.tar.gz", hash = "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf"}, ] [package.dependencies] amqp = ">=5.1.1,<6.0.0" "backports.zoneinfo" = {version = ">=0.2.1", extras = ["tzdata"], markers = "python_version < \"3.9\""} typing-extensions = {version = "4.12.2", markers = "python_version < \"3.10\""} +tzdata = {version = "*", markers = "python_version >= \"3.9\""} vine = "5.1.0" [package.extras] @@ -2394,7 +2658,7 @@ confluentkafka = ["confluent-kafka (>=2.2.0)"] consul = ["python-consul2 (==0.1.5)"] librabbitmq = ["librabbitmq (>=2.0.0)"] mongodb = ["pymongo (>=4.1.1)"] -msgpack = ["msgpack (==1.0.8)"] +msgpack = ["msgpack (==1.1.0)"] pyro = ["pyro4 (==4.82)"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] @@ -2698,13 +2962,13 @@ files = [ [[package]] name = "mdit-py-plugins" -version = "0.4.1" +version = "0.4.2" description = "Collection of plugins for markdown-it-py" optional = false python-versions = ">=3.8" files = [ - {file = "mdit_py_plugins-0.4.1-py3-none-any.whl", hash = "sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a"}, - {file = "mdit_py_plugins-0.4.1.tar.gz", hash = "sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c"}, + {file = "mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636"}, + {file = "mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5"}, ] [package.dependencies] @@ -2726,6 +2990,21 @@ files = [ {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] +[[package]] +name = "meraki" +version = "1.45.0" +description = "Cisco Meraki Dashboard API library" +optional = true +python-versions = ">=3.8" +files = [ + {file = "meraki-1.45.0-py3-none-any.whl", hash = "sha256:8681d107fbd6b93a5fc1f98e0c3d5b611dd2df520a83de6293bd423851e89087"}, + {file = "meraki-1.45.0.tar.gz", hash = "sha256:3c179ea2128dcc032511d023cc1f1fb153dcfa697e99c6961e85563de3fddc1a"}, +] + +[package.dependencies] +aiohttp = "*" +requests = "*" + [[package]] name = "mergedeep" version = "1.3.4" @@ -2886,69 +3165,181 @@ mkdocstrings = ">=0.25" [[package]] name = "msgpack" -version = "1.0.8" +version = "1.1.0" description = "MessagePack serializer" optional = true python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, - {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, - {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, - {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, - {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, - {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, - {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, - {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, - {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, - {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, - {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, - {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, - {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, - {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, - {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, - {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, - {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, - {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, - {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, - {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, - {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, - {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, - {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, - {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, - {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, - {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, + {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, + {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, + {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, + {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, + {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, + {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, + {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, + {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, + {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, + {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, + {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, + {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, + {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, + {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, + {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, + {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, + {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, + {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, + {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, + {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96"}, + {file = "msgpack-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb"}, + {file = "msgpack-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f"}, + {file = "msgpack-1.1.0-cp38-cp38-win32.whl", hash = "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b"}, + {file = "msgpack-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, + {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, + {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, + {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, + {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, + {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, + {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, +] + +[[package]] +name = "multidict" +version = "6.1.0" +description = "multidict implementation" +optional = true +python-versions = ">=3.8" +files = [ + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, + {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, + {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, + {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, + {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, + {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, + {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, + {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, + {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, + {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, + {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, + {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, + {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, + {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, + {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, + {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, + {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, + {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, + {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, + {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, + {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:db7457bac39421addd0c8449933ac32d8042aae84a14911a757ae6ca3eef1392"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d094ddec350a2fb899fec68d8353c78233debde9b7d8b4beeafa70825f1c281a"}, + {file = "multidict-6.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5845c1fd4866bb5dd3125d89b90e57ed3138241540897de748cdf19de8a2fca2"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9079dfc6a70abe341f521f78405b8949f96db48da98aeb43f9907f342f627cdc"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3914f5aaa0f36d5d60e8ece6a308ee1c9784cd75ec8151062614657a114c4478"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c08be4f460903e5a9d0f76818db3250f12e9c344e79314d1d570fc69d7f4eae4"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d093be959277cb7dee84b801eb1af388b6ad3ca6a6b6bf1ed7585895789d027d"}, + {file = "multidict-6.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3702ea6872c5a2a4eeefa6ffd36b042e9773f05b1f37ae3ef7264b1163c2dcf6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2090f6a85cafc5b2db085124d752757c9d251548cedabe9bd31afe6363e0aff2"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:f67f217af4b1ff66c68a87318012de788dd95fcfeb24cc889011f4e1c7454dfd"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:189f652a87e876098bbc67b4da1049afb5f5dfbaa310dd67c594b01c10388db6"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:6bb5992037f7a9eff7991ebe4273ea7f51f1c1c511e6a2ce511d0e7bdb754492"}, + {file = "multidict-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f4c2b9e770c4e393876e35a7046879d195cd123b4f116d299d442b335bcd"}, + {file = "multidict-6.1.0-cp38-cp38-win32.whl", hash = "sha256:e27bbb6d14416713a8bd7aaa1313c0fc8d44ee48d74497a0ff4c3a1b6ccb5167"}, + {file = "multidict-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:22f3105d4fb15c8f57ff3959a58fcab6ce36814486500cd7485651230ad4d4ef"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, + {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, + {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, + {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, + {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, + {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, + {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, + {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""} + [[package]] name = "myst-parser" version = "2.0.0" @@ -2977,18 +3368,18 @@ testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4, [[package]] name = "nautobot" -version = "2.3.1" +version = "2.3.7" description = "Source of truth and network automation platform." optional = false python-versions = "<3.13,>=3.8" files = [ - {file = "nautobot-2.3.1-py3-none-any.whl", hash = "sha256:28c02e229dcc87d69dba0e75d36c3bd219fefa9328ac996471e9b39f3ec74bb3"}, - {file = "nautobot-2.3.1.tar.gz", hash = "sha256:96a3f0ee9cf73b404abca34bd2ed53a6d4494fcf85338734baa10dcd977f27f7"}, + {file = "nautobot-2.3.7-py3-none-any.whl", hash = "sha256:661388b26801355902a1fb3e22b995fba877828683ae8ebb2cd98d4873b463b5"}, + {file = "nautobot-2.3.7.tar.gz", hash = "sha256:b2e50eba2e49b7dea4e3d414a5b40bbd91aca66e69aeae58ecf7f75303eb86d8"}, ] [package.dependencies] celery = ">=5.3.6,<5.4.0" -Django = ">=4.2.15,<4.3.0" +Django = ">=4.2.16,<4.3.0" django-ajax-tables = ">=1.1.1,<1.2.0" django-celery-beat = ">=2.6.0,<2.7.0" django-celery-results = ">=2.5.1,<2.6.0" @@ -3002,7 +3393,7 @@ django-jinja = ">=2.11.0,<2.12.0" django-prometheus = ">=2.3.1,<2.4.0" django-redis = ">=5.4.0,<5.5.0" django-silk = ">=5.1.0,<5.2.0" -django-structlog = {version = ">=8.1.0,<9.0.0", extras = ["all"]} +django-structlog = {version = ">=8.1.0,<9.0.0", extras = ["celery"]} django-tables2 = ">=2.7.0,<2.8.0" django-taggit = ">=5.0.0,<5.1.0" django-timezone-field = ">=7.0,<7.1" @@ -3017,6 +3408,7 @@ graphene-django = ">=2.16.0,<2.17.0" graphene-django-optimizer = ">=0.8.0,<0.9.0" Jinja2 = ">=3.1.4,<3.2.0" jsonschema = ">=4.7.0,<5.0.0" +kombu = ">=5.4.2,<5.5.0" Markdown = ">=3.6,<3.7" MarkupSafe = ">=2.1.5,<2.2.0" netaddr = ">=1.3.0,<1.4.0" @@ -3027,8 +3419,8 @@ Pillow = ">=10.3.0,<10.4.0" prometheus-client = ">=0.20.0,<0.21.0" psycopg2-binary = ">=2.9.9,<2.10.0" python-slugify = ">=8.0.3,<8.1.0" -pyuwsgi = ">=2.0.23,<2.1.0" -PyYAML = ">=6.0,<6.1" +pyuwsgi = ">=2.0.26,<2.1.0" +PyYAML = ">=6.0.2,<6.1.0" social-auth-app-django = ">=5.4.2,<5.5.0" svgwrite = ">=1.4.2,<1.5.0" @@ -3076,13 +3468,13 @@ nicer-shell = ["ipython"] [[package]] name = "netutils" -version = "1.9.1" +version = "1.10.0" description = "Common helper functions useful in network automation." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "netutils-1.9.1-py3-none-any.whl", hash = "sha256:0d6e9026cc529f365a63377159aed07769baee0bf7a7138fa86fce37b64dd9d4"}, - {file = "netutils-1.9.1.tar.gz", hash = "sha256:8ad8b5e02eb9d6692d0aaaf9c0f36da1a81f520f426a79d0e08e56cf7dbb3476"}, + {file = "netutils-1.10.0-py3-none-any.whl", hash = "sha256:19b8cc3d2cf567a986f916c90f298d241af03a71c62ec6d38d6dc3395347670b"}, + {file = "netutils-1.10.0.tar.gz", hash = "sha256:f457fb85cb622e89aa0403fb2128c50986f7ce38d93a5873981727d088619793"}, ] [package.extras] @@ -3409,13 +3801,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.2.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -3455,117 +3847,219 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] wcwidth = "*" +[[package]] +name = "propcache" +version = "0.2.0" +description = "Accelerated property cache" +optional = true +python-versions = ">=3.8" +files = [ + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b"}, + {file = "propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850"}, + {file = "propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b"}, + {file = "propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336"}, + {file = "propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad"}, + {file = "propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de"}, + {file = "propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4"}, + {file = "propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b"}, + {file = "propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b"}, + {file = "propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1"}, + {file = "propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7"}, + {file = "propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e"}, + {file = "propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23"}, + {file = "propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348"}, + {file = "propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5"}, + {file = "propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763"}, + {file = "propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf"}, + {file = "propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83"}, + {file = "propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544"}, + {file = "propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032"}, + {file = "propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6"}, + {file = "propcache-0.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9"}, + {file = "propcache-0.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7"}, + {file = "propcache-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed"}, + {file = "propcache-0.2.0-cp38-cp38-win32.whl", hash = "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d"}, + {file = "propcache-0.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638"}, + {file = "propcache-0.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12"}, + {file = "propcache-0.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d"}, + {file = "propcache-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798"}, + {file = "propcache-0.2.0-cp39-cp39-win32.whl", hash = "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9"}, + {file = "propcache-0.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df"}, + {file = "propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036"}, + {file = "propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70"}, +] + [[package]] name = "protobuf" -version = "4.25.4" +version = "4.25.5" description = "" optional = true python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.4-cp310-abi3-win32.whl", hash = "sha256:db9fd45183e1a67722cafa5c1da3e85c6492a5383f127c86c4c4aa4845867dc4"}, - {file = "protobuf-4.25.4-cp310-abi3-win_amd64.whl", hash = "sha256:ba3d8504116a921af46499471c63a85260c1a5fc23333154a427a310e015d26d"}, - {file = "protobuf-4.25.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:eecd41bfc0e4b1bd3fa7909ed93dd14dd5567b98c941d6c1ad08fdcab3d6884b"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:4c8a70fdcb995dcf6c8966cfa3a29101916f7225e9afe3ced4395359955d3835"}, - {file = "protobuf-4.25.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:3319e073562e2515c6ddc643eb92ce20809f5d8f10fead3332f71c63be6a7040"}, - {file = "protobuf-4.25.4-cp38-cp38-win32.whl", hash = "sha256:7e372cbbda66a63ebca18f8ffaa6948455dfecc4e9c1029312f6c2edcd86c4e1"}, - {file = "protobuf-4.25.4-cp38-cp38-win_amd64.whl", hash = "sha256:051e97ce9fa6067a4546e75cb14f90cf0232dcb3e3d508c448b8d0e4265b61c1"}, - {file = "protobuf-4.25.4-cp39-cp39-win32.whl", hash = "sha256:90bf6fd378494eb698805bbbe7afe6c5d12c8e17fca817a646cd6a1818c696ca"}, - {file = "protobuf-4.25.4-cp39-cp39-win_amd64.whl", hash = "sha256:ac79a48d6b99dfed2729ccccee547b34a1d3d63289c71cef056653a846a2240f"}, - {file = "protobuf-4.25.4-py3-none-any.whl", hash = "sha256:bfbebc1c8e4793cfd58589acfb8a1026be0003e852b9da7db5a4285bde996978"}, - {file = "protobuf-4.25.4.tar.gz", hash = "sha256:0dc4a62cc4052a036ee2204d26fe4d835c62827c855c8a03f29fe6da146b380d"}, + {file = "protobuf-4.25.5-cp310-abi3-win32.whl", hash = "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8"}, + {file = "protobuf-4.25.5-cp310-abi3-win_amd64.whl", hash = "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea"}, + {file = "protobuf-4.25.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d"}, + {file = "protobuf-4.25.5-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331"}, + {file = "protobuf-4.25.5-cp38-cp38-win32.whl", hash = "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1"}, + {file = "protobuf-4.25.5-cp38-cp38-win_amd64.whl", hash = "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a"}, + {file = "protobuf-4.25.5-cp39-cp39-win32.whl", hash = "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f"}, + {file = "protobuf-4.25.5-cp39-cp39-win_amd64.whl", hash = "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45"}, + {file = "protobuf-4.25.5-py3-none-any.whl", hash = "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41"}, + {file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"}, ] [[package]] name = "psycopg2-binary" -version = "2.9.9" +version = "2.9.10" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "psycopg2-binary-2.9.9.tar.gz", hash = "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win32.whl", hash = "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682"}, - {file = "psycopg2_binary-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"}, - {file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"}, - {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692"}, - {file = "psycopg2_binary-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win32.whl", hash = "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5"}, - {file = "psycopg2_binary-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win32.whl", hash = "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90"}, - {file = "psycopg2_binary-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957"}, + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, ] [[package]] @@ -3641,18 +4135,18 @@ files = [ [[package]] name = "pydantic" -version = "2.8.2" +version = "2.9.2" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, - {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, + {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"}, + {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.20.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.23.4" typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} [package.extras] @@ -3660,100 +4154,100 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.20.1" +version = "2.23.4" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, - {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, - {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, - {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, - {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, - {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, - {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, - {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, - {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, - {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, - {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, - {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, - {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, - {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, - {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, - {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, - {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, - {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, - {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, - {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91"}, - {file = "pydantic_core-2.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598"}, - {file = "pydantic_core-2.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa"}, - {file = "pydantic_core-2.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987"}, - {file = "pydantic_core-2.20.1-cp38-none-win32.whl", hash = "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a"}, - {file = "pydantic_core-2.20.1-cp38-none-win_amd64.whl", hash = "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c"}, - {file = "pydantic_core-2.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006"}, - {file = "pydantic_core-2.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09"}, - {file = "pydantic_core-2.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab"}, - {file = "pydantic_core-2.20.1-cp39-none-win32.whl", hash = "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2"}, - {file = "pydantic_core-2.20.1-cp39-none-win_amd64.whl", hash = "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, - {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a"}, - {file = "pydantic_core-2.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7"}, - {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"}, + {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"}, + {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"}, + {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"}, + {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"}, + {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"}, + {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"}, + {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"}, + {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"}, + {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"}, + {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"}, + {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"}, + {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"}, + {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"}, + {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"}, + {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"}, + {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"}, + {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"}, + {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"}, + {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"}, + {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"}, + {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"}, + {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"}, + {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"}, + {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"}, + {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"}, + {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"}, + {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"}, + {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"}, + {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"}, + {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"}, + {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"}, + {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"}, + {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"}, ] [package.dependencies] @@ -3783,13 +4277,13 @@ semver = ["semver (>=3.0.2)"] [[package]] name = "pydantic-settings" -version = "2.4.0" +version = "2.6.0" description = "Settings management using Pydantic" optional = true python-versions = ">=3.8" files = [ - {file = "pydantic_settings-2.4.0-py3-none-any.whl", hash = "sha256:bb6849dc067f1687574c12a639e231f3a6feeed0a12d710c1382045c5db1c315"}, - {file = "pydantic_settings-2.4.0.tar.gz", hash = "sha256:ed81c3a0f46392b4d7c0a565c05884e6e54b3456e6f0fe4d8814981172dc9a88"}, + {file = "pydantic_settings-2.6.0-py3-none-any.whl", hash = "sha256:4a819166f119b74d7f8c765196b165f95cc7487ce58ea27dec8a5a26be0970e0"}, + {file = "pydantic_settings-2.6.0.tar.gz", hash = "sha256:44a1804abffac9e6a30372bb45f6cafab945ef5af25e66b1c634c01dd39e0188"}, ] [package.dependencies] @@ -3912,13 +4406,13 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.9" +version = "10.11.2" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, - {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, + {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"}, + {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"}, ] [package.dependencies] @@ -4062,13 +4556,13 @@ postgresql = ["psycopg2"] [[package]] name = "pytz" -version = "2024.1" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -4205,21 +4699,21 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.8" +version = "5.1.1" description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "redis-5.0.8-py3-none-any.whl", hash = "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4"}, - {file = "redis-5.0.8.tar.gz", hash = "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870"}, + {file = "redis-5.1.1-py3-none-any.whl", hash = "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24"}, + {file = "redis-5.1.1.tar.gz", hash = "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72"}, ] [package.dependencies] async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] -hiredis = ["hiredis (>1.0.0)"] -ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] [[package]] name = "referencing" @@ -4238,90 +4732,105 @@ rpds-py = ">=0.7.0" [[package]] name = "regex" -version = "2024.7.24" +version = "2024.9.11" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.8" files = [ - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024"}, - {file = "regex-2024.7.24-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5"}, - {file = "regex-2024.7.24-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce"}, - {file = "regex-2024.7.24-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa"}, - {file = "regex-2024.7.24-cp310-cp310-win32.whl", hash = "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66"}, - {file = "regex-2024.7.24-cp310-cp310-win_amd64.whl", hash = "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b"}, - {file = "regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51"}, - {file = "regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1"}, - {file = "regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e"}, - {file = "regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c"}, - {file = "regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad"}, - {file = "regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440"}, - {file = "regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94"}, - {file = "regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38"}, - {file = "regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc"}, - {file = "regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b"}, - {file = "regex-2024.7.24-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b"}, - {file = "regex-2024.7.24-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169"}, - {file = "regex-2024.7.24-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8"}, - {file = "regex-2024.7.24-cp38-cp38-win32.whl", hash = "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96"}, - {file = "regex-2024.7.24-cp38-cp38-win_amd64.whl", hash = "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d"}, - {file = "regex-2024.7.24-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be"}, - {file = "regex-2024.7.24-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759"}, - {file = "regex-2024.7.24-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9"}, - {file = "regex-2024.7.24-cp39-cp39-win32.whl", hash = "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1"}, - {file = "regex-2024.7.24-cp39-cp39-win_amd64.whl", hash = "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9"}, - {file = "regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d"}, + {file = "regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8"}, + {file = "regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca"}, + {file = "regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a"}, + {file = "regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0"}, + {file = "regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268"}, + {file = "regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50"}, + {file = "regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96"}, + {file = "regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1"}, + {file = "regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9"}, + {file = "regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231"}, + {file = "regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a"}, + {file = "regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a"}, + {file = "regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a"}, + {file = "regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776"}, + {file = "regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36"}, + {file = "regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6"}, + {file = "regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554"}, + {file = "regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8"}, + {file = "regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8"}, + {file = "regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e"}, + {file = "regex-2024.9.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4"}, + {file = "regex-2024.9.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c"}, + {file = "regex-2024.9.11-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd"}, + {file = "regex-2024.9.11-cp38-cp38-win32.whl", hash = "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771"}, + {file = "regex-2024.9.11-cp38-cp38-win_amd64.whl", hash = "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62"}, + {file = "regex-2024.9.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9"}, + {file = "regex-2024.9.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89"}, + {file = "regex-2024.9.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35"}, + {file = "regex-2024.9.11-cp39-cp39-win32.whl", hash = "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142"}, + {file = "regex-2024.9.11-cp39-cp39-win_amd64.whl", hash = "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919"}, + {file = "regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd"}, ] [[package]] @@ -4580,17 +5089,19 @@ files = [ [[package]] name = "setuptools" -version = "73.0.1" +version = "75.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-73.0.1-py3-none-any.whl", hash = "sha256:b208925fcb9f7af924ed2dc04708ea89791e24bde0d3020b27df0e116088b34e"}, - {file = "setuptools-73.0.1.tar.gz", hash = "sha256:d59a3e788ab7e012ab2c4baed1b376da6366883ee20d7a5fc426816e3d7b1193"}, + {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"}, + {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] @@ -4918,13 +5429,13 @@ files = [ [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, + {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, ] [[package]] @@ -4988,13 +5499,13 @@ files = [ [[package]] name = "tzdata" -version = "2024.1" +version = "2024.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"}, + {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"}, ] [[package]] @@ -5010,13 +5521,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -5205,15 +5716,127 @@ pyyaml = "*" [package.extras] dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] +[[package]] +name = "yarl" +version = "1.15.2" +description = "Yet another URL library" +optional = true +python-versions = ">=3.8" +files = [ + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4ee8b8639070ff246ad3649294336b06db37a94bdea0d09ea491603e0be73b8"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a7cf963a357c5f00cb55b1955df8bbe68d2f2f65de065160a1c26b85a1e44172"}, + {file = "yarl-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:43ebdcc120e2ca679dba01a779333a8ea76b50547b55e812b8b92818d604662c"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3433da95b51a75692dcf6cc8117a31410447c75a9a8187888f02ad45c0a86c50"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38d0124fa992dbacd0c48b1b755d3ee0a9f924f427f95b0ef376556a24debf01"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ded1b1803151dd0f20a8945508786d57c2f97a50289b16f2629f85433e546d47"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ace4cad790f3bf872c082366c9edd7f8f8f77afe3992b134cfc810332206884f"}, + {file = "yarl-1.15.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c77494a2f2282d9bbbbcab7c227a4d1b4bb829875c96251f66fb5f3bae4fb053"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b7f227ca6db5a9fda0a2b935a2ea34a7267589ffc63c8045f0e4edb8d8dcf956"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:31561a5b4d8dbef1559b3600b045607cf804bae040f64b5f5bca77da38084a8a"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3e52474256a7db9dcf3c5f4ca0b300fdea6c21cca0148c8891d03a025649d935"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1af74a9529a1137c67c887ed9cde62cff53aa4d84a3adbec329f9ec47a3936"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:15c87339490100c63472a76d87fe7097a0835c705eb5ae79fd96e343473629ed"}, + {file = "yarl-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:74abb8709ea54cc483c4fb57fb17bb66f8e0f04438cff6ded322074dbd17c7ec"}, + {file = "yarl-1.15.2-cp310-cp310-win32.whl", hash = "sha256:ffd591e22b22f9cb48e472529db6a47203c41c2c5911ff0a52e85723196c0d75"}, + {file = "yarl-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:1695497bb2a02a6de60064c9f077a4ae9c25c73624e0d43e3aa9d16d983073c2"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9fcda20b2de7042cc35cf911702fa3d8311bd40055a14446c1e62403684afdc5"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0545de8c688fbbf3088f9e8b801157923be4bf8e7b03e97c2ecd4dfa39e48e0e"}, + {file = "yarl-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbda058a9a68bec347962595f50546a8a4a34fd7b0654a7b9697917dc2bf810d"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ac2bc069f4a458634c26b101c2341b18da85cb96afe0015990507efec2e417"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd126498171f752dd85737ab1544329a4520c53eed3997f9b08aefbafb1cc53b"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db817b4e95eb05c362e3b45dafe7144b18603e1211f4a5b36eb9522ecc62bcf"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:076b1ed2ac819933895b1a000904f62d615fe4533a5cf3e052ff9a1da560575c"}, + {file = "yarl-1.15.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8cfd847e6b9ecf9f2f2531c8427035f291ec286c0a4944b0a9fce58c6446046"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:32b66be100ac5739065496c74c4b7f3015cef792c3174982809274d7e51b3e04"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:34a2d76a1984cac04ff8b1bfc939ec9dc0914821264d4a9c8fd0ed6aa8d4cfd2"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0afad2cd484908f472c8fe2e8ef499facee54a0a6978be0e0cff67b1254fd747"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c68e820879ff39992c7f148113b46efcd6ec765a4865581f2902b3c43a5f4bbb"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:98f68df80ec6ca3015186b2677c208c096d646ef37bbf8b49764ab4a38183931"}, + {file = "yarl-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56ec1eacd0a5d35b8a29f468659c47f4fe61b2cab948ca756c39b7617f0aa5"}, + {file = "yarl-1.15.2-cp311-cp311-win32.whl", hash = "sha256:eedc3f247ee7b3808ea07205f3e7d7879bc19ad3e6222195cd5fbf9988853e4d"}, + {file = "yarl-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:0ccaa1bc98751fbfcf53dc8dfdb90d96e98838010fc254180dd6707a6e8bb179"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:82d5161e8cb8f36ec778fd7ac4d740415d84030f5b9ef8fe4da54784a1f46c94"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fa2bea05ff0a8fb4d8124498e00e02398f06d23cdadd0fe027d84a3f7afde31e"}, + {file = "yarl-1.15.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99e12d2bf587b44deb74e0d6170fec37adb489964dbca656ec41a7cd8f2ff178"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:243fbbbf003754fe41b5bdf10ce1e7f80bcc70732b5b54222c124d6b4c2ab31c"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b7f1a7b98a8c31823285786bd566cf06226ac4f38b3ef462f593c608a9bd6"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:553dad9af802a9ad1a6525e7528152a015b85fb8dbf764ebfc755c695f488367"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c3ff305f6e06650a761c4393666f77384f1cc6c5c0251965d6bfa5fbc88f7f"}, + {file = "yarl-1.15.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:353665775be69bbfc6d54c8d134bfc533e332149faeddd631b0bc79df0897f46"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f4fe99ce44128c71233d0d72152db31ca119711dfc5f2c82385ad611d8d7f897"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c1e3ff4b89cdd2e1a24c214f141e848b9e0451f08d7d4963cb4108d4d798f1f"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:711bdfae4e699a6d4f371137cbe9e740dc958530cb920eb6f43ff9551e17cfbc"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4388c72174868884f76affcdd3656544c426407e0043c89b684d22fb265e04a5"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0e1844ad47c7bd5d6fa784f1d4accc5f4168b48999303a868fe0f8597bde715"}, + {file = "yarl-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a5cafb02cf097a82d74403f7e0b6b9df3ffbfe8edf9415ea816314711764a27b"}, + {file = "yarl-1.15.2-cp312-cp312-win32.whl", hash = "sha256:156ececdf636143f508770bf8a3a0498de64da5abd890c7dbb42ca9e3b6c05b8"}, + {file = "yarl-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:435aca062444a7f0c884861d2e3ea79883bd1cd19d0a381928b69ae1b85bc51d"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:416f2e3beaeae81e2f7a45dc711258be5bdc79c940a9a270b266c0bec038fb84"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:173563f3696124372831007e3d4b9821746964a95968628f7075d9231ac6bb33"}, + {file = "yarl-1.15.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ce2e0f6123a60bd1a7f5ae3b2c49b240c12c132847f17aa990b841a417598a2"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eaea112aed589131f73d50d570a6864728bd7c0c66ef6c9154ed7b59f24da611"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4ca3b9f370f218cc2a0309542cab8d0acdfd66667e7c37d04d617012485f904"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23ec1d3c31882b2a8a69c801ef58ebf7bae2553211ebbddf04235be275a38548"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75119badf45f7183e10e348edff5a76a94dc19ba9287d94001ff05e81475967b"}, + {file = "yarl-1.15.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78e6fdc976ec966b99e4daa3812fac0274cc28cd2b24b0d92462e2e5ef90d368"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8657d3f37f781d987037f9cc20bbc8b40425fa14380c87da0cb8dfce7c92d0fb"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:93bed8a8084544c6efe8856c362af08a23e959340c87a95687fdbe9c9f280c8b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:69d5856d526802cbda768d3e6246cd0d77450fa2a4bc2ea0ea14f0d972c2894b"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ccad2800dfdff34392448c4bf834be124f10a5bc102f254521d931c1c53c455a"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a880372e2e5dbb9258a4e8ff43f13888039abb9dd6d515f28611c54361bc5644"}, + {file = "yarl-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c998d0558805860503bc3a595994895ca0f7835e00668dadc673bbf7f5fbfcbe"}, + {file = "yarl-1.15.2-cp313-cp313-win32.whl", hash = "sha256:533a28754e7f7439f217550a497bb026c54072dbe16402b183fdbca2431935a9"}, + {file = "yarl-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:5838f2b79dc8f96fdc44077c9e4e2e33d7089b10788464609df788eb97d03aad"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fbbb63bed5fcd70cd3dd23a087cd78e4675fb5a2963b8af53f945cbbca79ae16"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e2e93b88ecc8f74074012e18d679fb2e9c746f2a56f79cd5e2b1afcf2a8a786b"}, + {file = "yarl-1.15.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af8ff8d7dc07ce873f643de6dfbcd45dc3db2c87462e5c387267197f59e6d776"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66f629632220a4e7858b58e4857927dd01a850a4cef2fb4044c8662787165cf7"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:833547179c31f9bec39b49601d282d6f0ea1633620701288934c5f66d88c3e50"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2aa738e0282be54eede1e3f36b81f1e46aee7ec7602aa563e81e0e8d7b67963f"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a13a07532e8e1c4a5a3afff0ca4553da23409fad65def1b71186fb867eeae8d"}, + {file = "yarl-1.15.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c45817e3e6972109d1a2c65091504a537e257bc3c885b4e78a95baa96df6a3f8"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:670eb11325ed3a6209339974b276811867defe52f4188fe18dc49855774fa9cf"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:d417a4f6943112fae3924bae2af7112562285848d9bcee737fc4ff7cbd450e6c"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bc8936d06cd53fddd4892677d65e98af514c8d78c79864f418bbf78a4a2edde4"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:954dde77c404084c2544e572f342aef384240b3e434e06cecc71597e95fd1ce7"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5bc0df728e4def5e15a754521e8882ba5a5121bd6b5a3a0ff7efda5d6558ab3d"}, + {file = "yarl-1.15.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b71862a652f50babab4a43a487f157d26b464b1dedbcc0afda02fd64f3809d04"}, + {file = "yarl-1.15.2-cp38-cp38-win32.whl", hash = "sha256:63eab904f8630aed5a68f2d0aeab565dcfc595dc1bf0b91b71d9ddd43dea3aea"}, + {file = "yarl-1.15.2-cp38-cp38-win_amd64.whl", hash = "sha256:2cf441c4b6e538ba0d2591574f95d3fdd33f1efafa864faa077d9636ecc0c4e9"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a32d58f4b521bb98b2c0aa9da407f8bd57ca81f34362bcb090e4a79e9924fefc"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:766dcc00b943c089349d4060b935c76281f6be225e39994c2ccec3a2a36ad627"}, + {file = "yarl-1.15.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bed1b5dbf90bad3bfc19439258c97873eab453c71d8b6869c136346acfe497e7"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed20a4bdc635f36cb19e630bfc644181dd075839b6fc84cac51c0f381ac472e2"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d538df442c0d9665664ab6dd5fccd0110fa3b364914f9c85b3ef9b7b2e157980"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c6cf1d92edf936ceedc7afa61b07e9d78a27b15244aa46bbcd534c7458ee1b"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce44217ad99ffad8027d2fde0269ae368c86db66ea0571c62a000798d69401fb"}, + {file = "yarl-1.15.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47a6000a7e833ebfe5886b56a31cb2ff12120b1efd4578a6fcc38df16cc77bd"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e52f77a0cd246086afde8815039f3e16f8d2be51786c0a39b57104c563c5cbb0"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:f9ca0e6ce7774dc7830dc0cc4bb6b3eec769db667f230e7c770a628c1aa5681b"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:136f9db0f53c0206db38b8cd0c985c78ded5fd596c9a86ce5c0b92afb91c3a19"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:173866d9f7409c0fb514cf6e78952e65816600cb888c68b37b41147349fe0057"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:6e840553c9c494a35e449a987ca2c4f8372668ee954a03a9a9685075228e5036"}, + {file = "yarl-1.15.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:458c0c65802d816a6b955cf3603186de79e8fdb46d4f19abaec4ef0a906f50a7"}, + {file = "yarl-1.15.2-cp39-cp39-win32.whl", hash = "sha256:5b48388ded01f6f2429a8c55012bdbd1c2a0c3735b3e73e221649e524c34a58d"}, + {file = "yarl-1.15.2-cp39-cp39-win_amd64.whl", hash = "sha256:81dadafb3aa124f86dc267a2168f71bbd2bfb163663661ab0038f6e4b8edb810"}, + {file = "yarl-1.15.2-py3-none-any.whl", hash = "sha256:0d3105efab7c5c091609abacad33afff33bdff0035bece164c98bcf5a85ef90a"}, + {file = "yarl-1.15.2.tar.gz", hash = "sha256:a39c36f4218a5bb668b4f06874d676d35a035ee668e6e7e3538835c703634b84"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" +propcache = ">=0.2.0" + [[package]] name = "zipp" -version = "3.20.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, - {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] @@ -5222,12 +5845,13 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [extras] aci = ["PyYAML"] -all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnacentersdk", "dnspython", "ijson", "ipfabric", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] +all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnacentersdk", "dnspython", "ijson", "ipfabric", "meraki", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] aristacv = ["cloudvision", "cvprac"] device42 = ["requests"] dna-center = ["dnacentersdk", "netutils"] infoblox = ["dnspython"] ipfabric = ["httpx", "ipfabric", "netutils"] +meraki = ["meraki"] nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt"] pysnow = ["ijson", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] servicenow = ["Jinja2", "PyYAML", "ijson", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] @@ -5235,4 +5859,4 @@ servicenow = ["Jinja2", "PyYAML", "ijson", "oauthlib", "python-magic", "pytz", " [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.13" -content-hash = "8d8defc6b94cfb1d178aef14dcbd58036a360933fc6e50de9bfdf58ab9124138" +content-hash = "f2319b7b5319197b7b329fa8325e1fdda18528d29a346e625b307fef97622706" diff --git a/pyproject.toml b/pyproject.toml index 26602caa..ab297092 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,6 +55,7 @@ httpx = { version = ">=0.23.3", optional = true } retry = "^0.9.2" # used for DNA Center integration dnacentersdk = { version = "^2.5.6", optional = true } +meraki = { version = "^1.37.2,<1.46.0", optional = true } [tool.poetry.group.dev.dependencies] coverage = "*" @@ -118,6 +119,7 @@ all = [ "requests-oauthlib", "six", "dnacentersdk", + "meraki" ] aristacv = [ "cloudvision", @@ -138,6 +140,9 @@ ipfabric = [ "ipfabric", "netutils", ] +meraki = [ + "meraki", +] # pysnow = "^0.7.17" # PySNow is currently pinned to an older version of pytz as a dependency, which blocks compatibility with newer # versions of Nautobot. See https://github.com/rbw/pysnow/pull/186