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()