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",