diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84faccf09..9c8a11bbc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: fail-fast: true matrix: python-version: ["3.11"] - nautobot-version: ["2.1.0"] + nautobot-version: ["2.2.1"] env: INVOKE_NAUTOBOT_SSOT_PYTHON_VER: "${{ matrix.python-version }}" INVOKE_NAUTOBOT_SSOT_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" @@ -152,7 +152,7 @@ jobs: include: - python-version: "3.11" db-backend: "postgresql" - nautobot-version: "2.1.0" + nautobot-version: "2.2.1" - python-version: "3.11" db-backend: "mysql" nautobot-version: "stable" diff --git a/changes/431.fixed b/changes/431.fixed deleted file mode 100644 index 0000644b4..000000000 --- a/changes/431.fixed +++ /dev/null @@ -1 +0,0 @@ -Updated note on nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py IPFabricDiffSync from Nautobot to IPFabric. \ No newline at end of file diff --git a/changes/435.fixed b/changes/435.fixed deleted file mode 100644 index 4d32ea7b2..000000000 --- a/changes/435.fixed +++ /dev/null @@ -1 +0,0 @@ -Fixed handling of DLM App installed but not enabled throwing RuntimeError. diff --git a/development/app_config_schema.py b/development/app_config_schema.py index 47009954f..a779b14ef 100644 --- a/development/app_config_schema.py +++ b/development/app_config_schema.py @@ -1,4 +1,5 @@ """App Config Schema Generator and Validator.""" + import json from importlib import import_module from os import getenv diff --git a/development/nautobot_config.py b/development/nautobot_config.py index d11d9be0f..75d154a41 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -1,4 +1,5 @@ """Nautobot development configuration file.""" + import os import sys @@ -193,6 +194,7 @@ "enable_aci": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ACI")), "enable_aristacv": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_ARISTACV")), "enable_device42": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DEVICE42")), + "enable_dna_center": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_DNA_CENTER")), "enable_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_INFOBLOX")), "enable_ipfabric": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_IPFABRIC")), "enable_servicenow": is_truthy(os.getenv("NAUTOBOT_SSOT_ENABLE_SERVICENOW")), @@ -213,6 +215,10 @@ "device42_role_prepend": "", "device42_ignore_tag": "", "device42_hostname_mapping": [], + "dna_center_import_global": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_IMPORT_GLOBAL", True)), + "dna_center_import_merakis": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_IMPORT_MERAKIS", False)), + "dna_center_update_locations": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_UPDATE_LOCATIONS", True)), + "dna_center_show_failures": is_truthy(os.getenv("NAUTOBOT_DNAC_SSOT_DNA_CENTER_SHOW_FAILURES", True)), "infoblox_default_status": os.getenv("NAUTOBOT_SSOT_INFOBLOX_DEFAULT_STATUS", "active"), "infoblox_enable_sync_to_infoblox": is_truthy(os.getenv("NAUTOBOT_SSOT_INFOBLOX_ENABLE_SYNC_TO_INFOBLOX")), "infoblox_import_objects_ip_addresses": is_truthy( diff --git a/docs/admin/release_notes/version_2.6.md b/docs/admin/release_notes/version_2.6.md index 2f7cc8b84..a7ead5c67 100644 --- a/docs/admin/release_notes/version_2.6.md +++ b/docs/admin/release_notes/version_2.6.md @@ -23,3 +23,26 @@ - [#418](https://github.com/nautobot/nautobot-app-ssot/issues/418) - Unpins multiple dependencies. - [#421](https://github.com/nautobot/nautobot-app-ssot/issues/421) - Opened prometheus-client dependency range and removed direct drf-spectacular dependency. + +## [v2.6.1 (2024-04-29)](https://github.com/nautobot/nautobot-app-ssot/releases/tag/v2.6.1) + +### Added + +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Added additional unit tests for Device42 integration. + +### Changed + +- [#437](https://github.com/nautobot/nautobot-app-ssot/issues/437) - Improved performance of the Infoblox client by using `requests.Session` for API calls instead of `requests.request`. + +### Fixed + +- [#435](https://github.com/nautobot/nautobot-app-ssot/issues/435) - Fixed handling of DLM App installed but not enabled throwing RuntimeError. +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Fixed IPAddress attribute to be ip_version. +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Fixed IPAddress Status incorrectly being set to Reserved when the status in Device42 showed as "available". +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Fixed multiple bugs when assigning IPAddresses to Interfaces. +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Fixed check for Building definiton when creating a VLAN. +- [#436](https://github.com/nautobot/nautobot-app-ssot/issues/436) - Fixed VLAN to use location instead of location_id in create(). + +### Housekeeping + +- [#431](https://github.com/nautobot/nautobot-app-ssot/issues/431) - Updated note on nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py IPFabricDiffSync from Nautobot to IPFabric. diff --git a/nautobot_ssot/__init__.py b/nautobot_ssot/__init__.py index 27bc4bc1c..1494f8f78 100644 --- a/nautobot_ssot/__init__.py +++ b/nautobot_ssot/__init__.py @@ -1,4 +1,5 @@ """App declaration for nautobot_ssot.""" + import os from importlib import metadata @@ -16,6 +17,7 @@ "nautobot_ssot_aci", "nautobot_ssot_aristacv", "nautobot_ssot_device42", + "nautobot_ssot_dna_center", "nautobot_ssot_infoblox", "nautobot_ssot_ipfabric", "nautobot_ssot_servicenow", diff --git a/nautobot_ssot/contrib/__init__.py b/nautobot_ssot/contrib/__init__.py index 5877c9a50..6e7f6b275 100644 --- a/nautobot_ssot/contrib/__init__.py +++ b/nautobot_ssot/contrib/__init__.py @@ -1,4 +1,5 @@ """SSoT Contrib.""" + from nautobot_ssot.contrib.adapter import NautobotAdapter from nautobot_ssot.contrib.model import NautobotModel from nautobot_ssot.contrib.types import ( diff --git a/nautobot_ssot/contrib/types.py b/nautobot_ssot/contrib/types.py index 52cc87e1f..36d2cbc8e 100644 --- a/nautobot_ssot/contrib/types.py +++ b/nautobot_ssot/contrib/types.py @@ -1,4 +1,5 @@ """Contrib type classes for interfacing with Nautobot in SSoT.""" + # pylint: disable=protected-access # Diffsync relies on underscore-prefixed attributes quite heavily, which is why we disable this here. diff --git a/nautobot_ssot/integrations/aci/constant.py b/nautobot_ssot/integrations/aci/constant.py index 2edec9830..ec1591c77 100644 --- a/nautobot_ssot/integrations/aci/constant.py +++ b/nautobot_ssot/integrations/aci/constant.py @@ -1,4 +1,5 @@ """Constants for use with the ACI SSoT app.""" + from django.conf import settings diff --git a/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py b/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py index 87bc42cb3..9ea0ae0ad 100644 --- a/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py +++ b/nautobot_ssot/integrations/aci/diffsync/adapters/aci.py @@ -1,4 +1,5 @@ """DiffSync Adapter for Cisco ACI.""" # pylint: disable=too-many-lines, too-many-instance-attributes, too-many-arguments + # pylint: disable=duplicate-code diff --git a/nautobot_ssot/integrations/aci/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/aci/diffsync/adapters/nautobot.py index a07cee8b8..d3cf370c6 100644 --- a/nautobot_ssot/integrations/aci/diffsync/adapters/nautobot.py +++ b/nautobot_ssot/integrations/aci/diffsync/adapters/nautobot.py @@ -1,4 +1,5 @@ """DiffSync Adapter for Nautobot.""" + # pylint: disable=duplicate-code import logging diff --git a/nautobot_ssot/integrations/aci/diffsync/client.py b/nautobot_ssot/integrations/aci/diffsync/client.py index 3538a8544..9cd94fc2b 100644 --- a/nautobot_ssot/integrations/aci/diffsync/client.py +++ b/nautobot_ssot/integrations/aci/diffsync/client.py @@ -1,4 +1,5 @@ """All interactions with ACI.""" # pylint: disable=too-many-lines, too-many-instance-attributes, too-many-arguments + # pylint: disable=invalid-name import sys diff --git a/nautobot_ssot/integrations/aci/diffsync/models/__init__.py b/nautobot_ssot/integrations/aci/diffsync/models/__init__.py index 6bad5d6c8..f93410bf8 100644 --- a/nautobot_ssot/integrations/aci/diffsync/models/__init__.py +++ b/nautobot_ssot/integrations/aci/diffsync/models/__init__.py @@ -1,4 +1,5 @@ """Initialize models for Nautobot and ACI.""" + from .nautobot import ( NautobotTenant, NautobotVrf, diff --git a/nautobot_ssot/integrations/aci/diffsync/models/base.py b/nautobot_ssot/integrations/aci/diffsync/models/base.py index 258f474cb..14c271167 100644 --- a/nautobot_ssot/integrations/aci/diffsync/models/base.py +++ b/nautobot_ssot/integrations/aci/diffsync/models/base.py @@ -1,4 +1,5 @@ """Base Shared Models for Cisco ACI integration with SSoT app.""" + from typing import List, Optional from diffsync import DiffSyncModel diff --git a/nautobot_ssot/integrations/aci/diffsync/utils.py b/nautobot_ssot/integrations/aci/diffsync/utils.py index d288f1c75..3f3bbe2e2 100644 --- a/nautobot_ssot/integrations/aci/diffsync/utils.py +++ b/nautobot_ssot/integrations/aci/diffsync/utils.py @@ -1,4 +1,5 @@ """ACI Utilities.""" + # pylint: disable=invalid-name import logging import re diff --git a/nautobot_ssot/integrations/aci/jobs.py b/nautobot_ssot/integrations/aci/jobs.py index 3b68984b9..b013544df 100644 --- a/nautobot_ssot/integrations/aci/jobs.py +++ b/nautobot_ssot/integrations/aci/jobs.py @@ -1,4 +1,5 @@ """Jobs for ACI SSoT app.""" + from django.templatetags.static import static from django.urls import reverse from diffsync import DiffSyncFlags diff --git a/nautobot_ssot/integrations/aci/signals.py b/nautobot_ssot/integrations/aci/signals.py index b53cae1ee..a29bf8333 100644 --- a/nautobot_ssot/integrations/aci/signals.py +++ b/nautobot_ssot/integrations/aci/signals.py @@ -1,4 +1,5 @@ """Signals for ACI integration.""" + # pylint: disable=logging-fstring-interpolation, invalid-name import logging import random diff --git a/nautobot_ssot/integrations/aristacv/diffsync/adapters/cloudvision.py b/nautobot_ssot/integrations/aristacv/diffsync/adapters/cloudvision.py index 074772bae..a79aea7ab 100644 --- a/nautobot_ssot/integrations/aristacv/diffsync/adapters/cloudvision.py +++ b/nautobot_ssot/integrations/aristacv/diffsync/adapters/cloudvision.py @@ -1,4 +1,5 @@ """DiffSync adapter for Arista CloudVision.""" + import distutils import ipaddress import re diff --git a/nautobot_ssot/integrations/aristacv/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/aristacv/diffsync/adapters/nautobot.py index 5e994a549..87c8aaee3 100644 --- a/nautobot_ssot/integrations/aristacv/diffsync/adapters/nautobot.py +++ b/nautobot_ssot/integrations/aristacv/diffsync/adapters/nautobot.py @@ -1,4 +1,5 @@ """DiffSync adapter for Nautobot.""" + from collections import defaultdict from django.contrib.contenttypes.models import ContentType from django.db.models import ProtectedError diff --git a/nautobot_ssot/integrations/aristacv/diffsync/models/base.py b/nautobot_ssot/integrations/aristacv/diffsync/models/base.py index 89028522b..3bbfed50c 100644 --- a/nautobot_ssot/integrations/aristacv/diffsync/models/base.py +++ b/nautobot_ssot/integrations/aristacv/diffsync/models/base.py @@ -1,4 +1,5 @@ """DiffSyncModel subclasses for Nautobot-to-AristaCV data sync.""" + from uuid import UUID from diffsync import DiffSyncModel from typing import List, Optional diff --git a/nautobot_ssot/integrations/aristacv/diffsync/models/cloudvision.py b/nautobot_ssot/integrations/aristacv/diffsync/models/cloudvision.py index 5763c2556..76988dc4b 100644 --- a/nautobot_ssot/integrations/aristacv/diffsync/models/cloudvision.py +++ b/nautobot_ssot/integrations/aristacv/diffsync/models/cloudvision.py @@ -1,4 +1,5 @@ """CloudVision DiffSync models for AristaCV SSoT.""" + from nautobot_ssot.integrations.aristacv.diffsync.models.base import ( Device, CustomField, diff --git a/nautobot_ssot/integrations/aristacv/utils/cloudvision.py b/nautobot_ssot/integrations/aristacv/utils/cloudvision.py index 3dfff318c..5b4eb250f 100644 --- a/nautobot_ssot/integrations/aristacv/utils/cloudvision.py +++ b/nautobot_ssot/integrations/aristacv/utils/cloudvision.py @@ -665,9 +665,11 @@ def get_ip_interfaces(client: CloudvisionApi, dId: str): ip_intfs.append( { "interface": results["intfId"], - "address": results["addrWithMask"] - if results["addrWithMask"] != "0.0.0.0/0" - else results.get("virtualAddrWithMask"), + "address": ( + results["addrWithMask"] + if results["addrWithMask"] != "0.0.0.0/0" + else results.get("virtualAddrWithMask") + ), } ) return ip_intfs diff --git a/nautobot_ssot/integrations/device42/diffsync/adapters/device42.py b/nautobot_ssot/integrations/device42/diffsync/adapters/device42.py index faf4c93d5..89ea3d1ad 100644 --- a/nautobot_ssot/integrations/device42/diffsync/adapters/device42.py +++ b/nautobot_ssot/integrations/device42/diffsync/adapters/device42.py @@ -468,18 +468,26 @@ def load_vendor_and_model(self, hwmodel_name: str, manuf: str): hwmodel = self.hardware( name=hwmodel_name, manufacturer=manuf, - size=float(round(self.d42_hardware_map[hwmodel_name]["size"])) - if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("size") - else 1.0, - depth=self.d42_hardware_map[hwmodel_name]["depth"] - if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("depth") - else "Half Depth", - part_number=self.d42_hardware_map[hwmodel_name]["part_no"] - if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("part_no") - else "", - custom_fields=get_custom_field_dict(self.d42_hardware_map[hwmodel_name]["custom_fields"]) - if self.d42_hardware_map.get(hwmodel_name) - else {}, + size=( + float(round(self.d42_hardware_map[hwmodel_name]["size"])) + if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("size") + else 1.0 + ), + depth=( + self.d42_hardware_map[hwmodel_name]["depth"] + if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("depth") + else "Half Depth" + ), + part_number=( + self.d42_hardware_map[hwmodel_name]["part_no"] + if self.d42_hardware_map.get(hwmodel_name) and self.d42_hardware_map[hwmodel_name].get("part_no") + else "" + ), + custom_fields=( + get_custom_field_dict(self.d42_hardware_map[hwmodel_name]["custom_fields"]) + if self.d42_hardware_map.get(hwmodel_name) + else {} + ), uuid=None, ) self.add(hwmodel) @@ -762,9 +770,11 @@ def load_connections(self): continue try: new_conn = self.conn( - src_device=self.d42_device_map[_conn["second_src_device"]]["name"] - if _conn.get("second_src_device") - else self.d42_device_map[_conn["src_device"]]["name"], + src_device=( + self.d42_device_map[_conn["second_src_device"]]["name"] + if _conn.get("second_src_device") + else self.d42_device_map[_conn["src_device"]]["name"] + ), src_port=self.d42_port_map[_conn["src_port"]]["port"], src_port_mac=self.d42_port_map[_conn["src_port"]]["hwaddress"], src_type="interface", @@ -839,9 +849,11 @@ def load_providers_and_circuits(self): a_side_conn = self.conn( src_device=origin_dev, src_port=origin_int, - src_port_mac=self.d42_port_map[_tc["origin_netport_fk"]]["hwaddress"] - if _tc["origin_type"] == "Device" - else None, + src_port_mac=( + self.d42_port_map[_tc["origin_netport_fk"]]["hwaddress"] + if _tc["origin_type"] == "Device" + else None + ), src_type="interface" if _tc["origin_type"] == "Device Port" else "patch panel", dst_device=_tc["circuit_id"], dst_port=_tc["circuit_id"], @@ -859,9 +871,11 @@ def load_providers_and_circuits(self): src_type="circuit", dst_device=endpoint_dev, dst_port=endpoint_int, - dst_port_mac=self.d42_port_map[_tc["end_point_netport_fk"]]["hwaddress"] - if _tc["end_point_type"] == "Device" - else None, + dst_port_mac=( + self.d42_port_map[_tc["end_point_netport_fk"]]["hwaddress"] + if _tc["end_point_type"] == "Device" + else None + ), dst_type="interface" if _tc["end_point_type"] == "Device Port" else "patch panel", src_port_mac=None, tags=None, diff --git a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/assets.py b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/assets.py index eee36fd0e..37f27620a 100644 --- a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/assets.py +++ b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/assets.py @@ -76,7 +76,7 @@ def create(cls, diffsync, ids, attrs): try: patch_panel.validated_save() diffsync.device_map[ids["name"]] = patch_panel.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) except ValidationError as err: if diffsync.job.debug: diffsync.job.logger.warning(f"Unable to create {ids['name']} patch panel. {err}") @@ -165,7 +165,7 @@ def create(cls, diffsync, ids, attrs): if ids["patchpanel"] not in diffsync.rp_map: diffsync.rp_map[ids["patchpanel"]] = {} diffsync.rp_map[ids["patchpanel"]][ids["name"]] = rear_port.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) except ValidationError as err: if diffsync.job.debug: diffsync.job.logger.debug(f"Unable to create patch panel {ids['name']}. {err}") @@ -216,7 +216,7 @@ def create(cls, diffsync, ids, attrs): if ids["patchpanel"] not in diffsync.fp_map: diffsync.fp_map[ids["patchpanel"]] = {} diffsync.fp_map[ids["patchpanel"]][ids["name"]] = front_port.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) except ValidationError as err: diffsync.job.logger.debug(f"Unable to create patch panel front port {ids['name']}. {err}") return None diff --git a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/circuits.py b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/circuits.py index 6746fec1a..eaaad12ed 100644 --- a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/circuits.py +++ b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/circuits.py @@ -37,7 +37,7 @@ def create(cls, diffsync, ids, attrs): try: _provider.validated_save() diffsync.provider_map[ids["name"]] = _provider.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) except ValidationError as err: if diffsync.job.debug: diffsync.job.logger.warning(f"Unable to create {ids['name']} provider. {err}") @@ -122,7 +122,7 @@ def create(cls, diffsync, ids, attrs): term_side="Z", circuit=_circuit, ) - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Circuit object in Nautobot.""" diff --git a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/dcim.py b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/dcim.py index 4424f9696..a1a650fdd 100644 --- a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/dcim.py +++ b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/dcim.py @@ -75,7 +75,7 @@ def create(cls, diffsync, ids, attrs): nautobot.update_custom_fields(new_cfields=attrs["custom_fields"], update_obj=new_site) new_site.validated_save() diffsync.site_map[ids["name"]] = new_site.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Site object in Nautobot.""" @@ -137,7 +137,7 @@ def create(cls, diffsync, ids, attrs): if ids["building"] not in diffsync.room_map: diffsync.room_map[ids["building"]] = {} diffsync.room_map[ids["building"]][ids["name"]] = new_rg.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update RackGroup object in Nautobot.""" @@ -188,7 +188,7 @@ def create(cls, diffsync, ids, attrs): if ids["room"] not in diffsync.rack_map[ids["building"]]: diffsync.rack_map[ids["building"]][ids["room"]] = {} diffsync.rack_map[ids["building"]][ids["room"]][ids["name"]] = new_rack.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Rack object in Nautobot.""" @@ -240,7 +240,7 @@ def create(cls, diffsync, ids, attrs): nautobot.update_custom_fields(new_cfields=attrs["custom_fields"], update_obj=new_manu) new_manu.validated_save() diffsync.vendor_map[ids["name"]] = new_manu.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Manufacturer object in Nautobot.""" @@ -287,7 +287,7 @@ def create(cls, diffsync, ids, attrs): nautobot.update_custom_fields(new_cfields=attrs["custom_fields"], update_obj=new_dt) new_dt.validated_save() diffsync.devicetype_map[ids["name"]] = new_dt.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update DeviceType object in Nautobot.""" @@ -346,7 +346,7 @@ def create(cls, diffsync, ids, attrs): nautobot.update_custom_fields(new_cfields=attrs["custom_fields"], update_obj=new_vc) new_vc.validated_save() diffsync.cluster_map[ids["name"]] = new_vc.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Virtual Chassis object in Nautobot.""" @@ -699,7 +699,7 @@ def create(cls, diffsync, ids, attrs): # pylint: disable=inconsistent-return-st diffsync.port_map[ids["device"]][ids["name"]] = new_intf.id if attrs.get("mac_addr"): diffsync.port_map[attrs["mac_addr"][:12]] = new_intf.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Interface object in Nautobot.""" diff --git a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/ipam.py b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/ipam.py index f2a5e5e7d..ce4221420 100644 --- a/nautobot_ssot/integrations/device42/diffsync/models/nautobot/ipam.py +++ b/nautobot_ssot/integrations/device42/diffsync/models/nautobot/ipam.py @@ -33,7 +33,7 @@ def create(cls, diffsync, ids, attrs): _vrf.validated_save() diffsync.vrf_map[ids["name"]] = _vrf.id diffsync.namespace_map[ids["name"]] = _namespace.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update VRF object in Nautobot.""" @@ -93,7 +93,7 @@ def create(cls, diffsync, ids, attrs): if ids["vrf"] not in diffsync.prefix_map: diffsync.prefix_map[ids["vrf"]] = {} diffsync.prefix_map[ids["vrf"]][prefix] = _pf.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update Prefix object in Nautobot.""" @@ -143,7 +143,7 @@ def create(cls, diffsync, ids, attrs): _ip = OrmIPAddress( address=_address, parent_id=prefix.id, - status_id=diffsync.status_map["Active"] if not attrs.get("available") else diffsync.status_map["Reserved"], + status_id=diffsync.status_map["Active"] if attrs.get("available") else diffsync.status_map["Reserved"], description=attrs["label"] if attrs.get("label") else "", ) _ip.validated_save() @@ -154,7 +154,7 @@ def create(cls, diffsync, ids, attrs): assign_ip = IPAddressToInterface.objects.create(ip_address=_ip, interface_id=intf, vm_interface=None) assign_ip.validated_save() if attrs.get("primary"): - if _ip.family == 4: + if _ip.ip_version == 4: assign_ip.interface.device.primary_ip4 = _ip else: assign_ip.interface.device.primary_ip6 = _ip @@ -174,7 +174,7 @@ def create(cls, diffsync, ids, attrs): if attrs["namespace"] not in diffsync.ipaddr_map: diffsync.ipaddr_map[attrs["namespace"]] = {} diffsync.ipaddr_map[attrs["namespace"]][_address] = _ip.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update IPAddress object in Nautobot.""" @@ -189,20 +189,16 @@ def update(self, attrs): self.diffsync.job.logger.info(f"Updating IPAddress {_ipaddr.address}") if "available" in attrs: _ipaddr.status = ( - OrmStatus.objects.get(name="Active") - if not attrs["available"] - else OrmStatus.objects.get(name="Reserved") + OrmStatus.objects.get(name="Active") if attrs["available"] else OrmStatus.objects.get(name="Reserved") ) if "label" in attrs: _ipaddr.description = attrs["label"] if attrs.get("label") else "" if attrs.get("device") and attrs.get("interface"): _device = attrs["device"] - if self.primary: - nautobot.unassign_primary(_ipaddr) try: intf = OrmInterface.objects.get(device__name=_device, name=attrs["interface"]) assign_ip = IPAddressToInterface.objects.create( - ip_address=_ipaddr, interface_id=intf, vm_interface=None + ip_address=_ipaddr, interface_id=intf.id, vm_interface=None ) assign_ip.validated_save() try: @@ -217,12 +213,11 @@ def update(self, attrs): ) elif attrs.get("device"): try: - intf = OrmInterface.objects.get(device__name=attrs["device"], name=self.interface) + intf = self.diffsync.port_map[attrs["device"]][self.interface] assign_ip = IPAddressToInterface.objects.create( ip_address=_ipaddr, interface_id=intf, vm_interface=None ) assign_ip.validated_save() - nautobot.unassign_primary(_ipaddr) except OrmInterface.DoesNotExist as err: self.diffsync.job.logger.debug( f"Unable to find Interface {attrs['interface'] if attrs.get('interface') else self.interface} for {attrs['device']} {err}" @@ -257,12 +252,22 @@ def update(self, attrs): f"Unable to find Interface {attrs['interface']} for {attrs['device'] if attrs.get('device') else self.device}. {err}" ) if attrs.get("primary") or self.primary is True: - if getattr(_ipaddr, "assigned_object"): - if _ipaddr.family == 4: - _ipaddr.assigned_object.device.primary_ip4 = _ipaddr + if attrs.get("device"): + device = attrs["device"] + else: + device = self.device + if attrs.get("interface"): + intf = attrs["interface"] + else: + intf = self.interface + intf = OrmInterface.objects.get(device__name=device, name=intf) + ip_to_intf = IPAddressToInterface.objects.filter(ip_address=_ipaddr, interface=intf).first() + if ip_to_intf and (getattr(_ipaddr, "primary_ip4_for") or getattr(_ipaddr, "primary_ip6_for")): + if _ipaddr.ip_version == 4: + ip_to_intf.interface.device.primary_ip4 = _ipaddr else: - _ipaddr.assigned_object.device.primary_ip6 = _ipaddr - _ipaddr.assigned_object.device.validated_save() + ip_to_intf.interface.device.primary_ip6 = _ipaddr + ip_to_intf.interface.device.validated_save() else: self.diffsync.job.logger.warning( f"IPAddress {_ipaddr.address} is showing unassigned from an Interface so can't be marked primary." @@ -302,8 +307,8 @@ class NautobotVLAN(VLAN): @classmethod def create(cls, diffsync, ids, attrs): """Create VLAN object in Nautobot.""" - _site_name = None, None - if ids["building"] != "Unknown": + _site_name = None + if ids.get("building") and ids["building"] != "Unknown": _site_name = ids["building"] else: _site_name = "Global" @@ -311,9 +316,9 @@ def create(cls, diffsync, ids, attrs): new_vlan = OrmVLAN( name=attrs["name"], vid=ids["vlan_id"], - location_id=diffsync.site_map[_site_name] - if _site_name in diffsync.site_map and _site_name != "Global" - else None, + location=( + diffsync.site_map[_site_name] if _site_name in diffsync.site_map and _site_name != "Global" else None + ), status_id=diffsync.status_map["Active"], description=attrs["description"], ) @@ -326,7 +331,7 @@ def create(cls, diffsync, ids, attrs): if _site_name not in diffsync.vlan_map: diffsync.vlan_map[_site_name] = {} diffsync.vlan_map[_site_name][ids["vlan_id"]] = new_vlan.id - return super().create(ids=ids, diffsync=diffsync, attrs=attrs) + return super().create(diffsync, ids=ids, attrs=attrs) def update(self, attrs): """Update VLAN object in Nautobot.""" diff --git a/nautobot_ssot/integrations/device42/signals.py b/nautobot_ssot/integrations/device42/signals.py index 2b19162b6..5692db849 100644 --- a/nautobot_ssot/integrations/device42/signals.py +++ b/nautobot_ssot/integrations/device42/signals.py @@ -1,4 +1,5 @@ """Signals for Device42 integration.""" + from nautobot.core.signals import nautobot_database_ready diff --git a/nautobot_ssot/integrations/device42/utils/nautobot.py b/nautobot_ssot/integrations/device42/utils/nautobot.py index 9222143d5..3fbc29029 100644 --- a/nautobot_ssot/integrations/device42/utils/nautobot.py +++ b/nautobot_ssot/integrations/device42/utils/nautobot.py @@ -12,7 +12,6 @@ from nautobot.dcim.models import Device, Interface, Platform from nautobot.extras.choices import CustomFieldTypeChoices from nautobot.extras.models import CustomField, Relationship, Role, Tag -from nautobot.ipam.models import IPAddress from netutils.lib_mapper import ANSIBLE_LIB_MAPPER_REVERSE, NAPALM_LIB_MAPPER_REVERSE from taggit.managers import TaggableManager from nautobot_ssot.integrations.device42.diffsync.models.base.dcim import Device as NautobotDevice @@ -362,17 +361,3 @@ def apply_vlans_to_port(diffsync, device_name: str, mode: str, vlans: list, port tagged_vlans.append(tagged_vlan) port.tagged_vlans.set(tagged_vlans) port.validated_save() - - -def unassign_primary(ipaddr: IPAddress): - """Handle unassigning primary IP address from a Device. - - Args: - ipaddr (IPAddress): IP Address that's set to primary and needs to be unset. - """ - _dev = ipaddr.assigned_object.device - if hasattr(ipaddr, "primary_ip4_for"): - _dev.primary_ip4 = None - elif hasattr(ipaddr, "primary_ip6_for"): - _dev.primary_ip6 = None - _dev.validated_save() diff --git a/nautobot_ssot/integrations/dna_center/__init__.py b/nautobot_ssot/integrations/dna_center/__init__.py new file mode 100644 index 000000000..6c0e3b365 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/__init__.py @@ -0,0 +1 @@ +"""Base module for DNA Center integration.""" diff --git a/nautobot_ssot/integrations/dna_center/constants.py b/nautobot_ssot/integrations/dna_center/constants.py new file mode 100644 index 000000000..96068b7f4 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/constants.py @@ -0,0 +1,33 @@ +"""Defines various constants used throughout the App.""" + +from django.conf import settings + +# Import config vars from nautobot_config.py +PLUGIN_CFG = settings.PLUGINS_CONFIG["nautobot_ssot"] + +DNAC_PLATFORM_MAPPER = { + "IOS": "cisco_ios", + "IOS-XE": "cisco_ios", + "NX-OS": "cisco_nxos", + "IOS-XR": "cisco_xr", +} + +BASE_INTERFACE_MAP = { + "Port-channel": "lag", + "Tunnel": "virtual", + "Management": "1000base-t", + "Ethernet": "1000base-t", + "FastEthernet": "100base-tx", + "GigabitEthernet": "1000base-t", + "TwoGigabitEthernet": "2.5gbase-t", + "TenGigabitEthernet": "10gbase-x-sfpp", + "FortyGigabitEthernet": "40gbase-x-qsfpp", + "FiftyGigabitEthernet": "50gbase-x-sfp28", + "HundredGigabitEthernet": "100gbase-x-qsfp28", + "TwentyFiveGigE": "25gbase-x-sfp28", + "TwoHundredGigabitEthernet": "200gbase-x-qsfp56", + "FourHundredGigabitEthernet": "400gbase-x-qsfpdd", + "Wlan-GigabitEthernet": "ieee802.11ax", + "Virtual-Access": "virtual", + "Virtual-Template": "virtual", +} diff --git a/nautobot_ssot/integrations/dna_center/diffsync/adapters/__init__.py b/nautobot_ssot/integrations/dna_center/diffsync/adapters/__init__.py new file mode 100644 index 000000000..5dbb1a2fd --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/adapters/__init__.py @@ -0,0 +1 @@ +"""Adapter classes for loading DiffSyncModels with data from DNA Center or Nautobot.""" diff --git a/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py b/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py new file mode 100644 index 000000000..53ec15dbb --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/adapters/dna_center.py @@ -0,0 +1,454 @@ +"""Nautobot SSoT for Cisco DNA Center Adapter for DNA Center SSoT plugin.""" + +from typing import List +import json +from netutils.ip import ipaddress_interface, netmask_to_cidr +from diffsync import DiffSync +from diffsync.exceptions import ObjectNotFound +from django.conf import settings +from django.core.exceptions import ValidationError +from nautobot.tenancy.models import Tenant + +from nautobot_ssot.integrations.dna_center.constants import DNAC_PLATFORM_MAPPER, PLUGIN_CFG +from nautobot_ssot.integrations.dna_center.diffsync.models.dna_center import ( + DnaCenterArea, + DnaCenterBuilding, + DnaCenterDevice, + DnaCenterFloor, + DnaCenterPrefix, + DnaCenterIPAddress, + DnaCenterPort, + DnaCenterIPAddressonInterface, +) +from nautobot_ssot.integrations.dna_center.utils.dna_center import DnaCenterClient + + +class DnaCenterAdapter(DiffSync): + """DiffSync adapter for DNA Center.""" + + area = DnaCenterArea + building = DnaCenterBuilding + floor = DnaCenterFloor + device = DnaCenterDevice + port = DnaCenterPort + prefix = DnaCenterPrefix + ipaddress = DnaCenterIPAddress + ip_on_intf = DnaCenterIPAddressonInterface + + top_level = ["area", "building", "device", "prefix", "ipaddress", "ip_on_intf"] + + def __init__(self, *args, job=None, sync=None, client: DnaCenterClient, tenant: Tenant, **kwargs): + """Initialize DNA Center. + + Args: + job (object, optional): DNA Center job. Defaults to None. + sync (object, optional): DNA Center DiffSync. Defaults to None. + client (DnaCenterClient): DNA Center API client connection object. + tenant (Tenant): Tenant to attach to imported objects. Can be set to None for no Tenant to be attached. + """ + super().__init__(*args, **kwargs) + self.job = job + self.sync = sync + self.conn = client + self.failed_import_devices = [] + self.dnac_location_map = {} + self.tenant = tenant + + def load_locations(self): + """Load location data from DNA Center into DiffSync models.""" + locations = self.conn.get_locations() + if locations: + # to ensure we process locations in the appropriate order we need to split them into their own list of locations + self.dnac_location_map = self.build_dnac_location_map(locations) + areas, buildings, floors = self.parse_and_sort_locations(locations) + self.load_areas(areas) + self.load_buildings(buildings) + self.load_floors(floors) + else: + self.job.logger.error("No location data was returned from DNAC. Unable to proceed.") + + def load_areas(self, areas: List[dict]): + """Load areas from DNAC into DiffSync model. + + Args: + areas (List[dict]): List of dictionaries containing location information about a building. + """ + for location in areas: + if not settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"].get("import_global"): + if location["name"] == "Global": + continue + if self.job.debug: + self.job.logger.info(f"Loading area {location['name']}. {location}") + parent_name = None + if location.get("parentId") and location["parentId"] in self.dnac_location_map: + parent_name = self.dnac_location_map[location["parentId"]]["name"] + self.dnac_location_map[location["id"]]["parent"] = parent_name + new_area = self.area( + name=location["name"], + parent=parent_name, + uuid=None, + ) + try: + self.add(new_area) + except ValidationError as err: + self.job.logger.warning(f"Unable to load area {location['name']}. {err}") + + def load_buildings(self, buildings: List[dict]): + """Load building data from DNAC into DiffSync model. + + Args: + buildings (List[dict]): List of dictionaries containing location information about a building. + """ + for location in buildings: + try: + self.get(self.building, location["name"]) + self.job.logger.warning(f"Building {location['name']} already loaded so skipping.") + continue + except ObjectNotFound: + if self.job.debug: + self.job.logger.info(f"Loading building {location['name']}. {location}") + address, _ = self.conn.find_address_and_type(info=location["additionalInfo"]) + latitude, longitude = self.conn.find_latitude_and_longitude(info=location["additionalInfo"]) + if location["parentId"] in self.dnac_location_map: + _area = self.dnac_location_map[location["parentId"]] + else: + _area = {"name": "Global", "parent": None} + new_building = self.building( + name=location["name"], + address=address, + area=_area["name"], + latitude=latitude[:9].rstrip("0"), + longitude=longitude[:7].rstrip("0"), + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + try: + self.add(new_building) + except ValidationError as err: + self.job.logger.warning(f"Unable to load building {location['name']}. {err}") + + def load_floors(self, floors: List[dict]): + """Load floor data from DNAC into DiffSync model. + + Args: + floors (List[dict]): List of dictionaries containing location information about a floor. + """ + for location in floors: + if self.job.debug: + self.job.logger.info(f"Loading floor {location['name']}. {location}") + if location["parentId"] in self.dnac_location_map: + _building = self.dnac_location_map[location["parentId"]] + else: + self.job.logger.warning(f"Parent to {location['name']} can't be found so will be skipped.") + continue + floor_name = f"{_building['name']} - {location['name']}" + try: + self.get(self.floor, {"name": floor_name, "building": _building["name"]}) + self.job.logger.warning(f"Duplicate Floor {floor_name} attempting to be loaded.") + except ObjectNotFound: + new_floor = self.floor( + name=floor_name, + building=_building["name"], + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + try: + self.add(new_floor) + try: + parent = self.get(self.building, _building["name"]) + parent.add_child(new_floor) + except ObjectNotFound as err: + self.job.logger.warning( + f"Unable to find building {_building['name']} for floor {floor_name}. {err}" + ) + except ValidationError as err: + self.job.logger.warning(f"Unable to load floor {floor_name}. {err}") + + def parse_and_sort_locations(self, locations: List[dict]): + """Separate locations into areas, buildings, and floors for processing. Also sort by siteHierarchy. + + Args: + locations (List[dict]): List of Locations (Sites) from DNAC to be separated. + + Returns: + tuple (List[dict], List[dict], List[dict]): Tuple containing lists of areas, buildings, and floors in DNAC to be processed. + """ + areas, buildings, floors = [], [], [] + for location in locations: + if not settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"].get("import_global"): + if location["name"] == "Global": + continue + for info in location["additionalInfo"]: + if info["attributes"].get("type") == "building": + buildings.append(location) + self.dnac_location_map[location["id"]]["loc_type"] = "building" + break + elif info["attributes"].get("type") == "floor": + floors.append(location) + self.dnac_location_map[location["id"]]["loc_type"] = "floor" + break + else: + areas.append(location) + if location.get("parentId") and location["parentId"] in self.dnac_location_map: + self.dnac_location_map[location["id"]]["parent"] = self.dnac_location_map[location["parentId"]]["name"] + else: + self.dnac_location_map[location["id"]]["parent"] = None + # sort areas by length of siteHierarchy so that parent areas loaded before child areas. + areas = sorted(areas, key=lambda x: len(x["siteHierarchy"].split("/"))) + return areas, buildings, floors + + def build_dnac_location_map(self, locations: List[dict]): + """Build out the initial DNAC location map for Location ID to name and type. + + Args: + locations (List[dict]): List of Locations (Sites) from DNAC. + + Returns: + dict: Dictionary of Locations mapped with ID to their name and location type. + """ + location_map = {} + for loc in locations: + if not settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"].get("import_global"): + if loc["name"] == "Global": + continue + location_map[loc["id"]] = {"name": loc["name"], "parent": None, "loc_type": "area"} + return location_map + + def load_devices(self): + """Load Device data from DNA Center info DiffSync models.""" + PLUGIN_CFG = settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"] + devices = self.conn.get_devices() + for dev in devices: + platform = "unknown" + dev_role = "Unknown" + vendor = "Cisco" + if not dev.get("hostname"): + self.job.logger.warning(f"Device {dev['id']} is missing hostname so will be skipped.") + dev["field_validation"] = { + "reason": "Failed due to missing hostname.", + } + self.failed_import_devices.append(dev) + continue + if PLUGIN_CFG.get("hostname_mapping"): + dev_role = self.conn.parse_hostname_for_role( + hostname_map=PLUGIN_CFG["hostname_mapping"], device_hostname=dev["hostname"] + ) + if dev_role == "Unknown": + dev_role = dev["role"] + if dev["softwareType"] in DNAC_PLATFORM_MAPPER: + platform = DNAC_PLATFORM_MAPPER[dev["softwareType"]] + else: + if not dev.get("softwareType") and dev.get("type") and ("3800" in dev["type"] or "9130" in dev["type"]): + platform = "cisco_ios" + if not dev.get("softwareType") and dev.get("family") and "Meraki" in dev["family"]: + if not PLUGIN_CFG.get("import_merakis"): + continue + platform = "cisco_meraki" + if dev.get("type") and "Juniper" in dev["type"]: + vendor = "Juniper" + dev_details = self.conn.get_device_detail(dev_id=dev["id"]) + loc_data = {} + if dev_details and dev_details.get("siteHierarchyGraphId"): + loc_data = self.conn.parse_site_hierarchy( + location_map=self.dnac_location_map, site_hier=dev_details["siteHierarchyGraphId"] + ) + if ( + (dev_details and not dev_details.get("siteHierarchyGraphId")) + or loc_data.get("building") == "Unassigned" + or not loc_data.get("building") + ): + self.job.logger.warning(f"Device {dev['hostname']} is missing building so will not be imported.") + dev["field_validation"] = { + "reason": "Missing building assignment.", + "device_details": dev_details, + "location_data": loc_data, + } + self.failed_import_devices.append(dev) + continue + try: + if self.job.debug: + self.job.logger.info( + f"Loading device {dev['hostname'] if dev.get('hostname') else dev['id']}. {dev}" + ) + device_found = self.get(self.device, dev["hostname"]) + if device_found: + self.job.logger.warning( + f"Duplicate device attempting to be loaded for {dev['hostname']} with ID: {dev['id']} so will not be imported." + ) + dev["field_validation"] = { + "reason": "Failed due to duplicate device found.", + "device_details": dev_details, + "location_data": loc_data, + } + self.failed_import_devices.append(dev) + continue + except ObjectNotFound: + new_dev = self.device( + name=dev["hostname"], + status="Active" if dev.get("reachabilityStatus") != "Unreachable" else "Offline", + role=dev_role, + vendor=vendor, + model=self.conn.get_model_name(models=dev["platformId"]) if dev.get("platformId") else "Unknown", + site=loc_data["building"], + floor=f"{loc_data['building']} - {loc_data['floor']}" if loc_data.get("floor") else None, + serial=dev["serialNumber"] if dev.get("serialNumber") else "", + version=dev.get("softwareVersion"), + platform=platform, + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + try: + self.add(new_dev) + self.load_ports(device_id=dev["id"], dev=new_dev, mgmt_addr=dev["managementIpAddress"]) + except ValidationError as err: + self.job.logger.warning(f"Unable to load device {dev['hostname']}. {err}") + dev["field_validation"] = { + "reason": f"Failed validation. {err}", + "device_details": dev_details, + "location_data": loc_data, + } + self.failed_import_devices.append(dev) + + def load_ports(self, device_id: str, dev: DnaCenterDevice, mgmt_addr: str = ""): + """Load port info from DNAC into Port DiffSyncModel. + + Args: + device_id (str): ID for Device in DNAC to retrieve ports for. + dev (DnaCenterDevice): Device associated with ports. + mgmt_addr (str): Management IP address for device. + """ + ports = self.conn.get_port_info(device_id=device_id) + for port in ports: + try: + found_port = self.get( + self.port, + { + "name": port["portName"], + "device": dev.name, + "mac_addr": port["macAddress"].upper() if port.get("macAddress") else None, + }, + ) + if found_port: + self.job.logger.warning( + f"Duplicate port attempting to be loaded, {port['portName']} for {dev.name}" + ) + continue + except ObjectNotFound: + if self.job.debug: + self.job.logger.info(f"Loading port {port['portName']} for {dev.name}. {port}") + port_type = self.conn.get_port_type(port_info=port) + port_status = self.conn.get_port_status(port_info=port) + new_port = self.port( + name=port["portName"], + device=dev.name if dev.name else "", + description=port["description"], + enabled=True if port["adminStatus"] == "UP" else False, + port_type=port_type, + port_mode="tagged" if port["portMode"] == "trunk" else "access", + mac_addr=port["macAddress"].upper() if port.get("macAddress") else None, + mtu=port["mtu"] if port.get("mtu") else 1500, + status=port_status, + uuid=None, + ) + try: + self.add(new_port) + dev.add_child(new_port) + + if port.get("addresses"): + for addr in port["addresses"]: + host = addr["address"]["ipAddress"]["address"] + mask_length = netmask_to_cidr(addr["address"]["ipMask"]["address"]) + prefix = ipaddress_interface(f"{host}/{mask_length}", "network.with_prefixlen") + if addr["address"]["ipAddress"]["address"] == mgmt_addr: + primary = True + else: + primary = False + self.load_ip_address( + host=host, + mask_length=mask_length, + prefix=prefix, + ) + self.load_ipaddress_to_interface( + host=host, + prefix=prefix, + device=dev.name if dev.name else "", + port=port["portName"], + primary=primary, + ) + except ValidationError as err: + self.job.logger.warning(f"Unable to load port {port['portName']} for {dev.name}. {err}") + + def load_ip_address(self, host: str, mask_length: int, prefix: str): + """Load IP Address info from DNAC into IPAddress DiffSyncModel. + + Args: + host (str): Host IP Address to be loaded. + mask_length (int): Mask length for IPAddress. + prefix (str): Parent prefix for IPAddress. + """ + if self.tenant: + namespace = self.tenant.name + else: + namespace = "Global" + try: + self.get(self.prefix, {"prefix": prefix, "namespace": namespace}) + except ObjectNotFound: + new_prefix = self.prefix( + prefix=prefix, + namespace=namespace, + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + self.add(new_prefix) + try: + ip_found = self.get(self.ipaddress, {"host": host, "namespace": namespace}) + if ip_found: + self.job.logger.warning(f"Duplicate IP Address attempting to be loaded: {host} in {prefix}") + except ObjectNotFound: + if self.job.debug: + self.job.logger.info(f"Loading IP Address {host}.") + new_ip = self.ipaddress( + host=host, + mask_length=mask_length, + namespace=namespace, + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + self.add(new_ip) + + def load_ipaddress_to_interface(self, host: str, prefix: str, device: str, port: str, primary: bool): + """Load DNAC IPAddressOnInterface DiffSync model with specified data. + + Args: + host (str): Host IP Address in mapping. + prefix (str): Parent prefix for host IP Address. + device (str): Device that IP resides on. + port (str): Interface that IP is configured on. + primary (str): Whether the IP is primary IP for assigned device. Defaults to False. + """ + try: + self.get(self.ip_on_intf, {"host": host, "prefix": prefix, "device": device, "port": port}) + except ObjectNotFound: + new_ipaddr_to_interface = self.ip_on_intf(host=host, device=device, port=port, primary=primary, uuid=None) + self.add(new_ipaddr_to_interface) + + def load(self): + """Load data from DNA Center into DiffSync models.""" + # add global prefix to be catchall + global_prefix = self.prefix( + prefix="0.0.0.0/0", + namespace=self.tenant.name if self.tenant else "Global", + tenant=self.tenant.name if self.tenant else None, + uuid=None, + ) + self.add(global_prefix) + + self.load_locations() + self.load_devices() + if PLUGIN_CFG.get("show_failures"): + if self.failed_import_devices: + self.job.logger.warning( + f"List of {len(self.failed_import_devices)} devices that were unable to be loaded. {json.dumps(self.failed_import_devices, indent=2)}" + ) + else: + self.job.logger.info("There weren't any failed device loads. Congratulations!") diff --git a/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py new file mode 100644 index 000000000..23affdcf8 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/adapters/nautobot.py @@ -0,0 +1,385 @@ +"""Nautobot Adapter for DNA Center SSoT plugin.""" + +try: + from nautobot_device_lifecycle_mgmt.models import SoftwareLCM # noqa: F401 + + LIFECYCLE_MGMT = True +except ImportError: + LIFECYCLE_MGMT = False + +from collections import defaultdict +from typing import Optional +from diffsync import DiffSync +from diffsync.enum import DiffSyncModelFlags +from diffsync.exceptions import ObjectNotFound +from django.core.exceptions import ValidationError +from django.db.models import ProtectedError +from django.db.utils import IntegrityError +from nautobot.dcim.models import Device as OrmDevice +from nautobot.dcim.models import Interface as OrmInterface +from nautobot.dcim.models import Location as OrmLocation +from nautobot.dcim.models import LocationType as OrmLocationType +from nautobot.extras.models import Status as OrmStatus +from nautobot.extras.models import Relationship as OrmRelationship +from nautobot.extras.models import RelationshipAssociation as OrmRelationshipAssociation +from nautobot.ipam.models import IPAddress as OrmIPAddress +from nautobot.ipam.models import IPAddressToInterface as OrmIPAddressToInterface +from nautobot.ipam.models import Namespace +from nautobot.ipam.models import Prefix as OrmPrefix +from nautobot.tenancy.models import Tenant as OrmTenant +from nautobot_ssot.jobs.base import DataTarget +from nautobot_ssot.integrations.dna_center.diffsync.models.nautobot import ( + NautobotArea, + NautobotBuilding, + NautobotDevice, + NautobotFloor, + NautobotIPAddress, + NautobotPort, + NautobotPrefix, + NautobotIPAddressOnInterface, +) + + +class NautobotAdapter(DiffSync): + """DiffSync adapter for Nautobot.""" + + area = NautobotArea + building = NautobotBuilding + floor = NautobotFloor + device = NautobotDevice + port = NautobotPort + prefix = NautobotPrefix + ipaddress = NautobotIPAddress + ip_on_intf = NautobotIPAddressOnInterface + + top_level = ["area", "building", "device", "prefix", "ipaddress", "ip_on_intf"] + + tenant_map = {} + status_map = {} + locationtype_map = {} + region_map = {} + site_map = {} + floor_map = {} + device_map = {} + port_map = {} + namespace_map = {} + prefix_map = {} + ipaddr_map = {} + + def __init__( + self, *args, job: Optional[DataTarget] = None, sync=None, tenant: Optional[OrmTenant] = None, **kwargs + ): + """Initialize Nautobot. + + Args: + job (DataTarget, optional): Nautobot job. Defaults to None. + sync (object, optional): Nautobot DiffSync. Defaults to None. + tenant (OrmTenant, optional): Tenant defined in Job form that all non-location objects should belong to. + """ + super().__init__(*args, **kwargs) + self.job = job + self.sync = sync + self.tenant = tenant + self.objects_to_create = defaultdict(list) + self.objects_to_delete = defaultdict(list) + + def load_regions(self): + """Load Region data from Nautobt into DiffSync models.""" + try: + loc_type = OrmLocationType.objects.get(name="Region") + locations = OrmLocation.objects.filter(location_type=loc_type) + for region in locations: + self.region_map[region.name] = region.id + try: + self.get(self.area, {"name": region.name, "parent": region.parent.name if region.parent else None}) + self.job.logger.warning(f"Region {region.name} already loaded so skipping duplicate.") + except ObjectNotFound: + new_region = self.area( + name=region.name, + parent=region.parent.name if region.parent else None, + uuid=region.id, + ) + self.add(new_region) + except OrmLocationType.DoesNotExist as err: + self.job.logger.warning( + f"Unable to find LocationType: Region so can't find region Locations to load. {err}" + ) + + def load_sites(self): + """Load Site data from Nautobot into DiffSync models.""" + try: + loc_type = OrmLocationType.objects.get(name="Site") + locations = OrmLocation.objects.filter(location_type=loc_type) + for site in locations: + self.site_map[site.name] = site.id + try: + self.get(self.building, {"name": site.name, "area": site.parent.name if site.parent else None}) + except ObjectNotFound: + new_building = self.building( + name=site.name, + address=site.physical_address, + area=site.parent.name if site.parent else "", + latitude=str(site.latitude).rstrip("0"), + longitude=str(site.longitude).rstrip("0"), + tenant=site.tenant.name if site.tenant else None, + uuid=site.id, + ) + self.add(new_building) + except OrmLocationType.DoesNotExist as err: + self.job.logger.warning(f"Unable to find LocationType: Site so can't find site Locations to load. {err}") + + def load_floors(self): + """Load LocationType floors from Nautobot into DiffSync models.""" + try: + loc_type = OrmLocationType.objects.get(name="Floor") + locations = OrmLocation.objects.filter(location_type=loc_type) + for location in locations: + self.floor_map[location.name] = location.id + new_floor = self.floor( + name=location.name, + building=location.parent.name if location.parent else "", + tenant=location.tenant.name if location.tenant else None, + uuid=location.id, + ) + self.add(new_floor) + try: + if location.parent: + building = self.get(self.building, location.parent.name) + building.add_child(new_floor) + except ObjectNotFound as err: + self.job.logger.warning( + f"Unable to load building {location.parent.name} for floor {location.name}. {err}" + ) + except OrmLocationType.DoesNotExist as err: + self.job.logger.warning(f"Unable to find LocationType: Floor so can't find floor Locations to load. {err}") + + def load_devices(self): + """Load Device data from Nautobot into DiffSync models.""" + if self.tenant: + devices = OrmDevice.objects.filter(tenant=self.tenant) + else: + devices = OrmDevice.objects.filter(_custom_field_data__system_of_record="DNA Center") + for dev in devices: + self.device_map[dev.name] = dev.id + version = dev.custom_field_data.get("os_version") + if LIFECYCLE_MGMT: + try: + soft_lcm = OrmRelationship.objects.get(label="Software on Device") + version = OrmRelationshipAssociation.objects.get( + relationship=soft_lcm, destination_id=dev.id + ).source.version + except OrmRelationshipAssociation.DoesNotExist: + pass + new_dev = self.device( + name=dev.name, + status=dev.status.name, + role=dev.role.name, + vendor=dev.device_type.manufacturer.name, + model=dev.device_type.model, + site=dev.location.parent.name if dev.location.parent else None, + floor=dev.location.name if dev.location else None, + serial=dev.serial, + version=version, + platform=dev.platform.network_driver if dev.platform else "", + tenant=dev.tenant.name if dev.tenant else None, + uuid=dev.id, + ) + if self.tenant: + new_dev.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_dev) + + def load_ports(self): + """Load Interface data from Nautobot into DiffSync models.""" + if self.tenant: + ports = OrmInterface.objects.filter(device__tenant=self.tenant) + else: + ports = OrmInterface.objects.filter(device___custom_field_data__system_of_record="DNA Center") + for port in ports: + if port.device.name not in self.port_map: + self.port_map[port.device.name] = {} + self.port_map[port.device.name][port.name] = port.id + new_port = self.port( + name=port.name, + device=port.device.name, + description=port.description, + enabled=port.enabled, + port_type=port.type, + port_mode=port.mode, + mac_addr=str(port.mac_address) if getattr(port, "mac_address") else None, + mtu=port.mtu if port.mtu else 1500, + status=port.status.name, + uuid=port.id, + ) + if self.tenant: + new_port.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_port) + device = self.get(self.device, port.device.name) + device.add_child(new_port) + + def load_prefixes(self): + """Load Prefix data from Nautobot into DiffSync models.""" + if self.tenant: + prefixes = OrmPrefix.objects.filter(tenant=self.tenant) + else: + prefixes = OrmPrefix.objects.filter(_custom_field_data__system_of_record="DNA Center") + for prefix in prefixes: + self.prefix_map[str(prefix.prefix)] = prefix.id + new_prefix = self.prefix( + prefix=str(prefix.prefix), + namespace=prefix.namespace.name, + tenant=prefix.tenant.name if prefix.tenant else None, + uuid=prefix.id, + ) + if self.tenant: + new_prefix.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_prefix) + + def load_ipaddresses(self): + """Load IPAddress data from Nautobot into DiffSync models.""" + if self.tenant: + addresses = OrmIPAddress.objects.filter(tenant=self.tenant) + else: + addresses = OrmIPAddress.objects.filter(_custom_field_data__system_of_record="DNA Center") + for ipaddr in addresses: + self.ipaddr_map[str(ipaddr.host)] = ipaddr.id + new_ipaddr = self.ipaddress( + host=str(ipaddr.host), + mask_length=ipaddr.mask_length, + namespace=ipaddr.parent.namespace.name, + tenant=ipaddr.tenant.name if ipaddr.tenant else None, + uuid=ipaddr.id, + ) + if self.tenant: + new_ipaddr.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_ipaddr) + + def load_ipaddress_to_interface(self): + """Load IPAddressonInterface data from Nautobot into DiffSync models.""" + if self.tenant: + mappings = OrmIPAddressToInterface.objects.filter(ip_address__tenant=self.tenant) + else: + mappings = OrmIPAddressToInterface.objects.filter( + ip_address___custom_field_data__system_of_record="DNA Center" + ) + for mapping in mappings: + new_ipaddr_to_interface = self.ip_on_intf( + host=str(mapping.ip_address.host), + device=mapping.interface.device.name, + port=mapping.interface.name, + primary=bool( + len(mapping.ip_address.primary_ip4_for.all()) > 0 + or len(mapping.ip_address.primary_ip6_for.all()) > 0 + ), + uuid=mapping.id, + ) + if self.tenant: + new_ipaddr_to_interface.model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + self.add(new_ipaddr_to_interface) + + def sync_complete(self, source: DiffSync, *args, **kwargs): + """Label and clean up function for DiffSync sync. + + Once the sync is complete, this function labels all imported objects and then + deletes any objects from Nautobot that need to be deleted in a specific order. + + Args: + source (DiffSync): DiffSync + """ + for grouping in ["ipaddresses", "prefixes", "ports", "devices", "floors", "sites", "regions"]: + for nautobot_obj in self.objects_to_delete[grouping]: + try: + self.job.logger.info(f"Deleting {nautobot_obj}.") + nautobot_obj.delete() + except ProtectedError: + self.job.logger.info(f"Deletion failed protected object: {nautobot_obj}") + self.objects_to_delete[grouping] = [] + + if self.job.bulk_import: + self.bulk_create_update() + else: + self.update_database() + return super().sync_complete(source, *args, **kwargs) + + def update_database(self): + """Perform databse update using normal operations.""" + for obj_type in [ + "devices", + "interfaces", + "mappings", + ]: + if len(self.objects_to_create[obj_type]) > 0: + self.job.logger.info(f"Importing {len(self.objects_to_create[obj_type])} {obj_type} into Nautobot.") + for nautobot_obj in self.objects_to_create[obj_type]: + try: + self.job.logger.info(f"Saving {nautobot_obj}.") + nautobot_obj.validated_save() + except ValidationError as err: + self.job.logger.warning(f"Unable to save {nautobot_obj}. {err}") + except IntegrityError as err: + self.job.logger.warning(f"Unable to save {nautobot_obj}. {err}") + if len(self.objects_to_create["primary_ip4"]) > 0: + self.job.logger.info("Performing assignment of device management IPv4 addresses in Nautobot.") + for _dev in self.objects_to_create["primary_ip4"]: + try: + dev = OrmDevice.objects.get(id=_dev[0]) + dev.primary_ip4_id = _dev[1] + dev.validated_save() + except OrmDevice.DoesNotExist as err: + self.job.logger.warning(f"Unable to find Device ID {_dev[0]}. {err}") + except ValidationError as err: + self.job.logger.warning(f"Unable to save Device {dev.name}. {err}") + if len(self.objects_to_create["primary_ip6"]) > 0: + self.job.logger.info("Performing assignment of device management IPv6 addresses in Nautobot.") + for _dev in self.objects_to_create["primary_ip6"]: + try: + dev = OrmDevice.objects.get(id=_dev[0]) + dev.primary_ip6_id = _dev[1] + dev.validated_save() + except OrmDevice.DoesNotExist as err: + self.job.logger.warning(f"Unable to find Device ID {_dev[0]}. {err}") + except ValidationError as err: + self.job.logger.warning(f"Unable to save Device {dev.name}. {err}") + + def bulk_create_update(self): + """Perform database update using bulk operations.""" + if len(self.objects_to_create["devices"]) > 0: + self.job.logger.info("Performing bulk create of Devices in Nautobot") + OrmDevice.objects.bulk_create(self.objects_to_create["devices"], batch_size=250) + if len(self.objects_to_create["interfaces"]) > 0: + self.job.logger.info("Performing bulk create of Interfaces in Nautobot") + OrmInterface.objects.bulk_create(self.objects_to_create["interfaces"], batch_size=250) + if len(self.objects_to_create["mappings"]) > 0: + self.job.logger.info("Performing assignment of IPAddress to Interface.") + OrmIPAddressToInterface.objects.bulk_create(self.objects_to_create["mappings"], batch_size=250) + if len(self.objects_to_create["primary_ip4"]) > 0: + self.job.logger.info("Performing bulk update of device primary IPv4 addresses in Nautobot.") + device_primary_ip_objs = [] + for d in self.objects_to_create["primary_ip4"]: + dev = OrmDevice.objects.get(id=d[0]) + dev.primary_ip4_id = d[1] + device_primary_ip_objs.append(dev) + OrmDevice.objects.bulk_update(device_primary_ip_objs, ["primary_ip4_id"], batch_size=250) + if len(self.objects_to_create["primary_ip6"]) > 0: + self.job.logger.info("Performing bulk update of device primary IPv6 addresses in Nautobot.") + device_primary_ip_objs = [] + for d in self.objects_to_create["primary_ip6"]: + dev = OrmDevice.objects.get(id=d[0]) + dev.primary_ip6_id = d[1] + device_primary_ip_objs.append(dev) + OrmDevice.objects.bulk_update(device_primary_ip_objs, ["primary_ip6_id"], batch_size=250) + + def load(self): + """Load data from Nautobot into DiffSync models.""" + self.locationtype_map = {lt.name: lt.id for lt in OrmLocationType.objects.only("id", "name")} + self.status_map = {status.name: status.id for status in OrmStatus.objects.only("id", "name")} + self.tenant_map = {tenant.name: tenant.id for tenant in OrmTenant.objects.only("id", "name")} + self.namespace_map = {ns.name: ns.id for ns in Namespace.objects.only("id", "name")} + + self.load_regions() + self.load_sites() + self.load_floors() + self.load_devices() + self.load_ports() + self.load_prefixes() + self.load_ipaddresses() + self.load_ipaddress_to_interface() diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/__init__.py b/nautobot_ssot/integrations/dna_center/diffsync/models/__init__.py new file mode 100644 index 000000000..0f73fc66a --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/__init__.py @@ -0,0 +1 @@ +"""DiffSync models and adapters for the DNA Center SSoT plugin.""" diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/base.py b/nautobot_ssot/integrations/dna_center/diffsync/models/base.py new file mode 100644 index 000000000..129ee85fc --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/base.py @@ -0,0 +1,166 @@ +"""DiffSyncModel subclasses for Nautobot-to-DNA Center data sync.""" + +from typing import Optional, List +from uuid import UUID +from diffsync import DiffSyncModel +from diffsync.enum import DiffSyncModelFlags + + +class Area(DiffSyncModel): + """DiffSync model for DNA Center areas.""" + + model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + + _modelname = "area" + _identifiers = ("name", "parent") + _attributes = () + _children = {} + + name: str + parent: Optional[str] + buildings: Optional[List["Building"]] = list() + + uuid: Optional[UUID] + + +class Building(DiffSyncModel): + """DiffSync model for DNA Center buildings.""" + + model_flags = DiffSyncModelFlags.SKIP_UNMATCHED_DST + + _modelname = "building" + _identifiers = ("name",) + _attributes = ("address", "area", "latitude", "longitude", "tenant") + _children = {"floor": "floors"} + + name: str + address: Optional[str] + area: str + latitude: Optional[str] + longitude: Optional[str] + tenant: Optional[str] + floors: Optional[List["Floor"]] = list() + + uuid: Optional[UUID] + + +class Floor(DiffSyncModel): + """DiffSync model for DNA Center floors.""" + + _modelname = "floor" + _identifiers = ("name", "building") + _attributes = ("tenant",) + _children = {} + + name: str + building: str + tenant: Optional[str] + + uuid: Optional[UUID] + + +class Device(DiffSyncModel): + """DiffSync model for DNA Center devices.""" + + _modelname = "device" + _identifiers = ("name",) + _attributes = ( + "site", + "serial", + "status", + "role", + "vendor", + "model", + "floor", + "version", + "platform", + "tenant", + ) + _children = {"port": "ports"} + + name: Optional[str] + status: Optional[str] + role: Optional[str] + vendor: str + model: str + site: Optional[str] + floor: Optional[str] + serial: str = "" + version: Optional[str] + platform: str + tenant: Optional[str] + ports: Optional[List["Port"]] = list() + + uuid: Optional[UUID] + + +class Port(DiffSyncModel): + """DiffSync model for DNA Center interfaces.""" + + _modelname = "port" + _identifiers = ("name", "device") + _attributes = ("description", "mac_addr", "port_type", "port_mode", "mtu", "status", "enabled") + _children = {} + + name: str + device: str + description: Optional[str] + port_type: str + port_mode: str + mac_addr: Optional[str] + mtu: int + status: str + enabled: bool + + uuid: Optional[UUID] + + +class Prefix(DiffSyncModel): + """DiffSync Model for DNA Center prefixes.""" + + _modelname = "prefix" + _identifiers = ("prefix", "namespace") + _attributes = ("tenant",) + _children = {} + + prefix: str + namespace: str + tenant: Optional[str] + uuid: Optional[UUID] + + +class IPAddress(DiffSyncModel): + """DiffSync model for DNA Center IP addresses.""" + + _modelname = "ipaddress" + _identifiers = ("host", "namespace") + _attributes = ("mask_length", "tenant") + _children = {} + + host: str + mask_length: int + namespace: str + tenant: Optional[str] + + uuid: Optional[UUID] + + +class IPAddressOnInterface(DiffSyncModel): + """DiffSync model for DNA Center tracking IPAddress on particular Device interfaces.""" + + _modelname = "ip_on_intf" + _identifiers = ("host", "device", "port") + _attributes = ("primary",) + _children = {} + + host: str + device: str + port: str + primary: bool + + uuid: Optional[UUID] + + +Area.update_forward_refs() +Building.update_forward_refs() +Device.update_forward_refs() diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py b/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py new file mode 100644 index 000000000..6a0b385ba --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/dna_center.py @@ -0,0 +1,148 @@ +"""Nautobot SSoT for Cisco DNA Center DiffSync models for Nautobot SSoT for Cisco DNA Center SSoT.""" + +from nautobot_ssot.integrations.dna_center.diffsync.models.base import ( + Area, + Building, + Floor, + Device, + Port, + Prefix, + IPAddress, + IPAddressOnInterface, +) + + +class DnaCenterArea(Area): + """DNA Center implementation of Building DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Area in DNA Center from Area object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Area in DNA Center from Area object.""" + return super().update(attrs) + + def delete(self): + """Delete Area in DNA Center from Area object.""" + return self + + +class DnaCenterBuilding(Building): + """DNA Center implementation of Building DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Building in DNA Center from Building object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Building in DNA Center from Building object.""" + return super().update(attrs) + + def delete(self): + """Delete Building in DNA Center from Building object.""" + return self + + +class DnaCenterFloor(Floor): + """DNA Center implementation of Floor DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Floor in DNA Center from Floor object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Floor in DNA Center from Floor object.""" + return super().update(attrs) + + def delete(self): + """Delete Floor in DNA Center from Floor object.""" + return self + + +class DnaCenterDevice(Device): + """DNA Center implementation of Device DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Device in DNA Center from Device object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Device in DNA Center from Device object.""" + return super().update(attrs) + + def delete(self): + """Delete Device in DNA Center from Device object.""" + return self + + +class DnaCenterPort(Port): + """DNA Center implementation of Port DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Interface in DNA Center from Port object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Interface in DNA Center from Port object.""" + return super().update(attrs) + + def delete(self): + """Delete Interface in DNA Center from Port object.""" + return self + + +class DnaCenterPrefix(Prefix): + """DNA Center implementation of Prefix Diffsync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Prefix in Dna Center from Prefix Diffsync model.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Prefix in DNA Center from Prefix object.""" + return super().update(attrs) + + def delete(self): + """Delete Prefix in DNA Center from Prefix object.""" + return self + + +class DnaCenterIPAddress(IPAddress): + """DNA Center implementation of IPAddress DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create IPAddress in DNA Center from IPAddress object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddress in DNA Center from IPAddress object.""" + return super().update(attrs) + + def delete(self): + """Delete IPAddress in DNA Center from IPAddress object.""" + return self + + +class DnaCenterIPAddressonInterface(IPAddressOnInterface): + """DNA Center implementation of IPAddress DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create IPAddress in DNA Center from IPAddress object.""" + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddress in DNA Center from IPAddress object.""" + return super().update(attrs) + + def delete(self): + """Delete IPAddress in DNA Center from IPAddress object.""" + return self diff --git a/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py b/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py new file mode 100644 index 000000000..d3358874f --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/diffsync/models/nautobot.py @@ -0,0 +1,458 @@ +"""Nautobot DiffSync models for DNA Center SSoT.""" + +from datetime import datetime +from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from nautobot.dcim.models import ( + Device, + DeviceType, + Interface, + Manufacturer, + Location, + LocationType, +) +from nautobot.extras.models import Role +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Prefix, Namespace +from nautobot_ssot.integrations.dna_center.diffsync.models import base +from nautobot_ssot.integrations.dna_center.utils.nautobot import ( + add_software_lcm, + assign_version_to_device, + verify_platform, +) + +try: + import nautobot_device_lifecycle_mgmt # noqa: F401 + + LIFECYCLE_MGMT = True +except ImportError: + LIFECYCLE_MGMT = False + + +class NautobotArea(base.Area): + """Nautobot implementation of Area DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Region in Nautobot from Area object.""" + try: + diffsync.region_map[ids["name"]] + diffsync.job.logger.warning(f"Region {ids['name']} already exists so won't be created.") + except KeyError: + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Region {ids['name']}.") + new_region = Location( + name=ids["name"], + location_type_id=diffsync.locationtype_map["Region"], + status_id=diffsync.status_map["Active"], + ) + if ids.get("parent"): + try: + new_region.parent_id = diffsync.region_map[ids["parent"]] + except KeyError: + diffsync.job.logger.warning(f"Unable to find Region {ids['parent']} for {ids['name']}.") + new_region.validated_save() + diffsync.region_map[ids["name"]] = new_region.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + +class NautobotBuilding(base.Building): + """Nautobot implementation of Building DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Site in Nautobot from Building object.""" + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Site {ids['name']}.") + new_site = Location( + name=ids["name"], + location_type_id=diffsync.locationtype_map["Site"], + parent_id=diffsync.region_map[attrs["area"]], + physical_address=attrs["address"] if attrs.get("address") else "", + status_id=diffsync.status_map["Active"], + latitude=attrs["latitude"], + longitude=attrs["longitude"], + ) + if attrs.get("tenant"): + new_site.tenant_id = diffsync.tenant_map[attrs["tenant"]] + new_site.validated_save() + diffsync.site_map[ids["name"]] = new_site.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Site in Nautobot from Building object.""" + if not settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"].get("update_locations"): + self.diffsync.job.logger.warning( + f"`update_locations` setting is disabled so will skip updating {self.name}." + ) + return super().update(attrs) + site = Location.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Updating Site {site.name}.") + if "address" in attrs: + site.physical_address = attrs["address"] + if "area" in attrs: + site.parent_id = self.diffsync.region_map[attrs["area"]] + if "latitude" in attrs: + site.latitude = attrs["latitude"] + if "longitude" in attrs: + site.longitude = attrs["longitude"] + if "tenant" in attrs: + if attrs.get("tenant"): + site.tenant_id = self.diffsync.tenant_map[attrs["tenant"]] + else: + site.tenant = None + site.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Site in Nautobot from Building object.""" + if not settings.PLUGINS_CONFIG["nautobot_ssot_dna_center"].get("update_locations"): + self.diffsync.job.logger.warning( + f"`update_locations` setting is disabled so will skip deleting {self.name}." + ) + return None + site = Location.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Deleting Site {site.name}.") + self.diffsync.objects_to_delete["sites"].append(site) + return self + + +class NautobotFloor(base.Floor): + """Nautobot implementation of Floor DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create LocationType: Floor in Nautobot from Floor object.""" + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Floor {ids['name']}.") + new_floor = Location( + name=ids["name"], + status_id=diffsync.status_map["Active"], + parent_id=diffsync.site_map[ids["building"]], + location_type_id=diffsync.locationtype_map["Floor"], + ) + if attrs.get("tenant"): + new_floor.tenant_id = diffsync.tenant_map[attrs["tenant"]] + new_floor.validated_save() + diffsync.floor_map[ids["name"]] = new_floor.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update LocationType: Floor in Nautobot from Floor object.""" + floor = Location.objects.get(name=self.name, location_type=LocationType.objects.get(name="Floor")) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Updating Floor {floor.name} with {attrs}") + if "tenant" in attrs: + if attrs.get("tenant"): + floor.tenant_id = self.diffsync.tenant_map[attrs["tenant"]] + else: + floor.tenant = None + floor.validated_save() + return super().update(attrs) + + def delete(self): + """Delete LocationType: Floor in Nautobot from Floor object.""" + floor = Location.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Deleting Floor {floor.name} in {floor.parent.name}.") + self.diffsync.objects_to_delete["floors"].append(floor) + return self + + +class NautobotDevice(base.Device): + """Nautobot implementation of DNA Center Device model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Device in Nautobot from NautobotDevice object.""" + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Device {ids['name']}.") + manufacturer, _ = Manufacturer.objects.get_or_create(name=attrs["vendor"]) + device_role, created = Role.objects.get_or_create(name=attrs["role"]) + if created: + device_role.content_types.add(ContentType.objects.get_for_model(Device)) + device_role.validated_save() + device_type, _ = DeviceType.objects.get_or_create(model=attrs["model"], manufacturer=manufacturer) + platform = verify_platform(platform_name=attrs["platform"], manu=manufacturer.id) + new_device = Device( + name=ids["name"], + status_id=diffsync.status_map[attrs["status"]], + role=device_role, + location_id=diffsync.site_map[attrs["site"]], + device_type=device_type, + serial=attrs["serial"], + platform_id=platform.id, + ) + if attrs.get("floor"): + new_device.location_id = diffsync.floor_map[attrs["floor"]] + if attrs.get("tenant"): + new_device.tenant_id = diffsync.tenant_map[attrs["tenant"]] + if attrs.get("version"): + new_device.custom_field_data.update({"os_version": attrs["version"]}) + if LIFECYCLE_MGMT: + lcm_obj = add_software_lcm( + diffsync=diffsync, platform=platform.network_driver, version=attrs["version"] + ) + assign_version_to_device(diffsync=diffsync, device=new_device, software_lcm=lcm_obj) + new_device.custom_field_data.update({"system_of_record": "DNA Center"}) + new_device.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + diffsync.objects_to_create["devices"].append(new_device) + diffsync.device_map[ids["name"]] = new_device.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Device in Nautobot from NautobotDevice object.""" + device = Device.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Updating Device {device.name} with {attrs}") + if "status" in attrs: + device.status_id = self.diffsync.status_map[attrs["status"]] + if "role" in attrs: + dev_role, created = Role.objects.get_or_create(name=attrs["role"]) + device.role = dev_role + if created: + dev_role.content_types.add(ContentType.objects.get_for_model(Device)) + if attrs.get("site"): + device.location_id = self.diffsync.site_map[attrs["site"]] + if attrs.get("floor"): + device.location_id = self.diffsync.floor_map[attrs["floor"]] + if "model" in attrs: + if attrs.get("vendor"): + vendor = Manufacturer.objects.get_or_create(name=attrs["vendor"])[0] + else: + vendor = Manufacturer.objects.get_or_create(name=self.vendor)[0] + device.device_type = DeviceType.objects.get_or_create(model=attrs["model"], manufacturer=vendor)[0] + if "serial" in attrs: + device.serial = attrs["serial"] + if "platform" in attrs: + vendor = attrs["vendor"] if attrs.get("vendor") else self.vendor + manufacturer = Manufacturer.objects.get(name=vendor) + device.platform = verify_platform(platform_name=attrs["platform"], manu=manufacturer.id) + if "tenant" in attrs: + if attrs.get("tenant"): + device.tenant_id = self.diffsync.tenant_map[attrs["tenant"]] + else: + device.tenant = None + if "version" in attrs: + device.custom_field_data.update({"os_version": attrs["version"]}) + if LIFECYCLE_MGMT: + platform_network_driver = attrs["platform"] if attrs.get("platform") else self.platform + lcm_obj = add_software_lcm( + diffsync=self.diffsync, platform=platform_network_driver, version=attrs["version"] + ) + assign_version_to_device(diffsync=self.diffsync, device=device, software_lcm=lcm_obj) + device.custom_field_data.update({"system_of_record": "DNA Center"}) + device.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + device.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Device in Nautobot from NautobotDevice object.""" + dev = Device.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Deleting Device: {dev.name}.") + super().delete() + self.diffsync.objects_to_delete["devices"].append(dev) + return self + + +class NautobotPort(base.Port): + """Nautobot implementation of Port DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Interface in Nautobot from Port object.""" + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Port {ids['name']} for Device {ids['device']}.") + new_port = Interface( + name=ids["name"], + device_id=diffsync.device_map[ids["device"]], + description=attrs["description"], + enabled=attrs["enabled"], + type=attrs["port_type"], + mode=attrs["port_mode"], + mac_address=attrs["mac_addr"], + mtu=attrs["mtu"], + status_id=diffsync.status_map[attrs["status"]], + mgmt_only=True if "Management" in ids["name"] else False, + ) + new_port.custom_field_data.update({"system_of_record": "DNA Center"}) + new_port.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + diffsync.objects_to_create["interfaces"].append(new_port) + if ids["device"] not in diffsync.port_map: + diffsync.port_map[ids["device"]] = {} + diffsync.port_map[ids["device"]][ids["name"]] = new_port.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Interface in Nautobot from Port object.""" + port = Interface.objects.get(id=self.uuid) + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Updating Port {port.name} for Device {port.device.name}.") + if "description" in attrs: + port.description = attrs["description"] + if "mac_addr" in attrs: + port.mac_address = attrs["mac_addr"] + if "port_type" in attrs: + port.type = attrs["port_type"] + if "port_mode" in attrs: + port.mode = attrs["port_mode"] + if "mtu" in attrs: + port.mtu = attrs["mtu"] + if "status" in attrs: + port.status_id = self.diffsync.status_map[attrs["status"]] + if "enabled" in attrs: + port.enabled = attrs["enabled"] + port.custom_field_data.update({"system_of_record": "DNA Center"}) + port.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + port.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Interface in Nautobot from Port object.""" + if self.diffsync.job.debug: + self.diffsync.job.logger.info(f"Deleting Interface {self.name} for {self.device}.") + port = Interface.objects.get(id=self.uuid) + super().delete() + self.diffsync.objects_to_delete["ports"].append(port) + return self + + +class NautobotPrefix(base.Prefix): + """Nautobot implemention of Prefix DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create Prefix in Nautobot from NautobotManagementPrefix objects.""" + if ids["namespace"] in diffsync.namespace_map: + namespace = diffsync.namespace_map[ids["namespace"]] + else: + namespace = Namespace.objects.get_or_create(name=ids["namespace"])[0].id + if diffsync.job.debug: + diffsync.job.logger.info(f"Creating Prefix {ids['prefix']}.") + new_prefix = Prefix( + prefix=ids["prefix"], + namespace_id=namespace, + status_id=diffsync.status_map["Active"], + ) + if ids["prefix"] == "0.0.0.0/0": + new_prefix.type = "container" + new_prefix.description = "Catch-all Prefix from DNA Center SSoT." + if attrs.get("tenant"): + new_prefix.tenant_id = diffsync.tenant_map[attrs["tenant"]] + new_prefix.custom_field_data.update({"system_of_record": "DNA Center"}) + new_prefix.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + new_prefix.validated_save() + diffsync.prefix_map[ids["prefix"]] = new_prefix.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update Prefix in Nautobot from Prefix object.""" + prefix = Prefix.objects.get(id=self.uuid) + if "tenant" in attrs: + if attrs.get("tenant"): + prefix.tenant_id = self.diffsync.tenant_map[attrs["tenant"]] + else: + prefix.tenant = None + prefix.validated_save() + return super().update(attrs) + + def delete(self): + """Delete Prefix in Nautobot from Prefix object.""" + try: + prefix = Prefix.objects.get(id=self.uuid) + self.diffsync.objects_to_delete["prefixes"].append(prefix) + super().delete() + return self + except Prefix.DoesNotExist as err: + self.diffsync.job.logger.warning(f"Unable to find Prefix {self.prefix} {self.uuid} for deletion. {err}") + + +class NautobotIPAddress(base.IPAddress): + """Nautobot implementation of the IPAddress DiffSync model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create IPAddress in Nautobot from IPAddress object.""" + new_ip = IPAddress( + address=f"{ids['host']}/{attrs['mask_length']}", + namespace=diffsync.namespace_map[ids["namespace"]], + status_id=diffsync.status_map["Active"], + ) + if attrs.get("tenant"): + new_ip.tenant_id = diffsync.tenant_map[attrs["tenant"]] + new_ip.custom_field_data.update({"system_of_record": "DNA Center"}) + new_ip.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + new_ip.validated_save() + diffsync.ipaddr_map[ids["host"]] = new_ip.id + return super().create(diffsync=diffsync, ids=ids, attrs=attrs) + + def update(self, attrs): + """Update IPAddress in Nautobot from IPAddress object.""" + ipaddr = IPAddress.objects.get(id=self.uuid) + if "tenant" in attrs: + if attrs.get("tenant"): + ipaddr.tenant_id = self.diffsync.tenant_map[attrs["tenant"]] + else: + ipaddr.tenant = None + ipaddr.custom_field_data.update({"system_of_record": "DNA Center"}) + ipaddr.custom_field_data.update({"ssot_last_synchronized": datetime.today().date().isoformat()}) + try: + ipaddr.validated_save() + except ValidationError as err: + self.diffsync.job.logger.warning(f"Unable to update {ipaddr}: {err}") + return super().update(attrs) + + def delete(self): + """Delete IPAddress in Nautobot from IPAddress object.""" + ipaddr = IPAddress.objects.get(id=self.uuid) + super().delete() + self.diffsync.objects_to_delete["ipaddresses"].append(ipaddr) + return self + + +class NautobotIPAddressOnInterface(base.IPAddressOnInterface): + """Nautobot implementation of DNA Center IPAddressOnInterface model.""" + + @classmethod + def create(cls, diffsync, ids, attrs): + """Create IPAddressToInterface in Nautobot from IPAddressOnInterface object.""" + new_map = IPAddressToInterface( + ip_address_id=diffsync.ipaddr_map[ids["host"]], + interface_id=diffsync.port_map[ids["device"]][ids["port"]], + ) + diffsync.objects_to_create["mappings"].append(new_map) + if attrs.get("primary"): + if ":" in ids["host"]: + diffsync.objects_to_create["primary_ip6"].append( + (diffsync.device_map[ids["device"]], diffsync.ipaddr_map[ids["host"]]) + ) + else: + diffsync.objects_to_create["primary_ip4"].append( + (diffsync.device_map[ids["device"]], diffsync.ipaddr_map[ids["host"]]) + ) + return super().create(diffsync=diffsync, 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: + mapping.interface.device.primary_ip4 = mapping.ip_address + else: + mapping.interface.device.primary_ip6 = mapping.ip_address + mapping.interface.device.validated_save() + 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.diffsync.job.logger.info( + f"Deleting IPAddress to Interface mapping between {self.host} and {self.device}'s {self.port} port." + ) + mapping.delete() + return self diff --git a/nautobot_ssot/integrations/dna_center/jobs.py b/nautobot_ssot/integrations/dna_center/jobs.py new file mode 100644 index 000000000..857305fe3 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/jobs.py @@ -0,0 +1,108 @@ +"""Jobs for DNA Center SSoT integration.""" + +from django.urls import reverse +from django.templatetags.static import static +from nautobot.extras.choices import SecretsGroupAccessTypeChoices, SecretsGroupSecretTypeChoices +from nautobot.extras.jobs import BooleanVar, ObjectVar +from nautobot.extras.models import ExternalIntegration +from nautobot.tenancy.models import Tenant +from nautobot.core.celery import register_jobs +from nautobot_ssot.jobs.base import DataSource, DataMapping +from nautobot_ssot_dna_center.diffsync.adapters import dna_center, nautobot +from nautobot_ssot_dna_center.utils.dna_center import DnaCenterClient + + +name = "DNA Center SSoT" # pylint: disable=invalid-name + + +class DnaCenterDataSource(DataSource): # pylint: disable=too-many-instance-attributes + """DNA Center SSoT Data Source.""" + + dnac = ObjectVar( + model=ExternalIntegration, + queryset=ExternalIntegration.objects.all(), + display_field="display", + required=True, + label="DNAC Instance", + ) + debug = BooleanVar(description="Enable for more verbose debug logging", default=False) + bulk_import = BooleanVar(description="Perform bulk operations when importing data", default=False) + tenant = ObjectVar(model=Tenant, label="Tenant", required=False) + + class Meta: # pylint: disable=too-few-public-methods + """Meta data for DNA Center.""" + + name = "DNA Center to Nautobot" + data_source = "DNA Center" + data_target = "Nautobot" + description = "Sync information from DNA Center to Nautobot" + data_source_icon = static("nautobot_ssot_dna_center/dna_center_logo.png") + + @classmethod + def config_information(cls): + """Dictionary describing the configuration of this DataSource.""" + return {"Instances": "Found in Extensibility -> External Integrations menu."} + + @classmethod + def data_mappings(cls): + """List describing the data mappings involved in this DataSource.""" + return ( + DataMapping("Areas", None, "Locations", reverse("dcim:location_list")), + DataMapping("Buildings", None, "Locations", reverse("dcim:location_list")), + DataMapping("Floors", None, "Locations", reverse("dcim:location_list")), + DataMapping("Devices", None, "Devices", reverse("dcim:device_list")), + DataMapping("Interfaces", None, "Interfaces", reverse("dcim:interface_list")), + DataMapping("IP Addresses", None, "IP Addresses", reverse("ipam:ipaddress_list")), + ) + + def load_source_adapter(self): + """Load data from DNA Center into DiffSync models.""" + self.logger.info(f"Loading data from {self.dnac.name}") + _sg = self.dnac.secrets_group + username = _sg.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_HTTP, + secret_type=SecretsGroupSecretTypeChoices.TYPE_USERNAME, + ) + password = _sg.get_secret_value( + access_type=SecretsGroupAccessTypeChoices.TYPE_HTTP, + secret_type=SecretsGroupSecretTypeChoices.TYPE_PASSWORD, + ) + client = DnaCenterClient( + url=self.dnac.remote_url, + username=username, + password=password, + port=self.dnac.extra_config["port"], + verify=self.dnac.verify_ssl, + ) + client.connect() + self.source_adapter = dna_center.DnaCenterAdapter(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, + dnac, + bulk_import, + tenant, + *args, + **kwargs, # pylint: disable=arguments-differ, too-many-arguments + ): + """Perform data synchronization.""" + self.dnac = dnac + self.tenant = tenant + self.debug = debug + self.bulk_import = bulk_import + self.dryrun = dryrun + self.memory_profiling = memory_profiling + super().run(dryrun=self.dryrun, memory_profiling=self.memory_profiling, *args, **kwargs) + + +jobs = [DnaCenterDataSource] +register_jobs(*jobs) diff --git a/nautobot_ssot/integrations/dna_center/signals.py b/nautobot_ssot/integrations/dna_center/signals.py new file mode 100644 index 000000000..d0c93d769 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/signals.py @@ -0,0 +1,50 @@ +"""Signals triggered when Nautobot starts to perform certain actions.""" + +from nautobot.extras.choices import CustomFieldTypeChoices + + +def nautobot_database_ready_callback(sender, *, apps, **kwargs): # pylint: disable=unused-argument, too-many-locals + """Create CustomField to note System of Record for SSoT. + + Callback function triggered by the nautobot_database_ready signal when the Nautobot database is fully ready. + """ + # pylint: disable=invalid-name + ContentType = apps.get_model("contenttypes", "ContentType") + CustomField = apps.get_model("extras", "CustomField") + LocationType = apps.get_model("dcim", "LocationType") + Device = apps.get_model("dcim", "Device") + Rack = apps.get_model("dcim", "Rack") + RackGroup = apps.get_model("dcim", "RackGroup") + Interface = apps.get_model("dcim", "Interface") + IPAddress = apps.get_model("ipam", "IPAddress") + Prefix = apps.get_model("ipam", "Prefix") + + region = LocationType.objects.update_or_create(name="Region", defaults={"nestable": True})[0] + region.content_types.add(ContentType.objects.get_for_model(Device)) + site = LocationType.objects.update_or_create(name="Site", defaults={"nestable": False, "parent": region})[0] + site.content_types.add(ContentType.objects.get_for_model(Device)) + floor = LocationType.objects.update_or_create(name="Floor", defaults={"nestable": False, "parent": site})[0] + floor.content_types.add(ContentType.objects.get_for_model(Device)) + + ver_dict = { + "key": "os_version", + "type": CustomFieldTypeChoices.TYPE_TEXT, + "label": "OS Version", + } + ver_field, _ = CustomField.objects.get_or_create(key=ver_dict["key"], defaults=ver_dict) + ver_field.content_types.add(ContentType.objects.get_for_model(Device)) + sor_cf_dict = { + "type": CustomFieldTypeChoices.TYPE_TEXT, + "key": "system_of_record", + "label": "System of Record", + } + sor_custom_field, _ = CustomField.objects.update_or_create(key=sor_cf_dict["key"], defaults=sor_cf_dict) + sync_cf_dict = { + "type": CustomFieldTypeChoices.TYPE_DATE, + "key": "ssot_last_synchronized", + "label": "Last sync from System of Record", + } + sync_custom_field, _ = CustomField.objects.update_or_create(key=sync_cf_dict["key"], defaults=sync_cf_dict) + for model in [Device, Interface, IPAddress, Prefix, Rack, RackGroup]: + sor_custom_field.content_types.add(ContentType.objects.get_for_model(model)) + sync_custom_field.content_types.add(ContentType.objects.get_for_model(model)) diff --git a/nautobot_ssot/integrations/dna_center/utils/__init__.py b/nautobot_ssot/integrations/dna_center/utils/__init__.py new file mode 100644 index 000000000..8fd6a6dee --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/utils/__init__.py @@ -0,0 +1 @@ +"""Utility functions for working with DNA Center and Nautobot.""" diff --git a/nautobot_ssot/integrations/dna_center/utils/dna_center.py b/nautobot_ssot/integrations/dna_center/utils/dna_center.py new file mode 100644 index 000000000..ee73db779 --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/utils/dna_center.py @@ -0,0 +1,243 @@ +"""Utility functions for working with DNA Center.""" + +import logging +import re +from typing import List, Tuple + +from dnacentersdk import api +from dnacentersdk.exceptions import dnacentersdkException +from netutils.constants import BASE_INTERFACES + +from nautobot_ssot_dna_center.constants import BASE_INTERFACE_MAP + +LOGGER = logging.getLogger(__name__) + + +class DnaCenterClient: + """Client for handling all interactions with DNA Center.""" + + def __init__( + self, url: str, username: str, password: str, port: int = 443, verify: bool = True + ): # pylint: disable=too-many-arguments + """Initialize instance of client.""" + self.url = url + self.port = port + self.base_url = f"{self.url}:{self.port}" + self.username = username + self.password = password + self.verify = verify + self.conn = None + + def connect(self): # pylint: disable=inconsistent-return-statements + """Connect to Cisco DNA Center.""" + try: + self.conn = api.DNACenterAPI( + base_url=self.base_url, username=self.username, password=self.password, verify=self.verify + ) + except dnacentersdkException as err: + raise dnacentersdkException(f"Unable to connect to DNA Center: {err}") from err + + def get_locations(self): + """Retrieve all location data from DNA Center. + + Returns: + list: List of Locations (Sites) from DNAC. + """ + locations, loc_data, loc_names = [], [], [] + try: + total_num_sites = self.conn.sites.get_site_count()["response"] + offset = 1 + while len(loc_data) < total_num_sites: + loc_data.extend(self.conn.sites.get_site(offset=offset)["response"]) + offset = len(loc_data) + for _, item in enumerate(loc_data): + if item["siteNameHierarchy"] not in loc_names: + loc_names.append(item["siteNameHierarchy"]) + locations.append(item) + except dnacentersdkException as err: + LOGGER.error("Unable to get site information from DNA Center. %s", err) + return locations + + @staticmethod + def find_address_and_type(info: List[dict]): + """Find Site address and type from additionalInfo dict. + + Args: + info (List[dict]): Site additionalInfo property from DNA Center. + + Returns: + tuple: Tuple of Site address and type. + """ + address = "" + site_type = "" + for element in info: + if element["nameSpace"] == "Location": + address = element["attributes"]["address"] + site_type = element["attributes"]["type"] + return (address, site_type) + + @staticmethod + def find_latitude_and_longitude(info: List[dict]): + """Find Site latitude and longitude from additionalInfo dict. + + Args: + info (List[dict]): Site additionalInfo property from DNA Center. + + Returns: + tuple: Tuple of Site latitude and longitude. + """ + latitude = "" + longitude = "" + for element in info: + if element["nameSpace"] == "Location": + latitude = element["attributes"]["latitude"] + longitude = element["attributes"]["longitude"] + return (latitude, longitude) + + def get_devices(self): + """Retrieve all Device data from DNA Center.""" + dev_list = [] + try: + total_num_devs = self.conn.devices.get_device_count()["response"] + while len(dev_list) < total_num_devs: + dev_list.extend(self.conn.devices.get_device_list(offset=len(dev_list) + 1)["response"]) + except dnacentersdkException as err: + LOGGER.error("Unable to get device information from DNA Center. %s", err) + return dev_list + + def get_device_detail(self, dev_id: str): + """Retrieve all Device data from DNA Center. + + Args: + dev_id (str): ID of device in DNAC to query for details. + + Returns: + dict: Details about specified dev_id. + """ + dev_detail = {} + try: + dev_detail = self.conn.devices.get_device_detail(search_by=dev_id, identifier="uuid")["response"] + except dnacentersdkException as err: + LOGGER.error("Unable to get device detail information from DNA Center. %s", err) + return dev_detail + + @staticmethod + def parse_site_hierarchy(location_map: dict, site_hier: str): + """Parse siteHierarchyGraphId attribute from get_device_detail response. + + Args: + location_map (dict): Dictionary mapping location ID to name, parent, and location type. + site_hier (str): The siteHierarchyGraphId field from the get_device_detail response. + + Returns: + dict: Dictionary of location hierarchy for a device. + """ + locations = site_hier.lstrip("/").rstrip("/").split("/") + loc_data = { + "areas": [], + "building": "Unassigned", + "floor": None, + } + for location in locations: + if location in location_map: + loc_type = location_map[location]["loc_type"] + loc_name = location_map[location]["name"] + if loc_type == "area": + loc_data["areas"].append(loc_name) + if loc_type == "building": + loc_data["building"] = loc_name + if loc_type == "floor": + loc_data["floor"] = loc_name + return loc_data + + def get_port_info(self, device_id: str): + """Retrieve all interfaces for specified device_id from DNAC. + + Args: + device_id (str): The ID of the Device that the Ports belong to. + + Returns: + List[dict]: List of dictionaries of information about Ports on specified device_id. + """ + ports = [] + try: + ports = self.conn.devices.get_interface_info_by_id(device_id=device_id)["response"] + except dnacentersdkException as err: + LOGGER.error("Unable to get port information from DNA Center. %s", err) + return ports + + @staticmethod + def get_port_type(port_info: dict): + """Determine port type based on portType and portName attributes. + + Args: + port_info (dict): Dictionary from DNAC with Port data. + + Returns: + str: String defining the type of port that was found. Will return "other" if unable to determine type. + """ + if port_info["portType"] == "Ethernet SVI" or port_info["portType"] == "Service Module Interface": + return "virtual" + + base_port_name = re.match("[a-zA-Z]+", port_info["portName"]) + # normalize interface name for BASE_INTERFACE_MAP + if base_port_name and BASE_INTERFACES.get(base_port_name.group()): + base_port_name = BASE_INTERFACES[base_port_name.group()] + + if port_info["portType"] == "Ethernet Port" and base_port_name in BASE_INTERFACE_MAP: + return BASE_INTERFACE_MAP[base_port_name] + return "other" + + @staticmethod + def get_port_status(port_info: dict): + """Determine port status based on admin and operational status. + + Args: + port_info (dict): Dictionary containing information about a port from DNAC. + """ + status = "Active" + if port_info["status"] == "down" and port_info["adminStatus"] == "DOWN": + status = "Maintenance" + + if port_info["status"] == "down" and port_info["adminStatus"] == "UP": + status = "Failed" + + if port_info["status"] == "up" and port_info["adminStatus"] == "DOWN": + status = "Planned" + return status + + @staticmethod + def parse_hostname_for_role(hostname_map: List[Tuple[str, str]], device_hostname: str): + """Parse device hostname from hostname_map to get Device Role. + + Args: + hostname_map (List[Tuple[str, str]]): List of tuples containing regex to compare with hostname and associated DeviceRole name. + device_hostname (str): Hostname of Device to determine role of. + + Returns: + str: Name of DeviceRole. Defaults to Unknown. + """ + device_role = "Unknown" + if hostname_map: + for entry in hostname_map: + match = re.match(pattern=entry[0], string=device_hostname) + if match: + device_role = entry[1] + return device_role + + @staticmethod + def get_model_name(models: str) -> str: + """Obtain DeviceType model from a list of models. + + Args: + models (str): String specifying DeviceType model. Potentially a list of models. + + Returns: + str: Parsed model name. If list of models, just a single model. + """ + if "," in models: + model_list = models.split(", ") + model_list = list(set(model_list)) + if len(model_list) == 1: + return model_list[0] + return models diff --git a/nautobot_ssot/integrations/dna_center/utils/nautobot.py b/nautobot_ssot/integrations/dna_center/utils/nautobot.py new file mode 100644 index 000000000..dda71d74e --- /dev/null +++ b/nautobot_ssot/integrations/dna_center/utils/nautobot.py @@ -0,0 +1,88 @@ +"""Utility functions for working with Nautobot.""" + +from uuid import UUID +from django.contrib.contenttypes.models import ContentType +from netutils.lib_mapper import ANSIBLE_LIB_MAPPER_REVERSE, NAPALM_LIB_MAPPER_REVERSE +from nautobot.dcim.models import Device, Platform +from nautobot.extras.models import Relationship, RelationshipAssociation + +try: + from nautobot_device_lifecycle_mgmt.models import SoftwareLCM + + LIFECYCLE_MGMT = True +except ImportError: + LIFECYCLE_MGMT = False + + +def verify_platform(platform_name: str, manu: UUID) -> Platform: + """Verifies Platform object exists in Nautobot. If not, creates it. + + Args: + platform_name (str): Name of platform to verify. + manu (UUID): The ID (primary key) of platform manufacturer. + + Returns: + Platform: Found or created Platform object. + """ + if ANSIBLE_LIB_MAPPER_REVERSE.get(platform_name): + _name = ANSIBLE_LIB_MAPPER_REVERSE[platform_name] + else: + _name = platform_name + if NAPALM_LIB_MAPPER_REVERSE.get(platform_name): + napalm_driver = NAPALM_LIB_MAPPER_REVERSE[platform_name] + else: + napalm_driver = platform_name + try: + platform_obj = Platform.objects.get(network_driver=platform_name) + except Platform.DoesNotExist: + platform_obj = Platform( + name=_name, manufacturer_id=manu, napalm_driver=napalm_driver[:50], network_driver=platform_name + ) + platform_obj.validated_save() + return platform_obj + + +def add_software_lcm(diffsync, platform: str, version: str): + """Add OS Version as SoftwareLCM if Device Lifecycle Plugin found. + + Args: + diffsync (DiffSyncAdapter): DiffSync adapter with Job and maps. + platform (str): Name of platform to associate version to. + version (str): The software version to be created for specified platform. + + Returns: + UUID: UUID of the OS Version that is being found or created. + """ + platform_obj = Platform.objects.get(network_driver=platform) + try: + os_ver = SoftwareLCM.objects.get(device_platform=platform_obj, version=version).id + except SoftwareLCM.DoesNotExist: + diffsync.job.logger.info(f"Creating Version {version} for {platform}.") + os_ver = SoftwareLCM( + device_platform=platform_obj, + version=version, + ) + os_ver.validated_save() + os_ver = os_ver.id + return os_ver + + +def assign_version_to_device(diffsync, device: Device, software_lcm: UUID): + """Add Relationship between Device and SoftwareLCM.""" + try: + software_relation = Relationship.objects.get(label="Software on Device") + relationship = RelationshipAssociation.objects.get(relationship=software_relation, destination_id=device.id) + diffsync.job.logger.warning( + f"Deleting Software Version Relationships for {device.name} to assign a new version." + ) + relationship.delete() + except RelationshipAssociation.DoesNotExist: + pass + new_assoc = RelationshipAssociation( + relationship=software_relation, + source_type=ContentType.objects.get_for_model(SoftwareLCM), + source_id=software_lcm, + destination_type=ContentType.objects.get_for_model(Device), + destination_id=device.id, + ) + new_assoc.validated_save() diff --git a/nautobot_ssot/integrations/infoblox/constant.py b/nautobot_ssot/integrations/infoblox/constant.py index cbf6f0908..ba3f0950e 100644 --- a/nautobot_ssot/integrations/infoblox/constant.py +++ b/nautobot_ssot/integrations/infoblox/constant.py @@ -1,4 +1,5 @@ """Constants for use with the Infoblox SSoT app.""" + from django.conf import settings diff --git a/nautobot_ssot/integrations/infoblox/diffsync/adapters/infoblox.py b/nautobot_ssot/integrations/infoblox/diffsync/adapters/infoblox.py index 2546450f5..53d02d31a 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/adapters/infoblox.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/adapters/infoblox.py @@ -1,4 +1,5 @@ """Infoblox Adapter for Infoblox integration with SSoT app.""" + import re from diffsync import DiffSync diff --git a/nautobot_ssot/integrations/infoblox/diffsync/adapters/nautobot.py b/nautobot_ssot/integrations/infoblox/diffsync/adapters/nautobot.py index 6077ff41f..682c40af2 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/adapters/nautobot.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/adapters/nautobot.py @@ -1,4 +1,5 @@ """Nautobot Adapter for Infoblox integration.""" + # pylint: disable=duplicate-code import datetime from diffsync import DiffSync diff --git a/nautobot_ssot/integrations/infoblox/diffsync/models/__init__.py b/nautobot_ssot/integrations/infoblox/diffsync/models/__init__.py index 86731aa42..15cdf49df 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/models/__init__.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/models/__init__.py @@ -1,4 +1,5 @@ """Initialize models for Nautobot and Infoblox.""" + from .nautobot import NautobotNetwork, NautobotIPAddress, NautobotVlanGroup, NautobotVlan from .infoblox import InfobloxNetwork, InfobloxIPAddress, InfobloxVLANView, InfobloxVLAN diff --git a/nautobot_ssot/integrations/infoblox/diffsync/models/base.py b/nautobot_ssot/integrations/infoblox/diffsync/models/base.py index 1221ed47b..1d3f42cc1 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/models/base.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/models/base.py @@ -1,4 +1,5 @@ """Base Shared Models for Infoblox integration with SSoT app.""" + import uuid from typing import Optional from diffsync import DiffSyncModel diff --git a/nautobot_ssot/integrations/infoblox/diffsync/models/infoblox.py b/nautobot_ssot/integrations/infoblox/diffsync/models/infoblox.py index 02bb326eb..1613488cc 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/models/infoblox.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/models/infoblox.py @@ -1,4 +1,5 @@ """Infoblox Models for Infoblox integration with SSoT app.""" + from requests.exceptions import HTTPError from nautobot_ssot.integrations.infoblox.diffsync.models.base import Network, IPAddress, Vlan, VlanView diff --git a/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py b/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py index 5e6e279f3..adb57fe5d 100644 --- a/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py +++ b/nautobot_ssot/integrations/infoblox/diffsync/models/nautobot.py @@ -1,4 +1,5 @@ """Nautobot Models for Infoblox integration with SSoT app.""" + from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.utils.text import slugify diff --git a/nautobot_ssot/integrations/infoblox/signals.py b/nautobot_ssot/integrations/infoblox/signals.py index 06c7f31c5..57667afdb 100644 --- a/nautobot_ssot/integrations/infoblox/signals.py +++ b/nautobot_ssot/integrations/infoblox/signals.py @@ -1,4 +1,5 @@ """Signal handlers for Infoblox integration.""" + # pylint: disable=duplicate-code from nautobot.core.signals import nautobot_database_ready diff --git a/nautobot_ssot/integrations/infoblox/utils/client.py b/nautobot_ssot/integrations/infoblox/utils/client.py index 2e43312f9..bae55d40a 100644 --- a/nautobot_ssot/integrations/infoblox/utils/client.py +++ b/nautobot_ssot/integrations/infoblox/utils/client.py @@ -1,7 +1,7 @@ """All interactions with infoblox.""" # pylint: disable=too-many-lines + from __future__ import annotations -import copy import json import ipaddress import logging @@ -10,6 +10,7 @@ from collections import defaultdict from typing import Optional import requests +from requests.auth import HTTPBasicAuth from requests.exceptions import HTTPError from requests.compat import urljoin from dns import reversename @@ -113,41 +114,60 @@ def __init__( raise InvalidUrlScheme(scheme=parsed_url.scheme) else: self.url = parsed_url.geturl() - self.username = username - self.password = password - self.verify_ssl = verify_ssl + self.auth = HTTPBasicAuth(username, password) self.wapi_version = wapi_version - self.cookie = cookie - if self.verify_ssl is False: + self.session = self._init_session(verify_ssl=verify_ssl, cookie=cookie) + + def _init_session(self, verify_ssl: bool, cookie: Optional[dict]) -> requests.Session: + """Initialize requests Session object that is used across all the API calls. + + Args: + verify_ssl (bool): whether to verify SSL cert for https calls + cookie (dict): optional dict with cookies to set on the Session object + + Returns: + initialized session object + """ + if verify_ssl is False: requests.packages.urllib3.disable_warnings( # pylint: disable=no-member requests.packages.urllib3.exceptions.InsecureRequestWarning # pylint: disable=no-member ) # pylint: disable=no-member self.headers = {"Content-Type": "application/json"} - self.extra_vars = {} + session = requests.Session() + if cookie and isinstance(cookie, dict): + session.cookies.update(cookie) + session.verify = verify_ssl + session.headers.update(self.headers) + session.auth = self.auth + + return session def _request(self, method, path, **kwargs): - """Return a response object after making a request to by other methods. + """Return a response object after making a request by a specified method. Args: - method (str): Request HTTP method to call with requests. + method (str): Request HTTP method to call with Session.request. path (str): URL path to call. Returns: :class:`~requests.Response`: Response from the API. """ - kwargs["verify"] = self.verify_ssl - kwargs["headers"] = self.headers api_path = f"/wapi/{self.wapi_version}/{path}" url = urljoin(self.url, api_path) - if self.cookie: - resp = requests.request( - method, url, cookies=self.cookie, timeout=PLUGIN_CFG["infoblox_request_timeout"], **kwargs - ) + if self.session.cookies.get("ibapauth"): + self.session.auth = None else: - kwargs["auth"] = requests.auth.HTTPBasicAuth(self.username, self.password) - resp = requests.request(method, url, timeout=PLUGIN_CFG["infoblox_request_timeout"], **kwargs) - self.cookie = copy.copy(resp.cookies.get_dict("ibapauth")) + self.session.auth = self.auth + + resp = self.session.request(method, url, timeout=PLUGIN_CFG["infoblox_request_timeout"], **kwargs) + # Infoblox provides meaningful error messages for error codes >= 400 + if resp.status_code >= 400: + try: + err_msg = resp.json() + except json.decoder.JSONDecodeError: + err_msg = resp.text + logger.error(err_msg) resp.raise_for_status() return resp diff --git a/nautobot_ssot/integrations/infoblox/utils/diffsync.py b/nautobot_ssot/integrations/infoblox/utils/diffsync.py index 3589b063e..df9829019 100644 --- a/nautobot_ssot/integrations/infoblox/utils/diffsync.py +++ b/nautobot_ssot/integrations/infoblox/utils/diffsync.py @@ -1,4 +1,5 @@ """Utilities for DiffSync related stuff.""" + from django.contrib.contenttypes.models import ContentType from django.utils.text import slugify from nautobot.ipam.models import IPAddress, Prefix, VLAN diff --git a/nautobot_ssot/integrations/infoblox/utils/nautobot.py b/nautobot_ssot/integrations/infoblox/utils/nautobot.py index add31c8db..f0b6a8aae 100644 --- a/nautobot_ssot/integrations/infoblox/utils/nautobot.py +++ b/nautobot_ssot/integrations/infoblox/utils/nautobot.py @@ -1,4 +1,5 @@ """Utility functions for working with Nautobot.""" + from nautobot.extras.models import Relationship from nautobot.ipam.models import Prefix diff --git a/nautobot_ssot/integrations/ipfabric/constants.py b/nautobot_ssot/integrations/ipfabric/constants.py index e490fd21f..7d8347f0b 100644 --- a/nautobot_ssot/integrations/ipfabric/constants.py +++ b/nautobot_ssot/integrations/ipfabric/constants.py @@ -1,4 +1,5 @@ """Constants used by IPFabric Integration.""" + from django.conf import settings CONFIG = settings.PLUGINS_CONFIG.get("nautobot_ssot", {}) diff --git a/nautobot_ssot/integrations/ipfabric/diffsync/__init__.py b/nautobot_ssot/integrations/ipfabric/diffsync/__init__.py index 4c6f15145..0383e526e 100644 --- a/nautobot_ssot/integrations/ipfabric/diffsync/__init__.py +++ b/nautobot_ssot/integrations/ipfabric/diffsync/__init__.py @@ -1,4 +1,5 @@ """Diffsync Utilities, Adapters and Models.""" + from .adapters_shared import DiffSyncModelAdapters __all__ = ("DiffSyncModelAdapters",) diff --git a/nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py b/nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py index 8e9ee38de..895f82a5b 100644 --- a/nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py +++ b/nautobot_ssot/integrations/ipfabric/diffsync/adapter_ipfabric.py @@ -92,9 +92,11 @@ def load_device_interfaces(self, device_model, interfaces, device_primary_ip, ne device_name=iface.get("hostname"), description=iface.get("dscr", ""), enabled=True, - mac_address=mac_to_format(iface.get("mac"), "MAC_COLON_TWO").upper() - if iface.get("mac") - else DEFAULT_INTERFACE_MAC, + mac_address=( + mac_to_format(iface.get("mac"), "MAC_COLON_TWO").upper() + if iface.get("mac") + else DEFAULT_INTERFACE_MAC + ), mtu=iface.get("mtu") if iface.get("mtu") else DEFAULT_INTERFACE_MTU, type=ipfabric_utils.convert_media_type(iface.get("media"), iface_name), mgmt_only=iface.get("mgmt_only", False), diff --git a/nautobot_ssot/integrations/ipfabric/diffsync/adapter_nautobot.py b/nautobot_ssot/integrations/ipfabric/diffsync/adapter_nautobot.py index 5ebd473eb..f97a31c39 100644 --- a/nautobot_ssot/integrations/ipfabric/diffsync/adapter_nautobot.py +++ b/nautobot_ssot/integrations/ipfabric/diffsync/adapter_nautobot.py @@ -104,9 +104,11 @@ def load_interfaces(self, device_record: Device, diffsync_device): device_name=device_record.name, description=interface_record.description if interface_record.description else None, enabled=True, - mac_address=mac_to_format(str(interface_record.mac_address), "MAC_COLON_TWO").upper() - if interface_record.mac_address - else DEFAULT_INTERFACE_MAC, + mac_address=( + mac_to_format(str(interface_record.mac_address), "MAC_COLON_TWO").upper() + if interface_record.mac_address + else DEFAULT_INTERFACE_MAC + ), subnet_mask=subnet_mask, mtu=interface_record.mtu if interface_record.mtu else DEFAULT_INTERFACE_MTU, type=interface_record.type, @@ -127,9 +129,11 @@ def load_device(self, filtered_devices: List, location): diffsync=self, name=device_record.name, model=str(device_record.device_type), - role=str(device_record.role.cf.get("ipfabric_type")) - if device_record.role.cf.get("ipfabric_type") - else device_record.role.name, + role=( + str(device_record.role.cf.get("ipfabric_type")) + if device_record.role.cf.get("ipfabric_type") + else device_record.role.name + ), location_name=device_record.location.name, vendor=str(device_record.device_type.manufacturer), status=device_record.status.name, diff --git a/nautobot_ssot/integrations/ipfabric/utilities/__init__.py b/nautobot_ssot/integrations/ipfabric/utilities/__init__.py index 7476f66f8..4b1a3eeb9 100644 --- a/nautobot_ssot/integrations/ipfabric/utilities/__init__.py +++ b/nautobot_ssot/integrations/ipfabric/utilities/__init__.py @@ -1,4 +1,5 @@ """Utilities.""" + from .nbutils import ( get_or_create_device_role_object, create_device_type_object, diff --git a/nautobot_ssot/integrations/ipfabric/utilities/test_utils.py b/nautobot_ssot/integrations/ipfabric/utilities/test_utils.py index fb672dbfc..f7ab66b56 100644 --- a/nautobot_ssot/integrations/ipfabric/utilities/test_utils.py +++ b/nautobot_ssot/integrations/ipfabric/utilities/test_utils.py @@ -1,4 +1,5 @@ """Test Utils.""" + import json from nautobot.dcim.models import Device, Location diff --git a/nautobot_ssot/integrations/ipfabric/utilities/utils.py b/nautobot_ssot/integrations/ipfabric/utilities/utils.py index 7c601ffcc..437129c0c 100644 --- a/nautobot_ssot/integrations/ipfabric/utilities/utils.py +++ b/nautobot_ssot/integrations/ipfabric/utilities/utils.py @@ -1,4 +1,5 @@ """General utils for IPFabric.""" + import re from nautobot_ssot.integrations.ipfabric.constants import DEFAULT_INTERFACE_TYPE diff --git a/nautobot_ssot/integrations/servicenow/diffsync/models.py b/nautobot_ssot/integrations/servicenow/diffsync/models.py index 490f2c601..6274c9b9b 100644 --- a/nautobot_ssot/integrations/servicenow/diffsync/models.py +++ b/nautobot_ssot/integrations/servicenow/diffsync/models.py @@ -1,4 +1,5 @@ """DiffSyncModel subclasses for Nautobot-to-ServiceNow data sync.""" + from typing import List, Optional, Union import uuid diff --git a/nautobot_ssot/integrations/servicenow/forms.py b/nautobot_ssot/integrations/servicenow/forms.py index 2ffbd99cf..81fa0f901 100644 --- a/nautobot_ssot/integrations/servicenow/forms.py +++ b/nautobot_ssot/integrations/servicenow/forms.py @@ -1,4 +1,5 @@ """User-facing forms for nautobot-ssot-servicenow.""" + from django import forms from nautobot.extras.models import SecretsGroup diff --git a/nautobot_ssot/integrations/servicenow/jobs.py b/nautobot_ssot/integrations/servicenow/jobs.py index f13fb3706..f0d9fe58b 100644 --- a/nautobot_ssot/integrations/servicenow/jobs.py +++ b/nautobot_ssot/integrations/servicenow/jobs.py @@ -1,4 +1,5 @@ """ServiceNow Data Target Job.""" + from django.core.exceptions import ObjectDoesNotExist from django.templatetags.static import static from django.urls import reverse diff --git a/nautobot_ssot/integrations/servicenow/servicenow.py b/nautobot_ssot/integrations/servicenow/servicenow.py index b154e234e..ab3d8096f 100644 --- a/nautobot_ssot/integrations/servicenow/servicenow.py +++ b/nautobot_ssot/integrations/servicenow/servicenow.py @@ -1,4 +1,5 @@ """Interactions with ServiceNow APIs.""" + import logging # from pysnow import Client diff --git a/nautobot_ssot/integrations/servicenow/urls.py b/nautobot_ssot/integrations/servicenow/urls.py index f50629e77..eb44914f1 100644 --- a/nautobot_ssot/integrations/servicenow/urls.py +++ b/nautobot_ssot/integrations/servicenow/urls.py @@ -1,4 +1,5 @@ """URL patterns for nautobot-ssot-servicenow.""" + from django.urls import path from . import views diff --git a/nautobot_ssot/integrations/servicenow/utils.py b/nautobot_ssot/integrations/servicenow/utils.py index 3b50a7677..24aeb52a9 100644 --- a/nautobot_ssot/integrations/servicenow/utils.py +++ b/nautobot_ssot/integrations/servicenow/utils.py @@ -1,4 +1,5 @@ """Utility/helper functions for nautobot-ssot-servicenow.""" + import logging from django.conf import settings diff --git a/nautobot_ssot/integrations/servicenow/views.py b/nautobot_ssot/integrations/servicenow/views.py index d155c1c4d..1571ab21c 100644 --- a/nautobot_ssot/integrations/servicenow/views.py +++ b/nautobot_ssot/integrations/servicenow/views.py @@ -1,4 +1,5 @@ """UI view classes and methods for nautobot-ssot-servicenow.""" + from django.contrib import messages from django.views.generic import UpdateView diff --git a/nautobot_ssot/integrations/utils.py b/nautobot_ssot/integrations/utils.py index 39b13e4ef..810e959ae 100644 --- a/nautobot_ssot/integrations/utils.py +++ b/nautobot_ssot/integrations/utils.py @@ -1,4 +1,5 @@ """Utility functions for nautobot_ssot integrations.""" + from importlib import import_module from pathlib import Path from types import ModuleType diff --git a/nautobot_ssot/jobs/base.py b/nautobot_ssot/jobs/base.py index 57181e881..607321046 100644 --- a/nautobot_ssot/jobs/base.py +++ b/nautobot_ssot/jobs/base.py @@ -1,4 +1,5 @@ """Base Job classes for sync workers.""" + from collections import namedtuple from datetime import datetime import tracemalloc diff --git a/nautobot_ssot/management/commands/elongate_interface_names.py b/nautobot_ssot/management/commands/elongate_interface_names.py index f562b765d..3b7141f14 100644 --- a/nautobot_ssot/management/commands/elongate_interface_names.py +++ b/nautobot_ssot/management/commands/elongate_interface_names.py @@ -1,4 +1,5 @@ """Django Management command to update DCIM.Interface names.""" + from django.core.management.base import BaseCommand from nautobot.dcim.models import Device diff --git a/nautobot_ssot/metrics.py b/nautobot_ssot/metrics.py index 0df4e8620..e345cadf8 100644 --- a/nautobot_ssot/metrics.py +++ b/nautobot_ssot/metrics.py @@ -1,4 +1,5 @@ """Nautobot SSoT framework level metrics.""" + from django.conf import settings from prometheus_client.core import GaugeMetricFamily from nautobot.extras.choices import JobResultStatusChoices diff --git a/nautobot_ssot/models.py b/nautobot_ssot/models.py index 230951f4d..711e32a71 100644 --- a/nautobot_ssot/models.py +++ b/nautobot_ssot/models.py @@ -16,6 +16,7 @@ JobResult 1<->1 Sync 1-->n SyncLogEntry """ + from datetime import timedelta from django.conf import settings diff --git a/nautobot_ssot/static/nautobot_ssot_dna_center/dna_center_logo.png b/nautobot_ssot/static/nautobot_ssot_dna_center/dna_center_logo.png new file mode 100644 index 000000000..baa109f5f Binary files /dev/null and b/nautobot_ssot/static/nautobot_ssot_dna_center/dna_center_logo.png differ diff --git a/nautobot_ssot/tables.py b/nautobot_ssot/tables.py index 41982d87d..eb953259f 100644 --- a/nautobot_ssot/tables.py +++ b/nautobot_ssot/tables.py @@ -1,4 +1,5 @@ """Data tables for Single Source of Truth (SSOT) views.""" + from django_tables2 import Column, DateTimeColumn, JSONColumn, LinkColumn, TemplateColumn from nautobot.apps.tables import BaseTable, ToggleColumn @@ -35,7 +36,7 @@ MESSAGE_SPAN = """{% if record.message %}{{ record.message }}{% else %}—{% endif %}""" -class DashboardTable(BaseTable): +class DashboardTable(BaseTable): # pylint: disable=nb-sub-class-name """Abbreviated version of SyncTable, for use with the dashboard.""" start_time = DateTimeColumn(linkify=True, short=True) @@ -48,7 +49,7 @@ class Meta(BaseTable.Meta): """Metaclass attributes of DashboardTable.""" model = Sync - fields = ["source", "target", "start_time", "status", "dry_run"] + fields = ["source", "target", "start_time", "status", "dry_run"] # pylint: disable=nb-use-fields-all order_by = ["-start_time"] @@ -104,7 +105,7 @@ class Meta(BaseTable.Meta): """Metaclass attributes of SyncTable.""" model = Sync - fields = ( + fields = ( # pylint: disable=nb-use-fields-all "pk", "source", "target", @@ -137,7 +138,7 @@ class Meta(BaseTable.Meta): order_by = ("-start_time",) -class SyncTableSingleSourceOrTarget(SyncTable): +class SyncTableSingleSourceOrTarget(SyncTable): # pylint: disable=nb-no-model-found """Subclass of SyncTable with fewer default columns.""" class Meta(SyncTable.Meta): @@ -186,7 +187,7 @@ class Meta(BaseTable.Meta): """Metaclass attributes of SyncLogEntryTable.""" model = SyncLogEntry - fields = ( + fields = ( # pylint: disable=nb-use-fields-all "pk", "timestamp", "sync", diff --git a/nautobot_ssot/tests/aci/test_api.py b/nautobot_ssot/tests/aci/test_api.py index 8dc0c8ad7..858184ee2 100644 --- a/nautobot_ssot/tests/aci/test_api.py +++ b/nautobot_ssot/tests/aci/test_api.py @@ -1,4 +1,5 @@ """Tests for API""" + # pylint: disable=import-outside-toplevel, invalid-name import unittest from unittest.mock import patch, Mock diff --git a/nautobot_ssot/tests/aristacv/fixtures/fixtures.py b/nautobot_ssot/tests/aristacv/fixtures/fixtures.py index 057b4c61c..f38f9c45b 100644 --- a/nautobot_ssot/tests/aristacv/fixtures/fixtures.py +++ b/nautobot_ssot/tests/aristacv/fixtures/fixtures.py @@ -1,4 +1,5 @@ """Test fixtures to be used with unit tests.""" + import json diff --git a/nautobot_ssot/tests/aristacv/test_cloudvision_adapter.py b/nautobot_ssot/tests/aristacv/test_cloudvision_adapter.py index 9c64bd92b..d516f5f4b 100644 --- a/nautobot_ssot/tests/aristacv/test_cloudvision_adapter.py +++ b/nautobot_ssot/tests/aristacv/test_cloudvision_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the CloudVision DiffSync adapter class.""" + import ipaddress from unittest.mock import MagicMock, patch diff --git a/nautobot_ssot/tests/aristacv/test_jobs.py b/nautobot_ssot/tests/aristacv/test_jobs.py index b3bb87ce3..9eb9d37d1 100644 --- a/nautobot_ssot/tests/aristacv/test_jobs.py +++ b/nautobot_ssot/tests/aristacv/test_jobs.py @@ -1,4 +1,5 @@ """Test CloudVision Jobs.""" + from django.test import override_settings from django.urls import reverse from nautobot.core.testing import TestCase diff --git a/nautobot_ssot/tests/aristacv/test_nautobot_adapter.py b/nautobot_ssot/tests/aristacv/test_nautobot_adapter.py index 62e9c1466..868d24785 100644 --- a/nautobot_ssot/tests/aristacv/test_nautobot_adapter.py +++ b/nautobot_ssot/tests/aristacv/test_nautobot_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the Nautoobt DiffSync adapter class.""" + from unittest.mock import MagicMock, patch from nautobot.dcim.models import Device, DeviceType, Location, LocationType, Manufacturer diff --git a/nautobot_ssot/tests/aristacv/test_utils_nautobot.py b/nautobot_ssot/tests/aristacv/test_utils_nautobot.py index 61cc3a0dd..5a5640fc4 100644 --- a/nautobot_ssot/tests/aristacv/test_utils_nautobot.py +++ b/nautobot_ssot/tests/aristacv/test_utils_nautobot.py @@ -1,4 +1,5 @@ """Tests of CloudVision utility methods.""" + from unittest import skip from unittest.mock import MagicMock, patch diff --git a/nautobot_ssot/tests/device42/unit/test_device42_adapter.py b/nautobot_ssot/tests/device42/unit/test_device42_adapter.py index cfc0d6fea..31a41b4fe 100644 --- a/nautobot_ssot/tests/device42/unit/test_device42_adapter.py +++ b/nautobot_ssot/tests/device42/unit/test_device42_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the Device42 DiffSync adapter class.""" + import json from unittest.mock import MagicMock, patch from diffsync.exceptions import ObjectAlreadyExists, ObjectNotFound diff --git a/nautobot_ssot/tests/device42/unit/test_models_nautobot_ipam.py b/nautobot_ssot/tests/device42/unit/test_models_nautobot_ipam.py new file mode 100644 index 000000000..f1e5a26e9 --- /dev/null +++ b/nautobot_ssot/tests/device42/unit/test_models_nautobot_ipam.py @@ -0,0 +1,511 @@ +"""Test DiffSync IPAM models for Nautobot.""" + +from unittest.mock import MagicMock, patch +from django.contrib.contenttypes.models import ContentType +from django.forms import ValidationError +from diffsync import DiffSync +from nautobot.core.testing import TransactionTestCase +from nautobot.dcim.models import Device, DeviceType, Interface, Location, LocationType, Manufacturer, Platform +from nautobot.extras.models import Role, Status +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Namespace, Prefix, VLAN, VRF +from nautobot_ssot.integrations.device42.diffsync.models.nautobot import ipam + + +class TestNautobotVRFGroup(TransactionTestCase): + """Test the NautobotVRFGroup class.""" + + def setUp(self): + self.diffsync = DiffSync() + self.diffsync.namespace_map = {} + self.diffsync.vrf_map = {} + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.vrf = VRF.objects.create(name="Test") + self.vrf.validated_save() + + def test_create(self): + """Validate the NautobotVRFGroup create() method creates a VRF.""" + self.vrf.delete() + ids = {"name": "Test"} + attrs = {"description": "Test VRF", "tags": ["est"], "custom_fields": {"Dept": {"key": "Dept", "value": "IT"}}} + result = ipam.NautobotVRFGroup.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, ipam.NautobotVRFGroup) + self.diffsync.job.logger.info.assert_called_once_with("Creating VRF Test.") + namespace = Namespace.objects.get(name=ids["name"]) + self.assertEqual(namespace.name, ids["name"]) + self.assertEqual(self.diffsync.namespace_map[ids["name"]], namespace.id) + vrf = VRF.objects.get(name=ids["name"]) + self.assertEqual(self.diffsync.vrf_map[ids["name"]], vrf.id) + self.assertEqual(vrf.namespace.name, ids["name"]) + self.assertEqual(list(vrf.tags.names()), attrs["tags"]) + self.assertEqual(vrf.custom_field_data["Dept"], "IT") + + def test_update(self): + """Validate the NautobotVRFGroup update() updates a VRF.""" + test_vrf = ipam.NautobotVRFGroup( + name="Test", description="Test VRF", tags=[], custom_fields={}, uuid=self.vrf.id + ) + test_vrf.diffsync = self.diffsync + update_attrs = { + "description": "Test VRF Update", + "tags": ["Test"], + "custom_fields": {"test": {"key": "test", "value": "test"}}, + } + actual = ipam.NautobotVRFGroup.update(self=test_vrf, attrs=update_attrs) + self.diffsync.job.logger.info.assert_called_once_with("Updating VRF Test.") + self.vrf.refresh_from_db() + self.assertEqual(self.vrf.description, update_attrs["description"]) + self.assertEqual(self.vrf.custom_field_data["test"], "test") + self.assertEqual(actual, test_vrf) + self.assertEqual(self.vrf.description, "Test VRF Update") + self.assertEqual(list(self.vrf.tags.names()), update_attrs["tags"]) + self.assertEqual(self.vrf.custom_field_data["test"], "test") + + def test_update_clear_tags(self): + """Validate the NautobotVRFGroup.update() clears tags.""" + test_vrf = ipam.NautobotVRFGroup(name="Test", description="", tags=[], custom_fields={}, uuid=self.vrf.id) + test_vrf.diffsync = self.diffsync + update_attrs = { + "tags": [], + } + result = test_vrf.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotVRFGroup) + self.vrf.refresh_from_db() + self.assertEqual(list(self.vrf.tags.names()), []) + + @patch( + "nautobot_ssot.integrations.device42.diffsync.models.nautobot.ipam.PLUGIN_CFG", + {"device42_delete_on_sync": True}, + ) + @patch("nautobot_ssot.integrations.device42.diffsync.models.nautobot.ipam.OrmVRF.objects.get") + def test_delete(self, mock_vrf): + """Validate the NautobotVRFGroup delete() deletes a VRF.""" + vrf_group = ipam.NautobotVRFGroup( + name="Test", description=None, tags=None, custom_fields=None, uuid=self.vrf.id + ) + vrf_group.diffsync = self.diffsync + mock_vrf.return_value = self.vrf + self.diffsync.objects_to_delete = {"vrf": []} + + vrf_group.delete() + + self.diffsync.job.logger.info.assert_called_once_with("VRF Test will be deleted.") + self.assertEqual(len(self.diffsync.objects_to_delete["vrf"]), 1) + self.assertEqual(self.diffsync.objects_to_delete["vrf"][0].id, self.vrf.id) + + +class TestNautobotSubnet(TransactionTestCase): + """Test the NautobotSubnet class.""" + + def setUp(self): + super().setUp() + self.status_active = Status.objects.get(name="Active") + self.test_ns = Namespace.objects.get_or_create(name="Test")[0] + self.test_vrf = VRF.objects.get_or_create(name="Test", namespace=self.test_ns)[0] + self.prefix = Prefix.objects.create(prefix="10.0.0.0/24", namespace=self.test_ns, status=self.status_active) + self.diffsync = DiffSync() + self.diffsync.namespace_map = {"Test": self.test_ns.id} + self.diffsync.vrf_map = {"Test": self.test_vrf.id} + self.diffsync.status_map = {"Active": self.status_active.id} + self.diffsync.prefix_map = {} + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + + def test_create(self): + """Validate the NautobotSubnet create() method creates a Prefix.""" + self.prefix.delete() + ids = {"network": "10.0.0.0", "mask_bits": 24, "vrf": "Test"} + attrs = {"description": "", "tags": ["Test"], "custom_fields": {"Test": {"key": "Test", "value": "test"}}} + result = ipam.NautobotSubnet.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, ipam.NautobotSubnet) + self.diffsync.job.logger.info.assert_called_once_with("Creating Prefix 10.0.0.0/24 in VRF Test.") + subnet = Prefix.objects.get(prefix=f"{ids['network']}/{ids['mask_bits']}", namespace=self.test_ns) + self.assertEqual(str(subnet.prefix), f"{ids['network']}/{ids['mask_bits']}") + self.assertEqual(self.diffsync.prefix_map["Test"][f"{ids['network']}/{ids['mask_bits']}"], subnet.id) + self.assertEqual(subnet.vrfs.all().first(), self.test_vrf) + self.assertEqual(list(subnet.tags.names()), attrs["tags"]) + self.assertEqual(subnet.custom_field_data["Test"], "test") + + def test_create_container_type(self): + """Validate the NautobotSubnet.create() functionality with setting Prefix to container type.""" + self.prefix.delete() + ids = {"network": "0.0.0.0", "mask_bits": 0, "vrf": "Test"} # nosec + attrs = {"description": "", "tags": [], "custom_fields": {}} + result = ipam.NautobotSubnet.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, ipam.NautobotSubnet) + subnet = Prefix.objects.get(prefix=f"{ids['network']}/{ids['mask_bits']}", namespace=self.test_ns) + self.assertEqual(subnet.type, "container") + + def test_update(self): + """Validate the NautobotSubnet update() method updates a Prefix.""" + test_pf = ipam.NautobotSubnet( + network="10.0.0.0", + mask_bits=24, + description=None, + vrf="Test", + tags=[], + custom_fields={}, + uuid=self.prefix.id, + ) + test_pf.diffsync = self.diffsync + update_attrs = { + "description": "Test Prefix", + "tags": ["test"], + "custom_fields": {"test": {"key": "test", "value": "test"}}, + } + actual = ipam.NautobotSubnet.update(self=test_pf, attrs=update_attrs) + self.diffsync.job.logger.info.assert_called_once_with("Updating Prefix 10.0.0.0/24.") + self.prefix.refresh_from_db() + self.assertEqual(self.prefix.description, "Test Prefix") + self.assertEqual(actual, test_pf) + + @patch( + "nautobot_ssot.integrations.device42.diffsync.models.nautobot.ipam.PLUGIN_CFG", + {"device42_delete_on_sync": True}, + ) + @patch("nautobot_ssot.integrations.device42.diffsync.models.nautobot.ipam.OrmPrefix.objects.get") + def test_delete(self, mock_subnet): + """Validate the NautobotVRFGroup delete() deletes a Prefix.""" + test_pf = ipam.NautobotSubnet( + network="10.0.0.0", + mask_bits=24, + description=None, + vrf="Test", + tags=None, + custom_fields=None, + uuid=self.prefix.id, + ) + test_pf.diffsync = self.diffsync + mock_subnet.return_value = self.prefix + self.diffsync.objects_to_delete = {"subnet": []} + + test_pf.delete() + + self.diffsync.job.logger.info.assert_called_once_with("Prefix 10.0.0.0/24 will be deleted.") + self.assertEqual(len(self.diffsync.objects_to_delete["subnet"]), 1) + self.assertEqual(self.diffsync.objects_to_delete["subnet"][0].id, self.prefix.id) + + +class TestNautobotIPAddress(TransactionTestCase): # pylint: disable=too-many-instance-attributes + """Test the NautobotIPAddress class.""" + + def __init__(self, *args, **kwargs): + """Initialize shared variables.""" + super().__init__(*args, **kwargs) + self.addr = None + + def setUp(self): + super().setUp() + self.status_active = Status.objects.get(name="Active") + status_reserved = Status.objects.get(name="Reserved") + loc_type = LocationType.objects.get_or_create(name="Site")[0] + loc_type.content_types.add(ContentType.objects.get_for_model(Device)) + loc = Location.objects.get_or_create(name="Test Site", location_type=loc_type, status=self.status_active)[0] + cisco_manu = Manufacturer.objects.get_or_create(name="Cisco")[0] + csr1000v = DeviceType.objects.get_or_create(model="CSR1000v", manufacturer=cisco_manu)[0] + ios_platform = Platform.objects.create(name="Cisco IOS", manufacturer=cisco_manu) + router_role = Role.objects.create(name="Router") + router_role.content_types.add(ContentType.objects.get_for_model(Device)) + self.test_dev = Device.objects.create( + name="Test Device", + device_type=csr1000v, + location=loc, + platform=ios_platform, + role=router_role, + status=self.status_active, + ) + self.test_dev2 = Device.objects.create( + name="Device2", + device_type=csr1000v, + location=loc, + platform=ios_platform, + role=router_role, + status=self.status_active, + ) + self.dev_eth0 = Interface.objects.create( + name="eth0", type="virtual", device=self.test_dev, status=self.status_active, mgmt_only=True + ) + self.dev2_eth0 = Interface.objects.create( + name="eth0", type="virtual", device=self.test_dev2, status=self.status_active, mgmt_only=True + ) + self.dev2_mgmt = Interface.objects.create( + name="mgmt0", type="virtual", device=self.test_dev2, status=self.status_active, mgmt_only=True + ) + self.test_ns = Namespace.objects.get_or_create(name="Test")[0] + self.prefix = Prefix.objects.create( + prefix="10.0.0.0/24", + location=loc, + namespace=self.test_ns, + status=self.status_active, + ) + self.ids = {"address": "10.0.0.1/24", "subnet": "10.0.0.0/24"} + self.attrs = { + "namespace": "Test", + "available": False, + "label": "Test", + "device": "Test Device", + "interface": "eth0", + "primary": True, + "tags": [], + "custom_fields": {}, + } + + self.diffsync = DiffSync() + self.diffsync.objects_to_create = {"ports": []} + self.diffsync.namespace_map = {"Test": self.test_ns.id} + self.diffsync.status_map = {"Active": self.status_active.id, "Reserved": status_reserved.id} + self.diffsync.prefix_map = {"10.0.0.0/24": self.prefix.id} + self.diffsync.device_map = {"Test Device": self.test_dev.id} + self.diffsync.port_map = { + "Test Device": {"eth0": self.dev_eth0.id}, + "Device2": {"mgmt0": self.dev2_mgmt.id, "eth0": self.dev2_eth0.id}, + } + self.diffsync.ipaddr_map = {} + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.mock_addr = ipam.NautobotIPAddress(**self.ids, **self.attrs) + self.mock_addr.diffsync = self.diffsync + + def test_create_with_existing_interface(self): + """Validate the NautobotIPAddress.create() functionality with existing Interface.""" + result = self.mock_addr.create(self.diffsync, self.ids, self.attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.diffsync.job.logger.info.assert_called_once_with("Creating IPAddress 10.0.0.1/24.") + ipaddr = IPAddress.objects.get(address=self.ids["address"]) + self.assertEqual(ipaddr.parent, self.prefix) + self.assertEqual(str(ipaddr.address), self.ids["address"]) + ipaddr_to_intf = IPAddressToInterface(ip_address=ipaddr, interface=self.dev_eth0) + self.assertEqual(ipaddr_to_intf.interface, self.dev_eth0) + self.assertEqual(self.diffsync.ipaddr_map["Test"][self.ids["address"]], ipaddr.id) + self.test_dev.refresh_from_db() + self.assertEqual(self.test_dev.primary_ip4, ipaddr) + + def test_create_with_missing_prefix(self): + """Validate the NautobotIPAddress.create() functionality with missing Prefix.""" + self.prefix.delete() + self.diffsync.job.logger.error = MagicMock() + result = self.mock_addr.create(self.diffsync, self.ids, self.attrs) + self.diffsync.job.logger.error.assert_called_once_with( + "Unable to find prefix 10.0.0.0/24 to create IPAddress 10.0.0.1/24 for." + ) + self.assertIsNone(result) + + def test_create_with_missing_interface(self): + """Validate the NautobotIPAddress.create() functionality with missing Interface.""" + self.diffsync.port_map = {} + self.diffsync.job.logger.debug = MagicMock() + result = self.mock_addr.create(self.diffsync, self.ids, self.attrs) + self.diffsync.job.logger.debug.assert_called_once_with("Unable to find Interface eth0 for Test Device.") + self.assertIsInstance(result, ipam.NautobotIPAddress) + + def create_mock_ipaddress_and_assign(self): + """Create IPAddress from mock_addr object and assign ID from IPAddress object that's created.""" + self.mock_addr.create(diffsync=self.diffsync, ids=self.ids, attrs=self.attrs) + self.addr = IPAddress.objects.get(address="10.0.0.1/24") + self.mock_addr.uuid = self.addr.id + + def test_update_changing_available(self): + """Validate the NautobotIPAddress.update() functionality with changing available status.""" + self.create_mock_ipaddress_and_assign() + update_attrs = {"available": True} + self.mock_addr.update(attrs=update_attrs) + self.addr.refresh_from_db() + self.assertEqual(self.addr.status, self.status_active) + + def test_update_changing_label(self): + """Validate the NautobotIPAddress.update() functionality with changing label.""" + self.create_mock_ipaddress_and_assign() + update_attrs = {"label": "Test Update"} + ipam.NautobotIPAddress.update(self=self.mock_addr, attrs=update_attrs) + self.addr.refresh_from_db() + self.assertEqual(self.addr.description, update_attrs["label"]) + + def test_update_changing_device_and_interface(self): + """Validate the NautobotIPAddress.update() functionality with changing Device and Interface.""" + self.create_mock_ipaddress_and_assign() + update_attrs = { + "device": "Device2", + "interface": "mgmt0", + "primary": True, + } + result = ipam.NautobotIPAddress.update(self=self.mock_addr, attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.test_dev2.refresh_from_db() + self.assertEqual(self.test_dev2.primary_ip4, self.addr) + ip_to_intfs = IPAddressToInterface.objects.filter(ip_address=self.addr, interface=self.dev2_mgmt) + self.assertEqual(len(ip_to_intfs), 1) + + def test_update_changing_device(self): + """Validate the NautobotIPAddress.update() functionality with changing Device.""" + self.create_mock_ipaddress_and_assign() + update_attrs = {"device": "Device2"} + result = self.mock_addr.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.addr.refresh_from_db() + self.test_dev2.refresh_from_db() + self.assertEqual(self.test_dev2.primary_ip4, self.addr) + ip_to_intf = IPAddressToInterface.objects.filter(ip_address=self.addr, interface=self.dev2_eth0) + self.assertEqual(len(ip_to_intf), 1) + + def test_update_changing_interface(self): + """Validate the NautobotIPAddress.update() functionality with changing Interface.""" + self.mock_addr.device = "Device2" + self.create_mock_ipaddress_and_assign() + + update_attrs = {"interface": "mgmt0"} + result = self.mock_addr.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.addr.refresh_from_db() + self.dev2_mgmt.refresh_from_db() + self.assertEqual(self.addr.interfaces.first(), self.dev2_mgmt) + + def test_update_changing_primary(self): + """Validate the NautobotIPAddress.update() functionality with making an IPAddress primary.""" + self.mock_addr.primary = False + self.create_mock_ipaddress_and_assign() + + update_attrs = {"primary": True} + result = self.mock_addr.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.addr.refresh_from_db() + self.test_dev.refresh_from_db() + self.assertEqual(self.test_dev.primary_ip4, self.addr) + + def test_update_changing_tags(self): + """Validate the NautobotIPAddress.update() functionality with updating Tags on IPAddress.""" + self.create_mock_ipaddress_and_assign() + + update_attrs = {"tags": ["Test", "Test2"]} + result = self.mock_addr.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.addr.refresh_from_db() + self.assertEqual(list(self.addr.tags.names()), update_attrs["tags"]) + + def test_update_changing_custom_fields(self): + """Validate the NautobotIPAddress.update() functionality with changing CustomFields on IPAddress.""" + self.create_mock_ipaddress_and_assign() + + update_attrs = {"custom_fields": {"New CF": {"key": "New CF", "value": "Test"}}} + result = self.mock_addr.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotIPAddress) + self.addr.refresh_from_db() + self.assertEqual(self.addr.custom_field_data["New_CF"], "Test") + + @patch("nautobot_ssot.integrations.device42.diffsync.models.nautobot.ipam.OrmIPAddress.objects.get") + def test_update_handling_validation_error(self, mock_ip_get): + """Validate how the NautobotIPAddress.update() handles a ValidationError.""" + mock_ip = MagicMock() + mock_ip.address = "10.0.0.1/24" + self.mock_addr.primary = False + mock_ip.validated_save = MagicMock() + mock_ip.validated_save.side_effect = ValidationError(message="Error") + mock_ip_get.return_value = mock_ip + self.diffsync.job.logger.warning = MagicMock() + result = self.mock_addr.update(attrs={}) + self.assertIsNone(result) + self.diffsync.job.logger.warning.assert_called_once_with( + "Unable to update IP Address 10.0.0.1/24 with {}. ['Error']" + ) + + +class TestNautobotVLAN(TransactionTestCase): + """Test the NautobotVLAN class.""" + + def __init__(self, *args, **kwargs): + """Initialize shared variables.""" + super().__init__(*args, **kwargs) + self.vlan = None + + def setUp(self): + super().setUp() + self.status_active = Status.objects.get(name="Active") + + site_type = LocationType.objects.get(name="Site") + site_type.content_types.add(ContentType.objects.get_for_model(Device)) + + self.test_site = Location.objects.create(name="HQ", location_type=site_type, status=self.status_active) + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.diffsync.status_map = {"Active": self.status_active.id} + self.diffsync.site_map = {"HQ": self.test_site.id} + self.diffsync.vlan_map = {"HQ": {}} + self.ids = { + "vlan_id": 1, + "building": None, + } + self.attrs = { + "name": "Test", + "description": "Test VLAN", + "tags": [], + "custom_fields": {}, + } + self.mock_vlan = ipam.NautobotVLAN(**self.ids, **self.attrs) + self.mock_vlan.diffsync = self.diffsync + + def test_create_with_undefined_building(self): + """Validate the NautobotVLAN.create() functionality with an undefined building.""" + self.diffsync.site_map = {} + result = self.mock_vlan.create(diffsync=self.diffsync, ids=self.ids, attrs=self.attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + self.diffsync.job.logger.info.assert_called_once_with("Creating VLAN 1 Test for Global") + vlan = VLAN.objects.get(vid=1) + self.assertIsNone(vlan.location) + self.assertEqual(vlan.name, self.attrs["name"]) + self.assertEqual(vlan.description, self.attrs["description"]) + self.assertEqual(self.diffsync.vlan_map["Global"][1], vlan.id) + + def test_create_with_defined_building(self): + """Validate the NautobotVLAN.create() functionality with a defined building.""" + self.ids["building"] = "HQ" + result = self.mock_vlan.create(diffsync=self.diffsync, ids=self.ids, attrs=self.attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + self.diffsync.job.logger.info.assert_called_once_with("Creating VLAN 1 Test for HQ") + vlan = VLAN.objects.get(vid=1) + self.assertEqual(vlan.location, self.test_site) + self.assertEqual(vlan.name, self.attrs["name"]) + self.assertEqual(vlan.description, self.attrs["description"]) + self.assertEqual(self.diffsync.vlan_map["HQ"][1], vlan.id) + + def create_mock_vlan_and_assign(self): + """Create IPAddress from mock_addr object and assign ID from IPAddress object that's created.""" + self.mock_vlan.create(diffsync=self.diffsync, ids=self.ids, attrs=self.attrs) + self.vlan = VLAN.objects.get(vid=1) + self.mock_vlan.uuid = self.vlan.id + + def test_update_vlan_name(self): + """Validate the NautobotVLAN.update() functionality with a new VLAN name.""" + self.create_mock_vlan_and_assign() + update_attrs = {"name": "Test2"} + result = self.mock_vlan.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + self.diffsync.job.logger.info.assert_called_with("Updating VLAN Test 1 for Global.") + vlan = VLAN.objects.get(vid=1) + self.assertEqual(vlan.name, "Test2") + + def test_update_vlan_desscription(self): + """Validate the NautobotVLAN.update() functionality with a new description.""" + self.create_mock_vlan_and_assign() + update_attrs = {"description": "DMZ VLAN"} + result = self.mock_vlan.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + vlan = VLAN.objects.get(vid=1) + self.assertEqual(vlan.description, "DMZ VLAN") + + def test_update_vlan_custom_fields(self): + """Validate the NautobotVLAN.update() functionality with adding CustomFields.""" + self.create_mock_vlan_and_assign() + update_attrs = {"custom_fields": {"Test": {"key": "Test", "value": "test"}}} + result = self.mock_vlan.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + vlan = VLAN.objects.get(vid=1) + self.assertEqual(vlan.custom_field_data["Test"], "test") + + def test_update_vlan_tags(self): + """Validate the NautobotVLAN.update() functionality with adding tags.""" + self.create_mock_vlan_and_assign() + update_attrs = {"tags": ["Test", "Test2"]} + result = self.mock_vlan.update(attrs=update_attrs) + self.assertIsInstance(result, ipam.NautobotVLAN) + vlan = VLAN.objects.get(vid=1) + self.assertEqual(list(vlan.tags.names()), update_attrs["tags"]) diff --git a/nautobot_ssot/tests/device42/unit/test_utils_nautobot.py b/nautobot_ssot/tests/device42/unit/test_utils_nautobot.py index d91cdb1cd..087fb16a7 100644 --- a/nautobot_ssot/tests/device42/unit/test_utils_nautobot.py +++ b/nautobot_ssot/tests/device42/unit/test_utils_nautobot.py @@ -1,4 +1,5 @@ """Tests of Nautobot utility methods.""" + from uuid import UUID from unittest.mock import MagicMock, patch from diffsync.exceptions import ObjectNotFound diff --git a/nautobot_ssot/tests/dna_center/__init__.py b/nautobot_ssot/tests/dna_center/__init__.py new file mode 100644 index 000000000..ebe4cc44f --- /dev/null +++ b/nautobot_ssot/tests/dna_center/__init__.py @@ -0,0 +1 @@ +"""Unit tests for nautobot_ssot_dna_center plugin.""" diff --git a/nautobot_ssot/tests/dna_center/fixtures.py b/nautobot_ssot/tests/dna_center/fixtures.py new file mode 100644 index 000000000..21d1efbe8 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures.py @@ -0,0 +1,28 @@ +"""Create fixtures for tests.""" + +import json + + +def load_json(path): + """Load a json file.""" + with open(path, encoding="utf-8") as file: + return json.loads(file.read()) + + +LOCATION_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_locations.json") +EXPECTED_DNAC_LOCATION_MAP = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_dnac_location_map.json") +EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL = load_json( + path="./nautobot_ssot_dna_center/tests/fixtures/expected_dnac_location_map_wo_global.json" +) +RECV_LOCATION_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_locations_recv.json") +DEVICE_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_devices.json") +RECV_DEVICE_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_devices_recv.json") +DEVICE_DETAIL_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_device_detail.json") +RECV_DEVICE_DETAIL_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_device_detail_recv.json") +PORT_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_port_info.json") +RECV_PORT_FIXTURE = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/get_port_info_recv.json") + +EXPECTED_AREAS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_areas.json") +EXPECTED_AREAS_WO_GLOBAL = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_areas_wo_global.json") +EXPECTED_BUILDINGS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_buildings.json") +EXPECTED_FLOORS = load_json(path="./nautobot_ssot_dna_center/tests/fixtures/expected_floors.json") diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_areas.json b/nautobot_ssot/tests/dna_center/fixtures/expected_areas.json new file mode 100644 index 000000000..6cc27c5b4 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_areas.json @@ -0,0 +1,27 @@ +[ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_areas_wo_global.json b/nautobot_ssot/tests/dna_center/fixtures/expected_areas_wo_global.json new file mode 100644 index 000000000..82ac71770 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_areas_wo_global.json @@ -0,0 +1,19 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_buildings.json b/nautobot_ssot/tests/dna_center/fixtures/expected_buildings.json new file mode 100644 index 000000000..ac16ff183 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_buildings.json @@ -0,0 +1,44 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map.json b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map.json new file mode 100644 index 000000000..44ac44d7b --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map.json @@ -0,0 +1,32 @@ +{ + "9e5f9fc2-032e-45e8-994c-4a00629648e8": { + "name": "Global", + "loc_type": "area", + "parent": null + }, + "49aa97a7-5d45-4303-89dd-f76dfbfc624a": { + "name": "Floor1", + "loc_type": "area", + "parent": null + }, + "5c59e37a-f12d-4e84-a085-ac5c02f240d4": { + "name": "Building1", + "loc_type": "area", + "parent": null + }, + "3f07768d-6b5c-4b4d-8577-29f765bd49c9": { + "name": "NY", + "loc_type": "area", + "parent": null + }, + "aa197d0e-75e2-4d46-bf51-97781931d034": { + "name": "DC1", + "loc_type": "area", + "parent": null + }, + "0ca6155d-207d-4760-961a-7e49149a684a": { + "name": "Main Floor", + "loc_type": "area", + "parent": null + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map_wo_global.json b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map_wo_global.json new file mode 100644 index 000000000..a14247d27 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_dnac_location_map_wo_global.json @@ -0,0 +1,27 @@ +{ + "49aa97a7-5d45-4303-89dd-f76dfbfc624a": { + "name": "Floor1", + "loc_type": "area", + "parent": null + }, + "5c59e37a-f12d-4e84-a085-ac5c02f240d4": { + "name": "Building1", + "loc_type": "area", + "parent": null + }, + "3f07768d-6b5c-4b4d-8577-29f765bd49c9": { + "name": "NY", + "loc_type": "area", + "parent": null + }, + "aa197d0e-75e2-4d46-bf51-97781931d034": { + "name": "DC1", + "loc_type": "area", + "parent": null + }, + "0ca6155d-207d-4760-961a-7e49149a684a": { + "name": "Main Floor", + "loc_type": "area", + "parent": null + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/expected_floors.json b/nautobot_ssot/tests/dna_center/fixtures/expected_floors.json new file mode 100644 index 000000000..2685b8204 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/expected_floors.json @@ -0,0 +1,94 @@ +[ + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_device_detail.json b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail.json new file mode 100644 index 000000000..06f6b4f7b --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail.json @@ -0,0 +1,32 @@ +{ + "collectionStatus": "", + "communicationState": "UNREACHABLE", + "cpuScore": -1, + "deviceGroupHierarchyId": "/d47e8608-46fa-4a02-93b1-da92a5ff6c22/56ba076d-0820-4d31-8127-85f5de26962b/", + "deviceSeries": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "haStatus": "Non-redundant", + "ip_addr_managementIpAddr": "10.10.20.80", + "lastBootTime": 1668346366541, + "location": "Global/NY/Building1/Floor1", + "macAddress": "70:01:B5:5D:1B:00", + "maintenanceMode": false, + "managementIpAddr": "10.10.20.80", + "memoryScore": -1, + "nwDeviceFamily": "Switches and Hubs", + "nwDeviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "nwDeviceName": "spine1.abc.in", + "nwDeviceRole": "CORE", + "nwDeviceType": "Cisco Catalyst38xx stack-able ethernet switch", + "osType": "IOS-XE", + "overallHealth": -2, + "platformId": "WS-C3850-24P-L", + "ringStatus": false, + "serialNumber": "FCW2212D05S", + "siteHierarchyGraphId": "/9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a/", + "softwareVersion": "16.12.3", + "stackType": "NA", + "tagIdList": [ + "lan_access_9300" + ], + "timestamp": 1676317680000 +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_device_detail_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail_recv.json new file mode 100644 index 000000000..3b1c048e5 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_device_detail_recv.json @@ -0,0 +1,34 @@ +{ + "response": { + "collectionStatus": "", + "communicationState": "UNREACHABLE", + "cpuScore": -1, + "deviceGroupHierarchyId": "/d47e8608-46fa-4a02-93b1-da92a5ff6c22/56ba076d-0820-4d31-8127-85f5de26962b/", + "deviceSeries": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "haStatus": "Non-redundant", + "ip_addr_managementIpAddr": "10.10.20.80", + "lastBootTime": 1668346366541, + "location": "Global/NY/Building1/Floor1", + "macAddress": "70:01:B5:5D:1B:00", + "maintenanceMode": false, + "managementIpAddr": "10.10.20.80", + "memoryScore": -1, + "nwDeviceFamily": "Switches and Hubs", + "nwDeviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "nwDeviceName": "spine1.abc.in", + "nwDeviceRole": "CORE", + "nwDeviceType": "Cisco Catalyst38xx stack-able ethernet switch", + "osType": "IOS-XE", + "overallHealth": -2, + "platformId": "WS-C3850-24P-L", + "ringStatus": false, + "serialNumber": "FCW2212D05S", + "siteHierarchyGraphId": "/9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a/", + "softwareVersion": "16.12.3", + "stackType": "NA", + "tagIdList": [ + "lan_access_9300" + ], + "timestamp": 1676317680000 + } +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_devices.json b/nautobot_ssot/tests/dna_center/fixtures/get_devices.json new file mode 100644 index 000000000..54b7273ef --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_devices.json @@ -0,0 +1,190 @@ +[ + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-12-31 12:01:05", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf1.abc.inc", + "id": "d354c924-f8ac-425f-b167-999f157e35e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "d354c924-f8ac-425f-b167-999f157e35e8", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366371, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "00:72:78:54:d1:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.81", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0VK", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "94 days, 10:46:37.35", + "uptimeSeconds": 8163651, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:20:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf2.abc.inc", + "id": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366362, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "50:61:bf:ec:07:80", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.82", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0UZ", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "91 days, 11:22:03.89", + "uptimeSeconds": 7906611, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:32:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.12.3, RELEASE SOFTWARE (fc5) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2020 by Cisco Systems, Inc. Compiled Mon 09-Mar-20 18:", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "spine1.abc.in", + "id": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366428, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "WS-C3850-24P-L", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "CORE", + "roleSource": "MANUAL", + "serialNumber": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.12.3", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst38xx stack-able ethernet switch", + "upTime": "91 days, 11:10:06.50", + "uptimeSeconds": 7905891, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "api.meraki.com", + "bootDateTime": null, + "collectionInterval": "NA", + "collectionStatus": "Unreachable", + "description": "MR42", + "deviceSupportLevel": "Supported", + "errorCode": "MERAKI-UNREACHED", + "errorDescription": "NCIM12014: The Meraki device or Meraki dashboard is unreachable. For connectivity issues of Meraki dashboard please ensure the API key is correct. The collection status of the device/dashboard would be updated in the next resync of Meraki dashboard if the connectivity issue is recovered and/or the API key is corrected.", + "family": "Meraki Access Point", + "hostname": "", + "id": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "instanceTenantId": "6df67d101bd46e119c129e91", + "instanceUuid": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "interfaceCount": "0", + "inventoryStatusDetail": "NA", + "lastUpdateTime": 1681833374231, + "lastUpdated": "2022-12-03 10:32:09", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "99:26:55:bb:56:42", + "managedAtleastOnce": false, + "managementIpAddress": "10.10.10.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "MR42", + "reachabilityFailureReason": "NA", + "reachabilityStatus": "Unreachable", + "role": "UNKNOWN", + "roleSource": "MANUAL", + "serialNumber": "R3JE-OYG4-RCDE", + "series": "Meraki Access Point", + "snmpContact": "", + "snmpLocation": null, + "softwareType": null, + "softwareVersion": null, + "tagCount": "0", + "tunnelUdpPort": null, + "type": "MR42", + "upTime": null, + "uptimeSeconds": -1, + "waasDeviceMode": null + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_devices_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_devices_recv.json new file mode 100644 index 000000000..d0f6a55e8 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_devices_recv.json @@ -0,0 +1,192 @@ +{ + "response": [ + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-12-31 12:01:05", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf1.abc.inc", + "id": "d354c924-f8ac-425f-b167-999f157e35e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "d354c924-f8ac-425f-b167-999f157e35e8", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366371, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "00:72:78:54:d1:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.81", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0VK", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "94 days, 10:46:37.35", + "uptimeSeconds": 8163651, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:20:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Everest], Catalyst L3 Switch Software (CAT9K_IOSXE), Version 16.6.4a, RELEASE SOFTWARE (fc3) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Fri 26-Oct-18 18:15 by mcpre", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "leaf2.abc.inc", + "id": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1c5f3896-9cac-40f8-85b3-64d2ae38f171", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366362, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "50:61:bf:ec:07:80", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.82", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "C9300-48U", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "ACCESS", + "roleSource": "AUTO", + "serialNumber": "FCW2214L0UZ", + "series": "Cisco Catalyst 9300 Series Switches", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.6.4a", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst 9300 Switch", + "upTime": "91 days, 11:22:03.89", + "uptimeSeconds": 7906611, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "", + "bootDateTime": "2022-11-09 13:32:46", + "collectionInterval": "Global Default", + "collectionStatus": "Partial Collection Failure", + "description": "Cisco IOS Software [Gibraltar], Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 16.12.3, RELEASE SOFTWARE (fc5) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2020 by Cisco Systems, Inc. Compiled Mon 09-Mar-20 18:", + "deviceSupportLevel": "Supported", + "errorCode": "DEV-UNREACHED", + "errorDescription": "NCIM12013: SNMP timeouts are occurring with this device. Either the SNMP credentials are not correctly provided to Cisco DNA Center or the device is responding slow and SNMP timeout is low. If it’s a timeout issue, Cisco DNA Center will attempt to progressively adjust the timeout in subsequent collection cycles to get device to managed state. User can also run discovery again only for this device using the discovery feature after adjusting the timeout and SNMP credentials as required. Or user can update the timeout and SNMP credentials as required using update credentials.", + "family": "Switches and Hubs", + "hostname": "spine1.abc.in", + "id": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "interfaceCount": "0", + "inventoryStatusDetail": "", + "lastUpdateTime": 1675903366428, + "lastUpdated": "2023-02-09 00:42:46", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedAtleastOnce": true, + "managementIpAddress": "10.10.20.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "WS-C3850-24P-L", + "reachabilityFailureReason": "SNMP Connectivity Failed", + "reachabilityStatus": "Unreachable", + "role": "CORE", + "roleSource": "MANUAL", + "serialNumber": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "snmpContact": "", + "snmpLocation": "", + "softwareType": "IOS-XE", + "softwareVersion": "16.12.3", + "tagCount": "0", + "tunnelUdpPort": null, + "type": "Cisco Catalyst38xx stack-able ethernet switch", + "upTime": "91 days, 11:10:06.50", + "uptimeSeconds": 7905891, + "waasDeviceMode": null + }, + { + "apEthernetMacAddress": null, + "apManagerInterfaceIp": "", + "associatedWlcIp": "api.meraki.com", + "bootDateTime": null, + "collectionInterval": "NA", + "collectionStatus": "Unreachable", + "description": "MR42", + "deviceSupportLevel": "Supported", + "errorCode": "MERAKI-UNREACHED", + "errorDescription": "NCIM12014: The Meraki device or Meraki dashboard is unreachable. For connectivity issues of Meraki dashboard please ensure the API key is correct. The collection status of the device/dashboard would be updated in the next resync of Meraki dashboard if the connectivity issue is recovered and/or the API key is corrected.", + "family": "Meraki Access Point", + "hostname": "", + "id": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "instanceTenantId": "6df67d101bd46e119c129e91", + "instanceUuid": "531bbc5a-aa8f-52f1-9a60-fc29d1c91860", + "interfaceCount": "0", + "inventoryStatusDetail": "NA", + "lastUpdateTime": 1681833374231, + "lastUpdated": "2022-12-03 10:32:09", + "lineCardCount": "0", + "lineCardId": "", + "location": null, + "locationName": null, + "macAddress": "99:26:55:bb:56:42", + "managedAtleastOnce": false, + "managementIpAddress": "10.10.10.80", + "managementState": "Managed", + "memorySize": "NA", + "platformId": "MR42", + "reachabilityFailureReason": "NA", + "reachabilityStatus": "Unreachable", + "role": "UNKNOWN", + "roleSource": "MANUAL", + "serialNumber": "R3JE-OYG4-RCDE", + "series": "Meraki Access Point", + "snmpContact": "", + "snmpLocation": null, + "softwareType": null, + "softwareVersion": null, + "tagCount": "0", + "tunnelUdpPort": null, + "type": "MR42", + "upTime": null, + "uptimeSeconds": -1, + "waasDeviceMode": null + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_locations.json b/nautobot_ssot/tests/dna_center/fixtures/get_locations.json new file mode 100644 index 000000000..643dc7c68 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_locations.json @@ -0,0 +1,161 @@ +[ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_locations_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_locations_recv.json new file mode 100644 index 000000000..99dcf9409 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_locations_recv.json @@ -0,0 +1,163 @@ +{ + "response": [ + { + "additionalInfo": [], + "id": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Global", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteNameHierarchy": "Global" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "type": "floor" + }, + "nameSpace": "Location" + }, + { + "attributes": { + "height": "10.0", + "length": "100.0", + "offsetX": "0.0", + "offsetY": "0.0", + "width": "100.0" + }, + "nameSpace": "mapGeometry" + }, + { + "attributes": { + "member.umbrellaEnabled.direct": "0", + "member.umbrellaNotReady.direct": "2", + "member.umbrellaReady.direct": "0", + "member.umbrellaReadyNotEnabled.direct": "0" + }, + "nameSpace": "UMBRELLA" + }, + { + "attributes": { + "floorIndex": "1", + "rfModel": "95095" + }, + "nameSpace": "mapsSummary" + }, + { + "attributes": { + "ETAReady": "true", + "member.compatibleWithNaasOnly.direct": "0", + "member.etaCapable.direct": "2", + "member.etaEnabled.direct": "0", + "member.etaEnabledNaasOnly.direct": "0", + "member.etaNotReady.direct": "0", + "member.etaReady.direct": "2", + "member.etaReadyNotEnabled.direct": "2" + }, + "nameSpace": "ETA" + } + ], + "id": "49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Floor1", + "parentId": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/eed5ccc3-d76f-46e2-9d8d-97624f5418ac/5c59e37a-f12d-4e84-a085-ac5c02f240d4/49aa97a7-5d45-4303-89dd-f76dfbfc624a", + "siteNameHierarchy": "Global/NY/Building1/Floor1" + }, + { + "additionalInfo": [ + { + "attributes": { + "address": "", + "addressInheritedFrom": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building" + }, + "nameSpace": "Location" + } + ], + "id": "5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "Building1", + "parentId": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9/5c59e37a-f12d-4e84-a085-ac5c02f240d4", + "siteNameHierarchy": "Global/NY/Building1" + }, + { + "additionalInfo": [ + { + "attributes": { + "addressInheritedFrom": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "type": "area" + }, + "nameSpace": "Location" + } + ], + "id": "3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "instanceTenantId": "623f029857259506a56ad9bd", + "name": "NY", + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9", + "siteNameHierarchy": "Global/NY" + }, + { + "parentId": "9e5f9fc2-032e-45e8-994c-4a00629648e8", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "country": "United States", + "address": "", + "latitude": "40.72947644312811", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "building", + "longitude": "-73.99464143036406" + } + } + ], + "name": "DC1", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "aa197d0e-75e2-4d46-bf51-97781931d034", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034", + "siteNameHierarchy": "Global/DC1" + }, + { + "parentId": "aa197d0e-75e2-4d46-bf51-97781931d034", + "additionalInfo": [ + { + "nameSpace": "Location", + "attributes": { + "address": "", + "addressInheritedFrom": "aa197d0e-75e2-4d46-bf51-97781931d034", + "type": "floor" + } + }, + { + "nameSpace": "mapGeometry", + "attributes": { + "offsetX": "0.0", + "offsetY": "0.0", + "length": "100.0", + "width": "100.0", + "height": "10.0" + } + }, + { + "nameSpace": "mapsSummary", + "attributes": { + "rfModel": "95095", + "floorIndex": "1" + } + } + ], + "name": "Main Floor", + "instanceTenantId": "623f029857259506a56ad9bd", + "id": "0ca6155d-207d-4760-961a-7e49149a684a", + "siteHierarchy": "9e5f9fc2-032e-45e8-994c-4a00629648e8/aa197d0e-75e2-4d46-bf51-97781931d034/0ca6155d-207d-4760-961a-7e49149a684a", + "siteNameHierarchy": "Global/DC1/Main Floor" + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_port_info.json b/nautobot_ssot/tests/dna_center/fixtures/get_port_info.json new file mode 100644 index 000000000..b04e643f7 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_port_info.json @@ -0,0 +1,1734 @@ +[ + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "ee436e67-103a-4c46-863d-8b80cff3217d", + "ifIndex": "1", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ee436e67-103a-4c46-863d-8b80cff3217d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334399/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "GigabitEthernet0/0", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "uplink to 3750x TOR switch", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "ifIndex": "8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:01", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334382/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "access", + "portName": "GigabitEthernet1/0/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf1", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "ifIndex": "9", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:02", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334379/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf2", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "ifIndex": "10", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:03", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334377/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "ifIndex": "11", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:04", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334376/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "98728bdf-9c6e-4905-8a30-69b253482a10", + "ifIndex": "12", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "98728bdf-9c6e-4905-8a30-69b253482a10", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:05", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334386/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/5", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "ifIndex": "13", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:06", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334385/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/6", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "ifIndex": "14", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:07", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334384/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/7", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "9af59679-f6d5-42c8-aa44-e101887988f0", + "ifIndex": "15", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "9af59679-f6d5-42c8-aa44-e101887988f0", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:08", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334383/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/8", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "ifIndex": "16", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:09", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334375/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/9", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f010ed49-1191-4030-a845-df30636a4fe1", + "ifIndex": "17", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f010ed49-1191-4030-a845-df30636a4fe1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334426/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/10", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "48031539-1f20-4e3b-8618-44567dd87253", + "ifIndex": "18", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "48031539-1f20-4e3b-8618-44567dd87253", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334427/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/11", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f88ee01f-ce5e-485c-92c7-98c196795136", + "ifIndex": "19", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f88ee01f-ce5e-485c-92c7-98c196795136", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5: 5d: 1b: 0c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334428/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/12", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "151b413e-e8af-4248-9499-88eee4a048ae", + "ifIndex": "20", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "151b413e-e8af-4248-9499-88eee4a048ae", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334429/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/13", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3c1588e1-a935-460a-88d3-421eefc6d178", + "ifIndex": "21", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3c1588e1-a935-460a-88d3-421eefc6d178", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334430/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/14", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f5785599-742c-4680-83ea-372219f4ae76", + "ifIndex": "22", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f5785599-742c-4680-83ea-372219f4ae76", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334431/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/15", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "ifIndex": "23", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:10", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334432/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/16", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "ifIndex": "24", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:11", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334433/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/17", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "ifIndex": "25", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:12", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334434/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/18", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "ifIndex": "26", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:13", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334435/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/19", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "ifIndex": "27", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:14", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334388/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/20", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "ifIndex": "28", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:15", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334389/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/21", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "ifIndex": "29", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:16", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334391/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/22", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "024333e5-f925-41ac-88be-fb00245ab5c4", + "ifIndex": "30", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "024333e5-f925-41ac-88be-fb00245ab5c4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:17", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334393/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/23", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "ifIndex": "31", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:18", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334395/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/24", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "ifIndex": "32", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:19", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334394/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "730b927a-6179-4990-b922-ac02926568a4", + "ifIndex": "33", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "730b927a-6179-4990-b922-ac02926568a4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334392/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "ifIndex": "34", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334390/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "459b3850-52fb-441e-9881-b6fd911796ab", + "ifIndex": "35", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "459b3850-52fb-441e-9881-b6fd911796ab", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334380/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.2.2.2" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "ifIndex": "44", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "interfaceType": "Virtual", + "ipv4Address": "10.2.2.2", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334436/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1514", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Loopback0", + "portType": "Service Module Interface", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "8000000", + "status": "up", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "2d390a18-1b00-4265-bea1-01b288db4c59", + "ifIndex": "36", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "2d390a18-1b00-4265-bea1-01b288db4c59", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334401/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "ifIndex": "37", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334400/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "ifIndex": "38", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334403/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "ifIndex": "39", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:20", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334402/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "DOWN", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "ifIndex": "43", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:47", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334381/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan1", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.10.20.80" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "ifIndex": "45", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "interfaceType": "Virtual", + "ipv4Address": "10.10.20.80", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:66", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334387/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan823", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "ifIndex": "46", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:51", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334378/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan848", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "848", + "voiceVlan": "" + } +] \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/fixtures/get_port_info_recv.json b/nautobot_ssot/tests/dna_center/fixtures/get_port_info_recv.json new file mode 100644 index 000000000..5c6a7dba3 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/fixtures/get_port_info_recv.json @@ -0,0 +1,1736 @@ +{ + "response": [ + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "ee436e67-103a-4c46-863d-8b80cff3217d", + "ifIndex": "1", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ee436e67-103a-4c46-863d-8b80cff3217d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:00", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334399/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "GigabitEthernet0/0", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "uplink to 3750x TOR switch", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "ifIndex": "8", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23ade28d-9cf1-49ae-80b2-5836c913375a", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:01", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334382/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "access", + "portName": "GigabitEthernet1/0/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf1", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "ifIndex": "9", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "eb24abea-a4dd-4728-b822-8c3d788369d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:02", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334379/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "P2P link leaf2", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "FullDuplex", + "id": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "ifIndex": "10", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1fe26fc6-2eef-4b0b-904f-f52460ca96ec", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:03", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334377/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "trunk", + "portName": "GigabitEthernet1/0/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "ifIndex": "11", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "58210717-ef8a-49a8-b43f-5cb3fd933f2e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:04", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334376/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "98728bdf-9c6e-4905-8a30-69b253482a10", + "ifIndex": "12", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "98728bdf-9c6e-4905-8a30-69b253482a10", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:05", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334386/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/5", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "ifIndex": "13", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "adad089b-bd87-4136-8caa-ca2e814e28c7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:06", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334385/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/6", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "ifIndex": "14", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ebf20f5f-7df1-424f-ad61-ace9405a3834", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:07", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334384/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/7", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "9af59679-f6d5-42c8-aa44-e101887988f0", + "ifIndex": "15", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "9af59679-f6d5-42c8-aa44-e101887988f0", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:08", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334383/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/8", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "ifIndex": "16", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "23c7074a-cce4-4bcb-b460-b03cedef3bfc", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:09", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334375/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/9", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f010ed49-1191-4030-a845-df30636a4fe1", + "ifIndex": "17", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f010ed49-1191-4030-a845-df30636a4fe1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334426/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/10", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "48031539-1f20-4e3b-8618-44567dd87253", + "ifIndex": "18", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "48031539-1f20-4e3b-8618-44567dd87253", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334427/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/11", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f88ee01f-ce5e-485c-92c7-98c196795136", + "ifIndex": "19", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f88ee01f-ce5e-485c-92c7-98c196795136", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5: 5d: 1b: 0c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334428/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/12", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "151b413e-e8af-4248-9499-88eee4a048ae", + "ifIndex": "20", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "151b413e-e8af-4248-9499-88eee4a048ae", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334429/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/13", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3c1588e1-a935-460a-88d3-421eefc6d178", + "ifIndex": "21", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3c1588e1-a935-460a-88d3-421eefc6d178", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334430/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/14", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f5785599-742c-4680-83ea-372219f4ae76", + "ifIndex": "22", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f5785599-742c-4680-83ea-372219f4ae76", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:0f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334431/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/15", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "ifIndex": "23", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "566844af-a3fb-41cb-b88a-fc8d391e89e7", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:10", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334432/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/16", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "ifIndex": "24", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0579dd30-2bdc-4598-a32b-50f7218c3a8d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:11", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334433/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/17", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "ifIndex": "25", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "f75ff274-b3af-4b5d-b5a6-27a2d66a631e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:12", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334434/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/18", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "ifIndex": "26", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "b2426dd1-77ea-4cb0-a9b1-92bdc3e58406", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:13", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334435/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/19", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "ifIndex": "27", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "1a1e44d9-bf0f-441d-8a49-e21d9aa1236e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:14", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334388/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/20", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "ifIndex": "28", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "62644411-ccc9-4e77-adeb-12a57ca9c3d5", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:15", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334389/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/21", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "ifIndex": "29", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "096777bb-e1e9-4f48-9061-bb00f92b2d5d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:16", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334391/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/22", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "024333e5-f925-41ac-88be-fb00245ab5c4", + "ifIndex": "30", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "024333e5-f925-41ac-88be-fb00245ab5c4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:17", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334393/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/23", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "ifIndex": "31", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "c70b02fe-2323-4ebf-8d66-b87575d4ab0f", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:18", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334395/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "1", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/0/24", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "ifIndex": "32", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "3741dd1b-05af-48f8-abb4-12f930138bbe", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:19", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334394/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "730b927a-6179-4990-b922-ac02926568a4", + "ifIndex": "33", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "730b927a-6179-4990-b922-ac02926568a4", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1a", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334392/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "ifIndex": "34", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d11d9ce-b713-4bac-988a-e7a8a52a64b9", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1b", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334390/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "459b3850-52fb-441e-9881-b6fd911796ab", + "ifIndex": "35", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "459b3850-52fb-441e-9881-b6fd911796ab", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1c", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334380/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "GigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.2.2.2" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "ifIndex": "44", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "7d1f94cf-b701-4f9d-8984-1cc3da2ec79a", + "interfaceType": "Virtual", + "ipv4Address": "10.2.2.2", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334436/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1514", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Loopback0", + "portType": "Service Module Interface", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "8000000", + "status": "up", + "vlanId": "0", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "2d390a18-1b00-4265-bea1-01b288db4c59", + "ifIndex": "36", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "2d390a18-1b00-4265-bea1-01b288db4c59", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1d", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334401/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/1", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "ifIndex": "37", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "40d6bf96-1442-4b94-842a-ec0d6719c92e", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1e", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334400/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/2", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "ifIndex": "38", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e0144968-3088-4b55-81e7-b89b9e1dd66d", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:1f", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334403/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/3", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "AutoNegotiate", + "id": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "ifIndex": "39", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "e9506d33-8725-4617-b6a1-d3e88541b6e1", + "interfaceType": "Physical", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:20", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334402/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "dynamic_auto", + "portName": "TenGigabitEthernet1/1/4", + "portType": "Ethernet Port", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "10000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "DOWN", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "ifIndex": "43", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "49792a78-1400-4711-a6b0-3eaa90c0331e", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:47", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334381/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan1", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "1", + "voiceVlan": "" + }, + { + "addresses": [ + { + "address": { + "ipAddress": { + "address": "10.10.20.80" + }, + "ipMask": { + "address": "255.255.255.0" + }, + "isInverseMask": false, + "lazyLoadedEntities": null + }, + "lazyLoadedEntities": null, + "type": "IPV4_PRIMARY" + } + ], + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "ifIndex": "45", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "0a71a595-df83-4fbf-964d-9889e11a75c2", + "interfaceType": "Virtual", + "ipv4Address": "10.10.20.80", + "ipv4Mask": "255.255.255.0", + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:66", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334387/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan823", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "up", + "vlanId": "823", + "voiceVlan": "" + }, + { + "addresses": null, + "adminStatus": "UP", + "className": null, + "description": "", + "deviceId": "420aab4f-ff7e-41e0-8f59-eb18c0b80759", + "duplex": "", + "id": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "ifIndex": "46", + "instanceTenantId": "623f029857259506a56ad9bd", + "instanceUuid": "ed6ce0b8-fa3a-43fd-9ac8-d03afb5fb24c", + "interfaceType": "Virtual", + "ipv4Address": null, + "ipv4Mask": null, + "isisSupport": "false", + "lastUpdated": null, + "macAddress": "70:01:b5:5d:1b:51", + "managedComputeElement": null, + "managedComputeElementUrl": null, + "managedNetworkElement": { + "id": 304312, + "longType": "com.cisco.xmp.model.foundation.encapsulatedFunctionality.ManagedNetworkElement", + "type": "ManagedNetworkElement", + "url": "../../ManagedNetworkElement/304312" + }, + "managedNetworkElementUrl": "../../DeviceIf/334378/related/managedNetworkElement", + "mappedPhysicalInterfaceId": null, + "mappedPhysicalInterfaceName": null, + "mediaType": null, + "mtu": "1500", + "name": null, + "nativeVlanId": "", + "networkdevice_id": 295295, + "ospfSupport": "false", + "pid": "WS-C3850-24P-L", + "portMode": "routed", + "portName": "Vlan848", + "portType": "Ethernet SVI", + "poweroverethernet": 0, + "serialNo": "FCW2212D05S", + "series": "Cisco Catalyst 3850 Series Ethernet Stackable Switch", + "speed": "1000000", + "status": "down", + "vlanId": "848", + "voiceVlan": "" + } + ] +} \ No newline at end of file diff --git a/nautobot_ssot/tests/dna_center/test_adapters_dna_center.py b/nautobot_ssot/tests/dna_center/test_adapters_dna_center.py new file mode 100644 index 000000000..c7e805066 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/test_adapters_dna_center.py @@ -0,0 +1,272 @@ +"""Test DNA Center adapter.""" + +import uuid +from unittest.mock import MagicMock + +from django.core.exceptions import ValidationError +from django.contrib.contenttypes.models import ContentType +from django.test import override_settings +from nautobot.dcim.models import Device, DeviceType, Interface, Manufacturer, Location, LocationType +from nautobot.extras.models import CustomField, JobResult, Status, Role +from nautobot.ipam.models import IPAddress, IPAddressToInterface, Prefix, Namespace +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot.integrations.dna_center.diffsync.adapters.dna_center import DnaCenterAdapter +from nautobot_ssot.tests.dna_center.fixtures import ( + LOCATION_FIXTURE, + EXPECTED_DNAC_LOCATION_MAP, + EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL, + DEVICE_FIXTURE, + DEVICE_DETAIL_FIXTURE, + PORT_FIXTURE, + EXPECTED_AREAS, + EXPECTED_AREAS_WO_GLOBAL, + EXPECTED_BUILDINGS, + EXPECTED_FLOORS, +) +from nautobot_ssot.integrations.dna_center.jobs import DnaCenterDataSource + + +@override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": True}}) +class TestDnaCenterAdapterTestCase( + TransactionTestCase +): # pylint: disable=too-many-public-methods, too-many-instance-attributes + """Test NautobotSsotDnaCenterAdapter class.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Initialize test case.""" + super().setUp() + self.dna_center_client = MagicMock() + self.dna_center_client.get_devices.return_value = DEVICE_FIXTURE + self.dna_center_client.find_address_and_type.side_effect = [ + ("", "floor"), + ("", "building"), + ("", "area"), + ] + self.dna_center_client.find_latitude_and_longitude.return_value = ("", "") + self.dna_center_client.get_device_detail.return_value = DEVICE_DETAIL_FIXTURE + self.dna_center_client.get_model_name.return_value = "WS-C3850-24P-L" + self.dna_center_client.parse_site_hierarchy.return_value = { + "areas": ["Global", "NY"], + "building": "Building1", + "floor": "Floor1", + } + self.dna_center_client.get_port_info.return_value = PORT_FIXTURE + self.dna_center_client.get_port_type.return_value = "virtual" + self.dna_center_client.get_port_status.return_value = "active" + + self.job = DnaCenterDataSource() + self.job.debug = True + self.job.job_result = JobResult.objects.create( + name=self.job.class_path, task_name="fake task", user=None, id=uuid.uuid4() + ) + self.dna_center = DnaCenterAdapter(job=self.job, sync=None, client=self.dna_center_client, tenant=None) + self.dna_center.job.logger.warning = MagicMock() + self.dna_center.job.logger.error = MagicMock() + self.dna_center.job.logger.info = MagicMock() + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP + + self.sor_cf = CustomField.objects.get(label="System of Record") + self.status_active = Status.objects.get(name="Active") + self.hq_area = Location.objects.create( + name="NY", location_type=LocationType.objects.get(name="Region"), status=self.status_active + ) + self.loc_type = LocationType.objects.get(name="Site") + self.hq_site = Location.objects.create( + name="HQ", parent=self.hq_area, location_type=self.loc_type, status=self.status_active + ) + self.hq_site.validated_save() + + cisco_manu = Manufacturer.objects.get_or_create(name="Cisco")[0] + catalyst_devicetype = DeviceType.objects.get_or_create(model="WS-C3850-24P-L", manufacturer=cisco_manu)[0] + core_role, created = Role.objects.get_or_create(name="CORE") + if created: + core_role.content_types.add(ContentType.objects.get_for_model(Device)) + + self.test_dev = Device.objects.create( + name="spine1.abc.in", + device_type=catalyst_devicetype, + role=core_role, + serial="FCW2212D05S", + location=self.hq_site, + status=self.status_active, + ) + self.test_dev.validated_save() + self.intf = Interface.objects.create( + name="Vlan823", type="virtual", device=self.test_dev, status=self.status_active + ) + self.intf.validated_save() + + self.namespace = Namespace.objects.get_or_create(name="Global")[0] + + self.prefix = Prefix.objects.create( + prefix="10.10.20.0/24", + status=self.status_active, + namespace=self.namespace, + ) + self.addr = IPAddress.objects.create( + address="10.10.20.80/24", + parent=self.prefix, + status=self.status_active, + ) + self.ip_to_intf = IPAddressToInterface.objects.create( + ip_address=self.addr, + interface=self.intf, + ) + + def test_build_dnac_location_map(self): + """Test Nautobot adapter build_dnac_location_map method.""" + self.dna_center.dnac_location_map = {} + actual = self.dna_center.build_dnac_location_map(locations=LOCATION_FIXTURE) + expected = EXPECTED_DNAC_LOCATION_MAP + self.assertEqual(actual, expected) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_build_dnac_location_map_wo_global(self): + """Test Nautobot adapter build_dnac_location_map method without global.""" + self.dna_center.dnac_location_map = {} + actual = self.dna_center.build_dnac_location_map(locations=LOCATION_FIXTURE) + expected = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.assertEqual(actual, expected) + + def test_parse_and_sort_locations(self): + """Test Nautobot adapter parse_and_sort_locations method.""" + actual = self.dna_center.parse_and_sort_locations(locations=LOCATION_FIXTURE) + expected = EXPECTED_AREAS, EXPECTED_BUILDINGS, EXPECTED_FLOORS + self.assertEqual(actual, expected) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_parse_and_sort_locations_wo_global(self): + """Test Nautobot adapter parse_and_sort_locations method without Global region.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + actual_areas, actual_buildings, actual_floors = self.dna_center.parse_and_sort_locations( + locations=LOCATION_FIXTURE + ) + self.assertEqual(actual_areas, EXPECTED_AREAS_WO_GLOBAL) + self.assertEqual(actual_buildings, EXPECTED_BUILDINGS) + self.assertEqual(actual_floors, EXPECTED_FLOORS) + + def test_load_locations_success(self): + """Test Nautobot SSoT for Cisco DNA Center load_locations() function successfully.""" + self.dna_center.load_areas = MagicMock() + self.dna_center.load_buildings = MagicMock() + self.dna_center.load_floors = MagicMock() + self.dna_center_client.get_location.return_value = [{"name": "NY"}] + self.dna_center.load_locations() + self.dna_center_client.get_locations.assert_called() + self.dna_center.load_areas.assert_called_once() + self.dna_center.load_buildings.assert_called_once() + self.dna_center.load_floors.assert_called_once() + + def test_load_locations_failure(self): + """Test Nautobot SSoT for Cisco DNA Center load_locations() function fails.""" + self.dna_center_client.get_locations.return_value = [] + self.dna_center.load_locations() + self.dna_center.job.logger.error.assert_called_once_with( + "No location data was returned from DNAC. Unable to proceed." + ) + + def test_load_areas_w_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function with Global area.""" + self.dna_center.load_areas(areas=EXPECTED_AREAS) + area_expected = [ + "Global__None", + "NY__Global", + ] + area_actual = [area.get_unique_id() for area in self.dna_center.get_all("area")] + self.assertEqual(area_actual, area_expected) + self.dna_center.job.logger.info.assert_called_with( + "Loading area NY. {'additionalInfo': [{'attributes': {'addressInheritedFrom': '3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'type': 'area'}, 'nameSpace': 'Location'}], 'id': '3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'instanceTenantId': '623f029857259506a56ad9bd', 'name': 'NY', 'parentId': '9e5f9fc2-032e-45e8-994c-4a00629648e8', 'siteHierarchy': '9e5f9fc2-032e-45e8-994c-4a00629648e8/3f07768d-6b5c-4b4d-8577-29f765bd49c9', 'siteNameHierarchy': 'Global/NY'}" + ) + + @override_settings(PLUGINS_CONFIG={"nautobot_ssot_dna_center": {"import_global": False}}) + def test_load_areas_wo_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function without Global area.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.dna_center.load_areas(areas=EXPECTED_AREAS) + area_expected = [ + "NY__None", + ] + area_actual = [area.get_unique_id() for area in self.dna_center.get_all("area")] + self.assertEqual(area_actual, area_expected) + + def test_load_areas_with_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_areas() function with a ValidationError.""" + self.dna_center.add = MagicMock() + self.dna_center.add.side_effect = ValidationError(message="Area load failed!") + self.dna_center.load_areas(areas=EXPECTED_AREAS_WO_GLOBAL) + self.dna_center.job.logger.warning.assert_called_with("Unable to load area NY. ['Area load failed!']") + + def test_load_buildings_w_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with Global area.""" + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + building_expected = ["Building1", "DC1"] + building_actual = [building.get_unique_id() for building in self.dna_center.get_all("building")] + self.assertEqual(building_actual, building_expected) + + def test_load_buildings_wo_global(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function without Global area.""" + self.dna_center.dnac_location_map = EXPECTED_DNAC_LOCATION_MAP_WO_GLOBAL + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + building_expected = ["Building1", "DC1"] + building_actual = [building.get_unique_id() for building in self.dna_center.get_all("building")] + self.assertEqual(building_actual, building_expected) + + def test_load_buildings_duplicate(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with duplicate building.""" + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.job.logger.warning.assert_called_with("Building DC1 already loaded so skipping.") + + def test_load_buildings_with_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_buildings() function with a ValidationError.""" + self.dna_center.add = MagicMock() + self.dna_center.add.side_effect = ValidationError(message="Building load failed!") + self.dna_center.load_buildings(buildings=EXPECTED_BUILDINGS) + self.dna_center.job.logger.warning.assert_called_with("Unable to load building DC1. ['Building load failed!']") + + def test_load_floors(self): + """Test Nautobot SSoT for Cisco DNA Center load_floors() function.""" + self.dna_center.load_floors(floors=EXPECTED_FLOORS) + floor_expected = ["Building1 - Floor1__Building1", "DC1 - Main Floor__DC1"] + floor_actual = [floor.get_unique_id() for floor in self.dna_center.get_all("floor")] + self.assertEqual(floor_actual, floor_expected) + + def test_load_floors_missing_parent(self): + """Test Nautobot SSoT for Cisco DNA Center load_floors() function with missing parent.""" + self.dna_center.dnac_location_map = {} + self.dna_center.load_floors(floors=EXPECTED_FLOORS) + self.dna_center.job.logger.warning.assert_called_with("Parent to Main Floor can't be found so will be skipped.") + + def test_load_devices(self): + """Test Nautobot SSoT for Cisco DNA Center load_devices() function.""" + self.dna_center.load_ports = MagicMock() + self.dna_center.load_devices() + self.assertEqual( + {f"{dev['hostname']}" for dev in DEVICE_FIXTURE if dev.get("hostname")}, + {dev.get_unique_id() for dev in self.dna_center.get_all("device")}, + ) + self.dna_center.load_ports.assert_called() + + def test_load_ports(self): + """Test Nautobot SSoT for Cisco DNA Center load_ports() function.""" + self.dna_center.load_devices() + expected_ports = [] + for dev in DEVICE_FIXTURE: + if dev.get("hostname"): + for port in PORT_FIXTURE: + if port.get("portName"): + expected_ports.append(f"{port['portName']}__{dev['hostname']}") + actual_ports = [port.get_unique_id() for port in self.dna_center.get_all("port")] + self.assertEqual(expected_ports, actual_ports) + + def test_load_ports_validation_error(self): + """Test Nautobot SSoT for Cisco DNA Center load_ports() function throwing ValidationError.""" + self.dna_center.add = MagicMock(side_effect=ValidationError(message="leaf3.abc.inc not found")) + mock_device = MagicMock() + mock_device.name = "leaf3.abc.inc" + self.dna_center.load_ports(device_id="1234567890", dev=mock_device) + self.dna_center.job.logger.warning.assert_called_with( + "Unable to load port Vlan848 for leaf3.abc.inc. ['leaf3.abc.inc not found']" + ) diff --git a/nautobot_ssot/tests/dna_center/test_adapters_nautobot.py b/nautobot_ssot/tests/dna_center/test_adapters_nautobot.py new file mode 100644 index 000000000..f2675780d --- /dev/null +++ b/nautobot_ssot/tests/dna_center/test_adapters_nautobot.py @@ -0,0 +1,348 @@ +"""Unit tests for the Nautobot DiffSync adapter.""" + +import uuid +from unittest.mock import MagicMock, patch +from diffsync.exceptions import ObjectNotFound +from django.contrib.contenttypes.models import ContentType +from nautobot.dcim.models import ( + Manufacturer, + Location, + LocationType, + Device, + DeviceType, + Platform, + Interface, +) +from nautobot.extras.models import Status, JobResult, Role +from nautobot.ipam.models import IPAddress, Namespace, Prefix, IPAddressToInterface +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot.integrations.dna_center.jobs import DnaCenterDataSource +from nautobot_ssot.integrations.dna_center.diffsync.adapters.nautobot import NautobotAdapter + + +class NautobotDiffSyncTestCase(TransactionTestCase): + """Test the NautobotAdapter class.""" + + databases = ("default", "job_logs") + + def __init__(self, *args, **kwargs): + """Initialize shared variables.""" + super().__init__(*args, **kwargs) + self.ny_region = None + self.hq_site = None + self.loc_type = None + self.floor_loc = None + + def setUp(self): # pylint: disable=too-many-locals + """Per-test-case data setup.""" + super().setUp() + self.status_active = Status.objects.get(name="Active") + + job = DnaCenterDataSource() + job.job_result = JobResult.objects.create( + name=job.class_path, task_name="fake task", user=None, id=uuid.uuid4() + ) + self.nb_adapter = NautobotAdapter(job=job, sync=None) + self.nb_adapter.job = MagicMock() + self.nb_adapter.job.logger.info = MagicMock() + self.nb_adapter.job.logger.warning = MagicMock() + + def build_nautobot_objects(self): # pylint: disable=too-many-locals, too-many-statements + """Build out Nautobot objects to test loading.""" + self.loc_type = LocationType.objects.get(name="Region") + global_region = Location.objects.create(name="Global", status=self.status_active, location_type=self.loc_type) + global_region.custom_field_data["system_of_record"] = "DNA Center" + global_region.validated_save() + self.ny_region = Location.objects.create( + name="NY", location_type=self.loc_type, parent=global_region, status=self.status_active + ) + self.ny_region.custom_field_data["system_of_record"] = "DNA Center" + self.ny_region.validated_save() + self.loc_type = LocationType.objects.get(name="Site") + self.hq_site = Location.objects.create( + parent=self.ny_region, name="HQ", status=self.status_active, location_type=self.loc_type + ) + self.hq_site.custom_field_data["system_of_record"] = "DNA Center" + self.hq_site.validated_save() + + self.loc_type = LocationType.objects.get(name="Floor") + self.floor_loc = Location.objects.create( + name="HQ Floor 1", + parent=self.hq_site, + location_type=self.loc_type, + status=self.status_active, + ) + self.floor_loc.custom_field_data["system_of_record"] = "DNA Center" + self.floor_loc.validated_save() + + cisco_manu = Manufacturer.objects.create(name="Cisco") + csr_devicetype = DeviceType.objects.create(model="Cisco Catalyst 9300 Switch", manufacturer=cisco_manu) + leaf_role = Role.objects.create(name="LEAF") + leaf_role.content_types.add(ContentType.objects.get_for_model(Device)) + spine_role = Role.objects.create(name="SPINE") + spine_role.content_types.add(ContentType.objects.get_for_model(Device)) + ios_platform = Platform.objects.create(name="IOS", napalm_driver="ios") + leaf1_dev = Device.objects.create( + name="leaf1.abc.inc", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=leaf_role, + platform=ios_platform, + serial="FCW2214L0VK", + ) + leaf1_dev.custom_field_data["system_of_record"] = "DNA Center" + leaf2_dev = Device.objects.create( + name="leaf2.abc.inc", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=leaf_role, + platform=ios_platform, + serial="FCW2214L0UZ", + ) + leaf2_dev.custom_field_data["system_of_record"] = "DNA Center" + spine1_dev = Device.objects.create( + name="spine1.abc.in", + location=self.floor_loc, + status=self.status_active, + device_type=csr_devicetype, + role=spine_role, + platform=ios_platform, + serial="FCW2212D05S", + ) + spine1_dev.custom_field_data["system_of_record"] = "DNA Center" + spine1_dev.validated_save() + + unknown_role = Role.objects.create(name="UNKNOWN") + unknown_role.content_types.add(ContentType.objects.get_for_model(Device)) + meraki_ap = Device.objects.create( + name="", + location=self.floor_loc, + status=self.status_active, + device_type=DeviceType.objects.create(model="MR42", manufacturer=cisco_manu), + role=unknown_role, + platform=Platform.objects.create(name="meraki", napalm_driver="meraki"), + serial="R3JE-OYG4-RCDE", + ) + meraki_ap.custom_field_data["system_of_record"] = "DNA Center" + meraki_ap.validated_save() + + leaf1_mgmt = Interface.objects.create( + device=leaf1_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f1", + ) + leaf1_mgmt.custom_field_data["system_of_record"] = "DNA Center" + leaf1_mgmt.validated_save() + leaf2_mgmt = Interface.objects.create( + device=leaf2_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f2", + ) + leaf2_mgmt.custom_field_data["system_of_record"] = "DNA Center" + leaf2_mgmt.validated_save() + spine1_mgmt = Interface.objects.create( + device=spine1_dev, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f3", + ) + spine1_mgmt.custom_field_data["system_of_record"] = "DNA Center" + spine1_mgmt.validated_save() + + ap_mgmt = Interface.objects.create( + device=meraki_ap, + name="Management", + status=self.status_active, + mtu=1500, + type="virtual", + mac_address="aa:bb:cc:dd:ee:f4", + ) + ap_mgmt.custom_field_data["system_of_record"] = "DNA Center" + ap_mgmt.validated_save() + + test_ns = Namespace.objects.create(name="Global") + + leaf1_pf = Prefix.objects.create( + prefix="10.10.10.0/24", + namespace=test_ns, + status=self.status_active, + ) + leaf1_ip = IPAddress.objects.create( + address="10.10.10.1/24", + parent=leaf1_pf, + status=self.status_active, + ) + leaf1_ip.custom_field_data["system_of_record"] = "DNA Center" + leaf1_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=leaf1_ip, interface=leaf1_mgmt) + + leaf1_mgmt.device.primary_ip4 = leaf1_ip + leaf1_mgmt.device.validated_save() + + leaf2_pf = Prefix.objects.create( + prefix="10.10.11.0/24", + namespace=test_ns, + status=self.status_active, + ) + leaf2_ip = IPAddress.objects.create( + address="10.10.11.1/24", + parent=leaf2_pf, + status=self.status_active, + ) + leaf2_ip.custom_field_data["system_of_record"] = "DNA Center" + leaf2_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=leaf2_ip, interface=leaf2_mgmt) + + leaf2_mgmt.device.primary_ip4 = leaf2_ip + leaf2_mgmt.device.validated_save() + + spine1_pf = Prefix.objects.create( + prefix="10.10.12.0/24", + namespace=test_ns, + status=self.status_active, + ) + spine1_ip = IPAddress.objects.create( + address="10.10.12.1/24", + parent=spine1_pf, + status=self.status_active, + ) + spine1_ip.custom_field_data["system_of_record"] = "DNA Center" + spine1_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=spine1_ip, interface=spine1_mgmt) + + spine1_mgmt.device.primary_ip4 = spine1_ip + spine1_mgmt.device.validated_save() + + ap_pf = Prefix.objects.create( + prefix="10.10.13.0/24", + namespace=test_ns, + status=self.status_active, + ) + + ap_ip = IPAddress.objects.create( + address="10.10.13.1/24", + parent=ap_pf, + status=self.status_active, + ) + ap_ip.custom_field_data["system_of_record"] = "DNA Center" + ap_ip.validated_save() + + IPAddressToInterface.objects.create(ip_address=ap_ip, interface=ap_mgmt) + + ap_mgmt.device.primary_ip4 = ap_ip + ap_mgmt.device.validated_save() + + def test_data_loading(self): + """Test the load() function.""" + self.build_nautobot_objects() + self.nb_adapter.load() + self.assertEqual( + ["Global__None", "NY__Global"], + sorted(loc.get_unique_id() for loc in self.nb_adapter.get_all("area")), + ) + self.assertEqual( + ["HQ"], + sorted(site.get_unique_id() for site in self.nb_adapter.get_all("building")), + ) + self.assertEqual( + ["HQ Floor 1__HQ"], + sorted(loc.get_unique_id() for loc in self.nb_adapter.get_all("floor")), + ) + self.assertEqual( + ["", "leaf1.abc.inc", "leaf2.abc.inc", "spine1.abc.in"], + sorted(dev.get_unique_id() for dev in self.nb_adapter.get_all("device")), + ) + self.assertEqual( + [ + "Management__", + "Management__leaf1.abc.inc", + "Management__leaf2.abc.inc", + "Management__spine1.abc.in", + ], + sorted(port.get_unique_id() for port in self.nb_adapter.get_all("port")), + ) + self.assertEqual( + [ + "10.10.10.1__Global", + "10.10.11.1__Global", + "10.10.12.1__Global", + "10.10.13.1__Global", + ], + sorted(ipaddr.get_unique_id() for ipaddr in self.nb_adapter.get_all("ipaddress")), + ) + + def test_load_regions_failure(self): + """Test the load_regions method failing with loading duplicate Regions.""" + self.build_nautobot_objects() + self.nb_adapter.load() + self.nb_adapter.load_regions() + self.nb_adapter.job.logger.warning.assert_called_with("Region NY already loaded so skipping duplicate.") + + @patch("nautobot_ssot_dna_center.diffsync.adapters.nautobot.OrmLocationType") + @patch("nautobot_ssot_dna_center.diffsync.adapters.nautobot.OrmLocation") + def test_load_floors_missing_building(self, mock_floors, mock_loc_type): + """Test the load_floors method failing with missing Building.""" + mock_floor = MagicMock() + mock_floor.name = "HQ - Floor 1" + mock_floor.parent = MagicMock() + mock_floor.parent.name = "Missing" + mock_floor.tenant = None + mock_floor.id = uuid.uuid4() + mock_loc_type.objects.get.return_value = mock_loc_type + mock_floors.objects.filter.return_value = [mock_floor] + self.nb_adapter.get = MagicMock() + self.nb_adapter.get.side_effect = [ObjectNotFound()] + self.nb_adapter.load_floors() + self.nb_adapter.job.logger.warning.assert_called_with( + "Unable to load building Missing for floor HQ - Floor 1. " + ) + + def test_sync_complete(self): + """Test the sync_complete() method in the NautobotAdapter.""" + self.nb_adapter.objects_to_delete = { + "ipaddresses": [MagicMock()], + "prefixes": [MagicMock()], + "ports": [MagicMock()], + "devices": [MagicMock()], + "floors": [MagicMock(), MagicMock()], + "sites": [MagicMock()], + "regions": [], + } + self.nb_adapter.job = MagicMock() + self.nb_adapter.job.logger.info = MagicMock() + + deleted_objs = [] + for group in ["ipaddresses", "prefixes", "ports", "devices", "floors", "sites"]: + deleted_objs.extend(self.nb_adapter.objects_to_delete[group]) + + self.nb_adapter.sync_complete(diff=MagicMock(), source=MagicMock()) + + for obj in deleted_objs: + self.assertTrue(obj.delete.called) + self.assertEqual(len(self.nb_adapter.objects_to_delete["ipaddresses"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["prefixes"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["devices"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["ports"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["floors"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["sites"]), 0) + self.assertEqual(len(self.nb_adapter.objects_to_delete["regions"]), 0) + self.assertTrue(self.nb_adapter.job.logger.info.called) + self.assertTrue(self.nb_adapter.job.logger.info.call_count, 5) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[0].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[1].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[2].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[3].startswith("Deleting")) + self.assertTrue(self.nb_adapter.job.logger.info.call_args_list[4].startswith("Deleting")) diff --git a/nautobot_ssot/tests/dna_center/test_jobs.py b/nautobot_ssot/tests/dna_center/test_jobs.py new file mode 100644 index 000000000..1c1e45f80 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/test_jobs.py @@ -0,0 +1,55 @@ +"""Test DNA Center Jobs.""" + +from django.test import TestCase +from django.urls import reverse + +from nautobot_ssot.integrations.dna_center import jobs + + +class DnaCenterDataSourceJobTest(TestCase): + """Test the DNA Center DataSource Job.""" + + def test_metadata(self): + """Verify correctness of the Job Meta attributes.""" + self.assertEqual("DNA Center to Nautobot", jobs.DnaCenterDataSource.name) + self.assertEqual("DNA Center to Nautobot", jobs.DnaCenterDataSource.Meta.name) + self.assertEqual("DNA Center", jobs.DnaCenterDataSource.data_source) + self.assertEqual("Sync information from DNA Center to Nautobot", jobs.DnaCenterDataSource.description) + + def test_data_mapping(self): + mappings = jobs.DnaCenterDataSource.data_mappings() + + self.assertEqual("Areas", mappings[0].source_name) + self.assertIsNone(mappings[0].source_url) + self.assertEqual("Locations", mappings[0].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[0].target_url) + + self.assertEqual("Buildings", mappings[1].source_name) + self.assertIsNone(mappings[1].source_url) + self.assertEqual("Locations", mappings[1].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[1].target_url) + + self.assertEqual("Floors", mappings[2].source_name) + self.assertIsNone(mappings[2].source_url) + self.assertEqual("Locations", mappings[2].target_name) + self.assertEqual(reverse("dcim:location_list"), mappings[2].target_url) + + self.assertEqual("Devices", mappings[3].source_name) + self.assertIsNone(mappings[3].source_url) + self.assertEqual("Devices", mappings[3].target_name) + self.assertEqual(reverse("dcim:device_list"), mappings[3].target_url) + + self.assertEqual("Interfaces", mappings[4].source_name) + self.assertIsNone(mappings[4].source_url) + self.assertEqual("Interfaces", mappings[4].target_name) + self.assertEqual(reverse("dcim:interface_list"), mappings[4].target_url) + + self.assertEqual("IP Addresses", mappings[5].source_name) + self.assertIsNone(mappings[5].source_url) + self.assertEqual("IP Addresses", mappings[5].target_name) + self.assertEqual(reverse("ipam:ipaddress_list"), mappings[5].target_url) + + def test_config_information(self): + """Verify the config_information() API.""" + config_information = jobs.DnaCenterDataSource.config_information() + self.assertEqual(config_information, {"Instances": "Found in Extensibility -> External Integrations menu."}) diff --git a/nautobot_ssot/tests/dna_center/test_models_nautobot.py b/nautobot_ssot/tests/dna_center/test_models_nautobot.py new file mode 100644 index 000000000..33dc86a93 --- /dev/null +++ b/nautobot_ssot/tests/dna_center/test_models_nautobot.py @@ -0,0 +1,305 @@ +"""Test the DiffSync models for Nautobot.""" + +from unittest.mock import MagicMock, patch +from diffsync import DiffSync +from nautobot.dcim.models import ( + Location, + LocationType, + DeviceType, + Manufacturer, +) +from nautobot.extras.models import Status, Role +from nautobot.tenancy.models import Tenant +from nautobot.core.testing import TransactionTestCase +from nautobot_ssot.integrations.dna_center.diffsync.models.nautobot import ( + NautobotArea, + NautobotBuilding, + NautobotFloor, + NautobotDevice, +) + + +class TestNautobotArea(TransactionTestCase): + """Test the NautobotArea class.""" + + def setUp(self): + super().setUp() + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.diffsync.region_map = {} + self.region_type = LocationType.objects.get(name="Region") + self.diffsync.locationtype_map = {"Region": self.region_type.id} + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + + def test_create(self): + """Validate the NautobotArea create() method creates a Region.""" + status_active = Status.objects.get(name="Active") + self.diffsync.status_map = {"Active": status_active.id} + global_region = Location.objects.create(name="Global", location_type=self.region_type, status=status_active) + self.diffsync.region_map = {"Global": global_region.id} + ids = {"name": "NY", "parent": "Global"} + attrs = {} + result = NautobotArea.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotArea) + self.diffsync.job.logger.info.assert_called_once_with("Creating Region NY.") + region_obj = Location.objects.get(name=ids["name"], location_type__name="Region") + self.assertEqual(region_obj.name, ids["name"]) + self.assertEqual(region_obj.parent.name, ids["parent"]) + + def test_create_missing_parent(self): + """Validate the NautobotArea create() method with missing parent Region.""" + ids = {"name": "TX", "parent": "USA"} + attrs = {} + NautobotArea.create(self.diffsync, ids, attrs) + self.diffsync.job.logger.warning.assert_called_once_with("Unable to find Region USA for TX.") + + +class TestNautobotBuilding(TransactionTestCase): + """Test the NautobotBuilding class.""" + + databases = ("default", "job_logs") + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": ga_tenant.id} + reg_loc = LocationType.objects.get(name="Region") + ny_region = Location.objects.create(name="NY", location_type=reg_loc, status=Status.objects.get(name="Active")) + loc_type = LocationType.objects.get(name="Site") + self.diffsync.locationtype_map = {"Region": reg_loc.id, "Site": loc_type.id} + self.sec_site = Location.objects.create( + name="Site 2", parent=ny_region, status=Status.objects.get(name="Active"), location_type=loc_type + ) + self.sec_site.validated_save() + self.diffsync.site_map = {"NY": ny_region.id, "Site 2": self.sec_site.id} + self.test_bldg = NautobotBuilding( + name="Site 2", address="", area="NY", latitude="", longitude="", tenant="G&A", uuid=self.sec_site.id + ) + self.test_bldg.diffsync = self.diffsync + + def test_create(self): + """Validate the NautobotBuilding create() method creates a Site.""" + ids = {"name": "HQ"} + attrs = {"address": "123 Main St", "area": "NY", "latitude": "12.345", "longitude": "-67.890", "tenant": "G&A"} + ny_area = Location.objects.get_or_create( + name="NY", location_type=LocationType.objects.get(name="Region"), status=Status.objects.get(name="Active") + )[0] + ny_area.validated_save() + self.diffsync.region_map = {"NY": ny_area.id} + result = NautobotBuilding.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotBuilding) + self.diffsync.job.logger.info.assert_called_once_with("Creating Site HQ.") + site_obj = Location.objects.get(name=ids["name"], location_type__name="Site") + self.assertEqual(site_obj.name, ids["name"]) + self.assertEqual(site_obj.parent.name, attrs["area"]) + self.assertEqual(site_obj.physical_address, attrs["address"]) + self.assertEqual(site_obj.tenant.name, attrs["tenant"]) + + def test_update_w_tenant(self): + """Validate the NautobotBuilding update() method updates a Site with a tenant.""" + update_attrs = { + "address": "456 Wall St", + "latitude": "23.456", + "longitude": "-78.901", + "tenant": "G&A", + } + actual = NautobotBuilding.update(self=self.test_bldg, attrs=update_attrs) + self.test_bldg.diffsync.job.logger.info.assert_called_once_with("Updating Site Site 2.") + self.sec_site.refresh_from_db() + self.assertEqual(self.sec_site.physical_address, update_attrs["address"]) + self.assertEqual(str(self.sec_site.latitude).rstrip("0"), update_attrs["latitude"]) + self.assertEqual(f"{self.sec_site.longitude:.3f}", update_attrs["longitude"]) + self.assertEqual(self.sec_site.tenant.name, update_attrs["tenant"]) + self.assertEqual(actual, self.test_bldg) + + def test_update_wo_tenant(self): + """Validate the NautobotBuilding update() method updates a Site without a tenant.""" + update_attrs = { + "address": "456 Wall St", + "latitude": "23.456", + "longitude": "-78.901", + "tenant": "", + } + NautobotBuilding.update(self=self.test_bldg, attrs=update_attrs) + self.sec_site.refresh_from_db() + self.assertIsNone(self.sec_site.tenant) + + def test_delete(self): + """Validate the NautobotBuilding delete() method deletes a Site.""" + ds_mock_site = MagicMock(spec=Location) + ds_mock_site.uuid = "1234567890" + ds_mock_site.diffsync = MagicMock() + ds_mock_site.diffsync.job.logger.info = MagicMock() + mock_site = MagicMock(spec=Location) + mock_site.name = "Test" + site_get_mock = MagicMock(return_value=mock_site) + with patch.object(Location.objects, "get", site_get_mock): + result = NautobotBuilding.delete(ds_mock_site) + ds_mock_site.diffsync.job.logger.info.assert_called_once_with("Deleting Site Test.") + self.assertEqual(ds_mock_site, result) + + +class TestNautobotFloor(TransactionTestCase): + """Test the NautobotFloor class.""" + + databases = ("default", "job_logs") + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": ga_tenant.id} + loc_type = LocationType.objects.get(name="Site") + self.diffsync.locationtype_map = {"Site": loc_type.id, "Floor": LocationType.objects.get(name="Floor").id} + self.hq_site, _ = Location.objects.get_or_create( + name="HQ", location_type=loc_type, status=Status.objects.get(name="Active") + ) + self.diffsync.site_map = {"HQ": self.hq_site.id} + self.diffsync.floor_map = {} + self.diffsync.status_map = {"Active": Status.objects.get(name="Active").id} + + def test_create(self): + """Test the NautobotFloor create() method creates a LocationType: Floor.""" + ids = {"name": "HQ - Floor 1", "building": "HQ"} + attrs = {"tenant": "G&A"} + result = NautobotFloor.create(self.diffsync, ids, attrs) + self.assertIsInstance(result, NautobotFloor) + self.diffsync.job.logger.info.assert_called_with("Creating Floor HQ - Floor 1.") + floor_obj = Location.objects.get(name=ids["name"], location_type__name="Floor") + self.assertEqual(floor_obj.name, ids["name"]) + self.assertEqual(floor_obj.parent.name, self.hq_site.name) + self.assertEqual(floor_obj.tenant.name, attrs["tenant"]) + + def test_update_w_tenant(self): + """Test the NautobotFloor update() method updates a LocationType: Floor with tenant.""" + floor_type = LocationType.objects.get(name="Floor") + mock_floor = Location.objects.create( + name="HQ - Floor 2", + location_type=floor_type, + parent=self.hq_site, + status=Status.objects.get(name="Active"), + ) + mock_floor.validated_save() + test_floor = NautobotFloor(name="HQ - Floor 2", building="HQ", tenant="", uuid=mock_floor.id) + test_floor.diffsync = self.diffsync + update_attrs = { + "tenant": "G&A", + } + actual = NautobotFloor.update(self=test_floor, attrs=update_attrs) + test_floor.diffsync.job.logger.info.assert_called_once_with( + "Updating Floor HQ - Floor 2 with {'tenant': 'G&A'}" + ) + mock_floor.refresh_from_db() + self.assertEqual(mock_floor.tenant.name, update_attrs["tenant"]) + self.assertEqual(actual, test_floor) + + def test_update_wo_tenant(self): + """Test the NautobotFloor update() method updates a LocationType: Floor without tenant.""" + # I hate having to duplicate with above method but we can't have in setUp and test for ContentTypes. + floor_type, _ = LocationType.objects.get_or_create(name="Floor") + mock_floor = Location.objects.create( + name="HQ - Floor 2", + location_type=floor_type, + parent=self.hq_site, + status=Status.objects.get(name="Active"), + ) + mock_floor.validated_save() + test_floor = NautobotFloor(name="HQ - Floor 2", building="HQ", tenant="", uuid=mock_floor.id) + test_floor.diffsync = MagicMock() + test_floor.diffsync.job.logger.info = MagicMock() + update_attrs = { + "tenant": None, + } + NautobotFloor.update(self=test_floor, attrs=update_attrs) + test_floor.diffsync.job.logger.info.assert_called_once_with("Updating Floor HQ - Floor 2 with {'tenant': None}") + mock_floor.refresh_from_db() + self.assertIsNone(mock_floor.tenant) + + def test_delete(self): + """Validate the NautobotFloor delete() method deletes a LocationType: Floor.""" + ds_mock_floor = MagicMock(spec=Location) + ds_mock_floor.uuid = "1234567890" + ds_mock_floor.diffsync = MagicMock() + ds_mock_floor.diffsync.job.logger.info = MagicMock() + mock_floor = MagicMock(spec=Location) + mock_floor.name = "Test" + mock_floor.parent.name = "HQ" + floor_get_mock = MagicMock(return_value=mock_floor) + with patch.object(Location.objects, "get", floor_get_mock): + result = NautobotFloor.delete(ds_mock_floor) + ds_mock_floor.diffsync.job.logger.info.assert_called_once_with("Deleting Floor Test in HQ.") + self.assertEqual(ds_mock_floor, result) + + +class TestNautobotDevice(TransactionTestCase): + """Test NautobotDevice class.""" + + def setUp(self): + super().setUp() + + self.diffsync = DiffSync() + self.diffsync.job = MagicMock() + self.diffsync.job.logger.info = MagicMock() + self.ga_tenant = Tenant.objects.create(name="G&A") + self.diffsync.tenant_map = {"G&A": self.ga_tenant.id} + + self.status_active = Status.objects.get(name="Active") + self.diffsync.status_map = {"Active": self.status_active.id} + self.ids = { + "name": "core-router.testexample.com", + } + self.attrs = { + "floor": "HQ - Floor 1", + "management_addr": "10.10.0.1", + "model": "Nexus 9300", + "platform": "cisco_ios", + "role": "core", + "site": "HQ", + "serial": "1234567890", + "status": "Active", + "tenant": "G&A", + "vendor": "Cisco", + "version": "16.12.3", + } + self.diffsync.site_map = {} + self.diffsync.floor_map = {} + self.diffsync.device_map = {} + self.diffsync.objects_to_create = {"devices": []} # pylint: disable=no-member + + @patch("nautobot_ssot_dna_center.diffsync.models.nautobot.LIFECYCLE_MGMT", True) + def test_create(self): + """Test the NautobotDevice create() method creates a Device.""" + hq_site = Location.objects.create( + name="HQ", status=self.status_active, location_type=LocationType.objects.get(name="Site") + ) + hq_floor = Location.objects.create( + name="HQ - Floor 1", status=self.status_active, location_type=LocationType.objects.get(name="Floor") + ) + self.diffsync.site_map = {"HQ": hq_site.id} + self.diffsync.floor_map = {"HQ - Floor 1": hq_floor.id} + + NautobotDevice.create(self.diffsync, self.ids, self.attrs) + self.diffsync.job.logger.info.assert_called_with("Creating Version 16.12.3 for cisco_ios.") + new_dev = self.diffsync.objects_to_create["devices"][0] + self.assertEqual(new_dev.role, Role.objects.get(name=self.attrs["role"])) + self.assertEqual( + new_dev.device_type, + DeviceType.objects.get( + model=self.attrs["model"], manufacturer=Manufacturer.objects.get(name=self.attrs["vendor"]) + ), + ) + self.assertEqual(new_dev.platform.network_driver, self.attrs["platform"]) + self.assertEqual(new_dev.serial, self.attrs["serial"]) + self.assertTrue(new_dev.location_id) + self.assertEqual(new_dev.location_id, hq_floor.id) + self.assertEqual(new_dev.tenant_id, self.ga_tenant.id) + self.assertTrue(new_dev.custom_field_data["os_version"], self.attrs["version"]) diff --git a/nautobot_ssot/tests/dna_center/test_utils_dna_center.py b/nautobot_ssot/tests/dna_center/test_utils_dna_center.py new file mode 100644 index 000000000..795a8158f --- /dev/null +++ b/nautobot_ssot/tests/dna_center/test_utils_dna_center.py @@ -0,0 +1,226 @@ +"""Tests of DNA Center utility methods.""" + +from unittest.mock import MagicMock, patch, create_autospec +from requests import Response +from parameterized import parameterized +from nautobot.core.testing import TestCase +from dnacentersdk.exceptions import dnacentersdkException +from nautobot_ssot.tests.dna_center.fixtures import ( + DEVICE_DETAIL_FIXTURE, + DEVICE_FIXTURE, + LOCATION_FIXTURE, + PORT_FIXTURE, + RECV_DEVICE_DETAIL_FIXTURE, + RECV_DEVICE_FIXTURE, + RECV_LOCATION_FIXTURE, + RECV_PORT_FIXTURE, +) +from nautobot_ssot.integrations.dna_center.utils.dna_center import DnaCenterClient + + +class TestDnaCenterClient(TestCase): # pylint: disable=too-many-public-methods + """Test DNA Center Client and Calls.""" + + databases = ("default", "job_logs") + + def setUp(self): + """Setup DNAC instance.""" + self.url = "https://dnac.testexample.com" + self.username = "testuser" + self.password = "testpassword" # nosec B105 + self.verify = False + self.dnac = DnaCenterClient(self.url, self.username, self.password, verify=self.verify) + self.dnac.conn = MagicMock() + self.dnac.conn.sites.get_site_count.return_value = {"response": 4} + self.dnac.conn.devices.get_device_count.return_value = {"response": 3} + + self.mock_response = create_autospec(Response) + self.mock_response.message = MagicMock() + self.mock_response.response = MagicMock() + self.mock_response.response.request = MagicMock() + self.mock_response.status_code = MagicMock() + self.mock_response.message.return_value = "Unable to connect to DNA Center!" + self.mock_response.response.return_value = {} + self.mock_response.status_code.return_value = 401 + + @patch("nautobot_ssot_dna_center.utils.dna_center.api.DNACenterAPI") + def test_connect_success(self, mock_api): + self.dnac.connect() + mock_api.assert_called_once_with( # nosec B106 + base_url="https://dnac.testexample.com:443", username="testuser", password="testpassword", verify=False + ) + self.assertIsNotNone(self.dnac.conn) + + @patch("nautobot_ssot_dna_center.utils.dna_center.api.DNACenterAPI") + def test_connect_error(self, mock_api): + self.dnac.conn = None + mock_api.side_effect = dnacentersdkException(self.mock_response) + with self.assertRaises(dnacentersdkException): + self.dnac.connect() + mock_api.assert_called_once_with( # nosec B106 + base_url="https://dnac.testexample.com:443", password="testpassword", username="testuser", verify=False + ) + self.assertIsNone(self.dnac.conn) + + def test_get_locations(self): + """Test the get_locations method in DnaCenterClient.""" + self.dnac.conn.sites.get_site.return_value = RECV_LOCATION_FIXTURE + actual = self.dnac.get_locations() + self.assertEqual(actual, LOCATION_FIXTURE) + + def test_get_locations_catches_api_error(self): + """Test the get_locations method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.sites.get_site.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_locations() + self.assertIn("Unable to get site information from DNA Center.", log.output[0]) + + def test_find_address_and_type(self): + """Test the find_address_and_type method in DnaCenterClient.""" + mock_info = [ + { + "attributes": { + "address": "123 Main St, New York, NY 12345", + "country": "United States", + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + "type": "building", + }, + "nameSpace": "Location", + } + ] + actual = self.dnac.find_address_and_type(info=mock_info) + expected = ("123 Main St, New York, NY 12345", "building") + self.assertEqual(actual, expected) + + def test_find_latitude_and_longitude(self): + """Test the find_latitude_and_longitude method in DnaCenterClient.""" + mock_info = [ + { + "attributes": { + "latitude": "38.581405819248886", + "longitude": "-121.49309067224416", + }, + "nameSpace": "Location", + } + ] + actual = self.dnac.find_latitude_and_longitude(info=mock_info) + expected = ("38.581405819248886", "-121.49309067224416") + self.assertEqual(actual, expected) + + def test_get_devices(self): + """Test the get_devices method in DnaCenterClient.""" + self.dnac.conn.devices.get_device_list.return_value = RECV_DEVICE_FIXTURE + actual = self.dnac.get_devices() + self.assertEqual(actual, DEVICE_FIXTURE) + + def test_get_devices_catches_api_error(self): + """Test the get_devices method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_device_list.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_devices() + self.assertIn("Unable to get device information from DNA Center.", log.output[0]) + + def test_get_device_detail(self): + """Test the get_device_detail method in DnaCenterClient.""" + self.dnac.conn.devices.get_device_detail.return_value = RECV_DEVICE_DETAIL_FIXTURE + actual = self.dnac.get_device_detail(dev_id="1234567890") + self.assertEqual(actual, DEVICE_DETAIL_FIXTURE) + + def test_get_device_detail_catches_api_error(self): + """Test the get_device_detail method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_device_detail.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_device_detail(dev_id="1234567890") + self.assertIn("Unable to get device detail information from DNA Center.", log.output[0]) + + def test_parse_site_hierarchy(self): + """Test the parse_site_hierarchy method in DnaCenterClient.""" + mock_location_map = { + "1": { + "loc_type": "area", + "name": "Global", + }, + "2": { + "loc_type": "area", + "name": "NY", + }, + "3": { + "loc_type": "building", + "name": "Building1", + }, + "4": {"loc_type": "floor", "name": "Floor1"}, + } + actual = self.dnac.parse_site_hierarchy(location_map=mock_location_map, site_hier="1/2/3/4") + expected = { + "areas": ["Global", "NY"], + "building": "Building1", + "floor": "Floor1", + } + self.assertEqual(actual, expected) + + def test_get_port_info(self): + """Test the get_port_info method in DnaCenterClient.""" + self.dnac.conn.devices.get_interface_info_by_id.return_value = RECV_PORT_FIXTURE + actual = self.dnac.get_port_info(device_id="1234567890") + self.assertEqual(actual, PORT_FIXTURE) + + def test_get_port_info_catches_api_error(self): + """Test the get_port_info method in DnaCenterClient catches dnacentersdkException.""" + self.dnac.conn.devices.get_interface_info_by_id.side_effect = dnacentersdkException(self.mock_response) + with self.assertLogs(level="ERROR") as log: + self.dnac.get_port_info(device_id="1234567890") + self.assertIn("Unable to get port information from DNA Center.", log.output[0]) + + mock_port_types = [ + ("SVI", {"portType": "Ethernet SVI"}, "virtual"), + ("Service Module Interface", {"portType": "Service Module Interface"}, "virtual"), + ("FastEthernet", {"portType": "Ethernet Port", "portName": "FastEth0"}, "100base-tx"), + ("GigabitEthernet", {"portType": "Ethernet Port", "portName": "GigabitEthernet0/1"}, "1000base-t"), + ("Number port", {"portType": "Ethernet Port", "portName": "0/1"}, "other"), + ] + + @parameterized.expand(mock_port_types, skip_on_empty=True) + def test_get_port_type(self, name, sent, received): # pylint: disable=unused-argument + """Test the get_port_type method in DnaCenterClient.""" + actual = self.dnac.get_port_type(port_info=sent) + self.assertEqual(actual, received) + + mock_port_status = [ + ("Maintenance", {"adminStatus": "DOWN", "status": "down"}, "Maintenance"), + ("Failed", {"adminStatus": "UP", "status": "down"}, "Failed"), + ("Planned", {"adminStatus": "DOWN", "status": "up"}, "Planned"), + ("Active", {"adminStatus": "UP", "status": "up"}, "Active"), + ] + + @parameterized.expand(mock_port_status, skip_on_empty=True) + def test_get_port_status(self, name, sent, received): # pylint: disable=unused-argument + """Test the get_port_status method in DnaCenterClient.""" + actual = self.dnac.get_port_status(port_info=sent) + self.assertEqual(actual, received) + + def test_parse_hostname_for_role_success(self): + """Validate the functionality of the parse_hostname_for_role method success.""" + hostname_mapping = [(".*EDGE.*", "Edge"), (".*DMZ.*", "DMZ")] + hostname = "DMZ-switch.example.com" + result = self.dnac.parse_hostname_for_role(hostname_map=hostname_mapping, device_hostname=hostname) + self.assertEqual(result, "DMZ") + + def test_parse_hostname_for_role_failure(self): + """Validate the functionality of the parse_hostname_for_role method failure.""" + hostname_mapping = [] + hostname = "core-router.example.com" + result = self.dnac.parse_hostname_for_role(hostname_map=hostname_mapping, device_hostname=hostname) + self.assertEqual(result, "Unknown") + + def test_get_model_name_single_model(self): + """Validate the functionality of get_model_name method with single model in string.""" + test_model = "CSR1000v" + result = self.dnac.get_model_name(models=test_model) + self.assertEqual(result, "CSR1000v") + + def test_get_model_name_multiple_models(self): + """Validate the functionality of get_model_name method with multiple models in string.""" + test_models = "CSR1000v, CSR1000v, CSR1000v" + result = self.dnac.get_model_name(models=test_models) + self.assertEqual(result, "CSR1000v") diff --git a/nautobot_ssot/tests/infoblox/fixtures_infoblox.py b/nautobot_ssot/tests/infoblox/fixtures_infoblox.py index 4edf6a189..23f2b50eb 100644 --- a/nautobot_ssot/tests/infoblox/fixtures_infoblox.py +++ b/nautobot_ssot/tests/infoblox/fixtures_infoblox.py @@ -1,4 +1,5 @@ """Infoblox Fixtures.""" + # Ignoring docstrings on fixtures pylint: disable=missing-function-docstring # Ignoring using fixtures in other fixtures pylint: disable=redefined-outer-name import json diff --git a/nautobot_ssot/tests/infoblox/test_client.py b/nautobot_ssot/tests/infoblox/test_client.py index 8352d2828..82f652d8d 100644 --- a/nautobot_ssot/tests/infoblox/test_client.py +++ b/nautobot_ssot/tests/infoblox/test_client.py @@ -1,4 +1,5 @@ """Unit tests for Infoblox client.""" + # pylint: disable=protected-access # pylint: disable=too-many-public-methods from collections import namedtuple diff --git a/nautobot_ssot/tests/infoblox/test_infoblox_adapter.py b/nautobot_ssot/tests/infoblox/test_infoblox_adapter.py index 3c3c5185a..a2a8112ef 100644 --- a/nautobot_ssot/tests/infoblox/test_infoblox_adapter.py +++ b/nautobot_ssot/tests/infoblox/test_infoblox_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the Infoblox DiffSync adapter class.""" + import unittest from nautobot_ssot.integrations.infoblox.diffsync.adapters.infoblox import ( diff --git a/nautobot_ssot/tests/infoblox/test_nautobot_adapter.py b/nautobot_ssot/tests/infoblox/test_nautobot_adapter.py index 5fa6a5339..2a8349d09 100644 --- a/nautobot_ssot/tests/infoblox/test_nautobot_adapter.py +++ b/nautobot_ssot/tests/infoblox/test_nautobot_adapter.py @@ -1,4 +1,5 @@ """Nautobot Adapter tests.""" + from django.contrib.contenttypes.models import ContentType from django.test import TestCase diff --git a/nautobot_ssot/tests/infoblox/test_tags_and_cfs.py b/nautobot_ssot/tests/infoblox/test_tags_and_cfs.py index 67394b814..e4dd93fc4 100644 --- a/nautobot_ssot/tests/infoblox/test_tags_and_cfs.py +++ b/nautobot_ssot/tests/infoblox/test_tags_and_cfs.py @@ -1,4 +1,5 @@ """Tests covering use of tags and custom fields in the plugin.""" + import datetime from unittest.mock import Mock diff --git a/nautobot_ssot/tests/infoblox/test_utils.py b/nautobot_ssot/tests/infoblox/test_utils.py index 2cd86abda..fde91382e 100644 --- a/nautobot_ssot/tests/infoblox/test_utils.py +++ b/nautobot_ssot/tests/infoblox/test_utils.py @@ -1,4 +1,5 @@ """Util tests that do not require Django.""" + import unittest from django.test import TestCase diff --git a/nautobot_ssot/tests/ipfabric/fixtures/__init__.py b/nautobot_ssot/tests/ipfabric/fixtures/__init__.py index 13092a6d2..5c0f56b73 100644 --- a/nautobot_ssot/tests/ipfabric/fixtures/__init__.py +++ b/nautobot_ssot/tests/ipfabric/fixtures/__init__.py @@ -12,6 +12,7 @@ This will return a loaded json object. """ + import os real_path = os.path.dirname(os.path.realpath(__file__)) diff --git a/nautobot_ssot/tests/ipfabric/test_ipfabric_adapter.py b/nautobot_ssot/tests/ipfabric/test_ipfabric_adapter.py index 28bf30d0d..f5a780203 100644 --- a/nautobot_ssot/tests/ipfabric/test_ipfabric_adapter.py +++ b/nautobot_ssot/tests/ipfabric/test_ipfabric_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the IPFabric DiffSync adapter class.""" + import json from unittest import TestCase from unittest.mock import MagicMock, patch diff --git a/nautobot_ssot/tests/ipfabric/test_jobs.py b/nautobot_ssot/tests/ipfabric/test_jobs.py index ac355629d..d3095dbc8 100644 --- a/nautobot_ssot/tests/ipfabric/test_jobs.py +++ b/nautobot_ssot/tests/ipfabric/test_jobs.py @@ -1,4 +1,5 @@ """Test IPFabric Jobs.""" + from copy import deepcopy from django.conf import settings diff --git a/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py b/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py index e1ee4089a..7443dc701 100644 --- a/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py +++ b/nautobot_ssot/tests/ipfabric/test_nautobot_adapter.py @@ -1,4 +1,5 @@ """Unit tests for the IPFabric DiffSync adapter class.""" + import unittest from django.contrib.contenttypes.models import ContentType diff --git a/nautobot_ssot/tests/ipfabric/test_nbutils.py b/nautobot_ssot/tests/ipfabric/test_nbutils.py index 07bd061f2..4a01a422f 100644 --- a/nautobot_ssot/tests/ipfabric/test_nbutils.py +++ b/nautobot_ssot/tests/ipfabric/test_nbutils.py @@ -1,4 +1,5 @@ """Test Nautobot Utilities.""" + import unittest from django.contrib.contenttypes.models import ContentType diff --git a/nautobot_ssot/tests/ipfabric/test_utils.py b/nautobot_ssot/tests/ipfabric/test_utils.py index c0f4e8352..f15de4d0a 100644 --- a/nautobot_ssot/tests/ipfabric/test_utils.py +++ b/nautobot_ssot/tests/ipfabric/test_utils.py @@ -1,4 +1,5 @@ """Tests for IPFabric utilities.utils.""" + from django.test import SimpleTestCase from nautobot_ssot.integrations.ipfabric.constants import DEFAULT_INTERFACE_TYPE diff --git a/nautobot_ssot/tests/jobs/__init__.py b/nautobot_ssot/tests/jobs/__init__.py index 17bbc24b2..45ab3fc73 100644 --- a/nautobot_ssot/tests/jobs/__init__.py +++ b/nautobot_ssot/tests/jobs/__init__.py @@ -1,4 +1,5 @@ """Override of classes.""" + from nautobot.extras.jobs import Job from nautobot_ssot.jobs import DataSource as _DataSource, DataTarget as _DataTarget from nautobot_ssot.jobs.base import DataSyncBaseJob as _DataSyncBaseJob diff --git a/nautobot_ssot/tests/servicenow/test_jobs.py b/nautobot_ssot/tests/servicenow/test_jobs.py index 141686929..0052f0be1 100644 --- a/nautobot_ssot/tests/servicenow/test_jobs.py +++ b/nautobot_ssot/tests/servicenow/test_jobs.py @@ -1,4 +1,5 @@ """Test the Job class in this app.""" + import os from unittest import mock diff --git a/nautobot_ssot/tests/test_api.py b/nautobot_ssot/tests/test_api.py index a03f5b0c8..430619f14 100644 --- a/nautobot_ssot/tests/test_api.py +++ b/nautobot_ssot/tests/test_api.py @@ -1,4 +1,5 @@ """Unit tests for nautobot_ssot.""" + from django.contrib.auth import get_user_model from django.urls import reverse from nautobot.users.models import Token diff --git a/nautobot_ssot/tests/test_basic.py b/nautobot_ssot/tests/test_basic.py index bcf7d12de..30fc318ed 100644 --- a/nautobot_ssot/tests/test_basic.py +++ b/nautobot_ssot/tests/test_basic.py @@ -1,4 +1,5 @@ """Basic tests that do not require Django.""" + import unittest import os import toml diff --git a/nautobot_ssot/tests/test_jobs.py b/nautobot_ssot/tests/test_jobs.py index fae79e129..fbca132b0 100644 --- a/nautobot_ssot/tests/test_jobs.py +++ b/nautobot_ssot/tests/test_jobs.py @@ -1,4 +1,5 @@ """Test the Job classes in nautobot_ssot.""" + import os.path from unittest.mock import Mock, call diff --git a/nautobot_ssot/tests/test_management.py b/nautobot_ssot/tests/test_management.py index 9a91acb70..11f1bac4e 100644 --- a/nautobot_ssot/tests/test_management.py +++ b/nautobot_ssot/tests/test_management.py @@ -1,4 +1,5 @@ """Test cases for custom Django MGMT commands.""" + from io import StringIO from django.contrib.contenttypes.models import ContentType diff --git a/nautobot_ssot/tests/test_render_diff.py b/nautobot_ssot/tests/test_render_diff.py index a88eac843..3590b346d 100644 --- a/nautobot_ssot/tests/test_render_diff.py +++ b/nautobot_ssot/tests/test_render_diff.py @@ -1,4 +1,5 @@ """Test Render_diff templatetags.""" + import unittest from nautobot_ssot.templatetags.render_diff import render_diff diff --git a/nautobot_ssot/utils.py b/nautobot_ssot/utils.py index e922deb97..99bc3d094 100644 --- a/nautobot_ssot/utils.py +++ b/nautobot_ssot/utils.py @@ -1,4 +1,5 @@ """Utility functions for Nautobot SSoT App.""" + import logging logger = logging.getLogger("nautobot.ssot") diff --git a/poetry.lock b/poetry.lock index 572da8d93..072b637b2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -17,87 +17,87 @@ typing = "*" [[package]] name = "aiohttp" -version = "3.9.0" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc"}, - {file = "aiohttp-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8"}, - {file = "aiohttp-3.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94"}, - {file = "aiohttp-3.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30"}, - {file = "aiohttp-3.9.0-cp310-cp310-win32.whl", hash = "sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3"}, - {file = "aiohttp-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218"}, - {file = "aiohttp-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896"}, - {file = "aiohttp-3.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411"}, - {file = "aiohttp-3.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192"}, - {file = "aiohttp-3.9.0-cp311-cp311-win32.whl", hash = "sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea"}, - {file = "aiohttp-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994"}, - {file = "aiohttp-3.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982"}, - {file = "aiohttp-3.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3"}, - {file = "aiohttp-3.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8"}, - {file = "aiohttp-3.9.0-cp312-cp312-win32.whl", hash = "sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80"}, - {file = "aiohttp-3.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b"}, - {file = "aiohttp-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73"}, - {file = "aiohttp-3.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11"}, - {file = "aiohttp-3.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887"}, - {file = "aiohttp-3.9.0-cp38-cp38-win32.whl", hash = "sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f"}, - {file = "aiohttp-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8"}, - {file = "aiohttp-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787"}, - {file = "aiohttp-3.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9"}, - {file = "aiohttp-3.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e"}, - {file = "aiohttp-3.9.0-cp39-cp39-win32.whl", hash = "sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454"}, - {file = "aiohttp-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f"}, - {file = "aiohttp-3.9.0.tar.gz", hash = "sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -138,17 +138,17 @@ files = [ [[package]] name = "amqp" -version = "5.1.1" +version = "5.2.0" description = "Low-level AMQP client for Python (fork of amqplib)." optional = false python-versions = ">=3.6" files = [ - {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"}, - {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"}, + {file = "amqp-5.2.0-py3-none-any.whl", hash = "sha256:827cb12fb0baa892aad844fd95258143bce4027fdac4fccddbc43330fd281637"}, + {file = "amqp-5.2.0.tar.gz", hash = "sha256:a1ecff425ad063ad42a486c902807d1482311481c8ad95a72694b2975e75f7fd"}, ] [package.dependencies] -vine = ">=5.0.0" +vine = ">=5.0.0,<6.0.0" [[package]] name = "aniso8601" @@ -163,45 +163,46 @@ files = [ [[package]] name = "anyio" -version = "4.0.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, - {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" 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)"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.22)"] +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)"] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] name = "asgiref" -version = "3.7.2" +version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, - {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] [package.dependencies] @@ -212,39 +213,50 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "2.15.8" +version = "3.1.0" description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" files = [ - {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, - {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, + {file = "astroid-3.1.0-py3-none-any.whl", hash = "sha256:951798f922990137ac090c53af473db7ab4e70c770e6d7fae0cec59f74411819"}, + {file = "astroid-3.1.0.tar.gz", hash = "sha256:ac248253bfa4bd924a0de213707e7ebeeb3138abeb48d798784ead1e56d419d4"}, ] [package.dependencies] -lazy-object-proxy = ">=1.4.0" typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} -wrapt = [ - {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, - {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, -] [[package]] name = "asttokens" -version = "2.4.0" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.4.0-py2.py3-none-any.whl", hash = "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69"}, - {file = "asttokens-2.4.0.tar.gz", hash = "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" [[package]] name = "async-timeout" @@ -274,20 +286,38 @@ docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] +[[package]] +name = "autopep8" +version = "2.0.0" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +optional = false +python-versions = "*" +files = [ + {file = "autopep8-2.0.0-py2.py3-none-any.whl", hash = "sha256:ad924b42c2e27a1ac58e432166cc4588f5b80747de02d0d35b1ecbd3e7d57207"}, + {file = "autopep8-2.0.0.tar.gz", hash = "sha256:8b1659c7f003e693199f52caffdc06585bb0716900bbc6a7442fd931d658c077"}, +] + +[package.dependencies] +pycodestyle = ">=2.9.1" +tomli = "*" + [[package]] name = "babel" -version = "2.12.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "backcall" version = "0.2.0" @@ -332,67 +362,68 @@ tzdata = ["tzdata"] [[package]] name = "bandit" -version = "1.7.5" +version = "1.7.8" description = "Security oriented static analyser for python code." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, - {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, + {file = "bandit-1.7.8-py3-none-any.whl", hash = "sha256:509f7af645bc0cd8fd4587abc1a038fc795636671ee8204d502b933aee44f381"}, + {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, ] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" PyYAML = ">=5.3.1" rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +baseline = ["GitPython (>=3.1.30)"] +sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"] toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] [[package]] name = "billiard" -version = "4.1.0" +version = "4.2.0" description = "Python multiprocessing fork with improvements and bugfixes" optional = false python-versions = ">=3.7" files = [ - {file = "billiard-4.1.0-py3-none-any.whl", hash = "sha256:0f50d6be051c6b2b75bfbc8bfd85af195c5739c281d3f5b86a5640c65563614a"}, - {file = "billiard-4.1.0.tar.gz", hash = "sha256:1ad2eeae8e28053d729ba3373d34d9d6e210f6e4d8bf0a9c64f92bd053f1edf5"}, + {file = "billiard-4.2.0-py3-none-any.whl", hash = "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d"}, + {file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"}, ] [[package]] name = "black" -version = "23.9.1" +version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, - {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, - {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, - {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, - {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, - {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, - {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, - {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, - {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, - {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, - {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, - {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, - {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, - {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, - {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, ] [package.dependencies] @@ -406,36 +437,36 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "celery" -version = "5.3.4" +version = "5.3.6" description = "Distributed Task Queue." optional = false python-versions = ">=3.8" files = [ - {file = "celery-5.3.4-py3-none-any.whl", hash = "sha256:1e6ed40af72695464ce98ca2c201ad0ef8fd192246f6c9eac8bba343b980ad34"}, - {file = "celery-5.3.4.tar.gz", hash = "sha256:9023df6a8962da79eb30c0c84d5f4863d9793a466354cc931d7f72423996de28"}, + {file = "celery-5.3.6-py3-none-any.whl", hash = "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af"}, + {file = "celery-5.3.6.tar.gz", hash = "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9"}, ] [package.dependencies] "backports.zoneinfo" = {version = ">=0.2.1", markers = "python_version < \"3.9\""} -billiard = ">=4.1.0,<5.0" +billiard = ">=4.2.0,<5.0" click = ">=8.1.2,<9.0" click-didyoumean = ">=0.3.0" click-plugins = ">=1.1.1" click-repl = ">=0.2.0" -kombu = ">=5.3.2,<6.0" +kombu = ">=5.3.4,<6.0" python-dateutil = ">=2.8.2" tzdata = ">=2022.7" -vine = ">=5.0.0,<6.0" +vine = ">=5.1.0,<6.0" [package.extras] arangodb = ["pyArango (>=2.0.2)"] -auth = ["cryptography (==41.0.3)"] +auth = ["cryptography (==41.0.5)"] azureblockblob = ["azure-storage-blob (>=12.15.0)"] brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] cassandra = ["cassandra-driver (>=3.25.0,<4)"] @@ -445,36 +476,36 @@ couchbase = ["couchbase (>=3.0.0)"] couchdb = ["pycouchdb (==1.14.2)"] django = ["Django (>=2.2.28)"] dynamodb = ["boto3 (>=1.26.143)"] -elasticsearch = ["elasticsearch (<8.0)"] +elasticsearch = ["elastic-transport (<=8.10.0)", "elasticsearch (<=8.11.0)"] eventlet = ["eventlet (>=0.32.0)"] gevent = ["gevent (>=1.5.0)"] librabbitmq = ["librabbitmq (>=2.0.0)"] memcache = ["pylibmc (==1.6.3)"] mongodb = ["pymongo[srv] (>=4.0.2)"] -msgpack = ["msgpack (==1.0.5)"] +msgpack = ["msgpack (==1.0.7)"] pymemcache = ["python-memcached (==1.59)"] pyro = ["pyro4 (==4.82)"] pytest = ["pytest-celery (==0.0.0)"] -redis = ["redis (>=4.5.2,!=4.5.5,<5.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] s3 = ["boto3 (>=1.26.143)"] slmq = ["softlayer-messaging (>=1.0.3)"] -solar = ["ephem (==4.1.4)"] +solar = ["ephem (==4.1.5)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.0)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] -zstd = ["zstandard (==0.21.0)"] +zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -543,86 +574,101 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" 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.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {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"}, ] [[package]] @@ -658,13 +704,13 @@ test = ["pytest"] [[package]] name = "click-didyoumean" -version = "0.3.0" +version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" optional = false -python-versions = ">=3.6.2,<4.0.0" +python-versions = ">=3.6.2" files = [ - {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, - {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, + {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, + {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, ] [package.dependencies] @@ -707,26 +753,29 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] [[package]] name = "cloudvision" -version = "1.13.0" -description = "A Python library for Arista's CloudVision APIs." +version = "1.20.0" +description = "A Python library for Arista's CloudVision APIs and Provisioning Action integrations." optional = true -python-versions = "*" +python-versions = ">=3.7.0" files = [ - {file = "cloudvision-1.13.0-py3-none-any.whl", hash = "sha256:6a6faf03657795705461540877902f1cfe11eeee63eb64623822b86af68c863a"}, - {file = "cloudvision-1.13.0.tar.gz", hash = "sha256:d71b3574f402c9fe75d197c6b55de60ec68d1e257b27373118f8fde4e775a9f7"}, + {file = "cloudvision-1.20.0-py3-none-any.whl", hash = "sha256:ccdc8116184d808226a1cbb8c678a6e4f338d67537d469c41231e37cb31aa00f"}, + {file = "cloudvision-1.20.0.tar.gz", hash = "sha256:33760b93aa1d4267acd195432cbb5b6228e6c00d965b9127d6d7ec276c70badf"}, ] [package.dependencies] -cryptography = ">=41.0.3,<42.0.0" -grpcio = ">=1.46.0" +cryptography = ">=42.0.4,<43.0.0" +grpcio = ">=1.53.0" msgpack = ">=1.0.3" -protobuf = ">=3.20.1,<4.0" +protobuf = ">=4.22.5,<5.0" requests = ">=2.20.1" -types-protobuf = ">=3.20.1,<4.0" +types-protobuf = ">=3.20.4.6,<4.0" types-PyYAML = ">=6.0.7" types-requests = ">=2.27.25" typing-extensions = ">=4.2.0" +[package.extras] +dev = ["black (==24.3.0)", "flake8 (==3.8.4)", "grpcio-tools (>=1.53.2)", "isort (==5.11.4)", "mypy (==0.950)", "mypy-protobuf (==3.2.0)", "numpy (==1.26.4)", "pytest (==7.1.2)", "pyyaml (==6.0.1)", "twine (==4.0.1)", "types-attrs (>=19.1.0)", "wheel (==0.38.4)"] + [[package]] name = "colorama" version = "0.4.6" @@ -825,63 +874,63 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "coverage" -version = "7.3.1" +version = "7.5.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, - {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, - {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, - {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, - {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, - {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, - {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, - {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, - {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, - {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, - {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, - {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, - {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, - {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, - {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, - {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, - {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, - {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, - {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, - {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, - {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, - {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, - {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, - {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, - {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, - {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, - {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, - {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, + {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, + {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, + {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, + {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, + {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, + {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, + {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, + {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, + {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, + {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, + {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, + {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, ] [package.extras] @@ -889,12 +938,13 @@ toml = ["tomli"] [[package]] name = "cron-descriptor" -version = "1.4.0" +version = "1.4.3" description = "A Python library that converts cron expressions into human readable strings." optional = false python-versions = "*" files = [ - {file = "cron_descriptor-1.4.0.tar.gz", hash = "sha256:b6ff4e3a988d7ca04a4ab150248e9f166fb7a5c828a85090e75bcc25aa93b4dd"}, + {file = "cron_descriptor-1.4.3-py3-none-any.whl", hash = "sha256:a67ba21804983b1427ed7f3e1ec27ee77bf24c652b0430239c268c5ddfbf9dc0"}, + {file = "cron_descriptor-1.4.3.tar.gz", hash = "sha256:7b1a00d7d25d6ae6896c0da4457e790b98cba778398a3d48e341e5e0d33f0488"}, ] [package.extras] @@ -902,57 +952,66 @@ dev = ["polib"] [[package]] name = "cryptography" -version = "41.0.6" +version = "42.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.6-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c"}, - {file = "cryptography-41.0.6-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b"}, - {file = "cryptography-41.0.6-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8"}, - {file = "cryptography-41.0.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86"}, - {file = "cryptography-41.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae"}, - {file = "cryptography-41.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d"}, - {file = "cryptography-41.0.6-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c"}, - {file = "cryptography-41.0.6-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596"}, - {file = "cryptography-41.0.6-cp37-abi3-win32.whl", hash = "sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660"}, - {file = "cryptography-41.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7"}, - {file = "cryptography-41.0.6-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c"}, - {file = "cryptography-41.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9"}, - {file = "cryptography-41.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da"}, - {file = "cryptography-41.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36"}, - {file = "cryptography-41.0.6-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65"}, - {file = "cryptography-41.0.6-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead"}, - {file = "cryptography-41.0.6-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09"}, - {file = "cryptography-41.0.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c"}, - {file = "cryptography-41.0.6-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed"}, - {file = "cryptography-41.0.6-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6"}, - {file = "cryptography-41.0.6-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43"}, - {file = "cryptography-41.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4"}, - {file = "cryptography-41.0.6.tar.gz", hash = "sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] name = "cvprac" -version = "1.3.1" +version = "1.3.2" description = "Arista Cloudvision(R) Portal Rest API Client written in python" optional = true python-versions = "*" files = [ - {file = "cvprac-1.3.1.tar.gz", hash = "sha256:df874a53dfb3b1e724b7a5931f4b51595c8948991c71ad1b047483eab300dc0d"}, + {file = "cvprac-1.3.2.tar.gz", hash = "sha256:5f0e5249c7e73d3c6f10a698be57f50382073773e6c81d74640fcc4976b602e5"}, ] [package.dependencies] @@ -963,13 +1022,13 @@ dev = ["check-manifest", "coverage", "pep8", "pyflakes", "pylint", "pyyaml"] [[package]] name = "cycler" -version = "0.12.0" +version = "0.12.1" description = "Composable style cycles" optional = true python-versions = ">=3.8" files = [ - {file = "cycler-0.12.0-py3-none-any.whl", hash = "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947"}, - {file = "cycler-0.12.0.tar.gz", hash = "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] [package.extras] @@ -989,13 +1048,13 @@ files = [ [[package]] name = "deepdiff" -version = "6.5.0" +version = "6.7.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false python-versions = ">=3.7" files = [ - {file = "deepdiff-6.5.0-py3-none-any.whl", hash = "sha256:acdc1651a3e802415e0337b7e1192df5cd7c17b72fbab480466fdd799b9a72e7"}, - {file = "deepdiff-6.5.0.tar.gz", hash = "sha256:080b1359d6128f3f5f1738c6be3064f0ad9b0cc41994aa90a028065f6ad11f25"}, + {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, + {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, ] [package.dependencies] @@ -1018,13 +1077,13 @@ files = [ [[package]] name = "diffsync" -version = "1.8.0" +version = "1.10.0" description = "Library to easily sync/diff/update 2 different data sources" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<4.0" files = [ - {file = "diffsync-1.8.0-py3-none-any.whl", hash = "sha256:e9c7677170d40155083cd48e91aa80817f8f097364f744b95d6b4c2ec405c909"}, - {file = "diffsync-1.8.0.tar.gz", hash = "sha256:1d59e11009c46a55501aee87c31b978dabda137ae32049105687671c5e7675b9"}, + {file = "diffsync-1.10.0-py3-none-any.whl", hash = "sha256:f4368c97162d51eecc7a8e87026c731197a694026cabcf2ab4f16d18d7bdadbd"}, + {file = "diffsync-1.10.0.tar.gz", hash = "sha256:a9d7cb8e8ce983b446bf858c1c5c82cf473fcf231db73c0855e8c59ee7cd8370"}, ] [package.dependencies] @@ -1032,33 +1091,35 @@ colorama = ">=0.4.3,<0.5.0" packaging = ">=21.3,<24.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" structlog = ">=20.1.0,<23.0.0" +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] redis = ["redis (>=4.3,<5.0)"] [[package]] name = "dill" -version = "0.3.7" +version = "0.3.8" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "django" -version = "3.2.24" +version = "3.2.25" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.6" files = [ - {file = "Django-3.2.24-py3-none-any.whl", hash = "sha256:5dd5b787c3ba39637610fe700f54bf158e33560ea0dba600c19921e7ff926ec5"}, - {file = "Django-3.2.24.tar.gz", hash = "sha256:aaee9fb0fb4ebd4311520887ad2e33313d368846607f82a9a0ed461cd4c35b18"}, + {file = "Django-3.2.25-py3-none-any.whl", hash = "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38"}, + {file = "Django-3.2.25.tar.gz", hash = "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777"}, ] [package.dependencies] @@ -1083,37 +1144,37 @@ files = [ [[package]] name = "django-celery-beat" -version = "2.5.0" +version = "2.6.0" description = "Database-backed Periodic Tasks." optional = false python-versions = "*" files = [ - {file = "django-celery-beat-2.5.0.tar.gz", hash = "sha256:cd0a47f5958402f51ac0c715bc942ae33d7b50b4e48cba91bc3f2712be505df1"}, - {file = "django_celery_beat-2.5.0-py3-none-any.whl", hash = "sha256:ae460faa5ea142fba0875409095d22f6bd7bcc7377889b85e8cab5c0dfb781fe"}, + {file = "django-celery-beat-2.6.0.tar.gz", hash = "sha256:f75b2d129731f1214be8383e18fae6bfeacdb55dffb2116ce849222c0106f9ad"}, ] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} celery = ">=5.2.3,<6.0" cron-descriptor = ">=1.2.32" -Django = ">=2.2,<5.0" +Django = ">=2.2,<5.1" django-timezone-field = ">=5.0" python-crontab = ">=2.3.4" tzdata = "*" [[package]] name = "django-celery-results" -version = "2.4.0" +version = "2.5.1" description = "Celery result backends for Django." optional = false python-versions = "*" files = [ - {file = "django_celery_results-2.4.0-py3-none-any.whl", hash = "sha256:be91307c02fbbf0dda21993c3001c60edb74595444ccd6ad696552fe3689e85b"}, - {file = "django_celery_results-2.4.0.tar.gz", hash = "sha256:75aa51970db5691cbf242c6a0ff50c8cdf419e265cd0e9b772335d06436c4b99"}, + {file = "django_celery_results-2.5.1-py3-none-any.whl", hash = "sha256:0da4cd5ecc049333e4524a23fcfc3460dfae91aa0a60f1fae4b6b2889c254e01"}, + {file = "django_celery_results-2.5.1.tar.gz", hash = "sha256:3ecb7147f773f34d0381bac6246337ce4cf88a2ea7b82774ed48e518b67bb8fd"}, ] [package.dependencies] -celery = ">=5.2.3,<6.0" +celery = ">=5.2.7,<6.0" +Django = ">=3.2.18" [[package]] name = "django-constance" @@ -1135,26 +1196,28 @@ redis = ["redis"] [[package]] name = "django-cors-headers" -version = "4.2.0" +version = "4.3.1" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." optional = false python-versions = ">=3.8" files = [ - {file = "django_cors_headers-4.2.0-py3-none-any.whl", hash = "sha256:9ada212b0e2efd4a5e339360ffc869cb21ac5605e810afe69f7308e577ea5bde"}, - {file = "django_cors_headers-4.2.0.tar.gz", hash = "sha256:f9749c6410fe738278bc2b6ef17f05195bc7b251693c035752d8257026af024f"}, + {file = "django-cors-headers-4.3.1.tar.gz", hash = "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207"}, + {file = "django_cors_headers-4.3.1-py3-none-any.whl", hash = "sha256:0b1fd19297e37417fc9f835d39e45c8c642938ddba1acce0c1753d3edef04f36"}, ] [package.dependencies] +asgiref = ">=3.6" Django = ">=3.2" [[package]] name = "django-db-file-storage" -version = "0.5.5" +version = "0.5.6.1" description = "Custom FILE_STORAGE for Django. Saves files in your database instead of your file system." optional = false python-versions = "*" files = [ - {file = "django-db-file-storage-0.5.5.tar.gz", hash = "sha256:5d5da694b78ab202accab4508b958e0e37b3d146310e76f6f6125e1bdeaaad14"}, + {file = "django-db-file-storage-0.5.6.1.tar.gz", hash = "sha256:f0c4540ed6b772e8b3141eae3222acde4c29ab771477a5c999013a3980856c7f"}, + {file = "django_db_file_storage-0.5.6.1-py3-none-any.whl", hash = "sha256:3feac1e060b550c3c03c35e95d2111d9f100bc247863ace691a78b107f1fc3d5"}, ] [package.dependencies] @@ -1162,13 +1225,13 @@ Django = "*" [[package]] name = "django-debug-toolbar" -version = "4.2.0" +version = "4.3.0" description = "A configurable set of panels that display various debug information about the current request/response." optional = false python-versions = ">=3.8" files = [ - {file = "django_debug_toolbar-4.2.0-py3-none-any.whl", hash = "sha256:af99128c06e8e794479e65ab62cc6c7d1e74e1c19beb44dcbf9bad7a9c017327"}, - {file = "django_debug_toolbar-4.2.0.tar.gz", hash = "sha256:bc7fdaafafcdedefcc67a4a5ad9dac96efd6e41db15bc74d402a54a2ba4854dc"}, + {file = "django_debug_toolbar-4.3.0-py3-none-any.whl", hash = "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6"}, + {file = "django_debug_toolbar-4.3.0.tar.gz", hash = "sha256:0b0dddee5ea29b9cb678593bc0d7a6d76b21d7799cb68e091a2148341a80f3c4"}, ] [package.dependencies] @@ -1191,13 +1254,13 @@ Django = ">=3.2" [[package]] name = "django-filter" -version = "23.1" +version = "23.5" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." optional = false python-versions = ">=3.7" files = [ - {file = "django-filter-23.1.tar.gz", hash = "sha256:dee5dcf2cea4d7f767e271b6d01f767fce7500676d5e5dc58dac8154000b87df"}, - {file = "django_filter-23.1-py3-none-any.whl", hash = "sha256:e3c52ad83c32fb5882125105efb5fea2a1d6a85e7dc64b04ef52edbf14451b6c"}, + {file = "django-filter-23.5.tar.gz", hash = "sha256:67583aa43b91fe8c49f74a832d95f4d8442be628fd4c6d65e9f811f5153a4e5c"}, + {file = "django_filter-23.5-py3-none-any.whl", hash = "sha256:99122a201d83860aef4fe77758b69dda913e874cc5e0eaa50a86b0b18d708400"}, ] [package.dependencies] @@ -1205,13 +1268,13 @@ Django = ">=3.2" [[package]] name = "django-health-check" -version = "3.17.0" +version = "3.18.1" description = "Run checks on services like databases, queue servers, celery processes, etc." optional = false python-versions = ">=3.8" files = [ - {file = "django-health-check-3.17.0.tar.gz", hash = "sha256:d1b8671e79d1de6e3dd1a9c69566222b0bfcfacca8b90511a4407b2d0d3d2778"}, - {file = "django_health_check-3.17.0-py2.py3-none-any.whl", hash = "sha256:20dc5ccb516a4e7163593fd4026f0a7531e3027b47d23ebe3bd9dbc99ac4354c"}, + {file = "django-health-check-3.18.1.tar.gz", hash = "sha256:44552d55ae8950c9548d3b90f9d9fd5570b57446a19b2a8e674c82f993cb7a2c"}, + {file = "django_health_check-3.18.1-py2.py3-none-any.whl", hash = "sha256:2c89a326cd79830e2fc6808823a9e7e874ab23f7aef3ff2c4d1194c998e1dca1"}, ] [package.dependencies] @@ -1223,28 +1286,28 @@ test = ["celery", "pytest", "pytest-cov", "pytest-django", "redis"] [[package]] name = "django-jinja" -version = "2.10.2" +version = "2.11.0" description = "Jinja2 templating language integrated in Django." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django-jinja-2.10.2.tar.gz", hash = "sha256:bfdfbb55c1f5a679d69ad575d550c4707d386634009152efe014089f3c4d1412"}, - {file = "django_jinja-2.10.2-py3-none-any.whl", hash = "sha256:dd003ec1c95c0989eb28a538831bced62b1b61da551cb44a5dfd708fcf75589f"}, + {file = "django-jinja-2.11.0.tar.gz", hash = "sha256:47c06d3271e6b2f27d3596278af517bfe2e19c1eb36ae1c0b1cc302d7f0259af"}, + {file = "django_jinja-2.11.0-py3-none-any.whl", hash = "sha256:cc4c72246a6e346aa0574e0c56c3e534c1a20ef47b8476f05d7287781f69a0a9"}, ] [package.dependencies] -django = ">=2.2" +django = ">=3.2" jinja2 = ">=3" [[package]] name = "django-picklefield" -version = "3.1" +version = "3.2" description = "Pickled object field for Django" optional = false python-versions = ">=3" files = [ - {file = "django-picklefield-3.1.tar.gz", hash = "sha256:c786cbeda78d6def2b43bff4840d19787809c8909f7ad683961703060398d356"}, - {file = "django_picklefield-3.1-py3-none-any.whl", hash = "sha256:d77c504df7311e8ec14e8b779f10ca6fec74de6c7f8e2c136e1ef60cf955125d"}, + {file = "django-picklefield-3.2.tar.gz", hash = "sha256:aa463f5d79d497dbe789f14b45180f00a51d0d670067d0729f352a3941cdfa4d"}, + {file = "django_picklefield-3.2-py3-none-any.whl", hash = "sha256:e9a73539d110f69825d9320db18bcb82e5189ff48dbed41821c026a20497764c"}, ] [package.dependencies] @@ -1269,13 +1332,13 @@ prometheus-client = ">=0.7" [[package]] name = "django-redis" -version = "5.3.0" +version = "5.4.0" description = "Full featured redis cache backend for Django." optional = false python-versions = ">=3.6" files = [ - {file = "django-redis-5.3.0.tar.gz", hash = "sha256:8bc5793ec06b28ea802aad85ec437e7646511d4e571e07ccad19cfed8b9ddd44"}, - {file = "django_redis-5.3.0-py3-none-any.whl", hash = "sha256:2d8660d39f586c41c9907d5395693c477434141690fd7eca9d32376af00b0aac"}, + {file = "django-redis-5.4.0.tar.gz", hash = "sha256:6a02abaa34b0fea8bf9b707d2c363ab6adc7409950b2db93602e6cb292818c42"}, + {file = "django_redis-5.4.0-py3-none-any.whl", hash = "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b"}, ] [package.dependencies] @@ -1285,15 +1348,32 @@ redis = ">=3,<4.0.0 || >4.0.0,<4.0.1 || >4.0.1" [package.extras] hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] +[[package]] +name = "django-silk" +version = "5.1.0" +description = "Silky smooth profiling for the Django Framework" +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-silk-5.1.0.tar.gz", hash = "sha256:34abb5852315f0f3303d45b7ab4a2caa9cf670102b614dbb2ac40a5d2d5cbffb"}, + {file = "django_silk-5.1.0-py3-none-any.whl", hash = "sha256:35a2051672b0be86af4ce734a0df0b6674c8c63f2df730b3756ec6e52923707d"}, +] + +[package.dependencies] +autopep8 = "*" +Django = ">=3.2" +gprof2dot = ">=2017.09.19" +sqlparse = "*" + [[package]] name = "django-tables2" -version = "2.6.0" +version = "2.7.0" description = "Table/data-grid framework for Django" optional = false python-versions = "*" files = [ - {file = "django-tables2-2.6.0.tar.gz", hash = "sha256:479eed04007cc04bcf764a6fb7a5e3955d94b878ba7f3a4bd4edbd2f7769e08d"}, - {file = "django_tables2-2.6.0-py2.py3-none-any.whl", hash = "sha256:04f23c1181d93716c67085a3c324b449180fd0c5162ef4619acb0b2d9a166133"}, + {file = "django-tables2-2.7.0.tar.gz", hash = "sha256:4113fcc575eb438a12e83a4d4ea01452e4800d970e8bdd0e4122ac171af1900d"}, + {file = "django_tables2-2.7.0-py2.py3-none-any.whl", hash = "sha256:99e06d966ca8ac69fd74092eb45c79a280dd5ca0ccb81395d96261f62128e1af"}, ] [package.dependencies] @@ -1334,13 +1414,13 @@ pytz = "*" [[package]] name = "django-tree-queries" -version = "0.16.1" +version = "0.17.0" description = "Tree queries with explicit opt-in, without configurability" optional = false python-versions = ">=3.8" files = [ - {file = "django_tree_queries-0.16.1-py3-none-any.whl", hash = "sha256:b57cebd85136897dc2d7d1da50f3944b13d4713009af655ae221c8202146c2f5"}, - {file = "django_tree_queries-0.16.1.tar.gz", hash = "sha256:5a7765bdbc78742ae7b206348aa674a7e39ef38069ac3854a51b330d25081c43"}, + {file = "django_tree_queries-0.17.0-py3-none-any.whl", hash = "sha256:df62cc7daa7a766483a8ae11618ff7649d74425b5d245e9644526f2dd2f51af0"}, + {file = "django_tree_queries-0.17.0.tar.gz", hash = "sha256:f115cf6756c55fde56bb876d5b5aa1b2bd33ae3d6e2949c3176ef0b4fb64c532"}, ] [package.extras] @@ -1369,37 +1449,55 @@ waitress = ["waitress"] [[package]] name = "djangorestframework" -version = "3.14.0" +version = "3.15.1" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.6" files = [ - {file = "djangorestframework-3.14.0-py3-none-any.whl", hash = "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08"}, - {file = "djangorestframework-3.14.0.tar.gz", hash = "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8"}, + {file = "djangorestframework-3.15.1-py3-none-any.whl", hash = "sha256:3ccc0475bce968608cf30d07fb17d8e52d1d7fc8bfe779c905463200750cbca6"}, + {file = "djangorestframework-3.15.1.tar.gz", hash = "sha256:f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1"}, ] [package.dependencies] +"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} django = ">=3.0" -pytz = "*" + +[[package]] +name = "dnacentersdk" +version = "2.6.11" +description = "Cisco DNA Center Platform SDK" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "dnacentersdk-2.6.11-py3-none-any.whl", hash = "sha256:b66cee835cb804047a31faee372be219711f784216a977bec0d5e7d80b78e516"}, + {file = "dnacentersdk-2.6.11.tar.gz", hash = "sha256:81ca926e3fab1c7c0a721a87c2480cdf5b7a48da0bc1b7dc3829f89b9cef659a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.16.2,<3.0.0" +future = ">=0.18.3,<0.19.0" +requests = ">=2.27.1,<=2.40.0" +requests-toolbelt = ">=1.0.0,<2.0.0" [[package]] name = "dnspython" -version = "2.4.2" +version = "2.6.1" description = "DNS toolkit" optional = true -python-versions = ">=3.8,<4.0" +python-versions = ">=3.8" files = [ - {file = "dnspython-2.4.2-py3-none-any.whl", hash = "sha256:57c6fbaaeaaf39c891292012060beb141791735dbb4004798328fc2c467402d8"}, - {file = "dnspython-2.4.2.tar.gz", hash = "sha256:8dcfae8c7460a2f84b4072e26f1c9f4101ca20c071649cb7c34e8b6a93d58984"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] [package.extras] -dnssec = ["cryptography (>=2.6,<42.0)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] [[package]] name = "docutils" @@ -1428,13 +1526,13 @@ djangorestframework = ">=3.12.0,<4.0.0" [[package]] name = "drf-spectacular" -version = "0.26.3" +version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-0.26.3.tar.gz", hash = "sha256:b907a72a0244e5dcfeca625e9632cd8ebccdbe2cb528b7c1de1191708be6f31e"}, - {file = "drf_spectacular-0.26.3-py3-none-any.whl", hash = "sha256:1d84ac70522baaadd6d84a25ce5fe5ea50cfcba0387856689f98ac536f14aa32"}, + {file = "drf-spectacular-0.26.5.tar.gz", hash = "sha256:aee55330a774ba8a9cbdb125714d1c9ee05a8aafd3ce3be8bfd26527649aeb44"}, + {file = "drf_spectacular-0.26.5-py3-none-any.whl", hash = "sha256:c0002a820b11771fdbf37853deb371947caf0159d1afeeffe7598e964bc1db94"}, ] [package.dependencies] @@ -1452,13 +1550,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2023.9.1" +version = "2024.5.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf-spectacular-sidecar-2023.9.1.tar.gz", hash = "sha256:05a0819adf37844307671988383b6045e078cfd688ee23ad66c6311b04fe92aa"}, - {file = "drf_spectacular_sidecar-2023.9.1-py3-none-any.whl", hash = "sha256:027bb254e20385ae8c94bb86d13d891e0880564d859a37caf34412a9fb73622f"}, + {file = "drf_spectacular_sidecar-2024.5.1-py3-none-any.whl", hash = "sha256:089fdef46b520b7b1c8a497a398cde9336c3f20b115835baeb158dc4138d743d"}, + {file = "drf_spectacular_sidecar-2024.5.1.tar.gz", hash = "sha256:1ecfbe86174461e3cf78a9cd49f69aa8d9e0710cb5e8b35107d3f8cc0f380c21"}, ] [package.dependencies] @@ -1466,13 +1564,13 @@ Django = ">=2.2" [[package]] name = "emoji" -version = "2.8.0" +version = "2.11.1" description = "Emoji for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ - {file = "emoji-2.8.0-py2.py3-none-any.whl", hash = "sha256:a8468fd836b7ecb6d1eac054c9a591701ce0ccd6c6f7779ad71b66f76664df90"}, - {file = "emoji-2.8.0.tar.gz", hash = "sha256:8d8b5dec3c507444b58890e598fc895fcec022b3f5acb49497c6ccc5208b8b00"}, + {file = "emoji-2.11.1-py2.py3-none-any.whl", hash = "sha256:b7ba25299bbf520cc8727848ae66b986da32aee27dc2887eaea2bff07226ce49"}, + {file = "emoji-2.11.1.tar.gz", hash = "sha256:062ff0b3154b6219143f8b9f4b3e5c64c35bc2b146e6e2349ab5f29e218ce1ee"}, ] [package.extras] @@ -1480,13 +1578,13 @@ dev = ["coverage", "coveralls", "pytest"] [[package]] name = "exceptiongroup" -version = "1.1.3" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -1494,167 +1592,197 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.19.1" +description = "Fastest Python implementation of JSON schema" +optional = false python-versions = "*" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] name = "flake8" -version = "3.9.2" +version = "5.0.4" description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6.1" files = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, ] [package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.9.0,<2.10.0" +pyflakes = ">=2.5.0,<2.6.0" [[package]] name = "fonttools" -version = "4.43.0" +version = "4.51.0" description = "Tools to manipulate font files" optional = true python-versions = ">=3.8" files = [ - {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef"}, - {file = "fonttools-4.43.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213"}, - {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84"}, - {file = "fonttools-4.43.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3"}, - {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef"}, - {file = "fonttools-4.43.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803"}, - {file = "fonttools-4.43.0-cp310-cp310-win32.whl", hash = "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1"}, - {file = "fonttools-4.43.0-cp310-cp310-win_amd64.whl", hash = "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38"}, - {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465"}, - {file = "fonttools-4.43.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92"}, - {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd"}, - {file = "fonttools-4.43.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64"}, - {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a"}, - {file = "fonttools-4.43.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9"}, - {file = "fonttools-4.43.0-cp311-cp311-win32.whl", hash = "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e"}, - {file = "fonttools-4.43.0-cp311-cp311-win_amd64.whl", hash = "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186"}, - {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3"}, - {file = "fonttools-4.43.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f"}, - {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92"}, - {file = "fonttools-4.43.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69"}, - {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7"}, - {file = "fonttools-4.43.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a"}, - {file = "fonttools-4.43.0-cp312-cp312-win32.whl", hash = "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f"}, - {file = "fonttools-4.43.0-cp312-cp312-win_amd64.whl", hash = "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348"}, - {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289"}, - {file = "fonttools-4.43.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3"}, - {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126"}, - {file = "fonttools-4.43.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662"}, - {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe"}, - {file = "fonttools-4.43.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544"}, - {file = "fonttools-4.43.0-cp38-cp38-win32.whl", hash = "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646"}, - {file = "fonttools-4.43.0-cp38-cp38-win_amd64.whl", hash = "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836"}, - {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1"}, - {file = "fonttools-4.43.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da"}, - {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c"}, - {file = "fonttools-4.43.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb"}, - {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce"}, - {file = "fonttools-4.43.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e"}, - {file = "fonttools-4.43.0-cp39-cp39-win32.whl", hash = "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1"}, - {file = "fonttools-4.43.0-cp39-cp39-win_amd64.whl", hash = "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f"}, - {file = "fonttools-4.43.0-py3-none-any.whl", hash = "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384"}, - {file = "fonttools-4.43.0.tar.gz", hash = "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {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]] @@ -1686,13 +1814,13 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -1700,20 +1828,32 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.41" +version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, - {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + +[[package]] +name = "gprof2dot" +version = "2022.7.29" +description = "Generate a dot graph from the output of several profilers." +optional = false +python-versions = ">=2.7" +files = [ + {file = "gprof2dot-2022.7.29-py2.py3-none-any.whl", hash = "sha256:f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6"}, + {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"}, +] [[package]] name = "graphene" @@ -1809,83 +1949,76 @@ six = ">=1.12" [[package]] name = "griffe" -version = "0.36.7" +version = "0.44.0" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.36.7-py3-none-any.whl", hash = "sha256:7a09f8e9b97c7ebe227f6529a298bf7e0e742a9837ee261cc8260d50b4aa039f"}, - {file = "griffe-0.36.7.tar.gz", hash = "sha256:a6fe60b16720ca0cf63c9e667a4c05eea40dfe4abcf114741885f945b74c7071"}, + {file = "griffe-0.44.0-py3-none-any.whl", hash = "sha256:8a4471c469ba980b87c843f1168850ce39d0c1d0c7be140dca2480f76c8e5446"}, + {file = "griffe-0.44.0.tar.gz", hash = "sha256:34aee1571042f9bf00529bc715de4516fb6f482b164e90d030300601009e0223"}, ] [package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" [[package]] name = "grpcio" -version = "1.59.0" +version = "1.63.0" description = "HTTP/2-based RPC framework" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "grpcio-1.59.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:225e5fa61c35eeaebb4e7491cd2d768cd8eb6ed00f2664fa83a58f29418b39fd"}, - {file = "grpcio-1.59.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:b95ec8ecc4f703f5caaa8d96e93e40c7f589bad299a2617bdb8becbcce525539"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:1a839ba86764cc48226f50b924216000c79779c563a301586a107bda9cbe9dcf"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6cfe44a5d7c7d5f1017a7da1c8160304091ca5dc64a0f85bca0d63008c3137a"}, - {file = "grpcio-1.59.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0fcf53df684fcc0154b1e61f6b4a8c4cf5f49d98a63511e3f30966feff39cd0"}, - {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa66cac32861500f280bb60fe7d5b3e22d68c51e18e65367e38f8669b78cea3b"}, - {file = "grpcio-1.59.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8cd2d38c2d52f607d75a74143113174c36d8a416d9472415eab834f837580cf7"}, - {file = "grpcio-1.59.0-cp310-cp310-win32.whl", hash = "sha256:228b91ce454876d7eed74041aff24a8f04c0306b7250a2da99d35dd25e2a1211"}, - {file = "grpcio-1.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:ca87ee6183421b7cea3544190061f6c1c3dfc959e0b57a5286b108511fd34ff4"}, - {file = "grpcio-1.59.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c173a87d622ea074ce79be33b952f0b424fa92182063c3bda8625c11d3585d09"}, - {file = "grpcio-1.59.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:ec78aebb9b6771d6a1de7b6ca2f779a2f6113b9108d486e904bde323d51f5589"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:0b84445fa94d59e6806c10266b977f92fa997db3585f125d6b751af02ff8b9fe"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c251d22de8f9f5cca9ee47e4bade7c5c853e6e40743f47f5cc02288ee7a87252"}, - {file = "grpcio-1.59.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:956f0b7cb465a65de1bd90d5a7475b4dc55089b25042fe0f6c870707e9aabb1d"}, - {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:38da5310ef84e16d638ad89550b5b9424df508fd5c7b968b90eb9629ca9be4b9"}, - {file = "grpcio-1.59.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63982150a7d598281fa1d7ffead6096e543ff8be189d3235dd2b5604f2c553e5"}, - {file = "grpcio-1.59.0-cp311-cp311-win32.whl", hash = "sha256:50eff97397e29eeee5df106ea1afce3ee134d567aa2c8e04fabab05c79d791a7"}, - {file = "grpcio-1.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f03bd714f987d48ae57fe092cf81960ae36da4e520e729392a59a75cda4f29"}, - {file = "grpcio-1.59.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:f1feb034321ae2f718172d86b8276c03599846dc7bb1792ae370af02718f91c5"}, - {file = "grpcio-1.59.0-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d09bd2a4e9f5a44d36bb8684f284835c14d30c22d8ec92ce796655af12163588"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:2f120d27051e4c59db2f267b71b833796770d3ea36ca712befa8c5fff5da6ebd"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0ca727a173ee093f49ead932c051af463258b4b493b956a2c099696f38aa66"}, - {file = "grpcio-1.59.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5711c51e204dc52065f4a3327dca46e69636a0b76d3e98c2c28c4ccef9b04c52"}, - {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d74f7d2d7c242a6af9d4d069552ec3669965b74fed6b92946e0e13b4168374f9"}, - {file = "grpcio-1.59.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3859917de234a0a2a52132489c4425a73669de9c458b01c9a83687f1f31b5b10"}, - {file = "grpcio-1.59.0-cp312-cp312-win32.whl", hash = "sha256:de2599985b7c1b4ce7526e15c969d66b93687571aa008ca749d6235d056b7205"}, - {file = "grpcio-1.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:598f3530231cf10ae03f4ab92d48c3be1fee0c52213a1d5958df1a90957e6a88"}, - {file = "grpcio-1.59.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b34c7a4c31841a2ea27246a05eed8a80c319bfc0d3e644412ec9ce437105ff6c"}, - {file = "grpcio-1.59.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:c4dfdb49f4997dc664f30116af2d34751b91aa031f8c8ee251ce4dcfc11277b0"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:61bc72a00ecc2b79d9695220b4d02e8ba53b702b42411397e831c9b0589f08a3"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f367e4b524cb319e50acbdea57bb63c3b717c5d561974ace0b065a648bb3bad3"}, - {file = "grpcio-1.59.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:849c47ef42424c86af069a9c5e691a765e304079755d5c29eff511263fad9c2a"}, - {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0488c2b0528e6072010182075615620071371701733c63ab5be49140ed8f7f0"}, - {file = "grpcio-1.59.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:611d9aa0017fa386809bddcb76653a5ab18c264faf4d9ff35cb904d44745f575"}, - {file = "grpcio-1.59.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e5378785dce2b91eb2e5b857ec7602305a3b5cf78311767146464bfa365fc897"}, - {file = "grpcio-1.59.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fe976910de34d21057bcb53b2c5e667843588b48bf11339da2a75f5c4c5b4055"}, - {file = "grpcio-1.59.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:c041a91712bf23b2a910f61e16565a05869e505dc5a5c025d429ca6de5de842c"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ae444221b2c16d8211b55326f8ba173ba8f8c76349bfc1768198ba592b58f74"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceb1e68135788c3fce2211de86a7597591f0b9a0d2bb80e8401fd1d915991bac"}, - {file = "grpcio-1.59.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c4b1cc3a9dc1924d2eb26eec8792fedd4b3fcd10111e26c1d551f2e4eda79ce"}, - {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:871371ce0c0055d3db2a86fdebd1e1d647cf21a8912acc30052660297a5a6901"}, - {file = "grpcio-1.59.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:93e9cb546e610829e462147ce724a9cb108e61647a3454500438a6deef610be1"}, - {file = "grpcio-1.59.0-cp38-cp38-win32.whl", hash = "sha256:f21917aa50b40842b51aff2de6ebf9e2f6af3fe0971c31960ad6a3a2b24988f4"}, - {file = "grpcio-1.59.0-cp38-cp38-win_amd64.whl", hash = "sha256:14890da86a0c0e9dc1ea8e90101d7a3e0e7b1e71f4487fab36e2bfd2ecadd13c"}, - {file = "grpcio-1.59.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:34341d9e81a4b669a5f5dca3b2a760b6798e95cdda2b173e65d29d0b16692857"}, - {file = "grpcio-1.59.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:986de4aa75646e963466b386a8c5055c8b23a26a36a6c99052385d6fe8aaf180"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aca8a24fef80bef73f83eb8153f5f5a0134d9539b4c436a716256b311dda90a6"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:936b2e04663660c600d5173bc2cc84e15adbad9c8f71946eb833b0afc205b996"}, - {file = "grpcio-1.59.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc8bf2e7bc725e76c0c11e474634a08c8f24bcf7426c0c6d60c8f9c6e70e4d4a"}, - {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81d86a096ccd24a57fa5772a544c9e566218bc4de49e8c909882dae9d73392df"}, - {file = "grpcio-1.59.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2ea95cd6abbe20138b8df965b4a8674ec312aaef3147c0f46a0bac661f09e8d0"}, - {file = "grpcio-1.59.0-cp39-cp39-win32.whl", hash = "sha256:3b8ff795d35a93d1df6531f31c1502673d1cebeeba93d0f9bd74617381507e3f"}, - {file = "grpcio-1.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:38823bd088c69f59966f594d087d3a929d1ef310506bee9e3648317660d65b81"}, - {file = "grpcio-1.59.0.tar.gz", hash = "sha256:acf70a63cf09dd494000007b798aff88a436e1c03b394995ce450be437b8e54f"}, + {file = "grpcio-1.63.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c"}, + {file = "grpcio-1.63.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f"}, + {file = "grpcio-1.63.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b"}, + {file = "grpcio-1.63.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357"}, + {file = "grpcio-1.63.0-cp310-cp310-win32.whl", hash = "sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d"}, + {file = "grpcio-1.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a"}, + {file = "grpcio-1.63.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3"}, + {file = "grpcio-1.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3"}, + {file = "grpcio-1.63.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7"}, + {file = "grpcio-1.63.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f"}, + {file = "grpcio-1.63.0-cp311-cp311-win32.whl", hash = "sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c"}, + {file = "grpcio-1.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434"}, + {file = "grpcio-1.63.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57"}, + {file = "grpcio-1.63.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172"}, + {file = "grpcio-1.63.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0"}, + {file = "grpcio-1.63.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9"}, + {file = "grpcio-1.63.0-cp312-cp312-win32.whl", hash = "sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b"}, + {file = "grpcio-1.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434"}, + {file = "grpcio-1.63.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae"}, + {file = "grpcio-1.63.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f"}, + {file = "grpcio-1.63.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85"}, + {file = "grpcio-1.63.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda"}, + {file = "grpcio-1.63.0-cp38-cp38-win32.whl", hash = "sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3"}, + {file = "grpcio-1.63.0-cp38-cp38-win_amd64.whl", hash = "sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a"}, + {file = "grpcio-1.63.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce"}, + {file = "grpcio-1.63.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61"}, + {file = "grpcio-1.63.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3"}, + {file = "grpcio-1.63.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d"}, + {file = "grpcio-1.63.0-cp39-cp39-win32.whl", hash = "sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a"}, + {file = "grpcio-1.63.0-cp39-cp39-win_amd64.whl", hash = "sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d"}, + {file = "grpcio-1.63.0.tar.gz", hash = "sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.59.0)"] +protobuf = ["grpcio-tools (>=1.63.0)"] [[package]] name = "h11" @@ -1944,13 +2077,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -1982,17 +2115,6 @@ files = [ {file = "ijson-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4a3a6a2fbbe7550ffe52d151cf76065e6b89cfb3e9d0463e49a7e322a25d0426"}, {file = "ijson-3.2.3-cp311-cp311-win32.whl", hash = "sha256:6a4db2f7fb9acfb855c9ae1aae602e4648dd1f88804a0d5cfb78c3639bcf156c"}, {file = "ijson-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:ccd6be56335cbb845f3d3021b1766299c056c70c4c9165fb2fbe2d62258bae3f"}, - {file = "ijson-3.2.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:055b71bbc37af5c3c5861afe789e15211d2d3d06ac51ee5a647adf4def19c0ea"}, - {file = "ijson-3.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c075a547de32f265a5dd139ab2035900fef6653951628862e5cdce0d101af557"}, - {file = "ijson-3.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:457f8a5fc559478ac6b06b6d37ebacb4811f8c5156e997f0d87d708b0d8ab2ae"}, - {file = "ijson-3.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9788f0c915351f41f0e69ec2618b81ebfcf9f13d9d67c6d404c7f5afda3e4afb"}, - {file = "ijson-3.2.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa234ab7a6a33ed51494d9d2197fb96296f9217ecae57f5551a55589091e7853"}, - {file = "ijson-3.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd0dc5da4f9dc6d12ab6e8e0c57d8b41d3c8f9ceed31a99dae7b2baf9ea769a"}, - {file = "ijson-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c6beb80df19713e39e68dc5c337b5c76d36ccf69c30b79034634e5e4c14d6904"}, - {file = "ijson-3.2.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a2973ce57afb142d96f35a14e9cfec08308ef178a2c76b8b5e1e98f3960438bf"}, - {file = "ijson-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:105c314fd624e81ed20f925271ec506523b8dd236589ab6c0208b8707d652a0e"}, - {file = "ijson-3.2.3-cp312-cp312-win32.whl", hash = "sha256:ac44781de5e901ce8339352bb5594fcb3b94ced315a34dbe840b4cff3450e23b"}, - {file = "ijson-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:0567e8c833825b119e74e10a7c29761dc65fcd155f5d4cb10f9d3b8916ef9912"}, {file = "ijson-3.2.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:eeb286639649fb6bed37997a5e30eefcacddac79476d24128348ec890b2a0ccb"}, {file = "ijson-3.2.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:396338a655fb9af4ac59dd09c189885b51fa0eefc84d35408662031023c110d1"}, {file = "ijson-3.2.3-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e0243d166d11a2a47c17c7e885debf3b19ed136be2af1f5d1c34212850236ac"}, @@ -2064,40 +2186,40 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "5.13.0" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-5.13.0-py3-none-any.whl", hash = "sha256:9f7bd0c97b79972a6cce36a366356d16d5e13b09679c11a58f1014bfdf8e64b2"}, - {file = "importlib_resources-5.13.0.tar.gz", hash = "sha256:82d5c6cca930697dbbd86c93333bb2c2e72861d4789a11c2662b933e5ad2b528"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "incremental" @@ -2235,20 +2357,17 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" @@ -2421,13 +2540,13 @@ files = [ [[package]] name = "kombu" -version = "5.3.2" +version = "5.3.7" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.2-py3-none-any.whl", hash = "sha256:b753c9cfc9b1e976e637a7cbc1a65d446a22e45546cd996ea28f932082b7dc9e"}, - {file = "kombu-5.3.2.tar.gz", hash = "sha256:0ba213f630a2cb2772728aef56ac6883dc3a2f13435e10048f6e97d48506dbbd"}, + {file = "kombu-5.3.7-py3-none-any.whl", hash = "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9"}, + {file = "kombu-5.3.7.tar.gz", hash = "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf"}, ] [package.dependencies] @@ -2439,65 +2558,20 @@ vine = "*" [package.extras] azureservicebus = ["azure-servicebus (>=7.10.0)"] azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] -confluentkafka = ["confluent-kafka (==2.1.1)"] +confluentkafka = ["confluent-kafka (>=2.2.0)"] consul = ["python-consul2"] librabbitmq = ["librabbitmq (>=2.0.0)"] mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack"] pyro = ["pyro4"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=2.8.0)"] -[[package]] -name = "lazy-object-proxy" -version = "1.9.0" -description = "A fast and thorough lazy object proxy." -optional = false -python-versions = ">=3.7" -files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, -] - [[package]] name = "macaddress" version = "2.0.2" @@ -2511,19 +2585,20 @@ files = [ [[package]] name = "markdown" -version = "3.3.7" -description = "Python implementation of Markdown." +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, - {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] @@ -2567,127 +2642,127 @@ testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,< [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.7.3" +version = "3.7.5" description = "Python plotting package" optional = true python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c"}, - {file = "matplotlib-3.7.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22"}, - {file = "matplotlib-3.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89"}, - {file = "matplotlib-3.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733"}, - {file = "matplotlib-3.7.3-cp310-cp310-win32.whl", hash = "sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059"}, - {file = "matplotlib-3.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b"}, - {file = "matplotlib-3.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2"}, - {file = "matplotlib-3.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993"}, - {file = "matplotlib-3.7.3-cp311-cp311-win32.whl", hash = "sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53"}, - {file = "matplotlib-3.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5"}, - {file = "matplotlib-3.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d"}, - {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f"}, - {file = "matplotlib-3.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346"}, - {file = "matplotlib-3.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a"}, - {file = "matplotlib-3.7.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea"}, - {file = "matplotlib-3.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930"}, - {file = "matplotlib-3.7.3-cp38-cp38-win32.whl", hash = "sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a"}, - {file = "matplotlib-3.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77"}, - {file = "matplotlib-3.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a"}, - {file = "matplotlib-3.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7"}, - {file = "matplotlib-3.7.3-cp39-cp39-win32.whl", hash = "sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2"}, - {file = "matplotlib-3.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde"}, - {file = "matplotlib-3.7.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c"}, - {file = "matplotlib-3.7.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c"}, - {file = "matplotlib-3.7.3.tar.gz", hash = "sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"}, + {file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"}, + {file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"}, + {file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"}, + {file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"}, + {file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"}, + {file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"}, + {file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"}, + {file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"}, + {file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"}, + {file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"}, ] [package.dependencies] @@ -2701,17 +2776,16 @@ packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -2719,13 +2793,13 @@ traitlets = "*" [[package]] name = "mccabe" -version = "0.6.1" +version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] @@ -2791,17 +2865,18 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "0.5.0" +version = "1.0.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, - {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, ] [package.dependencies] Markdown = ">=3.3" +markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] @@ -2828,13 +2903,13 @@ requests = ">=2.26" [[package]] name = "mkdocs-material-extensions" -version = "1.2" +version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "mkdocs_material_extensions-1.2-py3-none-any.whl", hash = "sha256:c767bd6d6305f6420a50f0b541b0c9966d52068839af97029be14443849fb8a1"}, - {file = "mkdocs_material_extensions-1.2.tar.gz", hash = "sha256:27e2d1ed2d031426a6e10d5ea06989d67e90bb02acd588bc5673106b5ee5eedf"}, + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, ] [[package]] @@ -2891,150 +2966,166 @@ mkdocstrings = ">=0.20" [[package]] name = "msgpack" -version = "1.0.7" +version = "1.0.8" description = "MessagePack serializer" optional = true python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, - {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, - {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, - {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, - {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, - {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, - {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, - {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, - {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, - {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, - {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, - {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, + {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"}, ] [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -3075,65 +3166,67 @@ testing = ["beautifulsoup4", "coverage", "docutils (>=0.17.0,<0.18.0)", "pytest [[package]] name = "nautobot" -version = "2.1.1" +version = "2.2.3" description = "Source of truth and network automation platform." optional = false -python-versions = ">=3.8,<3.12" +python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot-2.1.1-py3-none-any.whl", hash = "sha256:0b1592274bdb89b767266ec6b6837e67c2b82e2d7bf02308d6e2f877cf839731"}, - {file = "nautobot-2.1.1.tar.gz", hash = "sha256:62df1aa1a972396973df002b51f10dac7c76feeb52387fb94c1d10e41a2aa3e5"}, + {file = "nautobot-2.2.3-py3-none-any.whl", hash = "sha256:2e0a3cc8d9c5738fda1b75ac4914aa60d9b6eae1bfe969c7aa1d29c515de9674"}, + {file = "nautobot-2.2.3.tar.gz", hash = "sha256:565cc3039069d31ed2c9176b29c72f64c88356ba167118605887b1757168db77"}, ] [package.dependencies] celery = ">=5.3.1,<5.4.0" -Django = ">=3.2.23,<3.3.0" +Django = ">=3.2.25,<3.3.0" django-ajax-tables = ">=1.1.1,<1.2.0" -django-celery-beat = ">=2.5.0,<2.6.0" -django-celery-results = ">=2.4.0,<2.5.0" +django-celery-beat = ">=2.6.0,<2.7.0" +django-celery-results = ">=2.5.1,<2.6.0" django-constance = {version = ">=2.9.1,<2.10.0", extras = ["database"]} -django-cors-headers = ">=4.2.0,<4.3.0" +django-cors-headers = ">=4.3.1,<4.4.0" django-db-file-storage = ">=0.5.5,<0.6.0" django-extensions = ">=3.2.3,<3.3.0" -django-filter = ">=23.1,<23.2" -django-health-check = ">=3.17.0,<3.18.0" -django-jinja = ">=2.10.2,<2.11.0" +django-filter = ">=23.5,<23.6" +django-health-check = ">=3.18.1,<3.19.0" +django-jinja = ">=2.11.0,<2.12.0" django-prometheus = ">=2.3.1,<2.4.0" -django-redis = ">=5.3.0,<5.4.0" -django-tables2 = ">=2.6.0,<2.7.0" +django-redis = ">=5.4.0,<5.5.0" +django-silk = ">=5.1.0,<5.2.0" +django-tables2 = ">=2.7.0,<2.8.0" django-taggit = ">=4.0.0,<4.1.0" django-timezone-field = ">=5.1,<5.2" -django-tree-queries = ">=0.16.1,<0.17.0" +django-tree-queries = ">=0.17.0,<0.18.0" django-webserver = ">=1.2.0,<1.3.0" -djangorestframework = ">=3.14.0,<3.15.0" +djangorestframework = ">=3.15.1,<3.16.0" drf-react-template-framework = ">=0.0.17,<0.0.18" -drf-spectacular = {version = "0.26.3", extras = ["sidecar"]} -emoji = ">=2.8.0,<2.9.0" -GitPython = ">=3.1.36,<3.2.0" +drf-spectacular = {version = ">=0.26.5,<0.27.0", extras = ["sidecar"]} +emoji = ">=2.11.0,<2.12.0" +GitPython = ">=3.1.43,<3.2.0" graphene-django = ">=2.16.0,<2.17.0" graphene-django-optimizer = ">=0.8.0,<0.9.0" -Jinja2 = ">=3.1.2,<3.2.0" -jsonschema = ">=4.7.0,<4.19.0" -Markdown = ">=3.3.7,<3.4.0" -MarkupSafe = ">=2.1.3,<2.2.0" -netaddr = ">=0.8.0,<0.9.0" +Jinja2 = ">=3.1.3,<3.2.0" +jsonschema = ">=4.7.0,<5.0.0" +Markdown = ">=3.5.2,<3.6.0" +MarkupSafe = ">=2.1.5,<2.2.0" +netaddr = ">=0.10.1,<0.11.0" netutils = ">=1.6.0,<2.0.0" -packaging = ">=23.1,<23.2" -Pillow = ">=10.0.0,<10.1.0" -prometheus-client = ">=0.17.1,<0.18.0" +nh3 = ">=0.2.15,<0.3.0" +packaging = ">=23.1" +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.1,<8.1.0" -pyuwsgi = ">=2.0.21,<2.1.0" +python-slugify = ">=8.0.3,<8.1.0" +pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" -social-auth-app-django = ">=5.2.0,<5.3.0" +social-auth-app-django = ">=5.4.1,<5.5.0" svgwrite = ">=1.4.2,<1.5.0" [package.extras] -all = ["django-auth-ldap (>=4.3.0,<4.4.0)", "django-storages (>=1.13.2,<1.14.0)", "mysqlclient (>=2.2.0,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] -ldap = ["django-auth-ldap (>=4.3.0,<4.4.0)"] -mysql = ["mysqlclient (>=2.2.0,<2.3.0)"] +all = ["django-auth-ldap (>=4.7.0,<4.8.0)", "django-storages (>=1.14.2,<1.15.0)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[saml] (>=4.5.3,<4.6.0)"] +ldap = ["django-auth-ldap (>=4.7.0,<4.8.0)"] +mysql = ["mysqlclient (>=2.2.3,<2.3.0)"] napalm = ["napalm (>=4.1.0,<4.2.0)"] -remote-storage = ["django-storages (>=1.13.2,<1.14.0)"] -sso = ["social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"] +remote-storage = ["django-storages (>=1.14.2,<1.15.0)"] +sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"] [[package]] name = "nautobot-capacity-metrics" @@ -3151,13 +3244,13 @@ nautobot = ">=2.0.0,<3.0.0" [[package]] name = "nautobot-chatops" -version = "3.0.0" -description = "A plugin providing chatbot capabilities for Nautobot" +version = "3.0.2" +description = "A app providing chatbot capabilities for Nautobot" optional = false -python-versions = ">=3.8,<3.12" +python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot_chatops-3.0.0-py3-none-any.whl", hash = "sha256:30998a4f9e0e664a8430daf6646b886ca89bddf73d8afacbe21629c26089c77e"}, - {file = "nautobot_chatops-3.0.0.tar.gz", hash = "sha256:7087a9a0da326cf3c860c89a08a8d4bb5c79fcb8d8ddb79118dc1dbc7763e9bf"}, + {file = "nautobot_chatops-3.0.2-py3-none-any.whl", hash = "sha256:456e95362abe5fe36d63be0da0232f58b9d52851d52babced5cab06662fb28ec"}, + {file = "nautobot_chatops-3.0.2.tar.gz", hash = "sha256:f16221778546b034a6609d843d9ae82f3fc02f5b611c9083d5eb136114bb7dba"}, ] [package.dependencies] @@ -3188,13 +3281,13 @@ panorama = ["defusedxml (>=0.7.1,<0.8.0)", "ipaddr (>=2.2.0,<3.0.0)", "netmiko ( [[package]] name = "nautobot-device-lifecycle-mgmt" -version = "2.0.0" +version = "2.1.1" description = "Manages device lifecycles for platforms and software." optional = true -python-versions = ">=3.8,<3.12" +python-versions = "<3.12,>=3.8" files = [ - {file = "nautobot_device_lifecycle_mgmt-2.0.0-py3-none-any.whl", hash = "sha256:a39f394f501dc046f4836bb9c4c10b430bf5e0b2572d763a6b126cee10caae52"}, - {file = "nautobot_device_lifecycle_mgmt-2.0.0.tar.gz", hash = "sha256:c5000dbd506d416c49243840f920e0fec98e2bdd354995148f5f9129bafe21fa"}, + {file = "nautobot_device_lifecycle_mgmt-2.1.1-py3-none-any.whl", hash = "sha256:9d7f955b35b5d8d9be1c7b6f411b1d50cffbb21530ca7c6b9f30b1e4f6667e02"}, + {file = "nautobot_device_lifecycle_mgmt-2.1.1.tar.gz", hash = "sha256:c8a1138e707343834b2e760679741eb346fe312799c8d7cced377895edab8301"}, ] [package.dependencies] @@ -3204,29 +3297,54 @@ pycountry = ">=22.3.5,<23.0.0" [[package]] name = "netaddr" -version = "0.8.0" +version = "0.10.1" description = "A network address manipulation library for Python" optional = false python-versions = "*" files = [ - {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, - {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, + {file = "netaddr-0.10.1-py2.py3-none-any.whl", hash = "sha256:9822305b42ea1020d54fee322d43cee5622b044c07a1f0130b459bb467efcf88"}, + {file = "netaddr-0.10.1.tar.gz", hash = "sha256:f4da4222ca8c3f43c8e18a8263e5426c750a3a837fdfeccf74c68d0408eaa3bf"}, ] [[package]] name = "netutils" -version = "1.6.0" +version = "1.8.1" description = "Common helper functions useful in network automation." optional = false -python-versions = ">=3.8,<4.0" +python-versions = "<4.0,>=3.8" files = [ - {file = "netutils-1.6.0-py3-none-any.whl", hash = "sha256:e755e6141d0968f1deeb61693a4023f4f5fe1f0dde25d94ac1008f8191d8d237"}, - {file = "netutils-1.6.0.tar.gz", hash = "sha256:bd2fa691e172fe9d5c9e6fc5e2593316eb7fd2c36450454894ed13b274763d70"}, + {file = "netutils-1.8.1-py3-none-any.whl", hash = "sha256:b1d6864a7512c3def0e12a2a879f12ccca9b5077d482f591c56d0171542aa040"}, + {file = "netutils-1.8.1.tar.gz", hash = "sha256:20d0cd9bf3a11588e77266c4aca93b460c732e12c4449e48213f22ab32d78921"}, ] [package.extras] optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] +[[package]] +name = "nh3" +version = "0.2.17" +description = "Python bindings to the ammonia HTML sanitization library." +optional = false +python-versions = "*" +files = [ + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:551672fd71d06cd828e282abdb810d1be24e1abb7ae2543a8fa36a71c1006fe9"}, + {file = "nh3-0.2.17-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c551eb2a3876e8ff2ac63dff1585236ed5dfec5ffd82216a7a174f7c5082a78a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:66f17d78826096291bd264f260213d2b3905e3c7fae6dfc5337d49429f1dc9f3"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0316c25b76289cf23be6b66c77d3608a4fdf537b35426280032f432f14291b9a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:22c26e20acbb253a5bdd33d432a326d18508a910e4dcf9a3316179860d53345a"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:85cdbcca8ef10733bd31f931956f7fbb85145a4d11ab9e6742bbf44d88b7e351"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40015514022af31975c0b3bca4014634fa13cb5dc4dbcbc00570acc781316dcc"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba73a2f8d3a1b966e9cdba7b211779ad8a2561d2dba9674b8a19ed817923f65f"}, + {file = "nh3-0.2.17-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c21bac1a7245cbd88c0b0e4a420221b7bfa838a2814ee5bb924e9c2f10a1120b"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d7a25fd8c86657f5d9d576268e3b3767c5cd4f42867c9383618be8517f0f022a"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c790769152308421283679a142dbdb3d1c46c79c823008ecea8e8141db1a2062"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b4427ef0d2dfdec10b641ed0bdaf17957eb625b2ec0ea9329b3d28806c153d71"}, + {file = "nh3-0.2.17-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a3f55fabe29164ba6026b5ad5c3151c314d136fd67415a17660b4aaddacf1b10"}, + {file = "nh3-0.2.17-cp37-abi3-win32.whl", hash = "sha256:1a814dd7bba1cb0aba5bcb9bebcc88fd801b63e21e2450ae6c52d3b3336bc911"}, + {file = "nh3-0.2.17-cp37-abi3-win_amd64.whl", hash = "sha256:1aa52a7def528297f256de0844e8dd680ee279e79583c76d6fa73a978186ddfb"}, + {file = "nh3-0.2.17.tar.gz", hash = "sha256:40d0741a19c3d645e54efba71cb0d8c475b59135c1e3c580f879ad5514cbf028"}, +] + [[package]] name = "numpy" version = "1.24.4" @@ -3296,13 +3414,13 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packaging" -version = "23.1" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -3335,35 +3453,35 @@ testing = ["docopt", "pytest (>=3.0.7)"] [[package]] name = "pathspec" -version = "0.11.2" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "pbr" -version = "5.11.1" +version = "6.0.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, - {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, ] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -3382,70 +3500,89 @@ files = [ [[package]] name = "pillow" -version = "10.0.1" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pkgutil-resolve-name" @@ -3460,28 +3597,29 @@ files = [ [[package]] name = "platformdirs" -version = "3.10.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.2.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] [[package]] name = "prometheus-client" -version = "0.17.1" +version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, ] [package.extras] @@ -3505,13 +3643,13 @@ test = ["coveralls", "futures", "mock", "pytest (>=2.7.3)", "pytest-benchmark", [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -3519,33 +3657,22 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.20.3" -description = "Protocol Buffers" +version = "4.25.3" +description = "" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"}, - {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"}, - {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"}, - {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"}, - {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"}, - {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"}, - {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"}, - {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"}, - {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"}, - {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"}, - {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"}, - {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"}, - {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"}, - {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"}, - {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"}, - {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"}, - {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"}, - {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"}, - {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"}, + {file = "protobuf-4.25.3-cp310-abi3-win32.whl", hash = "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa"}, + {file = "protobuf-4.25.3-cp310-abi3-win_amd64.whl", hash = "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8"}, + {file = "protobuf-4.25.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019"}, + {file = "protobuf-4.25.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d"}, + {file = "protobuf-4.25.3-cp38-cp38-win32.whl", hash = "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2"}, + {file = "protobuf-4.25.3-cp38-cp38-win_amd64.whl", hash = "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4"}, + {file = "protobuf-4.25.3-cp39-cp39-win32.whl", hash = "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4"}, + {file = "protobuf-4.25.3-cp39-cp39-win_amd64.whl", hash = "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c"}, + {file = "protobuf-4.25.3-py3-none-any.whl", hash = "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9"}, + {file = "protobuf-4.25.3.tar.gz", hash = "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c"}, ] [[package]] @@ -3581,7 +3708,6 @@ files = [ {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"}, @@ -3590,8 +3716,6 @@ files = [ {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"}, @@ -3656,63 +3780,62 @@ tests = ["pytest"] [[package]] name = "pycares" -version = "4.3.0" +version = "4.4.0" description = "Python interface for c-ares" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824"}, - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515"}, - {file = "pycares-4.3.0-cp310-cp310-win32.whl", hash = "sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974"}, - {file = "pycares-4.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2"}, - {file = "pycares-4.3.0-cp311-cp311-win32.whl", hash = "sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe"}, - {file = "pycares-4.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903"}, - {file = "pycares-4.3.0-cp36-cp36m-win32.whl", hash = "sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9"}, - {file = "pycares-4.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783"}, - {file = "pycares-4.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9"}, - {file = "pycares-4.3.0-cp37-cp37m-win32.whl", hash = "sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e"}, - {file = "pycares-4.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791"}, - {file = "pycares-4.3.0-cp38-cp38-win32.whl", hash = "sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0"}, - {file = "pycares-4.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4"}, - {file = "pycares-4.3.0-cp39-cp39-win32.whl", hash = "sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc"}, - {file = "pycares-4.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5"}, - {file = "pycares-4.3.0.tar.gz", hash = "sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:24da119850841d16996713d9c3374ca28a21deee056d609fbbed29065d17e1f6"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64cb58729689d4d0e78f0bfb4c25ce2f851d0274c0273ac751795c04b8798a"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33e2a1120887e89075f7f814ec144f66a6ce06a54f5722ccefc62fbeda83cff"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c680fef1b502ee680f8f0b95a41af4ec2c234e50e16c0af5bbda31999d3584bd"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fff16b09042ba077f7b8aa5868d1d22456f0002574d0ba43462b10a009331677"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:229a1675eb33bc9afb1fc463e73ee334950ccc485bc83a43f6ae5839fb4d5fa3"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3aebc73e5ad70464f998f77f2da2063aa617cbd8d3e8174dd7c5b4518f967153"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef64649eba56448f65e26546d85c860709844d2fc22ef14d324fe0b27f761a9"}, + {file = "pycares-4.4.0-cp310-cp310-win32.whl", hash = "sha256:4afc2644423f4eef97857a9fd61be9758ce5e336b4b0bd3d591238bb4b8b03e0"}, + {file = "pycares-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ed4e04af4012f875b78219d34434a6d08a67175150ac1b79eb70ab585d4ba8c"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bce8db2fc6f3174bd39b81405210b9b88d7b607d33e56a970c34a0c190da0490"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0303428d013ccf5c51de59c83f9127aba6200adb7fd4be57eddb432a1edd2a"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb91792f1556f97be7f7acb57dc7756d89c5a87bd8b90363a77dbf9ea653817"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b61579cecf1f4d616e5ea31a6e423a16680ab0d3a24a2ffe7bb1d4ee162477ff"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7af06968cbf6851566e806bf3e72825b0e6671832a2cbe840be1d2d65350710"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ceb12974367b0a68a05d52f4162b29f575d241bd53de155efe632bf2c943c7f6"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2eeec144bcf6a7b6f2d74d6e70cbba7886a84dd373c886f06cb137a07de4954c"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6f7cfdfd11eb5493d6d632e582408c8f3b429f295f8799c584c108b28db6f"}, + {file = "pycares-4.4.0-cp311-cp311-win32.whl", hash = "sha256:34736a2ffaa9c08ca9c707011a2d7b69074bbf82d645d8138bba771479b2362f"}, + {file = "pycares-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb66c30eb11e877976b7ead13632082a8621df648c408b8e15cdb91a452dd502"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fd644505a8cfd7f6584d33a9066d4e3d47700f050ef1490230c962de5dfb28c6"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52084961262232ec04bd75f5043aed7e5d8d9695e542ff691dfef0110209f2d4"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0c5368206057884cde18602580083aeaad9b860e2eac14fd253543158ce1e93"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:112a4979c695b1c86f6782163d7dec58d57a3b9510536dcf4826550f9053dd9a"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d186dafccdaa3409194c0f94db93c1a5d191145a275f19da6591f9499b8e7b8"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:64965dc19c578a683ea73487a215a8897276224e004d50eeb21f0bc7a0b63c88"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ed2a38e34bec6f2586435f6ff0bc5fe11d14bebd7ed492cf739a424e81681540"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:94d6962db81541eb0396d2f0dfcbb18cdb8c8b251d165efc2d974ae652c547d4"}, + {file = "pycares-4.4.0-cp312-cp312-win32.whl", hash = "sha256:1168a48a834813aa80f412be2df4abaf630528a58d15c704857448b20b1675c0"}, + {file = "pycares-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:db24c4e7fea4a052c6e869cbf387dd85d53b9736cfe1ef5d8d568d1ca925e977"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:21a5a0468861ec7df7befa69050f952da13db5427ae41ffe4713bc96291d1d95"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22c00bf659a9fa44d7b405cf1cd69b68b9d37537899898d8cbe5dffa4016b273"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23aa3993a352491a47fcf17867f61472f32f874df4adcbb486294bd9fbe8abee"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813d661cbe2e37d87da2d16b7110a6860e93ddb11735c6919c8a3545c7b9c8d8"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77cf5a2fd5583c670de41a7f4a7b46e5cbabe7180d8029f728571f4d2e864084"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3eaa6681c0a3e3f3868c77aca14b7760fed35fdfda2fe587e15c701950e7bc69"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad58e284a658a8a6a84af2e0b62f2f961f303cedfe551854d7bd40c3cbb61912"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfb89ca9e3d0a9b5332deeb666b2ede9d3469107742158f4aeda5ce032d003f4"}, + {file = "pycares-4.4.0-cp38-cp38-win32.whl", hash = "sha256:f36bdc1562142e3695555d2f4ac0cb69af165eddcefa98efc1c79495b533481f"}, + {file = "pycares-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:902461a92b6a80fd5041a2ec5235680c7cc35e43615639ec2a40e63fca2dfb51"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7bddc6adba8f699728f7fc1c9ce8cef359817ad78e2ed52b9502cb5f8dc7f741"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb49d5805cd347c404f928c5ae7c35e86ba0c58ffa701dbe905365e77ce7d641"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cf3349fa3a2e67ed387a7974c11d233734636fe19facfcda261b411af14d80"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf2eaa83a5987e48fa63302f0fe7ce3275cfda87b34d40fef9ce703fb3ac002"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82bba2ab77eb5addbf9758d514d9bdef3c1bfe7d1649a47bd9a0d55a23ef478b"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c6a8bde63106f162fca736e842a916853cad3c8d9d137e11c9ffa37efa818b02"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5f646eec041db6ffdbcaf3e0756fb92018f7af3266138c756bb09d2b5baadec"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dc04c54c6ea615210c1b9e803d0e2d2255f87a3d5d119b6482c8f0dfa15b26b"}, + {file = "pycares-4.4.0-cp39-cp39-win32.whl", hash = "sha256:97892cced5794d721fb4ff8765764aa4ea48fe8b2c3820677505b96b83d4ef47"}, + {file = "pycares-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:917f08f0b5d9324e9a34211e68d27447c552b50ab967044776bbab7e42a553a2"}, + {file = "pycares-4.4.0.tar.gz", hash = "sha256:f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"}, ] [package.dependencies] @@ -3723,13 +3846,13 @@ idna = ["idna (>=2.1)"] [[package]] name = "pycodestyle" -version = "2.7.0" +version = "2.9.1" description = "Python style guide checker" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, ] [[package]] @@ -3747,58 +3870,58 @@ setuptools = "*" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pydantic" -version = "1.10.13" +version = "1.10.15" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:efff03cc7a4f29d9009d1c96ceb1e7a70a65cfe86e89d34e4a5f2ab1e5693737"}, - {file = "pydantic-1.10.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3ecea2b9d80e5333303eeb77e180b90e95eea8f765d08c3d278cd56b00345d01"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1740068fd8e2ef6eb27a20e5651df000978edce6da6803c2bef0bc74540f9548"}, - {file = "pydantic-1.10.13-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84bafe2e60b5e78bc64a2941b4c071a4b7404c5c907f5f5a99b0139781e69ed8"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc0898c12f8e9c97f6cd44c0ed70d55749eaf783716896960b4ecce2edfd2d69"}, - {file = "pydantic-1.10.13-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:654db58ae399fe6434e55325a2c3e959836bd17a6f6a0b6ca8107ea0571d2e17"}, - {file = "pydantic-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:75ac15385a3534d887a99c713aa3da88a30fbd6204a5cd0dc4dab3d770b9bd2f"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c553f6a156deb868ba38a23cf0df886c63492e9257f60a79c0fd8e7173537653"}, - {file = "pydantic-1.10.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e08865bc6464df8c7d61439ef4439829e3ab62ab1669cddea8dd00cd74b9ffe"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e31647d85a2013d926ce60b84f9dd5300d44535a9941fe825dc349ae1f760df9"}, - {file = "pydantic-1.10.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:210ce042e8f6f7c01168b2d84d4c9eb2b009fe7bf572c2266e235edf14bacd80"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8ae5dd6b721459bfa30805f4c25880e0dd78fc5b5879f9f7a692196ddcb5a580"}, - {file = "pydantic-1.10.13-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f8e81fc5fb17dae698f52bdd1c4f18b6ca674d7068242b2aff075f588301bbb0"}, - {file = "pydantic-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:61d9dce220447fb74f45e73d7ff3b530e25db30192ad8d425166d43c5deb6df0"}, - {file = "pydantic-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b03e42ec20286f052490423682016fd80fda830d8e4119f8ab13ec7464c0132"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f59ef915cac80275245824e9d771ee939133be38215555e9dc90c6cb148aaeb5"}, - {file = "pydantic-1.10.13-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a1f9f747851338933942db7af7b6ee8268568ef2ed86c4185c6ef4402e80ba8"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:97cce3ae7341f7620a0ba5ef6cf043975cd9d2b81f3aa5f4ea37928269bc1b87"}, - {file = "pydantic-1.10.13-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:854223752ba81e3abf663d685f105c64150873cc6f5d0c01d3e3220bcff7d36f"}, - {file = "pydantic-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:b97c1fac8c49be29486df85968682b0afa77e1b809aff74b83081cc115e52f33"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c958d053453a1c4b1c2062b05cd42d9d5c8eb67537b8d5a7e3c3032943ecd261"}, - {file = "pydantic-1.10.13-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4c5370a7edaac06daee3af1c8b1192e305bc102abcbf2a92374b5bc793818599"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6f6e7305244bddb4414ba7094ce910560c907bdfa3501e9db1a7fd7eaea127"}, - {file = "pydantic-1.10.13-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3a3c792a58e1622667a2837512099eac62490cdfd63bd407993aaf200a4cf1f"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c636925f38b8db208e09d344c7aa4f29a86bb9947495dd6b6d376ad10334fb78"}, - {file = "pydantic-1.10.13-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:678bcf5591b63cc917100dc50ab6caebe597ac67e8c9ccb75e698f66038ea953"}, - {file = "pydantic-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:6cf25c1a65c27923a17b3da28a0bdb99f62ee04230c931d83e888012851f4e7f"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8ef467901d7a41fa0ca6db9ae3ec0021e3f657ce2c208e98cd511f3161c762c6"}, - {file = "pydantic-1.10.13-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:968ac42970f57b8344ee08837b62f6ee6f53c33f603547a55571c954a4225691"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9849f031cf8a2f0a928fe885e5a04b08006d6d41876b8bbd2fc68a18f9f2e3fd"}, - {file = "pydantic-1.10.13-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56e3ff861c3b9c6857579de282ce8baabf443f42ffba355bf070770ed63e11e1"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f00790179497767aae6bcdc36355792c79e7bbb20b145ff449700eb076c5f96"}, - {file = "pydantic-1.10.13-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:75b297827b59bc229cac1a23a2f7a4ac0031068e5be0ce385be1462e7e17a35d"}, - {file = "pydantic-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:e70ca129d2053fb8b728ee7d1af8e553a928d7e301a311094b8a0501adc8763d"}, - {file = "pydantic-1.10.13-py3-none-any.whl", hash = "sha256:b87326822e71bd5f313e7d3bfdc77ac3247035ac10b0c0618bd99dcf95b1e687"}, - {file = "pydantic-1.10.13.tar.gz", hash = "sha256:32c8b48dcd3b2ac4e78b0ba4af3a2c2eb6048cb75202f0ea7b34feb740efc340"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"}, + {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, + {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, + {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"}, + {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"}, + {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"}, + {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"}, + {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, + {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, ] [package.dependencies] @@ -3810,28 +3933,29 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pyflakes" -version = "2.3.1" +version = "2.5.0" description = "passive checker of Python programs" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" files = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, ] [[package]] name = "pygments" -version = "2.16.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, - {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyjwt" @@ -3852,23 +3976,23 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "2.17.6" +version = "3.1.0" description = "python code static checker" optional = false -python-versions = ">=3.7.2" +python-versions = ">=3.8.0" files = [ - {file = "pylint-2.17.6-py3-none-any.whl", hash = "sha256:18a1412e873caf8ffb56b760ce1b5643675af23e6173a247b502406b24c716af"}, - {file = "pylint-2.17.6.tar.gz", hash = "sha256:be928cce5c76bf9acdc65ad01447a1e0b1a7bccffc609fb7fc40f2513045bd05"}, + {file = "pylint-3.1.0-py3-none-any.whl", hash = "sha256:507a5b60953874766d8a366e8e8c7af63e058b26345cfcb5f91f89d987fd6b74"}, + {file = "pylint-3.1.0.tar.gz", hash = "sha256:6a69beb4a6f63debebaab0a3477ecd0f559aa726af4954fc948c51f7a2549e23"}, ] [package.dependencies] -astroid = ">=2.15.7,<=2.17.0-dev0" +astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, ] -isort = ">=4.2.5,<6" +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -3881,39 +4005,38 @@ testutils = ["gitpython (>3)"] [[package]] name = "pylint-django" -version = "2.5.3" +version = "2.5.5" description = "A Pylint plugin to help Pylint understand the Django web framework" optional = false -python-versions = "*" +python-versions = ">=3.7,<4.0" files = [ - {file = "pylint-django-2.5.3.tar.gz", hash = "sha256:0ac090d106c62fe33782a1d01bda1610b761bb1c9bf5035ced9d5f23a13d8591"}, - {file = "pylint_django-2.5.3-py3-none-any.whl", hash = "sha256:56b12b6adf56d548412445bd35483034394a1a94901c3f8571980a13882299d5"}, + {file = "pylint_django-2.5.5-py3-none-any.whl", hash = "sha256:5abd5c2228e0e5e2a4cb6d0b4fc1d1cef1e773d0be911412f4dd4fc1a1a440b7"}, + {file = "pylint_django-2.5.5.tar.gz", hash = "sha256:2f339e4bf55776958283395c5139c37700c91bd5ef1d8251ef6ac88b5abbba9b"}, ] [package.dependencies] -pylint = ">=2.0,<3" -pylint-plugin-utils = ">=0.7" +pylint = ">=2.0,<4" +pylint-plugin-utils = ">=0.8" [package.extras] -for-tests = ["coverage", "django-tables2", "django-tastypie", "factory-boy", "pylint (>=2.13)", "pytest", "wheel"] -with-django = ["Django"] +with-django = ["Django (>=2.2)"] [[package]] name = "pylint-nautobot" -version = "0.2.1" +version = "0.3.0" description = "Custom Pylint Rules for Nautobot" optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8,<3.12" files = [ - {file = "pylint_nautobot-0.2.1-py3-none-any.whl", hash = "sha256:6656cd571d6e997e6d7e37631308f1de25949a596a8309ab6d47a2e387c892c6"}, - {file = "pylint_nautobot-0.2.1.tar.gz", hash = "sha256:2872106a29236b0e31293efe4a2d02a66527c67f33437f3e2345251c4cf71b4d"}, + {file = "pylint_nautobot-0.3.0-py3-none-any.whl", hash = "sha256:91fed48d9a9f565c6aa46c679b930d64b06d014061f6e7e802e6de8b6b8e3f87"}, + {file = "pylint_nautobot-0.3.0.tar.gz", hash = "sha256:387a1d73b49186a7b325b6c1a3634e2c57ec0f2350e93494304c47073400099b"}, ] [package.dependencies] -importlib-resources = ">=5.12.0,<6.0.0" -pylint = ">=2.13,<3.0" -pyyaml = ">=6.0,<7.0" -tomli = ">=2.0.1,<3.0.0" +importlib-resources = ">=5.12.0" +pylint = ">=2.17.5" +pyyaml = ">=6.0.1" +toml = ">=0.10.2" [[package]] name = "pylint-plugin-utils" @@ -3931,17 +4054,17 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.3" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.3-py3-none-any.whl", hash = "sha256:77a82c621c58a83efc49a389159181d570e370fff9f810d3a4766a75fc678b66"}, - {file = "pymdown_extensions-10.3.tar.gz", hash = "sha256:94a0d8a03246712b64698af223848fd80aaf1ae4c4be29c8c61939b0467b5722"}, + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, ] [package.dependencies] -markdown = ">=3.2" +markdown = ">=3.5" pyyaml = "*" [package.extras] @@ -3949,13 +4072,13 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = true python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -3963,38 +4086,43 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyrsistent" -version = "0.19.3" +version = "0.20.0" description = "Persistent/Functional/Immutable data structures" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, + {file = "pyrsistent-0.20.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34"}, + {file = "pyrsistent-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win32.whl", hash = "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f"}, + {file = "pyrsistent-0.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7"}, + {file = "pyrsistent-0.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a"}, + {file = "pyrsistent-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win32.whl", hash = "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656"}, + {file = "pyrsistent-0.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee"}, + {file = "pyrsistent-0.20.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3"}, + {file = "pyrsistent-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win32.whl", hash = "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174"}, + {file = "pyrsistent-0.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d"}, + {file = "pyrsistent-0.20.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714"}, + {file = "pyrsistent-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win32.whl", hash = "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423"}, + {file = "pyrsistent-0.20.0-cp38-cp38-win_amd64.whl", hash = "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d"}, + {file = "pyrsistent-0.20.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022"}, + {file = "pyrsistent-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win32.whl", hash = "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f"}, + {file = "pyrsistent-0.20.0-cp39-cp39-win_amd64.whl", hash = "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf"}, + {file = "pyrsistent-0.20.0-py3-none-any.whl", hash = "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b"}, + {file = "pyrsistent-0.20.0.tar.gz", hash = "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4"}, ] [[package]] @@ -4029,13 +4157,13 @@ cron-schedule = ["croniter"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -4068,13 +4196,13 @@ files = [ [[package]] name = "python-slugify" -version = "8.0.1" +version = "8.0.4" description = "A Python slugify application that also handles Unicode" optional = false python-versions = ">=3.7" files = [ - {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, - {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, + {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"}, + {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"}, ] [package.dependencies] @@ -4114,54 +4242,54 @@ files = [ [[package]] name = "pyuwsgi" -version = "2.0.22" +version = "2.0.23.post0" description = "The uWSGI server" optional = false python-versions = "*" files = [ - {file = "pyuwsgi-2.0.22-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b55e897318af6a4d993fc0ae21d714c3bc7b799c605bf89d9664f2e24b661fe6"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59c8b3a449999b9facb00d829d4f0558e8aa205b931214779285e7f2291d4c0b"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d7fa03dd3bc0639c918d071288f7b155867ab78c34852b8c596723bbf250920"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:883a91c6dbde362910a23f22e08fab0f1291cf00b5f3f30d9fbbcb778fcd2579"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bc5b33c33d3de6a15d569c80b8f78e1f131ccaf0bfdb35c51e8589df8a10191f"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ba47ebba2db5f4937ba9324c54ad02810408120059c766c849e54a1cfee90c6"}, - {file = "pyuwsgi-2.0.22-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c6f91278a833a0684269489115e1b381af2973d5563040e3cabd019703f25256"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:57132d305690b15e80742692021fba9fb16c5681329ee67639d99b3f37fbf828"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697913cb027faf6018ce477c44a2f51c5664f8fbd15e55de0ab0fabdcc522e5a"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b398d7e477aae52dfde03df294bb36fee6628da7a4a0ffc0c08af5a359fceb2c"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:820ef76fa84f8a412bfd67d68ec4739994f9c056937629c5f71e1844ed702cbc"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5cfa678ea5c836425539f39d284a26ba1a51e28a72653a9e940059db569a9d23"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7e458e9625868301bbca768f26a067b5a5cb4b41501ddebe6d473c78395765cb"}, - {file = "pyuwsgi-2.0.22-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b4f993181fd61858934c80a1467a67c8e99bf18335e7bda54a45bd66c07312b6"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:097224803e580c9ed1ae3a85cb50de55fccac300c0b6e1fee2e8a2519a51c29c"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa57f1e76b4bca45178810031667f89dd5e44714647e7ca18e1b0cc85f8730f8"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:435981fe542452afd5c52e8206ca2487a6b2c9c6696bd0d756f4fff898f46928"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe68513a26fcc56151a44cea8e78ba412793806fb84260c8f0e2319d43def235"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62fc4888caa104960245bcaa69220c15aa9bbc4bdeaa05ac9333777a4f4c7a7d"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:dcaa03376f77c438eb54fcbea51274e58f474165a8a08a0ca6562a864c08dfa8"}, - {file = "pyuwsgi-2.0.22-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f80682b4419fdb85376c3e7b591b6512983ac09e28270f362eaab92238cfbf88"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad6363b4d70a63a0954f9d0b802282861b683c13537493a4053d1160b93c0f8c"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5e008fd88f5f79dd22463339fa90ac2e2d4a1c4698fb09ac9dc3efc8268d7a"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6f8f67ab1f87188f33f30f2d1e77c02ea3132f7e36be0f9201f22522c7828e9"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc35750a0969c129832af169867a7d6ad3e20ddd240a8fa4975fec0d996ea463"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1b7ad28d8ad5277ffa95102ec21e0651c68becce90655fdc51d033991c125fbe"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:24823dcf6fadabeb4c15a8bff8de8796441db095033c9036854bae17194809e2"}, - {file = "pyuwsgi-2.0.22-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5d19e11fc8cf9d90b837484755690338110fdc7e38bf62a21fe2c066d2ca4315"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8da89b3ece90eceda36996601835b066edf4dae4d5b7a194e5ddea3e021009c"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41f5bcacea5c1c3e4a6def1cd229535a2789e884e7a26471b1dbc3afea35e682"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0d8788294d9ff207e572d7e7d04e2e3b8fd6d118c285177ab0c7d1f0d65588e"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f142c633a33906fa82a1a9afbeedd743402a513e9e2b6b38463b54fd8bed1d0"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2ec41159a30d5ef93c47ea4a211771d3d5a5d769b97c314af2129cb777aeb318"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dbc9ef80f3ddeea0225ac7f03165474d49162816982835d186ef820616fdc06f"}, - {file = "pyuwsgi-2.0.22-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfc96fc6fa3173480f6f4148c2152eac256e1979420a6feb25232dbc3a4026e9"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:afaca18a6b7dcf51a9da5c7d88276206dcda10ed693f5e61b4d4607c0c130a1b"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e337758df2d715a505d7d3d39cfde2ce68a2dc9bee51016a3126151151cc5d97"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248e5358eb04caff4d9e035d35e47d761c38a9f834fb72e31c1bd50347dac599"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79f0fd3fa83e58f05ebddb8ffbb2c91da1b8a921f447c3f22f580f5dabef1d4f"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26debc953203f23ac7609628565ec4aa186bfc7ed1fc34e7d664ca65e33e1765"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:55d6845135c615d648d857b6e5e9bc3d891d46e8170bce4a4682df47ef8b54c4"}, - {file = "pyuwsgi-2.0.22-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ec1c38976c781374b630f2f9a5e224da039c29432afdc00cfca02f99e24ffa4e"}, - {file = "pyuwsgi-2.0.22.tar.gz", hash = "sha256:bed58e94ee0e497622d774c440c71bf6c472ad98cfedb934d0b14179f02e4adf"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49dfe43726f4a71d3440f7a36eb3ba5b361e04807164d34ececda138e2dc2375"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65420b185003dd5b66f41a6d1aa03d63d953a18e818bd4a013fc8e9d580f11cb"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7bc7c60d8e1242b3a638754d2487c505112c642010c460442993be85f3ca9ec7"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1ae2abaa47cb9c0018c790935897aec8001fb709dfac54286a37ab2e0b88dca"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:af376cafca1501b2d4b8184c427c55b32c1a3dcb6070dc27115ca552898c7ff8"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f56a729808ed7aa1d7973d6f900a75bc36b976b7ab6c8867064f36e34cdafd4e"}, + {file = "pyuwsgi-2.0.23.post0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4270e68bb2633b0fc132aad6d415e4e0cde67093a97e64dd84bd186264a8c083"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:97c940a69242dc45658dba3330e64d809f34e33d9631547b6928fd20075b4bb9"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cac396c2e8e0d199bde9bb8fc90538c82207d0c3d722d08b9a63619b41945d6"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59d6a718ad42be54b2b80c8c236b728b8b83fb93438786e95f63fc259229ccd7"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c38b5bb59e1bf59030f2d43a3e67aa18e6089c8e7f43e9c5f2099567466d35f4"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7199009447770812056a5b417c4847bd44db1b0230d4bb64c48a4ffacd4e96f0"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f361d168cf175796fe36ab6a88dee079245a2f08e587e8190a38bd1b33238fa8"}, + {file = "pyuwsgi-2.0.23.post0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:52a45e98fe746ae9c9437c5b6f0cdb6117f979c8800f09c8e4dae2997786affd"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7455976abfa1dd43b5f3376f7f04a925c16babba1c3fc6edcdd81f5c0f24383"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:508f5d84cd677cecc640d0e321badc61080c40c61843cd130b32f356729a599f"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcf93afec49f5cf29b0a68f4d2fb3e44a3ad1f205704ab2f41f9db47dacb8e13"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a19ab0d5c43bc179a70cb079feb7804e39be6326bf98ec38808fcea5e7d44bd0"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8c5283e38c4fd3130cd7384d57535d60435c63b81a41a6463f26f340efeda9de"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0d9dfb79bffa552e5985385bc114ecec1d4079b95ce24796f577ef0df727da06"}, + {file = "pyuwsgi-2.0.23.post0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b531ac80155b6c839215d05f95569b34e614e97aab055072c74112b1d2a45546"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eae183104f3fa26f3d9c28fe75f2ad914e3a365103a6a66e329c0f59f9e461d4"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a34ab2863ff0120c6e0e75c63c9ced462bfb4777e6b8237e4e1df60fb34af51"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc18481f336be63e80fc983aaa1a040e7c69c25c3145edcf93f0e6de2f1ad0d6"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:245da016b424c261d148bbb83d2407aac77e6d5793cbd4e23a17f7e3a8aa061f"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8de1d975be958cff9122ecc82bf393bf7f41fff6f1047e76ed972047763bbd31"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d75859311605a510a6050ec622ec4beb9f2f8cce5f090e5cea70a1ff74133f8b"}, + {file = "pyuwsgi-2.0.23.post0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d3ad00212ffbb208b7146744ad3710b908734f844b5e2bf533fb09fc44726f37"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:374142b106de187c4572b4441a367fa3466d9ea5aaabe475da42bb9f2202a690"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:137db348bd5f585e8e5a609046d3ac9ef58483bba93de1e3c568c1a860c31b9c"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52b7a837dbc8702b245481514a32c88418a42df7b5ee68d45695eba457abd3ee"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcfeb1eaca5f4dd0e6ed9194e7ec98dcb3a8ac108e8f0414ed7c28d608517ef"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7887c2acc8262223ff9cdce974851da0917818c12ef3ec0f49ec11a9943731fe"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bae72689ddf8e0bdd1a974a364ed052dd19d7897f1d5c3efcf8d9010c60f56ef"}, + {file = "pyuwsgi-2.0.23.post0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9565569474f9e9f02f6fa490d96d8c5c7e3004829c01c0446cdb74c618b6a433"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6ba86c6aa815635eefe7728b9b219af281a4e956bab240c5871db6c151c300a8"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ab8a02e812fbc34026ddb79f274a574c96fc488f384f320d3af37bd7edf932"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f9c0694a11d8dfbbe2814b8b242a7c4dfa143b63e01447fabce9966a90fa60"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f75e45e14462cbb94fc32242378eef7bda97173de57a68a5d46e4053677a7547"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e7140fc3548cd9d0f02c4511b679ba47d26593d2cceb249d2d147c9901d90022"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ed348cc4c5a4964c8e8fa61ab0ef50c00f7676179a6c0cb0f55f0122db1db1c2"}, + {file = "pyuwsgi-2.0.23.post0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:17a8818ec98f92e7935cf0ff56ed4f02a069362e10554df969f70fcdf78d9199"}, + {file = "pyuwsgi-2.0.23.post0.tar.gz", hash = "sha256:04ec79c4a3acad21002ebf1479050c3208605d27cc6659008df51092951eeb8e"}, ] [[package]] @@ -4176,7 +4304,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -4184,16 +4311,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -4210,7 +4329,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -4218,7 +4336,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -4240,17 +4357,17 @@ pyyaml = "*" [[package]] name = "redis" -version = "5.0.1" +version = "5.0.4" description = "Python client for Redis database and key-value store" optional = false python-versions = ">=3.7" files = [ - {file = "redis-5.0.1-py3-none-any.whl", hash = "sha256:ed4802971884ae19d640775ba3b03aa2e7bd5e8fb8dfaed2decce4d0fc48391f"}, - {file = "redis-5.0.1.tar.gz", hash = "sha256:0dab495cd5753069d3bc650a0dde8a8f9edde16fc5691b689a566eda58100d0f"}, + {file = "redis-5.0.4-py3-none-any.whl", hash = "sha256:7adc2835c7a9b5033b7ad8f8918d09b7344188228809c98df07af226d39dec91"}, + {file = "redis-5.0.4.tar.gz", hash = "sha256:ec31f2ed9675cc54c21ba854cfe0462e6faf1d83c8ce5944709db8a4700b9c61"}, ] [package.dependencies] -async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} +async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\""} [package.extras] hiredis = ["hiredis (>=1.0.0)"] @@ -4258,99 +4375,90 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" [[package]] name = "regex" -version = "2023.8.8" +version = "2024.4.28" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, + {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, + {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, + {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, + {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, + {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, + {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, + {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, + {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, + {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, + {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, + {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, ] [[package]] @@ -4377,32 +4485,30 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-mock" -version = "1.11.0" +version = "1.12.1" description = "Mock out responses from the requests package" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "requests-mock-1.11.0.tar.gz", hash = "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4"}, - {file = "requests_mock-1.11.0-py2.py3-none-any.whl", hash = "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15"}, + {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, + {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, ] [package.dependencies] -requests = ">=2.3,<3" -six = "*" +requests = ">=2.22,<3" [package.extras] fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -4483,28 +4589,28 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [[package]] name = "ruff" -version = "0.1.15" +version = "0.4.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:5fe8d54df166ecc24106db7dd6a68d44852d14eb0729ea4672bb4d96c320b7df"}, - {file = "ruff-0.1.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6f0bfbb53c4b4de117ac4d6ddfd33aa5fc31beeaa21d23c45c6dd249faf9126f"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0d432aec35bfc0d800d4f70eba26e23a352386be3a6cf157083d18f6f5881c8"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9405fa9ac0e97f35aaddf185a1be194a589424b8713e3b97b762336ec79ff807"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c66ec24fe36841636e814b8f90f572a8c0cb0e54d8b5c2d0e300d28a0d7bffec"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6f8ad828f01e8dd32cc58bc28375150171d198491fc901f6f98d2a39ba8e3ff5"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86811954eec63e9ea162af0ffa9f8d09088bab51b7438e8b6488b9401863c25e"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4025ac5e87d9b80e1f300207eb2fd099ff8200fa2320d7dc066a3f4622dc6b"}, - {file = "ruff-0.1.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b17b93c02cdb6aeb696effecea1095ac93f3884a49a554a9afa76bb125c114c1"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ddb87643be40f034e97e97f5bc2ef7ce39de20e34608f3f829db727a93fb82c5"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:abf4822129ed3a5ce54383d5f0e964e7fef74a41e48eb1dfad404151efc130a2"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6c629cf64bacfd136c07c78ac10a54578ec9d1bd2a9d395efbee0935868bf852"}, - {file = "ruff-0.1.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1bab866aafb53da39c2cadfb8e1c4550ac5340bb40300083eb8967ba25481447"}, - {file = "ruff-0.1.15-py3-none-win32.whl", hash = "sha256:2417e1cb6e2068389b07e6fa74c306b2810fe3ee3476d5b8a96616633f40d14f"}, - {file = "ruff-0.1.15-py3-none-win_amd64.whl", hash = "sha256:3837ac73d869efc4182d9036b1405ef4c73d9b1f88da2413875e34e0d6919587"}, - {file = "ruff-0.1.15-py3-none-win_arm64.whl", hash = "sha256:9a933dfb1c14ec7a33cceb1e49ec4a16b51ce3c20fd42663198746efc0427360"}, - {file = "ruff-0.1.15.tar.gz", hash = "sha256:f6dfa8c1b21c913c326919056c390966648b680966febcb796cc9d1aaab8564e"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:8d14dc8953f8af7e003a485ef560bbefa5f8cc1ad994eebb5b12136049bbccc5"}, + {file = "ruff-0.4.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:24016ed18db3dc9786af103ff49c03bdf408ea253f3cb9e3638f39ac9cf2d483"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2e06459042ac841ed510196c350ba35a9b24a643e23db60d79b2db92af0c2b"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3afabaf7ba8e9c485a14ad8f4122feff6b2b93cc53cd4dad2fd24ae35112d5c5"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:799eb468ea6bc54b95527143a4ceaf970d5aa3613050c6cff54c85fda3fde480"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ec4ba9436a51527fb6931a8839af4c36a5481f8c19e8f5e42c2f7ad3a49f5069"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a2243f8f434e487c2a010c7252150b1fdf019035130f41b77626f5655c9ca22"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8772130a063f3eebdf7095da00c0b9898bd1774c43b336272c3e98667d4fb8fa"}, + {file = "ruff-0.4.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ab165ef5d72392b4ebb85a8b0fbd321f69832a632e07a74794c0e598e7a8376"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1f32cadf44c2020e75e0c56c3408ed1d32c024766bd41aedef92aa3ca28eef68"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:22e306bf15e09af45ca812bc42fa59b628646fa7c26072555f278994890bc7ac"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:82986bb77ad83a1719c90b9528a9dd663c9206f7c0ab69282af8223566a0c34e"}, + {file = "ruff-0.4.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:652e4ba553e421a6dc2a6d4868bc3b3881311702633eb3672f9f244ded8908cd"}, + {file = "ruff-0.4.2-py3-none-win32.whl", hash = "sha256:7891ee376770ac094da3ad40c116258a381b86c7352552788377c6eb16d784fe"}, + {file = "ruff-0.4.2-py3-none-win_amd64.whl", hash = "sha256:5ec481661fb2fd88a5d6cf1f83403d388ec90f9daaa36e40e2c003de66751798"}, + {file = "ruff-0.4.2-py3-none-win_arm64.whl", hash = "sha256:cbd1e87c71bca14792948c4ccb51ee61c3296e164019d2d484f3eaa2d360dfaf"}, + {file = "ruff-0.4.2.tar.gz", hash = "sha256:33bcc160aee2520664bc0859cfeaebc84bb7323becff3f303b8f1f2d81cb4edc"}, ] [[package]] @@ -4519,41 +4625,19 @@ files = [ [[package]] name = "setuptools" -version = "68.2.2" +version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = true python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "setuptools-scm" -version = "8.0.3" -description = "the blessed package to manage your versions by scm tags" -optional = true -python-versions = ">=3.8" -files = [ - {file = "setuptools-scm-8.0.3.tar.gz", hash = "sha256:0169fd70197efda2f8c4d0b2a7a3d614431b488116f37b79d031e9e7ec884d8c"}, - {file = "setuptools_scm-8.0.3-py3-none-any.whl", hash = "sha256:813822234453438a13c78d05c8af29918fbc06f88efb33d38f065340bbb48c39"}, -] - -[package.dependencies] -packaging = ">=20" -setuptools = "*" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} -typing-extensions = {version = "*", markers = "python_version < \"3.11\""} - -[package.extras] -docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] -rich = ["rich"] -test = ["pytest", "rich", "virtualenv (>20)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "singledispatch" @@ -4583,18 +4667,17 @@ files = [ [[package]] name = "slack-sdk" -version = "3.22.0" +version = "3.27.1" description = "The Slack API Platform SDK for Python" optional = false -python-versions = ">=3.6.0" +python-versions = ">=3.6" files = [ - {file = "slack_sdk-3.22.0-py2.py3-none-any.whl", hash = "sha256:f102a4902115dff3b97c3e8883ad4e22d54732221886fc5ef29bfc290f063b4a"}, - {file = "slack_sdk-3.22.0.tar.gz", hash = "sha256:6eacce0fa4f8cfb4d84eac0d7d7e1b1926040a2df654ae86b94179bdf2bc4d8c"}, + {file = "slack_sdk-3.27.1-py2.py3-none-any.whl", hash = "sha256:c108e509160cf1324c5c8b1f47ca52fb5e287021b8caf9f4ec78ad737ab7b1d9"}, + {file = "slack_sdk-3.27.1.tar.gz", hash = "sha256:85d86b34d807c26c8bb33c1569ec0985876f06ae4a2692afba765b7a5490d28c"}, ] [package.extras] -optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=10,<11)"] -testing = ["Flask (>=1,<2)", "Flask-Sockets (>=0.2,<1)", "Jinja2 (==3.0.3)", "Werkzeug (<2)", "black (==22.8.0)", "boto3 (<=2)", "click (==8.0.4)", "flake8 (>=5,<6)", "itsdangerous (==1.1.0)", "moto (>=3,<4)", "psutil (>=5,<6)", "pytest (>=6.2.5,<7)", "pytest-asyncio (<1)", "pytest-cov (>=2,<3)"] +optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=10,<11)", "websockets (>=9.1,<10)"] [[package]] name = "smmap" @@ -4609,13 +4692,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -4631,13 +4714,13 @@ files = [ [[package]] name = "social-auth-app-django" -version = "5.2.0" +version = "5.4.1" description = "Python Social Authentication, Django integration." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "social-auth-app-django-5.2.0.tar.gz", hash = "sha256:4a5dae406f3874b4003708ff120c02cb1a4c8eeead56cd163646347309fcd0f8"}, - {file = "social_auth_app_django-5.2.0-py3-none-any.whl", hash = "sha256:0347ca4cd23ea9d15a665da9d22950552fb66b95600e6c2ebae38ca883b3a4ed"}, + {file = "social-auth-app-django-5.4.1.tar.gz", hash = "sha256:2a43cde559dd34fdc7132417b6c52c780fa99ec2332dee9f405b4763f371c367"}, + {file = "social_auth_app_django-5.4.1-py3-none-any.whl", hash = "sha256:7519f186c63c50f2d364457b236f051338d194bcface55e318a6a705c5213477"}, ] [package.dependencies] @@ -4646,29 +4729,28 @@ social-auth-core = ">=4.4.1" [[package]] name = "social-auth-core" -version = "4.4.2" +version = "4.5.4" description = "Python social authentication made simple." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "social-auth-core-4.4.2.tar.gz", hash = "sha256:9791d7c7aee2ac8517fe7a2ea2f942a8a5492b3a4ccb44a9b0dacc87d182f2aa"}, - {file = "social_auth_core-4.4.2-py3-none-any.whl", hash = "sha256:ea7a19c46b791b767e95f467881b53c5fd0d1efb40048d9ed3dbc46daa05c954"}, + {file = "social-auth-core-4.5.4.tar.gz", hash = "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac"}, + {file = "social_auth_core-4.5.4-py3-none-any.whl", hash = "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db"}, ] [package.dependencies] cryptography = ">=1.4" defusedxml = ">=0.5.0rc1" oauthlib = ">=1.0.3" -PyJWT = ">=2.0.0" +PyJWT = ">=2.7.0" python3-openid = ">=3.0.10" requests = ">=2.9.1" requests-oauthlib = ">=0.6.1" [package.extras] -all = ["cryptography (>=2.1.1)", "python-jose (>=3.0.0)", "python3-saml (>=1.5.0)"] -allpy3 = ["cryptography (>=2.1.1)", "python-jose (>=3.0.0)", "python3-saml (>=1.5.0)"] +all = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] +allpy3 = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] azuread = ["cryptography (>=2.1.1)"] -openidconnect = ["python-jose (>=3.0.0)"] saml = ["python3-saml (>=1.5.0)"] [[package]] @@ -4797,29 +4879,28 @@ test = ["pytest"] [[package]] name = "sqlparse" -version = "0.4.4" +version = "0.5.0" description = "A non-validating SQL parser." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, - {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, + {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, + {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, ] [package.extras] -dev = ["build", "flake8"] +dev = ["build", "hatch"] doc = ["sphinx"] -test = ["pytest", "pytest-cov"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -4832,13 +4913,13 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "stevedore" -version = "5.1.0" +version = "5.2.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, - {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, + {file = "stevedore-5.2.0-py3-none-any.whl", hash = "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9"}, + {file = "stevedore-5.2.0.tar.gz", hash = "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d"}, ] [package.dependencies] @@ -4885,13 +4966,13 @@ files = [ [[package]] name = "texttable" -version = "1.6.7" +version = "1.7.0" description = "module to create simple ASCII tables" optional = false python-versions = "*" files = [ - {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, - {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, + {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, + {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, ] [[package]] @@ -4932,13 +5013,13 @@ files = [ [[package]] name = "tomlkit" -version = "0.12.1" +version = "0.12.4" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, ] [[package]] @@ -4965,18 +5046,18 @@ dev = ["furo", "packaging", "sphinx (>=5)", "twisted"] [[package]] name = "traitlets" -version = "5.10.1" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false python-versions = ">=3.8" files = [ - {file = "traitlets-5.10.1-py3-none-any.whl", hash = "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116"}, - {file = "traitlets-5.10.1.tar.gz", hash = "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "types-protobuf" @@ -4991,39 +5072,28 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.12" +version = "6.0.12.20240311" description = "Typing stubs for PyYAML" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.12.tar.gz", hash = "sha256:334373d392fde0fdf95af5c3f1661885fa10c52167b14593eb856289e1855062"}, - {file = "types_PyYAML-6.0.12.12-py3-none-any.whl", hash = "sha256:c05bc6c158facb0676674b7f11fe3960db4f389718e19e62bd2b84d6205cfd24"}, + {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, + {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, ] [[package]] name = "types-requests" -version = "2.31.0.6" +version = "2.31.0.20240406" description = "Typing stubs for requests" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.6.tar.gz", hash = "sha256:cd74ce3b53c461f1228a9b783929ac73a666658f223e28ed29753771477b3bd0"}, - {file = "types_requests-2.31.0.6-py3-none-any.whl", hash = "sha256:a2db9cb228a81da8348b49ad6db3f5519452dd20a9c1e1a868c83c5fe88fd1a9"}, + {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, + {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, ] [package.dependencies] -types-urllib3 = "*" - -[[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" -optional = true -python-versions = "*" -files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, -] +urllib3 = ">=2" [[package]] name = "typing" @@ -5038,24 +5108,24 @@ files = [ [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] @@ -5071,66 +5141,68 @@ files = [ [[package]] name = "urllib3" -version = "2.0.5" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.5-py3-none-any.whl", hash = "sha256:ef16afa8ba34a1f989db38e1dbbe0c302e4289a47856990d0682e374563ce35e"}, - {file = "urllib3-2.0.5.tar.gz", hash = "sha256:13abf37382ea2ce6fb744d4dad67838eec857c9f4f57009891805e0b5e123594"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "vine" -version = "5.0.0" -description = "Promises, promises, promises." +version = "5.1.0" +description = "Python promises." optional = false python-versions = ">=3.6" files = [ - {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, - {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, + {file = "vine-5.1.0-py3-none-any.whl", hash = "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc"}, + {file = "vine-5.1.0.tar.gz", hash = "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0"}, ] [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] @@ -5138,13 +5210,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.7" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.7-py2.py3-none-any.whl", hash = "sha256:fabf3e32999d9b0dab7d19d845149f326f04fe29bac67709ee071dbd92640a36"}, - {file = "wcwidth-0.2.7.tar.gz", hash = "sha256:1b6d30a98ddd5ce9bbdb33658191fd2423fc9da203fe3ef1855407dcb7ee4e26"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -5165,98 +5237,28 @@ requests = ">=2.4.2" requests-toolbelt = "*" [[package]] -name = "wrapt" -version = "1.15.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +name = "wheel" +version = "0.43.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, ] +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "yamllint" -version = "1.32.0" +version = "1.35.1" description = "A linter for YAML files." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "yamllint-1.32.0-py3-none-any.whl", hash = "sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7"}, - {file = "yamllint-1.32.0.tar.gz", hash = "sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a"}, + {file = "yamllint-1.35.1-py3-none-any.whl", hash = "sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3"}, + {file = "yamllint-1.35.1.tar.gz", hash = "sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd"}, ] [package.dependencies] @@ -5268,85 +5270,101 @@ dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] [[package]] name = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -5355,24 +5373,25 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [extras] aci = ["PyYAML"] -all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnspython", "ijson", "ipfabric", "ipfabric-diagrams", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] +all = ["Jinja2", "PyYAML", "cloudvision", "cvprac", "dnacentersdk", "dnspython", "ijson", "ipfabric", "ipfabric-diagrams", "nautobot-device-lifecycle-mgmt", "netutils", "oauthlib", "python-magic", "pytz", "requests", "requests-oauthlib", "six"] aristacv = ["cloudvision", "cvprac"] device42 = ["requests"] +dna-center = ["dnacentersdk"] infoblox = ["dnspython"] ipfabric = ["httpx", "ipfabric", "ipfabric-diagrams", "netutils"] nautobot-device-lifecycle-mgmt = ["nautobot-device-lifecycle-mgmt"] @@ -5382,4 +5401,4 @@ servicenow = ["Jinja2", "PyYAML", "ijson", "oauthlib", "python-magic", "pytz", " [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "cd710f5c319a47e01c925b15ded4986b7dd40575ee65813234016f2511ffbbc6" +content-hash = "cecf0df3b54631d7e9c5d1f2c22ae89c3a1e1b3c21b031f5d174b6ba56507c68" diff --git a/pyproject.toml b/pyproject.toml index 9c52dabf5..a46e8cd3e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-ssot" -version = "2.6.0" +version = "2.6.1" description = "Nautobot Single Source of Truth" authors = ["Network to Code, LLC "] license = "Apache-2.0" @@ -51,6 +51,7 @@ requests = { version = ">=2.21.0", optional = true } requests-oauthlib = { version = ">=1.3.0", optional = true } six = { version = ">=1.13.0", optional = true } httpx = { version = ">=0.23.3", optional = true } +dnacentersdk = "^2.5.6" [tool.poetry.group.dev.dependencies] bandit = "*" @@ -118,6 +119,7 @@ all = [ "requests", "requests-oauthlib", "six", + "dnacentersdk", ] aristacv = [ "cloudvision", @@ -126,6 +128,9 @@ aristacv = [ device42 = [ "requests", ] +dna_center = [ + "dnacentersdk", +] infoblox = [ "dnspython", ] diff --git a/tasks.py b/tasks.py index c54ee1b0e..de02c8a7a 100644 --- a/tasks.py +++ b/tasks.py @@ -549,9 +549,11 @@ def import_db(context, db_name="", input_file="dump.sql"): '--execute="', f"DROP DATABASE IF EXISTS {db_name};", f"CREATE DATABASE {db_name};", - "" - if db_name == "$MYSQL_DATABASE" - else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;", + ( + "" + if db_name == "$MYSQL_DATABASE" + else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;" + ), '"', "&&", "mysql",