diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 00000000..b0e2d5ba
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,40 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/python
+{
+ "name": "Python 3",
+ "image": "mcr.microsoft.com/devcontainers/python:1-3.9-bullseye",
+ "features": {
+ "ghcr.io/devcontainers-contrib/features/poetry:2": {
+ "version": "latest"
+ },
+ "ghcr.io/dhoeric/features/google-cloud-cli:1": {}
+ },
+ "postCreateCommand": "poetry install",
+ "customizations": {
+ "vscode": {
+ "extensions": [
+ // Python
+ "ms-python.python",
+ "ms-python.vscode-pylance",
+ "ms-python.black-formatter",
+ "ms-python.flake8",
+ "matangover.mypy",
+ "nwgh.bandit",
+ "KevinRose.vsc-python-indent",
+ // RestructuredText
+ "lextudio.restructuredtext",
+ "trond-snekvik.simple-rst",
+ // Helpers
+ "tamasfe.even-better-toml",
+ "njpwerner.autodocstring",
+ "aaron-bond.better-comments",
+ // Tools
+ "github.vscode-github-actions",
+ "GitHub.copilot",
+ "ms-toolsai.jupyter",
+ // VIM
+ "vscodevim.vim"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 25409d46..3ee47b2b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -18,7 +18,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
- python-version: [3.7, 3.8, 3.9]
+ python-version: ["3.8", "3.9"]
steps:
- uses: actions/checkout@v2
@@ -30,11 +30,11 @@ jobs:
- name: Install Poetry
uses: Gr1N/setup-poetry@v8
with:
- poetry-version: 1.3.2
+ poetry-version: 1.7.1
- name: Get poetry cache directory
id: poetry-cache
- run: echo "::set-output name=dir::$(poetry config cache-dir)"
+ run: echo "dir=$(poetry config cache-dir)" >> $GITHUB_OUTPUT
- name: Cache poetry dependencies
uses: actions/cache@v2
@@ -58,27 +58,27 @@ jobs:
steps:
- uses: actions/checkout@v2
- - name: Set up Python 3.7
+ - name: Set up Python
uses: actions/setup-python@v1
with:
- python-version: 3.7
+ python-version: 3.8
- name: Install Poetry
uses: Gr1N/setup-poetry@v8
with:
- poetry-version: 1.3.2
+ poetry-version: 1.7.1
- name: Get poetry cache directory
id: poetry-cache
- run: echo "::set-output name=dir::$(poetry config cache-dir)"
+ run: echo "dir=$(poetry config cache-dir)" >> $GITHUB_OUTPUT
- name: Cache poetry dependencies
uses: actions/cache@v1
with:
path: ${{ steps.poetry-cache.outputs.dir }}
- key: ${{ runner.os }}-poetry-3.7-${{ hashFiles('**/poetry.lock') }}
+ key: ${{ runner.os }}-poetry-3.8-${{ hashFiles('**/poetry.lock') }}
restore-keys: |
- ${{ runner.os }}-poetry-3.7-
+ ${{ runner.os }}-poetry-3.8-
- name: Install dependencies
run: poetry install
@@ -95,27 +95,27 @@ jobs:
- name: Checkout
uses: actions/checkout@v2
- - name: Set up Python 3.7
+ - name: Set up Python
uses: actions/setup-python@v1
with:
- python-version: 3.7
+ python-version: 3.8
- name: Install Poetry
uses: Gr1N/setup-poetry@v8
with:
- poetry-version: 1.3.2
+ poetry-version: 1.7.1
- name: Get poetry cache directory
id: poetry-cache
- run: echo "::set-output name=dir::$(poetry config cache-dir)"
+ run: echo "dir=$(poetry config cache-dir)" >> $GITHUB_OUTPUT
- name: Cache poetry dependencies
uses: actions/cache@v1
with:
path: ${{ steps.poetry-cache.outputs.dir }}
- key: ${{ runner.os }}-poetry-3.7-${{ hashFiles('**/poetry.lock') }}
+ key: ${{ runner.os }}-poetry-3.8-${{ hashFiles('**/poetry.lock') }}
restore-keys: |
- ${{ runner.os }}-poetry-3.7-
+ ${{ runner.os }}-poetry-3.8-
- name: Install dependencies
run: poetry install
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 00000000..e1aa9ed6
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,22 @@
+# .readthedocs.yaml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.7"
+
+# Build documentation in the docs/ directory with Sphinx
+sphinx:
+ configuration: docs/conf.py
+
+# We recommend specifying your dependencies to enable reproducible builds:
+# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: docs/requirements.txt
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 2923e490..34a31431 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -6,19 +6,11 @@
"source.organizeImports": "explicit"
},
"python.testing.unittestEnabled": false,
- "python.testing.nosetestsEnabled": false,
"python.testing.pytestEnabled": true,
- "python.testing.pytestArgs": ["--no-cov"],
- "python.linting.enabled": true,
- "python.linting.pylintEnabled": false,
- "python.linting.banditEnabled": true,
- "python.linting.banditArgs": ["-r", "--ini .bandit"],
- "python.linting.flake8Enabled": true,
- "python.linting.flake8CategorySeverity.E": "Warning",
- "python.linting.mypyEnabled": false,
- "python.formatting.provider": "black",
+ "python.testing.pytestArgs": [
+ "--no-cov"
+ ],
"editor.formatOnSave": true,
- "restructuredtext.confPath": "${workspaceFolder}/docs",
"cSpell.words": [
"Vlan",
"etree",
@@ -27,5 +19,13 @@
"pandevice",
"pan-os-python",
"refreshall"
- ]
-}
+ ],
+ "black-formatter.importStrategy": "fromEnvironment",
+ "bandit.importStrategy": "fromEnvironment",
+ "bandit.args": [
+ "-r",
+ "--ini .bandit"
+ ],
+ "flake8.importStrategy": "fromEnvironment",
+ "flake8.args": ["--config=.flake8"]
+}
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 72a264b1..c6058a2d 100644
--- a/Makefile
+++ b/Makefile
@@ -48,11 +48,11 @@ bandit:
bandit -r --ini .bandit
format:
- isort --recursive --atomic panos
+ isort --atomic panos
black .
check-format:
- isort --recursive --atomic --check-only panos
+ isort --atomic --check-only panos
black --check --diff .
test:
diff --git a/docs/configtree.py b/docs/configtree.py
index bb7a3214..85a382c9 100755
--- a/docs/configtree.py
+++ b/docs/configtree.py
@@ -70,8 +70,10 @@ def node_style(cls):
style = "style=filled " + nodestyle[module] + " "
except:
pass
- result = ' {0} [{1}URL="../module-{2}.html#panos.{3}" target="_top"];\n'.format(
- cls_name, style, module, cls
+ result = (
+ ' {0} [{1}URL="../module-{2}.html#panos.{3}" target="_top"];\n'.format(
+ cls_name, style, module, cls
+ )
)
else:
if style:
diff --git a/docs/requirements.txt b/docs/requirements.txt
index b0b706c6..461333f4 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -1,2 +1,4 @@
mistune<2.0.0
-m2r==0.2.1
+m2r==0.3.1
+sphinx_rtd_theme
+pan-python==0.17.0
diff --git a/examples/dyn_address_group.py b/examples/dyn_address_group.py
index 248769ca..501e3c35 100755
--- a/examples/dyn_address_group.py
+++ b/examples/dyn_address_group.py
@@ -57,7 +57,6 @@
def main():
-
# Get command line arguments
parser = argparse.ArgumentParser(
description="Tag an IP address on a Palo Alto Networks Next generation Firewall"
@@ -111,7 +110,11 @@ def main():
logging.basicConfig(format=logging_format, level=logging_level)
# Connect to the device and determine its type (Firewall or Panorama).
- device = PanDevice.create_from_device(args.hostname, args.username, args.password,)
+ device = PanDevice.create_from_device(
+ args.hostname,
+ args.username,
+ args.password,
+ )
# Panorama does not have a userid API, so exit.
# You can use the userid API on a firewall with the Panorama 'target'
diff --git a/examples/upgrade.py b/examples/upgrade.py
index 12e55236..70902615 100755
--- a/examples/upgrade.py
+++ b/examples/upgrade.py
@@ -53,7 +53,6 @@
def main():
-
# Get command line arguments
parser = argparse.ArgumentParser(
description="Upgrade a Palo Alto Networks Firewall or Panorama to the specified version"
@@ -95,7 +94,11 @@ def main():
# Connect to the device and determine its type (Firewall or Panorama).
# This is important to know what version to upgrade to next.
- device = PanDevice.create_from_device(args.hostname, args.username, args.password,)
+ device = PanDevice.create_from_device(
+ args.hostname,
+ args.username,
+ args.password,
+ )
# Perform the upgrades in sequence with reboots between each upgrade
device.software.upgrade_to_version(args.version, args.dryrun)
diff --git a/examples/userid.py b/examples/userid.py
index 0ba04887..f94365e0 100755
--- a/examples/userid.py
+++ b/examples/userid.py
@@ -53,7 +53,6 @@
def main():
-
# Get command line arguments
parser = argparse.ArgumentParser(
description="Update User-ID by adding or removing a user-to-ip mapping"
@@ -90,7 +89,11 @@ def main():
logging.basicConfig(format=logging_format, level=logging_level)
# Connect to the device and determine its type (Firewall or Panorama).
- device = PanDevice.create_from_device(args.hostname, args.username, args.password,)
+ device = PanDevice.create_from_device(
+ args.hostname,
+ args.username,
+ args.password,
+ )
logging.debug("Detecting type of device")
diff --git a/mypy.ini b/mypy.ini
new file mode 100644
index 00000000..0e43f2fa
--- /dev/null
+++ b/mypy.ini
@@ -0,0 +1,36 @@
+# Global options:
+
+[mypy]
+ignore_missing_imports = True
+; follow_imports = silent
+show_column_numbers = True
+warn_unused_configs = False
+disallow_subclassing_any = False
+disallow_any_generics = False
+disallow_untyped_calls = False
+disallow_untyped_defs = False
+disallow_incomplete_defs = False
+check_untyped_defs = True
+disallow_untyped_decorators = False
+no_implicit_optional = False
+warn_redundant_casts = False
+warn_unused_ignores = False
+warn_return_any = False
+
+# Per-module options:
+
+## In this section, add overrides for specific files, modules, or functions
+## that don't yet have type annotations. For example:
+## [mypy-older_module.older_file]
+## disallow_untyped_defs = False
+
+[mypy-panos.updater]
+disallow_subclassing_any = True
+disallow_any_generics = True
+disallow_untyped_defs = False
+disallow_incomplete_defs = True
+check_untyped_defs = True
+disallow_untyped_decorators = True
+no_implicit_optional = True
+warn_unused_ignores = True
+warn_return_any = True
\ No newline at end of file
diff --git a/panos/__init__.py b/panos/__init__.py
index b160f7f7..a63d74e1 100755
--- a/panos/__init__.py
+++ b/panos/__init__.py
@@ -178,13 +178,12 @@ def __repr__(self):
return "PanOSVersion ('%s')" % str(self)
def __lt__(self, other):
-
# Handle 'latest' is always higher
if isstring(other) and other == "latest":
return True
other = stringToVersion(other)
- for (x, y) in zip(self.mainrelease, other.mainrelease):
+ for x, y in zip(self.mainrelease, other.mainrelease):
if x < y:
return True
if x > y:
@@ -203,7 +202,6 @@ def __ge__(self, other):
return not self.__lt__(other)
def __eq__(self, other):
-
# Handle 'latest' which is always different
if isstring(other) and other == "latest":
return False
@@ -241,7 +239,9 @@ def tree_legend_dot():
result += (
'{module} [style=filled fillcolor={color} URL="{url}'
'/module-{module}.html" target="_blank"];'.format(
- module=module, color=node_color(module), url=DOCUMENTATION_URL,
+ module=module,
+ color=node_color(module),
+ url=DOCUMENTATION_URL,
)
)
result += "}"
@@ -286,7 +286,11 @@ def string_or_list(value):
value,
]
return (
- list(value) if "__iter__" in dir(value) else [value,]
+ list(value)
+ if "__iter__" in dir(value)
+ else [
+ value,
+ ]
)
@@ -463,8 +467,8 @@ def node_color(module):
def object_classes():
import inspect
- from panos import errors
- from panos import base
+
+ from panos import base, errors
current_module = sys.modules[__name__]
@@ -476,15 +480,17 @@ def object_classes():
if the_cls not in omits:
omits.append(the_cls)
- from panos import device
- from panos import firewall
- from panos import ha
- from panos import network
- from panos import objects
- from panos import panorama
- from panos import plugins
- from panos import policies
- from panos import predefined
+ from panos import (
+ device,
+ firewall,
+ ha,
+ network,
+ objects,
+ panorama,
+ plugins,
+ policies,
+ predefined,
+ )
classes = {}
for pkg in (device, firewall, ha, network, objects, panorama, policies, predefined):
diff --git a/panos/base.py b/panos/base.py
index 120b91a8..e7d3aa61 100644
--- a/panos/base.py
+++ b/panos/base.py
@@ -446,7 +446,6 @@ def element(self, with_children=True, comparable=False):
nextelement = root
for section in path:
-
if section.find("|") != -1:
# This is an element variable, so create an element containing
# the variables's value
@@ -1648,7 +1647,13 @@ def _set_reference(
if var_type == "list":
if var is None:
update_needed = True
- setattr(obj, reference_var, [self,])
+ setattr(
+ obj,
+ reference_var,
+ [
+ self,
+ ],
+ )
if update:
obj.update(reference_var)
elif not isinstance(var, list):
@@ -1992,7 +1997,9 @@ def delete_similar(self):
for chunk in chunk_instances_for_delete_similar(instances):
dev.xapi.delete(
"{0}/{1}[{2}]".format(
- xpath, prefix, " or ".join(joiner.format(x.uid) for x in chunk),
+ xpath,
+ prefix,
+ " or ".join(joiner.format(x.uid) for x in chunk),
),
retry_on_peer=self.HA_SYNC,
)
@@ -2124,14 +2131,13 @@ def hierarchy_info(self):
dict: Hierarchy information about this object.
"""
from panos.firewall import Firewall
- from panos.panorama import DeviceGroup
- from panos.panorama import Panorama
- from panos.panorama import Template
- from panos.panorama import TemplateStack
+ from panos.panorama import DeviceGroup, Panorama, Template, TemplateStack
classes = panos.object_classes()
configs = [
- [self.__class__,],
+ [
+ self.__class__,
+ ],
]
updated_configs = []
@@ -2143,7 +2149,10 @@ def hierarchy_info(self):
configs.pop(num)
for p in parents:
configs.append(
- chain + [p,]
+ chain
+ + [
+ p,
+ ]
)
break
else:
@@ -2801,7 +2810,8 @@ def __getattr__(self, name):
raise AttributeError(
"'{0}' object has no attribute '{1}'".format(
- self.__class__.__name__, str(name),
+ self.__class__.__name__,
+ str(name),
)
)
@@ -2886,9 +2896,7 @@ def __repr__(self):
class ValueEntry(VersionedPanObject):
- """Base class for objects that only have a value element.
-
- """
+ """Base class for objects that only have a value element."""
ROOT = Root.VSYS
SUFFIX = ENTRY
@@ -3722,7 +3730,12 @@ def get_device_version(self):
@classmethod
def create_from_device(
- cls, hostname, api_username=None, api_password=None, api_key=None, port=443,
+ cls,
+ hostname,
+ api_username=None,
+ api_password=None,
+ api_key=None,
+ port=443,
):
"""Factory method to create a :class:`panos.firewall.Firewall`
or :class:`panos.panorama.Panorama` object from a live device
@@ -3744,18 +3757,33 @@ def create_from_device(
# Create generic PanDevice to connect and get information
from panos import firewall, panorama
- device = PanDevice(hostname, api_username, api_password, api_key, port,)
+ device = PanDevice(
+ hostname,
+ api_username,
+ api_password,
+ api_key,
+ port,
+ )
system_info = device.refresh_system_info()
version = system_info[0]
model = system_info[1]
if model == "Panorama" or model.startswith("M-"):
instance = panorama.Panorama(
- hostname, api_username, api_password, device.api_key, port,
+ hostname,
+ api_username,
+ api_password,
+ device.api_key,
+ port,
)
else:
serial = system_info[2]
instance = firewall.Firewall(
- hostname, api_username, api_password, device.api_key, serial, port,
+ hostname,
+ api_username,
+ api_password,
+ device.api_key,
+ serial,
+ port,
)
instance._set_version_and_version_info(version)
return instance
@@ -3903,10 +3931,16 @@ def method(self, *args, **kwargs):
def classify_exception(self, e):
if str(e) == "Invalid credentials.":
- return err.PanInvalidCredentials(str(e), pan_device=self.pan_device,)
+ return err.PanInvalidCredentials(
+ str(e),
+ pan_device=self.pan_device,
+ )
elif str(e).startswith("URLError:"):
if str(e).endswith("timed out"):
- return err.PanConnectionTimeout(str(e), pan_device=self.pan_device,)
+ return err.PanConnectionTimeout(
+ str(e),
+ pan_device=self.pan_device,
+ )
else:
# This could be that we have an old version of OpenSSL
# that doesn't support TLSv1.1, so check for that and give
@@ -4836,7 +4870,12 @@ def _commit(
logger.debug(
self.id
+ ": commit requested: commit_all:%s sync:%s sync_all:%s cmd:%s"
- % (str(commit_all), str(sync), str(sync_all), cmd,)
+ % (
+ str(commit_all),
+ str(sync),
+ str(sync_all),
+ cmd,
+ )
)
if commit_all:
action = "all"
@@ -5603,7 +5642,8 @@ def is_ready(self, minutes=None, seconds=None):
end = None
if minutes is not None or seconds is not None:
end = datetime.datetime.now() + datetime.timedelta(
- minutes=minutes or 0, seconds=seconds or 0,
+ minutes=minutes or 0,
+ seconds=seconds or 0,
)
while True:
diff --git a/panos/device.py b/panos/device.py
index d221d723..85ac899b 100644
--- a/panos/device.py
+++ b/panos/device.py
@@ -1321,7 +1321,11 @@ def _setup(self):
)
)
params.append(
- VersionedParamPath("disabled", vartype="yesno", path="disabled",),
+ VersionedParamPath(
+ "disabled",
+ vartype="yesno",
+ path="disabled",
+ ),
)
self._params = tuple(params)
@@ -1467,7 +1471,10 @@ def _setup(self):
"facility",
default="LOG_USER",
path="facility",
- values=["LOG_USER",] + ["LOG_LOCAL{0}".format(x) for x in range(8)],
+ values=[
+ "LOG_USER",
+ ]
+ + ["LOG_LOCAL{0}".format(x) for x in range(8)],
)
)
@@ -2275,12 +2282,28 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "username_field_value", path="username-field/{username_field}",
+ "username_field_value",
+ path="username-field/{username_field}",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "domain",
+ path="domain",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "use_crl",
+ path="use-crl",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "use_ocsp",
+ path="use-ocsp",
)
)
- params.append(VersionedParamPath("domain", path="domain",))
- params.append(VersionedParamPath("use_crl", path="use-crl",))
- params.append(VersionedParamPath("use_ocsp", path="use-ocsp",))
params.append(
VersionedParamPath(
"crl_receive_timeout",
@@ -2307,27 +2330,50 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "block_unknown_certificate", vartype="yesno", path="block-unknown-cert",
+ "block_unknown_certificate",
+ vartype="yesno",
+ path="block-unknown-cert",
)
)
params.append(
VersionedParamPath(
- "block_certificate_timeout", vartype="yesno", path="block-timeout-cert",
+ "block_certificate_timeout",
+ vartype="yesno",
+ path="block-timeout-cert",
)
)
params.append(
- VersionedParamPath("block_unauthenticated_certificate", exclude=True,)
+ VersionedParamPath(
+ "block_unauthenticated_certificate",
+ exclude=True,
+ )
)
params[-1].add_profile(
- "7.1.0", vartype="yesno", path="block-unauthenticated-cert",
+ "7.1.0",
+ vartype="yesno",
+ path="block-unauthenticated-cert",
+ )
+ params.append(
+ VersionedParamPath(
+ "block_expired_certificate",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("block_expired_certificate", exclude=True,))
params[-1].add_profile(
- "8.1.0", vartype="yesno", path="block-expired-cert",
+ "8.1.0",
+ vartype="yesno",
+ path="block-expired-cert",
+ )
+ params.append(
+ VersionedParamPath(
+ "ocsp_exclude_nonce",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("ocsp_exclude_nonce", exclude=True,))
params[-1].add_profile(
- "9.0.0", path="ocsp-exclude-nonce", vartype="yesno",
+ "9.0.0",
+ path="ocsp-exclude-nonce",
+ vartype="yesno",
)
self._params = tuple(params)
@@ -2354,13 +2400,27 @@ def _setup(self):
# params
params = []
- params.append(VersionedParamPath("default_ocsp_url", path="default-ocsp-url",))
params.append(
- VersionedParamPath("ocsp_verify_certificate", path="ocsp-verify-cert",)
+ VersionedParamPath(
+ "default_ocsp_url",
+ path="default-ocsp-url",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "ocsp_verify_certificate",
+ path="ocsp-verify-cert",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "template_name",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("template_name", exclude=True,))
params[-1].add_profile(
- "9.0.0", path="template-name",
+ "9.0.0",
+ path="template-name",
)
self._params = tuple(params)
@@ -2395,7 +2455,8 @@ def _setup(self):
params.append(
VersionedParamPath(
- "forward_trust_certificate_rsa", path="forward-trust-certificate/rsa",
+ "forward_trust_certificate_rsa",
+ path="forward-trust-certificate/rsa",
)
)
params.append(
@@ -2418,13 +2479,17 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "root_ca_excludes", vartype="member", path="root-ca-exclude-list",
+ "root_ca_excludes",
+ vartype="member",
+ path="root-ca-exclude-list",
)
)
# Only option present on Panorama.
params.append(
VersionedParamPath(
- "trusted_root_cas", vartype="member", path="trusted-root-CA",
+ "trusted_root_cas",
+ vartype="member",
+ path="trusted-root-CA",
)
)
params.append(
@@ -2459,8 +2524,19 @@ def _setup(self):
# params
params = []
- params.append(VersionedParamPath("description", path="description",))
- params.append(VersionedParamPath("exclude", vartype="yesno", path="exclude",))
+ params.append(
+ VersionedParamPath(
+ "description",
+ path="description",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "exclude",
+ vartype="yesno",
+ path="exclude",
+ )
+ )
self._params = tuple(params)
@@ -2490,9 +2566,19 @@ def _setup(self):
params = []
params.append(
- VersionedParamPath("password_hash", vartype="encrypted", path="phash",)
+ VersionedParamPath(
+ "password_hash",
+ vartype="encrypted",
+ path="phash",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "disabled",
+ vartype="yesno",
+ path="disabled",
+ )
)
- params.append(VersionedParamPath("disabled", vartype="yesno", path="disabled",))
self._params = tuple(params)
@@ -2533,6 +2619,12 @@ def _setup(self):
# params
params = []
- params.append(VersionedParamPath("users", vartype="member", path="user",))
+ params.append(
+ VersionedParamPath(
+ "users",
+ vartype="member",
+ path="user",
+ )
+ )
self._params = tuple(params)
diff --git a/panos/ha.py b/panos/ha.py
index 824d9734..9a072e66 100644
--- a/panos/ha.py
+++ b/panos/ha.py
@@ -560,5 +560,6 @@ def _setup(self):
# stubs
self._stubs.add_profile(
- "0.0.0", "interface/ha1",
+ "0.0.0",
+ "interface/ha1",
)
diff --git a/panos/network.py b/panos/network.py
index 781a412b..ef22bc5b 100644
--- a/panos/network.py
+++ b/panos/network.py
@@ -153,22 +153,48 @@ def _setup(self):
)
)
params.append(
- VersionedParamPath("enable_packet_buffer_protection", exclude=True,)
+ VersionedParamPath(
+ "enable_packet_buffer_protection",
+ exclude=True,
+ )
)
params[-1].add_profile(
- "8.0.0", path="network/enable-packet-buffer-protection", vartype="yesno",
+ "8.0.0",
+ path="network/enable-packet-buffer-protection",
+ vartype="yesno",
+ )
+ params.append(
+ VersionedParamPath(
+ "enable_device_identification",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("enable_device_identification", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="enable-device-identification", vartype="yesno",
+ "10.0.0",
+ path="enable-device-identification",
+ vartype="yesno",
+ )
+ params.append(
+ VersionedParamPath(
+ "device_include_acl",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("device_include_acl", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="device-acl/include-list", vartype="member",
+ "10.0.0",
+ path="device-acl/include-list",
+ vartype="member",
+ )
+ params.append(
+ VersionedParamPath(
+ "device_exclude_acl",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("device_exclude_acl", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="device-acl/exclude-acl", vartype="member",
+ "10.0.0",
+ path="device-acl/exclude-acl",
+ vartype="member",
)
self._params = tuple(params)
@@ -1377,7 +1403,12 @@ def _setup(self):
"mode",
path="{mode}",
default="layer3",
- values=["layer3", "layer2", "virtual-wire", "ha",],
+ values=[
+ "layer3",
+ "layer2",
+ "virtual-wire",
+ "ha",
+ ],
)
)
params.append(
@@ -2179,7 +2210,11 @@ def _setup(self):
VersionedParamPath("enable", path="enable", default=True, vartype="yesno")
)
params.append(
- VersionedParamPath("reject_default_route", default=True, vartype="yesno",)
+ VersionedParamPath(
+ "reject_default_route",
+ default=True,
+ vartype="yesno",
+ )
)
params.append(
VersionedParamPath(
@@ -4211,7 +4246,11 @@ def _setup(self):
)
params[-1].add_profile(
"8.1.0",
- values=("ip", "dynamic", "fqdn",),
+ values=(
+ "ip",
+ "dynamic",
+ "fqdn",
+ ),
path="peer-address/{peer_ip_type}",
)
params.append(
@@ -4617,7 +4656,14 @@ def _setup(self):
params.append(
VersionedParamPath(
"mk_esp_encryption",
- values=("des", "3des", "aes128", "aes192", "aes256", "null",),
+ values=(
+ "des",
+ "3des",
+ "aes128",
+ "aes192",
+ "aes256",
+ "null",
+ ),
path="{type}/{mk_protocol}/encryption/algorithm",
)
)
@@ -5457,7 +5503,9 @@ def _setup(self):
params = []
- params.append(VersionedParamPath("interface", path="interface"),)
+ params.append(
+ VersionedParamPath("interface", path="interface"),
+ )
self._params = tuple(params)
diff --git a/panos/objects.py b/panos/objects.py
index 014466ec..e5509cb6 100644
--- a/panos/objects.py
+++ b/panos/objects.py
@@ -240,7 +240,9 @@ def _setup(self):
)
)
params[-1].add_profile(
- "8.1.0", path="protocol/{protocol}", values=["tcp", "udp", "sctp"],
+ "8.1.0",
+ path="protocol/{protocol}",
+ values=["tcp", "udp", "sctp"],
)
params.append(
VersionedParamPath("source_port", path="protocol/{protocol}/source-port")
@@ -269,14 +271,20 @@ def _setup(self):
params[-1].add_profile(
"8.1.0",
vartype="int",
- condition={"enable_override_timeout": "yes", "protocol": "tcp",},
+ condition={
+ "enable_override_timeout": "yes",
+ "protocol": "tcp",
+ },
path="protocol/{protocol}/override/{enable_override_timeout}/halfclose-timeout",
)
params.append(VersionedParamPath("override_time_wait_timeout", exclude=True))
params[-1].add_profile(
"8.1.0",
vartype="int",
- condition={"enable_override_timeout": "yes", "protocol": "tcp",},
+ condition={
+ "enable_override_timeout": "yes",
+ "protocol": "tcp",
+ },
path="protocol/{protocol}/override/{enable_override_timeout}/timewait-timeout",
)
@@ -355,7 +363,8 @@ def _setup(self):
# xpaths
self._xpaths.add_profile(value="/application")
self._xpaths.add_profile(
- value='//*[contains(local-name(), "application")]', parents=("Predefined",),
+ value='//*[contains(local-name(), "application")]',
+ parents=("Predefined",),
)
# params
@@ -651,7 +660,8 @@ def _setup(self):
# xpaths
self._xpaths.add_profile(value="/application-container")
self._xpaths.add_profile(
- value='//*[contains(local-name(), "application")]', parents=("Predefined",),
+ value='//*[contains(local-name(), "application")]',
+ parents=("Predefined",),
)
# params
@@ -911,7 +921,9 @@ def _setup(self):
VersionedParamPath(
"action_type",
default="tagging",
- values=["tagging",],
+ values=[
+ "tagging",
+ ],
path="type/{action_type}",
)
)
@@ -1201,7 +1213,10 @@ def _setup(self):
params.append(
VersionedParamPath(
- "edl_type", default="ip", path="type", values=("ip", "domain", "url"),
+ "edl_type",
+ default="ip",
+ path="type",
+ values=("ip", "domain", "url"),
),
)
params[-1].add_profile(
@@ -1214,38 +1229,77 @@ def _setup(self):
path="type/{edl_type}",
values=("ip", "domain", "url", "predefined-ip", "predefined-url"),
)
- params.append(VersionedParamPath("description", path="description",),)
+ params.append(
+ VersionedParamPath(
+ "description",
+ path="description",
+ ),
+ )
params[-1].add_profile(
- "8.0.0", path="type/{edl_type}/description",
+ "8.0.0",
+ path="type/{edl_type}/description",
+ )
+ params.append(
+ VersionedParamPath(
+ "source",
+ path="url",
+ ),
)
- params.append(VersionedParamPath("source", path="url",),)
params[-1].add_profile(
- "8.0.0", path="type/{edl_type}/url",
+ "8.0.0",
+ path="type/{edl_type}/url",
+ )
+ params.append(
+ VersionedParamPath(
+ "exceptions",
+ exclude=True,
+ ),
)
- params.append(VersionedParamPath("exceptions", exclude=True,),)
params[-1].add_profile(
- "8.0.0", vartype="member", path="type/{edl_type}/exception-list",
+ "8.0.0",
+ vartype="member",
+ path="type/{edl_type}/exception-list",
+ )
+ params.append(
+ VersionedParamPath(
+ "certificate_profile",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("certificate_profile", exclude=True,))
params[-1].add_profile(
"8.0.0",
path="type/{edl_type}/certificate-profile",
condition={"edl_type": ["ip", "domain", "url"]},
)
- params.append(VersionedParamPath("username", exclude=True,))
+ params.append(
+ VersionedParamPath(
+ "username",
+ exclude=True,
+ )
+ )
params[-1].add_profile(
"8.0.0",
path="type/{edl_type}/auth/username",
condition={"edl_type": ["ip", "domain", "url"]},
)
- params.append(VersionedParamPath("password", exclude=True,))
+ params.append(
+ VersionedParamPath(
+ "password",
+ exclude=True,
+ )
+ )
params[-1].add_profile(
"8.0.0",
path="type/{edl_type}/auth/password",
vartype="encrypted",
condition={"edl_type": ["ip", "domain", "url"]},
)
- params.append(VersionedParamPath("expand_domain", exclude=True,),)
+ params.append(
+ VersionedParamPath(
+ "expand_domain",
+ exclude=True,
+ ),
+ )
params[-1].add_profile(
"9.0.0",
path="type/{edl_type}/expand-domain",
@@ -1308,7 +1362,10 @@ def _setup(self):
"friday",
"saturday",
),
- condition={"edl_type": ["ip", "domain", "url"], "repeat": "weekly",},
+ condition={
+ "edl_type": ["ip", "domain", "url"],
+ "repeat": "weekly",
+ },
)
params.append(
VersionedParamPath(
@@ -1322,7 +1379,10 @@ def _setup(self):
"8.0.0",
vartype="int",
path="type/{edl_type}/recurring/{repeat}/day-of-month",
- condition={"edl_type": ["ip", "domain", "url"], "repeat": "monthly",},
+ condition={
+ "edl_type": ["ip", "domain", "url"],
+ "repeat": "monthly",
+ },
)
self._params = tuple(params)
diff --git a/panos/plugins.py b/panos/plugins.py
index b6e8ddc5..8ef7b16b 100644
--- a/panos/plugins.py
+++ b/panos/plugins.py
@@ -61,7 +61,10 @@ def _get_jobs(self, jobtype, svc):
"""
dev = self.obj.nearest_pandevice()
- res = dev.op(XML.format(jobtype=jobtype, svc=svc), cmd_xml=False,)
+ res = dev.op(
+ XML.format(jobtype=jobtype, svc=svc),
+ cmd_xml=False,
+ )
logger.debug("%s jobs for %s: %s", jobtype, svc, ET.tostring(res))
status = res.find("./result/result/status")
if status is None or (status is not None and status.text != "pass"):
@@ -225,7 +228,9 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "multi_tenant_enable", vartype="yesno", path="multi-tenant-enable",
+ "multi_tenant_enable",
+ vartype="yesno",
+ path="multi-tenant-enable",
)
)
@@ -250,10 +255,18 @@ def _setup(self):
# params
params = []
params.append(
- VersionedParamPath("device_groups", vartype="member", path="device-groups",)
+ VersionedParamPath(
+ "device_groups",
+ vartype="member",
+ path="device-groups",
+ )
)
params.append(
- VersionedParamPath("templates", vartype="member", path="templates",)
+ VersionedParamPath(
+ "templates",
+ vartype="member",
+ path="templates",
+ )
)
self._params = tuple(params)
@@ -280,20 +293,47 @@ def _setup(self):
# params
params = []
- params.append(VersionedParamPath("access_domain", path="access-domain",))
+ params.append(
+ VersionedParamPath(
+ "access_domain",
+ path="access-domain",
+ )
+ )
- params.append(VersionedParamPath("bandwidth", vartype="int", path="bandwidth",))
params.append(
- VersionedParamPath("bandwidth_adem", vartype="int", path="bandwidth-adem",)
+ VersionedParamPath(
+ "bandwidth",
+ vartype="int",
+ path="bandwidth",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "bandwidth_adem",
+ vartype="int",
+ path="bandwidth-adem",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "bandwidth_cleanpipe",
+ vartype="int",
+ path="bandwidth-clean-pipe",
+ )
)
params.append(
VersionedParamPath(
- "bandwidth_cleanpipe", vartype="int", path="bandwidth-clean-pipe",
+ "users",
+ vartype="int",
+ path="users",
)
)
- params.append(VersionedParamPath("users", vartype="int", path="users",))
params.append(
- VersionedParamPath("adem_users", vartype="int", path="adem-users",)
+ VersionedParamPath(
+ "adem_users",
+ vartype="int",
+ path="adem-users",
+ )
)
self._params = tuple(params)
@@ -613,7 +653,9 @@ def _setup(self):
params.append(
VersionedParamPath(
- "same_as_primary", vartype="yesno", path="same-as-primary",
+ "same_as_primary",
+ vartype="yesno",
+ path="same-as-primary",
)
)
params.append(VersionedParamPath("peer_ip_address", path="peer-ip-address"))
diff --git a/panos/policies.py b/panos/policies.py
index 9de9d9a1..5538dcfe 100644
--- a/panos/policies.py
+++ b/panos/policies.py
@@ -48,7 +48,10 @@ def _setup(self, name=None, elm=None):
def refresh(self, elm=None):
if elm is None and self.obj is not None:
self.obj.parent.opstate.hit_count.refresh(
- self.obj.HIT_COUNT_STYLE, [self.name,],
+ self.obj.HIT_COUNT_STYLE,
+ [
+ self.name,
+ ],
)
else:
self._refresh_xml(elm)
@@ -278,7 +281,8 @@ def current(self):
ET.SubElement(sub, "xpath").text = self.obj.xpath()
ans = self.obj.nearest_pandevice().op(
- ET.tostring(cmd, encoding="utf-8"), cmd_xml=False,
+ ET.tostring(cmd, encoding="utf-8"),
+ cmd_xml=False,
)
resp = ans.find("./result/entry/comment")
@@ -298,7 +302,8 @@ def update(self, comment):
ET.SubElement(sub, "comment").text = comment
self.obj.nearest_pandevice().op(
- ET.tostring(cmd, encoding="utf-8"), cmd_xml=False,
+ ET.tostring(cmd, encoding="utf-8"),
+ cmd_xml=False,
)
@@ -384,7 +389,12 @@ def _setup(self):
for var_name, path in any_defaults:
params.append(
VersionedParamPath(
- var_name, default=["any",], vartype="member", path=path
+ var_name,
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path=path,
)
)
@@ -406,7 +416,12 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "category", default=["any",], vartype="member", path="category"
+ "category",
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path="category",
)
)
params.append(VersionedParamPath("action", path="action"))
@@ -469,11 +484,23 @@ def _setup(self):
params.append(VersionedParamPath("uuid", exclude=True))
params[-1].add_profile("9.0.0", vartype="attrib", path="uuid")
params.append(
- VersionedParamPath("source_devices", default=["any",], exclude=True)
+ VersionedParamPath(
+ "source_devices",
+ default=[
+ "any",
+ ],
+ exclude=True,
+ )
)
params[-1].add_profile("10.0.0", vartype="member", path="source-hip")
params.append(
- VersionedParamPath("destination_devices", default=["any",], exclude=True)
+ VersionedParamPath(
+ "destination_devices",
+ default=[
+ "any",
+ ],
+ exclude=True,
+ )
)
params[-1].add_profile("10.0.0", vartype="member", path="destination-hip")
params.append(VersionedParamPath("group_tag", exclude=True))
@@ -577,7 +604,12 @@ def _setup(self):
)
params.append(
VersionedParamPath(
- "fromzone", default=["any",], vartype="member", path="from"
+ "fromzone",
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path="from",
)
)
params.append(VersionedParamPath("tozone", vartype="member", path="to"))
@@ -585,12 +617,22 @@ def _setup(self):
params.append(VersionedParamPath("service", default="any", path="service"))
params.append(
VersionedParamPath(
- "source", default=["any",], vartype="member", path="source"
+ "source",
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path="source",
)
)
params.append(
VersionedParamPath(
- "destination", default=["any",], vartype="member", path="destination"
+ "destination",
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path="destination",
)
)
params.append(
@@ -894,7 +936,12 @@ def _setup(self):
for var_name, path in any_defaults:
params.append(
VersionedParamPath(
- var_name, default=["any",], vartype="member", path=path
+ var_name,
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path=path,
)
)
params.append(VersionedParamPath("application", path="application"))
@@ -1177,43 +1224,103 @@ def _setup(self):
params.append(VersionedParamPath("uuid", exclude=True))
params[-1].add_profile("9.0.0", vartype="attrib", path="uuid")
params.append(
- VersionedParamPath("source_zones", vartype="member", path="from",)
+ VersionedParamPath(
+ "source_zones",
+ vartype="member",
+ path="from",
+ )
)
params.append(
- VersionedParamPath("source_addresses", vartype="member", path="source",)
+ VersionedParamPath(
+ "source_addresses",
+ vartype="member",
+ path="source",
+ )
)
params.append(
- VersionedParamPath("negate_source", vartype="yesno", path="negate-source",)
+ VersionedParamPath(
+ "negate_source",
+ vartype="yesno",
+ path="negate-source",
+ )
)
params.append(
- VersionedParamPath("source_users", vartype="member", path="source-user",)
+ VersionedParamPath(
+ "source_users",
+ vartype="member",
+ path="source-user",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "source_hip",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("source_hip", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="source-hip", vartype="member",
+ "10.0.0",
+ path="source-hip",
+ vartype="member",
)
params.append(
- VersionedParamPath("destination_zones", vartype="member", path="to",)
+ VersionedParamPath(
+ "destination_zones",
+ vartype="member",
+ path="to",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "destination_addresses",
+ vartype="member",
+ path="destination",
+ )
)
params.append(
VersionedParamPath(
- "destination_addresses", vartype="member", path="destination",
+ "negate_destination",
+ vartype="yesno",
+ path="negate-destination",
)
)
params.append(
VersionedParamPath(
- "negate_destination", vartype="yesno", path="negate-destination",
+ "destination_hip",
+ exclude=True,
)
)
- params.append(VersionedParamPath("destination_hip", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="destination-hip", vartype="member",
+ "10.0.0",
+ path="destination-hip",
+ vartype="member",
+ )
+ params.append(
+ VersionedParamPath(
+ "tags",
+ vartype="member",
+ path="tag",
+ )
)
- params.append(VersionedParamPath("tags", vartype="member", path="tag",))
- params.append(VersionedParamPath("disabled", vartype="yesno", path="disabled",))
- params.append(VersionedParamPath("services", vartype="member", path="service",))
params.append(
- VersionedParamPath("url_categories", vartype="member", path="category",)
+ VersionedParamPath(
+ "disabled",
+ vartype="yesno",
+ path="disabled",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "services",
+ vartype="member",
+ path="service",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "url_categories",
+ vartype="member",
+ path="category",
+ )
)
params.append(
VersionedParamPath(
@@ -1232,38 +1339,79 @@ def _setup(self):
VersionedParamPath(
"decryption_type",
path="type/{decryption_type}",
- values=("ssl-forward-proxy", "ssh-proxy", "ssl-inbound-inspection",),
+ values=(
+ "ssl-forward-proxy",
+ "ssh-proxy",
+ "ssl-inbound-inspection",
+ ),
)
)
params.append(
VersionedParamPath(
"ssl_certificate",
path="type/{decryption_type}",
- condition={"decryption_type": "ssl-inbound-inspection",},
+ condition={
+ "decryption_type": "ssl-inbound-inspection",
+ },
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "decryption_profile",
+ path="profile",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "forwarding_profile",
+ exclude=True,
)
)
- params.append(VersionedParamPath("decryption_profile", path="profile",))
- params.append(VersionedParamPath("forwarding_profile", exclude=True,))
params[-1].add_profile(
- "8.1.0", path="forwarding-profile",
+ "8.1.0",
+ path="forwarding-profile",
+ )
+ params.append(
+ VersionedParamPath(
+ "group_tag",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("group_tag", exclude=True,))
params[-1].add_profile(
- "9.0.0", path="group-tag",
+ "9.0.0",
+ path="group-tag",
)
params.append(
- VersionedParamPath("log_successful_tls_handshakes", exclude=True,)
+ VersionedParamPath(
+ "log_successful_tls_handshakes",
+ exclude=True,
+ )
)
params[-1].add_profile(
- "10.0.0", path="log-success", vartype="yesno",
+ "10.0.0",
+ path="log-success",
+ vartype="yesno",
+ )
+ params.append(
+ VersionedParamPath(
+ "log_failed_tls_handshakes",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("log_failed_tls_handshakes", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="log-fail", vartype="yesno",
+ "10.0.0",
+ path="log-fail",
+ vartype="yesno",
+ )
+ params.append(
+ VersionedParamPath(
+ "log_setting",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("log_setting", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="log-setting",
+ "10.0.0",
+ path="log-setting",
)
params.append(
VersionedParamPath("negate_target", path="target/negate", vartype="yesno")
@@ -1328,55 +1476,117 @@ def _setup(self):
params.append(VersionedParamPath("uuid", exclude=True))
params[-1].add_profile("9.0.0", vartype="attrib", path="uuid")
params.append(
- VersionedParamPath("source_zones", vartype="member", path="from",)
+ VersionedParamPath(
+ "source_zones",
+ vartype="member",
+ path="from",
+ )
)
params.append(
VersionedParamPath(
- "source_addresses", default=["any",], vartype="member", path="source"
+ "source_addresses",
+ default=[
+ "any",
+ ],
+ vartype="member",
+ path="source",
)
)
params.append(
- VersionedParamPath("negate_source", vartype="yesno", path="negate-source",)
+ VersionedParamPath(
+ "negate_source",
+ vartype="yesno",
+ path="negate-source",
+ )
)
params.append(
- VersionedParamPath("destination_zones", vartype="member", path="to",)
+ VersionedParamPath(
+ "destination_zones",
+ vartype="member",
+ path="to",
+ )
)
params.append(
VersionedParamPath(
"destination_addresses",
- default=["any",],
+ default=[
+ "any",
+ ],
vartype="member",
path="destination",
)
)
params.append(
VersionedParamPath(
- "negate_destination", vartype="yesno", path="negate-destination",
+ "negate_destination",
+ vartype="yesno",
+ path="negate-destination",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "tag",
+ vartype="member",
+ path="tag",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "disabled",
+ vartype="yesno",
+ path="disabled",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "service",
+ vartype="member",
+ path="service",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "source_hip",
+ exclude=True,
)
)
- params.append(VersionedParamPath("tag", vartype="member", path="tag",))
- params.append(VersionedParamPath("disabled", vartype="yesno", path="disabled",))
- params.append(VersionedParamPath("service", vartype="member", path="service",))
- params.append(VersionedParamPath("source_hip", exclude=True,))
params[-1].add_profile(
- "10.0.0", path="source-hip", vartype="member",
+ "10.0.0",
+ path="source-hip",
+ vartype="member",
)
params.append(
VersionedParamPath("source_users", vartype="member", path="source-user")
)
params.append(
- VersionedParamPath("url_categories", vartype="member", path="category",)
+ VersionedParamPath(
+ "url_categories",
+ vartype="member",
+ path="category",
+ )
+ )
+ params.append(
+ VersionedParamPath(
+ "group_tag",
+ exclude=True,
+ )
)
- params.append(VersionedParamPath("group_tag", exclude=True,))
params[-1].add_profile(
- "9.0.0", path="group-tag",
+ "9.0.0",
+ path="group-tag",
+ )
+ params.append(
+ VersionedParamPath(
+ "authentication_enforcement",
+ path="authentication-enforcement",
+ )
)
params.append(
VersionedParamPath(
- "authentication_enforcement", path="authentication-enforcement",
+ "timeout",
+ path="timeout",
)
)
- params.append(VersionedParamPath("timeout", path="timeout",))
params.append(
VersionedParamPath("negate_target", path="target/negate", vartype="yesno")
)
diff --git a/panos/predefined.py b/panos/predefined.py
index c522792d..3c8fd28d 100644
--- a/panos/predefined.py
+++ b/panos/predefined.py
@@ -111,10 +111,20 @@ def _refresh_application(self, name=None):
)
def _refresh_service(self, name=None):
- return self._refresh([(objects.ServiceObject, "service_objects", None),], name,)
+ return self._refresh(
+ [
+ (objects.ServiceObject, "service_objects", None),
+ ],
+ name,
+ )
def _refresh_tag(self, name=None):
- return self._refresh([(objects.Tag, "tag_objects", None),], name,)
+ return self._refresh(
+ [
+ (objects.Tag, "tag_objects", None),
+ ],
+ name,
+ )
def refresh_application(self, name):
"""Refresh a Single Predefined Application
diff --git a/panos/updater.py b/panos/updater.py
index c40cab95..bbf025e4 100644
--- a/panos/updater.py
+++ b/panos/updater.py
@@ -121,7 +121,10 @@ def install(self, version, load_config=None, sync=False):
)
response = self._op(
'request system software install %s version "%s"'
- % ('load-config "{0}"'.format(load_config) if load_config else "", version,)
+ % (
+ 'load-config "{0}"'.format(load_config) if load_config else "",
+ version,
+ )
)
if sync:
result = self.pandevice.syncjob(response)
diff --git a/panos/userid.py b/panos/userid.py
index f8865ed1..4e42580f 100644
--- a/panos/userid.py
+++ b/panos/userid.py
@@ -718,7 +718,13 @@ def tag_user(self, user, tags, timeout=None, prefix=None):
te = entry.find("./tag")
break
else:
- entry = ET.SubElement(ru, "entry", {"user": user,})
+ entry = ET.SubElement(
+ ru,
+ "entry",
+ {
+ "user": user,
+ },
+ )
te = ET.SubElement(entry, "tag")
# Now add in the tags with the specified timeout.
@@ -761,7 +767,13 @@ def untag_user(self, user, tags=None, prefix=None):
if entry.attrib["user"] == user:
break
else:
- entry = ET.SubElement(uu, "entry", {"user": user,})
+ entry = ET.SubElement(
+ uu,
+ "entry",
+ {
+ "user": user,
+ },
+ )
# Do tag removal.
te = entry.find("./tag")
diff --git a/poetry.lock b/poetry.lock
index 64d5685a..b60f1d50 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,46 +1,63 @@
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+
[[package]]
name = "alabaster"
version = "0.7.12"
description = "A configurable sidebar-enabled Sphinx theme"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"},
+ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
+]
[[package]]
name = "appdirs"
version = "1.4.3"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "appdirs-1.4.3-py2.py3-none-any.whl", hash = "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"},
+ {file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"},
+]
[[package]]
name = "argh"
version = "0.26.2"
description = "An unobtrusive argparse wrapper with natural syntax"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "argh-0.26.2-py2.py3-none-any.whl", hash = "sha256:a9b3aaa1904eeb78e32394cd46c6f37ac0fb4af6dc488daa58971bdc7d7fcaf3"},
+ {file = "argh-0.26.2.tar.gz", hash = "sha256:e9535b8c84dc9571a48999094fda7f33e63c3f1b74f3e5f3ac0105a58405bb65"},
+]
[[package]]
name = "atomicwrites"
version = "1.3.0"
description = "Atomic file writes."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "atomicwrites-1.3.0-py2.py3-none-any.whl", hash = "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4"},
+ {file = "atomicwrites-1.3.0.tar.gz", hash = "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"},
+]
[[package]]
name = "attrs"
version = "19.3.0"
description = "Classes Without Boilerplate"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
+ {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
+]
[package.extras]
-azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
-dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
+azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-azurepipelines", "six", "zope.interface"]
+dev = ["coverage", "hypothesis", "pre-commit", "pympler", "pytest (>=4.3.0)", "six", "sphinx", "zope.interface"]
docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
@@ -48,224 +65,285 @@ tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.i
name = "babel"
version = "2.9.1"
description = "Internationalization utilities"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"},
+ {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"},
+]
[package.dependencies]
pytz = ">=2015.7"
-[[package]]
-name = "backports.functools-lru-cache"
-version = "1.6.1"
-description = "Backport of functools.lru_cache"
-category = "dev"
-optional = false
-python-versions = ">=2.6"
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov"]
-
[[package]]
name = "bandit"
-version = "1.6.2"
+version = "1.7.6"
description = "Security oriented static analyser for python code."
-category = "dev"
optional = false
-python-versions = "*"
+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 = ">=1.0.1"
-PyYAML = ">=3.13"
-six = ">=1.10.0"
+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 = "black"
-version = "19.10b0"
+version = "23.12.1"
description = "The uncompromising code formatter."
-category = "dev"
optional = false
-python-versions = ">=3.6"
+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]
-appdirs = "*"
-attrs = ">=18.1.0"
-click = ">=6.5"
-pathspec = ">=0.6,<1"
-regex = "*"
-toml = ">=0.9.4"
-typed-ast = ">=1.4.0"
+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]
-d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
+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 = "certifi"
version = "2019.11.28"
description = "Python package for providing Mozilla's CA Bundle."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"},
+ {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"},
+]
[[package]]
name = "chardet"
version = "3.0.4"
description = "Universal encoding detector for Python 2 and 3"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
+ {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
+]
[[package]]
name = "click"
-version = "7.0"
+version = "8.1.7"
description = "Composable command line interface toolkit"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
+ {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "colorama"
version = "0.4.3"
description = "Cross-platform colored terminal text."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "configparser"
-version = "4.0.2"
-description = "Updated configparser from Python 3.7 for Python 2.6+."
-category = "dev"
-optional = false
-python-versions = ">=2.6"
-
-[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
-testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2)", "pytest-flake8", "pytest-black-multipy"]
+files = [
+ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
+ {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
+]
[[package]]
name = "coverage"
version = "5.0.3"
description = "Code coverage measurement for Python"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+files = [
+ {file = "coverage-5.0.3-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f"},
+ {file = "coverage-5.0.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc"},
+ {file = "coverage-5.0.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a"},
+ {file = "coverage-5.0.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52"},
+ {file = "coverage-5.0.3-cp27-cp27m-win32.whl", hash = "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c"},
+ {file = "coverage-5.0.3-cp27-cp27m-win_amd64.whl", hash = "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73"},
+ {file = "coverage-5.0.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68"},
+ {file = "coverage-5.0.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691"},
+ {file = "coverage-5.0.3-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301"},
+ {file = "coverage-5.0.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf"},
+ {file = "coverage-5.0.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3"},
+ {file = "coverage-5.0.3-cp35-cp35m-win32.whl", hash = "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0"},
+ {file = "coverage-5.0.3-cp35-cp35m-win_amd64.whl", hash = "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0"},
+ {file = "coverage-5.0.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2"},
+ {file = "coverage-5.0.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894"},
+ {file = "coverage-5.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf"},
+ {file = "coverage-5.0.3-cp36-cp36m-win32.whl", hash = "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477"},
+ {file = "coverage-5.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc"},
+ {file = "coverage-5.0.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8"},
+ {file = "coverage-5.0.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987"},
+ {file = "coverage-5.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea"},
+ {file = "coverage-5.0.3-cp37-cp37m-win32.whl", hash = "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc"},
+ {file = "coverage-5.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e"},
+ {file = "coverage-5.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb"},
+ {file = "coverage-5.0.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37"},
+ {file = "coverage-5.0.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d"},
+ {file = "coverage-5.0.3-cp38-cp38m-win32.whl", hash = "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954"},
+ {file = "coverage-5.0.3-cp38-cp38m-win_amd64.whl", hash = "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e"},
+ {file = "coverage-5.0.3-cp39-cp39m-win32.whl", hash = "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40"},
+ {file = "coverage-5.0.3-cp39-cp39m-win_amd64.whl", hash = "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af"},
+ {file = "coverage-5.0.3.tar.gz", hash = "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef"},
+]
[package.extras]
toml = ["toml"]
[[package]]
name = "docutils"
-version = "0.16"
+version = "0.20.1"
description = "Docutils -- Python Documentation Utilities"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "entrypoints"
-version = "0.3"
-description = "Discover and load entry points from installed packages."
-category = "dev"
-optional = false
-python-versions = ">=2.7"
-
-[package.dependencies]
-configparser = {version = ">=3.5", markers = "python_version == \"2.7\""}
-
-[[package]]
-name = "enum34"
-version = "1.1.6"
-description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4"
-category = "dev"
-optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+ {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"},
+ {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"},
+]
[[package]]
name = "eradicate"
-version = "1.0"
+version = "2.3.0"
description = "Removes commented-out code."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "eradicate-2.3.0-py3-none-any.whl", hash = "sha256:2b29b3dd27171f209e4ddd8204b70c02f0682ae95eecb353f10e8d72b149c63e"},
+ {file = "eradicate-2.3.0.tar.gz", hash = "sha256:06df115be3b87d0fc1c483db22a2ebb12bcf40585722810d809cc770f5031c37"},
+]
[[package]]
name = "fissix"
version = "19.2b1"
description = "Backport of lib2to3, with enhancements"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "fissix-19.2b1.tar.gz", hash = "sha256:0ca4e479e4ab08e22d0aadc58d99f359ed9dc808698657c2ce841a71590c42eb"},
+]
[package.dependencies]
appdirs = "*"
[[package]]
name = "flake8"
-version = "3.7.9"
-description = "the modular source code checker: pep8, pyflakes and co"
-category = "dev"
+version = "7.0.0"
+description = "the modular source code checker: pep8 pyflakes and co"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.8.1"
+files = [
+ {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"},
+ {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"},
+]
[package.dependencies]
-configparser = {version = "*", markers = "python_version < \"3.2\""}
-entrypoints = ">=0.3.0,<0.4.0"
-enum34 = {version = "*", markers = "python_version < \"3.4\""}
-functools32 = {version = "*", markers = "python_version < \"3.2\""}
-mccabe = ">=0.6.0,<0.7.0"
-pycodestyle = ">=2.5.0,<2.6.0"
-pyflakes = ">=2.1.0,<2.2.0"
-typing = {version = "*", markers = "python_version < \"3.5\""}
+mccabe = ">=0.7.0,<0.8.0"
+pycodestyle = ">=2.11.0,<2.12.0"
+pyflakes = ">=3.2.0,<3.3.0"
[[package]]
name = "flake8-bugbear"
-version = "20.1.2"
+version = "24.1.17"
description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
-category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8.1"
+files = [
+ {file = "flake8-bugbear-24.1.17.tar.gz", hash = "sha256:bcb388a4f3b516258749b1e690ee394c082eff742f44595e3754cf5c7781c2c7"},
+ {file = "flake8_bugbear-24.1.17-py3-none-any.whl", hash = "sha256:46cc840ddaed26507cd0ada530d1526418b717ee76c9b5dfdbd238b5eab34139"},
+]
[package.dependencies]
attrs = ">=19.2.0"
-flake8 = ">=3.0.0"
+flake8 = ">=6.0.0"
+
+[package.extras]
+dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit", "pytest", "tox"]
[[package]]
name = "flake8-builtins"
-version = "1.4.2"
-description = "Check for python builtins being used as variables or parameters."
-category = "dev"
+version = "2.2.0"
+description = "Check for python builtins being used as variables or parameters"
optional = false
-python-versions = "*"
+python-versions = ">=3.8"
+files = [
+ {file = "flake8_builtins-2.2.0-py3-none-any.whl", hash = "sha256:7ee5766d9c60e5d579dfda84e65c6d0e6c26005f6f59cb9bf722462d7987a807"},
+ {file = "flake8_builtins-2.2.0.tar.gz", hash = "sha256:392d5af3a0720c5a863aa93dc47f48c879081345a143fe9f20d995fe9ff5686a"},
+]
[package.dependencies]
flake8 = "*"
[package.extras]
-test = ["coverage", "coveralls", "mock", "pytest", "pytest-cov"]
+test = ["pytest"]
[[package]]
name = "flake8-comprehensions"
-version = "3.1.4"
+version = "3.14.0"
description = "A flake8 plugin to help you write better list/set/dict comprehensions."
-category = "dev"
optional = false
-python-versions = ">=3.5"
+python-versions = ">=3.8"
+files = [
+ {file = "flake8_comprehensions-3.14.0-py3-none-any.whl", hash = "sha256:7b9d07d94aa88e62099a6d1931ddf16c344d4157deedf90fe0d8ee2846f30e97"},
+ {file = "flake8_comprehensions-3.14.0.tar.gz", hash = "sha256:81768c61bfc064e1a06222df08a2580d97de10cb388694becaf987c331c6c0cf"},
+]
[package.dependencies]
-flake8 = ">=3.0,<3.2.0 || >3.2.0,<4"
-importlib-metadata = {version = "*", markers = "python_version < \"3.8\""}
+flake8 = ">=3.0,<3.2.0 || >3.2.0"
[[package]]
name = "flake8-docstrings"
-version = "1.5.0"
+version = "1.7.0"
description = "Extension for flake8 which uses pydocstyle to check docstrings"
-category = "dev"
optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+ {file = "flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75"},
+ {file = "flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af"},
+]
[package.dependencies]
flake8 = ">=3"
@@ -273,193 +351,210 @@ pydocstyle = ">=2.1"
[[package]]
name = "flake8-eradicate"
-version = "0.2.4"
+version = "1.5.0"
description = "Flake8 plugin to find commented out code"
-category = "dev"
optional = false
-python-versions = ">=3.6,<4.0"
+python-versions = ">=3.8,<4.0"
+files = [
+ {file = "flake8_eradicate-1.5.0-py3-none-any.whl", hash = "sha256:18acc922ad7de623f5247c7d5595da068525ec5437dd53b22ec2259b96ce9d22"},
+ {file = "flake8_eradicate-1.5.0.tar.gz", hash = "sha256:aee636cb9ecb5594a7cd92d67ad73eb69909e5cc7bd81710cf9d00970f3983a6"},
+]
[package.dependencies]
-attrs = ">=18.2,<20.0"
-eradicate = ">=0.2.1,<1.1.0"
-flake8 = ">=3.5,<4.0"
+attrs = "*"
+eradicate = ">=2.0,<3.0"
+flake8 = ">5"
[[package]]
name = "flake8-logging-format"
-version = "0.6.0"
-description = "Flake8 extension to validate (lack of) logging format strings"
-category = "dev"
+version = "0.9.0"
+description = ""
optional = false
python-versions = "*"
+files = [
+ {file = "flake8-logging-format-0.9.0.tar.gz", hash = "sha256:e830cc49091e4b8ab9ea3da69a3da074bd631ce9a7db300e5c89fb48ba4a6986"},
+]
+
+[package.extras]
+lint = ["flake8"]
+test = ["PyHamcrest", "pytest", "pytest-cov"]
[[package]]
name = "flake8-mock"
-version = "0.3"
+version = "0.4"
description = "Provides checking for non-existent mock methods"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "flake8-mock-0.4.tar.gz", hash = "sha256:4a05bac5f66e77661994880dd050705132d19000f17d928a894dfd92d55d4867"},
+ {file = "flake8_mock-0.4-py3-none-any.whl", hash = "sha256:a67c3d22b2e7873c72d3f01d3eb5d06405cd09dc1abea74a0bf6fcf29095e8e6"},
+]
[[package]]
name = "flake8-mutable"
version = "1.2.0"
description = "mutable defaults flake8 extension"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "flake8-mutable-1.2.0.tar.gz", hash = "sha256:ee9b77111b867d845177bbc289d87d541445ffcc6029a0c5c65865b42b18c6a6"},
+ {file = "flake8_mutable-1.2.0-py2-none-any.whl", hash = "sha256:38fd9dadcbcda6550a916197bc40ed76908119dabb37fbcca30873666c31d2d5"},
+]
[package.dependencies]
flake8 = "*"
[[package]]
name = "flake8-pep3101"
-version = "1.3.0"
-description = "Checks for old string formatting."
-category = "dev"
+version = "2.1.0"
+description = "Checks for old string formatting"
optional = false
-python-versions = "*"
+python-versions = ">=3.8"
+files = [
+ {file = "flake8_pep3101-2.1.0-py3-none-any.whl", hash = "sha256:2d2b8b997ccf0bf0df91532e861465dcfa32a6a306d1dc98f93889cae49f4231"},
+ {file = "flake8_pep3101-2.1.0.tar.gz", hash = "sha256:1b84b61685f1e631f2f710e5d5ed3ca68b5fc45fb9402fa8ae1b8a9a058a3387"},
+]
[package.dependencies]
-flake8 = ">=3.0"
+flake8 = "*"
[package.extras]
-test = ["pytest", "testfixtures"]
-
-[[package]]
-name = "flake8-polyfill"
-version = "1.0.2"
-description = "Polyfill package for Flake8 plugins"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[package.dependencies]
-flake8 = "*"
+test = ["pytest"]
[[package]]
name = "flake8-pytest"
-version = "1.3"
+version = "1.4"
description = "pytest assert checker plugin for flake8"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "flake8-pytest-1.4.tar.gz", hash = "sha256:19f543b2d1cc89d61b76f19d0a9e58e9a110a035175f701b3425c363a7732c56"},
+ {file = "flake8_pytest-1.4-py2.py3-none-any.whl", hash = "sha256:97328f258ffad9fe18babb3b0714a16b121505ad3ac87d4e33020874555d0784"},
+]
[package.dependencies]
flake8 = "*"
[[package]]
name = "flake8-string-format"
-version = "0.2.3"
+version = "0.3.0"
description = "string format checker, plugin for flake8"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"},
+ {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"},
+]
[package.dependencies]
flake8 = "*"
[[package]]
name = "flake8-variables-names"
-version = "0.0.3"
+version = "0.0.6"
description = "A flake8 extension that helps to make more readable variables names"
-category = "dev"
optional = false
-python-versions = "*"
-
-[[package]]
-name = "functools32"
-version = "3.2.3-2"
-description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy."
-category = "dev"
-optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+ {file = "flake8_variables_names-0.0.6-py3-none-any.whl", hash = "sha256:4aff935d54b3f7afcd026b4dae55029877bd05a7c507b294b45bc7bf577d7b47"},
+ {file = "flake8_variables_names-0.0.6.tar.gz", hash = "sha256:292c50e4813d632aa3adcd02c185e7bb583f5fc8ebe02e70f13c958bfe46ad91"},
+]
[[package]]
-name = "futures"
-version = "3.1.1"
-description = "Backport of the concurrent.futures package from Python 3.2"
-category = "dev"
-optional = false
-python-versions = "*"
-
-[[package]]
-name = "gitdb2"
-version = "2.0.6"
+name = "gitdb"
+version = "4.0.11"
description = "Git Object Database"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.7"
+files = [
+ {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
+ {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
+]
[package.dependencies]
-smmap2 = ">=2.0.0"
+smmap = ">=3.0.1,<6"
[[package]]
name = "gitpython"
-version = "2.1.15"
-description = "Python Git Library"
-category = "dev"
+version = "3.1.41"
+description = "GitPython is a Python library used to interact with Git repositories"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.7"
+files = [
+ {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"},
+ {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"},
+]
[package.dependencies]
-gitdb2 = ">=2,<3"
+gitdb = ">=4.0.1,<5"
+
+[package.extras]
+test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"]
[[package]]
name = "idna"
version = "2.8"
description = "Internationalized Domain Names in Applications (IDNA)"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"},
+ {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"},
+]
[[package]]
name = "imagesize"
version = "1.2.0"
description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"},
+ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
+]
[[package]]
name = "importlib-metadata"
version = "1.7.0"
description = "Read metadata from Python packages"
-category = "dev"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+files = [
+ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"},
+ {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"},
+]
[package.dependencies]
zipp = ">=0.5"
[package.extras]
-docs = ["sphinx", "rst.linker"]
-testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
+docs = ["rst.linker", "sphinx"]
+testing = ["importlib-resources (>=1.3)", "packaging", "pep517"]
[[package]]
name = "isort"
-version = "4.3.21"
+version = "5.13.2"
description = "A Python utility / library to sort Python imports."
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-"backports.functools-lru-cache" = {version = "*", markers = "python_version < \"3.2\""}
-futures = {version = "*", markers = "python_version < \"3.2\""}
+python-versions = ">=3.8.0"
+files = [
+ {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
+ {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
+]
[package.extras]
-pipfile = ["pipreqs", "requirementslib"]
-pyproject = ["toml"]
-requirements = ["pipreqs", "pip-api"]
-xdg_home = ["appdirs (>=1.4.0)"]
+colors = ["colorama (>=0.4.6)"]
[[package]]
name = "jinja2"
version = "2.11.3"
description = "A very fast and expressive template engine."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"},
+ {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"},
+]
[package.dependencies]
MarkupSafe = ">=0.23"
@@ -471,9 +566,12 @@ i18n = ["Babel (>=0.8)"]
name = "livereload"
version = "2.6.1"
description = "Python LiveReload is an awesome tool for web developers"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "livereload-2.6.1-py2.py3-none-any.whl", hash = "sha256:78d55f2c268a8823ba499305dcac64e28ddeb9a92571e12d543cd304faf5817b"},
+ {file = "livereload-2.6.1.tar.gz", hash = "sha256:89254f78d7529d7ea0a3417d224c34287ebfe266b05e67e51facaf82c27f0f66"},
+]
[package.dependencies]
six = "*"
@@ -483,120 +581,310 @@ tornado = "*"
name = "m2r"
version = "0.2.1"
description = "Markdown and reStructuredText in a single file."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "m2r-0.2.1.tar.gz", hash = "sha256:bf90bad66cda1164b17e5ba4a037806d2443f2a4d5ddc9f6a5554a0322aaed99"},
+]
[package.dependencies]
docutils = "*"
mistune = "*"
+[[package]]
+name = "markdown-it-py"
+version = "3.0.0"
+description = "Python port of markdown-it. Markdown parsing, done right!"
+optional = false
+python-versions = ">=3.8"
+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"},
+]
+
+[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"]
+
[[package]]
name = "markupsafe"
version = "1.1.1"
description = "Safely add untrusted strings to HTML/XML markup."
-category = "dev"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+files = [
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"},
+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"},
+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"},
+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"},
+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"},
+ {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"},
+ {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"},
+ {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"},
+ {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"},
+]
[[package]]
name = "mccabe"
-version = "0.6.1"
+version = "0.7.0"
description = "McCabe checker, plugin for flake8"
-category = "dev"
optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"},
+ {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 = "mistune"
version = "0.8.4"
description = "The fastest markdown parser in pure Python"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"},
+ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"},
+]
[[package]]
name = "more-itertools"
version = "8.1.0"
description = "More routines for operating on iterables, beyond itertools"
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "more-itertools-8.1.0.tar.gz", hash = "sha256:c468adec578380b6281a114cb8a5db34eb1116277da92d7c46f904f0b52d3288"},
+ {file = "more_itertools-8.1.0-py3-none-any.whl", hash = "sha256:1a2a32c72400d365000412fe08eb4a24ebee89997c18d3d147544f70f5403b39"},
+]
+
+[[package]]
+name = "mypy"
+version = "1.8.0"
+description = "Optional static typing for Python"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"},
+ {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"},
+ {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"},
+ {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"},
+ {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"},
+ {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"},
+ {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"},
+ {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"},
+ {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"},
+ {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"},
+ {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"},
+ {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"},
+ {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"},
+ {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"},
+ {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"},
+ {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"},
+ {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"},
+ {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"},
+ {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"},
+ {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"},
+ {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"},
+ {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"},
+ {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"},
+ {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"},
+ {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"},
+ {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"},
+ {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"},
+]
+
+[package.dependencies]
+mypy-extensions = ">=1.0.0"
+tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
+typing-extensions = ">=4.1.0"
+
+[package.extras]
+dmypy = ["psutil (>=4.0)"]
+install-types = ["pip"]
+mypyc = ["setuptools (>=50)"]
+reports = ["lxml"]
+
+[[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 = "packaging"
-version = "20.0"
+version = "23.2"
description = "Core utilities for Python packages"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-
-[package.dependencies]
-pyparsing = ">=2.0.2"
-six = "*"
+python-versions = ">=3.7"
+files = [
+ {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"},
+ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"},
+]
[[package]]
name = "pan-python"
version = "0.17.0"
description = "Multi-tool set for Palo Alto Networks PAN-OS, Panorama, WildFire and AutoFocus"
-category = "main"
optional = false
python-versions = "*"
+files = [
+ {file = "pan-python-0.17.0.tar.gz", hash = "sha256:9c074ea2f69a63996a6fefe8935d60dca61660e14715ac19d257ea9b1c41c6e2"},
+ {file = "pan_python-0.17.0-py2.py3-none-any.whl", hash = "sha256:f4674e40763c46d5933244b3059a57884e4e28205ef6d0f9ce2dc2013e3db010"},
+]
[[package]]
name = "pathlib2"
version = "2.3.5"
description = "Object-oriented filesystem paths"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"},
+ {file = "pathlib2-2.3.5.tar.gz", hash = "sha256:6cd9a47b597b37cc57de1c05e56fb1a1c9cc9fab04fe78c29acd090418529868"},
+]
[package.dependencies]
-scandir = {version = "*", markers = "python_version < \"3.5\""}
six = "*"
[[package]]
name = "pathspec"
-version = "0.7.0"
+version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.8"
+files = [
+ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
+ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
+]
[[package]]
name = "pathtools"
version = "0.1.2"
description = "File system general utilities"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "pathtools-0.1.2.tar.gz", hash = "sha256:7c35c5421a39bb82e58018febd90e3b6e5db34c5443aaaf742b3f33d4655f1c0"},
+]
[[package]]
name = "pbr"
version = "5.4.4"
description = "Python Build Reasonableness"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "pbr-5.4.4-py2.py3-none-any.whl", hash = "sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488"},
+ {file = "pbr-5.4.4.tar.gz", hash = "sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b"},
+]
[[package]]
name = "pep8-naming"
-version = "0.9.1"
+version = "0.13.3"
description = "Check PEP-8 naming conventions, plugin for flake8"
-category = "dev"
optional = false
-python-versions = "*"
+python-versions = ">=3.7"
+files = [
+ {file = "pep8-naming-0.13.3.tar.gz", hash = "sha256:1705f046dfcd851378aac3be1cd1551c7c1e5ff363bacad707d43007877fa971"},
+ {file = "pep8_naming-0.13.3-py3-none-any.whl", hash = "sha256:1a86b8c71a03337c97181917e2b472f0f5e4ccb06844a0d6f0a33522549e7a80"},
+]
[package.dependencies]
-flake8-polyfill = ">=1.0.2,<2"
+flake8 = ">=5.0.0"
+
+[[package]]
+name = "platformdirs"
+version = "4.1.0"
+description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"},
+ {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
[[package]]
name = "pluggy"
version = "0.13.1"
description = "plugin and hook calling mechanisms for python"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"},
+ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
+]
[package.dependencies]
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
@@ -608,9 +896,12 @@ dev = ["pre-commit", "tox"]
name = "poetry-core"
version = "1.0.8"
description = "Poetry PEP 517 Build Backend"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"},
+ {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"},
+]
[package.dependencies]
importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""}
@@ -619,9 +910,12 @@ importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \
name = "poetry2setup"
version = "1.1.0"
description = "Convert python-poetry to setup.py"
-category = "dev"
optional = false
python-versions = ">=3.6,<4.0"
+files = [
+ {file = "poetry2setup-1.1.0-py3-none-any.whl", hash = "sha256:aad820a89d94ae88db9f39a4fc57337963a8faf59830f4f93be171852e67a697"},
+ {file = "poetry2setup-1.1.0.tar.gz", hash = "sha256:87591578fc0b68e1716261c5f3ef7ed436cdc0e1174e629a36de4244c245beeb"},
+]
[package.dependencies]
poetry-core = ">=1.0.0,<2.0.0"
@@ -630,68 +924,83 @@ poetry-core = ">=1.0.0,<2.0.0"
name = "port-for"
version = "0.3.1"
description = "Utility that helps with local TCP ports managment. It can find an unused TCP localhost port and remember the association."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "port-for-0.3.1.tar.gz", hash = "sha256:b16a84bb29c2954db44c29be38b17c659c9c27e33918dec16b90d375cc596f1c"},
+]
[[package]]
name = "py"
version = "1.10.0"
description = "library with cross-python path, ini-parsing, io, code, log facilities"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"},
+ {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"},
+]
[[package]]
name = "pycodestyle"
-version = "2.5.0"
+version = "2.11.1"
description = "Python style guide checker"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.8"
+files = [
+ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"},
+ {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"},
+]
[[package]]
name = "pydocstyle"
version = "4.0.0"
description = "Python docstring style checker"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "pydocstyle-4.0.0-py3-none-any.whl", hash = "sha256:58c421dd605eec0bce65df8b8e5371bb7ae421582cdf0ba8d9435ac5b0ffc36a"},
+]
[package.dependencies]
snowballstemmer = "*"
[[package]]
name = "pyflakes"
-version = "2.1.1"
+version = "3.2.0"
description = "passive checker of Python programs"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.8"
+files = [
+ {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"},
+ {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"},
+]
[[package]]
name = "pygments"
-version = "2.5.2"
+version = "2.17.2"
description = "Pygments is a syntax highlighting package written in Python."
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+python-versions = ">=3.7"
+files = [
+ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"},
+ {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"},
+]
-[[package]]
-name = "pyparsing"
-version = "2.4.6"
-description = "Python parsing module"
-category = "dev"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
+[package.extras]
+plugins = ["importlib-metadata"]
+windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pytest"
version = "5.3.2"
description = "pytest: simple powerful testing with Python"
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"},
+ {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"},
+]
[package.dependencies]
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
@@ -712,9 +1021,12 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm
name = "pytest-cov"
version = "2.8.1"
description = "Pytest plugin for measuring coverage."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pytest-cov-2.8.1.tar.gz", hash = "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b"},
+ {file = "pytest_cov-2.8.1-py2.py3-none-any.whl", hash = "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"},
+]
[package.dependencies]
coverage = ">=4.4"
@@ -727,33 +1039,82 @@ testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "virtualenv"]
name = "pytz"
version = "2019.3"
description = "World timezone definitions, modern and historical"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"},
+ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"},
+]
[[package]]
name = "pyyaml"
-version = "5.3"
+version = "6.0.1"
description = "YAML parser and emitter for Python"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "regex"
-version = "2020.1.8"
-description = "Alternative regular expression module, to replace re."
-category = "dev"
-optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
+ {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"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
+ {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_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"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
+ {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
+ {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"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
+ {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"},
+]
[[package]]
name = "requests"
version = "2.25.1"
description = "Python HTTP for Humans."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"},
+ {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"},
+]
[package.dependencies]
certifi = ">=2017.4.17"
@@ -762,48 +1123,86 @@ idna = ">=2.5,<3"
urllib3 = ">=1.21.1,<1.27"
[package.extras]
-security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
+security = ["cryptography (>=1.3.4)", "pyOpenSSL (>=0.14)"]
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
[[package]]
-name = "scandir"
-version = "1.10.0"
-description = "scandir, a better directory iterator and faster os.walk()"
-category = "dev"
+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 = "*"
+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 = "setuptools"
+version = "44.1.1"
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+files = [
+ {file = "setuptools-44.1.1-py2.py3-none-any.whl", hash = "sha256:27a714c09253134e60a6fa68130f78c7037e5562c4f21f8f318f2ae900d152d5"},
+ {file = "setuptools-44.1.1.zip", hash = "sha256:c67aa55db532a0dadc4d2e20ba9961cbd3ccc84d544e9029699822542b5a476b"},
+]
+
+[package.extras]
+certs = ["certifi (==2016.9.26)"]
+ssl = ["wincertstore (==0.2)"]
[[package]]
name = "six"
version = "1.14.0"
description = "Python 2 and 3 compatibility utilities"
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+ {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"},
+ {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"},
+]
[[package]]
-name = "smmap2"
-version = "2.0.5"
+name = "smmap"
+version = "5.0.1"
description = "A pure Python implementation of a sliding window memory map manager"
-category = "dev"
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+python-versions = ">=3.7"
+files = [
+ {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
+ {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
+]
[[package]]
name = "snowballstemmer"
version = "2.0.0"
description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"},
+ {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"},
+]
[[package]]
name = "sphinx"
version = "2.4.3"
description = "Python documentation generator"
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "Sphinx-2.4.3-py3-none-any.whl", hash = "sha256:776ff8333181138fae52df65be733127539623bb46cc692e7fa0fcfc80d7aa88"},
+ {file = "Sphinx-2.4.3.tar.gz", hash = "sha256:ca762da97c3b5107cbf0ab9e11d3ec7ab8d3c31377266fd613b962ed971df709"},
+]
[package.dependencies]
alabaster = ">=0.7,<0.8"
@@ -815,6 +1214,7 @@ Jinja2 = ">=2.3"
packaging = "*"
Pygments = ">=2.0"
requests = ">=2.5.0"
+setuptools = "*"
snowballstemmer = ">=1.1"
sphinxcontrib-applehelp = "*"
sphinxcontrib-devhelp = "*"
@@ -825,15 +1225,18 @@ sphinxcontrib-serializinghtml = "*"
[package.extras]
docs = ["sphinxcontrib-websupport"]
-test = ["pytest (<5.3.3)", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"]
+test = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-import-order", "html5lib", "mypy (>=0.761)", "pytest (<5.3.3)", "pytest-cov"]
[[package]]
name = "sphinx-autobuild"
version = "0.7.1"
description = "Watch a Sphinx directory and rebuild the documentation when a change is detected. Also includes a livereload enabled web server."
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinx-autobuild-0.7.1.tar.gz", hash = "sha256:66388f81884666e3821edbe05dd53a0cfb68093873d17320d0610de8db28c74e"},
+ {file = "sphinx_autobuild-0.7.1-py2-none-any.whl", hash = "sha256:e60aea0789cab02fa32ee63c7acae5ef41c06f1434d9fd0a74250a61f5994692"},
+]
[package.dependencies]
argh = ">=0.24.1"
@@ -848,9 +1251,12 @@ watchdog = ">=0.7.1"
name = "sphinx-rtd-theme"
version = "0.4.3"
description = "Read the Docs theme for Sphinx"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinx_rtd_theme-0.4.3-py2.py3-none-any.whl", hash = "sha256:00cf895504a7895ee433807c62094cf1e95f065843bf3acd17037c3e9a2becd4"},
+ {file = "sphinx_rtd_theme-0.4.3.tar.gz", hash = "sha256:728607e34d60456d736cc7991fd236afb828b21b82f956c5ea75f94c8414040a"},
+]
[package.dependencies]
sphinx = "*"
@@ -859,132 +1265,164 @@ sphinx = "*"
name = "sphinxcontrib-applehelp"
version = "1.0.1"
description = ""
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinxcontrib-applehelp-1.0.1.tar.gz", hash = "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897"},
+ {file = "sphinxcontrib_applehelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy"]
+test = ["flake8", "mypy", "pytest"]
[[package]]
name = "sphinxcontrib-devhelp"
version = "1.0.1"
description = ""
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinxcontrib-devhelp-1.0.1.tar.gz", hash = "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34"},
+ {file = "sphinxcontrib_devhelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy"]
+test = ["flake8", "mypy", "pytest"]
[[package]]
name = "sphinxcontrib-htmlhelp"
version = "1.0.2"
description = ""
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinxcontrib-htmlhelp-1.0.2.tar.gz", hash = "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422"},
+ {file = "sphinxcontrib_htmlhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy", "html5lib"]
+test = ["flake8", "html5lib", "mypy", "pytest"]
[[package]]
name = "sphinxcontrib-jsmath"
version = "1.0.1"
description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"},
+ {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy"]
+test = ["flake8", "mypy", "pytest"]
[[package]]
name = "sphinxcontrib-qthelp"
version = "1.0.2"
description = ""
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinxcontrib-qthelp-1.0.2.tar.gz", hash = "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f"},
+ {file = "sphinxcontrib_qthelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy"]
+test = ["flake8", "mypy", "pytest"]
[[package]]
name = "sphinxcontrib-serializinghtml"
version = "1.1.3"
description = ""
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "sphinxcontrib-serializinghtml-1.1.3.tar.gz", hash = "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227"},
+ {file = "sphinxcontrib_serializinghtml-1.1.3-py2.py3-none-any.whl", hash = "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768"},
+]
[package.extras]
-test = ["pytest", "flake8", "mypy"]
+test = ["flake8", "mypy", "pytest"]
[[package]]
name = "stevedore"
version = "1.31.0"
description = "Manage dynamic plugins for Python applications"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "stevedore-1.31.0-py2.py3-none-any.whl", hash = "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730"},
+ {file = "stevedore-1.31.0.tar.gz", hash = "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"},
+]
[package.dependencies]
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
six = ">=1.10.0"
[[package]]
-name = "toml"
-version = "0.10.0"
-description = "Python Library for Tom's Obvious, Minimal Language"
-category = "dev"
+name = "tomli"
+version = "1.2.3"
+description = "A lil' TOML parser"
optional = false
-python-versions = "*"
+python-versions = ">=3.6"
+files = [
+ {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"},
+ {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"},
+]
[[package]]
name = "tornado"
version = "6.0.3"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-category = "dev"
optional = false
python-versions = ">= 3.5"
+files = [
+ {file = "tornado-6.0.3-cp35-cp35m-win32.whl", hash = "sha256:c9399267c926a4e7c418baa5cbe91c7d1cf362d505a1ef898fde44a07c9dd8a5"},
+ {file = "tornado-6.0.3-cp35-cp35m-win_amd64.whl", hash = "sha256:398e0d35e086ba38a0427c3b37f4337327231942e731edaa6e9fd1865bbd6f60"},
+ {file = "tornado-6.0.3-cp36-cp36m-win32.whl", hash = "sha256:4e73ef678b1a859f0cb29e1d895526a20ea64b5ffd510a2307b5998c7df24281"},
+ {file = "tornado-6.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:349884248c36801afa19e342a77cc4458caca694b0eda633f5878e458a44cb2c"},
+ {file = "tornado-6.0.3-cp37-cp37m-win32.whl", hash = "sha256:559bce3d31484b665259f50cd94c5c28b961b09315ccd838f284687245f416e5"},
+ {file = "tornado-6.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:abbe53a39734ef4aba061fca54e30c6b4639d3e1f59653f0da37a0003de148c7"},
+ {file = "tornado-6.0.3.tar.gz", hash = "sha256:c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9"},
+]
[[package]]
-name = "typed-ast"
-version = "1.5.2"
-description = "a fork of Python 2 and 3 ast modules with type comment support"
-category = "dev"
+name = "typing-extensions"
+version = "4.1.1"
+description = "Backported and Experimental Type Hints for Python 3.6+"
optional = false
python-versions = ">=3.6"
-
-[[package]]
-name = "typing"
-version = "3.7.4.1"
-description = "Type Hints for Python"
-category = "dev"
-optional = false
-python-versions = "*"
+files = [
+ {file = "typing_extensions-4.1.1-py3-none-any.whl", hash = "sha256:21c85e0fe4b9a155d0799430b0ad741cdce7e359660ccbd8b530613e8df88ce2"},
+ {file = "typing_extensions-4.1.1.tar.gz", hash = "sha256:1a9462dcc3347a79b1f1c0271fbe79e844580bb598bafa1ed208b94da3cdcd42"},
+]
[[package]]
name = "urllib3"
version = "1.26.5"
description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
+files = [
+ {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"},
+ {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"},
+]
[package.extras]
brotli = ["brotlipy (>=0.6.0)"]
-secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"]
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
[[package]]
name = "watchdog"
version = "0.9.0"
description = "Filesystem events monitoring"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "watchdog-0.9.0.tar.gz", hash = "sha256:965f658d0732de3188211932aeb0bb457587f04f63ab4c1e33eab878e9de961d"},
+]
[package.dependencies]
argh = ">=0.24.1"
@@ -995,122 +1433,32 @@ PyYAML = ">=3.10"
name = "wcwidth"
version = "0.1.8"
description = "Measures number of Terminal column cells of wide-character codes"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "wcwidth-0.1.8-py2.py3-none-any.whl", hash = "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603"},
+ {file = "wcwidth-0.1.8.tar.gz", hash = "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8"},
+]
[[package]]
name = "zipp"
version = "1.0.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "dev"
optional = false
python-versions = ">=2.7"
+files = [
+ {file = "zipp-1.0.0-py2.py3-none-any.whl", hash = "sha256:8dda78f06bd1674bd8720df8a50bb47b6e1233c503a4eed8e7810686bde37656"},
+ {file = "zipp-1.0.0.tar.gz", hash = "sha256:d38fbe01bbf7a3593a32bc35a9c4453c32bc42b98c377f9bff7e9f8da157786c"},
+]
[package.dependencies]
more-itertools = "*"
[package.extras]
-docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
-testing = ["pathlib2", "contextlib2", "unittest2"]
+docs = ["jaraco.packaging (>=3.2)", "rst.linker (>=1.9)", "sphinx"]
+testing = ["contextlib2", "pathlib2", "unittest2"]
[metadata]
-lock-version = "1.1"
+lock-version = "2.0"
python-versions = "^2.7 || ^3.5"
-content-hash = "60f8b23d84ef4c1dc18793ff2cc5a36b9d22f16e65d3bac99a606e07944d3c45"
-
-[metadata.files]
-alabaster = []
-appdirs = []
-argh = []
-atomicwrites = []
-attrs = []
-babel = []
-"backports.functools-lru-cache" = []
-bandit = []
-black = []
-certifi = []
-chardet = []
-click = []
-colorama = []
-configparser = []
-coverage = []
-docutils = []
-entrypoints = []
-enum34 = []
-eradicate = []
-fissix = []
-flake8 = []
-flake8-bugbear = []
-flake8-builtins = []
-flake8-comprehensions = []
-flake8-docstrings = []
-flake8-eradicate = []
-flake8-logging-format = []
-flake8-mock = []
-flake8-mutable = []
-flake8-pep3101 = []
-flake8-polyfill = []
-flake8-pytest = []
-flake8-string-format = []
-flake8-variables-names = []
-functools32 = []
-futures = []
-gitdb2 = []
-gitpython = []
-idna = []
-imagesize = []
-importlib-metadata = []
-isort = []
-jinja2 = []
-livereload = []
-m2r = []
-markupsafe = []
-mccabe = []
-mistune = []
-more-itertools = []
-packaging = []
-pan-python = []
-pathlib2 = []
-pathspec = []
-pathtools = []
-pbr = []
-pep8-naming = []
-pluggy = []
-poetry-core = []
-poetry2setup = []
-port-for = []
-py = []
-pycodestyle = []
-pydocstyle = []
-pyflakes = []
-pygments = []
-pyparsing = []
-pytest = []
-pytest-cov = []
-pytz = []
-pyyaml = []
-regex = []
-requests = []
-scandir = []
-six = []
-smmap2 = []
-snowballstemmer = []
-sphinx = []
-sphinx-autobuild = []
-sphinx-rtd-theme = []
-sphinxcontrib-applehelp = []
-sphinxcontrib-devhelp = []
-sphinxcontrib-htmlhelp = []
-sphinxcontrib-jsmath = []
-sphinxcontrib-qthelp = []
-sphinxcontrib-serializinghtml = []
-stevedore = []
-toml = []
-tornado = []
-typed-ast = []
-typing = []
-urllib3 = []
-watchdog = []
-wcwidth = []
-zipp = []
+content-hash = "51f9c8c3bda1cf97f8832a8ca6de3105a7dea786745d88134a63caa0282c7d14"
diff --git a/pyproject.toml b/pyproject.toml
index 4916e625..317f1a3d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -28,32 +28,35 @@ classifiers = [
python = "^2.7 || ^3.5"
pan-python = "^0.17.0"
-[tool.poetry.dev-dependencies]
+[tool.poetry.group.dev.dependencies]
pytest = {version = "^5.3.2", python = "^3.5"}
-black = {version = "^19.10b0", python = "^3.6"}
-flake8-eradicate = {version = "^0.2.4", python = "^3.6"}
-flake8-bugbear = {version = "^20.1.2", python = "^3.6"}
-flake8 = "^3.7.9"
-flake8-logging-format = "^0.6.0"
-flake8-pep3101 = "^1.3.0"
-flake8-builtins = "^1.4.2"
-flake8-comprehensions = {version = "^3.1.4", python = "^3.5"}
-flake8-string-format = "^0.2.3"
-flake8-mutable = "^1.2.0"
-flake8-pytest = "^1.3"
-flake8-mock = "^0.3"
-flake8-docstrings = "^1.5.0"
-flake8-variables-names = "^0.0.3"
-pep8-naming = "^0.9.1"
+black = {version = "^23.12.1", python = "^3.8"}
+flake8-eradicate = {version = "^1.5.0", python = "^3.8.1"}
+flake8-bugbear = {version = "^24.1.17", python = "^3.8.1"}
+flake8 = {version = "^7.0.0", python = "^3.8.1"}
+flake8-logging-format = {version = "^0.9.0", python = "^3.8.1"}
+flake8-pep3101 = {version = "^2.1.0", python = "^3.8.1"}
+flake8-builtins = {version = "^2.2.0", python = "^3.8.1"}
+flake8-comprehensions = {version = "^3.14.0", python = "^3.8.1"}
+flake8-string-format = {version = "^0.3.0", python = "^3.8.1"}
+flake8-mutable = {version = "^1.2.0", python = "^3.8.1"}
+flake8-pytest = {version = "^1.4", python = "^3.8.1"}
+flake8-mock = {version = "^0.4", python = "^3.8.1"}
+flake8-docstrings = {version = "^1.7.0", python = "^3.8.1"}
+flake8-variables-names = {version = "^0.0.6", python = "^3.8.1"}
+pep8-naming = {version = "^0.13.3", python = "^3.7"}
poetry2setup = {version = "^1.1.0", python = ">=3.6"}
fissix = {version = "^19.2b1", python = "^3.6"}
sphinx = {version = "^2.3.1", python = "^3.5"}
pytest-cov = {version = "^2.8.1", python = "^3.5"}
sphinx_rtd_theme = {version = "^0.4.3", python = "^3.5"}
sphinx-autobuild = {version = "^0.7.1", python = "^3.5"}
-bandit = "^1.6.2"
-isort = "^4.3.21"
+bandit = {version = "^1.7.6", python = "^3.8"}
+isort = {version = "^5.13.2", python = "^3.8"}
m2r = "^0.2.1"
+mypy = {version = "^1.8.0", python = "^3.8"}
+packaging = {version = "^23.2", python = "^3.7"}
+docutils = {version = "^0.20.1", python = "^3.7"}
[build-system]
requires = ["poetry>=0.12"]
diff --git a/tests/live/conftest.py b/tests/live/conftest.py
index d324367c..8d379d35 100644
--- a/tests/live/conftest.py
+++ b/tests/live/conftest.py
@@ -122,7 +122,10 @@ def init():
fw = random.choice(fws)
panorama_fw_combinations.append(
- ((pano, fw), desc(pano_version, fw_version),)
+ (
+ (pano, fw),
+ desc(pano_version, fw_version),
+ )
)
diff --git a/tests/live/test_network.py b/tests/live/test_network.py
index 2fdba57d..b63852ec 100644
--- a/tests/live/test_network.py
+++ b/tests/live/test_network.py
@@ -6,7 +6,10 @@
class TestZoneBasic(testlib.FwFlow):
def setup_state_obj(self, fw, state):
- state.obj = network.Zone(testlib.random_name(), mode="layer3",)
+ state.obj = network.Zone(
+ testlib.random_name(),
+ mode="layer3",
+ )
fw.add(state.obj)
def update_state_obj(self, fw, state):
@@ -65,7 +68,10 @@ def create_dependencies(self, fw, state):
state.parent.create()
def setup_state_obj(self, fw, state):
- state.obj = network.StaticMac(testlib.random_mac(), state.eths[0],)
+ state.obj = network.StaticMac(
+ testlib.random_mac(),
+ state.eths[0],
+ )
state.parent.add(state.obj)
def update_state_obj(self, fw, state):
@@ -102,7 +108,9 @@ def create_dependencies(self, fw, state):
def setup_state_obj(self, fw, state):
state.obj = network.Vlan(
- testlib.random_name(), state.eths[0], state.vlan_interface.uid,
+ testlib.random_name(),
+ state.eths[0],
+ state.vlan_interface.uid,
)
fw.add(state.obj)
@@ -324,7 +332,9 @@ def create_dependencies(self, fw, state):
state.eth = testlib.get_available_interfaces(fw)[0]
state.parent = network.EthernetInterface(
- state.eth, "layer3", ip=testlib.random_ip("/24"),
+ state.eth,
+ "layer3",
+ ip=testlib.random_ip("/24"),
)
fw.add(state.parent)
state.parent.create()
@@ -368,7 +378,10 @@ def create_dependencies(self, fw, state):
state.eth = None
state.eth = testlib.get_available_interfaces(fw)[0]
- state.parent = network.EthernetInterface(state.eth, "layer2",)
+ state.parent = network.EthernetInterface(
+ state.eth,
+ "layer2",
+ )
fw.add(state.parent)
state.parent.create()
@@ -376,7 +389,9 @@ def setup_state_obj(self, fw, state):
tag = random.randint(1, 4000)
name = "{0}.{1}".format(state.eth, tag)
state.obj = network.Layer2Subinterface(
- name, tag, comment="This is my L2 subinterface",
+ name,
+ tag,
+ comment="This is my L2 subinterface",
)
state.parent.add(state.obj)
@@ -861,14 +876,16 @@ def create_dependencies(self, fw, state):
if self.WITH_BGP_IMPORT_RULE:
state.import_rule = network.BgpPolicyImportRule(
- name=testlib.random_name(), enable=True,
+ name=testlib.random_name(),
+ enable=True,
)
state.bgp.add(state.import_rule)
state.bgp.apply()
if self.WITH_BGP_EXPORT_RULE:
state.export_rule = network.BgpPolicyExportRule(
- name=testlib.random_name(), enable=True,
+ name=testlib.random_name(),
+ enable=True,
)
state.bgp.add(state.export_rule)
state.bgp.apply()
@@ -1409,7 +1426,9 @@ def setup_state_obj(self, fw, state):
# 'match_afi': 'ip',
# 'match_safi': 'ip',
"match_route_table": "unicast",
- "match_nexthop": [testlib.random_ip("/32"),],
+ "match_nexthop": [
+ testlib.random_ip("/32"),
+ ],
"match_from_peer": state.peer.name,
"match_med": random.randint(0, 4294967295),
"match_as_path_regex": "as-path-regex",
@@ -1491,7 +1510,8 @@ class MakeBgpPolicyAddressPrefix(MakeVirtualRouter):
def setup_state_obj(self, fw, state):
state.obj = network.BgpPolicyAddressPrefix(
- name=testlib.random_netmask(), exact=True,
+ name=testlib.random_netmask(),
+ exact=True,
)
if self.WITH_BGP_IMPORT_RULE:
state.import_rule.add(state.obj)
@@ -1547,7 +1567,9 @@ def setup_state_obj(self, fw, state):
)
advert.extend(prefixes)
state.obj = network.BgpPolicyConditionalAdvertisement(
- name=testlib.random_name(), enable=True, used_by=state.pg.name,
+ name=testlib.random_name(),
+ enable=True,
+ used_by=state.pg.name,
)
state.obj.add(non_exist)
state.obj.add(advert)
@@ -2526,8 +2548,12 @@ class TestIkeCryptoProfile(testlib.FwFlow):
def setup_state_obj(self, fw, state):
state.obj = network.IkeCryptoProfile(
testlib.random_name(),
- authentication=["sha256",],
- dh_group=["group1",],
+ authentication=[
+ "sha256",
+ ],
+ dh_group=[
+ "group1",
+ ],
lifetime_minutes=42,
)
fw.add(state.obj)
@@ -2613,7 +2639,8 @@ def create_dependencies(self, fw, state):
raise ValueError("IkeGateway not supported for version < 7.0")
state.lbi = network.LoopbackInterface(
- "loopback.{0}".format(random.randint(5, 20)), ipv6_enabled=True,
+ "loopback.{0}".format(random.randint(5, 20)),
+ ipv6_enabled=True,
)
state.lbi.add(network.IPv6Address(testlib.random_ipv6()))
state.lbi.add(network.IPv6Address(testlib.random_ipv6()))
diff --git a/tests/live/test_objects.py b/tests/live/test_objects.py
index c0bd5993..daa4dad9 100644
--- a/tests/live/test_objects.py
+++ b/tests/live/test_objects.py
@@ -29,7 +29,8 @@ def create_dependencies(self, dev, state):
def setup_state_obj(self, dev, state):
state.obj = objects.AddressGroup(
- testlib.random_name(), [x.name for x in state.aos[:2]],
+ testlib.random_name(),
+ [x.name for x in state.aos[:2]],
)
dev.add(state.obj)
@@ -71,7 +72,8 @@ def setup_state_obj(self, dev, state):
def update_state_obj(self, dev, state):
state.obj.dynamic_value = "'{0}' and '{1}'".format(
- state.tags[2].name, state.tags[3].name,
+ state.tags[2].name,
+ state.tags[3].name,
)
state.obj.tag = state.tags[1].name
@@ -86,7 +88,9 @@ def cleanup_dependencies(self, dev, state):
class TestTag(testlib.DevFlow):
def setup_state_obj(self, dev, state):
state.obj = objects.Tag(
- testlib.random_name(), color="color1", comments="My new tag",
+ testlib.random_name(),
+ color="color1",
+ comments="My new tag",
)
dev.add(state.obj)
diff --git a/tests/live/test_userid.py b/tests/live/test_userid.py
index ead99456..7e2adc5a 100644
--- a/tests/live/test_userid.py
+++ b/tests/live/test_userid.py
@@ -67,7 +67,11 @@ def test_08_get_registered_ip(self, fw, state_map):
test4 = set(fw.userid.get_registered_ip(ips, tags[0:5]))
assert test4 == set(ips)
test5 = set(fw.userid.get_registered_ip(ips[0], tags[0]))
- assert test5 == set([ips[0],])
+ assert test5 == set(
+ [
+ ips[0],
+ ]
+ )
tests = [test1, test2, test3, test4, test5]
assert len(test5) != 0
assert all([test1 >= x for x in tests])
diff --git a/tests/live/testlib.py b/tests/live/testlib.py
index 178f4f66..959f3781 100644
--- a/tests/live/testlib.py
+++ b/tests/live/testlib.py
@@ -24,7 +24,9 @@ def random_ip(netmask=None):
def random_netmask():
return "{0}.{1}.{2}.0/24".format(
- random.randint(11, 150), random.randint(1, 200), random.randint(1, 200),
+ random.randint(11, 150),
+ random.randint(1, 200),
+ random.randint(1, 200),
)
diff --git a/tests/test_base.py b/tests/test_base.py
index 235a55d4..1eb0c6db 100644
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -84,7 +84,13 @@ def test_add_without_children(self):
ret_value = self.obj.add(child)
self.assertEqual(child, ret_value)
- self.verify_object(self.obj, name=OBJECT_NAME, children=[child,])
+ self.verify_object(
+ self.obj,
+ name=OBJECT_NAME,
+ children=[
+ child,
+ ],
+ )
self.verify_object(child, name=CHILD_NAME, parent=self.obj)
def test_add_with_children(self):
@@ -113,7 +119,13 @@ def test_insert_without_children(self):
ret_val = self.obj.insert(0, child)
self.assertEqual(child, ret_val)
- self.verify_object(self.obj, name=OBJECT_NAME, children=[child,])
+ self.verify_object(
+ self.obj,
+ name=OBJECT_NAME,
+ children=[
+ child,
+ ],
+ )
self.verify_object(child, name=CHILD_NAME, parent=self.obj)
def test_insert_with_children(self):
@@ -215,7 +227,13 @@ def test_remove(self):
ret_val = self.obj.remove(child2)
self.assertIsNone(ret_val)
- self.verify_object(self.obj, name=OBJECT_NAME, children=[child1,])
+ self.verify_object(
+ self.obj,
+ name=OBJECT_NAME,
+ children=[
+ child1,
+ ],
+ )
self.verify_object(child1, name=CHILD1_NAME, parent=self.obj)
self.verify_object(child2, name=CHILD2_NAME)
@@ -455,7 +473,9 @@ def test_apply_with_ha_sync(self, m_uid):
self.assertIsNone(ret_val)
m_panos.set_config_changed.assert_called_once_with()
m_panos.active().xapi.edit.assert_called_once_with(
- PanDeviceXpath, PanDeviceElementStr, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ PanDeviceElementStr,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath.assert_called_once_with()
self.obj.element_str.assert_called_once_with()
@@ -487,7 +507,9 @@ def test_apply_without_ha_sync(self, m_uid):
self.assertIsNone(ret_val)
m_panos.set_config_changed.assert_called_once_with()
m_panos.xapi.edit.assert_called_once_with(
- PanDeviceXpath, PanDeviceElementStr, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ PanDeviceElementStr,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath.assert_called_once_with()
self.obj.element_str.assert_called_once_with()
@@ -517,7 +539,9 @@ def test_create_with_ha_sync(self, m_uid):
self.assertIsNone(ret_val)
m_panos.set_config_changed.assert_called_once_with()
m_panos.active().xapi.set.assert_called_once_with(
- PanDeviceXpath, PanDeviceElementStr, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ PanDeviceElementStr,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath_short.assert_called_once_with()
self.obj.element_str.assert_called_once_with()
@@ -549,7 +573,9 @@ def test_create_without_ha_sync(self, m_uid):
self.assertIsNone(ret_val)
m_panos.set_config_changed.assert_called_once_with()
m_panos.xapi.set.assert_called_once_with(
- PanDeviceXpath, PanDeviceElementStr, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ PanDeviceElementStr,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath_short.assert_called_once_with()
self.obj.element_str.assert_called_once_with()
@@ -577,7 +603,8 @@ def test_delete_with_ha_sync_no_parent(self, m_uid):
self.assertIsNone(ret_val)
m_panos.set_config_changed.assert_called_once_with()
m_panos.active().xapi.delete.assert_called_once_with(
- PanDeviceXpath, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath.assert_called_once_with()
for c in self.obj.children:
@@ -607,7 +634,8 @@ def test_delete_with_ha_sync_and_parent(self, m_uid):
self.obj.parent.remove.assert_called_once_with(self.obj)
m_panos.set_config_changed.assert_called_once_with()
m_panos.active().xapi.delete.assert_called_once_with(
- PanDeviceXpath, retry_on_peer=self.obj.HA_SYNC,
+ PanDeviceXpath,
+ retry_on_peer=self.obj.HA_SYNC,
)
self.obj.xpath.assert_called_once_with()
for c in self.obj.children:
@@ -1152,7 +1180,8 @@ def test_no_fallback_raises_value_error(self):
parent = None
obj = Base.ParentAwareXpath()
obj.add_profile(
- parents=("ParentClass1",), value="/some/path",
+ parents=("ParentClass1",),
+ value="/some/path",
)
self.assertRaises(ValueError, obj._get_versioned_value, (1, 0, 0), parent)
@@ -1290,7 +1319,8 @@ def test_entry_refresh(self):
ans = o.refresh_variable("entries")
m.xapi.get.assert_called_once_with(
- o.xpath() + "/multiple/entries", retry_on_peer=o.HA_SYNC,
+ o.xpath() + "/multiple/entries",
+ retry_on_peer=o.HA_SYNC,
)
self.assertEqual(ans, o.entries)
self.assertEqual(ans, ["one", "two"])
@@ -1303,7 +1333,8 @@ def test_member_refresh(self):
ans = o.refresh_variable("members")
m.xapi.get.assert_called_once_with(
- o.xpath() + "/multiple/members", retry_on_peer=o.HA_SYNC,
+ o.xpath() + "/multiple/members",
+ retry_on_peer=o.HA_SYNC,
)
self.assertEqual(ans, o.members)
self.assertEqual(ans, ["first", "second"])
@@ -1314,7 +1345,8 @@ def test_int_refresh(self):
ans = o.refresh_variable("someint")
m.xapi.get.assert_called_once_with(
- o.xpath() + "/someint", retry_on_peer=o.HA_SYNC,
+ o.xpath() + "/someint",
+ retry_on_peer=o.HA_SYNC,
)
self.assertEqual(ans, o.someint)
self.assertEqual(ans, 42)
@@ -1334,7 +1366,8 @@ def test_string_refresh(self):
ans = o.refresh_variable("action")
m.xapi.get.assert_called_once_with(
- o.xpath() + "/config/action", retry_on_peer=o.HA_SYNC,
+ o.xpath() + "/config/action",
+ retry_on_peer=o.HA_SYNC,
)
self.assertEqual(ans, o.action)
self.assertEqual(ans, "DENY")
@@ -1345,7 +1378,8 @@ def test_nested_attrib_refresh(self):
ans = o.refresh_variable("action_uuid")
m.xapi.get.assert_called_once_with(
- o.xpath() + "/config/action", retry_on_peer=o.HA_SYNC,
+ o.xpath() + "/config/action",
+ retry_on_peer=o.HA_SYNC,
)
self.assertEqual(ans, o.action_uuid)
self.assertEqual(ans, "1234-56-789")
@@ -1382,7 +1416,14 @@ def test_values_are_unchanged_after_comparison(self):
self.assertEqual(o2.members, ["d", "c"])
def test_str_list_field_is_equal(self):
- o1 = MyVersionedObject("a", ["a",], ["c", "d"], 5)
+ o1 = MyVersionedObject(
+ "a",
+ [
+ "a",
+ ],
+ ["c", "d"],
+ 5,
+ )
o2 = MyVersionedObject("a", "a", ["c", "d"], 5)
self.assertTrue(o1.equal(o2))
@@ -1527,14 +1568,18 @@ def config(self, length=10, count=1, suffix="entry"):
listing = []
for x in range(count):
- obj = Base.PanObject("".join(random.choice(chars) for y in range(length)),)
+ obj = Base.PanObject(
+ "".join(random.choice(chars) for y in range(length)),
+ )
obj.parent = mock.Mock()
listing.append(obj)
# Now tweak the first element for the tests, the rest don't matter.
obj = listing[0]
- obj._gather_bulk_info = mock.Mock(return_value=(dev, listing, None),)
+ obj._gather_bulk_info = mock.Mock(
+ return_value=(dev, listing, None),
+ )
if suffix == "member":
obj.SUFFIX = Base.MEMBER
else:
@@ -1551,7 +1596,8 @@ def test_delete_one_entry(self):
dev.xapi.delete.assert_called_once()
dev.xapi.delete.assert_called_once_with(
- "/mock/xpath/entry[@name='{0}']".format(obj.uid), retry_on_peer=obj.HA_SYNC,
+ "/mock/xpath/entry[@name='{0}']".format(obj.uid),
+ retry_on_peer=obj.HA_SYNC,
)
def test_delete_one_member(self):
@@ -1642,7 +1688,12 @@ def test_ok(self, mocksleep):
@mock.patch("time.sleep")
def test_times_out(self, mocksleep):
fw = Base.PanDevice("127.0.0.1", "admin", "secret", api_key="apikey")
- fw.xapi.op = mock.Mock(side_effect=[Err.PanURLError, ValueError,],)
+ fw.xapi.op = mock.Mock(
+ side_effect=[
+ Err.PanURLError,
+ ValueError,
+ ],
+ )
ans = fw.is_ready(seconds=0)
diff --git a/tests/test_device_profile_xpaths.py b/tests/test_device_profile_xpaths.py
index 87a14424..05bcc01a 100644
--- a/tests/test_device_profile_xpaths.py
+++ b/tests/test_device_profile_xpaths.py
@@ -60,9 +60,18 @@
OBJECTS = {
SnmpServerProfile: [None, SnmpV2cServer, SnmpV3Server],
- EmailServerProfile: [None, EmailServer,],
- LdapServerProfile: [None, LdapServer,],
- SyslogServerProfile: [None, SyslogServer,],
+ EmailServerProfile: [
+ None,
+ EmailServer,
+ ],
+ LdapServerProfile: [
+ None,
+ LdapServer,
+ ],
+ SyslogServerProfile: [
+ None,
+ SyslogServer,
+ ],
HttpServerProfile: [
None,
HttpServer,
diff --git a/tests/test_firewall.py b/tests/test_firewall.py
index fa6d1162..e883dcb0 100644
--- a/tests/test_firewall.py
+++ b/tests/test_firewall.py
@@ -22,7 +22,9 @@ class TestFirewall(unittest.TestCase):
def test_id_returns_serial(self):
expected = "serial#"
- fw = panos.firewall.Firewall(serial=expected,)
+ fw = panos.firewall.Firewall(
+ serial=expected,
+ )
ret_val = fw.id
@@ -31,7 +33,9 @@ def test_id_returns_serial(self):
def test_id_returns_hostname(self):
expected = "hostName"
- fw = panos.firewall.Firewall(hostname=expected,)
+ fw = panos.firewall.Firewall(
+ hostname=expected,
+ )
ret_val = fw.id
diff --git a/tests/test_init.py b/tests/test_init.py
index f7bf6a6e..b8642aaf 100644
--- a/tests/test_init.py
+++ b/tests/test_init.py
@@ -28,7 +28,6 @@ class TestPanOSVersion(unittest.TestCase):
"""
def setUp(self):
-
self.c1 = panos.PanOSVersion("7.0.0-c1")
self.c2 = panos.PanOSVersion("7.0.0-c2")
self.b1 = panos.PanOSVersion("7.0.0-b1")
@@ -178,7 +177,8 @@ def test_base_is_single_key_value(self):
for x in self.quotes():
self.assertEqual(
- panos.string_to_xml("hello {0}world{0}".format(x), x), self._str(root),
+ panos.string_to_xml("hello {0}world{0}".format(x), x),
+ self._str(root),
)
def test_base_root_with_one_key_value(self):
@@ -188,7 +188,8 @@ def test_base_root_with_one_key_value(self):
for x in self.quotes():
self.assertEqual(
- panos.string_to_xml("foo bar {0}baz{0}".format(x), x), self._str(root),
+ panos.string_to_xml("foo bar {0}baz{0}".format(x), x),
+ self._str(root),
)
def test_base_root_with_two_key_values(self):
diff --git a/tests/test_integration.py b/tests/test_integration.py
index 654de5c3..3dabf0e2 100644
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -89,11 +89,26 @@ def setUp(self):
self.assertEqual(self.firewall, self.address_object.parent)
self.assertEqual([], self.address_object.children)
self.assertEqual(self.device_group, self.firewall.parent)
- self.assertEqual([self.address_object,], self.firewall.children)
+ self.assertEqual(
+ [
+ self.address_object,
+ ],
+ self.firewall.children,
+ )
self.assertEqual(self.panorama, self.device_group.parent)
- self.assertEqual([self.firewall,], self.device_group.children)
+ self.assertEqual(
+ [
+ self.firewall,
+ ],
+ self.device_group.children,
+ )
self.assertEqual(None, self.panorama.parent)
- self.assertEqual([self.device_group,], self.panorama.children)
+ self.assertEqual(
+ [
+ self.device_group,
+ ],
+ self.panorama.children,
+ )
def test_nearest_pandevice_from_addressobject_in_pano_dg_fw_ao_chain(self):
"""Runs nearest_pandevice() on the AddressObject.
@@ -325,7 +340,10 @@ def test_element_str_from_ethernetinterface_for_aggregate_group(self):
def test_element_str_from_firewall_with_pano_parent_and_systemsettings_child(self):
expected = b"".join(
- [b'', b'',]
+ [
+ b'',
+ b'',
+ ]
)
fw = panos.firewall.Firewall(
@@ -357,7 +375,10 @@ def test_element_str_from_firewall_without_serial_number_raises_error(self):
def test_element_str_from_firewall_with_dg_pano_parents_and_multi_vsys(self):
expected = b"".join(
- [b'', b"",]
+ [
+ b'',
+ b"",
+ ]
)
fw = panos.firewall.Firewall(
@@ -615,7 +636,11 @@ def test_set_xpath_from_arp_with_l3s_ei_fw_parents(self):
def test_edit_xpath_from_firewall(self):
# This is not a valid xpath, but its what should happen
# if there is no parent
- expected = "".join(["/devices/entry[@name='serial']",])
+ expected = "".join(
+ [
+ "/devices/entry[@name='serial']",
+ ]
+ )
fw = panos.firewall.Firewall("foo", vsys="vsys2", serial="serial")
@@ -626,7 +651,11 @@ def test_edit_xpath_from_firewall(self):
def test_set_xpath_from_firewall(self):
# This is not a valid xpath, but its what should happen
# if there is no parent
- expected = "".join(["/devices",])
+ expected = "".join(
+ [
+ "/devices",
+ ]
+ )
fw = panos.firewall.Firewall("foo", vsys="vsys2", serial="serial")
diff --git a/tests/test_opstate.py b/tests/test_opstate.py
index f99d3276..bf579e2f 100644
--- a/tests/test_opstate.py
+++ b/tests/test_opstate.py
@@ -48,7 +48,9 @@ def _hit_count_fw_setup(*args):
inner = "".join(ET.tostring(x, encoding="utf-8").decode("utf-8") for x in args)
fw.op = mock.Mock(
- return_value=ET.fromstring(HIT_COUNT_PREFIX + inner + HIT_COUNT_SUFFIX,)
+ return_value=ET.fromstring(
+ HIT_COUNT_PREFIX + inner + HIT_COUNT_SUFFIX,
+ )
)
rb = Rulebase()
diff --git a/tests/test_params.py b/tests/test_params.py
index 4073ae2e..e2231514 100644
--- a/tests/test_params.py
+++ b/tests/test_params.py
@@ -17,22 +17,74 @@ def _setup(self):
params = []
- params.append(VersionedParamPath("uuid", vartype="attrib", path="uuid",),)
- params.append(VersionedParamPath("size", vartype="int", path="size",),)
- params.append(VersionedParamPath("listing", vartype="member", path="listing",),)
- params.append(VersionedParamPath("pb1", vartype="exist", path="pb1",),)
- params.append(VersionedParamPath("pb2", vartype="exist", path="pb2",),)
- params.append(VersionedParamPath("live", vartype="yesno", path="live",),)
params.append(
- VersionedParamPath("disabled", vartype="yesno", path="disabled",),
+ VersionedParamPath(
+ "uuid",
+ vartype="attrib",
+ path="uuid",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "size",
+ vartype="int",
+ path="size",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "listing",
+ vartype="member",
+ path="listing",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "pb1",
+ vartype="exist",
+ path="pb1",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "pb2",
+ vartype="exist",
+ path="pb2",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "live",
+ vartype="yesno",
+ path="live",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "disabled",
+ vartype="yesno",
+ path="disabled",
+ ),
+ )
+ params.append(
+ VersionedParamPath(
+ "uuid2",
+ vartype="attrib",
+ path="level-2/uuid",
+ ),
)
params.append(
- VersionedParamPath("uuid2", vartype="attrib", path="level-2/uuid",),
+ VersionedParamPath(
+ "age",
+ vartype="int",
+ path="level-2/age",
+ ),
)
- params.append(VersionedParamPath("age", vartype="int", path="level-2/age",),)
params.append(
VersionedParamPath(
- "interfaces", vartype="member", path="level-2/interface",
+ "interfaces",
+ vartype="member",
+ path="level-2/interface",
),
)
@@ -84,7 +136,8 @@ def _refresh_xml():
# int at base level
def test_render_int():
_verify_render(
- FakeObject("test", size=5), '5',
+ FakeObject("test", size=5),
+ '5',
)
@@ -111,7 +164,8 @@ def test_parse_member():
# exist at base level
def test_render_exist():
_verify_render(
- FakeObject("test", pb1=True), '',
+ FakeObject("test", pb1=True),
+ '',
)
@@ -139,7 +193,8 @@ def test_parse_yesno():
# attrib
def test_render_attrib():
_verify_render(
- FakeObject("test", uuid="123-456"), '',
+ FakeObject("test", uuid="123-456"),
+ '',
)
diff --git a/tests/test_predefined.py b/tests/test_predefined.py
index 9ea6eded..1a1b913a 100644
--- a/tests/test_predefined.py
+++ b/tests/test_predefined.py
@@ -45,9 +45,13 @@
(
"""//*[contains(local-name(), "application")]/entry[@name='{0}']""",
'//*[contains(local-name(), "application")]/entry',
- ApplicationContainer(name="ap container 1", applications=["func1", "func2"],),
ApplicationContainer(
- name="application container deux", applications=["a", "la", "mode"],
+ name="ap container 1",
+ applications=["func1", "func2"],
+ ),
+ ApplicationContainer(
+ name="application container deux",
+ applications=["a", "la", "mode"],
),
),
(
@@ -97,8 +101,16 @@
(
None,
"/tag/entry",
- Tag(name="foo", color="color1", comments="First color",),
- Tag(name="bar", color="color42", comments="Another color for another time",),
+ Tag(
+ name="foo",
+ color="color1",
+ comments="First color",
+ ),
+ Tag(
+ name="bar",
+ color="color42",
+ comments="Another color for another time",
+ ),
),
)
@@ -142,7 +154,11 @@ def _fw(*args):
prefix = ""
suffix = ""
inner = "".join(x.element_str().decode("utf-8") for x in args)
- fw.xapi.get = mock.Mock(return_value=ET.fromstring(prefix + inner + suffix,))
+ fw.xapi.get = mock.Mock(
+ return_value=ET.fromstring(
+ prefix + inner + suffix,
+ )
+ )
return fw
diff --git a/tests/test_standards.py b/tests/test_standards.py
index 3fe2824d..c284b448 100644
--- a/tests/test_standards.py
+++ b/tests/test_standards.py
@@ -107,6 +107,7 @@
# -- Fixtures --
+
# PanObject / VersionedPanObject that has no NAME.
@pytest.fixture(
scope="function",
diff --git a/tests/test_userid.py b/tests/test_userid.py
index 0f4af6a1..a3a2052a 100644
--- a/tests/test_userid.py
+++ b/tests/test_userid.py
@@ -67,8 +67,18 @@ def test_batch_tag_user(self):
)
fw.xapi
fw.userid.batch_start()
- fw.userid.tag_user("user1", ["tag1",])
- fw.userid.tag_user("user2", ["tag1",])
+ fw.userid.tag_user(
+ "user1",
+ [
+ "tag1",
+ ],
+ )
+ fw.userid.tag_user(
+ "user2",
+ [
+ "tag1",
+ ],
+ )
def test_batch_untag_user(self):
fw = panos.firewall.Firewall(
@@ -76,8 +86,18 @@ def test_batch_untag_user(self):
)
fw.xapi
fw.userid.batch_start()
- fw.userid.untag_user("user1", ["tag1",])
- fw.userid.untag_user("user2", ["tag1",])
+ fw.userid.untag_user(
+ "user1",
+ [
+ "tag1",
+ ],
+ )
+ fw.userid.untag_user(
+ "user2",
+ [
+ "tag1",
+ ],
+ )
if __name__ == "__main__":
diff --git a/tests/test_versioning.py b/tests/test_versioning.py
index e32575db..d4fe86a5 100644
--- a/tests/test_versioning.py
+++ b/tests/test_versioning.py
@@ -39,7 +39,8 @@ def test_empty_objects_are_equal(self):
raise unittest.SkipTest("OLD_CLS does not have element_str()")
self.assertEqual(
- old.element_str(), new.element_str(),
+ old.element_str(),
+ new.element_str(),
)
def test_positionally_populated_objects_are_equal(self):
@@ -56,7 +57,8 @@ def test_positionally_populated_objects_are_equal(self):
raise unittest.SkipTest("OLD_CLS does not have element_str()")
self.assertEqual(
- old.element_str(), new.element_str(),
+ old.element_str(),
+ new.element_str(),
)
def test_keyword_populated_objects_are_equal(self):
@@ -73,7 +75,8 @@ def test_keyword_populated_objects_are_equal(self):
raise unittest.SkipTest("OLD_CLS does not have element_str()")
self.assertEqual(
- old.element_str(), new.element_str(),
+ old.element_str(),
+ new.element_str(),
)
def test_parsing_old_elmstring_works(self):
@@ -305,14 +308,18 @@ def test_add_profile_raises_error_on_adding_lower_version_after_adding_a_higher_
def test_security_rule_hip_profiles():
"security rules on 10.1.5 should not have hip-profiles"
rule = panos.policies.SecurityRule(
- name="test_rule", source=["0.0.0.0/0"], destination=["0.0.0.0/0"],
+ name="test_rule",
+ source=["0.0.0.0/0"],
+ destination=["0.0.0.0/0"],
)
rule._UNKNOWN_PANOS_VERSION = (10, 1, 5)
st = rule.element_str(False).decode()
assert "" not in st
rule = panos.policies.SecurityRule(
- name="test_rule", source=["0.0.0.0/0"], destination=["0.0.0.0/0"],
+ name="test_rule",
+ source=["0.0.0.0/0"],
+ destination=["0.0.0.0/0"],
)
rule._UNKNOWN_PANOS_VERSION = (9, 0, 0)
st = rule.element_str(False).decode()