From 2a86d16388862d9c797738e5b043c26caea1d078 Mon Sep 17 00:00:00 2001
From: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:18:55 -0500
Subject: [PATCH 01/21] seed version
---
pyproject.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pyproject.toml b/pyproject.toml
index b7e5492..3511323 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "nautobot-firewall-models"
-version = "2.1.0"
+version = "2.1.1b1"
description = "Nautobot app to model firewall objects."
authors = ["Network to Code, LLC "]
license = "Apache-2.0"
From 55513f24739c9878b55dbbc1ee0e31e70113828a Mon Sep 17 00:00:00 2001
From: Nautobot-Bot <79372327+nautobot-bot@users.noreply.github.com>
Date: Mon, 19 Aug 2024 14:14:25 -0400
Subject: [PATCH 02/21] Cookie updated by NetworkToCode Cookie Drift Manager
Tool (#264)
* Cookie updated by NetworkToCode Cookie Drift Manager Tool
Template:
```
{
"template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"dir": "nautobot-app",
"ref": "refs/tags/nautobot-app-v2.3.0",
"path": null
}
```
Cookie:
```
{
"remote": "https://github.com/nautobot/nautobot-app-firewall-models.git",
"path": "/tmp/tmpjesvwnzl/nautobot-app-firewall-models",
"repository_path": "/tmp/tmpjesvwnzl/nautobot-app-firewall-models",
"dir": "",
"branch_prefix": "drift-manager",
"context": {
"codeowner_github_usernames": "@whitej6 @itdependsnetworks @jdrew82",
"full_name": "Network to Code, LLC",
"email": "opensource@networktocode.com",
"github_org": "nautobot",
"app_name": "nautobot_firewall_models",
"verbose_name": "Nautobot Firewall Models",
"app_slug": "nautobot-firewall-models",
"project_slug": "nautobot-app-firewall-models",
"repo_url": "https://github.com/nautobot/nautobot-app-firewall-models",
"base_url": "firewall-models",
"min_nautobot_version": "2.0.0",
"max_nautobot_version": "2.9999",
"camel_name": "NautobotFirewallModels",
"project_short_description": "Nautobot App to model firewall and security objects. Allows users to model policies in a vendor-neutral manner and use that data to drive network security automation",
"model_class_name": "None",
"open_source_license": "Apache-2.0",
"docs_base_url": "https://docs.nautobot.com",
"docs_app_url": "https://docs.nautobot.com/projects/firewall-models/en/latest",
"_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"_output_dir": "/tmp/tmpjesvwnzl",
"_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app",
"_checkout": "refs/tags/nautobot-app-v2.3.0"
},
"base_branch": "develop",
"remote_name": "origin",
"pull_request_strategy": "PullRequestStrategy.CREATE",
"post_actions": [
"PostAction.BLACK"
],
"baked_commit_ref": "1724c1ae2e9ba5efe0dc010cb84291b6269b5fa5",
"draft": true
}
```
CLI Arguments:
```
{
"cookie_dir": "",
"input": false,
"json_filename": "",
"output_dir": "",
"push": true,
"template": "",
"template_dir": "",
"template_ref": "refs/tags/nautobot-app-v2.3.0",
"pull_request": null,
"post_action": [],
"disable_post_actions": false,
"draft": null
}
```
* Remove Bandit
* Ruff Fixes
* Update 264.housekeeping
Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
* Update test_capirca.py
Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
---------
Co-authored-by: bakebot
Co-authored-by: Stephen Kiely
Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
---
.bandit.yml | 6 -
.cookiecutter.json | 4 +-
.dockerignore | 1 -
.flake8 | 10 -
.github/workflows/ci.yml | 36 +--
README.md | 2 +-
changes/264.housekeeping | 1 +
development/app_config_schema.py | 1 +
development/docker-compose.base.yml | 1 -
development/docker-compose.dev.yml | 1 -
development/docker-compose.mysql.yml | 3 -
development/docker-compose.postgres.yml | 2 -
development/docker-compose.redis.yml | 1 -
development/nautobot_config.py | 8 +-
docs/assets/extra.css | 2 +-
docs/dev/contributing.md | 2 +-
docs/dev/dev_environment.md | 10 +-
docs/requirements.txt | 2 +-
mkdocs.yml | 3 +-
nautobot_firewall_models/__init__.py | 1 +
nautobot_firewall_models/api/serializers.py | 2 +-
nautobot_firewall_models/api/urls.py | 1 -
nautobot_firewall_models/choices.py | 1 -
nautobot_firewall_models/constants.py | 1 +
nautobot_firewall_models/fields.py | 1 -
nautobot_firewall_models/filters.py | 7 +-
nautobot_firewall_models/forms.py | 12 +-
nautobot_firewall_models/homepage.py | 3 +-
nautobot_firewall_models/jobs.py | 7 +-
.../migrations/0001_initial.py | 8 +-
.../migrations/0002_custom_status.py | 4 +-
.../migrations/0003_default_status.py | 3 +-
.../migrations/0005_capircapolicy.py | 5 +-
.../migrations/0006_renaming_part1.py | 5 +-
.../migrations/0007_renaming_part2.py | 1 +
.../migrations/0010_nat_policy.py | 8 +-
.../migrations/0013_applications.py | 8 +-
.../0015_alter_capircapolicy_device.py | 2 +-
.../migrations/0016_nautobot_v2_migrations.py | 3 +-
...018_resolve_issues_through_tables_part2.py | 1 -
.../migrations/0020_field_cleanups.py | 1 +
...021_alter_addressobject_status_and_more.py | 3 +-
nautobot_firewall_models/models/__init__.py | 4 +-
nautobot_firewall_models/models/address.py | 1 -
.../models/capirca_policy.py | 1 +
nautobot_firewall_models/models/nat_policy.py | 1 -
.../models/security_policy.py | 1 -
nautobot_firewall_models/models/service.py | 1 -
nautobot_firewall_models/models/user.py | 1 -
nautobot_firewall_models/models/zone.py | 1 -
nautobot_firewall_models/signals.py | 6 +-
nautobot_firewall_models/tables.py | 2 +-
nautobot_firewall_models/template_content.py | 1 +
.../templatetags/fw_tags.py | 1 +
nautobot_firewall_models/tests/fixtures.py | 7 +-
nautobot_firewall_models/tests/test_api.py | 13 +-
nautobot_firewall_models/tests/test_basic.py | 11 +-
.../tests/test_capirca.py | 6 +-
.../tests/test_filters.py | 2 +-
nautobot_firewall_models/tests/test_models.py | 3 +-
.../tests/test_ui_views.py | 5 +-
nautobot_firewall_models/utils/__init__.py | 6 +-
nautobot_firewall_models/utils/capirca.py | 10 +-
nautobot_firewall_models/validators.py | 1 +
nautobot_firewall_models/viewsets/__init__.py | 14 +-
nautobot_firewall_models/viewsets/address.py | 2 +-
.../viewsets/capirca_policy.py | 6 +-
.../viewsets/nat_policy.py | 11 +-
.../viewsets/security_policy.py | 11 +-
nautobot_firewall_models/viewsets/service.py | 2 +-
nautobot_firewall_models/viewsets/user.py | 2 +-
nautobot_firewall_models/viewsets/zone.py | 2 +-
poetry.lock | 273 ++++--------------
pyproject.toml | 45 +--
tasks.py | 117 ++++----
75 files changed, 261 insertions(+), 493 deletions(-)
delete mode 100644 .bandit.yml
delete mode 100644 .flake8
create mode 100644 changes/264.housekeeping
diff --git a/.bandit.yml b/.bandit.yml
deleted file mode 100644
index 56f7a83..0000000
--- a/.bandit.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-skips: []
-# No need to check for security issues in the test scripts!
-exclude_dirs:
- - "./tests/"
- - "./.venv/"
diff --git a/.cookiecutter.json b/.cookiecutter.json
index f70650b..e47427a 100644
--- a/.cookiecutter.json
+++ b/.cookiecutter.json
@@ -21,7 +21,7 @@
"_drift_manager": {
"template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"template_dir": "nautobot-app",
- "template_ref": "refs/tags/nautobot-app-v2.2.1",
+ "template_ref": "refs/tags/nautobot-app-v2.3.0",
"cookie_dir": "",
"branch_prefix": "drift-manager",
"pull_request_strategy": "create",
@@ -29,7 +29,7 @@
"black"
],
"draft": true,
- "baked_commit_ref": "1724c1ae2e9ba5efe0dc010cb84291b6269b5fa5"
+ "baked_commit_ref": "fcb62757ef4e78dd327cacb192ea19f1ac5344f8"
}
}
}
diff --git a/.dockerignore b/.dockerignore
index 2270f49..a0bf06f 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -19,7 +19,6 @@ FAQ.md
.git/
.gitignore
.github
-tasks.py
LICENSE
**/*.log
**/.vscode/
diff --git a/.flake8 b/.flake8
deleted file mode 100644
index c9f5e84..0000000
--- a/.flake8
+++ /dev/null
@@ -1,10 +0,0 @@
-[flake8]
-ignore =
- E501, # Line length is enforced by Black, so flake8 doesn't need to check it
- W503 # Black disagrees with this rule, as does PEP 8; Black wins
-exclude =
- migrations,
- __pycache__,
- manage.py,
- settings.py,
- .venv
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 34fe4aa..9ddb57c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -16,7 +16,7 @@ env:
APP_NAME: "nautobot-app-firewall-models"
jobs:
- black:
+ ruff-format:
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "True"
@@ -25,20 +25,9 @@ jobs:
uses: "actions/checkout@v4"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v6"
- - name: "Linting: black"
- run: "poetry run invoke black"
- bandit:
- runs-on: "ubuntu-22.04"
- env:
- INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "True"
- steps:
- - name: "Check out repository code"
- uses: "actions/checkout@v4"
- - name: "Setup environment"
- uses: "networktocode/gh-action-setup-poetry-environment@v6"
- - name: "Linting: bandit"
- run: "poetry run invoke bandit"
- ruff:
+ - name: "Linting: ruff format"
+ run: "poetry run invoke ruff --action format"
+ ruff-lint:
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "True"
@@ -60,17 +49,6 @@ jobs:
uses: "networktocode/gh-action-setup-poetry-environment@v6"
- name: "Check Docs Build"
run: "poetry run invoke build-and-check-docs"
- flake8:
- runs-on: "ubuntu-22.04"
- env:
- INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "True"
- steps:
- - name: "Check out repository code"
- uses: "actions/checkout@v4"
- - name: "Setup environment"
- uses: "networktocode/gh-action-setup-poetry-environment@v6"
- - name: "Linting: flake8"
- run: "poetry run invoke flake8"
poetry:
runs-on: "ubuntu-22.04"
env:
@@ -95,12 +73,10 @@ jobs:
run: "poetry run invoke yamllint"
check-in-docker:
needs:
- - "bandit"
- - "ruff"
- - "flake8"
+ - "ruff-format"
+ - "ruff-lint"
- "poetry"
- "yamllint"
- - "black"
runs-on: "ubuntu-22.04"
strategy:
fail-fast: true
diff --git a/README.md b/README.md
index 2614705..749b6bf 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
- An App for Nautobot.
+ An App for Nautobot.
## Overview
diff --git a/changes/264.housekeeping b/changes/264.housekeeping
new file mode 100644
index 0000000..f61c7c0
--- /dev/null
+++ b/changes/264.housekeeping
@@ -0,0 +1 @@
+Rebaked from the cookie `nautobot-app-v2.3.0`.
\ No newline at end of file
diff --git a/development/app_config_schema.py b/development/app_config_schema.py
index 4700995..a779b14 100644
--- a/development/app_config_schema.py
+++ b/development/app_config_schema.py
@@ -1,4 +1,5 @@
"""App Config Schema Generator and Validator."""
+
import json
from importlib import import_module
from os import getenv
diff --git a/development/docker-compose.base.yml b/development/docker-compose.base.yml
index 708feb2..17ffe06 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 3cae878..9752abb 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 062ada9..dbe31cb 100644
--- a/development/docker-compose.mysql.yml
+++ b/development/docker-compose.mysql.yml
@@ -1,6 +1,4 @@
---
-version: "3.8"
-
services:
nautobot:
environment:
@@ -19,7 +17,6 @@ services:
db:
image: "mysql:8"
command:
- - "--default-authentication-plugin=mysql_native_password"
- "--max_connections=1000"
env_file:
- "development.env"
diff --git a/development/docker-compose.postgres.yml b/development/docker-compose.postgres.yml
index 12d1de3..8d96fdb 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 6da9fa0..b5e266a 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/nautobot_config.py b/development/nautobot_config.py
index f83c96c..a9fdd3c 100644
--- a/development/nautobot_config.py
+++ b/development/nautobot_config.py
@@ -1,4 +1,5 @@
"""Nautobot development configuration file."""
+
import os
import sys
@@ -9,7 +10,7 @@
# Debug
#
-DEBUG = is_truthy(os.getenv("NAUTOBOT_DEBUG", False))
+DEBUG = is_truthy(os.getenv("NAUTOBOT_DEBUG", "false"))
_TESTING = len(sys.argv) > 1 and sys.argv[1] == "test"
if DEBUG and not _TESTING:
@@ -47,9 +48,10 @@
"PASSWORD": os.getenv("NAUTOBOT_DB_PASSWORD", ""), # Database password
"HOST": os.getenv("NAUTOBOT_DB_HOST", "localhost"), # Database server
"PORT": os.getenv(
- "NAUTOBOT_DB_PORT", default_db_settings[nautobot_db_engine]["NAUTOBOT_DB_PORT"]
+ "NAUTOBOT_DB_PORT",
+ default_db_settings[nautobot_db_engine]["NAUTOBOT_DB_PORT"],
), # Database port, default to postgres
- "CONN_MAX_AGE": int(os.getenv("NAUTOBOT_DB_TIMEOUT", 300)), # Database timeout
+ "CONN_MAX_AGE": int(os.getenv("NAUTOBOT_DB_TIMEOUT", "300")), # Database timeout
"ENGINE": nautobot_db_engine,
}
}
diff --git a/docs/assets/extra.css b/docs/assets/extra.css
index 1eff119..3f3931a 100644
--- a/docs/assets/extra.css
+++ b/docs/assets/extra.css
@@ -96,7 +96,7 @@ a.autorefs-external:hover::after {
}
-/* Customization for mkdocs-version-annotations */
+/* Customization for markdown-version-annotations */
:root {
/* Icon for "version-added" admonition: Material Design Icons "plus-box-outline" */
--md-admonition-icon--version-added: url('data:image/svg+xml;charset=utf-8,');
diff --git a/docs/dev/contributing.md b/docs/dev/contributing.md
index 02086dc..e23e636 100644
--- a/docs/dev/contributing.md
+++ b/docs/dev/contributing.md
@@ -4,7 +4,7 @@ The project is packaged with a light [development environment](dev_environment.m
The project is following Network to Code software development guidelines and is leveraging the following:
-- Python linting and formatting: `black`, `pylint`, `bandit`, `flake8`, and `ruff`.
+- Python linting and formatting: `pylint` and `ruff`.
- YAML linting is done with `yamllint`.
- Django unit test to ensure the app is working properly.
diff --git a/docs/dev/dev_environment.md b/docs/dev/dev_environment.md
index e1aef01..0fd1133 100644
--- a/docs/dev/dev_environment.md
+++ b/docs/dev/dev_environment.md
@@ -123,10 +123,7 @@ Each command can be executed with `invoke `. All commands support the a
#### Testing
```
- bandit Run bandit to validate basic static code security analysis.
- black Run black to check that Python files adhere to its style standards.
- flake8 Run flake8 to check that Python files adhere to its style standards.
- ruff Run ruff to validate docstring formatting adheres to NTC defined standards.
+ ruff Run ruff to perform code formatting and/or linting.
pylint Run pylint code analysis.
tests Run all tests for this app.
unittest Run Django unit tests for the app.
@@ -454,7 +451,7 @@ This is the same as running:
### Tests
-To run tests against your code, you can run all of the tests that TravisCI runs against any new PR with:
+To run tests against your code, you can run all of the tests that the CI runs against any new PR with:
```bash
➜ invoke tests
@@ -464,9 +461,6 @@ To run an individual test, you can run any or all of the following:
```bash
➜ invoke unittest
-➜ invoke bandit
-➜ invoke black
-➜ invoke flake8
➜ invoke ruff
➜ invoke pylint
```
diff --git a/docs/requirements.txt b/docs/requirements.txt
index d168c88..1d89ad0 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,5 +1,5 @@
mkdocs==1.5.2
mkdocs-material==9.1.15
-mkdocs-version-annotations==1.0.0
+markdown-version-annotations==1.0.1
mkdocstrings-python==1.5.2
mkdocstrings==0.22.0
diff --git a/mkdocs.yml b/mkdocs.yml
index 24b5f5a..fbdd9a1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -72,6 +72,8 @@ extra:
link: "https://twitter.com/networktocode"
name: "Network to Code Twitter"
markdown_extensions:
+ - "markdown_version_annotations":
+ admonition_tag: "???"
- "admonition"
- "toc":
permalink: true
@@ -89,7 +91,6 @@ markdown_extensions:
- "footnotes"
plugins:
- "search"
- - "mkdocs-version-annotations"
- "mkdocstrings":
default_handler: "python"
handlers:
diff --git a/nautobot_firewall_models/__init__.py b/nautobot_firewall_models/__init__.py
index e5676e3..c8874e7 100644
--- a/nautobot_firewall_models/__init__.py
+++ b/nautobot_firewall_models/__init__.py
@@ -1,4 +1,5 @@
"""App declaration for nautobot_firewall_models."""
+
# Metadata is inherited from Nautobot. If not including Nautobot in the environment, this should be added
from importlib import metadata
diff --git a/nautobot_firewall_models/api/serializers.py b/nautobot_firewall_models/api/serializers.py
index bb93207..f250c27 100644
--- a/nautobot_firewall_models/api/serializers.py
+++ b/nautobot_firewall_models/api/serializers.py
@@ -1,7 +1,7 @@
"""API serializers for firewall models."""
-from rest_framework import serializers
from nautobot.apps.api import NautobotModelSerializer, ValidatedModelSerializer
+from rest_framework import serializers
from nautobot_firewall_models import models
diff --git a/nautobot_firewall_models/api/urls.py b/nautobot_firewall_models/api/urls.py
index e3eeb56..8c18b15 100644
--- a/nautobot_firewall_models/api/urls.py
+++ b/nautobot_firewall_models/api/urls.py
@@ -4,7 +4,6 @@
from nautobot_firewall_models.api import views
-
router = OrderedDefaultRouter()
router.register("address-object", views.AddressObjectViewSet)
router.register("address-object-group", views.AddressObjectGroupViewSet)
diff --git a/nautobot_firewall_models/choices.py b/nautobot_firewall_models/choices.py
index d78062d..207898a 100644
--- a/nautobot_firewall_models/choices.py
+++ b/nautobot_firewall_models/choices.py
@@ -2,7 +2,6 @@
from netutils.protocol_mapper import PROTO_NAME_TO_NUM
-
IP_PROTOCOL_CHOICES = tuple((i, i) for i in PROTO_NAME_TO_NUM.keys()) # pylint: disable=consider-iterating-dictionary
ACTION_CHOICES = (("allow", "allow"), ("deny", "deny"), ("drop", "drop"), ("remark", "remark"))
diff --git a/nautobot_firewall_models/constants.py b/nautobot_firewall_models/constants.py
index d642c10..526462c 100644
--- a/nautobot_firewall_models/constants.py
+++ b/nautobot_firewall_models/constants.py
@@ -1,4 +1,5 @@
"""Constants file."""
+
from django.conf import settings
# This is used to map the slug of the platform in the customers environment to the expected name that Capirca is looking for
diff --git a/nautobot_firewall_models/fields.py b/nautobot_firewall_models/fields.py
index 74f1ddc..c8c7a4a 100644
--- a/nautobot_firewall_models/fields.py
+++ b/nautobot_firewall_models/fields.py
@@ -1,7 +1,6 @@
"""Creating fields for IPRange models."""
from django import forms
-
from nautobot.ipam.formfields import IPAddressFormField
diff --git a/nautobot_firewall_models/filters.py b/nautobot_firewall_models/filters.py
index d1f4a87..990c41f 100644
--- a/nautobot_firewall_models/filters.py
+++ b/nautobot_firewall_models/filters.py
@@ -1,13 +1,14 @@
"""Filtering for Firewall Model App."""
+
+import django_filters
from django.contrib.contenttypes.fields import GenericRelation
from django.core.exceptions import ValidationError
from django.db.models import Q
-import django_filters
from nautobot.apps.filters import (
- NautobotFilterSet,
- StatusModelFilterSetMixin,
MultiValueCharFilter,
NaturalKeyOrPKMultipleChoiceFilter,
+ NautobotFilterSet,
+ StatusModelFilterSetMixin,
)
from nautobot.dcim.models import Device
diff --git a/nautobot_firewall_models/forms.py b/nautobot_firewall_models/forms.py
index dd4c810..e0d9768 100644
--- a/nautobot_firewall_models/forms.py
+++ b/nautobot_firewall_models/forms.py
@@ -1,6 +1,12 @@
"""Forms for the Firewall app."""
from django import forms
+from nautobot.apps.forms import (
+ DynamicModelChoiceField,
+ DynamicModelMultipleChoiceField,
+ TagFilterField,
+ add_blank_choice,
+)
from nautobot.dcim.models import Device, Interface
from nautobot.extras.forms import (
CustomFieldModelCSVForm,
@@ -15,12 +21,6 @@
from nautobot.ipam.models import VRF, IPAddress, Prefix
from nautobot.tenancy.forms import TenancyFilterForm, TenancyForm
from nautobot.tenancy.models import Tenant
-from nautobot.apps.forms import (
- DynamicModelChoiceField,
- DynamicModelMultipleChoiceField,
- TagFilterField,
- add_blank_choice,
-)
from nautobot_firewall_models import choices, fields, models
diff --git a/nautobot_firewall_models/homepage.py b/nautobot_firewall_models/homepage.py
index 43fd948..a3d4a08 100644
--- a/nautobot_firewall_models/homepage.py
+++ b/nautobot_firewall_models/homepage.py
@@ -1,7 +1,8 @@
"""Adds App items to homepage."""
+
from nautobot.core.apps import HomePageItem, HomePagePanel
-from nautobot_firewall_models.models import Policy, PolicyRule, CapircaPolicy, NATPolicy, NATPolicyRule
+from nautobot_firewall_models.models import CapircaPolicy, NATPolicy, NATPolicyRule, Policy, PolicyRule
layout = (
HomePagePanel(
diff --git a/nautobot_firewall_models/jobs.py b/nautobot_firewall_models/jobs.py
index caeccb1..47603ad 100644
--- a/nautobot_firewall_models/jobs.py
+++ b/nautobot_firewall_models/jobs.py
@@ -1,11 +1,10 @@
"""Jobs to run backups, intended config, and compliance."""
-from nautobot.extras.jobs import Job, MultiObjectVar, get_task_logger
from nautobot.core.celery import register_jobs
-
from nautobot.dcim.models import Device
-from nautobot_firewall_models.models import CapircaPolicy
-from nautobot_firewall_models.models import Policy
+from nautobot.extras.jobs import Job, MultiObjectVar, get_task_logger
+
+from nautobot_firewall_models.models import CapircaPolicy, Policy
logger = get_task_logger(__name__)
diff --git a/nautobot_firewall_models/migrations/0001_initial.py b/nautobot_firewall_models/migrations/0001_initial.py
index 92af72e..a168286 100644
--- a/nautobot_firewall_models/migrations/0001_initial.py
+++ b/nautobot_firewall_models/migrations/0001_initial.py
@@ -1,14 +1,16 @@
# Generated by Django 3.2.13 on 2022-05-16 23:53
+import uuid
+
import django.core.serializers.json
-from django.db import migrations, models
import django.db.models.deletion
import nautobot.extras.models.mixins
import nautobot.extras.models.statuses
import nautobot.ipam.fields
-import nautobot_firewall_models.validators
import taggit.managers
-import uuid
+from django.db import migrations, models
+
+import nautobot_firewall_models.validators
class Migration(migrations.Migration):
diff --git a/nautobot_firewall_models/migrations/0002_custom_status.py b/nautobot_firewall_models/migrations/0002_custom_status.py
index 170c48f..d9d473b 100644
--- a/nautobot_firewall_models/migrations/0002_custom_status.py
+++ b/nautobot_firewall_models/migrations/0002_custom_status.py
@@ -1,9 +1,9 @@
# Generated by Django 3.2.13 on 2022-04-23 23:14
import os
-from django.db import migrations
-from django.core.exceptions import ObjectDoesNotExist
import yaml
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import migrations
def create_status(apps, schema_editor):
diff --git a/nautobot_firewall_models/migrations/0003_default_status.py b/nautobot_firewall_models/migrations/0003_default_status.py
index 815aa0f..d983b60 100644
--- a/nautobot_firewall_models/migrations/0003_default_status.py
+++ b/nautobot_firewall_models/migrations/0003_default_status.py
@@ -1,8 +1,9 @@
# Generated by Django 3.2.13 on 2022-05-16 23:54
-from django.db import migrations
import django.db.models.deletion
import nautobot.extras.models.statuses
+from django.db import migrations
+
import nautobot_firewall_models.utils
diff --git a/nautobot_firewall_models/migrations/0005_capircapolicy.py b/nautobot_firewall_models/migrations/0005_capircapolicy.py
index 5a13a1e..97c594e 100644
--- a/nautobot_firewall_models/migrations/0005_capircapolicy.py
+++ b/nautobot_firewall_models/migrations/0005_capircapolicy.py
@@ -1,11 +1,12 @@
# Generated by Django 3.2.14 on 2022-07-09 22:10
+import uuid
+
import django.core.serializers.json
-from django.db import migrations, models
import django.db.models.deletion
import nautobot.extras.models.mixins
import taggit.managers
-import uuid
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/nautobot_firewall_models/migrations/0006_renaming_part1.py b/nautobot_firewall_models/migrations/0006_renaming_part1.py
index ca6e87a..3fbed12 100644
--- a/nautobot_firewall_models/migrations/0006_renaming_part1.py
+++ b/nautobot_firewall_models/migrations/0006_renaming_part1.py
@@ -1,9 +1,10 @@
# Generated by Django 3.2.15 on 2022-08-26 18:03
-from django.db import migrations, models
-import django.db.models.deletion
import uuid
+import django.db.models.deletion
+from django.db import migrations, models
+
class Migration(migrations.Migration):
dependencies = [
diff --git a/nautobot_firewall_models/migrations/0007_renaming_part2.py b/nautobot_firewall_models/migrations/0007_renaming_part2.py
index 60699e5..2d9fceb 100644
--- a/nautobot_firewall_models/migrations/0007_renaming_part2.py
+++ b/nautobot_firewall_models/migrations/0007_renaming_part2.py
@@ -1,4 +1,5 @@
"""Custom migration for moving index to the PolicyRule."""
+
from django.db import migrations
from django.db.models import Count
diff --git a/nautobot_firewall_models/migrations/0010_nat_policy.py b/nautobot_firewall_models/migrations/0010_nat_policy.py
index 5717b65..65e9e86 100644
--- a/nautobot_firewall_models/migrations/0010_nat_policy.py
+++ b/nautobot_firewall_models/migrations/0010_nat_policy.py
@@ -1,13 +1,15 @@
# Generated by Django 3.2.15 on 2022-09-28 11:31
+import uuid
+
import django.core.serializers.json
-from django.db import migrations, models
import django.db.models.deletion
import nautobot.extras.models.mixins
import nautobot.extras.models.statuses
-import nautobot_firewall_models.utils
import taggit.managers
-import uuid
+from django.db import migrations, models
+
+import nautobot_firewall_models.utils
class Migration(migrations.Migration):
diff --git a/nautobot_firewall_models/migrations/0013_applications.py b/nautobot_firewall_models/migrations/0013_applications.py
index dcd7ed4..4157ee6 100644
--- a/nautobot_firewall_models/migrations/0013_applications.py
+++ b/nautobot_firewall_models/migrations/0013_applications.py
@@ -1,13 +1,15 @@
# Generated by Django 3.2.15 on 2022-11-22 21:23
+import uuid
+
import django.core.serializers.json
-from django.db import migrations, models
import django.db.models.deletion
import nautobot.extras.models.mixins
import nautobot.extras.models.statuses
-import nautobot_firewall_models.utils
import taggit.managers
-import uuid
+from django.db import migrations, models
+
+import nautobot_firewall_models.utils
class Migration(migrations.Migration):
diff --git a/nautobot_firewall_models/migrations/0015_alter_capircapolicy_device.py b/nautobot_firewall_models/migrations/0015_alter_capircapolicy_device.py
index e49e4c5..f9dd82b 100644
--- a/nautobot_firewall_models/migrations/0015_alter_capircapolicy_device.py
+++ b/nautobot_firewall_models/migrations/0015_alter_capircapolicy_device.py
@@ -1,7 +1,7 @@
# Generated by Django 3.2.15 on 2023-05-03 22:37
-from django.db import migrations, models
import django.db.models.deletion
+from django.db import migrations, models
class Migration(migrations.Migration):
diff --git a/nautobot_firewall_models/migrations/0016_nautobot_v2_migrations.py b/nautobot_firewall_models/migrations/0016_nautobot_v2_migrations.py
index db9fb92..977f9fc 100644
--- a/nautobot_firewall_models/migrations/0016_nautobot_v2_migrations.py
+++ b/nautobot_firewall_models/migrations/0016_nautobot_v2_migrations.py
@@ -1,9 +1,10 @@
# Generated by Django 3.2.20 on 2023-09-12 20:51
-from django.db import migrations, models
import django.db.models.deletion
import nautobot.core.models.fields
import nautobot.extras.models.statuses
+from django.db import migrations, models
+
import nautobot_firewall_models.utils
diff --git a/nautobot_firewall_models/migrations/0018_resolve_issues_through_tables_part2.py b/nautobot_firewall_models/migrations/0018_resolve_issues_through_tables_part2.py
index fed205b..ebfdbd2 100644
--- a/nautobot_firewall_models/migrations/0018_resolve_issues_through_tables_part2.py
+++ b/nautobot_firewall_models/migrations/0018_resolve_issues_through_tables_part2.py
@@ -2,7 +2,6 @@
from django.db import migrations
-
affected_models = [
{"model": "nautobot_firewall_models.AddressObjectGroup", "old": "address_objects", "new": "new_address_objects"},
{"model": "nautobot_firewall_models.FQDN", "old": "ip_addresses", "new": "new_ip_addresses"},
diff --git a/nautobot_firewall_models/migrations/0020_field_cleanups.py b/nautobot_firewall_models/migrations/0020_field_cleanups.py
index 1e88ed7..62bdf6c 100644
--- a/nautobot_firewall_models/migrations/0020_field_cleanups.py
+++ b/nautobot_firewall_models/migrations/0020_field_cleanups.py
@@ -1,6 +1,7 @@
# Generated by Django 3.2.21 on 2023-09-28 17:07
from django.db import migrations, models
+
import nautobot_firewall_models.validators
diff --git a/nautobot_firewall_models/migrations/0021_alter_addressobject_status_and_more.py b/nautobot_firewall_models/migrations/0021_alter_addressobject_status_and_more.py
index a60af5f..8c9828f 100644
--- a/nautobot_firewall_models/migrations/0021_alter_addressobject_status_and_more.py
+++ b/nautobot_firewall_models/migrations/0021_alter_addressobject_status_and_more.py
@@ -1,8 +1,9 @@
# Generated by Django 4.2.14 on 2024-08-06 00:36
-from django.db import migrations
import django.db.models.deletion
import nautobot.extras.models.statuses
+from django.db import migrations
+
import nautobot_firewall_models.utils
diff --git a/nautobot_firewall_models/models/__init__.py b/nautobot_firewall_models/models/__init__.py
index c68d476..6d4e0bd 100644
--- a/nautobot_firewall_models/models/__init__.py
+++ b/nautobot_firewall_models/models/__init__.py
@@ -1,9 +1,9 @@
"""Load models."""
from .address import (
+ FQDN,
AddressObject,
AddressObjectGroup,
- FQDN,
IPRange,
)
from .capirca_policy import (
@@ -11,9 +11,9 @@
)
from .nat_policy import (
NATPolicy,
- NATPolicyRule,
NATPolicyDeviceM2M,
NATPolicyDynamicGroupM2M,
+ NATPolicyRule,
)
from .security_policy import (
Policy,
diff --git a/nautobot_firewall_models/models/address.py b/nautobot_firewall_models/models/address.py
index fe008bf..149c5ec 100644
--- a/nautobot_firewall_models/models/address.py
+++ b/nautobot_firewall_models/models/address.py
@@ -13,7 +13,6 @@
from nautobot_firewall_models.utils import get_default_status
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/models/capirca_policy.py b/nautobot_firewall_models/models/capirca_policy.py
index c48ac66..8d22359 100644
--- a/nautobot_firewall_models/models/capirca_policy.py
+++ b/nautobot_firewall_models/models/capirca_policy.py
@@ -1,4 +1,5 @@
"""Models for the Capirca Configurations."""
+
# pylint: disable=duplicate-code
import logging
diff --git a/nautobot_firewall_models/models/nat_policy.py b/nautobot_firewall_models/models/nat_policy.py
index 146a6d4..da4c528 100644
--- a/nautobot_firewall_models/models/nat_policy.py
+++ b/nautobot_firewall_models/models/nat_policy.py
@@ -8,7 +8,6 @@
from nautobot_firewall_models.utils import get_default_status, model_to_json
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/models/security_policy.py b/nautobot_firewall_models/models/security_policy.py
index 19deeeb..356d6a2 100644
--- a/nautobot_firewall_models/models/security_policy.py
+++ b/nautobot_firewall_models/models/security_policy.py
@@ -9,7 +9,6 @@
from nautobot_firewall_models import choices
from nautobot_firewall_models.utils import get_default_status, model_to_json
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/models/service.py b/nautobot_firewall_models/models/service.py
index c49a82f..e9949d6 100644
--- a/nautobot_firewall_models/models/service.py
+++ b/nautobot_firewall_models/models/service.py
@@ -9,7 +9,6 @@
from nautobot_firewall_models import choices, validators
from nautobot_firewall_models.utils import get_default_status
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/models/user.py b/nautobot_firewall_models/models/user.py
index 7041f62..12486b7 100644
--- a/nautobot_firewall_models/models/user.py
+++ b/nautobot_firewall_models/models/user.py
@@ -8,7 +8,6 @@
from nautobot_firewall_models.utils import get_default_status
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/models/zone.py b/nautobot_firewall_models/models/zone.py
index 0b7cf59..84887ff 100644
--- a/nautobot_firewall_models/models/zone.py
+++ b/nautobot_firewall_models/models/zone.py
@@ -8,7 +8,6 @@
from nautobot_firewall_models.utils import get_default_status
-
###########################
# Core Models
###########################
diff --git a/nautobot_firewall_models/signals.py b/nautobot_firewall_models/signals.py
index a991756..8540fb1 100644
--- a/nautobot_firewall_models/signals.py
+++ b/nautobot_firewall_models/signals.py
@@ -1,14 +1,14 @@
"""Configurable signals."""
+
from django.core.exceptions import ValidationError
-from django.dispatch import receiver
from django.db.models.signals import pre_delete
+from django.dispatch import receiver
from nautobot.dcim.models import Interface
-from nautobot.ipam.models import IPAddress, Prefix, VRF
+from nautobot.ipam.models import VRF, IPAddress, Prefix
from nautobot_firewall_models import models
from nautobot_firewall_models.constants import PLUGIN_CFG
-
ON_DELETE = {
IPAddress: ["fqdns", "address_objects"],
Prefix: ["address_objects"],
diff --git a/nautobot_firewall_models/tables.py b/nautobot_firewall_models/tables.py
index 048b9f2..17bc0cb 100644
--- a/nautobot_firewall_models/tables.py
+++ b/nautobot_firewall_models/tables.py
@@ -1,8 +1,8 @@
"""Table Views for Firewall Models."""
import django_tables2 as tables
-from nautobot.extras.tables import StatusTableMixin
from nautobot.apps.tables import BaseTable, ButtonsColumn, ToggleColumn
+from nautobot.extras.tables import StatusTableMixin
from nautobot_firewall_models import models
diff --git a/nautobot_firewall_models/template_content.py b/nautobot_firewall_models/template_content.py
index f6dd223..da3a446 100644
--- a/nautobot_firewall_models/template_content.py
+++ b/nautobot_firewall_models/template_content.py
@@ -1,4 +1,5 @@
"""Extensions of baseline Nautobot views."""
+
from nautobot.apps.ui import TemplateExtension
from nautobot_firewall_models.models import CapircaPolicy
diff --git a/nautobot_firewall_models/templatetags/fw_tags.py b/nautobot_firewall_models/templatetags/fw_tags.py
index 199469a..e8ec767 100644
--- a/nautobot_firewall_models/templatetags/fw_tags.py
+++ b/nautobot_firewall_models/templatetags/fw_tags.py
@@ -1,4 +1,5 @@
"""Add custom templatetags."""
+
from django import template
register = template.Library()
diff --git a/nautobot_firewall_models/tests/fixtures.py b/nautobot_firewall_models/tests/fixtures.py
index 9fc157e..b9aadf1 100644
--- a/nautobot_firewall_models/tests/fixtures.py
+++ b/nautobot_firewall_models/tests/fixtures.py
@@ -1,10 +1,11 @@
"""Create basic objects for use in test class setup."""
-# flake8: noqa: F403,405
+
+# noqa: F403, F405
from django.contrib.contenttypes.models import ContentType
-from nautobot.dcim.models import Device, DeviceType, Manufacturer, Platform, Location, LocationType
+from nautobot.dcim.models import Device, DeviceType, Location, LocationType, Manufacturer, Platform
from nautobot.extras.models import DynamicGroup, Job, Role
from nautobot.extras.models.statuses import Status
-from nautobot.ipam.models import Prefix, VRF, Namespace
+from nautobot.ipam.models import VRF, Namespace, Prefix
from nautobot.ipam.models import IPAddress as IPAddr
from nautobot.tenancy.models import Tenant, TenantGroup
diff --git a/nautobot_firewall_models/tests/test_api.py b/nautobot_firewall_models/tests/test_api.py
index 484cf35..17b0730 100644
--- a/nautobot_firewall_models/tests/test_api.py
+++ b/nautobot_firewall_models/tests/test_api.py
@@ -1,17 +1,16 @@
-"""Unit tests for API views."""
+"""Unit tests for nautobot_firewall_models."""
-# flake8: noqa: F403,405
-# pylint: disable=invalid-name
-# pylint: disable=duplicate-code
+# pylint: disable=invalid-name, duplicate-code
from django.contrib.contenttypes.models import ContentType
from nautobot.apps.testing import APIViewTestCases, disable_warnings
-from nautobot.dcim.models import Location, Platform, DeviceType, Device
-from nautobot.extras.models import Status, Role
-from nautobot.ipam.models import Prefix, VRF
+from nautobot.dcim.models import Device, DeviceType, Location, Platform
+from nautobot.extras.models import Role, Status
+from nautobot.ipam.models import VRF, Prefix
from nautobot.users.models import ObjectPermission
from rest_framework import status as drf_status
from nautobot_firewall_models import models
+
from . import fixtures
diff --git a/nautobot_firewall_models/tests/test_basic.py b/nautobot_firewall_models/tests/test_basic.py
index bcf7d12..d72f2d0 100644
--- a/nautobot_firewall_models/tests/test_basic.py
+++ b/nautobot_firewall_models/tests/test_basic.py
@@ -1,6 +1,8 @@
"""Basic tests that do not require Django."""
-import unittest
+
import os
+import unittest
+
import toml
@@ -15,8 +17,9 @@ def test_version(self):
with open(f"{parent_path}/docs/requirements.txt", "r", encoding="utf-8") as file:
requirements = [line for line in file.read().splitlines() if (len(line) > 0 and not line.startswith("#"))]
for pkg in requirements:
- if len(pkg.split("==")) == 2:
- pkg, version = pkg.split("==")
+ package_name = pkg
+ if len(pkg.split("==")) == 2: # noqa: PLR2004
+ package_name, version = pkg.split("==")
else:
version = "*"
- self.assertEqual(poetry_details[pkg], version)
+ self.assertEqual(poetry_details[package_name], version)
diff --git a/nautobot_firewall_models/tests/test_capirca.py b/nautobot_firewall_models/tests/test_capirca.py
index a0e9356..7373e06 100644
--- a/nautobot_firewall_models/tests/test_capirca.py
+++ b/nautobot_firewall_models/tests/test_capirca.py
@@ -1,8 +1,10 @@
"""Test Capirca Utils."""
-# flake8: noqa: F403,405
+
+# noqa: F403, F405
# pylint: disable=protected-access
from unittest import skip
from unittest.mock import patch
+
from django.core.exceptions import ValidationError
from django.test import TestCase
from nautobot.dcim.models import Device, Platform
@@ -10,7 +12,7 @@
from nautobot.ipam.models import IPAddress, Namespace
from nautobot_firewall_models.models import * # pylint: disable=unused-wildcard-import, wildcard-import
-from nautobot_firewall_models.utils.capirca import generate_capirca_config, PolicyToCapirca, DevicePolicyToCapirca
+from nautobot_firewall_models.utils.capirca import DevicePolicyToCapirca, PolicyToCapirca, generate_capirca_config
from .fixtures import create_capirca_env
diff --git a/nautobot_firewall_models/tests/test_filters.py b/nautobot_firewall_models/tests/test_filters.py
index b69b96e..372fa73 100644
--- a/nautobot_firewall_models/tests/test_filters.py
+++ b/nautobot_firewall_models/tests/test_filters.py
@@ -2,8 +2,8 @@
# pylint: disable=invalid-name
from django.test import TestCase
-
from nautobot.dcim.models import Device
+
from nautobot_firewall_models import filters, models
from .fixtures import create_capirca_env
diff --git a/nautobot_firewall_models/tests/test_models.py b/nautobot_firewall_models/tests/test_models.py
index b77f29a..0f58a1c 100644
--- a/nautobot_firewall_models/tests/test_models.py
+++ b/nautobot_firewall_models/tests/test_models.py
@@ -1,5 +1,6 @@
"""Test Firewall models."""
-# flake8: noqa: F403,405
+
+# noqa: F403, F405
# pylint: disable=invalid-name
from django.core.exceptions import ValidationError
from django.test import TestCase
diff --git a/nautobot_firewall_models/tests/test_ui_views.py b/nautobot_firewall_models/tests/test_ui_views.py
index 9e96651..bb70519 100644
--- a/nautobot_firewall_models/tests/test_ui_views.py
+++ b/nautobot_firewall_models/tests/test_ui_views.py
@@ -1,13 +1,14 @@
"""Unit tests for views."""
-# flake8: noqa: F403,405
+# noqa: F403, F405
# pylint: disable=invalid-name
# pylint: disable=duplicate-code
+from nautobot.apps.testing import ViewTestCases
from nautobot.dcim.models import Device
from nautobot.extras.models.statuses import Status
-from nautobot.apps.testing import ViewTestCases
from nautobot_firewall_models.models import * # pylint: disable=unused-wildcard-import, wildcard-import
+
from . import fixtures
diff --git a/nautobot_firewall_models/utils/__init__.py b/nautobot_firewall_models/utils/__init__.py
index 218a021..937a53d 100644
--- a/nautobot_firewall_models/utils/__init__.py
+++ b/nautobot_firewall_models/utils/__init__.py
@@ -1,10 +1,12 @@
"""Help funcs for firewall models app."""
+
import json
+
from django.conf import settings
from django.utils.module_loading import import_string
-from rest_framework.renderers import JSONRenderer
-from nautobot.extras.models import Status
from nautobot.core.models.utils import serialize_object_v2
+from nautobot.extras.models import Status
+from rest_framework.renderers import JSONRenderer
def get_default_status():
diff --git a/nautobot_firewall_models/utils/capirca.py b/nautobot_firewall_models/utils/capirca.py
index 712c01b..0673978 100644
--- a/nautobot_firewall_models/utils/capirca.py
+++ b/nautobot_firewall_models/utils/capirca.py
@@ -1,23 +1,23 @@
"""Management command to bootstrap dummy data for firewall model app."""
+
# pylint: disable=too-many-instance-attributes,too-many-locals
import logging
import re
import unicodedata
-from capirca.lib.naming import Naming
-from capirca.lib import policy
+from capirca.lib import policy
+from capirca.lib.naming import Naming
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.utils.module_loading import import_string
-
from nautobot.dcim.models import Platform
from nautobot_firewall_models.constants import (
+ ACTION_MAP,
ALLOW_STATUS,
+ CAPIRCA_MAPPER,
CAPIRCA_OS_MAPPER,
- ACTION_MAP,
LOGGING_MAP,
- CAPIRCA_MAPPER,
PLUGIN_CFG,
)
from nautobot_firewall_models.utils import model_to_json
diff --git a/nautobot_firewall_models/validators.py b/nautobot_firewall_models/validators.py
index ae3890a..bcca5e0 100644
--- a/nautobot_firewall_models/validators.py
+++ b/nautobot_firewall_models/validators.py
@@ -1,4 +1,5 @@
"""Validators for app."""
+
import re
from django.core.exceptions import ValidationError
diff --git a/nautobot_firewall_models/viewsets/__init__.py b/nautobot_firewall_models/viewsets/__init__.py
index 9b9a4c5..8c4ac4e 100644
--- a/nautobot_firewall_models/viewsets/__init__.py
+++ b/nautobot_firewall_models/viewsets/__init__.py
@@ -1,23 +1,23 @@
"""UI Viewsets."""
+
from nautobot_firewall_models.viewsets.address import (
- AddressObjectUIViewSet,
AddressObjectGroupUIViewSet,
+ AddressObjectUIViewSet,
FQDNUIViewSet,
IPRangeUIViewSet,
)
-from nautobot_firewall_models.viewsets.capirca_policy import CapircaPolicyUIViewSet, CapircaPolicyDeviceUIViewSet
+from nautobot_firewall_models.viewsets.capirca_policy import CapircaPolicyDeviceUIViewSet, CapircaPolicyUIViewSet
from nautobot_firewall_models.viewsets.nat_policy import NATPolicyRuleUIViewSet, NATPolicyUIViewSet
-from nautobot_firewall_models.viewsets.security_policy import PolicyUIViewSet, PolicyRuleUIViewSet
+from nautobot_firewall_models.viewsets.security_policy import PolicyRuleUIViewSet, PolicyUIViewSet
from nautobot_firewall_models.viewsets.service import (
- ApplicationObjectUIViewSet,
ApplicationObjectGroupUIViewSet,
- ServiceObjectUIViewSet,
+ ApplicationObjectUIViewSet,
ServiceObjectGroupUIViewSet,
+ ServiceObjectUIViewSet,
)
-from nautobot_firewall_models.viewsets.user import UserObjectUIViewSet, UserObjectGroupUIViewSet
+from nautobot_firewall_models.viewsets.user import UserObjectGroupUIViewSet, UserObjectUIViewSet
from nautobot_firewall_models.viewsets.zone import ZoneUIViewSet
-
__all__ = (
"AddressObjectUIViewSet",
"AddressObjectGroupUIViewSet",
diff --git a/nautobot_firewall_models/viewsets/address.py b/nautobot_firewall_models/viewsets/address.py
index a4f85fa..744808d 100644
--- a/nautobot_firewall_models/viewsets/address.py
+++ b/nautobot_firewall_models/viewsets/address.py
@@ -2,8 +2,8 @@
from nautobot.apps.views import NautobotUIViewSet
+from nautobot_firewall_models import filters, forms, models, tables
from nautobot_firewall_models.api import serializers
-from nautobot_firewall_models import forms, models, tables, filters
class AddressObjectUIViewSet(NautobotUIViewSet):
diff --git a/nautobot_firewall_models/viewsets/capirca_policy.py b/nautobot_firewall_models/viewsets/capirca_policy.py
index ff0c415..4985f59 100644
--- a/nautobot_firewall_models/viewsets/capirca_policy.py
+++ b/nautobot_firewall_models/viewsets/capirca_policy.py
@@ -1,17 +1,17 @@
"""Capirca Policy Object Viewsets."""
from nautobot.apps.views import (
- ObjectListViewMixin,
ObjectBulkDestroyViewMixin,
- ObjectDetailViewMixin,
ObjectChangeLogViewMixin,
ObjectDestroyViewMixin,
+ ObjectDetailViewMixin,
+ ObjectListViewMixin,
)
from nautobot.dcim.models import Device
from rest_framework.response import Response
+from nautobot_firewall_models import filters, forms, models, tables
from nautobot_firewall_models.api import serializers
-from nautobot_firewall_models import forms, models, tables, filters
class CapircaPolicyUIViewSet(
diff --git a/nautobot_firewall_models/viewsets/nat_policy.py b/nautobot_firewall_models/viewsets/nat_policy.py
index 1afee16..1d437aa 100644
--- a/nautobot_firewall_models/viewsets/nat_policy.py
+++ b/nautobot_firewall_models/viewsets/nat_policy.py
@@ -1,4 +1,5 @@
"""NAT Rule Object Viewsets."""
+
from django.shortcuts import redirect
from django.urls import reverse
from nautobot.apps.views import NautobotUIViewSet
@@ -6,16 +7,16 @@
from rest_framework.decorators import action
from nautobot_firewall_models.api.serializers import NATPolicyRuleSerializer, NATPolicySerializer
-from nautobot_firewall_models.filters import NATPolicyRuleFilterSet, NATPolicyFilterSet
+from nautobot_firewall_models.filters import NATPolicyFilterSet, NATPolicyRuleFilterSet
from nautobot_firewall_models.forms import (
- NATPolicyRuleBulkEditForm,
- NATPolicyRuleFilterForm,
- NATPolicyRuleForm,
NATPolicyBulkEditForm,
NATPolicyFilterForm,
NATPolicyForm,
+ NATPolicyRuleBulkEditForm,
+ NATPolicyRuleFilterForm,
+ NATPolicyRuleForm,
)
-from nautobot_firewall_models.models import NATPolicyRule, NATPolicy, NATPolicyDeviceM2M, NATPolicyDynamicGroupM2M
+from nautobot_firewall_models.models import NATPolicy, NATPolicyDeviceM2M, NATPolicyDynamicGroupM2M, NATPolicyRule
from nautobot_firewall_models.tables import NATPolicyRuleTable, NATPolicyTable
diff --git a/nautobot_firewall_models/viewsets/security_policy.py b/nautobot_firewall_models/viewsets/security_policy.py
index c805d6b..a75342a 100644
--- a/nautobot_firewall_models/viewsets/security_policy.py
+++ b/nautobot_firewall_models/viewsets/security_policy.py
@@ -1,4 +1,5 @@
"""Rule Object Viewsets."""
+
from django.shortcuts import redirect
from django.urls import reverse
from nautobot.apps.views import NautobotUIViewSet
@@ -6,16 +7,16 @@
from rest_framework.decorators import action
from nautobot_firewall_models.api.serializers import PolicyRuleSerializer, PolicySerializer
-from nautobot_firewall_models.filters import PolicyRuleFilterSet, PolicyFilterSet
+from nautobot_firewall_models.filters import PolicyFilterSet, PolicyRuleFilterSet
from nautobot_firewall_models.forms import (
- PolicyRuleBulkEditForm,
- PolicyRuleFilterForm,
- PolicyRuleForm,
PolicyBulkEditForm,
PolicyFilterForm,
PolicyForm,
+ PolicyRuleBulkEditForm,
+ PolicyRuleFilterForm,
+ PolicyRuleForm,
)
-from nautobot_firewall_models.models import PolicyRule, Policy, PolicyDeviceM2M, PolicyDynamicGroupM2M
+from nautobot_firewall_models.models import Policy, PolicyDeviceM2M, PolicyDynamicGroupM2M, PolicyRule
from nautobot_firewall_models.tables import PolicyRuleTable, PolicyTable
diff --git a/nautobot_firewall_models/viewsets/service.py b/nautobot_firewall_models/viewsets/service.py
index 943ea91..4b779cc 100644
--- a/nautobot_firewall_models/viewsets/service.py
+++ b/nautobot_firewall_models/viewsets/service.py
@@ -2,8 +2,8 @@
from nautobot.apps.views import NautobotUIViewSet
+from nautobot_firewall_models import filters, forms, models, tables
from nautobot_firewall_models.api import serializers
-from nautobot_firewall_models import forms, models, tables, filters
class ApplicationObjectUIViewSet(NautobotUIViewSet):
diff --git a/nautobot_firewall_models/viewsets/user.py b/nautobot_firewall_models/viewsets/user.py
index b10e5a6..9403426 100644
--- a/nautobot_firewall_models/viewsets/user.py
+++ b/nautobot_firewall_models/viewsets/user.py
@@ -2,8 +2,8 @@
from nautobot.apps.views import NautobotUIViewSet
+from nautobot_firewall_models import filters, forms, models, tables
from nautobot_firewall_models.api import serializers
-from nautobot_firewall_models import forms, models, tables, filters
class UserObjectUIViewSet(NautobotUIViewSet):
diff --git a/nautobot_firewall_models/viewsets/zone.py b/nautobot_firewall_models/viewsets/zone.py
index b8c7e73..9e02a5e 100644
--- a/nautobot_firewall_models/viewsets/zone.py
+++ b/nautobot_firewall_models/viewsets/zone.py
@@ -2,8 +2,8 @@
from nautobot.apps.views import NautobotUIViewSet
+from nautobot_firewall_models import filters, forms, models, tables
from nautobot_firewall_models.api import serializers
-from nautobot_firewall_models import forms, models, tables, filters
class ZoneUIViewSet(NautobotUIViewSet):
diff --git a/poetry.lock b/poetry.lock
index 73d09ec..366ae1b 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
[[package]]
name = "absl-py"
@@ -173,29 +173,6 @@ tzdata = {version = "*", optional = true, markers = "extra == \"tzdata\""}
[package.extras]
tzdata = ["tzdata"]
-[[package]]
-name = "bandit"
-version = "1.7.6"
-description = "Security oriented static analyser for python code."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "bandit-1.7.6-py3-none-any.whl", hash = "sha256:36da17c67fc87579a5d20c323c8d0b1643a890a2b93f00b3d1229966624694ff"},
- {file = "bandit-1.7.6.tar.gz", hash = "sha256:72ce7bc9741374d96fb2f1c9a8960829885f1243ffde743de70a19cee353e8f3"},
-]
-
-[package.dependencies]
-colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""}
-GitPython = ">=3.1.30"
-PyYAML = ">=5.3.1"
-rich = "*"
-stevedore = ">=1.20.0"
-
-[package.extras]
-test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"]
-toml = ["tomli (>=1.1.0)"]
-yaml = ["PyYAML"]
-
[[package]]
name = "billiard"
version = "4.2.0"
@@ -207,52 +184,6 @@ files = [
{file = "billiard-4.2.0.tar.gz", hash = "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c"},
]
-[[package]]
-name = "black"
-version = "23.12.1"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"},
- {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"},
- {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"},
- {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"},
- {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"},
- {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"},
- {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"},
- {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"},
- {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"},
- {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"},
- {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"},
- {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"},
- {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"},
- {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"},
- {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"},
- {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"},
- {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"},
- {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"},
- {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"},
- {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"},
- {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"},
- {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
[[package]]
name = "capirca"
version = "2.0.9"
@@ -1162,22 +1093,6 @@ files = [
[package.extras]
tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
-[[package]]
-name = "flake8"
-version = "5.0.4"
-description = "the modular source code checker: pep8 pyflakes and co"
-optional = false
-python-versions = ">=3.6.1"
-files = [
- {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"},
- {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"},
-]
-
-[package.dependencies]
-mccabe = ">=0.7.0,<0.8.0"
-pycodestyle = ">=2.9.0,<2.10.0"
-pyflakes = ">=2.5.0,<2.6.0"
-
[[package]]
name = "ghp-import"
version = "2.1.0"
@@ -1642,28 +1557,18 @@ importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
testing = ["coverage", "pyyaml"]
[[package]]
-name = "markdown-it-py"
-version = "3.0.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
+name = "markdown-version-annotations"
+version = "1.0.1"
+description = "Markdown plugin to add custom admonitions for documenting version differences"
optional = false
-python-versions = ">=3.8"
+python-versions = "<4.0,>=3.7"
files = [
- {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
- {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
+ {file = "markdown_version_annotations-1.0.1-py3-none-any.whl", hash = "sha256:6df0b2ac08bab906c8baa425f59fc0fe342fbe8b3917c144fb75914266b33200"},
+ {file = "markdown_version_annotations-1.0.1.tar.gz", hash = "sha256:620aade507ef175ccfb2059db152a34c6a1d2add28c2be16ea4de38d742e6132"},
]
[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-code-style = ["pre-commit (>=3.0,<4.0)"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins"]
-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"]
+markdown = ">=3.3.7,<4.0.0"
[[package]]
name = "markupsafe"
@@ -1692,6 +1597,16 @@ files = [
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
+ {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
@@ -1749,17 +1664,6 @@ files = [
{file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"},
]
-[[package]]
-name = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
- {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
-]
-
[[package]]
name = "mergedeep"
version = "1.3.4"
@@ -1850,17 +1754,6 @@ files = [
{file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"},
]
-[[package]]
-name = "mkdocs-version-annotations"
-version = "1.0.0"
-description = "MkDocs plugin to add custom admonitions for documenting version differences"
-optional = false
-python-versions = ">=3.7,<4.0"
-files = [
- {file = "mkdocs-version-annotations-1.0.0.tar.gz", hash = "sha256:6786024b37d27b330fda240b76ebec8e7ce48bd5a9d7a66e99804559d088dffa"},
- {file = "mkdocs_version_annotations-1.0.0-py3-none-any.whl", hash = "sha256:385004eb4a7530dd87a227e08cd907ce7a8fe21fdf297720a4149c511bcf05f5"},
-]
-
[[package]]
name = "mkdocstrings"
version = "0.22.0"
@@ -1918,17 +1811,6 @@ build = ["blurb", "twine", "wheel"]
docs = ["sphinx"]
test = ["pytest", "pytest-cov"]
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
[[package]]
name = "nautobot"
version = "2.1.0"
@@ -2069,17 +1951,6 @@ files = [
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
]
-[[package]]
-name = "pbr"
-version = "6.0.0"
-description = "Python Build Reasonableness"
-optional = false
-python-versions = ">=2.6"
-files = [
- {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"},
- {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"},
-]
-
[[package]]
name = "pexpect"
version = "4.9.0"
@@ -2286,6 +2157,7 @@ files = [
{file = "psycopg2_binary-2.9.9-cp311-cp311-win32.whl", hash = "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d"},
{file = "psycopg2_binary-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf"},
+ {file = "psycopg2_binary-2.9.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996"},
@@ -2294,6 +2166,8 @@ files = [
{file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb"},
{file = "psycopg2_binary-2.9.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe"},
+ {file = "psycopg2_binary-2.9.9-cp312-cp312-win32.whl", hash = "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93"},
+ {file = "psycopg2_binary-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab"},
{file = "psycopg2_binary-2.9.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a"},
{file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9"},
{file = "psycopg2_binary-2.9.9-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77"},
@@ -2356,17 +2230,6 @@ files = [
[package.extras]
tests = ["pytest"]
-[[package]]
-name = "pycodestyle"
-version = "2.9.1"
-description = "Python style guide checker"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"},
- {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"},
-]
-
[[package]]
name = "pycparser"
version = "2.21"
@@ -2378,17 +2241,6 @@ files = [
{file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
]
-[[package]]
-name = "pyflakes"
-version = "2.5.0"
-description = "passive checker of Python programs"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"},
- {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"},
-]
-
[[package]]
name = "pygments"
version = "2.17.2"
@@ -2659,6 +2511,7 @@ files = [
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
@@ -2666,8 +2519,16 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
@@ -2684,6 +2545,7 @@ files = [
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
@@ -2691,6 +2553,7 @@ files = [
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
@@ -2884,25 +2747,6 @@ requests = ">=2.0.0"
[package.extras]
rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
-[[package]]
-name = "rich"
-version = "13.7.0"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"},
- {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0"
-pygments = ">=2.13.0,<3.0.0"
-typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""}
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
[[package]]
name = "rpds-py"
version = "0.16.2"
@@ -3013,28 +2857,29 @@ files = [
[[package]]
name = "ruff"
-version = "0.1.11"
+version = "0.5.5"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
files = [
- {file = "ruff-0.1.11-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a7f772696b4cdc0a3b2e527fc3c7ccc41cdcb98f5c80fdd4f2b8c50eb1458196"},
- {file = "ruff-0.1.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:934832f6ed9b34a7d5feea58972635c2039c7a3b434fe5ba2ce015064cb6e955"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea0d3e950e394c4b332bcdd112aa566010a9f9c95814844a7468325290aabfd9"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9bd4025b9c5b429a48280785a2b71d479798a69f5c2919e7d274c5f4b32c3607"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1ad00662305dcb1e987f5ec214d31f7d6a062cae3e74c1cbccef15afd96611d"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:4b077ce83f47dd6bea1991af08b140e8b8339f0ba8cb9b7a484c30ebab18a23f"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4a88efecec23c37b11076fe676e15c6cdb1271a38f2b415e381e87fe4517f18"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b25093dad3b055667730a9b491129c42d45e11cdb7043b702e97125bcec48a1"},
- {file = "ruff-0.1.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:231d8fb11b2cc7c0366a326a66dafc6ad449d7fcdbc268497ee47e1334f66f77"},
- {file = "ruff-0.1.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:09c415716884950080921dd6237767e52e227e397e2008e2bed410117679975b"},
- {file = "ruff-0.1.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0f58948c6d212a6b8d41cd59e349751018797ce1727f961c2fa755ad6208ba45"},
- {file = "ruff-0.1.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:190a566c8f766c37074d99640cd9ca3da11d8deae2deae7c9505e68a4a30f740"},
- {file = "ruff-0.1.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6464289bd67b2344d2a5d9158d5eb81025258f169e69a46b741b396ffb0cda95"},
- {file = "ruff-0.1.11-py3-none-win32.whl", hash = "sha256:9b8f397902f92bc2e70fb6bebfa2139008dc72ae5177e66c383fa5426cb0bf2c"},
- {file = "ruff-0.1.11-py3-none-win_amd64.whl", hash = "sha256:eb85ee287b11f901037a6683b2374bb0ec82928c5cbc984f575d0437979c521a"},
- {file = "ruff-0.1.11-py3-none-win_arm64.whl", hash = "sha256:97ce4d752f964ba559c7023a86e5f8e97f026d511e48013987623915431c7ea9"},
- {file = "ruff-0.1.11.tar.gz", hash = "sha256:f9d4d88cb6eeb4dfe20f9f0519bd2eaba8119bde87c3d5065c541dbae2b5a2cb"},
+ {file = "ruff-0.5.5-py3-none-linux_armv6l.whl", hash = "sha256:605d589ec35d1da9213a9d4d7e7a9c761d90bba78fc8790d1c5e65026c1b9eaf"},
+ {file = "ruff-0.5.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:00817603822a3e42b80f7c3298c8269e09f889ee94640cd1fc7f9329788d7bf8"},
+ {file = "ruff-0.5.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:187a60f555e9f865a2ff2c6984b9afeffa7158ba6e1eab56cb830404c942b0f3"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe26fc46fa8c6e0ae3f47ddccfbb136253c831c3289bba044befe68f467bfb16"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ad25dd9c5faac95c8e9efb13e15803cd8bbf7f4600645a60ffe17c73f60779b"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f70737c157d7edf749bcb952d13854e8f745cec695a01bdc6e29c29c288fc36e"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:cfd7de17cef6ab559e9f5ab859f0d3296393bc78f69030967ca4d87a541b97a0"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a09b43e02f76ac0145f86a08e045e2ea452066f7ba064fd6b0cdccb486f7c3e7"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0b856cb19c60cd40198be5d8d4b556228e3dcd545b4f423d1ad812bfdca5884"},
+ {file = "ruff-0.5.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3687d002f911e8a5faf977e619a034d159a8373514a587249cc00f211c67a091"},
+ {file = "ruff-0.5.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ac9dc814e510436e30d0ba535f435a7f3dc97f895f844f5b3f347ec8c228a523"},
+ {file = "ruff-0.5.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:af9bdf6c389b5add40d89b201425b531e0a5cceb3cfdcc69f04d3d531c6be74f"},
+ {file = "ruff-0.5.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d40a8533ed545390ef8315b8e25c4bb85739b90bd0f3fe1280a29ae364cc55d8"},
+ {file = "ruff-0.5.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cab904683bf9e2ecbbe9ff235bfe056f0eba754d0168ad5407832928d579e7ab"},
+ {file = "ruff-0.5.5-py3-none-win32.whl", hash = "sha256:696f18463b47a94575db635ebb4c178188645636f05e934fdf361b74edf1bb2d"},
+ {file = "ruff-0.5.5-py3-none-win_amd64.whl", hash = "sha256:50f36d77f52d4c9c2f1361ccbfbd09099a1b2ea5d2b2222c586ab08885cf3445"},
+ {file = "ruff-0.5.5-py3-none-win_arm64.whl", hash = "sha256:3191317d967af701f1b73a31ed5788795936e423b7acce82a2b63e26eb3e89d6"},
+ {file = "ruff-0.5.5.tar.gz", hash = "sha256:cc5516bdb4858d972fbc31d246bdb390eab8df1a26e2353be2dbc0c2d7f5421a"},
]
[[package]]
@@ -3160,20 +3005,6 @@ pure-eval = "*"
[package.extras]
tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
-[[package]]
-name = "stevedore"
-version = "5.1.0"
-description = "Manage dynamic plugins for Python applications"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"},
- {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"},
-]
-
-[package.dependencies]
-pbr = ">=2.0.0,<2.1.0 || >2.1.0"
-
[[package]]
name = "svgwrite"
version = "1.4.3"
@@ -3508,4 +3339,4 @@ all = []
[metadata]
lock-version = "2.0"
python-versions = ">=3.8,<3.12"
-content-hash = "2556ccc74ba2190be8368061393473586299f54e8594ff6993d48d5896e6d1e2"
+content-hash = "1efd6ec1954ae465d6749859020797b91b2d177a2a37cc2bc089511382e1df8e"
diff --git a/pyproject.toml b/pyproject.toml
index 3511323..d8ed492 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -34,26 +34,23 @@ netutils = "^1.0.0"
capirca = "^2.0.6"
[tool.poetry.group.dev.dependencies]
-bandit = "*"
-black = "*"
coverage = "*"
django-debug-toolbar = "*"
-flake8 = "*"
invoke = "*"
ipython = "*"
pylint = "*"
pylint-django = "*"
pylint-nautobot = "*"
-ruff = "*"
+ruff = "0.5.5"
yamllint = "*"
toml = "*"
Markdown = "*"
+# Render custom markdown for version added/changed/remove notes
+markdown-version-annotations = "1.0.1"
# Rendering docs to HTML
mkdocs = "1.5.2"
# Material for MkDocs theme
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
mkdocstrings = "0.22.0"
mkdocstrings-python = "1.5.2"
@@ -65,29 +62,6 @@ jsonschema = "*"
all = [
]
-[tool.black]
-line-length = 120
-target-version = ['py38', 'py39', 'py310', 'py311']
-include = '\.pyi?$'
-exclude = '''
-(
- /(
- \.eggs # exclude a few common directories in the
- | \.git # root of the project
- | \.hg
- | \.mypy_cache
- | \.tox
- | \.venv
- | _build
- | buck-out
- | build
- | dist
- )/
- | settings.py # This is where you define files that should not be stylized by black
- # the root of the project
-)
-'''
-
[tool.pylint.master]
# Include the pylint_django plugin to avoid spurious warnings about Django patterns
load-plugins="pylint_django, pylint_nautobot"
@@ -98,8 +72,6 @@ ignore=".venv"
no-docstring-rgx="^(_|test_|Meta$)"
[tool.pylint.messages_control]
-# Line length is enforced by Black, so pylint doesn't need to check it.
-# Pylint and Black disagree about how to format multi-line arrays; Black wins.
disable = """,
line-too-long,
too-few-public-methods,
@@ -125,6 +97,9 @@ target-version = "py38"
[tool.ruff.lint]
select = [
"D", # pydocstyle
+ "F", "E", "W", # flake8
+ "S", # bandit
+ "I", # isort
]
ignore = [
# warning: `one-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible.
@@ -142,17 +117,19 @@ ignore = [
"D401", # First line of docstring should be in imperative mood
"D407", # Missing dashed underline after section
"D416", # Section name ends in colon
+ "E501", # Line too long
]
[tool.ruff.lint.pydocstyle]
convention = "google"
-[tool.ruff.per-file-ignores]
+[tool.ruff.lint.per-file-ignores]
"nautobot_firewall_models/migrations/*" = [
- "D", # pydocstyle
+ "D",
]
"nautobot_firewall_models/tests/*" = [
- "D", # pydocstyle
+ "D",
+ "S"
]
[build-system]
diff --git a/tasks.py b/tasks.py
index 1dfcae8..d909dee 100644
--- a/tasks.py
+++ b/tasks.py
@@ -159,17 +159,17 @@ def run_command(context, command, **kwargs):
# Check if nautobot is running, no need to start another nautobot container to run a command
docker_compose_status = "ps --services --filter status=running"
results = docker_compose(context, docker_compose_status, hide="out")
- if "nautobot" in results.stdout:
- compose_command = "exec"
- else:
- compose_command = "run --rm --entrypoint=''"
+ command_env_args = ""
if "command_env" in kwargs:
command_env = kwargs.pop("command_env")
for key, value in command_env.items():
- compose_command += f' --env="{key}={value}"'
+ command_env_args += f' --env="{key}={value}"'
- compose_command += f" -- nautobot {command}"
+ if "nautobot" in results.stdout:
+ compose_command = f"exec{command_env_args} nautobot {command}"
+ else:
+ compose_command = f"run{command_env_args} --rm --entrypoint='{command}' nautobot"
pty = kwargs.pop("pty", True)
@@ -494,7 +494,12 @@ def dbshell(context, db_name="", input_file="", output_file="", query=""):
f"> '{output_file}'" if output_file else "",
]
- docker_compose(context, " ".join(command), env=env, pty=not (input_file or output_file or query))
+ docker_compose(
+ context,
+ " ".join(command),
+ env=env,
+ pty=not (input_file or output_file or query),
+ )
@task(
@@ -519,9 +524,11 @@ def import_db(context, db_name="", input_file="dump.sql"):
'--execute="',
f"DROP DATABASE IF EXISTS {db_name};",
f"CREATE DATABASE {db_name};",
- ""
- if db_name == "$MYSQL_DATABASE"
- else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;",
+ (
+ ""
+ if db_name == "$MYSQL_DATABASE"
+ else f"GRANT ALL PRIVILEGES ON {db_name}.* TO $MYSQL_USER; FLUSH PRIVILEGES;"
+ ),
'"',
"&&",
"mysql",
@@ -647,28 +654,6 @@ def generate_release_notes(context, version=""):
# ------------------------------------------------------------------------------
# TESTS
# ------------------------------------------------------------------------------
-@task(
- help={
- "autoformat": "Apply formatting recommendations automatically, rather than failing if formatting is incorrect.",
- }
-)
-def black(context, autoformat=False):
- """Check Python code style with Black."""
- if autoformat:
- black_command = "black"
- else:
- black_command = "black --check --diff"
-
- command = f"{black_command} ."
-
- run_command(context, command)
-
-
-@task
-def flake8(context):
- """Check for PEP8 compliance and other style issues."""
- command = "flake8 . --config .flake8"
- run_command(context, command)
@task
@@ -688,38 +673,39 @@ def pylint(context):
@task(aliases=("a",))
def autoformat(context):
"""Run code autoformatting."""
- black(context, autoformat=True)
- ruff(context, fix=True)
+ ruff(context, action=["format"], fix=True)
@task(
help={
- "action": "One of 'lint', 'format', or 'both'",
- "fix": "Automatically fix selected action. May not be able to fix all.",
- "output_format": "see https://docs.astral.sh/ruff/settings/#output-format",
+ "action": "Available values are `['lint', 'format']`. Can be used multiple times. (default: `['lint', 'format']`)",
+ "target": "File or directory to inspect, repeatable (default: all files in the project will be inspected)",
+ "fix": "Automatically fix selected actions. May not be able to fix all issues found. (default: False)",
+ "output_format": "See https://docs.astral.sh/ruff/settings/#output-format for details. (default: `concise`)",
},
+ iterable=["action", "target"],
)
-def ruff(context, action="lint", fix=False, output_format="text"):
+def ruff(context, action=None, target=None, fix=False, output_format="concise"):
"""Run ruff to perform code formatting and/or linting."""
- if action != "lint":
- command = "ruff format"
- if not fix:
- command += " --check"
- command += " ."
- run_command(context, command)
- if action != "format":
- command = "ruff check"
- if fix:
- command += " --fix"
- command += f" --output-format {output_format} ."
- run_command(context, command)
+ if not action:
+ action = ["lint", "format"]
+ if not target:
+ target = ["."]
+ if "format" in action:
+ command = "ruff format "
+ if not fix:
+ command += "--check "
+ command += " ".join(target)
+ run_command(context, command, warn=True)
-@task
-def bandit(context):
- """Run bandit to validate basic static code security analysis."""
- command = "bandit --recursive . --configfile .bandit.yml"
- run_command(context, command)
+ if "lint" in action:
+ command = "ruff check "
+ if fix:
+ command += "--fix "
+ command += f"--output-format {output_format} "
+ command += " ".join(target)
+ run_command(context, command, warn=True)
@task
@@ -751,7 +737,7 @@ def check_migrations(context):
"verbose": "Enable verbose test output.",
}
)
-def unittest(
+def unittest( # noqa: PLR0913
context,
keepdb=False,
label="nautobot_firewall_models",
@@ -799,14 +785,8 @@ def tests(context, failfast=False, keepdb=False, lint_only=False):
print("Starting Docker Containers...")
start(context)
# Sorted loosely from fastest to slowest
- print("Running black...")
- black(context)
print("Running ruff...")
ruff(context)
- print("Running flake8...")
- flake8(context)
- print("Running bandit...")
- bandit(context)
print("Running yamllint...")
yamllint(context)
print("Running poetry check...")
@@ -839,11 +819,20 @@ def generate_app_config_schema(context):
- `NautobotAppConfig.required_settings`
"""
start(context, service="nautobot")
- nbshell(context, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "generate"})
+ nbshell(
+ context,
+ file="development/app_config_schema.py",
+ env={"APP_CONFIG_SCHEMA_COMMAND": "generate"},
+ )
@task
def validate_app_config(context):
"""Validate the app config based on the app config schema."""
start(context, service="nautobot")
- nbshell(context, plain=True, file="development/app_config_schema.py", env={"APP_CONFIG_SCHEMA_COMMAND": "validate"})
+ nbshell(
+ context,
+ plain=True,
+ file="development/app_config_schema.py",
+ env={"APP_CONFIG_SCHEMA_COMMAND": "validate"},
+ )
From 374f1da1ad31c0fa975c389e1f79fb01d1167360 Mon Sep 17 00:00:00 2001
From: bakebot
Date: Thu, 29 Aug 2024 03:40:55 +0000
Subject: [PATCH 03/21] Cookie updated by NetworkToCode Cookie Drift Manager
Tool
Template:
```
{
"template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"dir": "nautobot-app",
"ref": "refs/tags/nautobot-app-v2.3.2",
"path": null
}
```
Cookie:
```
{
"remote": "https://github.com/nautobot/nautobot-app-firewall-models.git",
"path": "/tmp/tmplayexxlv/nautobot-app-firewall-models",
"repository_path": "/tmp/tmplayexxlv/nautobot-app-firewall-models",
"dir": "",
"branch_prefix": "drift-manager",
"context": {
"codeowner_github_usernames": "@whitej6 @itdependsnetworks @jdrew82",
"full_name": "Network to Code, LLC",
"email": "opensource@networktocode.com",
"github_org": "nautobot",
"app_name": "nautobot_firewall_models",
"verbose_name": "Nautobot Firewall Models",
"app_slug": "nautobot-firewall-models",
"project_slug": "nautobot-app-firewall-models",
"repo_url": "https://github.com/nautobot/nautobot-app-firewall-models",
"base_url": "firewall-models",
"min_nautobot_version": "2.0.0",
"max_nautobot_version": "2.9999",
"camel_name": "NautobotFirewallModels",
"project_short_description": "Nautobot App to model firewall and security objects. Allows users to model policies in a vendor-neutral manner and use that data to drive network security automation",
"model_class_name": "None",
"open_source_license": "Apache-2.0",
"docs_base_url": "https://docs.nautobot.com",
"docs_app_url": "https://docs.nautobot.com/projects/firewall-models/en/latest",
"_template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"_output_dir": "/tmp/tmplayexxlv",
"_repo_dir": "/github/home/.cookiecutters/cookiecutter-nautobot-app/nautobot-app",
"_checkout": "refs/tags/nautobot-app-v2.3.2"
},
"base_branch": "develop",
"remote_name": "origin",
"pull_request_strategy": "PullRequestStrategy.CREATE",
"post_actions": [
"PostAction.BLACK"
],
"baked_commit_ref": "fcb62757ef4e78dd327cacb192ea19f1ac5344f8",
"draft": true
}
```
CLI Arguments:
```
{
"cookie_dir": "",
"input": false,
"json_filename": "",
"output_dir": "",
"push": true,
"template": "",
"template_dir": "",
"template_ref": "refs/tags/nautobot-app-v2.3.2",
"pull_request": null,
"post_action": [],
"disable_post_actions": false,
"draft": null
}
```
---
.cookiecutter.json | 4 +-
.github/workflows/ci.yml | 20 ++--
development/Dockerfile | 31 ++----
development/app_config_schema.py | 4 +-
development/nautobot_config.py | 12 ++-
docs/requirements.txt | 9 +-
invoke.example.yml | 19 ++--
mkdocs.yml | 2 +-
nautobot_firewall_models/tests/test_basic.py | 18 +++-
pyproject.toml | 37 ++++---
tasks.py | 104 ++++++++++++++++---
11 files changed, 176 insertions(+), 84 deletions(-)
diff --git a/.cookiecutter.json b/.cookiecutter.json
index e47427a..fad69f7 100644
--- a/.cookiecutter.json
+++ b/.cookiecutter.json
@@ -21,7 +21,7 @@
"_drift_manager": {
"template": "https://github.com/nautobot/cookiecutter-nautobot-app.git",
"template_dir": "nautobot-app",
- "template_ref": "refs/tags/nautobot-app-v2.3.0",
+ "template_ref": "refs/tags/nautobot-app-v2.3.2",
"cookie_dir": "",
"branch_prefix": "drift-manager",
"pull_request_strategy": "create",
@@ -29,7 +29,7 @@
"black"
],
"draft": true,
- "baked_commit_ref": "fcb62757ef4e78dd327cacb192ea19f1ac5344f8"
+ "baked_commit_ref": "76075295fc33cea874dc8bbe7fac35f83b2b6869"
}
}
}
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9ddb57c..89fcc7d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -13,7 +13,7 @@ on: # yamllint disable-line rule:truthy rule:comments
pull_request: ~
env:
- APP_NAME: "nautobot-app-firewall-models"
+ APP_NAME: "nautobot-firewall-models"
jobs:
ruff-format:
@@ -91,6 +91,10 @@ jobs:
uses: "actions/checkout@v4"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v6"
+ - name: "Constrain Nautobot version and regenerate lock file"
+ env:
+ INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "true"
+ run: "poetry run invoke lock --constrain-nautobot-ver --constrain-python-ver"
- name: "Set up Docker Buildx"
id: "buildx"
uses: "docker/setup-buildx-action@v3"
@@ -108,6 +112,7 @@ jobs:
build-args: |
NAUTOBOT_VER=${{ matrix.nautobot-version }}
PYTHON_VER=${{ matrix.python-version }}
+ CI=true
- name: "Copy credentials"
run: "cp development/creds.example.env development/creds.env"
- name: "Linting: pylint"
@@ -122,16 +127,16 @@ jobs:
strategy:
fail-fast: true
matrix:
- python-version: ["3.8", "3.11"]
+ python-version: ["3.8", "3.12"]
db-backend: ["postgresql"]
nautobot-version: ["stable"]
include:
- python-version: "3.11"
db-backend: "postgresql"
nautobot-version: "2.0.0"
- # - python-version: "3.11"
- # db-backend: "mysql"
- # nautobot-version: "stable"
+ - python-version: "3.12"
+ db-backend: "mysql"
+ nautobot-version: "stable"
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_FIREWALL_MODELS_PYTHON_VER: "${{ matrix.python-version }}"
@@ -158,6 +163,7 @@ jobs:
build-args: |
NAUTOBOT_VER=${{ matrix.nautobot-version }}
PYTHON_VER=${{ matrix.python-version }}
+ CI=true
- name: "Copy credentials"
run: "cp development/creds.example.env development/creds.env"
- name: "Use Mysql invoke settings when needed"
@@ -195,7 +201,7 @@ jobs:
- name: "Set up Python"
uses: "actions/setup-python@v5"
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: "Install Python Packages"
run: "pip install poetry"
- name: "Set env"
@@ -230,7 +236,7 @@ jobs:
- name: "Set up Python"
uses: "actions/setup-python@v5"
with:
- python-version: "3.11"
+ python-version: "3.12"
- name: "Install Python Packages"
run: "pip install poetry"
- name: "Set env"
diff --git a/development/Dockerfile b/development/Dockerfile
index b43662e..660336c 100644
--- a/development/Dockerfile
+++ b/development/Dockerfile
@@ -53,29 +53,18 @@ RUN which poetry || curl -sSL https://install.python-poetry.org | python3 - && \
WORKDIR /source
COPY . /source
-# Get container's installed Nautobot version as a forced constraint
-# NAUTOBOT_VER may be a branch name and not a published release therefor we need to get the installed version
-# so pip can use it to recognize local constraints.
-RUN pip show nautobot | grep "^Version: " | sed -e 's/Version: /nautobot==/' > constraints.txt
+# Build args must be declared in each stage
+ARG PYTHON_VER
-# Use Poetry to grab dev dependencies from the lock file
-# Can be improved in Poetry 1.2 which allows `poetry install --only dev`
-#
-# We can't use the entire freeze as it takes forever to resolve with rigidly fixed non-direct dependencies,
-# especially those that are only direct to Nautobot but the container included versions slightly mismatch
-RUN poetry export -f requirements.txt --without-hashes --extras all --output poetry_freeze_base.txt
-RUN poetry export -f requirements.txt --without-hashes --extras all --with dev --output poetry_freeze_all.txt
-RUN sort poetry_freeze_base.txt poetry_freeze_all.txt | uniq -u > poetry_freeze_dev.txt
-
-# Install all local project as editable, constrained on Nautobot version, to get any additional
-# direct dependencies of the app
-RUN --mount=type=cache,target="/root/.cache/pip",sharing=locked \
- pip install -c constraints.txt -e .[all]
+# Constrain the Nautobot version to NAUTOBOT_VER
+# In CI, this should be done outside of the Dockerfile to prevent cross-compile build failures
+ARG CI
+RUN if [ -z "${CI+x}" ]; then \
+ INSTALLED_NAUTOBOT_VER=$(pip show nautobot | grep "^Version" | sed "s/Version: //"); \
+ poetry add --lock nautobot@${INSTALLED_NAUTOBOT_VER} --python ${PYTHON_VER}; fi
-# Install any dev dependencies frozen from Poetry
-# Can be improved in Poetry 1.2 which allows `poetry install --only dev`
-RUN --mount=type=cache,target="/root/.cache/pip",sharing=locked \
- pip install -c constraints.txt -r poetry_freeze_dev.txt
+# Install the app
+RUN poetry install --extras all --with dev
COPY development/nautobot_config.py ${NAUTOBOT_ROOT}/nautobot_config.py
# !!! USE CAUTION WHEN MODIFYING LINES ABOVE
diff --git a/development/app_config_schema.py b/development/app_config_schema.py
index a779b14..e52e247 100644
--- a/development/app_config_schema.py
+++ b/development/app_config_schema.py
@@ -40,7 +40,9 @@ def _main():
**SchemaBuilder().to_json_schema(app_config), # type: ignore
}
app_config = import_module(package_name).config
- _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings)
+ _enrich_object_schema(
+ schema, app_config.default_settings, app_config.required_settings
+ )
schema_path.write_text(json.dumps(schema, indent=4) + "\n")
print(f"\n==================\nGenerated schema:\n\n{schema_path}\n")
print(
diff --git a/development/nautobot_config.py b/development/nautobot_config.py
index a9fdd3c..47fa772 100644
--- a/development/nautobot_config.py
+++ b/development/nautobot_config.py
@@ -18,8 +18,12 @@
if "debug_toolbar" not in INSTALLED_APPS: # noqa: F405
INSTALLED_APPS.append("debug_toolbar") # noqa: F405
- if "debug_toolbar.middleware.DebugToolbarMiddleware" not in MIDDLEWARE: # noqa: F405
- MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware") # noqa: F405
+ if (
+ "debug_toolbar.middleware.DebugToolbarMiddleware" not in MIDDLEWARE
+ ): # noqa: F405
+ MIDDLEWARE.insert(
+ 0, "debug_toolbar.middleware.DebugToolbarMiddleware"
+ ) # noqa: F405
#
# Misc. settings
@@ -51,7 +55,9 @@
"NAUTOBOT_DB_PORT",
default_db_settings[nautobot_db_engine]["NAUTOBOT_DB_PORT"],
), # Database port, default to postgres
- "CONN_MAX_AGE": int(os.getenv("NAUTOBOT_DB_TIMEOUT", "300")), # Database timeout
+ "CONN_MAX_AGE": int(
+ os.getenv("NAUTOBOT_DB_TIMEOUT", "300")
+ ), # Database timeout
"ENGINE": nautobot_db_engine,
}
}
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 1d89ad0..bf10c13 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,5 +1,6 @@
-mkdocs==1.5.2
-mkdocs-material==9.1.15
+mkdocs==1.6.0
+mkdocs-material==9.5.32
markdown-version-annotations==1.0.1
-mkdocstrings-python==1.5.2
-mkdocstrings==0.22.0
+griffe==1.1.1
+mkdocstrings-python==1.10.8
+mkdocstrings==0.25.2
diff --git a/invoke.example.yml b/invoke.example.yml
index 8e0c282..95d1e53 100644
--- a/invoke.example.yml
+++ b/invoke.example.yml
@@ -1,12 +1,15 @@
---
nautobot_firewall_models:
- project_name: "nautobot-firewall-models"
nautobot_ver: "2.0.0"
- local: false
python_ver: "3.11"
- compose_dir: "development"
- compose_files:
- - "docker-compose.base.yml"
- - "docker-compose.redis.yml"
- - "docker-compose.postgres.yml"
- - "docker-compose.dev.yml"
+ # local: false
+ # compose_dir: "/full/path/to/nautobot-app-firewall-models/development"
+
+# The following is an example of using MySQL as the database backend
+# ---
+# nautobot_firewall_models:
+# compose_files:
+# - "docker-compose.base.yml"
+# - "docker-compose.redis.yml"
+# - "docker-compose.mysql.yml"
+# - "docker-compose.dev.yml"
diff --git a/mkdocs.yml b/mkdocs.yml
index fbdd9a1..18470ce 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,6 +1,6 @@
---
dev_addr: "127.0.0.1:8001"
-edit_uri: "edit/main/nautobot-app-firewall-models/docs"
+edit_uri: "edit/main/docs"
site_dir: "nautobot_firewall_models/static/nautobot_firewall_models/docs"
site_name: "Nautobot Firewall Models Documentation"
site_url: "https://docs.nautobot.com/projects/firewall-models/en/latest/"
diff --git a/nautobot_firewall_models/tests/test_basic.py b/nautobot_firewall_models/tests/test_basic.py
index d72f2d0..83142fa 100644
--- a/nautobot_firewall_models/tests/test_basic.py
+++ b/nautobot_firewall_models/tests/test_basic.py
@@ -11,11 +11,21 @@ class TestDocsPackaging(unittest.TestCase):
def test_version(self):
"""Verify that pyproject.toml dev dependencies have the same versions as in the docs requirements.txt."""
- parent_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
+ parent_path = os.path.dirname(
+ os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+ )
poetry_path = os.path.join(parent_path, "pyproject.toml")
- poetry_details = toml.load(poetry_path)["tool"]["poetry"]["group"]["dev"]["dependencies"]
- with open(f"{parent_path}/docs/requirements.txt", "r", encoding="utf-8") as file:
- requirements = [line for line in file.read().splitlines() if (len(line) > 0 and not line.startswith("#"))]
+ poetry_details = toml.load(poetry_path)["tool"]["poetry"]["group"]["dev"][
+ "dependencies"
+ ]
+ with open(
+ f"{parent_path}/docs/requirements.txt", "r", encoding="utf-8"
+ ) as file:
+ requirements = [
+ line
+ for line in file.read().splitlines()
+ if (len(line) > 0 and not line.startswith("#"))
+ ]
for pkg in requirements:
package_name = pkg
if len(pkg.split("==")) == 2: # noqa: PLR2004
diff --git a/pyproject.toml b/pyproject.toml
index d8ed492..309dc08 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -17,6 +17,7 @@ classifiers = [
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
+ "Programming Language :: Python :: 3.12",
]
packages = [
{ include = "nautobot_firewall_models" },
@@ -27,7 +28,7 @@ include = [
]
[tool.poetry.dependencies]
-python = ">=3.8,<3.12"
+python = ">=3.8,<3.13"
# Used for local development
nautobot = "^2.0.0"
netutils = "^1.0.0"
@@ -48,12 +49,13 @@ Markdown = "*"
# Render custom markdown for version added/changed/remove notes
markdown-version-annotations = "1.0.1"
# Rendering docs to HTML
-mkdocs = "1.5.2"
+mkdocs = "1.6.0"
# Material for MkDocs theme
-mkdocs-material = "9.1.15"
+mkdocs-material = "9.5.32"
# Automatic documentation from sources, for MkDocs
-mkdocstrings = "0.22.0"
-mkdocstrings-python = "1.5.2"
+mkdocstrings = "0.25.2"
+mkdocstrings-python = "1.10.8"
+griffe = "1.1.1"
towncrier = "~23.6.0"
to-json-schema = "*"
jsonschema = "*"
@@ -64,12 +66,12 @@ all = [
[tool.pylint.master]
# Include the pylint_django plugin to avoid spurious warnings about Django patterns
-load-plugins="pylint_django, pylint_nautobot"
-ignore=".venv"
+load-plugins = "pylint_django, pylint_nautobot"
+ignore = ".venv"
[tool.pylint.basic]
# No docstrings required for private methods (Pylint default), or for test_ functions, or for inner Meta classes.
-no-docstring-rgx="^(_|test_|Meta$)"
+no-docstring-rgx = "^(_|test_|Meta$)"
[tool.pylint.messages_control]
disable = """,
@@ -98,26 +100,27 @@ target-version = "py38"
select = [
"D", # pydocstyle
"F", "E", "W", # flake8
+ "PL", # pylint
"S", # bandit
"I", # isort
]
ignore = [
# warning: `one-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible.
- "D203", # 1 blank line required before class docstring
+ "D203", # 1 blank line required before class docstring
# D212 is enabled by default in google convention, and complains if we have a docstring like:
# """
# My docstring is on the line after the opening quotes instead of on the same line as them.
# """
# We've discussed and concluded that we consider this to be a valid style choice.
- "D212", # Multi-line docstring summary should start at the first line
- "D213", # Multi-line docstring summary should start at the second line
-
- # Produces issues in the current codebase.
- "D401", # First line of docstring should be in imperative mood
- "D407", # Missing dashed underline after section
- "D416", # Section name ends in colon
- "E501", # Line too long
+ "D212", # Multi-line docstring summary should start at the first line
+ "D213", # Multi-line docstring summary should start at the second line
+
+ # Produces a lot of issues in the current codebase.
+ "D401", # First line of docstring should be in imperative mood
+ "D407", # Missing dashed underline after section
+ "D416", # Section name ends in colon
+ "E501", # Line too long
]
[tool.ruff.lint.pydocstyle]
diff --git a/tasks.py b/tasks.py
index d909dee..2e0bfd5 100644
--- a/tasks.py
+++ b/tasks.py
@@ -13,10 +13,12 @@
"""
import os
+import re
from pathlib import Path
from time import sleep
from invoke.collection import Collection
+from invoke.exceptions import Exit
from invoke.tasks import task as invoke_task
@@ -48,7 +50,7 @@ def is_truthy(arg):
namespace.configure(
{
"nautobot_firewall_models": {
- "nautobot_ver": "2.0.0",
+ "nautobot_ver": "2.3.1",
"project_name": "nautobot-firewall-models",
"python_ver": "3.11",
"local": False,
@@ -66,11 +68,15 @@ def is_truthy(arg):
def _is_compose_included(context, name):
- return f"docker-compose.{name}.yml" in context.nautobot_firewall_models.compose_files
+ return (
+ f"docker-compose.{name}.yml" in context.nautobot_firewall_models.compose_files
+ )
def _await_healthy_service(context, service):
- container_id = docker_compose(context, f"ps -q -- {service}", pty=False, echo=False, hide=True).stdout.strip()
+ container_id = docker_compose(
+ context, f"ps -q -- {service}", pty=False, echo=False, hide=True
+ ).stdout.strip()
_await_healthy_container(context, container_id)
@@ -130,7 +136,9 @@ def docker_compose(context, command, **kwargs):
]
for compose_file in context.nautobot_firewall_models.compose_files:
- compose_file_path = os.path.join(context.nautobot_firewall_models.compose_dir, compose_file)
+ compose_file_path = os.path.join(
+ context.nautobot_firewall_models.compose_dir, compose_file
+ )
compose_command_tokens.append(f' -f "{compose_file_path}"')
compose_command_tokens.append(command)
@@ -169,7 +177,9 @@ def run_command(context, command, **kwargs):
if "nautobot" in results.stdout:
compose_command = f"exec{command_env_args} nautobot {command}"
else:
- compose_command = f"run{command_env_args} --rm --entrypoint='{command}' nautobot"
+ compose_command = (
+ f"run{command_env_args} --rm --entrypoint='{command}' nautobot"
+ )
pty = kwargs.pop("pty", True)
@@ -194,7 +204,9 @@ def build(context, force_rm=False, cache=True):
if force_rm:
command += " --force-rm"
- print(f"Building Nautobot with Python {context.nautobot_firewall_models.python_ver}...")
+ print(
+ f"Building Nautobot with Python {context.nautobot_firewall_models.python_ver}..."
+ )
docker_compose(context, command)
@@ -205,17 +217,65 @@ def generate_packages(context):
run_command(context, command)
+def _get_docker_nautobot_version(context, nautobot_ver=None, python_ver=None):
+ """Extract Nautobot version from base docker image."""
+ if nautobot_ver is None:
+ nautobot_ver = context.nautobot_firewall_models.nautobot_ver
+ if python_ver is None:
+ python_ver = context.nautobot_firewall_models.python_ver
+ dockerfile_path = os.path.join(
+ context.nautobot_firewall_models.compose_dir, "Dockerfile"
+ )
+ base_image = (
+ context.run(f"grep --max-count=1 '^FROM ' {dockerfile_path}", hide=True)
+ .stdout.strip()
+ .split(" ")[1]
+ )
+ base_image = base_image.replace(r"${NAUTOBOT_VER}", nautobot_ver).replace(
+ r"${PYTHON_VER}", python_ver
+ )
+ pip_nautobot_ver = context.run(
+ f"docker run --rm --entrypoint '' {base_image} pip show nautobot", hide=True
+ )
+ match_version = re.search(
+ r"^Version: (.+)$", pip_nautobot_ver.stdout.strip(), flags=re.MULTILINE
+ )
+ if match_version:
+ return match_version.group(1)
+ else:
+ raise Exit(f"Nautobot version not found in Docker base image {base_image}.")
+
+
@task(
help={
"check": (
"If enabled, check for outdated dependencies in the poetry.lock file, "
"instead of generating a new one. (default: disabled)"
- )
+ ),
+ "constrain_nautobot_ver": (
+ "Run 'poetry add nautobot@[version] --lock' to generate the lockfile, "
+ "where [version] is the version installed in the Dockerfile's base image. "
+ "Generally intended to be used in CI and not for local development. (default: disabled)"
+ ),
+ "constrain_python_ver": (
+ "When using `constrain_nautobot_ver`, further constrain the nautobot version "
+ "to python_ver so that poetry doesn't complain about python version incompatibilities. "
+ "Generally intended to be used in CI and not for local development. (default: disabled)"
+ ),
}
)
-def lock(context, check=False):
- """Generate poetry.lock inside the Nautobot container."""
- run_command(context, f"poetry {'check' if check else 'lock --no-update'}")
+def lock(
+ context, check=False, constrain_nautobot_ver=False, constrain_python_ver=False
+):
+ """Generate poetry.lock file."""
+ if constrain_nautobot_ver:
+ docker_nautobot_version = _get_docker_nautobot_version(context)
+ command = f"poetry add --lock nautobot@{docker_nautobot_version}"
+ if constrain_python_ver:
+ command += f" --python {context.nautobot_firewall_models.python_ver}"
+ else:
+ command = f"poetry {'check' if check else 'lock --no-update'}"
+ run_command(context, command)
# ------------------------------------------------------------------------------
@@ -246,7 +306,9 @@ def restart(context, service=""):
def stop(context, service=""):
"""Stop specified or all services, if service is not specified, remove all containers."""
print("Stopping Nautobot...")
- docker_compose(context, "stop" if service else "down --remove-orphans", service=service)
+ docker_compose(
+ context, "stop" if service else "down --remove-orphans", service=service
+ )
@task(
@@ -265,7 +327,9 @@ def destroy(context, volumes=True, import_db_file=""):
return
if not volumes:
- raise ValueError("Cannot specify `--no-volumes` and `--import-db-file` arguments at the same time.")
+ raise ValueError(
+ "Cannot specify `--no-volumes` and `--import-db-file` arguments at the same time."
+ )
print(f"Importing database file: {import_db_file}...")
@@ -282,12 +346,16 @@ def destroy(context, volumes=True, import_db_file=""):
"db",
]
- container_id = docker_compose(context, " ".join(command), pty=False, echo=False, hide=True).stdout.strip()
+ container_id = docker_compose(
+ context, " ".join(command), pty=False, echo=False, hide=True
+ ).stdout.strip()
_await_healthy_container(context, container_id)
print("Stopping database container...")
context.run(f"docker stop {container_id}", pty=False, echo=False, hide=True)
- print("Database import complete, you can start Nautobot with the following command:")
+ print(
+ "Database import complete, you can start Nautobot with the following command:"
+ )
print("invoke start")
@@ -459,7 +527,9 @@ def dbshell(context, db_name="", input_file="", output_file="", query=""):
if input_file and query:
raise ValueError("Cannot specify both, `input_file` and `query` arguments")
if output_file and not (input_file or query):
- raise ValueError("`output_file` argument requires `input_file` or `query` argument")
+ raise ValueError(
+ "`output_file` argument requires `input_file` or `query` argument"
+ )
env = {}
if query:
@@ -597,7 +667,9 @@ def backup_db(context, db_name="", output_file="dump.sql", readable=True):
docker_compose(context, " ".join(command), pty=False)
print(50 * "=")
- print("The database backup has been successfully completed and saved to the following file:")
+ print(
+ "The database backup has been successfully completed and saved to the following file:"
+ )
print(output_file)
print("You can import this database backup with the following command:")
print(f"invoke import-db --input-file '{output_file}'")
From bfa55d332ab8c63dcbfa881b73c437a425a81ed8 Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Wed, 4 Sep 2024 10:02:33 -0500
Subject: [PATCH 04/21] Ruff, Poetry Lock and change fragment.
---
changes/266.housekeeping | 1 +
development/app_config_schema.py | 4 +-
development/nautobot_config.py | 12 +-
nautobot_firewall_models/api/serializers.py | 5 +-
nautobot_firewall_models/tests/fixtures.py | 2 +-
nautobot_firewall_models/tests/test_basic.py | 18 +-
.../tests/test_capirca.py | 2 +-
nautobot_firewall_models/tests/test_models.py | 2 +-
.../tests/test_ui_views.py | 2 +-
poetry.lock | 857 ++++++++++++------
pyproject.toml | 1 -
tasks.py | 70 +-
12 files changed, 593 insertions(+), 383 deletions(-)
create mode 100644 changes/266.housekeeping
diff --git a/changes/266.housekeeping b/changes/266.housekeeping
new file mode 100644
index 0000000..f62bb68
--- /dev/null
+++ b/changes/266.housekeeping
@@ -0,0 +1 @@
+Rebaked from the cookie `nautobot-app-v2.3.2`.
\ No newline at end of file
diff --git a/development/app_config_schema.py b/development/app_config_schema.py
index e52e247..a779b14 100644
--- a/development/app_config_schema.py
+++ b/development/app_config_schema.py
@@ -40,9 +40,7 @@ def _main():
**SchemaBuilder().to_json_schema(app_config), # type: ignore
}
app_config = import_module(package_name).config
- _enrich_object_schema(
- schema, app_config.default_settings, app_config.required_settings
- )
+ _enrich_object_schema(schema, app_config.default_settings, app_config.required_settings)
schema_path.write_text(json.dumps(schema, indent=4) + "\n")
print(f"\n==================\nGenerated schema:\n\n{schema_path}\n")
print(
diff --git a/development/nautobot_config.py b/development/nautobot_config.py
index 47fa772..a9fdd3c 100644
--- a/development/nautobot_config.py
+++ b/development/nautobot_config.py
@@ -18,12 +18,8 @@
if "debug_toolbar" not in INSTALLED_APPS: # noqa: F405
INSTALLED_APPS.append("debug_toolbar") # noqa: F405
- if (
- "debug_toolbar.middleware.DebugToolbarMiddleware" not in MIDDLEWARE
- ): # noqa: F405
- MIDDLEWARE.insert(
- 0, "debug_toolbar.middleware.DebugToolbarMiddleware"
- ) # noqa: F405
+ if "debug_toolbar.middleware.DebugToolbarMiddleware" not in MIDDLEWARE: # noqa: F405
+ MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware") # noqa: F405
#
# Misc. settings
@@ -55,9 +51,7 @@
"NAUTOBOT_DB_PORT",
default_db_settings[nautobot_db_engine]["NAUTOBOT_DB_PORT"],
), # Database port, default to postgres
- "CONN_MAX_AGE": int(
- os.getenv("NAUTOBOT_DB_TIMEOUT", "300")
- ), # Database timeout
+ "CONN_MAX_AGE": int(os.getenv("NAUTOBOT_DB_TIMEOUT", "300")), # Database timeout
"ENGINE": nautobot_db_engine,
}
}
diff --git a/nautobot_firewall_models/api/serializers.py b/nautobot_firewall_models/api/serializers.py
index f250c27..8e86bbb 100644
--- a/nautobot_firewall_models/api/serializers.py
+++ b/nautobot_firewall_models/api/serializers.py
@@ -43,9 +43,8 @@ def validate(self, data):
if vrf is not None:
if qs.filter(start_address=start_address, end_address=end_address, vrf=vrf).exists():
raise serializers.ValidationError("The fields start_address, end_address, vrf must make a unique set.")
- else:
- if qs.filter(start_address=start_address, end_address=end_address, vrf__isnull=True).exists():
- raise serializers.ValidationError("The fields start_address, end_address must make a unique set.")
+ elif qs.filter(start_address=start_address, end_address=end_address, vrf__isnull=True).exists():
+ raise serializers.ValidationError("The fields start_address, end_address must make a unique set.")
return super().validate(data)
diff --git a/nautobot_firewall_models/tests/fixtures.py b/nautobot_firewall_models/tests/fixtures.py
index b9aadf1..51b7d37 100644
--- a/nautobot_firewall_models/tests/fixtures.py
+++ b/nautobot_firewall_models/tests/fixtures.py
@@ -1,6 +1,6 @@
"""Create basic objects for use in test class setup."""
-# noqa: F403, F405
+# ruff: noqa: F403, F405
from django.contrib.contenttypes.models import ContentType
from nautobot.dcim.models import Device, DeviceType, Location, LocationType, Manufacturer, Platform
from nautobot.extras.models import DynamicGroup, Job, Role
diff --git a/nautobot_firewall_models/tests/test_basic.py b/nautobot_firewall_models/tests/test_basic.py
index 83142fa..d72f2d0 100644
--- a/nautobot_firewall_models/tests/test_basic.py
+++ b/nautobot_firewall_models/tests/test_basic.py
@@ -11,21 +11,11 @@ class TestDocsPackaging(unittest.TestCase):
def test_version(self):
"""Verify that pyproject.toml dev dependencies have the same versions as in the docs requirements.txt."""
- parent_path = os.path.dirname(
- os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
- )
+ parent_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
poetry_path = os.path.join(parent_path, "pyproject.toml")
- poetry_details = toml.load(poetry_path)["tool"]["poetry"]["group"]["dev"][
- "dependencies"
- ]
- with open(
- f"{parent_path}/docs/requirements.txt", "r", encoding="utf-8"
- ) as file:
- requirements = [
- line
- for line in file.read().splitlines()
- if (len(line) > 0 and not line.startswith("#"))
- ]
+ poetry_details = toml.load(poetry_path)["tool"]["poetry"]["group"]["dev"]["dependencies"]
+ with open(f"{parent_path}/docs/requirements.txt", "r", encoding="utf-8") as file:
+ requirements = [line for line in file.read().splitlines() if (len(line) > 0 and not line.startswith("#"))]
for pkg in requirements:
package_name = pkg
if len(pkg.split("==")) == 2: # noqa: PLR2004
diff --git a/nautobot_firewall_models/tests/test_capirca.py b/nautobot_firewall_models/tests/test_capirca.py
index 7373e06..2f4dfa5 100644
--- a/nautobot_firewall_models/tests/test_capirca.py
+++ b/nautobot_firewall_models/tests/test_capirca.py
@@ -1,6 +1,6 @@
"""Test Capirca Utils."""
-# noqa: F403, F405
+# ruff: noqa: F403, F405
# pylint: disable=protected-access
from unittest import skip
from unittest.mock import patch
diff --git a/nautobot_firewall_models/tests/test_models.py b/nautobot_firewall_models/tests/test_models.py
index 0f58a1c..af6d6de 100644
--- a/nautobot_firewall_models/tests/test_models.py
+++ b/nautobot_firewall_models/tests/test_models.py
@@ -1,6 +1,6 @@
"""Test Firewall models."""
-# noqa: F403, F405
+# ruff: noqa: F403, F405
# pylint: disable=invalid-name
from django.core.exceptions import ValidationError
from django.test import TestCase
diff --git a/nautobot_firewall_models/tests/test_ui_views.py b/nautobot_firewall_models/tests/test_ui_views.py
index bb70519..c038b56 100644
--- a/nautobot_firewall_models/tests/test_ui_views.py
+++ b/nautobot_firewall_models/tests/test_ui_views.py
@@ -1,6 +1,6 @@
"""Unit tests for views."""
-# noqa: F403, F405
+# ruff: noqa: F403, F405
# pylint: disable=invalid-name
# pylint: disable=duplicate-code
from nautobot.apps.testing import ViewTestCases
diff --git a/poetry.lock b/poetry.lock
index 366ae1b..fb27256 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -101,6 +101,21 @@ six = ">=1.12.0"
astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
+[[package]]
+name = "astunparse"
+version = "1.6.3"
+description = "An AST unparser for Python"
+optional = false
+python-versions = "*"
+files = [
+ {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"},
+ {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"},
+]
+
+[package.dependencies]
+six = ">=1.6.1,<2.0"
+wheel = ">=0.23.0,<1.0"
+
[[package]]
name = "async-timeout"
version = "4.0.3"
@@ -131,6 +146,38 @@ tests = ["attrs[tests-no-zope]", "zope-interface"]
tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"]
tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"]
+[[package]]
+name = "autopep8"
+version = "2.3.1"
+description = "A tool that automatically formats Python code to conform to the PEP 8 style guide"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "autopep8-2.3.1-py2.py3-none-any.whl", hash = "sha256:a203fe0fcad7939987422140ab17a930f684763bf7335bdb6709991dd7ef6c2d"},
+ {file = "autopep8-2.3.1.tar.gz", hash = "sha256:8d6c87eba648fdcfc83e29b788910b8643171c395d9c4bcf115ece035b9c9dda"},
+]
+
+[package.dependencies]
+pycodestyle = ">=2.12.0"
+tomli = {version = "*", markers = "python_version < \"3.11\""}
+
+[[package]]
+name = "babel"
+version = "2.16.0"
+description = "Internationalization utilities"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
+ {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
+]
+
+[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"
@@ -683,19 +730,20 @@ graph = ["objgraph (>=1.7.2)"]
[[package]]
name = "django"
-version = "3.2.23"
-description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
+version = "4.2.16"
+description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "Django-3.2.23-py3-none-any.whl", hash = "sha256:d48608d5f62f2c1e260986835db089fa3b79d6f58510881d316b8d88345ae6e1"},
- {file = "Django-3.2.23.tar.gz", hash = "sha256:82968f3640e29ef4a773af2c28448f5f7a08d001c6ac05b32d02aeee6509508b"},
+ {file = "Django-4.2.16-py3-none-any.whl", hash = "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898"},
+ {file = "Django-4.2.16.tar.gz", hash = "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad"},
]
[package.dependencies]
-asgiref = ">=3.3.2,<4"
-pytz = "*"
-sqlparse = ">=0.2.2"
+asgiref = ">=3.6.0,<4"
+"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
+sqlparse = ">=0.3.1"
+tzdata = {version = "*", markers = "sys_platform == \"win32\""}
[package.extras]
argon2 = ["argon2-cffi (>=19.1.0)"]
@@ -714,78 +762,79 @@ 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"
-version = "2.9.1"
+version = "3.1.0"
description = "Django live settings with pluggable backends, including Redis."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
files = [
- {file = "django-constance-2.9.1.tar.gz", hash = "sha256:4c6a96a5f2cbce1bc3fa41aa20566b6ee26fbd896c9f91f996518a3a0904f6c8"},
- {file = "django_constance-2.9.1-py3-none-any.whl", hash = "sha256:bf0b392efa18a1f3f464eddb7eb36ac5c02598354a5e31d0d4ce4fc8b535694b"},
+ {file = "django-constance-3.1.0.tar.gz", hash = "sha256:2b96e51de63751ef63f8f92f74e0f6aea30fb6453f3a736c21e1f8b3f6cf0b4f"},
+ {file = "django_constance-3.1.0-py3-none-any.whl", hash = "sha256:6242486a346e396d765a9333d17f3101c8613cabc92e0b98dcb70c2a391bc53b"},
]
[package.dependencies]
-django-picklefield = {version = "*", optional = true, markers = "extra == \"database\""}
+django-picklefield = "*"
[package.extras]
-database = ["django-picklefield"]
redis = ["redis"]
[[package]]
name = "django-cors-headers"
-version = "4.2.0"
+version = "4.4.0"
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.4.0-py3-none-any.whl", hash = "sha256:5c6e3b7fe870876a1efdfeb4f433782c3524078fa0dc9e0195f6706ce7a242f6"},
+ {file = "django_cors_headers-4.4.0.tar.gz", hash = "sha256:92cf4633e22af67a230a1456cb1b7a02bb213d6536d2dcb2a4a24092ea9cebc2"},
]
[package.dependencies]
-Django = ">=3.2"
+asgiref = ">=3.6"
+django = ">=3.2"
[[package]]
name = "django-db-file-storage"
-version = "0.5.5"
+version = "0.5.6.1"
description = "Custom FILE_STORAGE for Django. Saves files in your database instead of your file system."
optional = false
python-versions = "*"
files = [
- {file = "django-db-file-storage-0.5.5.tar.gz", hash = "sha256:5d5da694b78ab202accab4508b958e0e37b3d146310e76f6f6125e1bdeaaad14"},
+ {file = "django-db-file-storage-0.5.6.1.tar.gz", hash = "sha256:f0c4540ed6b772e8b3141eae3222acde4c29ab771477a5c999013a3980856c7f"},
+ {file = "django_db_file_storage-0.5.6.1-py3-none-any.whl", hash = "sha256:3feac1e060b550c3c03c35e95d2111d9f100bc247863ace691a78b107f1fc3d5"},
]
[package.dependencies]
@@ -822,27 +871,27 @@ Django = ">=3.2"
[[package]]
name = "django-filter"
-version = "23.1"
+version = "24.2"
description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
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-24.2.tar.gz", hash = "sha256:48e5fc1da3ccd6ca0d5f9bb550973518ce977a4edde9d2a8a154a7f4f0b9f96e"},
+ {file = "django_filter-24.2-py3-none-any.whl", hash = "sha256:df2ee9857e18d38bed203c8745f62a803fa0f31688c9fe6f8e868120b1848e48"},
]
[package.dependencies]
-Django = ">=3.2"
+Django = ">=4.2"
[[package]]
name = "django-health-check"
-version = "3.17.0"
+version = "3.18.3"
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.3-py2.py3-none-any.whl", hash = "sha256:f5f58762b80bdf7b12fad724761993d6e83540f97e2c95c42978f187e452fa07"},
+ {file = "django_health_check-3.18.3.tar.gz", hash = "sha256:18b75daca4551c69a43f804f9e41e23f5f5fb9efd06cf6a313b3d5031bb87bd0"},
]
[package.dependencies]
@@ -850,21 +899,35 @@ django = ">=2.2"
[package.extras]
docs = ["sphinx"]
-test = ["celery", "pytest", "pytest-cov", "pytest-django", "redis"]
+test = ["boto3", "celery", "django-storages", "pytest", "pytest-cov", "pytest-django", "redis"]
+
+[[package]]
+name = "django-ipware"
+version = "7.0.1"
+description = "A Django application to retrieve user's IP address"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "django-ipware-7.0.1.tar.gz", hash = "sha256:d9ec43d2bf7cdf216fed8d494a084deb5761a54860a53b2e74346a4f384cff47"},
+ {file = "django_ipware-7.0.1-py2.py3-none-any.whl", hash = "sha256:db16bbee920f661ae7f678e4270460c85850f03c6761a4eaeb489bdc91f64709"},
+]
+
+[package.dependencies]
+python-ipware = ">=2.0.3"
[[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]]
@@ -900,13 +963,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]
@@ -916,15 +979,53 @@ redis = ">=3,<4.0.0 || >4.0.0,<4.0.1 || >4.0.1"
[package.extras]
hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"]
+[[package]]
+name = "django-silk"
+version = "5.1.0"
+description = "Silky smooth profiling for the Django Framework"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "django-silk-5.1.0.tar.gz", hash = "sha256:34abb5852315f0f3303d45b7ab4a2caa9cf670102b614dbb2ac40a5d2d5cbffb"},
+ {file = "django_silk-5.1.0-py3-none-any.whl", hash = "sha256:35a2051672b0be86af4ce734a0df0b6674c8c63f2df730b3756ec6e52923707d"},
+]
+
+[package.dependencies]
+autopep8 = "*"
+Django = ">=3.2"
+gprof2dot = ">=2017.09.19"
+sqlparse = "*"
+
+[[package]]
+name = "django-structlog"
+version = "8.1.0"
+description = "Structured Logging for Django"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "django_structlog-8.1.0-py3-none-any.whl", hash = "sha256:1072564bd6f36e8d3ba9893e7b31c1c46e94301189fedaecc0fb8a46525a3214"},
+ {file = "django_structlog-8.1.0.tar.gz", hash = "sha256:0229b9a2efbd24a4e3500169788e53915c2429521e34e41dd58ccc56039bef3f"},
+]
+
+[package.dependencies]
+asgiref = ">=3.6.0"
+django = ">=4.2"
+django-ipware = ">=6.0.2"
+structlog = ">=21.4.0"
+
+[package.extras]
+celery = ["celery (>=5.1)"]
+commands = ["django-extensions (>=1.4.9)"]
+
[[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]
@@ -935,43 +1036,42 @@ tablib = ["tablib"]
[[package]]
name = "django-taggit"
-version = "4.0.0"
+version = "5.0.1"
description = "django-taggit is a reusable Django application for simple tagging."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
files = [
- {file = "django-taggit-4.0.0.tar.gz", hash = "sha256:4d52de9d37245a9b9f98c0ec71fdccf1d2283e38e8866d40a7ae6a3b6787a161"},
- {file = "django_taggit-4.0.0-py3-none-any.whl", hash = "sha256:eb800dabef5f0a4e047ab0751f82cf805bc4a9e972037ef12bf519f52cd92480"},
+ {file = "django-taggit-5.0.1.tar.gz", hash = "sha256:edcd7db1e0f35c304e082a2f631ddac2e16ef5296029524eb792af7430cab4cc"},
+ {file = "django_taggit-5.0.1-py3-none-any.whl", hash = "sha256:a0ca8a28b03c4b26c2630fd762cb76ec39b5e41abf727a7b66f897a625c5e647"},
]
[package.dependencies]
-Django = ">=3.2"
+Django = ">=4.1"
[[package]]
name = "django-timezone-field"
-version = "5.1"
+version = "7.0"
description = "A Django app providing DB, form, and REST framework fields for zoneinfo and pytz timezone objects."
optional = false
-python-versions = ">=3.7,<4.0"
+python-versions = "<4.0,>=3.8"
files = [
- {file = "django_timezone_field-5.1-py3-none-any.whl", hash = "sha256:16ca9955a4e16064e32168b1a0d1cdb2839679c6cb56856c1f49f506e2ca4281"},
- {file = "django_timezone_field-5.1.tar.gz", hash = "sha256:73fc49519273cd5da1c7f16abc04a4bcad87b00cc02968d0d384c0fecf9a8a86"},
+ {file = "django_timezone_field-7.0-py3-none-any.whl", hash = "sha256:3232e7ecde66ba4464abb6f9e6b8cc739b914efb9b29dc2cf2eee451f7cc2acb"},
+ {file = "django_timezone_field-7.0.tar.gz", hash = "sha256:aa6f4965838484317b7f08d22c0d91a53d64e7bbbd34264468ae83d4023898a7"},
]
[package.dependencies]
"backports.zoneinfo" = {version = ">=0.2.1,<0.3.0", markers = "python_version < \"3.9\""}
-Django = ">=2.2,<3.0.dev0 || >=3.2.dev0,<5.0"
-pytz = "*"
+Django = ">=3.2,<6.0"
[[package]]
name = "django-tree-queries"
-version = "0.16.1"
+version = "0.19.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.19.0-py3-none-any.whl", hash = "sha256:05b9e3158e31612528f136b4704a8d807e14edc0b4a607a45377e6132517ba2c"},
+ {file = "django_tree_queries-0.19.0.tar.gz", hash = "sha256:d1325e75f96e90b86c4316a3d63498101ec05703f4e629786b561e8aaab0e4a7"},
]
[package.extras]
@@ -1000,18 +1100,18 @@ waitress = ["waitress"]
[[package]]
name = "djangorestframework"
-version = "3.14.0"
+version = "3.15.2"
description = "Web APIs for Django, made easy."
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
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.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20"},
+ {file = "djangorestframework-3.15.2.tar.gz", hash = "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"},
]
[package.dependencies]
-django = ">=3.0"
-pytz = "*"
+"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
+django = ">=4.2"
[[package]]
name = "drf-react-template-framework"
@@ -1029,13 +1129,13 @@ djangorestframework = ">=3.12.0,<4.0.0"
[[package]]
name = "drf-spectacular"
-version = "0.26.3"
+version = "0.27.2"
description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
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.27.2.tar.gz", hash = "sha256:a199492f2163c4101055075ebdbb037d59c6e0030692fc83a1a8c0fc65929981"},
+ {file = "drf_spectacular-0.27.2-py3-none-any.whl", hash = "sha256:b1c04bf8b2fbbeaf6f59414b4ea448c8787aba4d32f76055c3b13335cf7ec37b"},
]
[package.dependencies]
@@ -1045,6 +1145,7 @@ drf-spectacular-sidecar = {version = "*", optional = true, markers = "extra == \
inflection = ">=0.3.1"
jsonschema = ">=2.6.0"
PyYAML = ">=5.1"
+typing-extensions = {version = "*", markers = "python_version < \"3.10\""}
uritemplate = ">=2.0.0"
[package.extras]
@@ -1067,17 +1168,20 @@ Django = ">=2.2"
[[package]]
name = "emoji"
-version = "2.8.0"
+version = "2.12.1"
description = "Emoji for Python"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.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.12.1-py3-none-any.whl", hash = "sha256:a00d62173bdadc2510967a381810101624a2f0986145b8da0cffa42e29430235"},
+ {file = "emoji-2.12.1.tar.gz", hash = "sha256:4aa0488817691aa58d83764b6c209f8a27c0b3ab3f89d1b8dceca1a62e4973eb"},
]
+[package.dependencies]
+typing-extensions = ">=4.7.0"
+
[package.extras]
-dev = ["coverage", "coveralls", "pytest"]
+dev = ["coverage", "pytest (>=7.4.4)"]
[[package]]
name = "executing"
@@ -1126,20 +1230,32 @@ smmap = ">=3.0.1,<6"
[[package]]
name = "gitpython"
-version = "3.1.40"
+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.40-py3-none-any.whl", hash = "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a"},
- {file = "GitPython-3.1.40.tar.gz", hash = "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4"},
+ {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", "pytest-cov", "pytest-instafail", "pytest-subtests", "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"
+version = "2024.6.6"
+description = "Generate a dot graph from the output of several profilers."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "gprof2dot-2024.6.6-py2.py3-none-any.whl", hash = "sha256:45b14ad7ce64e299c8f526881007b9eb2c6b75505d5613e96e66ee4d5ab33696"},
+ {file = "gprof2dot-2024.6.6.tar.gz", hash = "sha256:fa1420c60025a9eb7734f65225b4da02a10fc6dd741b37fa129bc6b41951e5ab"},
+]
[[package]]
name = "graphene"
@@ -1235,16 +1351,17 @@ six = ">=1.12"
[[package]]
name = "griffe"
-version = "0.38.1"
+version = "1.1.1"
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.38.1-py3-none-any.whl", hash = "sha256:334c79d3b5964ade65c05dfcaf53518c576dedd387aaba5c9fd71212f34f1483"},
- {file = "griffe-0.38.1.tar.gz", hash = "sha256:bd68d7da7f3d87bc57eb9962b250db123efd9bbcc06c11c1a91b6e583b2a9361"},
+ {file = "griffe-1.1.1-py3-none-any.whl", hash = "sha256:0c469411e8d671a545725f5c0851a746da8bd99d354a79fdc4abd45219252efb"},
+ {file = "griffe-1.1.1.tar.gz", hash = "sha256:faeb78764c0b2bd010719d6e015d07709b0f260258b5d4dd6c88343d9702aa30"},
]
[package.dependencies]
+astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""}
colorama = ">=0.4"
[[package]]
@@ -1406,13 +1523,13 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"]
[[package]]
name = "jinja2"
-version = "3.1.2"
+version = "3.1.4"
description = "A very fast and expressive template engine."
optional = false
python-versions = ">=3.7"
files = [
- {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
- {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"},
+ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
+ {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
]
[package.dependencies]
@@ -1541,19 +1658,20 @@ files = [
[[package]]
name = "markdown"
-version = "3.3.7"
-description = "Python implementation of Markdown."
+version = "3.6"
+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.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"},
+ {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"},
]
[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]]
@@ -1572,71 +1690,71 @@ markdown = ">=3.3.7,<4.0.0"
[[package]]
name = "markupsafe"
-version = "2.1.3"
+version = "2.1.5"
description = "Safely add untrusted strings to HTML/XML markup."
optional = false
python-versions = ">=3.7"
files = [
- {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"},
- {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
- {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
- {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"},
- {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"},
- {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"},
- {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"},
- {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"},
+ {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"},
+ {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"},
+ {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"},
+ {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"},
+ {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"},
+ {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"},
+ {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"},
]
[[package]]
@@ -1677,34 +1795,34 @@ files = [
[[package]]
name = "mkdocs"
-version = "1.5.2"
+version = "1.6.0"
description = "Project documentation with Markdown."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mkdocs-1.5.2-py3-none-any.whl", hash = "sha256:60a62538519c2e96fe8426654a67ee177350451616118a41596ae7c876bb7eac"},
- {file = "mkdocs-1.5.2.tar.gz", hash = "sha256:70d0da09c26cff288852471be03c23f0f521fc15cf16ac89c7a3bfb9ae8d24f9"},
+ {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"},
+ {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"},
]
[package.dependencies]
click = ">=7.0"
colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""}
ghp-import = ">=1.0"
-importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""}
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
jinja2 = ">=2.11.1"
-markdown = ">=3.2.1"
+markdown = ">=3.3.6"
markupsafe = ">=2.0.1"
mergedeep = ">=1.3.4"
+mkdocs-get-deps = ">=0.2.0"
packaging = ">=20.5"
pathspec = ">=0.11.1"
-platformdirs = ">=2.2.0"
pyyaml = ">=5.1"
pyyaml-env-tag = ">=0.1"
watchdog = ">=2.0"
[package.extras]
i18n = ["babel (>=2.9.0)"]
-min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"]
+min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
[[package]]
name = "mkdocs-autorefs"
@@ -1721,27 +1839,51 @@ files = [
Markdown = ">=3.3"
mkdocs = ">=1.1"
+[[package]]
+name = "mkdocs-get-deps"
+version = "0.2.0"
+description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"},
+ {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"},
+]
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""}
+mergedeep = ">=1.3.4"
+platformdirs = ">=2.2.0"
+pyyaml = ">=5.1"
+
[[package]]
name = "mkdocs-material"
-version = "9.1.15"
+version = "9.5.32"
description = "Documentation that simply works"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mkdocs_material-9.1.15-py3-none-any.whl", hash = "sha256:b49e12869ab464558e2dd3c5792da5b748a7e0c48ee83b4d05715f98125a7a39"},
- {file = "mkdocs_material-9.1.15.tar.gz", hash = "sha256:8513ab847c9a541ed3d11a3a7eed556caf72991ee786c31c5aac6691a121088a"},
+ {file = "mkdocs_material-9.5.32-py3-none-any.whl", hash = "sha256:f3704f46b63d31b3cd35c0055a72280bed825786eccaf19c655b44e0cd2c6b3f"},
+ {file = "mkdocs_material-9.5.32.tar.gz", hash = "sha256:38ed66e6d6768dde4edde022554553e48b2db0d26d1320b19e2e2b9da0be1120"},
]
[package.dependencies]
-colorama = ">=0.4"
-jinja2 = ">=3.0"
-markdown = ">=3.2"
-mkdocs = ">=1.4.2"
-mkdocs-material-extensions = ">=1.1"
-pygments = ">=2.14"
-pymdown-extensions = ">=9.9.1"
-regex = ">=2022.4.24"
-requests = ">=2.26"
+babel = ">=2.10,<3.0"
+colorama = ">=0.4,<1.0"
+jinja2 = ">=3.0,<4.0"
+markdown = ">=3.2,<4.0"
+mkdocs = ">=1.6,<2.0"
+mkdocs-material-extensions = ">=1.3,<2.0"
+paginate = ">=0.5,<1.0"
+pygments = ">=2.16,<3.0"
+pymdown-extensions = ">=10.2,<11.0"
+regex = ">=2022.4"
+requests = ">=2.26,<3.0"
+
+[package.extras]
+git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"]
+imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"]
+recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"]
[[package]]
name = "mkdocs-material-extensions"
@@ -1756,22 +1898,24 @@ files = [
[[package]]
name = "mkdocstrings"
-version = "0.22.0"
+version = "0.25.2"
description = "Automatic documentation from sources, for MkDocs."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mkdocstrings-0.22.0-py3-none-any.whl", hash = "sha256:2d4095d461554ff6a778fdabdca3c00c468c2f1459d469f7a7f622a2b23212ba"},
- {file = "mkdocstrings-0.22.0.tar.gz", hash = "sha256:82a33b94150ebb3d4b5c73bab4598c3e21468c79ec072eff6931c8f3bfc38256"},
+ {file = "mkdocstrings-0.25.2-py3-none-any.whl", hash = "sha256:9e2cda5e2e12db8bb98d21e3410f3f27f8faab685a24b03b06ba7daa5b92abfc"},
+ {file = "mkdocstrings-0.25.2.tar.gz", hash = "sha256:5cf57ad7f61e8be3111a2458b4e49c2029c9cb35525393b179f9c916ca8042dc"},
]
[package.dependencies]
+click = ">=7.0"
importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
Jinja2 = ">=2.11.1"
Markdown = ">=3.3"
MarkupSafe = ">=1.1"
-mkdocs = ">=1.2"
+mkdocs = ">=1.4"
mkdocs-autorefs = ">=0.3.1"
+platformdirs = ">=2.2.0"
pymdown-extensions = ">=6.3"
typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""}
@@ -1782,18 +1926,18 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
[[package]]
name = "mkdocstrings-python"
-version = "1.5.2"
+version = "1.10.8"
description = "A Python handler for mkdocstrings."
optional = false
python-versions = ">=3.8"
files = [
- {file = "mkdocstrings_python-1.5.2-py3-none-any.whl", hash = "sha256:ed37ca6d216986e2ac3530c19c3e7be381d1e3d09ea414e4ff467d6fd2cbd9c1"},
- {file = "mkdocstrings_python-1.5.2.tar.gz", hash = "sha256:81eb4a93bc454a253daf247d1a11397c435d641c64fa165324c17c06170b1dfb"},
+ {file = "mkdocstrings_python-1.10.8-py3-none-any.whl", hash = "sha256:bb12e76c8b071686617f824029cb1dfe0e9afe89f27fb3ad9a27f95f054dcd89"},
+ {file = "mkdocstrings_python-1.10.8.tar.gz", hash = "sha256:5856a59cbebbb8deb133224a540de1ff60bded25e54d8beacc375bb133d39016"},
]
[package.dependencies]
-griffe = ">=0.35"
-mkdocstrings = ">=0.20"
+griffe = ">=0.49"
+mkdocstrings = ">=0.25"
[[package]]
name = "mock"
@@ -1813,77 +1957,83 @@ test = ["pytest", "pytest-cov"]
[[package]]
name = "nautobot"
-version = "2.1.0"
+version = "2.3.1"
description = "Source of truth and network automation platform."
optional = false
-python-versions = ">=3.8,<3.12"
+python-versions = "<3.13,>=3.8"
files = [
- {file = "nautobot-2.1.0-py3-none-any.whl", hash = "sha256:234d6b296dc2a61ab29b16158591e79a3b0e3705e10ab061ea77cbc75c6e603a"},
- {file = "nautobot-2.1.0.tar.gz", hash = "sha256:a49838351448e3a84af9060d2108fbbf42c337e8e1aefd09f784e121a5115c32"},
+ {file = "nautobot-2.3.1-py3-none-any.whl", hash = "sha256:28c02e229dcc87d69dba0e75d36c3bd219fefa9328ac996471e9b39f3ec74bb3"},
+ {file = "nautobot-2.3.1.tar.gz", hash = "sha256:96a3f0ee9cf73b404abca34bd2ed53a6d4494fcf85338734baa10dcd977f27f7"},
]
[package.dependencies]
-celery = ">=5.3.1,<5.4.0"
-Django = ">=3.2.23,<3.3.0"
+celery = ">=5.3.6,<5.4.0"
+Django = ">=4.2.15,<4.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-constance = {version = ">=2.9.1,<2.10.0", extras = ["database"]}
-django-cors-headers = ">=4.2.0,<4.3.0"
-django-db-file-storage = ">=0.5.5,<0.6.0"
+django-celery-beat = ">=2.6.0,<2.7.0"
+django-celery-results = ">=2.5.1,<2.6.0"
+django-constance = ">=3.1.0,<3.2.0"
+django-cors-headers = ">=4.4.0,<4.5.0"
+django-db-file-storage = ">=0.5.6.1,<0.6.0.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 = ">=24.2,<24.3"
+django-health-check = ">=3.18.3,<3.19.0"
+django-jinja = ">=2.11.0,<2.12.0"
django-prometheus = ">=2.3.1,<2.4.0"
-django-redis = ">=5.3.0,<5.4.0"
-django-tables2 = ">=2.6.0,<2.7.0"
-django-taggit = ">=4.0.0,<4.1.0"
-django-timezone-field = ">=5.1,<5.2"
-django-tree-queries = ">=0.16.1,<0.17.0"
+django-redis = ">=5.4.0,<5.5.0"
+django-silk = ">=5.1.0,<5.2.0"
+django-structlog = {version = ">=8.1.0,<9.0.0", extras = ["all"]}
+django-tables2 = ">=2.7.0,<2.8.0"
+django-taggit = ">=5.0.0,<5.1.0"
+django-timezone-field = ">=7.0,<7.1"
+django-tree-queries = ">=0.19.0,<0.20.0"
django-webserver = ">=1.2.0,<1.3.0"
-djangorestframework = ">=3.14.0,<3.15.0"
+djangorestframework = ">=3.15.2,<3.16.0"
drf-react-template-framework = ">=0.0.17,<0.0.18"
-drf-spectacular = {version = "0.26.3", extras = ["sidecar"]}
-emoji = ">=2.8.0,<2.9.0"
-GitPython = ">=3.1.36,<3.2.0"
+drf-spectacular = {version = ">=0.27.2,<0.28.0", extras = ["sidecar"]}
+emoji = ">=2.12.1,<2.13.0"
+GitPython = ">=3.1.43,<3.2.0"
graphene-django = ">=2.16.0,<2.17.0"
graphene-django-optimizer = ">=0.8.0,<0.9.0"
-Jinja2 = ">=3.1.2,<3.2.0"
-jsonschema = ">=4.7.0,<4.19.0"
-Markdown = ">=3.3.7,<3.4.0"
-MarkupSafe = ">=2.1.3,<2.2.0"
-netaddr = ">=0.8.0,<0.9.0"
+Jinja2 = ">=3.1.4,<3.2.0"
+jsonschema = ">=4.7.0,<5.0.0"
+Markdown = ">=3.6,<3.7"
+MarkupSafe = ">=2.1.5,<2.2.0"
+netaddr = ">=1.3.0,<1.4.0"
netutils = ">=1.6.0,<2.0.0"
-packaging = ">=23.1,<23.2"
-Pillow = ">=10.0.0,<10.1.0"
-prometheus-client = ">=0.17.1,<0.18.0"
+nh3 = ">=0.2.15,<0.3.0"
+packaging = ">=23.1"
+Pillow = ">=10.3.0,<10.4.0"
+prometheus-client = ">=0.20.0,<0.21.0"
psycopg2-binary = ">=2.9.9,<2.10.0"
-python-slugify = ">=8.0.1,<8.1.0"
-pyuwsgi = ">=2.0.21,<2.1.0"
+python-slugify = ">=8.0.3,<8.1.0"
+pyuwsgi = ">=2.0.23,<2.1.0"
PyYAML = ">=6.0,<6.1"
-social-auth-app-django = ">=5.2.0,<5.3.0"
+social-auth-app-django = ">=5.4.2,<5.5.0"
svgwrite = ">=1.4.2,<1.5.0"
[package.extras]
-all = ["django-auth-ldap (>=4.3.0,<4.4.0)", "django-storages (>=1.13.2,<1.14.0)", "mysqlclient (>=2.2.0,<2.3.0)", "napalm (>=4.1.0,<4.2.0)", "social-auth-core[openidconnect,saml] (>=4.4.2,<4.5.0)"]
-ldap = ["django-auth-ldap (>=4.3.0,<4.4.0)"]
-mysql = ["mysqlclient (>=2.2.0,<2.3.0)"]
-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)"]
+all = ["django-auth-ldap (>=4.8.0,<4.9.0)", "django-storages (==1.14.3)", "mysqlclient (>=2.2.3,<2.3.0)", "napalm (>=4.1.0,<6.0.0)", "social-auth-core[saml] (>=4.5.3,<4.6.0)"]
+ldap = ["django-auth-ldap (>=4.8.0,<4.9.0)"]
+mysql = ["mysqlclient (>=2.2.3,<2.3.0)"]
+napalm = ["napalm (>=4.1.0,<6.0.0)"]
+remote-storage = ["django-storages (==1.14.3)"]
+sso = ["social-auth-core[saml] (>=4.5.3,<4.6.0)"]
[[package]]
name = "netaddr"
-version = "0.8.0"
+version = "1.3.0"
description = "A network address manipulation library for Python"
optional = false
-python-versions = "*"
+python-versions = ">=3.7"
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-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe"},
+ {file = "netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a"},
]
+[package.extras]
+nicer-shell = ["ipython"]
+
[[package]]
name = "netutils"
version = "1.6.0"
@@ -1898,6 +2048,31 @@ files = [
[package.extras]
optionals = ["jsonschema (>=4.17.3,<5.0.0)", "napalm (>=4.0.0,<5.0.0)"]
+[[package]]
+name = "nh3"
+version = "0.2.18"
+description = "Python bindings to the ammonia HTML sanitization library."
+optional = false
+python-versions = "*"
+files = [
+ {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86"},
+ {file = "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307"},
+ {file = "nh3-0.2.18-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f"},
+ {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe"},
+ {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a"},
+ {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50"},
+ {file = "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204"},
+ {file = "nh3-0.2.18-cp37-abi3-win32.whl", hash = "sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be"},
+ {file = "nh3-0.2.18-cp37-abi3-win_amd64.whl", hash = "sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844"},
+ {file = "nh3-0.2.18.tar.gz", hash = "sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4"},
+]
+
[[package]]
name = "oauthlib"
version = "3.2.2"
@@ -1925,6 +2100,21 @@ files = [
{file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"},
]
+[[package]]
+name = "paginate"
+version = "0.5.7"
+description = "Divides large result sets into pages for easier browsing"
+optional = false
+python-versions = "*"
+files = [
+ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"},
+ {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"},
+]
+
+[package.extras]
+dev = ["pytest", "tox"]
+lint = ["black"]
+
[[package]]
name = "parso"
version = "0.8.3"
@@ -1978,70 +2168,89 @@ files = [
[[package]]
name = "pillow"
-version = "10.0.1"
+version = "10.3.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.8"
files = [
- {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"},
- {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"},
- {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"},
- {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"},
- {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"},
- {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"},
- {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"},
- {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"},
- {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"},
- {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"},
- {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"},
- {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"},
- {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"},
- {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"},
- {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"},
- {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"},
- {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"},
- {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"},
- {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"},
- {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"},
- {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"},
- {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"},
- {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"},
- {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"},
- {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"},
- {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"},
- {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"},
- {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"},
- {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"},
- {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"},
- {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"},
- {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"},
- {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"},
- {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"},
- {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"},
- {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"},
- {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"},
- {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"},
- {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"},
- {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"},
- {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"},
- {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"},
- {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"},
- {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"},
- {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"},
- {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"},
- {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"},
- {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"},
- {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"},
- {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"},
- {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"},
- {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"},
- {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"},
- {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"},
+ {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"},
+ {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"},
+ {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"},
+ {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"},
+ {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"},
+ {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"},
+ {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"},
+ {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"},
+ {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"},
+ {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"},
+ {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"},
+ {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"},
+ {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"},
+ {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"},
+ {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"},
+ {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"},
+ {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"},
+ {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"},
+ {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"},
+ {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"},
+ {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"},
+ {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"},
+ {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"},
+ {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"},
+ {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"},
+ {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"},
+ {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"},
+ {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"},
+ {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"},
+ {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"},
+ {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"},
+ {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"},
+ {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"},
+ {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"},
+ {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"},
+ {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"},
+ {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"},
+ {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"},
+ {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"},
+ {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"},
+ {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"},
+ {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"},
+ {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"},
+ {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"},
+ {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"},
]
[package.extras]
docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
+fpx = ["olefile"]
+mic = ["olefile"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
+typing = ["typing-extensions"]
+xmp = ["defusedxml"]
[[package]]
name = "pkgutil-resolve-name"
@@ -2082,13 +2291,13 @@ files = [
[[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]
@@ -2230,6 +2439,17 @@ files = [
[package.extras]
tests = ["pytest"]
+[[package]]
+name = "pycodestyle"
+version = "2.12.1"
+description = "Python style guide checker"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"},
+ {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"},
+]
+
[[package]]
name = "pycparser"
version = "2.21"
@@ -2401,15 +2621,29 @@ files = [
[package.dependencies]
six = ">=1.5"
+[[package]]
+name = "python-ipware"
+version = "3.0.0"
+description = "A Python package to retrieve user's IP address"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "python_ipware-3.0.0-py3-none-any.whl", hash = "sha256:fc936e6e7ec9fcc107f9315df40658f468ac72f739482a707181742882e36b60"},
+ {file = "python_ipware-3.0.0.tar.gz", hash = "sha256:9117b1c4dddcb5d5ca49e6a9617de2fc66aec2ef35394563ac4eecabdf58c062"},
+]
+
+[package.extras]
+dev = ["coverage[toml]", "coveralls (>=3.3,<4.0)", "ruff", "twine"]
+
[[package]]
name = "python-slugify"
-version = "8.0.1"
+version = "8.0.4"
description = "A Python slugify application that also handles Unicode"
optional = false
python-versions = ">=3.7"
files = [
- {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"},
- {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"},
+ {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"},
+ {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"},
]
[package.dependencies]
@@ -2931,13 +3165,13 @@ files = [
[[package]]
name = "social-auth-app-django"
-version = "5.2.0"
+version = "5.4.2"
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.2.tar.gz", hash = "sha256:c8832c6cf13da6ad76f5613bcda2647d89ae7cfbc5217fadd13477a3406feaa8"},
+ {file = "social_auth_app_django-5.4.2-py3-none-any.whl", hash = "sha256:0c041a31707921aef9a930f143183c65d8c7b364381364a50f3f7c6fcc9d62f6"},
]
[package.dependencies]
@@ -3005,6 +3239,23 @@ pure-eval = "*"
[package.extras]
tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
+[[package]]
+name = "structlog"
+version = "24.4.0"
+description = "Structured Logging for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "structlog-24.4.0-py3-none-any.whl", hash = "sha256:597f61e80a91cc0749a9fd2a098ed76715a1c8a01f73e336b746504d1aad7610"},
+ {file = "structlog-24.4.0.tar.gz", hash = "sha256:b27bfecede327a6d2da5fbc96bd859f114ecc398a6389d664f62085ee7ae6fc4"},
+]
+
+[package.extras]
+dev = ["freezegun (>=0.2.8)", "mypy (>=1.4)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "rich", "simplejson", "twisted"]
+docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "sphinxext-opengraph", "twisted"]
+tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"]
+typing = ["mypy (>=1.4)", "rich", "twisted"]
+
[[package]]
name = "svgwrite"
version = "1.4.3"
@@ -3221,6 +3472,20 @@ files = [
{file = "wcwidth-0.2.12.tar.gz", hash = "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02"},
]
+[[package]]
+name = "wheel"
+version = "0.44.0"
+description = "A built-package format for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"},
+ {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"},
+]
+
+[package.extras]
+test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
+
[[package]]
name = "wrapt"
version = "1.16.0"
@@ -3338,5 +3603,5 @@ all = []
[metadata]
lock-version = "2.0"
-python-versions = ">=3.8,<3.12"
-content-hash = "1efd6ec1954ae465d6749859020797b91b2d177a2a37cc2bc089511382e1df8e"
+python-versions = ">=3.8,<3.13"
+content-hash = "929366f2abf5e7f3a78713f5a04f12be8f5766191460a0ba35c40bf224d433c0"
diff --git a/pyproject.toml b/pyproject.toml
index 309dc08..ff8a2bd 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -100,7 +100,6 @@ target-version = "py38"
select = [
"D", # pydocstyle
"F", "E", "W", # flake8
- "PL", # pylint
"S", # bandit
"I", # isort
]
diff --git a/tasks.py b/tasks.py
index 2e0bfd5..c00b8e1 100644
--- a/tasks.py
+++ b/tasks.py
@@ -68,15 +68,11 @@ def is_truthy(arg):
def _is_compose_included(context, name):
- return (
- f"docker-compose.{name}.yml" in context.nautobot_firewall_models.compose_files
- )
+ return f"docker-compose.{name}.yml" in context.nautobot_firewall_models.compose_files
def _await_healthy_service(context, service):
- container_id = docker_compose(
- context, f"ps -q -- {service}", pty=False, echo=False, hide=True
- ).stdout.strip()
+ container_id = docker_compose(context, f"ps -q -- {service}", pty=False, echo=False, hide=True).stdout.strip()
_await_healthy_container(context, container_id)
@@ -136,9 +132,7 @@ def docker_compose(context, command, **kwargs):
]
for compose_file in context.nautobot_firewall_models.compose_files:
- compose_file_path = os.path.join(
- context.nautobot_firewall_models.compose_dir, compose_file
- )
+ compose_file_path = os.path.join(context.nautobot_firewall_models.compose_dir, compose_file)
compose_command_tokens.append(f' -f "{compose_file_path}"')
compose_command_tokens.append(command)
@@ -177,9 +171,7 @@ def run_command(context, command, **kwargs):
if "nautobot" in results.stdout:
compose_command = f"exec{command_env_args} nautobot {command}"
else:
- compose_command = (
- f"run{command_env_args} --rm --entrypoint='{command}' nautobot"
- )
+ compose_command = f"run{command_env_args} --rm --entrypoint='{command}' nautobot"
pty = kwargs.pop("pty", True)
@@ -204,9 +196,7 @@ def build(context, force_rm=False, cache=True):
if force_rm:
command += " --force-rm"
- print(
- f"Building Nautobot with Python {context.nautobot_firewall_models.python_ver}..."
- )
+ print(f"Building Nautobot with Python {context.nautobot_firewall_models.python_ver}...")
docker_compose(context, command)
@@ -223,23 +213,11 @@ def _get_docker_nautobot_version(context, nautobot_ver=None, python_ver=None):
nautobot_ver = context.nautobot_firewall_models.nautobot_ver
if python_ver is None:
python_ver = context.nautobot_firewall_models.python_ver
- dockerfile_path = os.path.join(
- context.nautobot_firewall_models.compose_dir, "Dockerfile"
- )
- base_image = (
- context.run(f"grep --max-count=1 '^FROM ' {dockerfile_path}", hide=True)
- .stdout.strip()
- .split(" ")[1]
- )
- base_image = base_image.replace(r"${NAUTOBOT_VER}", nautobot_ver).replace(
- r"${PYTHON_VER}", python_ver
- )
- pip_nautobot_ver = context.run(
- f"docker run --rm --entrypoint '' {base_image} pip show nautobot", hide=True
- )
- match_version = re.search(
- r"^Version: (.+)$", pip_nautobot_ver.stdout.strip(), flags=re.MULTILINE
- )
+ dockerfile_path = os.path.join(context.nautobot_firewall_models.compose_dir, "Dockerfile")
+ base_image = context.run(f"grep --max-count=1 '^FROM ' {dockerfile_path}", hide=True).stdout.strip().split(" ")[1]
+ base_image = base_image.replace(r"${NAUTOBOT_VER}", nautobot_ver).replace(r"${PYTHON_VER}", python_ver)
+ pip_nautobot_ver = context.run(f"docker run --rm --entrypoint '' {base_image} pip show nautobot", hide=True)
+ match_version = re.search(r"^Version: (.+)$", pip_nautobot_ver.stdout.strip(), flags=re.MULTILINE)
if match_version:
return match_version.group(1)
else:
@@ -264,9 +242,7 @@ def _get_docker_nautobot_version(context, nautobot_ver=None, python_ver=None):
),
}
)
-def lock(
- context, check=False, constrain_nautobot_ver=False, constrain_python_ver=False
-):
+def lock(context, check=False, constrain_nautobot_ver=False, constrain_python_ver=False):
"""Generate poetry.lock file."""
if constrain_nautobot_ver:
docker_nautobot_version = _get_docker_nautobot_version(context)
@@ -306,9 +282,7 @@ def restart(context, service=""):
def stop(context, service=""):
"""Stop specified or all services, if service is not specified, remove all containers."""
print("Stopping Nautobot...")
- docker_compose(
- context, "stop" if service else "down --remove-orphans", service=service
- )
+ docker_compose(context, "stop" if service else "down --remove-orphans", service=service)
@task(
@@ -327,9 +301,7 @@ def destroy(context, volumes=True, import_db_file=""):
return
if not volumes:
- raise ValueError(
- "Cannot specify `--no-volumes` and `--import-db-file` arguments at the same time."
- )
+ raise ValueError("Cannot specify `--no-volumes` and `--import-db-file` arguments at the same time.")
print(f"Importing database file: {import_db_file}...")
@@ -346,16 +318,12 @@ def destroy(context, volumes=True, import_db_file=""):
"db",
]
- container_id = docker_compose(
- context, " ".join(command), pty=False, echo=False, hide=True
- ).stdout.strip()
+ container_id = docker_compose(context, " ".join(command), pty=False, echo=False, hide=True).stdout.strip()
_await_healthy_container(context, container_id)
print("Stopping database container...")
context.run(f"docker stop {container_id}", pty=False, echo=False, hide=True)
- print(
- "Database import complete, you can start Nautobot with the following command:"
- )
+ print("Database import complete, you can start Nautobot with the following command:")
print("invoke start")
@@ -527,9 +495,7 @@ def dbshell(context, db_name="", input_file="", output_file="", query=""):
if input_file and query:
raise ValueError("Cannot specify both, `input_file` and `query` arguments")
if output_file and not (input_file or query):
- raise ValueError(
- "`output_file` argument requires `input_file` or `query` argument"
- )
+ raise ValueError("`output_file` argument requires `input_file` or `query` argument")
env = {}
if query:
@@ -667,9 +633,7 @@ def backup_db(context, db_name="", output_file="dump.sql", readable=True):
docker_compose(context, " ".join(command), pty=False)
print(50 * "=")
- print(
- "The database backup has been successfully completed and saved to the following file:"
- )
+ print("The database backup has been successfully completed and saved to the following file:")
print(output_file)
print("You can import this database backup with the following command:")
print(f"invoke import-db --input-file '{output_file}'")
From 35af1612364911ac8bc3355fe53d480d039e1fe0 Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Wed, 4 Sep 2024 10:25:33 -0500
Subject: [PATCH 05/21] Remove MySQL test
Creating a ticket to track this change.
---
.github/workflows/ci.yml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 89fcc7d..15691db 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -134,9 +134,9 @@ jobs:
- python-version: "3.11"
db-backend: "postgresql"
nautobot-version: "2.0.0"
- - python-version: "3.12"
- db-backend: "mysql"
- nautobot-version: "stable"
+ # - python-version: "3.12"
+ # db-backend: "mysql"
+ # nautobot-version: "stable"
runs-on: "ubuntu-22.04"
env:
INVOKE_NAUTOBOT_FIREWALL_MODELS_PYTHON_VER: "${{ matrix.python-version }}"
From 1c49ded633ad1ad36ee707fbbae56459f551ab5a Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Sun, 8 Sep 2024 17:31:08 -0500
Subject: [PATCH 06/21] Add change fragement for Python3.12 support.
---
changes/266.added | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changes/266.added
diff --git a/changes/266.added b/changes/266.added
new file mode 100644
index 0000000..b7d587b
--- /dev/null
+++ b/changes/266.added
@@ -0,0 +1 @@
+Added Python3.12 support.
From 0ff978a6868858b496b67ba7819015a09ffc5a8e Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Thu, 12 Sep 2024 18:18:23 -0500
Subject: [PATCH 07/21] Update changes/266.added
Co-authored-by: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
---
changes/266.added | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/changes/266.added b/changes/266.added
index b7d587b..c738255 100644
--- a/changes/266.added
+++ b/changes/266.added
@@ -1 +1 @@
-Added Python3.12 support.
+Added Python 3.12 support.
From b73b91b453d35ae59fac1c8e53921631c4b44cdf Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Thu, 12 Sep 2024 18:19:59 -0500
Subject: [PATCH 08/21] Add Constrain Nautobot step to Unittest CI.
---
.github/workflows/ci.yml | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 15691db..19179c3 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -146,6 +146,10 @@ jobs:
uses: "actions/checkout@v4"
- name: "Setup environment"
uses: "networktocode/gh-action-setup-poetry-environment@v6"
+ - name: "Constrain Nautobot version and regenerate lock file"
+ env:
+ INVOKE_NAUTOBOT_CHATOPS_LOCAL: "true"
+ run: "poetry run invoke lock --constrain-nautobot-ver --constrain-python-ver"
- name: "Set up Docker Buildx"
id: "buildx"
uses: "docker/setup-buildx-action@v3"
From a15359d273efe88805777360ce8a1367cd22518e Mon Sep 17 00:00:00 2001
From: Stephen Kiely
Date: Thu, 12 Sep 2024 19:56:45 -0500
Subject: [PATCH 09/21] Fix Environment Var
---
.github/workflows/ci.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 19179c3..621781f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -148,7 +148,7 @@ jobs:
uses: "networktocode/gh-action-setup-poetry-environment@v6"
- name: "Constrain Nautobot version and regenerate lock file"
env:
- INVOKE_NAUTOBOT_CHATOPS_LOCAL: "true"
+ INVOKE_NAUTOBOT_FIREWALL_MODELS_LOCAL: "true"
run: "poetry run invoke lock --constrain-nautobot-ver --constrain-python-ver"
- name: "Set up Docker Buildx"
id: "buildx"
From 8a293807268a4df9052a16ad74709443f5f048e4 Mon Sep 17 00:00:00 2001
From: Gary Snider <75227981+gsnider2195@users.noreply.github.com>
Date: Mon, 7 Oct 2024 14:31:45 -0700
Subject: [PATCH 10/21] fix UI and model bugs (#274)
---
changes/222.fixed | 1 +
changes/233.fixed | 2 +
changes/245.fixed | 2 +
changes/275.fixed | 1 +
nautobot_firewall_models/filters.py | 2 +
nautobot_firewall_models/forms.py | 2 -
.../0022_fix_policy_natpolicy_m2ms.py | 54 +++++++++++++++++++
nautobot_firewall_models/models/nat_policy.py | 10 +++-
.../models/security_policy.py | 10 +++-
.../inc/nat_policy_device_weight.html | 2 +-
.../inc/nat_policy_dynamic_group_weight.html | 2 +-
.../inc/policy_dynamic_group_weight.html | 2 +-
nautobot_firewall_models/utils/capirca.py | 29 ++++++----
.../viewsets/nat_policy.py | 8 +--
14 files changed, 105 insertions(+), 22 deletions(-)
create mode 100644 changes/222.fixed
create mode 100644 changes/233.fixed
create mode 100644 changes/245.fixed
create mode 100644 changes/275.fixed
create mode 100644 nautobot_firewall_models/migrations/0022_fix_policy_natpolicy_m2ms.py
diff --git a/changes/222.fixed b/changes/222.fixed
new file mode 100644
index 0000000..34368dd
--- /dev/null
+++ b/changes/222.fixed
@@ -0,0 +1 @@
+Fixed server error when navigating to Policy detail view.
diff --git a/changes/233.fixed b/changes/233.fixed
new file mode 100644
index 0000000..0785601
--- /dev/null
+++ b/changes/233.fixed
@@ -0,0 +1,2 @@
+Fixed name fields being optional on multiple forms.
+Fixed assigned devices and assigned dynamic groups fields not marked as optional on NATPolicy and Policy.
diff --git a/changes/245.fixed b/changes/245.fixed
new file mode 100644
index 0000000..7357fa0
--- /dev/null
+++ b/changes/245.fixed
@@ -0,0 +1,2 @@
+Fixed server error when navigating to NATPolicy detail view.
+Fixed server error when updating device/dynamic group weights on NATPolicy.
diff --git a/changes/275.fixed b/changes/275.fixed
new file mode 100644
index 0000000..720c933
--- /dev/null
+++ b/changes/275.fixed
@@ -0,0 +1 @@
+Fixed capirca failures with Nautobot v2.3.3 or higher.
diff --git a/nautobot_firewall_models/filters.py b/nautobot_firewall_models/filters.py
index 990c41f..558778d 100644
--- a/nautobot_firewall_models/filters.py
+++ b/nautobot_firewall_models/filters.py
@@ -163,6 +163,7 @@ def search(self, queryset, name, value): # pylint: disable=unused-argument
"""Construct Q filter for filterset."""
if not value.strip():
return queryset
+ # pylint: disable=unsupported-binary-operation
return queryset.filter(
Q(name__icontains=value) | Q(description__icontains=value) | Q(request_id__icontains=value)
)
@@ -181,6 +182,7 @@ def search(self, queryset, name, value): # pylint: disable=unused-argument
"""Construct Q filter for filterset."""
if not value.strip():
return queryset
+ # pylint: disable=unsupported-binary-operation
return queryset.filter(
Q(name__icontains=value) | Q(description__icontains=value) | Q(request_id__icontains=value)
)
diff --git a/nautobot_firewall_models/forms.py b/nautobot_firewall_models/forms.py
index e0d9768..d5b1a71 100644
--- a/nautobot_firewall_models/forms.py
+++ b/nautobot_firewall_models/forms.py
@@ -538,7 +538,6 @@ class PolicyRuleFilterForm(LocalContextFilterForm, NautobotFilterForm):
class PolicyRuleForm(LocalContextModelForm, NautobotModelForm):
"""PolicyRule creation/edit form."""
- name = forms.CharField(required=False, label="Name")
tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False)
source_users = DynamicModelMultipleChoiceField(
queryset=models.UserObject.objects.all(), label="Source User Objects", required=False
@@ -710,7 +709,6 @@ class NATPolicyRuleForm(LocalContextModelForm, NautobotModelForm):
"""NATPolicyRule creation/edit form."""
# Metadata
- name = forms.CharField(required=False, label="Name")
tags = DynamicModelMultipleChoiceField(queryset=Tag.objects.all(), required=False)
request_id = forms.CharField(required=False, label="Optional field for request ticket identifier.")
diff --git a/nautobot_firewall_models/migrations/0022_fix_policy_natpolicy_m2ms.py b/nautobot_firewall_models/migrations/0022_fix_policy_natpolicy_m2ms.py
new file mode 100644
index 0000000..7257f65
--- /dev/null
+++ b/nautobot_firewall_models/migrations/0022_fix_policy_natpolicy_m2ms.py
@@ -0,0 +1,54 @@
+# Generated by Django 4.2.16 on 2024-10-03 21:29
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("dcim", "0014_location_status_data_migration"),
+ ("extras", "0047_enforce_custom_field_slug"),
+ ("nautobot_firewall_models", "0021_alter_addressobject_status_and_more"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="natpolicy",
+ name="assigned_devices",
+ field=models.ManyToManyField(
+ blank=True,
+ related_name="nat_policies",
+ through="nautobot_firewall_models.NATPolicyDeviceM2M",
+ to="dcim.device",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="natpolicy",
+ name="assigned_dynamic_groups",
+ field=models.ManyToManyField(
+ blank=True,
+ related_name="nat_policies",
+ through="nautobot_firewall_models.NATPolicyDynamicGroupM2M",
+ to="extras.dynamicgroup",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="policy",
+ name="assigned_devices",
+ field=models.ManyToManyField(
+ blank=True,
+ related_name="firewall_policies",
+ through="nautobot_firewall_models.PolicyDeviceM2M",
+ to="dcim.device",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="policy",
+ name="assigned_dynamic_groups",
+ field=models.ManyToManyField(
+ blank=True,
+ related_name="firewall_policies",
+ through="nautobot_firewall_models.PolicyDynamicGroupM2M",
+ to="extras.dynamicgroup",
+ ),
+ ),
+ ]
diff --git a/nautobot_firewall_models/models/nat_policy.py b/nautobot_firewall_models/models/nat_policy.py
index da4c528..6b1c2e9 100644
--- a/nautobot_firewall_models/models/nat_policy.py
+++ b/nautobot_firewall_models/models/nat_policy.py
@@ -252,10 +252,16 @@ class NATPolicy(PrimaryModel):
to="nautobot_firewall_models.NATPolicyRule", blank=True, related_name="nat_policies"
)
assigned_devices = models.ManyToManyField(
- to="dcim.Device", through="NATPolicyDeviceM2M", related_name="nat_policies"
+ to="dcim.Device",
+ through="NATPolicyDeviceM2M",
+ related_name="nat_policies",
+ blank=True,
)
assigned_dynamic_groups = models.ManyToManyField(
- to="extras.DynamicGroup", through="NATPolicyDynamicGroupM2M", related_name="nat_policies"
+ to="extras.DynamicGroup",
+ through="NATPolicyDynamicGroupM2M",
+ related_name="nat_policies",
+ blank=True,
)
status = StatusField(
on_delete=models.PROTECT,
diff --git a/nautobot_firewall_models/models/security_policy.py b/nautobot_firewall_models/models/security_policy.py
index 356d6a2..e5fbd71 100644
--- a/nautobot_firewall_models/models/security_policy.py
+++ b/nautobot_firewall_models/models/security_policy.py
@@ -183,10 +183,16 @@ class Policy(PrimaryModel):
name = models.CharField(max_length=100, unique=True)
policy_rules = models.ManyToManyField(to=PolicyRule, blank=True, related_name="policies")
assigned_devices = models.ManyToManyField(
- to="dcim.Device", through="PolicyDeviceM2M", related_name="firewall_policies"
+ to="dcim.Device",
+ through="PolicyDeviceM2M",
+ related_name="firewall_policies",
+ blank=True,
)
assigned_dynamic_groups = models.ManyToManyField(
- to="extras.DynamicGroup", through="PolicyDynamicGroupM2M", related_name="firewall_policies"
+ to="extras.DynamicGroup",
+ through="PolicyDynamicGroupM2M",
+ related_name="firewall_policies",
+ blank=True,
)
status = StatusField(
on_delete=models.PROTECT,
diff --git a/nautobot_firewall_models/templates/nautobot_firewall_models/inc/nat_policy_device_weight.html b/nautobot_firewall_models/templates/nautobot_firewall_models/inc/nat_policy_device_weight.html
index 9f6d2cd..a106571 100644
--- a/nautobot_firewall_models/templates/nautobot_firewall_models/inc/nat_policy_device_weight.html
+++ b/nautobot_firewall_models/templates/nautobot_firewall_models/inc/nat_policy_device_weight.html
@@ -6,7 +6,7 @@
Assign NAT Policy Weight to Device
{% if object.natpolicydevicem2m_set.all %}
-