From 88ae42c670d6914d2d63c3a1f5d5ab2d6d55343b Mon Sep 17 00:00:00 2001 From: Andrew Bates Date: Tue, 30 Apr 2024 12:09:05 -0400 Subject: [PATCH 1/5] Version 2.0 prep --- .github/workflows/ci.yml | 4 +- development/Dockerfile | 2 +- development/nautobot_config.py | 26 - .../contrib/tests/test_ext.py | 21 - .../{nautobot_v2 => }/bgp_extension.yaml | 0 .../{nautobot_v2 => }/cable_connections.yaml | 0 .../{nautobot_v2 => }/child_prefix.yaml | 0 .../testdata/nautobot_v1/bgp_extension.yaml | 78 -- .../nautobot_v1/cable_connections.yaml | 59 -- .../testdata/nautobot_v1/child_prefix.yaml | 43 - .../testdata/nautobot_v1/next_prefix.yaml | 55 -- .../next_prefix_by_role_and_tenant.yaml | 27 - .../{nautobot_v2 => }/next_prefix.yaml | 0 .../next_prefix_by_role_and_tenant.yaml | 0 nautobot_design_builder/design_job.py | 51 +- nautobot_design_builder/fields.py | 6 +- nautobot_design_builder/logging.py | 42 +- nautobot_design_builder/tests/__init__.py | 22 +- .../tests/designs/test_designs.py | 24 +- nautobot_design_builder/tests/test_builder.py | 21 - .../tests/test_design_job.py | 42 +- .../custom_relationship_by_key.yaml | 0 .../custom_relationship_by_label.yaml | 0 .../testdata/{nautobot_v2 => }/git_repo.yaml | 0 .../interface_addresses.yaml | 0 .../ip_address_with_namespace.yaml | 0 .../nautobot_v1/assign_tags_by_name.yaml | 19 - .../nautobot_v1/assign_tags_by_ref.yaml | 19 - .../testdata/nautobot_v1/complex_design1.yaml | 172 ---- .../nautobot_v1/create_or_update_by_ref.yaml | 63 -- .../nautobot_v1/create_or_update_mlag.yaml | 55 -- .../nautobot_v1/create_or_update_rack.yaml | 28 - .../create_or_update_relationships.yaml | 30 - .../testdata/nautobot_v1/create_tags.yaml | 10 - .../custom_relationship_by_label.yaml | 55 -- .../custom_relationship_by_slug.yaml | 55 -- .../nautobot_v1/device_primary_ip.yaml | 38 - .../tests/testdata/nautobot_v1/git_repo.yaml | 14 - .../nautobot_v1/interface_addresses.yaml | 41 - .../testdata/nautobot_v1/nested_create.yaml | 41 - .../testdata/nautobot_v1/nested_update.yaml | 47 -- .../testdata/nautobot_v1/one_to_one.yaml | 50 -- .../tests/testdata/nautobot_v1/prefixes.yaml | 20 - .../{nautobot_v2 => }/nested_create.yaml | 0 .../testdata/{nautobot_v2 => }/prefixes.yaml | 0 nautobot_design_builder/util.py | 12 +- poetry.lock | 767 +++++++----------- pyproject.toml | 8 +- tasks.py | 2 +- 49 files changed, 341 insertions(+), 1728 deletions(-) rename nautobot_design_builder/contrib/tests/testdata/{nautobot_v2 => }/bgp_extension.yaml (100%) rename nautobot_design_builder/contrib/tests/testdata/{nautobot_v2 => }/cable_connections.yaml (100%) rename nautobot_design_builder/contrib/tests/testdata/{nautobot_v2 => }/child_prefix.yaml (100%) delete mode 100644 nautobot_design_builder/contrib/tests/testdata/nautobot_v1/bgp_extension.yaml delete mode 100644 nautobot_design_builder/contrib/tests/testdata/nautobot_v1/cable_connections.yaml delete mode 100644 nautobot_design_builder/contrib/tests/testdata/nautobot_v1/child_prefix.yaml delete mode 100644 nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix.yaml delete mode 100644 nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix_by_role_and_tenant.yaml rename nautobot_design_builder/contrib/tests/testdata/{nautobot_v2 => }/next_prefix.yaml (100%) rename nautobot_design_builder/contrib/tests/testdata/{nautobot_v2 => }/next_prefix_by_role_and_tenant.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/custom_relationship_by_key.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/custom_relationship_by_label.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/git_repo.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/interface_addresses.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/ip_address_with_namespace.yaml (100%) delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_name.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_ref.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/complex_design1.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_by_ref.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_mlag.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_rack.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_relationships.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/create_tags.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_label.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_slug.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/device_primary_ip.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/git_repo.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/interface_addresses.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/nested_create.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/nested_update.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/one_to_one.yaml delete mode 100644 nautobot_design_builder/tests/testdata/nautobot_v1/prefixes.yaml rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/nested_create.yaml (100%) rename nautobot_design_builder/tests/testdata/{nautobot_v2 => }/prefixes.yaml (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21d662a8..5307c09f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,7 @@ jobs: fail-fast: true matrix: python-version: ["3.11"] - nautobot-version: ["2.1"] + nautobot-version: ["2.2"] env: INVOKE_NAUTOBOT_DESIGN_BUILDER_PYTHON_VER: "${{ matrix.python-version }}" INVOKE_NAUTOBOT_DESIGN_BUILDER_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" @@ -177,7 +177,7 @@ jobs: matrix: python-version: ["3.8", "3.11"] db-backend: ["postgresql"] - nautobot-version: ["1.6", "stable"] + nautobot-version: ["stable"] include: - python-version: "3.11" db-backend: "postgresql" diff --git a/development/Dockerfile b/development/Dockerfile index b7b58482..58501b5f 100644 --- a/development/Dockerfile +++ b/development/Dockerfile @@ -7,7 +7,7 @@ # !!! USE CAUTION WHEN MODIFYING LINES BELOW # Accepts a desired Nautobot version as build argument, default to 1.6.0 -ARG NAUTOBOT_VER="1.6.0" +ARG NAUTOBOT_VER="2.0.0" # Accepts a desired Python version as build argument, default to 3.11 ARG PYTHON_VER="3.11" diff --git a/development/nautobot_config.py b/development/nautobot_config.py index bc1c8e44..46e6fbbb 100644 --- a/development/nautobot_config.py +++ b/development/nautobot_config.py @@ -1,12 +1,8 @@ """Nautobot development configuration file.""" -from importlib import metadata -from importlib.util import find_spec import os import sys -from packaging.version import Version - from nautobot.core.settings import * # noqa: F403 # pylint: disable=wildcard-import,unused-wildcard-import from nautobot.core.settings_funcs import is_truthy, parse_redis_connection @@ -140,28 +136,6 @@ # Each key in the dictionary is the name of an installed App and its value is a dictionary of settings. if is_truthy(os.getenv("DESIGN_BUILDER_ENABLE_BGP", "False")): - if find_spec("nautobot_bgp_models") is None: - nautobot_version = Version(Version(metadata.version("nautobot")).base_version) - import subprocess # nosec - - package = "nautobot-bgp-models" - if nautobot_version < Version("2.0"): - # pip doesn't have the capability to automatically pick - # a version compatible with the current Nautobot, so we - # do that manually. This is only for development environments - # so that we can run unit tests on Nautobot 1.6 and 2.x - package = "nautobot-bgp-models==0.9.1" - command = [ - sys.executable, - "-m", - "pip", - "install", - package, - ] - # Since we aren't evaluating any input variables, *and* we - # are not using a shell, this command should be considered - # save, therefore the `nosec` annotation. - subprocess.check_call(command, shell=False) # nosec PLUGINS.append("nautobot_bgp_models") PLUGINS_CONFIG = {"design_builder": {"context_repository": os.getenv("DESIGN_BUILDER_CONTEXT_REPO_SLUG", None)}} diff --git a/nautobot_design_builder/contrib/tests/test_ext.py b/nautobot_design_builder/contrib/tests/test_ext.py index f2ed2293..b18c52ba 100644 --- a/nautobot_design_builder/contrib/tests/test_ext.py +++ b/nautobot_design_builder/contrib/tests/test_ext.py @@ -5,29 +5,8 @@ from django.test import TestCase from nautobot_design_builder.tests.test_builder import builder_test_case -from nautobot_design_builder.util import nautobot_version @builder_test_case(os.path.join(os.path.dirname(__file__), "testdata")) class TestAgnosticExtensions(TestCase): """Test contrib extensions against any version of Nautobot.""" - - -@builder_test_case(os.path.join(os.path.dirname(__file__), "testdata", "nautobot_v1")) -class TestV1Extensions(TestCase): - """Test contrib extensions against Nautobot V1.""" - - def setUp(self): - if nautobot_version >= "2.0.0": - self.skipTest("These tests are only supported in Nautobot 1.x") - super().setUp() - - -@builder_test_case(os.path.join(os.path.dirname(__file__), "testdata", "nautobot_v2")) -class TestV2Extensions(TestCase): - """Test contrib extensions against Nautobot V2.""" - - def setUp(self): - if nautobot_version < "2.0.0": - self.skipTest("These tests are only supported in Nautobot 2.x") - super().setUp() diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v2/bgp_extension.yaml b/nautobot_design_builder/contrib/tests/testdata/bgp_extension.yaml similarity index 100% rename from nautobot_design_builder/contrib/tests/testdata/nautobot_v2/bgp_extension.yaml rename to nautobot_design_builder/contrib/tests/testdata/bgp_extension.yaml diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v2/cable_connections.yaml b/nautobot_design_builder/contrib/tests/testdata/cable_connections.yaml similarity index 100% rename from nautobot_design_builder/contrib/tests/testdata/nautobot_v2/cable_connections.yaml rename to nautobot_design_builder/contrib/tests/testdata/cable_connections.yaml diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v2/child_prefix.yaml b/nautobot_design_builder/contrib/tests/testdata/child_prefix.yaml similarity index 100% rename from nautobot_design_builder/contrib/tests/testdata/nautobot_v2/child_prefix.yaml rename to nautobot_design_builder/contrib/tests/testdata/child_prefix.yaml diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/bgp_extension.yaml b/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/bgp_extension.yaml deleted file mode 100644 index ea436b56..00000000 --- a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/bgp_extension.yaml +++ /dev/null @@ -1,78 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.BGPPeeringExtension" -designs: - - sites: - - "!create_or_update:name": "Site" - status__name: "Active" - - device_roles: - - "!create_or_update:name": "test-role" - - manufacturers: - - "!create_or_update:name": "test-manufacturer" - - device_types: - - manufacturer__name: "test-manufacturer" - "!create_or_update:model": "test-type" - - autonomous_systems: - - "!create_or_update:asn": 64500 - status__name: "Active" - - devices: - - "!create_or_update:name": "device1" - status__name: "Active" - site__name: "Site" - device_role__name: "test-role" - device_type__model: "test-type" - interfaces: - - "!create_or_update:name": "Ethernet1/1" - type: "virtual" - status__name: "Active" - ip_addresses: - - "!create_or_update:address": "192.168.1.1/24" - status__name: "Active" - bgp_routing_instances: - - "!create_or_update:autonomous_system__asn": 64500 - "!ref": "device1-instance" - status__name: "Active" - - - "!create_or_update:name": "device2" - status__name: "Active" - site__name: "Site" - device_role__name: "test-role" - device_type__model: "test-type" - interfaces: - - "!create_or_update:name": "Ethernet1/1" - type: "virtual" - status__name: "Active" - ip_addresses: - - "!create_or_update:address": "192.168.1.2/24" - status__name: "Active" - bgp_routing_instances: - - "!create_or_update:autonomous_system__asn": 64500 - "!ref": "device2-instance" - status__name: "Active" - - bgp_peerings: - - "!bgp_peering": - endpoint_a: - "!create_or_update:routing_instance__device__name": "device1" - "!create_or_update:source_ip": - "!get:interface__device__name": "device1" - "!get:interface__name": "Ethernet1/1" - endpoint_z: - "!create_or_update:routing_instance__device__name": "device2" - "!create_or_update:source_ip": - "!get:interface__device__name": "device2" - "!get:interface__name": "Ethernet1/1" - status__name: "Active" -checks: - - equal: - - model: "nautobot_bgp_models.models.PeerEndpoint" - query: {routing_instance__device__name: "device1"} - attribute: "peering" - - model: "nautobot_bgp_models.models.PeerEndpoint" - query: {routing_instance__device__name: "device2"} - attribute: "peering" diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/cable_connections.yaml b/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/cable_connections.yaml deleted file mode 100644 index bd80c907..00000000 --- a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/cable_connections.yaml +++ /dev/null @@ -1,59 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.CableConnectionExtension" -designs: - - sites: - - "!create_or_update:name": "Site" - status__name: "Active" - device_roles: - - "!create_or_update:name": "test-role" - manufacturers: - - "!create_or_update:name": "test-manufacturer" - device_types: - - manufacturer__name: "test-manufacturer" - "!create_or_update:model": "test-type" - devices: - - "!create_or_update:name": "Device 1" - "!ref": "device1" - site__name: "Site" - status__name: "Active" - device_role__name: "test-role" - device_type__model: "test-type" - interfaces: - - "!create_or_update:name": "GigabitEthernet1" - type: "1000base-t" - status__name: "Active" - - "!create_or_update:name": "Device 2" - site__name: "Site" - status__name: "Active" - device_role__name: "test-role" - device_type__model: "test-type" - interfaces: - - "!create_or_update:name": "GigabitEthernet1" - type: "1000base-t" - status__name: "Active" - "!connect_cable": - status__name: "Planned" - to: - device: "!ref:device1" - name: "GigabitEthernet1" - # Second design, same as the first, checks for - # cable connection idempotence - - devices: - - "!create_or_update:name": "Device 1" - "!ref": "device1" - - "!create_or_update:name": "Device 2" - interfaces: - - "!create_or_update:name": "GigabitEthernet1" - "!connect_cable": - status__name: "Planned" - to: - device: "!ref:device1" - name: "GigabitEthernet1" - -checks: - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "Device 1", name: "GigabitEthernet1"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "Device 2", name: "GigabitEthernet1"} diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/child_prefix.yaml b/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/child_prefix.yaml deleted file mode 100644 index 0f07d112..00000000 --- a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/child_prefix.yaml +++ /dev/null @@ -1,43 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.NextPrefixExtension" - - "nautobot_design_builder.contrib.ext.ChildPrefixExtension" -designs: - - tenants: - - name: "Nautobot Airports" - roles: - - name: "Video" - - name: "Servers" - prefixes: - - prefix: "10.0.0.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Servers" - - prefix: "10.0.2.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Video" - - "!next_prefix": - prefix: - - "10.0.0.0/23" - length: 24 - status__name: "Active" - "!ref": "parent_prefix" - - "!child_prefix": - parent: "!ref:parent_prefix" - offset: "0.0.0.0/25" - status__name: "Active" - - "!child_prefix": - parent: "!ref:parent_prefix" - offset: "0.0.0.128/25" - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.0.0/24"} - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.0.0/25"} - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.0.128/25"} diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix.yaml b/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix.yaml deleted file mode 100644 index 937c9bc1..00000000 --- a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.NextPrefixExtension" -designs: - - tenants: - - name: "Nautobot Airports" - roles: - - name: "Video" - - name: "Servers" - prefixes: - - prefix: "10.0.0.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Servers" - - prefix: "10.0.2.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Video" - - "!next_prefix": - prefix: - - "10.0.0.0/23" - - "10.0.2.0/23" - length: 24 - status__name: "Active" - - "!next_prefix": - prefix: - - "10.0.0.0/23" - - "10.0.2.0/23" - length: 24 - status__name: "Active" - - "!next_prefix": - prefix: - - "10.0.0.0/23" - - "10.0.2.0/23" - length: 24 - status__name: "Active" - - "!next_prefix": - prefix: - - "10.0.0.0/23" - - "10.0.2.0/23" - length: 24 - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.0.0/24"} - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.1.0/24"} - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.2.0/24"} - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.3.0/24"} diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix_by_role_and_tenant.yaml b/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix_by_role_and_tenant.yaml deleted file mode 100644 index 2a4023c2..00000000 --- a/nautobot_design_builder/contrib/tests/testdata/nautobot_v1/next_prefix_by_role_and_tenant.yaml +++ /dev/null @@ -1,27 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.NextPrefixExtension" -designs: - - tenants: - - name: "Nautobot Airports" - roles: - - name: "Video" - - name: "Servers" - prefixes: - - prefix: "10.0.0.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Servers" - - prefix: "10.0.2.0/23" - status__name: "Active" - tenant__name: "Nautobot Airports" - role__name: "Video" - - "!next_prefix": - role__name: "Video" - tenant__name: "Nautobot Airports" - length: 24 - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.Prefix" - query: {prefix: "10.0.2.0/24"} diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v2/next_prefix.yaml b/nautobot_design_builder/contrib/tests/testdata/next_prefix.yaml similarity index 100% rename from nautobot_design_builder/contrib/tests/testdata/nautobot_v2/next_prefix.yaml rename to nautobot_design_builder/contrib/tests/testdata/next_prefix.yaml diff --git a/nautobot_design_builder/contrib/tests/testdata/nautobot_v2/next_prefix_by_role_and_tenant.yaml b/nautobot_design_builder/contrib/tests/testdata/next_prefix_by_role_and_tenant.yaml similarity index 100% rename from nautobot_design_builder/contrib/tests/testdata/nautobot_v2/next_prefix_by_role_and_tenant.yaml rename to nautobot_design_builder/contrib/tests/testdata/next_prefix_by_role_and_tenant.yaml diff --git a/nautobot_design_builder/design_job.py b/nautobot_design_builder/design_job.py index 61e88d14..078d5f3f 100644 --- a/nautobot_design_builder/design_job.py +++ b/nautobot_design_builder/design_job.py @@ -12,7 +12,7 @@ from jinja2 import TemplateError -from nautobot.extras.jobs import Job +from nautobot.apps.jobs import Job, DryRunVar from nautobot.extras.models import FileProxy from nautobot_design_builder.errors import DesignImplementationError, DesignModelError @@ -20,7 +20,6 @@ from nautobot_design_builder.logging import LoggingMixin from nautobot_design_builder.design import Environment from nautobot_design_builder.context import Context -from .util import nautobot_version class DesignJob(Job, ABC, LoggingMixin): # pylint: disable=too-many-instance-attributes @@ -31,10 +30,7 @@ class DesignJob(Job, ABC, LoggingMixin): # pylint: disable=too-many-instance-at a Meta class. """ - if nautobot_version >= "2.0.0": - from nautobot.extras.jobs import DryRunVar # pylint: disable=no-name-in-module,import-outside-toplevel - - dryrun = DryRunVar() + dryrun = DryRunVar() @classmethod @abstractmethod @@ -46,11 +42,7 @@ def __init__(self, *args, **kwargs): # rendered designs self.environment: Environment = None self.designs = {} - # TODO: Remove this when we no longer support Nautobot 1.x self.rendered = None - self.rendered_design = None - self.failed = False - self.report = None super().__init__(*args, **kwargs) @@ -67,16 +59,6 @@ def post_implementation(self, context: Context, environment: Environment): environment (Environment): The build environment that consumed the rendered design files. This is useful for accessing the design journal. """ - def post_run(self): - """Method that will run after the main Nautobot job has executed.""" - # TODO: This is not supported in Nautobot 2 and the entire method - # should be removed once we no longer support Nautobot 1. - if self.rendered: - self.job_result.data["output"] = self.rendered - - self.job_result.data["designs"] = self.designs - self.job_result.data["report"] = self.report - def render(self, context: Context, filename: str) -> str: """High level function to render the Jinja design templates into YAML. @@ -154,10 +136,10 @@ def implement_design(self, context, design_file, commit): design = self.render_design(context, design_file) self.environment.implement_design(design, commit) - def run(self, **kwargs): # pylint: disable=arguments-differ + def run(self, dryrun: bool, **kwargs): # pylint: disable=arguments-differ """Render the design and implement it within a build Environment object.""" try: - return self._run_in_transaction(**kwargs) + return self._run_in_transaction(dryrun, **kwargs) finally: if self.rendered: rendered_design = path.basename(self.rendered_design) @@ -174,7 +156,7 @@ def run(self, **kwargs): # pylint: disable=arguments-differ self.save_design_file(output_file, yaml.safe_dump(design)) @transaction.atomic - def _run_in_transaction(self, **kwargs): # pylint: disable=too-many-branches + def _run_in_transaction(self, dryrun: bool, **data): # pylint: disable=too-many-branches """Render the design and implement it within a build Environment object. This version of `run` is wrapped in a transaction and will roll back database changes @@ -186,13 +168,6 @@ def _run_in_transaction(self, **kwargs): # pylint: disable=too-many-branches design_files = None - if nautobot_version < "2.0.0": - commit = kwargs["commit"] - data = kwargs["data"] - else: - commit = not kwargs.pop("dryrun", True) - data = kwargs - if hasattr(self.Meta, "context_class"): context = self.Meta.context_class(data=data, job_result=self.job_result) context.validate() @@ -212,14 +187,16 @@ def _run_in_transaction(self, **kwargs): # pylint: disable=too-many-branches try: for design_file in design_files: - self.implement_design(context, design_file, commit) - if commit: + self.implement_design(context, design_file, not dryrun) + if not dryrun: self.post_implementation(context, self.environment) if hasattr(self.Meta, "report"): self.report = self.render_report(context, self.environment.journal) + output_filename: str = path.basename(getattr(self.Meta, "report")) + if output_filename.endswith(".j2"): + output_filename = output_filename[0:-3] self.log_success(message=self.report) - if nautobot_version >= "2.0": - self.save_design_file("report.md", self.report) + self.save_design_file(output_filename, self.report) else: transaction.savepoint_rollback(sid) self.log_info( @@ -230,8 +207,7 @@ def _run_in_transaction(self, **kwargs): # pylint: disable=too-many-branches self.log_failure(message="Failed to implement design") self.log_failure(message=str(ex)) self.failed = True - if nautobot_version >= "2": - raise ex + raise ex except Exception as ex: transaction.savepoint_rollback(sid) self.failed = True @@ -246,9 +222,6 @@ def save_design_file(self, filename, content): filename (str): The name of the file to save. content (str): The content to save to the file. """ - if nautobot_version < "2.0": - return - FileProxy.objects.create( name=filename, job_result=self.job_result, diff --git a/nautobot_design_builder/fields.py b/nautobot_design_builder/fields.py index 66f40103..eb9c9894 100644 --- a/nautobot_design_builder/fields.py +++ b/nautobot_design_builder/fields.py @@ -52,7 +52,6 @@ from nautobot_design_builder.errors import DesignImplementationError from nautobot_design_builder.debug import debug_set -from nautobot_design_builder.util import nautobot_version if TYPE_CHECKING: from .design import ModelInstance @@ -295,10 +294,7 @@ def __init__(self, model_class, relationship: Relationship): self.related_model = relationship.source_type.model_class() field_name = str(self.relationship.get_label("destination")) self.__set_name__(model_class, str_to_var_name(field_name)) - if nautobot_version < "2.0.0": - self.key_name = self.relationship.slug - else: - self.key_name = self.relationship.key + self.key_name = self.relationship.key @debug_set def __set__(self, obj: "ModelInstance", values): # noqa:D105 diff --git a/nautobot_design_builder/logging.py b/nautobot_design_builder/logging.py index e3ff4126..5b12d66c 100644 --- a/nautobot_design_builder/logging.py +++ b/nautobot_design_builder/logging.py @@ -5,36 +5,18 @@ from nautobot.extras.choices import LogLevelChoices from nautobot.extras.models import JobResult -from .util import nautobot_version - -if nautobot_version < "2.0.0": - # MIN_VERSION: 2.0.0 - _logger_to_level_choices = { - logging.DEBUG: LogLevelChoices.LOG_INFO, - logging.INFO: LogLevelChoices.LOG_INFO, - logging.WARNING: LogLevelChoices.LOG_WARNING, - logging.ERROR: LogLevelChoices.LOG_FAILURE, # pylint: disable=no-member - logging.CRITICAL: LogLevelChoices.LOG_FAILURE, # pylint: disable=no-member - } - LOG_INFO = LogLevelChoices.LOG_INFO - LOG_DEBUG = LogLevelChoices.LOG_INFO - LOG_SUCCESS = LogLevelChoices.LOG_SUCCESS # pylint: disable=no-member - LOG_WARNING = LogLevelChoices.LOG_WARNING - LOG_FAILURE = LogLevelChoices.LOG_FAILURE # pylint: disable=no-member - # /MIN_VERSION: 2.0.0 -else: - _logger_to_level_choices = { - logging.DEBUG: LogLevelChoices.LOG_DEBUG, # pylint: disable=no-member - logging.INFO: LogLevelChoices.LOG_INFO, - logging.WARNING: LogLevelChoices.LOG_WARNING, - logging.ERROR: LogLevelChoices.LOG_ERROR, # pylint: disable=no-member - logging.CRITICAL: LogLevelChoices.LOG_CRITICAL, # pylint: disable=no-member - } - LOG_INFO = LogLevelChoices.LOG_INFO - LOG_DEBUG = LogLevelChoices.LOG_DEBUG # pylint: disable=no-member - LOG_SUCCESS = LogLevelChoices.LOG_INFO - LOG_WARNING = LogLevelChoices.LOG_WARNING - LOG_FAILURE = LogLevelChoices.LOG_ERROR # pylint: disable=no-member +_logger_to_level_choices = { + logging.DEBUG: LogLevelChoices.LOG_DEBUG, # pylint: disable=no-member + logging.INFO: LogLevelChoices.LOG_INFO, + logging.WARNING: LogLevelChoices.LOG_WARNING, + logging.ERROR: LogLevelChoices.LOG_ERROR, # pylint: disable=no-member + logging.CRITICAL: LogLevelChoices.LOG_CRITICAL, # pylint: disable=no-member +} +LOG_INFO = LogLevelChoices.LOG_INFO +LOG_DEBUG = LogLevelChoices.LOG_DEBUG # pylint: disable=no-member +LOG_SUCCESS = LogLevelChoices.LOG_INFO +LOG_WARNING = LogLevelChoices.LOG_WARNING +LOG_FAILURE = LogLevelChoices.LOG_ERROR # pylint: disable=no-member class JobResultHandler(logging.Handler): diff --git a/nautobot_design_builder/tests/__init__.py b/nautobot_design_builder/tests/__init__.py index 992523d5..ac6dae15 100644 --- a/nautobot_design_builder/tests/__init__.py +++ b/nautobot_design_builder/tests/__init__.py @@ -11,7 +11,6 @@ from django.test import TestCase from nautobot_design_builder.design_job import DesignJob -from nautobot_design_builder.util import nautobot_version logging.disable(logging.CRITICAL) @@ -35,20 +34,12 @@ def get_mocked_job(self, design_class: Type[DesignJob]): """Create an instance of design_class and properly mock request and job_result for testing.""" job = design_class() job.job_result = mock.Mock() - job.save_design_file = lambda filename, content: None - if nautobot_version < "2.0.0": - job.request = mock.Mock() - else: - # TODO: Remove this when we no longer support Nautobot 1.x - job.job_result.data = {} - old_run = job.run + job.saved_files = {} - def new_run(data, commit): - kwargs = {**data} - kwargs["dryrun"] = not commit - old_run(**kwargs) + def save_design_file(filename, content): + job.saved_files[filename] = content - job.run = new_run + job.save_design_file = save_design_file self.logged_messages = [] def record_log(message, obj, level_choice, grouping=None, logger=None): # pylint: disable=unused-argument @@ -69,11 +60,6 @@ def assert_context_files_created(self, *filenames): for filename in filenames: self.assertTrue(path.exists(path.join(self.git_path, filename)), f"{filename} was not created") - def assertJobSuccess(self, job): # pylint: disable=invalid-name - """Assert that a mocked job has completed successfully.""" - if job.failed: - self.fail(f"Job failed with {self.logged_messages[-1]}") - def tearDown(self): """Remove temporary files.""" self.git_patcher.stop() diff --git a/nautobot_design_builder/tests/designs/test_designs.py b/nautobot_design_builder/tests/designs/test_designs.py index 6dfebab4..d2fd23f1 100644 --- a/nautobot_design_builder/tests/designs/test_designs.py +++ b/nautobot_design_builder/tests/designs/test_designs.py @@ -1,8 +1,9 @@ """Design jobs used for unit testing.""" +from nautobot.apps.jobs import register_jobs + from nautobot_design_builder.design_job import DesignJob from nautobot_design_builder.ext import Extension -from nautobot_design_builder.util import nautobot_version class SimpleDesign(DesignJob): @@ -83,15 +84,12 @@ class Meta: # pylint: disable=too-few-public-methods design_file = "templates/design_with_validation_error.yaml.j2" -if nautobot_version >= "2.0": - from nautobot.apps.jobs import register_jobs # pylint: disable=import-error, no-name-in-module - - register_jobs( - SimpleDesign, - SimpleDesignReport, - MultiDesignJob, - MultiDesignJobWithError, - DesignJobWithExtensions, - DesignWithRefError, - DesignWithValidationError, - ) +register_jobs( + SimpleDesign, + SimpleDesignReport, + MultiDesignJob, + MultiDesignJobWithError, + DesignJobWithExtensions, + DesignWithRefError, + DesignWithValidationError, +) diff --git a/nautobot_design_builder/tests/test_builder.py b/nautobot_design_builder/tests/test_builder.py index 36588b59..4297b494 100644 --- a/nautobot_design_builder/tests/test_builder.py +++ b/nautobot_design_builder/tests/test_builder.py @@ -12,7 +12,6 @@ from nautobot.dcim.models import Cable from nautobot_design_builder.design import Environment -from nautobot_design_builder.util import nautobot_version class BuilderChecks: @@ -151,23 +150,3 @@ def test_runner(self, roll_back: Mock): @builder_test_case(os.path.join(os.path.dirname(__file__), "testdata")) class TestGeneralDesigns(TestCase): """Designs that should work with all versions of Nautobot.""" - - -@builder_test_case(os.path.join(os.path.dirname(__file__), "testdata", "nautobot_v1")) -class TestV1Designs(TestCase): - """Designs that only work in Nautobot 1.x""" - - def setUp(self): - if nautobot_version >= "2.0.0": - self.skipTest("These tests are only supported in Nautobot 1.x") - super().setUp() - - -@builder_test_case(os.path.join(os.path.dirname(__file__), "testdata", "nautobot_v2")) -class TestV2Designs(TestCase): - """Designs that only work in Nautobot 1.x""" - - def setUp(self): - if nautobot_version < "2.0.0": - self.skipTest("These tests are only supported in Nautobot 2.x") - super().setUp() diff --git a/nautobot_design_builder/tests/test_design_job.py b/nautobot_design_builder/tests/test_design_job.py index 57f89bbb..7aa2c69c 100644 --- a/nautobot_design_builder/tests/test_design_job.py +++ b/nautobot_design_builder/tests/test_design_job.py @@ -9,7 +9,6 @@ from nautobot_design_builder.errors import DesignImplementationError, DesignValidationError from nautobot_design_builder.tests import DesignTestCase from nautobot_design_builder.tests.designs import test_designs -from nautobot_design_builder.util import nautobot_version class TestDesignJob(DesignTestCase): @@ -18,7 +17,7 @@ class TestDesignJob(DesignTestCase): @patch("nautobot_design_builder.design_job.Environment") def test_simple_design_commit(self, environment: Mock): job = self.get_mocked_job(test_designs.SimpleDesign) - job.run(data={}, commit=True) + job.run(data={}, dryrun=False) self.assertIsNotNone(job.job_result) environment.assert_called() self.assertDictEqual( @@ -29,26 +28,21 @@ def test_simple_design_commit(self, environment: Mock): def test_simple_design_rollback(self): job1 = self.get_mocked_job(test_designs.SimpleDesign) - job1.run(data={}, commit=True) - self.assertFalse(job1.failed) + job1.run(data={}, dryrun=False) self.assertEqual(1, Manufacturer.objects.all().count()) job2 = self.get_mocked_job(test_designs.SimpleDesign3) - if nautobot_version < "2": - job2.run(data={}, commit=True) - else: - self.assertRaises(DesignValidationError, job2.run, data={}, commit=True) - self.assertTrue(job2.failed) + self.assertRaises(DesignValidationError, job2.run, data={}, dryrun=False) self.assertEqual(1, Manufacturer.objects.all().count()) def test_simple_design_report(self): job = self.get_mocked_job(test_designs.SimpleDesignReport) - job.run(data={}, commit=True) - self.assertJobSuccess(job) - self.assertEqual("Report output", job.report) + job.run(data={}, dryrun=False) + self.assertIn("simple_report.md", job.saved_files) + self.assertEqual("Report output", job.saved_files["simple_report.md"]) def test_multiple_design_files(self): job = self.get_mocked_job(test_designs.MultiDesignJob) - job.run(data={}, commit=True) + job.run(data={}, dryrun=False) self.assertDictEqual( {"manufacturers": {"name": "Test Manufacturer"}}, job.designs[test_designs.MultiDesignJob.Meta.design_files[0]], @@ -61,17 +55,14 @@ def test_multiple_design_files(self): def test_multiple_design_files_with_roll_back(self): self.assertEqual(0, Manufacturer.objects.all().count()) job = self.get_mocked_job(test_designs.MultiDesignJobWithError) - if nautobot_version < "2": - job.run(data={}, commit=True) - else: - self.assertRaises(DesignValidationError, job.run, data={}, commit=True) + self.assertRaises(DesignValidationError, job.run, data={}, dryrun=False) self.assertEqual(0, Manufacturer.objects.all().count()) @patch("nautobot_design_builder.design_job.Environment") def test_custom_extensions(self, environment: Mock): job = self.get_mocked_job(test_designs.DesignJobWithExtensions) - job.run(data={}, commit=True) + job.run(data={}, dryrun=False) environment.assert_called_once_with( job_result=job.job_result, extensions=test_designs.DesignJobWithExtensions.Meta.extensions, @@ -85,29 +76,20 @@ class TestDesignJobLogging(DesignTestCase): def test_simple_design_implementation_error(self, environment: Mock): environment.return_value.implement_design.side_effect = DesignImplementationError("Broken") job = self.get_mocked_job(test_designs.SimpleDesign) - if nautobot_version < "2": - job.run(data={}, commit=True) - else: - self.assertRaises(DesignImplementationError, job.run, data={}, commit=True) + self.assertRaises(DesignImplementationError, job.run, data={}, dryrun=True) self.assertTrue(job.failed) job.job_result.log.assert_called() self.assertEqual("Broken", self.logged_messages[-1]["message"]) def test_invalid_ref(self): job = self.get_mocked_job(test_designs.DesignWithRefError) - if nautobot_version < "2": - job.run(data={}, commit=True) - else: - self.assertRaises(DesignImplementationError, job.run, data={}, commit=True) + self.assertRaises(DesignImplementationError, job.run, data={}, dryrun=False) message = self.logged_messages[-1]["message"] self.assertEqual("No ref named manufacturer has been saved in the design.", message) def test_failed_validation(self): job = self.get_mocked_job(test_designs.DesignWithValidationError) - if nautobot_version < "2": - job.run(data={}, commit=True) - else: - self.assertRaises(DesignValidationError, job.run, data={}, commit=True) + self.assertRaises(DesignValidationError, job.run, data={}, dryrun=False) message = self.logged_messages[-1]["message"] want_error = DesignValidationError("Manufacturer") diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/custom_relationship_by_key.yaml b/nautobot_design_builder/tests/testdata/custom_relationship_by_key.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/custom_relationship_by_key.yaml rename to nautobot_design_builder/tests/testdata/custom_relationship_by_key.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/custom_relationship_by_label.yaml b/nautobot_design_builder/tests/testdata/custom_relationship_by_label.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/custom_relationship_by_label.yaml rename to nautobot_design_builder/tests/testdata/custom_relationship_by_label.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/git_repo.yaml b/nautobot_design_builder/tests/testdata/git_repo.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/git_repo.yaml rename to nautobot_design_builder/tests/testdata/git_repo.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/interface_addresses.yaml b/nautobot_design_builder/tests/testdata/interface_addresses.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/interface_addresses.yaml rename to nautobot_design_builder/tests/testdata/interface_addresses.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/ip_address_with_namespace.yaml b/nautobot_design_builder/tests/testdata/ip_address_with_namespace.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/ip_address_with_namespace.yaml rename to nautobot_design_builder/tests/testdata/ip_address_with_namespace.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_name.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_name.yaml deleted file mode 100644 index 21faef8d..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_name.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -designs: - - tags: - - name: "Test Tag" - "!ref": "test_tag" - slug: "test_tag" - description: "Some Description" - - sites: - - name: "site_1" - status__name: "Active" - tags: - - {"!get:name": "Test Tag"} -checks: - - equal: - - model: "nautobot.dcim.models.Site" - query: {name: "site_1"} - attribute: "tags" - - model: "nautobot.extras.models.Tag" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_ref.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_ref.yaml deleted file mode 100644 index ec426a45..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/assign_tags_by_ref.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -designs: - - tags: - - name: "Test Tag" - "!ref": "test_tag" - slug: "test_tag" - description: "Some Description" - - sites: - - name: "site_1" - status__name: "Active" - tags: - - "!ref:test_tag" -checks: - - equal: - - model: "nautobot.dcim.models.Site" - query: {name: "site_1"} - attribute: "tags" - - model: "nautobot.extras.models.Tag" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/complex_design1.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/complex_design1.yaml deleted file mode 100644 index 14bf76cc..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/complex_design1.yaml +++ /dev/null @@ -1,172 +0,0 @@ ---- -checks: - # Spine 1 to Leaf 1 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine1", name: "Ethernet9/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf1", name: "Ethernet33/1"} - - # Spine 1 to Leaf 2 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine1", name: "Ethernet25/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf2", name: "Ethernet33/1"} - - # Spine 2 to Leaf 1 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine2", name: "Ethernet9/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf1", name: "Ethernet34/1"} - - # Spine 2 to Leaf 2 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine2", name: "Ethernet25/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf2", name: "Ethernet34/1"} - - # Spine 3 to Leaf 1 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine3", name: "Ethernet9/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf1", name: "Ethernet35/1"} - - # Spine 3 to Leaf 2 - - connected: - - model: "nautobot.dcim.models.Interface" - query: {device__name: "spine3", name: "Ethernet25/3"} - - model: "nautobot.dcim.models.Interface" - query: {device__name: "leaf2", name: "Ethernet35/1"} -designs: - - manufacturers: - - "name": "manufacturer" - - device_types: - - "manufacturer__name": "manufacturer" - "model": "model name" - "u_height": 1 - - device_roles: - - "name": "EVPN Leaf" - - "name": "EVPN Spine" - - sites: - - "name": "site" - "status__name": "Active" - - devices: - # Create Spine Switches - - "!create_or_update:name": "spine1" - "status__name": "Active" - "site__name": "site" - "device_role__name": "EVPN Spine" - "device_type__model": "model name" - "interfaces": - - "!create_or_update:name": "Ethernet9/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine1_to_leaf1" - - "!create_or_update:name": "Ethernet25/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine1_to_leaf2" - - "!create_or_update:name": "spine2" - "status__name": "Active" - "site__name": "site" - "device_role__name": "EVPN Spine" - "device_type__model": "model name" - "interfaces": - - "!create_or_update:name": "Ethernet9/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine2_to_leaf1" - - "!create_or_update:name": "Ethernet25/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine2_to_leaf2" - - "!create_or_update:name": "spine3" - "status__name": "Active" - "site__name": "site" - "device_role__name": "EVPN Spine" - "device_type__model": "model name" - "interfaces": - - "!create_or_update:name": "Ethernet9/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine3_to_leaf1" - - "!create_or_update:name": "Ethernet25/3" - "type": "100gbase-x-qsfp28" - "status__name": "Active" - "!ref": "spine3_to_leaf2" - - "!create_or_update:name": "leaf1" - "status__name": "Active" - "site__name": "site" - "device_role__name": "EVPN Leaf" - "device_type__model": "model name" - "interfaces": - - "!create_or_update:name": "Ethernet33/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf1_to_spine1" - "status__name": "Active" - - "!create_or_update:name": "Ethernet34/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf1_to_spine2" - "status__name": "Active" - - "!create_or_update:name": "Ethernet35/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf1_to_spine3" - "status__name": "Active" - - "!create_or_update:name": "leaf2" - "status__name": "Active" - "site__name": "site" - "device_role__name": "EVPN Leaf" - "device_type__model": "model name" - "interfaces": - - "!create_or_update:name": "Ethernet33/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf2_to_spine1" - "status__name": "Active" - - "!create_or_update:name": "Ethernet34/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf2_to_spine2" - "status__name": "Active" - - "!create_or_update:name": "Ethernet35/1" - "type": "100gbase-x-qsfp28" - "!ref": "leaf2_to_spine3" - "status__name": "Active" - - cables: - - "!create_or_update:termination_a_id": "!ref:spine1_to_leaf1.id" - "!create_or_update:termination_b_id": "!ref:leaf1_to_spine1.id" - "termination_a": "!ref:spine1_to_leaf1" - "termination_b": "!ref:leaf1_to_spine1" - "status__name": "Planned" - - "!create_or_update:termination_a_id": "!ref:spine2_to_leaf1.id" - "!create_or_update:termination_b_id": "!ref:leaf1_to_spine2.id" - "termination_a": "!ref:spine2_to_leaf1" - "termination_b": "!ref:leaf1_to_spine2" - "status__name": "Planned" - - "!create_or_update:termination_a_id": "!ref:spine3_to_leaf1.id" - "!create_or_update:termination_b_id": "!ref:leaf1_to_spine3.id" - "termination_a": "!ref:spine3_to_leaf1" - "termination_b": "!ref:leaf1_to_spine3" - "status__name": "Planned" - - "!create_or_update:termination_a_id": "!ref:spine1_to_leaf2.id" - "!create_or_update:termination_b_id": "!ref:leaf2_to_spine1.id" - "termination_a": "!ref:spine1_to_leaf2" - "termination_b": "!ref:leaf2_to_spine1" - "status__name": "Planned" - - "!create_or_update:termination_a_id": "!ref:spine2_to_leaf2.id" - "!create_or_update:termination_b_id": "!ref:leaf2_to_spine2.id" - "termination_a": "!ref:spine2_to_leaf2" - "termination_b": "!ref:leaf2_to_spine2" - "status__name": "Planned" - - "!create_or_update:termination_a_id": "!ref:spine3_to_leaf2.id" - "!create_or_update:termination_b_id": "!ref:leaf2_to_spine3.id" - "termination_a": "!ref:spine3_to_leaf2" - "termination_b": "!ref:leaf2_to_spine3" - "status__name": "Planned" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_by_ref.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_by_ref.yaml deleted file mode 100644 index 2ec509f1..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_by_ref.yaml +++ /dev/null @@ -1,63 +0,0 @@ ---- -designs: - # Design 1 - - secrets: - - "!create_or_update:name": "Device username" - "description": "Username for network devices" - "provider": "environment-variable" - "parameters": {"variable": "NAUTOBOT_NAPALM_USERNAME"} - "!ref": "device_username" - - "!create_or_update:name": "Device password" - "description": "Password for network devices" - "provider": "environment-variable" - "parameters": {"variable": "NAUTOBOT_NAPALM_PASSWORD"} - "!ref": "device_password" - - secrets_groups: - - "!create_or_update:name": "Device credentials" - "!ref": "device_credentials" - - secrets_group_associations: - - "!create_or_update:group": "!ref:device_credentials" - "!create_or_update:secret": "!ref:device_username" - "access_type": "Generic" - "secret_type": "username" - - "!create_or_update:group": "!ref:device_credentials" - "!create_or_update:secret": "!ref:device_password" - "access_type": "Generic" - "secret_type": "password" - # Design 2 - - secrets: - - "!create_or_update:name": "Device username" - "description": "Username for network devices" - "provider": "environment-variable" - "parameters": {"variable": "NAUTOBOT_NAPALM_USERNAME"} - "!ref": "device_username" - - "!create_or_update:name": "Device password" - "description": "Password for network devices" - "provider": "environment-variable" - "parameters": {"variable": "NAUTOBOT_NAPALM_PASSWORD"} - "!ref": "device_password" - secrets_groups: - - "!create_or_update:name": "Device credentials" - "!ref": "device_credentials" - - secrets_group_associations: - - "!create_or_update:group": "!ref:device_credentials" - "!create_or_update:secret": "!ref:device_username" - "access_type": "Generic" - "secret_type": "username" - - "!create_or_update:group": "!ref:device_credentials" - "!create_or_update:secret": "!ref:device_password" - "access_type": "Generic" - "secret_type": "password" -checks: - - count: - model: "nautobot.extras.models.Secret" - count: 2 - - count: - model: "nautobot.extras.models.SecretsGroup" - count: 1 - - count: - model: "nautobot.extras.models.SecretsGroupAssociation" - count: 2 diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_mlag.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_mlag.yaml deleted file mode 100644 index bda2b1a6..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_mlag.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -designs: - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - interfaces: - - name: "Ethernet1/1" - type: "1000base-t" - status__name: "Active" - "!ref": "ethernet11" - - name: "Ethernet2/1" - type: "1000base-t" - status__name: "Active" - "!ref": "ethernet21" - - name: "Ethernet3/1" - type: "1000base-t" - status__name: "Active" - "!ref": "ethernet31" - - name: "Ethernet4/1" - type: "1000base-t" - status__name: "Active" - "!ref": "ethernet41" - - name: "Port-Channel1" - type: "lag" - status__name: "Active" - member_interfaces: - - "!ref:ethernet11" - - "!ref:ethernet21" - - "!ref:ethernet31" - - "!ref:ethernet41" -checks: - - equal: - - model: "nautobot.dcim.models.Interface" - query: {name: "Port-Channel1"} - attribute: "member_interfaces" - - model: "nautobot.dcim.models.Interface" - query: {name__startswith: "Ethernet"} diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_rack.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_rack.yaml deleted file mode 100644 index 599d64ea..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_rack.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -designs: - - manufacturers: - - name: "Vendor" - device_types: - - "!create_or_update:model": "test model" - "!create_or_update:manufacturer__name": "Vendor" - device_roles: - - name: "role" - sites: - - name: "Site" - status__name: "Active" - devices: - - "!create_or_update:name": "test device" - "!create_or_update:device_type__manufacturer__name": "Vendor" - device_role__name: "role" - site__name: "Site" - status__name: "Active" - rack: - "!create_or_update:name": "rack-1" - "!create_or_update:site__name": "Site" - status__name: "Active" -checks: - - equal: - - model: "nautobot.dcim.models.Device" - query: {name: "test device"} - attribute: "rack.name" - - value: "rack-1" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_relationships.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_relationships.yaml deleted file mode 100644 index b0544ecb..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/create_or_update_relationships.yaml +++ /dev/null @@ -1,30 +0,0 @@ ---- -designs: - - manufacturers: - - name: "Vendor" - device_types: - - "!create_or_update:model": "test model" - "!create_or_update:manufacturer__name": "Vendor" - device_roles: - - "name": "role" - sites: - - "name": "Site" - "status__name": "Active" - devices: - - "!create_or_update:name": "test device" - "!create_or_update:device_type__manufacturer__name": "Vendor" - "device_role__name": "role" - "site__name": "Site" - "status__name": "Active" -checks: - - equal: - - model: "nautobot.dcim.models.DeviceType" - query: {model: "test model"} - attribute: "manufacturer.name" - - value: "Vendor" - - equal: - - model: "nautobot.dcim.models.DeviceType" - query: {model: "test model"} - - model: "nautobot.dcim.models.Device" - query: {name: "test device"} - attribute: "device_type" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/create_tags.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/create_tags.yaml deleted file mode 100644 index 2312d64d..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/create_tags.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -designs: - - tags: - - name: "Test Tag" - slug: "test_tag" - description: "Some Description" -checks: - - model_exists: - model: "nautobot.extras.models.Tag" - query: {name: "Test Tag"} diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_label.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_label.yaml deleted file mode 100644 index 34c1d209..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_label.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.LookupExtension" -designs: - - relationships: - - name: "Device to VLANS" - slug: "device-to-vlans" - type: "many-to-many" - "!lookup:source_type": - app_label: "dcim" - model: "device" - "!lookup:destination_type": - app_label: "ipam" - model: "vlan" - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - vlans: - - "!create_or_update:vid": 42 - name: "The Answer" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - vlans: - - "!get:vid": 42 - - vid: "43" - name: "Better Answer" - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.VLAN" - query: {vid: "43"} - - - equal: - - model: "nautobot.extras.models.RelationshipAssociation" - query: {relationship__name: "Device to VLANS"} - attribute: "destination" - - model: "nautobot.ipam.models.VLAN" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_slug.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_slug.yaml deleted file mode 100644 index fae287b7..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/custom_relationship_by_slug.yaml +++ /dev/null @@ -1,55 +0,0 @@ ---- -extensions: - - "nautobot_design_builder.contrib.ext.LookupExtension" -designs: - - relationships: - - name: "Device to VLANS" - slug: "device-to-vlans" - type: "many-to-many" - "!lookup:source_type": - app_label: "dcim" - model: "device" - "!lookup:destination_type": - app_label: "ipam" - model: "vlan" - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - vlans: - - "!create_or_update:vid": 42 - name: "The Answer" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - device-to-vlans: - - "!get:vid": 42 - - vid: "43" - name: "Better Answer" - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.VLAN" - query: {vid: "43"} - - - equal: - - model: "nautobot.extras.models.RelationshipAssociation" - query: {relationship__name: "Device to VLANS"} - attribute: "destination" - - model: "nautobot.ipam.models.VLAN" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/device_primary_ip.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/device_primary_ip.yaml deleted file mode 100644 index d2beba83..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/device_primary_ip.yaml +++ /dev/null @@ -1,38 +0,0 @@ ---- -designs: - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - interfaces: - - name: "Ethernet1/1" - type: "virtual" - status__name: "Active" - description: "description for Ethernet1/1" - ip_addresses: - - address: "192.168.56.1/24" - status__name: "Active" - primary_ip4: {"!get:address": "192.168.56.1/24", "deferred": true} -checks: - - equal: - - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} - attribute: "primary_ip4.address.__str__" - - value: "192.168.56.1/24" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/git_repo.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/git_repo.yaml deleted file mode 100644 index 4ad8cbf2..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/git_repo.yaml +++ /dev/null @@ -1,14 +0,0 @@ ---- -designs: - - git_repositories: - - model_metadata: - save_args: - trigger_resync: false - name: "backups" - remote_url: "https://github.com/nautobot/demo-gc-backups" - branch: "main" - -checks: - - model_exists: - model: "nautobot.extras.models.GitRepository" - query: {name: "backups"} diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/interface_addresses.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/interface_addresses.yaml deleted file mode 100644 index b2ca3fe2..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/interface_addresses.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -designs: - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - interfaces: - - name: "Ethernet1/1" - type: "virtual" - status__name: "Active" - description: "description for Ethernet1/1" - ip_addresses: - - address: "192.168.56.1/24" - status__name: "Active" -checks: - - model_exists: - model: "nautobot.ipam.models.IPAddress" - query: {address: "192.168.56.1/24"} - - equal: - - model: "nautobot.dcim.models.Interface" - query: {name: "Ethernet1/1"} - - model: "nautobot.ipam.models.IPAddress" - query: {address: "192.168.56.1/24"} - attribute: "interface" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/nested_create.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/nested_create.yaml deleted file mode 100644 index fde23df6..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/nested_create.yaml +++ /dev/null @@ -1,41 +0,0 @@ ---- -designs: - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - interfaces: - - name: "Ethernet1/1" - type: "virtual" - status__name: "Active" - description: "description for Ethernet1/1" -checks: - - equal: - - model: "nautobot.dcim.models.Interface" - query: {name: "Ethernet1/1"} - attribute: "device" - - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} - - equal: - - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} - attribute: "site" - - model: "nautobot.dcim.models.Site" - query: {name: "site_1"} diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/nested_update.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/nested_update.yaml deleted file mode 100644 index dd4a58ab..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/nested_update.yaml +++ /dev/null @@ -1,47 +0,0 @@ ---- -designs: - # Design 1 - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "model name" - u_height: 1 - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "model name" - device_role__name: "device role" - interfaces: - - name: "Ethernet1/1" - type: "virtual" - status__name: "Active" - description: "description for Ethernet1/1" - # Design 2 - - devices: - - "!update:name": "device_1" - interfaces: - - "!update:name": "Ethernet1/1" - description: "new description for Ethernet1/1" -checks: - - equal: - - model: "nautobot.dcim.models.Interface" - query: {name: "Ethernet1/1"} - attribute: "device" - - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} - - equal: - - model: "nautobot.dcim.models.Interface" - query: {name: "Ethernet1/1"} - attribute: "description" - - value: "new description for Ethernet1/1" diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/one_to_one.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/one_to_one.yaml deleted file mode 100644 index c6c599d6..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/one_to_one.yaml +++ /dev/null @@ -1,50 +0,0 @@ ---- -designs: - - manufacturers: - - name: "manufacturer1" - - device_types: - - manufacturer__name: "manufacturer1" - model: "chassis" - u_height: 1 - subdevice_role: "parent" - - - manufacturer__name: "manufacturer1" - model: "card" - u_height: 0 - subdevice_role: "child" - - device_roles: - - name: "device role" - - sites: - - name: "site_1" - status__name: "Active" - - devices: - - name: "device_1" - site__name: "site_1" - status__name: "Active" - device_type__model: "chassis" - device_role__name: "device role" - devicebays: - - name: "Bay 1" - installed_device: - name: "device_2" - site__name: "site_1" - status__name: "Active" - device_type__model: "card" - device_role__name: "device role" -checks: - - model_exists: - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} - - model_exists: - model: "nautobot.dcim.models.Device" - query: {name: "device_2"} - - equal: - - model: "nautobot.dcim.models.Device" - query: {name: "device_2"} - attribute: "parent_bay.device" - - model: "nautobot.dcim.models.Device" - query: {name: "device_1"} diff --git a/nautobot_design_builder/tests/testdata/nautobot_v1/prefixes.yaml b/nautobot_design_builder/tests/testdata/nautobot_v1/prefixes.yaml deleted file mode 100644 index 58d241d6..00000000 --- a/nautobot_design_builder/tests/testdata/nautobot_v1/prefixes.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -designs: - - sites: - - name: "site_1" - status__name: "Active" - - prefixes: - - site__name: "site_1" - status__name: "Active" - prefix: "192.168.0.0/24" - - "!create_or_update:site__name": "site_1" - "!create_or_update:prefix": "192.168.56.0/24" - status__name: "Active" - -checks: - - equal: - - model: "nautobot.ipam.models.Prefix" - query: {site__name: "site_1"} - attribute: "__str__" - - value: ["192.168.0.0/24", "192.168.56.0/24"] diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/nested_create.yaml b/nautobot_design_builder/tests/testdata/nested_create.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/nested_create.yaml rename to nautobot_design_builder/tests/testdata/nested_create.yaml diff --git a/nautobot_design_builder/tests/testdata/nautobot_v2/prefixes.yaml b/nautobot_design_builder/tests/testdata/prefixes.yaml similarity index 100% rename from nautobot_design_builder/tests/testdata/nautobot_v2/prefixes.yaml rename to nautobot_design_builder/tests/testdata/prefixes.yaml diff --git a/nautobot_design_builder/util.py b/nautobot_design_builder/util.py index 21407aff..a734ff5f 100644 --- a/nautobot_design_builder/util.py +++ b/nautobot_design_builder/util.py @@ -15,9 +15,11 @@ import yaml from django.conf import settings + import nautobot -from nautobot.extras.models import GitRepository +from nautobot.apps.jobs import register_jobs +from nautobot.extras.models import GitRepository from nautobot_design_builder import metadata @@ -295,13 +297,7 @@ def load_jobs(module_name=None): frame.f_globals[class_name] = new_cls frame.f_globals["jobs"].append(new_cls) - if nautobot_version >= "2": - try: - from nautobot.apps.jobs import register_jobs # pylint:disable=import-outside-toplevel - - register_jobs(*frame.f_globals["jobs"]) - except ImportError: - pass + register_jobs(*frame.f_globals["jobs"]) def get_design_class(path: str, module_name: str, class_name: str) -> Type["DesignJob"]: diff --git a/poetry.lock b/poetry.lock index 16e61f0e..144bfe78 100755 --- a/poetry.lock +++ b/poetry.lock @@ -38,13 +38,13 @@ files = [ [[package]] name = "asgiref" -version = "3.8.0" +version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" files = [ - {file = "asgiref-3.8.0-py3-none-any.whl", hash = "sha256:30fc07797ad71a0abb8fe34aa03c8043308a8389abc7942d797ea9911540bc28"}, - {file = "asgiref-3.8.0.tar.gz", hash = "sha256:ec75d9d0f04e2dbfedef1f20ee73a6594af80c333df47cdd31f37e6701f7c53a"}, + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] [package.dependencies] @@ -145,23 +145,6 @@ files = [ pycodestyle = ">=2.11.0" tomli = {version = "*", markers = "python_version < \"3.11\""} -[[package]] -name = "babel" -version = "2.14.0" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.7" -files = [ - {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" @@ -228,27 +211,6 @@ test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -description = "Screen-scraping library" -optional = false -python-versions = ">=3.6.0" -files = [ - {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, - {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, -] - -[package.dependencies] -soupsieve = ">1.2" - -[package.extras] -cchardet = ["cchardet"] -chardet = ["chardet"] -charset-normalizer = ["charset-normalizer"] -html5lib = ["html5lib"] -lxml = ["lxml"] - [[package]] name = "billiard" version = "4.2.0" @@ -262,33 +224,33 @@ files = [ [[package]] name = "black" -version = "24.3.0" +version = "24.4.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, - {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, - {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, - {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, - {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, - {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, - {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, - {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, - {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, - {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, - {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, - {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, - {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, - {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, - {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, - {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, - {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, - {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, - {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, - {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, - {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, - {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, + {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, + {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, + {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, + {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, + {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, + {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, + {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, + {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, + {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, + {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, + {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, + {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, + {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, + {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, + {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, + {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, + {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, + {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, + {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, + {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, + {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, + {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, ] [package.dependencies] @@ -552,13 +514,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[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] @@ -742,17 +704,6 @@ ssh = ["bcrypt (>=3.1.5)"] test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] -[[package]] -name = "cssselect" -version = "1.2.0" -description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" -optional = false -python-versions = ">=3.7" -files = [ - {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, - {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, -] - [[package]] name = "decorator" version = "5.1.1" @@ -823,37 +774,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" @@ -875,16 +826,17 @@ 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]] @@ -932,13 +884,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] @@ -946,13 +898,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] @@ -964,28 +916,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] @@ -1010,13 +962,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] @@ -1045,13 +997,13 @@ 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] @@ -1092,13 +1044,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] @@ -1127,18 +1079,18 @@ 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 = "drf-react-template-framework" @@ -1156,13 +1108,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] @@ -1180,13 +1132,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.3.4" +version = "2024.4.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-2024.3.4.tar.gz", hash = "sha256:101449802421606a2de8be0e27c52e5e7bae14a6d99e1a7ab27eddb659fb8676"}, - {file = "drf_spectacular_sidecar-2024.3.4-py3-none-any.whl", hash = "sha256:71db685ab4fae50f33261c86f5cfd1ae9b3cca72bc0426ed91868121d041be24"}, + {file = "drf-spectacular-sidecar-2024.4.1.tar.gz", hash = "sha256:68532dd094714f79c1775c00848f22c10f004826abc856442ff30c3bc9c40bb4"}, + {file = "drf_spectacular_sidecar-2024.4.1-py3-none-any.whl", hash = "sha256:8359befe69a8953fea86be01c1ff37038854a62546225551de16c47c07dccd4e"}, ] [package.dependencies] @@ -1194,13 +1146,13 @@ Django = ">=2.2" [[package]] name = "emoji" -version = "2.8.0" +version = "2.11.0" 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.0-py2.py3-none-any.whl", hash = "sha256:63fc9107f06c6c2e48e5078ce9575cef98518f5ac09474f6148a43e989989582"}, + {file = "emoji-2.11.0.tar.gz", hash = "sha256:772eaa30f4e0b1ce95148a092df4c7dc97644532c03225326b0fd05e8a9f72a3"}, ] [package.extras] @@ -1269,20 +1221,21 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.42" +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.42-py3-none-any.whl", hash = "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd"}, - {file = "GitPython-3.1.42.tar.gz", hash = "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb"}, + {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"] +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" @@ -1389,13 +1342,13 @@ six = ">=1.12" [[package]] name = "griffe" -version = "0.42.1" +version = "0.42.2" 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.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, - {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, + {file = "griffe-0.42.2-py3-none-any.whl", hash = "sha256:bf9a09d7e9dcc3aca6a2c7ab4f63368c19e882f58c816fbd159bea613daddde3"}, + {file = "griffe-0.42.2.tar.gz", hash = "sha256:d5547b7a1a0786f84042379a5da8bd97c11d0464d4de3d7510328ebce5fda772"}, ] [package.dependencies] @@ -1404,24 +1357,24 @@ colorama = ">=0.4" [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] name = "importlib-metadata" -version = "7.0.2" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.2-py3-none-any.whl", hash = "sha256:f4bc4c0c070c490abf4ce96d715f68e95923320370efb66143df00199bb6c100"}, - {file = "importlib_metadata-7.0.2.tar.gz", hash = "sha256:198f568f3230878cb1b44fbd7975f87906c22336dba2e4a7f05278c281fbd792"}, + {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] @@ -1430,17 +1383,17 @@ zipp = ">=0.5" [package.extras] 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-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] +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 = "6.3.2" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.3.2-py3-none-any.whl", hash = "sha256:f41f4098b16cd140a97d256137cfd943d958219007990b2afb00439fc623f580"}, - {file = "importlib_resources-6.3.2.tar.gz", hash = "sha256:963eb79649252b0160c1afcfe5a1d3fe3ad66edd0a8b114beacffb70c0674223"}, + {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] @@ -1448,7 +1401,7 @@ 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 (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.collections", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] +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 = "inflection" @@ -1563,13 +1516,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "4.18.6" +version = "4.21.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.6-py3-none-any.whl", hash = "sha256:dc274409c36175aad949c68e5ead0853aaffbe8e88c830ae66bb3c7a1728ad2d"}, - {file = "jsonschema-4.18.6.tar.gz", hash = "sha256:ce71d2f8c7983ef75a756e568317bf54bc531dc3ad7e66a128eae0d51623d8a3"}, + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, ] [package.dependencies] @@ -1601,13 +1554,13 @@ referencing = ">=0.31.0" [[package]] name = "kombu" -version = "5.3.5" +version = "5.3.7" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, - {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, + {file = "kombu-5.3.7-py3-none-any.whl", hash = "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9"}, + {file = "kombu-5.3.7.tar.gz", hash = "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf"}, ] [package.dependencies] @@ -1626,121 +1579,29 @@ mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack"] pyro = ["pyro4"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +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 = "lxml" -version = "5.1.0" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -optional = false -python-versions = ">=3.6" -files = [ - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da"}, - {file = "lxml-5.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c"}, - {file = "lxml-5.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05"}, - {file = "lxml-5.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147"}, - {file = "lxml-5.1.0-cp310-cp310-win32.whl", hash = "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93"}, - {file = "lxml-5.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4"}, - {file = "lxml-5.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e"}, - {file = "lxml-5.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2"}, - {file = "lxml-5.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204"}, - {file = "lxml-5.1.0-cp311-cp311-win32.whl", hash = "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b"}, - {file = "lxml-5.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8"}, - {file = "lxml-5.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431"}, - {file = "lxml-5.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3"}, - {file = "lxml-5.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8"}, - {file = "lxml-5.1.0-cp312-cp312-win32.whl", hash = "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01"}, - {file = "lxml-5.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623"}, - {file = "lxml-5.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d"}, - {file = "lxml-5.1.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7"}, - {file = "lxml-5.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67"}, - {file = "lxml-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd"}, - {file = "lxml-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7"}, - {file = "lxml-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936"}, - {file = "lxml-5.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6"}, - {file = "lxml-5.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764"}, - {file = "lxml-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8"}, - {file = "lxml-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1"}, - {file = "lxml-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa"}, - {file = "lxml-5.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1"}, - {file = "lxml-5.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e"}, - {file = "lxml-5.1.0-cp38-cp38-win32.whl", hash = "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a"}, - {file = "lxml-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969"}, - {file = "lxml-5.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912"}, - {file = "lxml-5.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14"}, - {file = "lxml-5.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890"}, - {file = "lxml-5.1.0-cp39-cp39-win32.whl", hash = "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e"}, - {file = "lxml-5.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa"}, - {file = "lxml-5.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea"}, - {file = "lxml-5.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897"}, - {file = "lxml-5.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f"}, - {file = "lxml-5.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f"}, - {file = "lxml-5.1.0.tar.gz", hash = "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca"}, -] - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.7)"] - [[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]] @@ -1767,22 +1628,6 @@ profiling = ["gprof2dot"] rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] -[[package]] -name = "markdown2" -version = "2.4.13" -description = "A fast and complete Python implementation of Markdown" -optional = false -python-versions = ">=3.5, <4" -files = [ - {file = "markdown2-2.4.13-py2.py3-none-any.whl", hash = "sha256:855bde5cbcceb9beda7c80efdf7f406c23e6079172c497fcfce22fdce998e892"}, - {file = "markdown2-2.4.13.tar.gz", hash = "sha256:18ceb56590da77f2c22382e55be48c15b3c8f0c71d6398def387275e6c347a9f"}, -] - -[package.extras] -all = ["pygments (>=2.7.3)", "wavedrom"] -code-syntax-highlighting = ["pygments (>=2.7.3)"] -wavedrom = ["wavedrom"] - [[package]] name = "markupsafe" version = "2.1.5" @@ -1854,13 +1699,13 @@ files = [ [[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] @@ -1948,27 +1793,23 @@ mkdocs = ">=1.1" [[package]] name = "mkdocs-material" -version = "9.2.4" +version = "9.1.15" description = "Documentation that simply works" optional = false python-versions = ">=3.7" files = [ - {file = "mkdocs_material-9.2.4-py3-none-any.whl", hash = "sha256:2df876367625ff5e0f7112bc19a57521ed21ce9a2b85656baf9bb7f5dc3cb987"}, - {file = "mkdocs_material-9.2.4.tar.gz", hash = "sha256:25008187b89fc376cb4ed2312b1fea4121bf2bd956442f38afdc6b4dcc21c57d"}, + {file = "mkdocs_material-9.1.15-py3-none-any.whl", hash = "sha256:b49e12869ab464558e2dd3c5792da5b748a7e0c48ee83b4d05715f98125a7a39"}, + {file = "mkdocs_material-9.1.15.tar.gz", hash = "sha256:8513ab847c9a541ed3d11a3a7eed556caf72991ee786c31c5aac6691a121088a"}, ] [package.dependencies] -babel = ">=2.10.3" colorama = ">=0.4" jinja2 = ">=3.0" -lxml = ">=4.6" markdown = ">=3.2" -mkdocs = ">=1.5.2" +mkdocs = ">=1.4.2" mkdocs-material-extensions = ">=1.1" -paginate = ">=0.5.6" pygments = ">=2.14" pymdown-extensions = ">=9.9.1" -readtime = ">=2.0" regex = ">=2022.4.24" requests = ">=2.26" @@ -2048,73 +1889,73 @@ files = [ [[package]] name = "nautobot" -version = "2.1.8" +version = "2.2.1" 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.8-py3-none-any.whl", hash = "sha256:9093828673623de39401bb5a6767dca782481de83f17c7f490908dcc2621a369"}, - {file = "nautobot-2.1.8.tar.gz", hash = "sha256:829a097bf7993250403c3776c8f4cde2d3ffee24f0fdf625e84c354ee4d7fb4c"}, + {file = "nautobot-2.2.1-py3-none-any.whl", hash = "sha256:c65bfa5ef5abc32d70f7dbea0f821f8f865ede0135cb36398029c4b96ed42875"}, + {file = "nautobot-2.2.1.tar.gz", hash = "sha256:bbf9f6cffe0f4aa064b5e0a470028c8bffe6be0605dba49be70a849a2ed47d57"}, ] [package.dependencies] celery = ">=5.3.1,<5.4.0" -Django = ">=3.2.24,<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-redis = ">=5.4.0,<5.5.0" django-silk = ">=5.1.0,<5.2.0" -django-tables2 = ">=2.6.0,<2.7.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.41,<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.3,<3.2.0" -jsonschema = ">=4.7.0,<4.19.0" -Markdown = ">=3.3.7,<3.4.0" +jsonschema = ">=4.7.0,<5.0.0" +Markdown = ">=3.5.2,<3.6.0" MarkupSafe = ">=2.1.5,<2.2.0" -netaddr = ">=0.8.0,<0.9.0" +netaddr = ">=0.10.1,<0.11.0" netutils = ">=1.6.0,<2.0.0" nh3 = ">=0.2.15,<0.3.0" packaging = ">=23.1" -Pillow = ">=10.2.0,<10.3.0" -prometheus-client = ">=0.17.1,<0.18.0" +Pillow = ">=10.3.0,<10.4.0" +prometheus-client = ">=0.20.0,<0.21.0" psycopg2-binary = ">=2.9.9,<2.10.0" python-slugify = ">=8.0.3,<8.1.0" pyuwsgi = ">=2.0.23,<2.1.0" PyYAML = ">=6.0,<6.1" -social-auth-app-django = ">=5.2.0,<5.3.0" +social-auth-app-django = ">=5.4.0,<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.3,<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)"] +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[openidconnect,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[openidconnect,saml] (>=4.5.3,<4.6.0)"] [[package]] name = "nautobot-bgp-models" version = "2.0.0" description = "Nautobot BGP Models App" -optional = true +optional = false python-versions = ">=3.8,<3.12" files = [ {file = "nautobot_bgp_models-2.0.0-py3-none-any.whl", hash = "sha256:2d8ac457a29ec6cf0d7bf99320ddddb8f0232302e5d09b044e5708b9c6824c8c"}, @@ -2127,24 +1968,24 @@ toml = ">=0.10.2,<0.11.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.7.0" +version = "1.8.0" 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.7.0-py3-none-any.whl", hash = "sha256:ad2e65d2e5bb7cf857faeee96f03b8823782c509cb003f2e4e86cccf5b0a3328"}, - {file = "netutils-1.7.0.tar.gz", hash = "sha256:e0f461092e02c03166a6830706377dfe079b661ad9e41940f265424121621dc8"}, + {file = "netutils-1.8.0-py3-none-any.whl", hash = "sha256:5e705793528d8e771edae6648b15c9f9a7c3cfc9c749299f6ff4a35454545858"}, + {file = "netutils-1.8.0.tar.gz", hash = "sha256:d5e0205c2e8f095314cf755f4dbda956db42a97502501824c6c4764726eda93f"}, ] [package.extras] @@ -2152,27 +1993,27 @@ optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"] [[package]] name = "nh3" -version = "0.2.15" +version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." optional = false python-versions = "*" files = [ - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:9c0d415f6b7f2338f93035bba5c0d8c1b464e538bfbb1d598acd47d7969284f0"}, - {file = "nh3-0.2.15-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6f42f99f0cf6312e470b6c09e04da31f9abaadcd3eb591d7d1a88ea931dca7f3"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac19c0d68cd42ecd7ead91a3a032fdfff23d29302dbb1311e641a130dfefba97"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0d77272ce6d34db6c87b4f894f037d55183d9518f948bba236fe81e2bb4e28"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8d595df02413aa38586c24811237e95937ef18304e108b7e92c890a06793e3bf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86e447a63ca0b16318deb62498db4f76fc60699ce0a1231262880b38b6cff911"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3277481293b868b2715907310c7be0f1b9d10491d5adf9fce11756a97e97eddf"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60684857cfa8fdbb74daa867e5cad3f0c9789415aba660614fe16cd66cbb9ec7"}, - {file = "nh3-0.2.15-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b803a5875e7234907f7d64777dfde2b93db992376f3d6d7af7f3bc347deb305"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0d02d0ff79dfd8208ed25a39c12cbda092388fff7f1662466e27d97ad011b770"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f3b53ba93bb7725acab1e030bc2ecd012a817040fd7851b332f86e2f9bb98dc6"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:b1e97221cedaf15a54f5243f2c5894bb12ca951ae4ddfd02a9d4ea9df9e1a29d"}, - {file = "nh3-0.2.15-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5167a6403d19c515217b6bcaaa9be420974a6ac30e0da9e84d4fc67a5d474c5"}, - {file = "nh3-0.2.15-cp37-abi3-win32.whl", hash = "sha256:427fecbb1031db085eaac9931362adf4a796428ef0163070c484b5a768e71601"}, - {file = "nh3-0.2.15-cp37-abi3-win_amd64.whl", hash = "sha256:bc2d086fb540d0fa52ce35afaded4ea526b8fc4d3339f783db55c95de40ef02e"}, - {file = "nh3-0.2.15.tar.gz", hash = "sha256:d1e30ff2d8d58fb2a14961f7aac1bbb1c51f9bdd7da727be35c63826060b0bf3"}, + {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]] @@ -2202,30 +2043,20 @@ files = [ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] -[[package]] -name = "paginate" -version = "0.5.6" -description = "Divides large result sets into pages for easier browsing" -optional = false -python-versions = "*" -files = [ - {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, -] - [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" @@ -2276,79 +2107,80 @@ files = [ [[package]] name = "pillow" -version = "10.2.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {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] @@ -2387,13 +2219,13 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- [[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] @@ -2545,13 +2377,13 @@ files = [ [[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]] @@ -2694,40 +2526,22 @@ pylint = ">=1.7" [[package]] name = "pymdown-extensions" -version = "10.4" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.4-py3-none-any.whl", hash = "sha256:cfc28d6a09d19448bcbf8eee3ce098c7d17ff99f7bd3069db4819af181212037"}, - {file = "pymdown_extensions-10.4.tar.gz", hash = "sha256:bc46f11749ecd4d6b71cf62396104b4a200bad3498cb0f5dad1b8502fe461a35"}, + {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] extra = ["pygments (>=2.12)"] -[[package]] -name = "pyquery" -version = "2.0.0" -description = "A jquery-like library for python" -optional = false -python-versions = "*" -files = [ - {file = "pyquery-2.0.0-py3-none-any.whl", hash = "sha256:8dfc9b4b7c5f877d619bbae74b1898d5743f6ca248cfd5d72b504dd614da312f"}, - {file = "pyquery-2.0.0.tar.gz", hash = "sha256:963e8d4e90262ff6d8dec072ea97285dc374a2f69cad7776f4082abcf6a1d8ae"}, -] - -[package.dependencies] -cssselect = ">=1.2.0" -lxml = ">=2.1" - -[package.extras] -test = ["pytest", "pytest-cov", "requests", "webob", "webtest"] - [[package]] name = "python-crontab" version = "3.0.0" @@ -2921,21 +2735,6 @@ files = [ [package.dependencies] pyyaml = "*" -[[package]] -name = "readtime" -version = "3.0.0" -description = "Calculates the time some text takes the average human to read, based on Medium's read time forumula" -optional = false -python-versions = "*" -files = [ - {file = "readtime-3.0.0.tar.gz", hash = "sha256:76c5a0d773ad49858c53b42ba3a942f62fbe20cc8c6f07875797ac7dc30963a9"}, -] - -[package.dependencies] -beautifulsoup4 = ">=4.0.1" -markdown2 = ">=2.4.3" -pyquery = ">=1.2" - [[package]] name = "redis" version = "5.0.3" @@ -3094,13 +2893,13 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.4.0" +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.4.0.tar.gz", hash = "sha256:acee623221e4a39abcbb919312c8ff04bd44e7e417087fb4bd5e2a2f53d5e79a"}, - {file = "requests_oauthlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:7a3130d94a17520169e38db6c8d75f2c974643788465ecc2e4b36d288bf13033"}, + {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] @@ -3311,13 +3110,13 @@ files = [ [[package]] name = "social-auth-app-django" -version = "5.2.0" +version = "5.4.0" 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.0.tar.gz", hash = "sha256:09ac02a063cb313eed5e9ef2f9ac4477c8bf5bbd685925ff3aba43f9072f1bbb"}, + {file = "social_auth_app_django-5.4.0-py3-none-any.whl", hash = "sha256:28c65b2e2092f30cdb3cf912eeaa6988b49fdf4001b29bd89e683673d700a38e"}, ] [package.dependencies] @@ -3350,32 +3149,20 @@ allpy3 = ["cryptography (>=2.1.1)", "python3-saml (>=1.5.0)"] azuread = ["cryptography (>=2.1.1)"] saml = ["python3-saml (>=1.5.0)"] -[[package]] -name = "soupsieve" -version = "2.5" -description = "A modern CSS selector implementation for Beautiful Soup." -optional = false -python-versions = ">=3.8" -files = [ - {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, - {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, -] - [[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" @@ -3502,13 +3289,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "typing-extensions" -version = "4.10.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.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, - {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, + {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]] @@ -3661,10 +3448,10 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link 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] -contrib = ["nautobot-bgp-models"] +contrib = [] nautobot = ["nautobot"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "f221112594c84ef336762b16c082670c480e859655dbf2a818cb77188f124ce3" +content-hash = "23f29417943db78276c4a96eaa6f143f62e52e798e86686bff675fd413d51b42" diff --git a/pyproject.toml b/pyproject.toml index 9e7ab5a8..830f40f6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nautobot-design-builder" -version = "1.1.0" +version = "2.0.0" description = "Nautobot app that uses design templates to easily create data objects in Nautobot with minimal input from a user." authors = ["Network to Code, LLC "] license = "Apache-2.0" @@ -28,8 +28,7 @@ packages = [ [tool.poetry.dependencies] python = ">=3.8.1,<3.12" # Used for local development -nautobot = ">=1.6.0,<=2.9999" -nautobot-bgp-models = { version = "*", optional = true } +nautobot = ">=2.0.3,<=2.9999" [tool.poetry.group.dev.dependencies] bandit = "*" @@ -39,6 +38,7 @@ django-debug-toolbar = "*" flake8 = "*" invoke = "*" ipython = "*" +nautobot-bgp-models = "*" pydocstyle = "*" pylint = "*" pylint-django = "*" @@ -50,7 +50,7 @@ Markdown = "*" # Rendering docs to HTML mkdocs = "1.5.2" # Material for MkDocs theme -mkdocs-material = "9.2.4" +mkdocs-material = "9.1.15" # Render custom markdown for version added/changed/remove notes mkdocs-version-annotations = "1.0.0" # Automatic documentation from sources, for MkDocs diff --git a/tasks.py b/tasks.py index 9c10bdfe..569b9117 100644 --- a/tasks.py +++ b/tasks.py @@ -46,7 +46,7 @@ def is_truthy(arg): namespace.configure( { "nautobot_design_builder": { - "nautobot_ver": "1.6.0", + "nautobot_ver": "2.2", "project_name": "nautobot-design-builder", "python_ver": "3.11", "local": False, From 2de0cd79eaf9667add2afb4e198576f85927bcba Mon Sep 17 00:00:00 2001 From: Andrew Bates Date: Tue, 30 Apr 2024 16:02:32 -0400 Subject: [PATCH 2/5] refactor: The `version` attribute is not necessary for compose V2 Compose v2 removed the need for the `version` attribute and now actually raises a warning if encountered. --- development/docker-compose.base.yml | 1 - development/docker-compose.dev.yml | 1 - development/docker-compose.mysql.yml | 2 -- development/docker-compose.postgres.yml | 2 -- development/docker-compose.redis.yml | 1 - development/docker-compose.test-designs.yml | 1 - poetry.lock | 3 +-- pyproject.toml | 1 - 8 files changed, 1 insertion(+), 11 deletions(-) diff --git a/development/docker-compose.base.yml b/development/docker-compose.base.yml index ff38d9c6..d2988c76 100644 --- a/development/docker-compose.base.yml +++ b/development/docker-compose.base.yml @@ -13,7 +13,6 @@ x-nautobot-base: &nautobot-base - "creds.env" tty: true -version: "3.8" services: nautobot: depends_on: diff --git a/development/docker-compose.dev.yml b/development/docker-compose.dev.yml index 2201007b..dcfcfa7f 100644 --- a/development/docker-compose.dev.yml +++ b/development/docker-compose.dev.yml @@ -3,7 +3,6 @@ # any override will need to include these volumes to use them. # see: https://github.com/docker/compose/issues/3729 --- -version: "3.8" services: nautobot: command: "nautobot-server runserver 0.0.0.0:8080" diff --git a/development/docker-compose.mysql.yml b/development/docker-compose.mysql.yml index dc2641a2..c8e702fb 100644 --- a/development/docker-compose.mysql.yml +++ b/development/docker-compose.mysql.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: diff --git a/development/docker-compose.postgres.yml b/development/docker-compose.postgres.yml index 12d1de31..8d96fdba 100644 --- a/development/docker-compose.postgres.yml +++ b/development/docker-compose.postgres.yml @@ -1,6 +1,4 @@ --- -version: "3.8" - services: nautobot: environment: diff --git a/development/docker-compose.redis.yml b/development/docker-compose.redis.yml index 6da9fa01..b5e266a3 100644 --- a/development/docker-compose.redis.yml +++ b/development/docker-compose.redis.yml @@ -1,5 +1,4 @@ --- -version: "3.8" services: redis: image: "redis:6-alpine" diff --git a/development/docker-compose.test-designs.yml b/development/docker-compose.test-designs.yml index af1dd803..055672ab 100644 --- a/development/docker-compose.test-designs.yml +++ b/development/docker-compose.test-designs.yml @@ -1,5 +1,4 @@ --- -version: "3.8" services: nautobot: volumes: diff --git a/poetry.lock b/poetry.lock index 144bfe78..752b7b76 100755 --- a/poetry.lock +++ b/poetry.lock @@ -3448,10 +3448,9 @@ docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.link 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] -contrib = [] nautobot = ["nautobot"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<3.12" -content-hash = "23f29417943db78276c4a96eaa6f143f62e52e798e86686bff675fd413d51b42" +content-hash = "e5341722f9f0ffce4389c51a6cf88f4222d83e43312dc1560597c7de8fd36edd" diff --git a/pyproject.toml b/pyproject.toml index 830f40f6..e58ed965 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,7 +61,6 @@ snakeviz = "^2.2.0" [tool.poetry.extras] nautobot = ["nautobot"] -contrib = ["nautobot-bgp-models"] [tool.black] line-length = 120 From f3de3ff9a4076e9410a0fbb01080e1642d8e18e3 Mon Sep 17 00:00:00 2001 From: Andrew Bates Date: Tue, 30 Apr 2024 16:58:56 -0400 Subject: [PATCH 3/5] chore: Cleanup --- nautobot_design_builder/design_job.py | 12 +++++------- nautobot_design_builder/tests/test_design_job.py | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/nautobot_design_builder/design_job.py b/nautobot_design_builder/design_job.py index 078d5f3f..03628437 100644 --- a/nautobot_design_builder/design_job.py +++ b/nautobot_design_builder/design_job.py @@ -42,6 +42,7 @@ def __init__(self, *args, **kwargs): # rendered designs self.environment: Environment = None self.designs = {} + self.rendered_design = None self.rendered = None super().__init__(*args, **kwargs) @@ -180,8 +181,7 @@ def _run_in_transaction(self, dryrun: bool, **data): # pylint: disable=too-many design_files = self.Meta.design_files else: self.log_failure(message="No design template specified for design.") - self.failed = True - return + raise DesignImplementationError("No design template specified for design.") sid = transaction.savepoint() @@ -191,12 +191,12 @@ def _run_in_transaction(self, dryrun: bool, **data): # pylint: disable=too-many if not dryrun: self.post_implementation(context, self.environment) if hasattr(self.Meta, "report"): - self.report = self.render_report(context, self.environment.journal) + report = self.render_report(context, self.environment.journal) output_filename: str = path.basename(getattr(self.Meta, "report")) if output_filename.endswith(".j2"): output_filename = output_filename[0:-3] - self.log_success(message=self.report) - self.save_design_file(output_filename, self.report) + self.log_success(message=report) + self.save_design_file(output_filename, report) else: transaction.savepoint_rollback(sid) self.log_info( @@ -206,11 +206,9 @@ def _run_in_transaction(self, dryrun: bool, **data): # pylint: disable=too-many transaction.savepoint_rollback(sid) self.log_failure(message="Failed to implement design") self.log_failure(message=str(ex)) - self.failed = True raise ex except Exception as ex: transaction.savepoint_rollback(sid) - self.failed = True raise ex def save_design_file(self, filename, content): diff --git a/nautobot_design_builder/tests/test_design_job.py b/nautobot_design_builder/tests/test_design_job.py index 7aa2c69c..8003b25c 100644 --- a/nautobot_design_builder/tests/test_design_job.py +++ b/nautobot_design_builder/tests/test_design_job.py @@ -37,8 +37,8 @@ def test_simple_design_rollback(self): def test_simple_design_report(self): job = self.get_mocked_job(test_designs.SimpleDesignReport) job.run(data={}, dryrun=False) - self.assertIn("simple_report.md", job.saved_files) - self.assertEqual("Report output", job.saved_files["simple_report.md"]) + self.assertIn("simple_report.md", job.saved_files) # pylint:disable=no-member + self.assertEqual("Report output", job.saved_files["simple_report.md"]) # pylint:disable=no-member def test_multiple_design_files(self): job = self.get_mocked_job(test_designs.MultiDesignJob) From 57e8b0737ddb5238af07341c9899b5dfb7ba716e Mon Sep 17 00:00:00 2001 From: Andrew Bates Date: Wed, 1 May 2024 07:50:42 -0400 Subject: [PATCH 4/5] ci: Updated Nautobot version for check migrations action --- .github/workflows/ci.yml | 5 +---- invoke.example.yml | 4 ++-- invoke.mysql.yml | 4 ++-- invoke.nautobot_2.yml | 4 ++-- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5307c09f..e1978f12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -138,7 +138,7 @@ jobs: fail-fast: true matrix: python-version: ["3.11"] - nautobot-version: ["2.1"] + nautobot-version: ["2.2"] env: INVOKE_NAUTOBOT_DESIGN_BUILDER_PYTHON_VER: "${{ matrix.python-version }}" INVOKE_NAUTOBOT_DESIGN_BUILDER_NAUTOBOT_VER: "${{ matrix.nautobot-version }}" @@ -179,9 +179,6 @@ jobs: db-backend: ["postgresql"] nautobot-version: ["stable"] include: - - python-version: "3.11" - db-backend: "postgresql" - nautobot-version: "1.6.0" - python-version: "3.11" db-backend: "mysql" nautobot-version: "stable" diff --git a/invoke.example.yml b/invoke.example.yml index 9132ee94..0616468f 100644 --- a/invoke.example.yml +++ b/invoke.example.yml @@ -1,9 +1,9 @@ --- nautobot_design_builder: project_name: "nautobot-design-builder" - nautobot_ver: "1.6.0" - local: false python_ver: "3.11" + nautobot_ver: "2.2" + local: false compose_dir: "development" compose_files: - "docker-compose.base.yml" diff --git a/invoke.mysql.yml b/invoke.mysql.yml index dd1881cc..1a06ad72 100644 --- a/invoke.mysql.yml +++ b/invoke.mysql.yml @@ -1,9 +1,9 @@ --- nautobot_design_builder: project_name: "nautobot-design-builder" - nautobot_ver: "1.6.0" - local: false python_ver: "3.11" + nautobot_ver: "2.2" + local: false compose_dir: "development" compose_files: - "docker-compose.base.yml" diff --git a/invoke.nautobot_2.yml b/invoke.nautobot_2.yml index da36a7ec..56b1d18e 100644 --- a/invoke.nautobot_2.yml +++ b/invoke.nautobot_2.yml @@ -1,8 +1,8 @@ --- nautobot_design_builder: project_name: "nautobot_design_builder_v2" - python_ver: "3.9" - nautobot_ver: "2.1" + python_ver: "3.11" + nautobot_ver: "2.2" compose_files: - "docker-compose.base.yml" - "docker-compose.redis.yml" From 173a84d8b55ace1ada2b784791e45efd7d1b51f6 Mon Sep 17 00:00:00 2001 From: Andrew Bates Date: Wed, 1 May 2024 11:14:47 -0400 Subject: [PATCH 5/5] ci: Updated mysql docker-compose to get CI to succeed --- development/docker-compose.mysql.yml | 2 -- invoke.nautobot_2.yml | 10 ---------- 2 files changed, 12 deletions(-) delete mode 100644 invoke.nautobot_2.yml diff --git a/development/docker-compose.mysql.yml b/development/docker-compose.mysql.yml index c8e702fb..83cbd477 100644 --- a/development/docker-compose.mysql.yml +++ b/development/docker-compose.mysql.yml @@ -23,8 +23,6 @@ services: - "development_mysql.env" db: image: "mysql:8" - command: - - "--default-authentication-plugin=mysql_native_password" env_file: - "development.env" - "creds.env" diff --git a/invoke.nautobot_2.yml b/invoke.nautobot_2.yml deleted file mode 100644 index 56b1d18e..00000000 --- a/invoke.nautobot_2.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -nautobot_design_builder: - project_name: "nautobot_design_builder_v2" - python_ver: "3.11" - nautobot_ver: "2.2" - compose_files: - - "docker-compose.base.yml" - - "docker-compose.redis.yml" - - "docker-compose.postgres.yml" - - "docker-compose.dev.yml"