From f3cbb8b03b95ed3fad83e88ef02118e53a39a8d9 Mon Sep 17 00:00:00 2001 From: itdependsnetworks Date: Mon, 5 Sep 2022 11:09:48 -0400 Subject: [PATCH 01/65] Be more clear on error messages --- .../plugins/tasks/dispatcher/__init__.py | 12 +++--- .../plugins/tasks/dispatcher/default.py | 40 +++++++++---------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 7381244..311c909 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -44,21 +44,21 @@ def dispatcher(task: Task, method: str, logger, obj, *args, **kwargs) -> Result: logger.log_debug(f"Found driver {driver}") if not driver: - logger.log_failure(obj, f"Unable to find the driver for {method} for platform: {task.host.platform}") - raise NornirNautobotException() + logger.log_failure(obj, f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed.") + raise NornirNautobotException(f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed.") module_name, class_name = driver.rsplit(".", 1) driver_class = getattr(importlib.import_module(module_name), class_name) if not driver_class: - logger.log_failure(obj, f"Unable to locate the class {driver}") - raise NornirNautobotException() + logger.log_failure(obj, f"Unable to locate the class {driver}, preemptively failed.") + raise NornirNautobotException(f"Unable to locate the class {driver}, preemptively failed.") try: driver_task = getattr(driver_class, method) except AttributeError: - logger.log_failure(obj, f"Unable to locate the method {method} for {driver}") - raise NornirNautobotException() + logger.log_failure(obj, f"Unable to locate the method {method} for {driver}, preemptively failed.") + raise NornirNautobotException(f"Unable to locate the method {method} for {driver}, preemptively failed.") result = task.run(task=driver_task, logger=logger, obj=obj, *args, **kwargs) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index f5965c5..701baba 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -57,11 +57,11 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su try: result = task.run(task=napalm_get, getters=["config"], retrieve="running") except NornirSubTaskError as exc: - logger.log_failure(obj, f"Failed with a unknown issue. `{exc.result.exception}`") - raise NornirNautobotException() + logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{exc.result.exception}`") + raise NornirNautobotException("`get_config` method failed with an unexpected issue: `{exc.result.exception}`") if result[0].failed: - logger.log_failure(obj, f"Failed with a unknown issue. `{str(result.exception)}`") + logger.log_failure(obj, f"`get_config` nornir task failed with an unexpected issue: `{str(result.exception)}`") return result running_config = result[0].result.get("config", {}).get("running", None) @@ -95,15 +95,15 @@ def check_connectivity(task: Task, logger, obj) -> Result: ip_addr = task.host.hostname else: if not is_fqdn_resolvable(task.host.hostname): - logger.log_failure(obj, "not an IP or resolvable.") - raise NornirNautobotException("not an IP or resolvable.") + logger.log_failure(obj, "There was not an IP or resolvable, preemptively failed.") + raise NornirNautobotException("There was not an IP or resolvable, preemptively failed.") ip_addr = socket.gethostbyname(task.host.hostname) # TODO: Allow port to be configurable port = 22 if not tcp_ping(ip_addr, port): - logger.log_failure(obj, f"Attempting to connect to IP: {ip_addr} and port: {port} failed.") - raise NornirNautobotException(f"Attempting to connect to IP: {ip_addr} and port: {port} failed.") + logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") + raise NornirNautobotException(f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") if not task.host.username: logger.log_failure(obj, "There was no username defined, preemptively failed.") raise NornirNautobotException("There was no username defined, preemptively failed.") @@ -132,18 +132,18 @@ def compliance_config( Result: Nornir Result object with a feature_data key of the compliance data. """ if not os.path.exists(backup_file): - logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`") - raise NornirNautobotException() + logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") + raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") if not os.path.exists(intended_file): - logger.log_failure(obj, f"Intended config file NOT Found at location: `{intended_file}`") - raise NornirNautobotException() + logger.log_failure(obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed.") + raise NornirNautobotException(f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed.") try: feature_data = compliance(features, backup_file, intended_file, platform) except Exception as error: # pylint: disable=broad-except logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException() + raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") return Result(host=task.host, result={"feature_data": feature_data}) @staticmethod @@ -184,22 +184,22 @@ def generate_config( obj, f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException() + raise NornirNautobotException(f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``") elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): logger.log_failure( obj, f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException() + raise NornirNautobotException(f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``") elif isinstance(exc.result.exception, jinja2.TemplateNotFound): logger.log_failure( obj, f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException() + raise NornirNautobotException(f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``") elif isinstance(exc.result.exception, jinja2.TemplateError): logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") - raise NornirNautobotException() + raise NornirNautobotException(f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") raise make_folder(os.path.dirname(output_file_location)) @@ -234,14 +234,14 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su except NornirSubTaskError as exc: if isinstance(exc.result.exception, NetmikoAuthenticationException): logger.log_failure(obj, f"Failed with an authentication issue: `{exc.result.exception}`") - raise NornirNautobotException() + raise NornirNautobotException(f"Failed with an authentication issue: `{exc.result.exception}`") if isinstance(exc.result.exception, NetmikoTimeoutException): logger.log_failure(obj, f"Failed with a timeout issue. `{exc.result.exception}`") - raise NornirNautobotException() + raise NornirNautobotException(f"Failed with a timeout issue. `{exc.result.exception}`") logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") - raise NornirNautobotException() + raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") if result[0].failed: return result @@ -251,7 +251,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su # Primarily seen in Cisco devices. if "ERROR: % Invalid input detected at" in running_config: logger.log_failure(obj, "Discovered `ERROR: % Invalid input detected at` in the output") - raise NornirNautobotException() + raise NornirNautobotException("Discovered `ERROR: % Invalid input detected at` in the output") if remove_lines: logger.log_debug("Removing lines from configuration based on `remove_lines` definition") From 05e72dd321ee07b8bebe21a6eabbff2b3ba0b77c Mon Sep 17 00:00:00 2001 From: itdependsnetworks Date: Mon, 5 Sep 2022 12:19:11 -0400 Subject: [PATCH 02/65] run black --- .../plugins/tasks/dispatcher/__init__.py | 8 +++-- .../plugins/tasks/dispatcher/default.py | 32 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 311c909..d928166 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -44,8 +44,12 @@ def dispatcher(task: Task, method: str, logger, obj, *args, **kwargs) -> Result: logger.log_debug(f"Found driver {driver}") if not driver: - logger.log_failure(obj, f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed.") - raise NornirNautobotException(f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed.") + logger.log_failure( + obj, f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed." + ) + raise NornirNautobotException( + f"Unable to find the driver for {method} for platform: {task.host.platform}, preemptively failed." + ) module_name, class_name = driver.rsplit(".", 1) driver_class = getattr(importlib.import_module(module_name), class_name) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 701baba..64c6657 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -58,10 +58,14 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su result = task.run(task=napalm_get, getters=["config"], retrieve="running") except NornirSubTaskError as exc: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{exc.result.exception}`") - raise NornirNautobotException("`get_config` method failed with an unexpected issue: `{exc.result.exception}`") + raise NornirNautobotException( + "`get_config` method failed with an unexpected issue: `{exc.result.exception}`" + ) if result[0].failed: - logger.log_failure(obj, f"`get_config` nornir task failed with an unexpected issue: `{str(result.exception)}`") + logger.log_failure( + obj, f"`get_config` nornir task failed with an unexpected issue: `{str(result.exception)}`" + ) return result running_config = result[0].result.get("config", {}).get("running", None) @@ -136,8 +140,12 @@ def compliance_config( raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") if not os.path.exists(intended_file): - logger.log_failure(obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed.") - raise NornirNautobotException(f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed.") + logger.log_failure( + obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." + ) + raise NornirNautobotException( + f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." + ) try: feature_data = compliance(features, backup_file, intended_file, platform) @@ -184,22 +192,30 @@ def generate_config( obj, f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException(f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``") + raise NornirNautobotException( + f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``" + ) elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): logger.log_failure( obj, f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException(f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``") + raise NornirNautobotException( + f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``" + ) elif isinstance(exc.result.exception, jinja2.TemplateNotFound): logger.log_failure( obj, f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException(f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``") + raise NornirNautobotException( + f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``" + ) elif isinstance(exc.result.exception, jinja2.TemplateError): logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") - raise NornirNautobotException(f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") + raise NornirNautobotException( + f"There was an issue general Jinja error: ``{str(exc.result.exception)}``" + ) raise make_folder(os.path.dirname(output_file_location)) From f0a40ef6f3400760835ee7d0f6ed18af9f7fe1b2 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Mon, 12 Sep 2022 12:41:39 +0200 Subject: [PATCH 03/65] Implement provision_config. --- .../plugins/tasks/dispatcher/default.py | 45 +- poetry.lock | 635 ++++-------------- pyproject.toml | 1 + 3 files changed, 167 insertions(+), 514 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 8803c63..6611f95 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -14,7 +14,7 @@ from nornir.core.exceptions import NornirSubTaskError from nornir.core.task import Result, Task from nornir_jinja2.plugins.tasks import template_file -from nornir_napalm.plugins.tasks import napalm_get +from nornir_napalm.plugins.tasks import napalm_get, napalm_configure from nornir_netmiko.tasks import netmiko_send_command from netutils.config.compliance import compliance from netutils.config.clean import clean_config, sanitize_config @@ -34,6 +34,7 @@ "juniper_junos": "show configuration | display set", "arista_eos": "show run", } +MINUTES_TO_CONFIRM = 10 class NautobotNornirDriver: @@ -269,3 +270,45 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su with open(backup_file, "w") as filehandler: filehandler.write(running_config) return Result(host=task.host, result={"config": running_config}) + + @staticmethod + def provision_config( + task: Task, + logger, + obj, + config: str, + ) -> Result: + """Push candidate configuration to the device. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job_results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + config (str): The candidate config. + + Raises: + NornirNautobotException: Authentication error. + NornirNautobotException: Timeout error. + NornirNautobotException: Other exception. + + Returns: + Result: Nornir Result object with a dict as a result containing the running configuration + { "config: } + """ + logger.log_success(obj, "Config provision starting") + + try: + push_result = task.run( + task=napalm_configure, + configuration=config, + replace=True, + revert_in=MINUTES_TO_CONFIRM, + ) + except NornirSubTaskError as exc: + logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") + raise NornirNautobotException() + + logger.log_success(obj, f"result: {push_result[0].result}, changed: {push_result.changed}") + logger.log_success(obj, "Config provision ended") + return Result(host=task.host, result={"changed": push_result.changed, "result": push_result[0].result}) + diff --git a/poetry.lock b/poetry.lock index 21ec679..1c62bf5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,7 +8,7 @@ python-versions = "*" [[package]] name = "astroid" -version = "2.6.2" +version = "2.9.0" description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false @@ -16,9 +16,9 @@ python-versions = "~=3.6" [package.dependencies] lazy-object-proxy = ">=1.4.0" -typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} -wrapt = ">=1.11,<1.13" +typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} +typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} +wrapt = ">=1.11,<1.14" [[package]] name = "atomicwrites" @@ -192,11 +192,11 @@ optional = false python-versions = ">=3.6" [package.extras] -dnssec = ["cryptography (>=2.6)"] -doh = ["requests", "requests-toolbelt"] +trio = ["sniffio (>=1.1)", "trio (>=0.14.0)"] +curio = ["sniffio (>=1.1)", "curio (>=1.2)"] idna = ["idna (>=2.1)"] -curio = ["curio (>=1.2)", "sniffio (>=1.1)"] -trio = ["trio (>=0.14.0)", "sniffio (>=1.1)"] +doh = ["requests-toolbelt", "requests"] +dnssec = ["cryptography (>=2.6)"] [[package]] name = "flake8" @@ -606,6 +606,18 @@ category = "dev" optional = false python-versions = ">=2.6" +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + [[package]] name = "pluggy" version = "0.13.1" @@ -700,18 +712,20 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pylint" -version = "2.9.3" +version = "2.12.0" description = "python code static checker" category = "dev" optional = false python-versions = "~=3.6" [package.dependencies] -astroid = ">=2.6.2,<2.7" +astroid = ">=2.9.0,<2.10" colorama = {version = "*", markers = "sys_platform == \"win32\""} isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.7" -toml = ">=0.7.1" +platformdirs = ">=2.2.0" +toml = ">=0.9.2" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [[package]] name = "pynacl" @@ -966,11 +980,11 @@ test = ["pytest"] [[package]] name = "typed-ast" -version = "1.4.3" +version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "typing-extensions" @@ -1039,7 +1053,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "e43c8f61da534f15e8ffff5116557fcb7bd17b2df27411a4fae0090c4d83b396" +content-hash = "b3a6efbecdf8fc05356cfe1b8c228c1ae7be210dda6f46657d6b3445bd8771aa" [metadata.files] appdirs = [ @@ -1047,8 +1061,8 @@ appdirs = [ {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, ] astroid = [ - {file = "astroid-2.6.2-py3-none-any.whl", hash = "sha256:606b2911d10c3dcf35e58d2ee5c97360e8477d7b9f3efc3f24811c93e6fc2cd9"}, - {file = "astroid-2.6.2.tar.gz", hash = "sha256:38b95085e9d92e2ca06cf8b35c12a74fa81da395a6f9e65803742e6509c05892"}, + {file = "astroid-2.9.0-py3-none-any.whl", hash = "sha256:776ca0b748b4ad69c00bfe0fff38fa2d21c338e12c84aa9715ee0d473c422778"}, + {file = "astroid-2.9.0.tar.gz", hash = "sha256:5939cf55de24b92bda00345d4d0659d01b3c7dafb5055165c330bc7c568ba273"}, ] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, @@ -1058,120 +1072,26 @@ attrs = [ {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] -bandit = [ - {file = "bandit-1.7.0-py3-none-any.whl", hash = "sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07"}, - {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"}, -] -bcrypt = [ - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b589229207630484aefe5899122fb938a5b017b0f4349f769b8c13e78d99a8fd"}, - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a0584a92329210fcd75eb8a3250c5a941633f8bfaf2a18f81009b097732839b7"}, - {file = "bcrypt-3.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:56e5da069a76470679f312a7d3d23deb3ac4519991a0361abc11da837087b61d"}, - {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, - {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, - {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, -] +bandit = [] +bcrypt = [] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] -certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, -] -cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] -ciscoconfparse = [ - {file = "ciscoconfparse-1.5.30-py3-none-any.whl", hash = "sha256:1b7b98c0b1b1cb05fadc9c27711d79d4faee9cf4770a72b5798d7167bb97ccc2"}, - {file = "ciscoconfparse-1.5.30.tar.gz", hash = "sha256:e3c9ad5ff7563c6d3b4542d2826f4b07feb0e46ea5c698886ab8c4d55cc28815"}, -] -click = [ - {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, - {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, -] +certifi = [] +cffi = [] +chardet = [] +ciscoconfparse = [] +click = [] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] -cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b01fd6f2737816cb1e08ed4807ae194404790eac7ad030b34f2ce72b332f5586"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bf40af59ca2465b24e54f671b2de2c59257ddc4f7e5706dbd6930e26823668d3"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, -] +cryptography = [] dataclasses = [ {file = "dataclasses-0.7-py3-none-any.whl", hash = "sha256:3459118f7ede7c8bea0fe795bff7c6c2ce287d01dd226202f7c9ebc0610a7836"}, {file = "dataclasses-0.7.tar.gz", hash = "sha256:494a6dcae3b8bcf80848eea2ef64c0cc5cd307ffc263e17cdf42f3e5420808e6"}, ] -dnspython = [ - {file = "dnspython-2.1.0-py3-none-any.whl", hash = "sha256:95d12f6ef0317118d2a1a6fc49aac65ffec7eb8087474158f42f26a639135216"}, - {file = "dnspython-2.1.0.zip", hash = "sha256:e4a87f0b573201a0f3727fa18a516b055fd1107e0e5477cded4a2de497df1dd4"}, -] +dnspython = [] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, @@ -1179,47 +1099,25 @@ flake8 = [ future = [ {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, ] -gitdb = [ - {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, - {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, -] +gitdb = [] gitpython = [ {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, ] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.6.0-py3-none-any.whl", hash = "sha256:c6513572926a96458f8c8f725bf0e00108fba0c9583ade9bd15b869c9d726e33"}, - {file = "importlib_metadata-4.6.0.tar.gz", hash = "sha256:4a5611fea3768d3d967c447ab4e93f567d95db92225b43b7b238dbfb855d70bb"}, -] -importlib-resources = [ - {file = "importlib_resources-5.2.0-py3-none-any.whl", hash = "sha256:a0143290bef3cbc99de9e40176e4987780939a955b8632f02ce6c935f42e9bfc"}, - {file = "importlib_resources-5.2.0.tar.gz", hash = "sha256:22a2c42d8c6a1d30aa8a0e1f57293725bfd5c013d562585e46aff469e0ff78b3"}, -] +idna = [] +importlib-metadata = [] +importlib-resources = [] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] -invoke = [ - {file = "invoke-1.5.0-py2-none-any.whl", hash = "sha256:da7c2d0be71be83ffd6337e078ef9643f41240024d6b2659e7b46e0b251e339f"}, - {file = "invoke-1.5.0-py3-none-any.whl", hash = "sha256:7e44d98a7dc00c91c79bac9e3007276965d2c96884b3c22077a9f04042bd6d90"}, - {file = "invoke-1.5.0.tar.gz", hash = "sha256:f0c560075b5fb29ba14dad44a7185514e94970d1b9d57dcd3723bec5fed92650"}, -] +invoke = [] isort = [ {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] -jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, -] -junos-eznc = [ - {file = "junos-eznc-2.5.4.tar.gz", hash = "sha256:bf036d0af9ee5c5e4f517cb5fc902fe891fa120e18f459805862c53d4a97193a"}, - {file = "junos_eznc-2.5.4-py2.py3-none-any.whl", hash = "sha256:e05c36d56d8b8d13b1fb3bb763828bb3ee80fa1dcadc3a6762e8e2568504676d"}, -] +jinja2 = [] +junos-eznc = [] lazy-object-proxy = [ {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, @@ -1244,78 +1142,7 @@ lazy-object-proxy = [ {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, ] -lxml = [ - {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, - {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, - {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, - {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, - {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, - {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, - {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, - {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, - {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, - {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, - {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, - {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, - {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, - {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, - {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, - {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, - {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, - {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, - {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, - {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, - {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, -] +lxml = [] markupsafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, @@ -1395,164 +1222,59 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -napalm = [ - {file = "napalm-3.3.1-py2.py3-none-any.whl", hash = "sha256:ffa7e0c459df2c048ee75fef3f88beaf5f5dc5aecdae67cb2e479a22e3a717e6"}, - {file = "napalm-3.3.1.tar.gz", hash = "sha256:6fe46d5b4ca761a2bde8ea2bea3e0b808a907afc808c6c67178060eb323320e8"}, -] -ncclient = [ - {file = "ncclient-0.6.12.tar.gz", hash = "sha256:37c8a9f9a44f0346144119ab17ae6559e44b5a991f4c34ea3765c678079e4beb"}, -] +napalm = [] +ncclient = [] netaddr = [ {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, ] -netmiko = [ - {file = "netmiko-3.4.0-py3-none-any.whl", hash = "sha256:b66f25717db3609878f83c85604349dd40a0ab494d8eafd817dcde8388131136"}, - {file = "netmiko-3.4.0.tar.gz", hash = "sha256:acadb9dd97864ee848e2032f1f0e301c7b31e7a4153757d98f5c8ba1b9614993"}, -] +netmiko = [] netutils = [ {file = "netutils-1.0.0-py3-none-any.whl", hash = "sha256:f6e695dc761f41c68d3b2b9763f6ac3bc636d8b3c70c9886dae2655b2eab5c2b"}, {file = "netutils-1.0.0.tar.gz", hash = "sha256:ead1d927374a76a9ff78867b5f72b66cd26eaa9ec9e8d00e12e8085694a0275a"}, ] -nornir = [ - {file = "nornir-3.1.1-py3-none-any.whl", hash = "sha256:217199f923c810f4a54dec8d440eb08682c8a4ea4746325bd3067dca2e32cf9f"}, - {file = "nornir-3.1.1.tar.gz", hash = "sha256:6abf8ca245aab8e36b5770ec94fdb456b6bf53696c6d68f2ee0882898630a392"}, -] -nornir-jinja2 = [ - {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, - {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, -] -nornir-napalm = [ - {file = "nornir_napalm-0.1.2-py3-none-any.whl", hash = "sha256:313986bbb16eeaf3a80daf61f6a97e93ecebc47d0c586a2eb856ea91edc2cc1d"}, - {file = "nornir_napalm-0.1.2.tar.gz", hash = "sha256:be7808a990242987500a65701edb626197c5d0b87f35d9eb5da7ce7e4d60fdd5"}, -] -nornir-netmiko = [ - {file = "nornir_netmiko-0.1.1-py3-none-any.whl", hash = "sha256:c6eadb81f6f3b2f0c27bae151cc62673303f9d085ec3c773ecdc98f20ef30f91"}, - {file = "nornir_netmiko-0.1.1.tar.gz", hash = "sha256:fc41ded40923d23c6155b92c6749170629b4cc2649c340d24bff9f49315836c6"}, -] -nornir-utils = [ - {file = "nornir_utils-0.1.2-py3-none-any.whl", hash = "sha256:98915e781d4135e424fe1d4617dc231ada9a7c732c8e51e408f53fd3d37a13b0"}, - {file = "nornir_utils-0.1.2.tar.gz", hash = "sha256:23ae95c4805b0ce8a5ed32935f3f86027e5701175e7740ab8b3a79946c5d90b2"}, -] -ntc-templates = [ - {file = "ntc_templates-2.1.0-py3-none-any.whl", hash = "sha256:b42c0d32cf33ccc2ba89b2ec4268ad43d3d872ff569ecefe727b6649adacd175"}, - {file = "ntc_templates-2.1.0.tar.gz", hash = "sha256:6ce17e48d951d531afa83ad3b68fda822a3d8937e8c955387053c501edfec41f"}, -] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -paramiko = [ - {file = "paramiko-2.10.1-py2.py3-none-any.whl", hash = "sha256:f6cbd3e1204abfdbcd40b3ecbc9d32f04027cd3080fe666245e21e7540ccfc1b"}, - {file = "paramiko-2.10.1.tar.gz", hash = "sha256:443f4da23ec24e9a9c0ea54017829c282abdda1d57110bf229360775ccd27a31"}, -] -passlib = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pbr = [ - {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"}, - {file = "pbr-5.6.0.tar.gz", hash = "sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] +nornir = [] +nornir-jinja2 = [] +nornir-napalm = [] +nornir-netmiko = [] +nornir-utils = [] +ntc-templates = [] +packaging = [] +paramiko = [] +passlib = [] +pathspec = [] +pbr = [] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] +pluggy = [] +py = [] pycodestyle = [ {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pydantic = [ - {file = "pydantic-1.7.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3c60039e84552442defbcb5d56711ef0e057028ca7bfc559374917408a88d84e"}, - {file = "pydantic-1.7.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6e7e314acb170e143c6f3912f93f2ec80a96aa2009ee681356b7ce20d57e5c62"}, - {file = "pydantic-1.7.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:8ef77cd17b73b5ba46788d040c0e820e49a2d80cfcd66fda3ba8be31094fd146"}, - {file = "pydantic-1.7.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:115d8aa6f257a1d469c66b6bfc7aaf04cd87c25095f24542065c68ebcb42fe63"}, - {file = "pydantic-1.7.4-cp36-cp36m-win_amd64.whl", hash = "sha256:66757d4e1eab69a3cfd3114480cc1d72b6dd847c4d30e676ae838c6740fdd146"}, - {file = "pydantic-1.7.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c92863263e4bd89e4f9cf1ab70d918170c51bd96305fe7b00853d80660acb26"}, - {file = "pydantic-1.7.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3b8154babf30a5e0fa3aa91f188356763749d9b30f7f211fafb247d4256d7877"}, - {file = "pydantic-1.7.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:80cc46378505f7ff202879dcffe4bfbf776c15675028f6e08d1d10bdfbb168ac"}, - {file = "pydantic-1.7.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:dda60d7878a5af2d8560c55c7c47a8908344aa78d32ec1c02d742ede09c534df"}, - {file = "pydantic-1.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:4c1979d5cc3e14b35f0825caddea5a243dd6085e2a7539c006bc46997ef7a61a"}, - {file = "pydantic-1.7.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8857576600c32aa488f18d30833aa833b54a48e3bab3adb6de97e463af71f8f8"}, - {file = "pydantic-1.7.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1f86d4da363badb39426a0ff494bf1d8510cd2f7274f460eee37bdbf2fd495ec"}, - {file = "pydantic-1.7.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:3ea1256a9e782149381e8200119f3e2edea7cd6b123f1c79ab4bbefe4d9ba2c9"}, - {file = "pydantic-1.7.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:e28455b42a0465a7bf2cde5eab530389226ce7dc779de28d17b8377245982b1e"}, - {file = "pydantic-1.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:47c5b1d44934375a3311891cabd450c150a31cf5c22e84aa172967bf186718be"}, - {file = "pydantic-1.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:00250e5123dd0b123ff72be0e1b69140e0b0b9e404d15be3846b77c6f1b1e387"}, - {file = "pydantic-1.7.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d24aa3f7f791a023888976b600f2f389d3713e4f23b7a4c88217d3fce61cdffc"}, - {file = "pydantic-1.7.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2c44a9afd4c4c850885436a4209376857989aaf0853c7b118bb2e628d4b78c4e"}, - {file = "pydantic-1.7.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:e87edd753da0ca1d44e308a1b1034859ffeab1f4a4492276bff9e1c3230db4fe"}, - {file = "pydantic-1.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:a3026ee105b5360855e500b4abf1a1d0b034d88e75a2d0d66a4c35e60858e15b"}, - {file = "pydantic-1.7.4-py3-none-any.whl", hash = "sha256:a82385c6d5a77e3387e94612e3e34b77e13c39ff1295c26e3ba664e7b98073e2"}, - {file = "pydantic-1.7.4.tar.gz", hash = "sha256:0a1abcbd525fbb52da58c813d54c2ec706c31a91afdb75411a73dd1dec036595"}, -] +pycparser = [] +pydantic = [] pydocstyle = [ {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, ] -pyeapi = [ - {file = "pyeapi-0.8.4.tar.gz", hash = "sha256:c33ad1eadd8ebac75f63488df9412081ce0b024c9e1da12a37196a5c60427c54"}, -] +pyeapi = [] pyflakes = [ {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pylint = [ - {file = "pylint-2.9.3-py3-none-any.whl", hash = "sha256:5d46330e6b8886c31b5e3aba5ff48c10f4aa5e76cbf9002c6544306221e63fbc"}, - {file = "pylint-2.9.3.tar.gz", hash = "sha256:23a1dc8b30459d78e9ff25942c61bb936108ccbe29dd9e71c01dc8274961709a"}, -] -pynacl = [ - {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, - {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, - {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, - {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, - {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, -] -pynautobot = [ - {file = "pynautobot-1.0.2-py3-none-any.whl", hash = "sha256:19dd6fbb4663440f0d890137ff58dd5206cb4452f885f3eba7874888ca22727d"}, - {file = "pynautobot-1.0.2.tar.gz", hash = "sha256:8cb0afe97a48f16301a7a4bd58e409b4517fb5c9c9fc808f2cce6ea4e99e1408"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyserial = [ - {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, - {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, -] -pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, -] -python-dotenv = [ - {file = "python-dotenv-0.18.0.tar.gz", hash = "sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"}, - {file = "python_dotenv-0.18.0-py2.py3-none-any.whl", hash = "sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d"}, -] + {file = "pylint-2.12.0-py3-none-any.whl", hash = "sha256:ba00afcb1550bc217bbcb0eb76c10cb8335f7417a3323bdd980c29fb5b59f8d2"}, + {file = "pylint-2.12.0.tar.gz", hash = "sha256:245c87e5da54c35b623c21b35debf87d93b18bf9e0229515cc172d0b83d627cd"}, +] +pynacl = [] +pynautobot = [] +pyparsing = [] +pyserial = [] +pytest = [] +python-dotenv = [] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1584,171 +1306,58 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] -regex = [ - {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, - {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, - {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, - {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, - {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, - {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, - {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, - {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, - {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, - {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, - {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, - {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, - {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, -] -requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, -] +regex = [] +requests = [] requests-mock = [ {file = "requests-mock-1.9.3.tar.gz", hash = "sha256:8d72abe54546c1fc9696fa1516672f1031d72a55a1d66c85184f972a24ba0eba"}, {file = "requests_mock-1.9.3-py2.py3-none-any.whl", hash = "sha256:0a2d38a117c08bb78939ec163522976ad59a6b7fdd82b709e23bb98004a44970"}, ] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, - {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.4-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:329ac9064c1cfff9fc77fbecd90d07d698176fcd0720bfef9c2d27faa09dcc0e"}, - {file = "ruamel.yaml.clib-0.2.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:091a38f04f8a332ba7b3dba26197cd522bc29936943b3d1732ce3c463bb6b275"}, - {file = "ruamel.yaml.clib-0.2.4-cp35-cp35m-win32.whl", hash = "sha256:650cc8e65e2568fac84dc14970a09fe21b013a90621fff1626ea6d656cc03dc4"}, - {file = "ruamel.yaml.clib-0.2.4-cp35-cp35m-win_amd64.whl", hash = "sha256:729869106d5b7eb5e0260f7da4fcfef2cd9b324729fadc08edc27b1e86ad3013"}, - {file = "ruamel.yaml.clib-0.2.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ae2f58c18991c8565d41018177548a91c2f1511d8a185254632388f142fbae9"}, - {file = "ruamel.yaml.clib-0.2.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c8a04c3f62a0b6a2696d003dd30e96e0b9d4a5ff450fe359c39a4a7466b9b935"}, - {file = "ruamel.yaml.clib-0.2.4-cp36-cp36m-win32.whl", hash = "sha256:fd400bd19ea3e86bad9fb5176ab7efb6efb5e440cc2fd435c86de021620d8fa7"}, - {file = "ruamel.yaml.clib-0.2.4-cp36-cp36m-win_amd64.whl", hash = "sha256:b1772bff158f785085ebc8e635a0b9450f0072413bc89d8fc7f0ee803d1ab7f8"}, - {file = "ruamel.yaml.clib-0.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3271fb4a379050735f90177d1e61b5cc9acb5130baf995f3c775fa2aa2b113fb"}, - {file = "ruamel.yaml.clib-0.2.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aa157cee912030d8abfb97b278295abbb7923dedfd892f2e94c22adbf5730398"}, - {file = "ruamel.yaml.clib-0.2.4-cp37-cp37m-win32.whl", hash = "sha256:202e4751f038383241036e79640e7efd23d7272e3ce0cc8a11b9804ad604c5da"}, - {file = "ruamel.yaml.clib-0.2.4-cp37-cp37m-win_amd64.whl", hash = "sha256:3e506603394f5a678e9b924324bc1352c0493d7010ab4df687eb6d868631f9fb"}, - {file = "ruamel.yaml.clib-0.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9f95ae85986b53d6d0d253d570a9bb3a229e5319f1f76b2ba7809fa86cad890"}, - {file = "ruamel.yaml.clib-0.2.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2b9a62080d18c7fa17443e37f0d941d1be0a66ddcf5be5253f91cc59a15a9c1e"}, - {file = "ruamel.yaml.clib-0.2.4-cp38-cp38-win32.whl", hash = "sha256:769468005ce63bad78575b9d9f095f388ac1f45a331969e04135ac9626c3529d"}, - {file = "ruamel.yaml.clib-0.2.4-cp38-cp38-win_amd64.whl", hash = "sha256:83d72c5434151071cb67690be0034f9162ea282e58e47f9e8d23e8d14ca96584"}, - {file = "ruamel.yaml.clib-0.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:243941fe8f98053662f0394057b29d7146fe56e1b0011971302ea75e4b111529"}, - {file = "ruamel.yaml.clib-0.2.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2d75c965c407fdef9d1b33cd39faf47aa106d3fa2cf83960ec9ed95c4c9a55bc"}, - {file = "ruamel.yaml.clib-0.2.4-cp39-cp39-win32.whl", hash = "sha256:f012b89c56f936e31f12a1484f08964c4681ae75488bc79c8909f37c517500f6"}, - {file = "ruamel.yaml.clib-0.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:a6d8749819403338093c61ee897b97d0f4aa73297e97feb1705d143c002b5bed"}, - {file = "ruamel.yaml.clib-0.2.4.tar.gz", hash = "sha256:f997f13fd94e37e8b7d7dbe759088bb428adc6570da06b64a913d932d891ac8d"}, -] -scp = [ - {file = "scp-0.13.5-py2.py3-none-any.whl", hash = "sha256:be62d3ca534790dbaa509634fe28af6729f0d798388eaa5fdd3a1b191556dbde"}, - {file = "scp-0.13.5.tar.gz", hash = "sha256:0ab2ee9178b8be53dc5c9fe2f33761e01a2435087f5c9fb5b54519873c650d60"}, -] +"ruamel.yaml" = [] +"ruamel.yaml.clib" = [] +scp = [] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -smmap = [ - {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, - {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, -] -stevedore = [ - {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"}, - {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"}, -] -tenacity = [ - {file = "tenacity-7.0.0-py2.py3-none-any.whl", hash = "sha256:a0ce48587271515db7d3a5e700df9ae69cce98c4b57c23a4886da15243603dd8"}, - {file = "tenacity-7.0.0.tar.gz", hash = "sha256:5bd16ef5d3b985647fe28dfa6f695d343aa26479a04e8792b9d3c8f49e361ae1"}, -] -textfsm = [ - {file = "textfsm-1.1.2-py2.py3-none-any.whl", hash = "sha256:f3d4e9bd4344935a08e6844e53d6220e2e4fb7e465bee51fa909152ed6bab406"}, - {file = "textfsm-1.1.2.tar.gz", hash = "sha256:85a450b441aff04b1cac726bdb36f35534a5b196cca08c8bc14fddd879c4255c"}, -] +smmap = [] +snowballstemmer = [] +stevedore = [] +tenacity = [] +textfsm = [] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -transitions = [ - {file = "transitions-0.8.8-py2.py3-none-any.whl", hash = "sha256:f35efa070fbdf9a0f3f093b19f1258068786af75786a8cbcc884444f3d1a66d4"}, - {file = "transitions-0.8.8.tar.gz", hash = "sha256:e7a86b31a161a76133f189b3ae9dad2755a80ea4c1e0eee1805648d021fb677d"}, -] +transitions = [] typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, -] -urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, -] -wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] -yamllint = [ - {file = "yamllint-1.26.1.tar.gz", hash = "sha256:87d9462b3ed7e9dfa19caa177f7a77cd9888b3dc4044447d6ae0ab233bcd1324"}, -] -yamlordereddictloader = [ - {file = "yamlordereddictloader-0.4.0.tar.gz", hash = "sha256:7f30f0b99ea3f877f7cb340c570921fa9d639b7f69cba18be051e27f8de2080e"}, -] -zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, -] + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] +typing-extensions = [] +urllib3 = [] +wrapt = [] +yamllint = [] +yamlordereddictloader = [] +zipp = [] diff --git a/pyproject.toml b/pyproject.toml index e0a7790..b4268ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" +typed-ast = "^1.5" [tool.poetry.dev-dependencies] pytest = "*" From bb399678ba2df86750802ef9a0fb5f08bb6d78f6 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Mon, 12 Sep 2022 13:11:48 +0200 Subject: [PATCH 04/65] Remove typed-ast explicit dependency in favor of updating pylint dev dependency version. --- poetry.lock | 4 ++-- pyproject.toml | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 1c62bf5..fcf3046 100644 --- a/poetry.lock +++ b/poetry.lock @@ -982,7 +982,7 @@ test = ["pytest"] name = "typed-ast" version = "1.5.4" description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -1053,7 +1053,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.6" -content-hash = "b3a6efbecdf8fc05356cfe1b8c228c1ae7be210dda6f46657d6b3445bd8771aa" +content-hash = "cfe7051fbd80da740fa4d581fd4a4cbf4db8c82f9ef4c63bd58c10677fa25557" [metadata.files] appdirs = [ diff --git a/pyproject.toml b/pyproject.toml index b4268ed..f7f1a50 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,14 +27,13 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" -typed-ast = "^1.5" [tool.poetry.dev-dependencies] pytest = "*" requests_mock = "*" pyyaml = "*" black = "*" -pylint = "*" +pylint = "^2.12.0" pydocstyle = "*" yamllint = "*" bandit = "*" From 55f78ce2eebb4ae255ea5d311fc4fb86f2936766 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Fri, 30 Sep 2022 08:56:31 +0200 Subject: [PATCH 05/65] Variabilize minutes_to_confirm. --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 6611f95..f3af2cc 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -34,7 +34,6 @@ "juniper_junos": "show configuration | display set", "arista_eos": "show run", } -MINUTES_TO_CONFIRM = 10 class NautobotNornirDriver: @@ -302,7 +301,7 @@ def provision_config( task=napalm_configure, configuration=config, replace=True, - revert_in=MINUTES_TO_CONFIRM, + revert_in=int(os.getenv("NORNIR_NAUTOBOT_REVERT_IN_MINUTES")), ) except NornirSubTaskError as exc: logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") From f0c832ca2c415b9bcd6df284d9104a13c079fc54 Mon Sep 17 00:00:00 2001 From: Leo Kirchner Date: Fri, 30 Sep 2022 11:19:28 +0200 Subject: [PATCH 06/65] Black. --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index f3af2cc..d9a5bb6 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -310,4 +310,3 @@ def provision_config( logger.log_success(obj, f"result: {push_result[0].result}, changed: {push_result.changed}") logger.log_success(obj, "Config provision ended") return Result(host=task.host, result={"changed": push_result.changed, "result": push_result[0].result}) - From 316086935d42b2723ff9fb52feb1e2155bed0f9b Mon Sep 17 00:00:00 2001 From: Josh VanDeraa Date: Thu, 3 Nov 2022 09:04:47 -0500 Subject: [PATCH 07/65] Fixes push to GitHub --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18bfcbd..d69a11a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,6 @@ --- name: "CI" -on: # yamllint disable +on: # yamllint disable - "push" - "pull_request" jobs: @@ -167,7 +167,7 @@ jobs: - name: "Upload binaries to release" uses: "svenstaro/upload-release-action@v2" with: - repo_token: "${{ secrets.NTC_GITHUB_TOKEN }}" + repo_token: "${{ secrets.GH_NAUTOBOT_BOT_TOKEN }}" file: "dist/*" tag: "${{ github.ref }}" overwrite: true From 4f770fad0508222a9bbf6ba76389f8bf7b4b1571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kalle=20M=C3=B8ller?= Date: Tue, 11 Oct 2022 08:50:27 +0200 Subject: [PATCH 08/65] Add basic typing to the methods in logger Added basic typing info, such that people who develops with typing doesn't get error in those lines. --- nornir_nautobot/utils/logger.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/nornir_nautobot/utils/logger.py b/nornir_nautobot/utils/logger.py index fbe963e..a3544dc 100644 --- a/nornir_nautobot/utils/logger.py +++ b/nornir_nautobot/utils/logger.py @@ -2,11 +2,13 @@ import logging +from typing import Any + class NornirLogger: """Similar to a mixin, to utilize Python logging and Jobs Result obj.""" - def __init__(self, name, nautobot_job=None, debug=False, job_result=None): + def __init__(self, name: str, nautobot_job=None, debug: bool = False, job_result=None): """Initialize the object.""" self.job_result = job_result or nautobot_job self.logger = logging.getLogger(name) @@ -19,31 +21,31 @@ def __init__(self, name, nautobot_job=None, debug=False, job_result=None): self.logger.warning(log_message) job_result.log_warning(log_message) - def log_debug(self, message): + def log_debug(self, message: str): """Debug, does not take obj, and only logs to jobs result when in global debug mode.""" if self.nautobot_job and self.debug: self.nautobot_job.log_debug(message) self.logger.debug(message) - def log_info(self, obj, message): + def log_info(self, obj: Any, message: str): """Log to Python logger and jogs results for info messages.""" if self.nautobot_job: self.nautobot_job.log_info(obj, message) self.logger.info("%s | %s", str(obj), message) - def log_success(self, obj, message): + def log_success(self, obj: Any, message: str): """Log to Python logger and jogs results for success messages.""" if self.nautobot_job: self.nautobot_job.log_success(obj, message) self.logger.info("%s | %s", str(obj), message) - def log_warning(self, obj, message): + def log_warning(self, obj: Any, message: str): """Log to Python logger and jogs results for warning messages.""" if self.nautobot_job: self.nautobot_job.log_warning(obj, message) self.logger.warning("%s | %s", str(obj), message) - def log_failure(self, obj, message): + def log_failure(self, obj: Any, message: str): """Log to Python logger and jogs results for failure messages.""" if self.nautobot_job: self.nautobot_job.log_failure(obj, message) From ce171363153bd3523e3d844aa4fe98140fbfb66e Mon Sep 17 00:00:00 2001 From: susanhooks-al <110186911+susanhooks-al@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:12:06 -0600 Subject: [PATCH 09/65] Existing docs migrated to new structure --- .readthedocs.yml | 22 + README.md | 40 +- docs/assets/extra.css | 122 ++ docs/assets/favicon.png | Bin 0 -> 3626 bytes docs/assets/logo-vertical.png | Bin 0 -> 31975 bytes docs/assets/logo.png | Bin 0 -> 5464 bytes CHANGELOG.md => docs/dev/CHANGELOG.md | 0 CONTRIBUTING.md => docs/dev/CONTRIBUTING.md | 0 docs/index.md | 34 +- docs/processor/processor.md | 4 + docs/requirements.txt | 4 + docs/task/task.md | 4 + mkdocs.yml | 67 +- poetry.lock | 1290 +++++++------------ pyproject.toml | 5 + 15 files changed, 741 insertions(+), 851 deletions(-) create mode 100644 .readthedocs.yml create mode 100644 docs/assets/extra.css create mode 100644 docs/assets/favicon.png create mode 100644 docs/assets/logo-vertical.png create mode 100644 docs/assets/logo.png rename CHANGELOG.md => docs/dev/CHANGELOG.md (100%) rename CONTRIBUTING.md => docs/dev/CONTRIBUTING.md (100%) create mode 100644 docs/requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..cc1f858 --- /dev/null +++ b/.readthedocs.yml @@ -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 in the build environment. +build: + os: "ubuntu-22.04" + tools: + python: "3.10" + +mkdocs: + configuration: "mkdocs.yml" + # fail_on_warning: true + +# Use our docs/requirements.txt during installation. +python: + install: + - requirements: "docs/requirements.txt" \ No newline at end of file diff --git a/README.md b/README.md index 995d4f5..30aef06 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,43 @@ -# nornir_nautobot -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) +
+

Nornir Nautobot

+
+

+ + + +
+

-## Build Status -| Branch | Status | -| ------- | ------------------------------------------------------------------------------------------------------------------------------------ | -| develop | [![CI](https://github.com/nautobot/nornir-nautobot/actions/workflows/ci.yml/badge.svg)](https://github.com/nautobot/nornir-nautobot/actions/workflows/ci.yml) | -## Overview - -The nornir_nautobot project intends to solve two primary use cases. +Nornir-Nautobot is a set of utilities to help interact with Nautobot via Nornir. The nornir_nautobot project intends to solve two primary use cases. * Providing a Nornir inventory that leverages Nautobot's API. * A set of opinionated Nornir plugins. The set of plugins intend to provide mechanisms to include common networking workflows that will help enable network automation. As an example, there are method to get configurations or test network connectivity. Over time this will include functions to perform actions such as get vlans, neighbors, protocols, etc. -## Getting Started +# Installation + +To install Nornir Nautobot install via Python PIP: ```shell pip install nornir-nautobot ``` +## Inventory + +The inventory plugin is used to gather inventory from a Nautobot instance. This queries the DCIM endpoint to gather information about the devices. + +[Inventory](inventory/inventory.md) + +## Processor Plugin + +This is an opinionated plugin to help with network automation workflows with Nautobot. -## Documentation Link +[Processor Plugin](processor/processor.md) -The documentation can be found on [Read the Docs](https://nornir-nautobot.readthedocs.io/en/latest/) +## Task Plugin -## Nautobot +The task plugin helps with dispatching specific functions with multiple underlying OS. -Nautobot documentation is available at [Nautobot Read the Docs](https://nautobot.readthedocs.io/en/latest/) +[Task Plugin](task/task.md) \ No newline at end of file diff --git a/docs/assets/extra.css b/docs/assets/extra.css new file mode 100644 index 0000000..3bde19d --- /dev/null +++ b/docs/assets/extra.css @@ -0,0 +1,122 @@ +:root>* { + --md-accent-fg-color: #ff8504; + --md-primary-fg-color: #ff8504; + --md-typeset-a-color: #0097ff; +} + +[data-md-color-scheme="slate"] { + --md-default-bg-color: hsla(var(--md-hue), 0%, 15%, 1); + --md-typeset-a-color: #0097ff; +} + +/* Accessibility: Increase fonts for dark theme */ +[data-md-color-scheme="slate"] .md-typeset { + font-size: 0.9rem; +} + +[data-md-color-scheme="slate"] .md-typeset table:not([class]) { + font-size: 0.7rem; +} + +.md-tabs__link { + font-size: 0.8rem; +} + +.md-tabs__link--active { + color: var(--md-primary-fg-color); +} + +.md-header__button.md-logo :is(img, svg) { + height: 2rem; +} + +.md-header__button.md-logo :-webkit-any(img, svg) { + height: 2rem; +} + +.md-header__title { + font-size: 1.2rem; +} + +img.logo { + height: 100px; +} + +img.copyright-logo { + height: 24px; + vertical-align: middle; +} + +[data-md-color-primary=black] .md-header { + background-color: #212121; +} + +@media screen and (min-width: 76.25em) { + [data-md-color-primary=black] .md-tabs { + background-color: #212121; + } +} + +/* mkdocs-version-annotations material theme customizations */ +:root { + /* Icon for "version-added" admonition: Material Design Icons "plus-box-outline" */ + --md-admonition-icon--version-added: url('data:image/svg+xml;charset=utf-8,'); + /* Icon for "version-changed" admonition: Material Design Icons "delta" */ + --md-admonition-icon--version-changed: url('data:image/svg+xml;charset=utf-8,'); + /* Icon for "version-removed" admonition: Material Design Icons "minus-circle-outline" */ + --md-admonition-icon--version-removed: url('data:image/svg+xml;charset=utf-8,'); +} + +/* "version-added" admonition in green */ +.md-typeset .admonition.version-added, +.md-typeset details.version-added { + border-color: rgb(0, 200, 83); +} + +.md-typeset .version-added>.admonition-title, +.md-typeset .version-added>summary { + background-color: rgba(0, 200, 83, .1); +} + +.md-typeset .version-added>.admonition-title::before, +.md-typeset .version-added>summary::before { + background-color: rgb(0, 200, 83); + -webkit-mask-image: var(--md-admonition-icon--version-added); + mask-image: var(--md-admonition-icon--version-added); +} + +/* "version-changed" admonition in orange */ +.md-typeset .admonition.version-changed, +.md-typeset details.version-changed { + border-color: rgb(255, 145, 0); +} + +.md-typeset .version-changed>.admonition-title, +.md-typeset .version-changed>summary { + background-color: rgba(255, 145, 0, .1); +} + +.md-typeset .version-changed>.admonition-title::before, +.md-typeset .version-changed>summary::before { + background-color: rgb(255, 145, 0); + -webkit-mask-image: var(--md-admonition-icon--version-changed); + mask-image: var(--md-admonition-icon--version-changed); +} + +/* "version-removed" admonition in red */ +.md-typeset .admonition.version-removed, +.md-typeset details.version-removed { + border-color: rgb(255, 82, 82); +} + +.md-typeset .version-removed>.admonition-title, +.md-typeset .version-removed>summary { + background-color: rgba(255, 82, 82, .1); +} + +.md-typeset .version-removed>.admonition-title::before, +.md-typeset .version-removed>summary::before { + background-color: rgb(255, 82, 82); + -webkit-mask-image: var(--md-admonition-icon--version-removed); + mask-image: var(--md-admonition-icon--version-removed); +} diff --git a/docs/assets/favicon.png b/docs/assets/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f56c9df378b516eeb6ab6102822359626cbe2b GIT binary patch literal 3626 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𝔉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 MP4`K;%FB2E11w2E8UO$Q literal 0 HcmV?d00001 diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a3cba24d4dc286b66f0a7744ec3380ed191838 GIT binary patch literal 5464 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 Lq@`FVZx!)Bwj{xy literal 0 HcmV?d00001 diff --git a/CHANGELOG.md b/docs/dev/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to docs/dev/CHANGELOG.md diff --git a/CONTRIBUTING.md b/docs/dev/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to docs/dev/CONTRIBUTING.md diff --git a/docs/index.md b/docs/index.md index 60fc7f1..3e969fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,29 +1,5 @@ -# Nornir Nautobot - -Nornir-Nautobot is a set of utilities to help interact with Nautobot via Nornir. - -## Installation - -To install Nornir Nautobot install via Python PIP: - -```shell -pip install nornir-nautobot -``` - -## Inventory - -The inventory plugin is used to gather inventory from a Nautobot instance. This queries the DCIM endpoint to gather information about the devices. - -[Inventory](inventory/inventory.md) - -## Processor Plugin - -This is an opinionated plugin to help with network automation workflows with Nautobot. - -[Processor Plugin](processor/processor.md) - -## Task Plugin - -The task plugin helps with dispatching specific functions with multiple underlying OS. - -[Task Plugin](task/task.md) +--- +hide: + - navigation +--- +--8<-- "README.md" \ No newline at end of file diff --git a/docs/processor/processor.md b/docs/processor/processor.md index 9db5d52..aaa58dd 100644 --- a/docs/processor/processor.md +++ b/docs/processor/processor.md @@ -1,3 +1,7 @@ +--- +hide: + - navigation +--- # Processor Plugins Provided for convenience within the `nornir_nautobot.plugins.processors` is the `BaseProcessor` and `BaseLoggingProcessor` as boilerplate code for creating a custom processor. \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..49859c0 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +mkdocs==1.3.1 +mkdocs-material==8.3.9 +mkdocstrings==0.19 +mkdocstrings-python==0.7.1 \ No newline at end of file diff --git a/docs/task/task.md b/docs/task/task.md index 6ef08b3..bdbb26d 100644 --- a/docs/task/task.md +++ b/docs/task/task.md @@ -1,3 +1,7 @@ +--- +hide: + - navigation +--- # Task Plugins The only task plugin currently is the "dispatcher" plugin. This plugin dispatches to the more specific OS specific functions. To demonstrate the primary components of the code: diff --git a/mkdocs.yml b/mkdocs.yml index 11534d9..0182a9b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,12 +1,71 @@ --- +dev_addr: "0.0.0.0:8001" site_name: "Nornir Nautobot Documentation" site_url: "https://nornir-nautobot.readthedocs.io" repo_url: "https://github.com/nautobot/nornir-nautobot" +copyright: "Copyright © Network To Code" theme: - name: "readthedocs" - navigation_depth: 3 + name: "material" + navigation_depth: 4 + hljs_languages: + - "django" + - "yaml" + features: + - "navigation.tracking" + - "navigation.tabs" + - "navigation.tabs.sticky" + - "navigation.indexes" + - "search.suggest" + - "search.highlight" + - "search.share" + favicon: "assets/favicon.png" + logo: "assets/logo.png" + palette: + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: "default" + primary: "black" + toggle: + icon: "material/weather-sunny" + name: "Switch to dark mode" + + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: "slate" + primary: "black" + toggle: + icon: "material/weather-night" + name: "Switch to light mode" +extra_css: + - "assets/extra.css" + +extra: + generator: true + +markdown_extensions: + - "admonition" + - "toc": + permalink: true + - "attr_list" + - "md_in_html" + - "pymdownx.highlight": + anchor_linenums: true + - "pymdownx.inlinehilite" + - "pymdownx.snippets" + - "pymdownx.superfences" + - "footnotes" +plugins: + - "search" + - "mkdocs-version-annotations" + nav: - - Introduction: "index.md" - - Inventory Plugin: "inventory/inventory.md" + - Overview: "index.md" + - Inventory: + - Inventory Overview: "inventory/inventory.md" + - Common Issues: "inventory/common_issues.md" - Processor Plugin: "processor/processor.md" - Task Plugin: "task/task.md" + - Developer Guide: + - Contributing: "dev/CONTRIBUTING.md" + - Changelog: "dev/CHANGELOG.md" + - Nautobot Docs Home ↗︎: "https://docs.nautobot.com/" \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index 14f524f..ba39602 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,28 +8,29 @@ python-versions = ">=3.6.2" [package.dependencies] lazy-object-proxy = ">=1.4.0" -setuptools = ">=20.0" typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} wrapt = ">=1.11,<2" [[package]] name = "attrs" -version = "22.1.0" +version = "22.2.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] -docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] +dev = ["attrs"] +docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["attrs", "zope.interface"] +tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] +tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] [[package]] name = "bandit" -version = "1.7.4" +version = "1.7.5" description = "Security oriented static analyser for python code." category = "dev" optional = false @@ -39,12 +40,13 @@ python-versions = ">=3.7" colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} GitPython = ">=1.0.1" PyYAML = ">=5.3.1" +rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "toml"] -toml = ["toml"] -yaml = ["PyYAML"] +test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["pyyaml"] [[package]] name = "bcrypt" @@ -60,7 +62,7 @@ typecheck = ["mypy"] [[package]] name = "black" -version = "22.10.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false @@ -69,9 +71,10 @@ python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -81,9 +84,17 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "cached-property" +version = "1.5.2" +description = "A decorator for caching properties in classes." +category = "dev" +optional = false +python-versions = "*" + [[package]] name = "certifi" -version = "2022.9.24" +version = "2022.12.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false @@ -102,14 +113,11 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.1" +version = "3.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" [[package]] name = "click" @@ -133,7 +141,7 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7 [[package]] name = "cryptography" -version = "38.0.1" +version = "39.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -143,12 +151,14 @@ python-versions = ">=3.6" cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "ruff", "mypy", "types-pytz", "types-requests", "check-manifest"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] +test = ["pytest (>=6.2.0)", "pytest-shard (>=0.1.2)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test-randomorder = ["pytest-randomly"] +tox = ["tox"] [[package]] name = "dill" @@ -163,7 +173,7 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "exceptiongroup" -version = "1.0.0" +version = "1.1.1" description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false @@ -174,41 +184,55 @@ test = ["pytest (>=6)"] [[package]] name = "flake8" -version = "5.0.4" +version = "3.9.2" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = ">=3.6.1" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] -importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} -mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.9.0,<2.10.0" -pyflakes = ">=2.5.0,<2.6.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.7.0,<2.8.0" +pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "future" -version = "0.18.2" +version = "0.18.3" description = "Clean single-source support for Python 3 and 2" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["twine", "markdown", "flake8", "wheel"] + [[package]] name = "gitdb" -version = "4.0.9" +version = "4.0.10" description = "Git Object Database" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] smmap = ">=3.0.1,<6" [[package]] -name = "GitPython" -version = "3.1.29" -description = "GitPython is a python library used to interact with Git repositories" +name = "gitpython" +version = "3.1.31" +description = "GitPython is a Python library used to interact with Git repositories" category = "dev" optional = false python-versions = ">=3.7" @@ -217,6 +241,21 @@ python-versions = ">=3.7" gitdb = ">=4.0.1,<5" typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\""} +[[package]] +name = "griffe" +version = "0.25.5" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cached-property = {version = "*", markers = "python_version < \"3.8\""} +colorama = ">=0.4" + +[package.extras] +async = ["aiofiles (>=0.7,<1.0)"] + [[package]] name = "idna" version = "3.4" @@ -227,52 +266,53 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "4.2.0" +version = "4.13.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" [[package]] name = "invoke" -version = "1.7.3" +version = "2.0.0" description = "Pythonic task execution" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "isort" -version = "5.10.1" +version = "5.11.5" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6.1,<4.0" +python-versions = ">=3.7.0" [package.extras] +pipfile-deprecated-finder = ["pipreqs", "requirementslib", "pip-shims (>=0.5.2)"] +requirements-deprecated-finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] plugins = ["setuptools"] -requirements_deprecated_finder = ["pip-api", "pipreqs"] [[package]] -name = "Jinja2" +name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." category = "main" @@ -287,11 +327,11 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "junos-eznc" -version = "2.6.5" +version = "2.6.7" description = "Junos 'EZ' automation for non-programmers" category = "main" optional = false -python-versions = ">=3.*, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.5, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] jinja2 = ">=2.7.1" @@ -309,7 +349,7 @@ yamlordereddictloader = "*" [[package]] name = "lazy-object-proxy" -version = "1.8.0" +version = "1.9.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false @@ -317,7 +357,7 @@ python-versions = ">=3.7" [[package]] name = "lxml" -version = "4.9.1" +version = "4.9.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." category = "main" optional = false @@ -326,12 +366,48 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] -htmlsoup = ["BeautifulSoup4"] +htmlsoup = ["beautifulsoup4"] source = ["Cython (>=0.29.7)"] [[package]] -name = "MarkupSafe" -version = "2.1.1" +name = "markdown" +version = "3.3.7" +description = "Python implementation of Markdown." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "2.2.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +mdurl = ">=0.1,<1.0" +typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} + +[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 = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.2" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false @@ -339,19 +415,127 @@ python-versions = ">=3.7" [[package]] name = "mccabe" -version = "0.7.0" +version = "0.6.1" description = "McCabe checker, plugin for flake8" category = "dev" optional = false +python-versions = "*" + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mkdocs" +version = "1.3.1" +description = "Project documentation with Markdown." +category = "dev" +optional = false python-versions = ">=3.6" +[package.dependencies] +click = ">=3.3" +ghp-import = ">=1.0" +importlib-metadata = ">=4.3" +Jinja2 = ">=2.10.2" +Markdown = ">=3.2.1,<3.4" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +PyYAML = ">=3.10" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "0.4.1" +description = "Automatically link across pages in MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-material" +version = "8.3.9" +description = "Documentation that simply works" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +jinja2 = ">=3.0.2" +markdown = ">=3.2" +mkdocs = ">=1.3.0" +mkdocs-material-extensions = ">=1.0.3" +pygments = ">=2.12" +pymdown-extensions = ">=9.4" + +[[package]] +name = "mkdocs-material-extensions" +version = "1.1.1" +description = "Extension pack for Python Markdown and MkDocs Material." +category = "dev" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mkdocstrings" +version = "0.19.0" +description = "Automatic documentation from sources, for MkDocs." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.2" +mkdocs-autorefs = ">=0.3.1" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "0.7.1" +description = "A Python handler for mkdocstrings." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +griffe = ">=0.11.1" +mkdocstrings = ">=0.19" + [[package]] name = "mypy-extensions" -version = "0.4.3" +version = "0.4.4" description = "Experimental type system extensions for programs checked with the mypy typechecker." category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7" [[package]] name = "napalm" @@ -376,7 +560,6 @@ pyeapi = ">=0.8.2" pyYAML = "*" requests = ">=2.7.0" scp = "*" -setuptools = ">=38.4.0" textfsm = "<=1.1.2" ttp = "*" ttp-templates = "*" @@ -393,7 +576,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] lxml = ">=3.3.0" paramiko = ">=1.15.0" -setuptools = ">0.6" six = "*" [[package]] @@ -418,17 +600,19 @@ paramiko = ">=2.7.2" pyserial = "*" pyyaml = ">=5.3" scp = ">=0.13.3" -setuptools = ">=38.4.0" tenacity = "*" textfsm = "1.1.2" [[package]] name = "netutils" -version = "1.2.0" +version = "1.4.1" description = "Common helper functions useful in network automation." category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7,<4.0" + +[package.extras] +optionals = ["napalm (>=4.0.0,<5.0.0)"] [[package]] name = "nornir" @@ -445,7 +629,7 @@ mypy_extensions = ">=0.4.1,<0.5.0" typing_extensions = ">=4.1,<5.0" [package.extras] -docs = ["jupyter (>=1,<2)", "nbsphinx (>=0.8,<0.9)", "pygments (>=2,<3)", "sphinx (>=4,<5)", "sphinx-issues (>=3.0,<4.0)", "sphinx_rtd_theme (>=1.0,<2.0)", "sphinxcontrib-napoleon (>=0.7,<0.8)"] +docs = ["sphinx (>=4,<5)", "sphinx_rtd_theme (>=1.0,<2.0)", "sphinxcontrib-napoleon (>=0.7,<0.8)", "jupyter (>=1,<2)", "nbsphinx (>=0.8,<0.9)", "pygments (>=2,<3)", "sphinx-issues (>=3.0,<4.0)"] [[package]] name = "nornir-jinja2" @@ -497,49 +681,44 @@ nornir = ">=3,<4" [[package]] name = "ntc-templates" -version = "3.1.0" +version = "3.3.0" description = "TextFSM Templates for Network Devices, and Python wrapper for TextFSM's CliTable." category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7,<4.0" [package.dependencies] textfsm = ">=1.1.0,<2.0.0" [[package]] name = "packaging" -version = "21.3" +version = "23.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" [[package]] name = "paramiko" -version = "2.11.0" +version = "3.1.0" description = "SSH2 protocol library" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" -six = "*" +bcrypt = ">=3.2" +cryptography = ">=3.3" +pynacl = ">=1.5" [package.extras] -all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] +all = ["pyasn1 (>=0.1.7)", "invoke (>=2.0)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] +gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=2.0)"] [[package]] name = "pathspec" -version = "0.10.1" +version = "0.11.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false @@ -547,7 +726,7 @@ python-versions = ">=3.7" [[package]] name = "pbr" -version = "5.11.0" +version = "5.11.1" description = "Python Build Reasonableness" category = "dev" optional = false @@ -555,15 +734,18 @@ python-versions = ">=2.6" [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "3.1.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +[package.dependencies] +typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} + [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2.1)"] [[package]] name = "pluggy" @@ -582,11 +764,11 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pycodestyle" -version = "2.9.1" +version = "2.7.0" description = "Python style guide checker" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pycparser" @@ -598,7 +780,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pydantic" -version = "1.10.2" +version = "1.10.6" description = "Data validation and settings management using python type hints" category = "dev" optional = false @@ -606,7 +788,7 @@ python-versions = ">=3.7" [package.dependencies] python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""} -typing-extensions = ">=4.1.0" +typing-extensions = ">=4.2.0" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -614,17 +796,18 @@ email = ["email-validator (>=1.0.3)"] [[package]] name = "pydocstyle" -version = "6.1.1" +version = "6.3.0" description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -snowballstemmer = "*" +importlib-metadata = {version = ">=2.0.0,<5.0.0", markers = "python_version < \"3.8\""} +snowballstemmer = ">=2.2.0" [package.extras] -toml = ["toml"] +toml = ["tomli (>=1.2.3)"] [[package]] name = "pyeapi" @@ -643,12 +826,23 @@ test = ["coverage", "mock"] [[package]] name = "pyflakes" -version = "2.5.0" +version = "2.3.1" description = "passive checker of Python programs" category = "dev" optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.14.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false python-versions = ">=3.6" +[package.extras] +plugins = ["importlib-metadata"] + [[package]] name = "pylint" version = "2.13.9" @@ -671,7 +865,19 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" testutil = ["gitpython (>3)"] [[package]] -name = "PyNaCl" +name = "pymdown-extensions" +version = "9.10" +description = "Extension pack for Python Markdown." +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +markdown = ">=3.2" +pyyaml = "*" + +[[package]] +name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" category = "main" @@ -682,12 +888,12 @@ python-versions = ">=3.6" cffi = ">=1.4.1" [package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx_rtd_theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"] [[package]] name = "pynautobot" -version = "1.2.2" +version = "1.4.0" description = "Nautobot API client library" category = "main" optional = false @@ -705,7 +911,7 @@ optional = false python-versions = ">=3.6.8" [package.extras] -diagrams = ["jinja2", "railroad-diagrams"] +diagrams = ["railroad-diagrams", "jinja2"] [[package]] name = "pyserial" @@ -720,7 +926,7 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.2" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -739,9 +945,20 @@ tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-dotenv" -version = "0.21.0" +version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" category = "dev" optional = false @@ -751,16 +968,27 @@ python-versions = ">=3.7" cli = ["click (>=5.0)"] [[package]] -name = "PyYAML" +name = "pyyaml" version = "6.0" description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyyaml = "*" + [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false @@ -768,7 +996,7 @@ python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -790,7 +1018,23 @@ six = "*" [package.extras] fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testrepository (>=0.0.18)", "testtools"] +test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.18)", "testtools", "requests-futures"] + +[[package]] +name = "rich" +version = "13.3.2" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "dev" +optional = false +python-versions = ">=3.7.0" + +[package.dependencies] +markdown-it-py = ">=2.2.0,<3.0.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 = "ruamel.yaml" @@ -817,7 +1061,7 @@ python-versions = ">=3.5" [[package]] name = "scp" -version = "0.14.4" +version = "0.14.5" description = "scp module for paramiko" category = "main" optional = false @@ -826,19 +1070,6 @@ python-versions = "*" [package.dependencies] paramiko = "*" -[[package]] -name = "setuptools" -version = "65.5.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - [[package]] name = "six" version = "1.16.0" @@ -877,7 +1108,7 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "tenacity" -version = "8.1.0" +version = "8.2.2" description = "Retry code until it succeeds" category = "main" optional = false @@ -931,19 +1162,19 @@ test = ["pytest"] [[package]] name = "ttp" -version = "0.9.1" +version = "0.9.2" description = "Template Text Parser" category = "main" optional = false python-versions = ">=2.7,<4.0" [package.extras] -docs = ["Sphinx (==4.3.0)", "readthedocs-sphinx-search (==0.1.1)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] -full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0.0,<3.1.0)", "n2g (>=0.2.0,<0.3.0)", "openpyxl (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)"] +full = ["cerberus (>=1.3.0,<1.4.0)", "jinja2 (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "deepdiff (>=5.8.0,<5.9.0)", "openpyxl (>=3.0.0,<3.1.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)", "n2g (>=0.2.0,<0.3.0)"] +docs = ["readthedocs-sphinx-search (==0.1.1)", "Sphinx (==4.3.0)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] [[package]] name = "ttp-templates" -version = "0.3.1" +version = "0.3.2" description = "Template Text Parser Templates collections" category = "main" optional = false @@ -965,7 +1196,7 @@ python-versions = ">=3.6" [[package]] name = "typing-extensions" -version = "4.4.0" +version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -973,20 +1204,31 @@ python-versions = ">=3.7" [[package]] name = "urllib3" -version = "1.26.12" +version = "1.26.15" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "wrapt" -version = "1.14.1" +version = "1.15.0" description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false @@ -994,16 +1236,15 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "yamllint" -version = "1.28.0" +version = "1.30.0" description = "A linter for YAML files." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" -setuptools = "*" [[package]] name = "yamlordereddictloader" @@ -1018,513 +1259,126 @@ pyyaml = "*" [[package]] name = "zipp" -version = "3.10.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "7ceed50328508814b9958a8c0268d1f7cdc53dc593b24221b8988bad5893ad5d" +content-hash = "98cce16484f5237c9e2bef951c2989838e950718aa3cbf4116e08b3e5b4ffff1" [metadata.files] -astroid = [ - {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, - {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -bandit = [ - {file = "bandit-1.7.4-py3-none-any.whl", hash = "sha256:412d3f259dab4077d0e7f0c11f50f650cc7d10db905d98f6520a95a18049658a"}, - {file = "bandit-1.7.4.tar.gz", hash = "sha256:2d63a8c573417bae338962d4b9b06fbc6080f74ecd955a092849e1e65c717bd2"}, -] -bcrypt = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] +astroid = [] +attrs = [] +bandit = [] +bcrypt = [] +black = [] +cached-property = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] +certifi = [] +cffi = [] +charset-normalizer = [] click = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] -colorama = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] -cryptography = [ - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f"}, - {file = "cryptography-38.0.1-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd"}, - {file = "cryptography-38.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a"}, - {file = "cryptography-38.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294"}, - {file = "cryptography-38.0.1-cp36-abi3-win32.whl", hash = "sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0"}, - {file = "cryptography-38.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9"}, - {file = "cryptography-38.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013"}, - {file = "cryptography-38.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a"}, - {file = "cryptography-38.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b"}, - {file = "cryptography-38.0.1.tar.gz", hash = "sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.0-py3-none-any.whl", hash = "sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41"}, - {file = "exceptiongroup-1.0.0.tar.gz", hash = "sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad"}, -] +colorama = [] +cryptography = [] +dill = [] +exceptiongroup = [] flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -future = [ - {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, -] -gitdb = [ - {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, - {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, -] -GitPython = [ - {file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"}, - {file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -invoke = [ - {file = "invoke-1.7.3-py3-none-any.whl", hash = "sha256:d9694a865764dd3fd91f25f7e9a97fb41666e822bbb00e670091e3f43933574d"}, - {file = "invoke-1.7.3.tar.gz", hash = "sha256:41b428342d466a82135d5ab37119685a989713742be46e42a3a399d685579314"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -Jinja2 = [ + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, +] +future = [] +ghp-import = [] +gitdb = [] +gitpython = [] +griffe = [] +idna = [] +importlib-metadata = [] +iniconfig = [] +invoke = [] +isort = [] +jinja2 = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] -junos-eznc = [ - {file = "junos-eznc-2.6.5.tar.gz", hash = "sha256:fa4c3e0390db1e41b364fab3d703592b248e10d15a80fce5acddee00f037fed3"}, - {file = "junos_eznc-2.6.5-py2.py3-none-any.whl", hash = "sha256:0036512d2dfc0e875a0698092eb05fa03e394ed6aa3b0350ce051ef765773d8f"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, - {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, - {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, - {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, - {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, - {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, - {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, - {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, - {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, -] -lxml = [ - {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, - {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, - {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, - {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, - {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, - {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, - {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, - {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, - {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, - {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, - {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, - {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, - {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, - {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, - {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, - {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, - {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, - {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, - {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, - {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, - {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, -] -MarkupSafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] +junos-eznc = [] +lazy-object-proxy = [] +lxml = [] +markdown = [] +markdown-it-py = [] +markupsafe = [] mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -napalm = [ - {file = "napalm-4.0.0-py2.py3-none-any.whl", hash = "sha256:e4289f6966974b485c1f3de3e8f4a11ac2ed2825e975bbd5afc006331b1e4c36"}, - {file = "napalm-4.0.0.tar.gz", hash = "sha256:40e1bd297ac4102c14c0d427c51d61c3a12d5d5bec163750733941ad82a464ee"}, -] -ncclient = [ - {file = "ncclient-0.6.13.tar.gz", hash = "sha256:f9f8cea8bcbe057e1b948b9cd1b241eafb8a3f73c4981fbdfa1cc6ed69c0a7b3"}, -] + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mdurl = [] +mergedeep = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] +mkdocs = [] +mkdocs-autorefs = [] +mkdocs-material = [] +mkdocs-material-extensions = [] +mkdocstrings = [] +mkdocstrings-python = [] +mypy-extensions = [] +napalm = [] +ncclient = [] netaddr = [ {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, ] -netmiko = [ - {file = "netmiko-4.1.2-py3-none-any.whl", hash = "sha256:ee1e88ecbd07f619b0bc1e90648f82a64a0adee5968c3068621bbdadbfec5c03"}, - {file = "netmiko-4.1.2.tar.gz", hash = "sha256:f5ede2a28670d3dfd3470061468665f80f9b4906ed20e6b0fb4d9e1c9be67afc"}, -] -netutils = [ - {file = "netutils-1.2.0-py3-none-any.whl", hash = "sha256:23c2ca960544ac6674263063a3580fe3d9d94d5898512df468298659c7eff7e3"}, - {file = "netutils-1.2.0.tar.gz", hash = "sha256:a661326a46352208ea465f0305831f042f7943289e4cbc3e085c23c07682d24b"}, -] -nornir = [ - {file = "nornir-3.3.0-py3-none-any.whl", hash = "sha256:4590d96edb5044e6a9e6f84e15625d32932177a10654040f99e145d73b352479"}, - {file = "nornir-3.3.0.tar.gz", hash = "sha256:1c6fd283bcdff9972358b126703c0990e9076dff1dfdc211e3077d45ada937d5"}, -] -nornir-jinja2 = [ - {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, - {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, -] -nornir-napalm = [ - {file = "nornir_napalm-0.3.0-py3-none-any.whl", hash = "sha256:f7dbf050af9da72101bcf47a3315b1400e9df4951cec172ae9ad509bc3a2ae7b"}, - {file = "nornir_napalm-0.3.0.tar.gz", hash = "sha256:d6ed3bf2e2f23c4ab2256476afd354babbdfc3673726240100e70525b8b88df4"}, -] -nornir-netmiko = [ - {file = "nornir_netmiko-0.2.0-py3-none-any.whl", hash = "sha256:6960e7ae0b0566a46750634ec7ab3b3a081e09afb554f593bc547bb9383d41b1"}, - {file = "nornir_netmiko-0.2.0.tar.gz", hash = "sha256:78c93b11ef21a8dd55689b82e47149061ab653cc7fe641e43886c847d171f486"}, -] -nornir-utils = [ - {file = "nornir_utils-0.2.0-py3-none-any.whl", hash = "sha256:b4c430793a74f03affd5ff2d90abc8c67a28c7ff325f48e3a01a9a44ec71b844"}, - {file = "nornir_utils-0.2.0.tar.gz", hash = "sha256:4de6aaa35e5c1a98e1c84db84a008b0b1e974dc65d88484f2dcea3e30c95fbc2"}, -] -ntc-templates = [ - {file = "ntc_templates-3.1.0-py3-none-any.whl", hash = "sha256:e59fbc485a132e0d3eecb6f53fc8e85426cec099ef39678cdc20eec8dccaced6"}, - {file = "ntc_templates-3.1.0.tar.gz", hash = "sha256:7231e4227d46d1a04a03a34e3478b23acee7869942cce62b6722b2c925c2f809"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -paramiko = [ - {file = "paramiko-2.11.0-py2.py3-none-any.whl", hash = "sha256:655f25dc8baf763277b933dfcea101d636581df8d6b9774d1fb653426b72c270"}, - {file = "paramiko-2.11.0.tar.gz", hash = "sha256:003e6bee7c034c21fbb051bf83dc0a9ee4106204dd3c53054c71452cc4ec3938"}, -] -pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, -] -pbr = [ - {file = "pbr-5.11.0-py2.py3-none-any.whl", hash = "sha256:db2317ff07c84c4c63648c9064a79fe9d9f5c7ce85a9099d4b6258b3db83225a"}, - {file = "pbr-5.11.0.tar.gz", hash = "sha256:b97bc6695b2aff02144133c2e7399d5885223d42b7912ffaec2ca3898e673bfe"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] +netmiko = [] +netutils = [] +nornir = [] +nornir-jinja2 = [] +nornir-napalm = [] +nornir-netmiko = [] +nornir-utils = [] +ntc-templates = [] +packaging = [] +paramiko = [] +pathspec = [] +pbr = [] +platformdirs = [] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] pycparser = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, -] -pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, -] +pydantic = [] +pydocstyle = [] pyeapi = [ {file = "pyeapi-0.8.4.tar.gz", hash = "sha256:c33ad1eadd8ebac75f63488df9412081ce0b024c9e1da12a37196a5c60427c54"}, ] pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] -pylint = [ - {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, - {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, -] -PyNaCl = [ +pygments = [] +pylint = [] +pymdown-extensions = [] +pynacl = [ {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, @@ -1536,10 +1390,7 @@ PyNaCl = [ {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, ] -pynautobot = [ - {file = "pynautobot-1.2.2-py3-none-any.whl", hash = "sha256:ea7034181cf09b3b90ad7260b567ae38e3de014c3ea877efd88603f30f2aa2a0"}, - {file = "pynautobot-1.2.2.tar.gz", hash = "sha256:844b96f4528c45ba4c39ec6e8def787bd42312f525e1e9f73ee7ee68b80f79eb"}, -] +pynautobot = [] pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, @@ -1548,15 +1399,13 @@ pyserial = [ {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, ] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, +pytest = [] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -python-dotenv = [ - {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"}, - {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"}, -] -PyYAML = [ +python-dotenv = [] +pyyaml = [ {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, @@ -1564,13 +1413,6 @@ PyYAML = [ {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, @@ -1598,61 +1440,19 @@ PyYAML = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-mock = [ - {file = "requests-mock-1.10.0.tar.gz", hash = "sha256:59c9c32419a9fb1ae83ec242d98e889c45bd7d7a65d48375cc243ec08441658b"}, - {file = "requests_mock-1.10.0-py2.py3-none-any.whl", hash = "sha256:2fdbb637ad17ee15c06f33d31169e71bf9fe2bdb7bc9da26185be0dd8d842699"}, +pyyaml-env-tag = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, ] +requests = [] +requests-mock = [] +rich = [] "ruamel.yaml" = [ {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, ] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, -] -scp = [ - {file = "scp-0.14.4-py2.py3-none-any.whl", hash = "sha256:29ddaafbfba60793a8a779694c97d8c150d365668a4ef67616c515b80a69ef2f"}, - {file = "scp-0.14.4.tar.gz", hash = "sha256:54699b92cb68ae34b5928c48a888eab9722a212502cba89aa795bd56597505bd"}, -] -setuptools = [ - {file = "setuptools-65.5.0-py3-none-any.whl", hash = "sha256:f62ea9da9ed6289bfe868cd6845968a2c854d1427f8548d52cae02a42b4f0356"}, - {file = "setuptools-65.5.0.tar.gz", hash = "sha256:512e5536220e38146176efb833d4a62aa726b7bbff82cfbc8ba9eaa3996e0b17"}, -] +"ruamel.yaml.clib" = [] +scp = [] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1665,14 +1465,8 @@ snowballstemmer = [ {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] -stevedore = [ - {file = "stevedore-3.5.2-py3-none-any.whl", hash = "sha256:fa2630e3d0ad3e22d4914aff2501445815b9a4467a6edc49387c667a38faf5bf"}, - {file = "stevedore-3.5.2.tar.gz", hash = "sha256:cf99f41fc0d5a4f185ca4d3d42b03be9011b0a1ec1a4ea1a282be1b4b306dcc2"}, -] -tenacity = [ - {file = "tenacity-8.1.0-py3-none-any.whl", hash = "sha256:35525cd47f82830069f0d6b73f7eb83bc5b73ee2fff0437952cedf98b27653ac"}, - {file = "tenacity-8.1.0.tar.gz", hash = "sha256:e48c437fdf9340f5666b92cd7990e96bc5fc955e1298baf4a907e3972067a445"}, -] +stevedore = [] +tenacity = [] textfsm = [ {file = "textfsm-1.1.2-py2.py3-none-any.whl", hash = "sha256:f3d4e9bd4344935a08e6844e53d6220e2e4fb7e465bee51fa909152ed6bab406"}, {file = "textfsm-1.1.2.tar.gz", hash = "sha256:85a450b441aff04b1cac726bdb36f35534a5b196cca08c8bc14fddd879c4255c"}, @@ -1681,129 +1475,17 @@ toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -transitions = [ - {file = "transitions-0.9.0-py2.py3-none-any.whl", hash = "sha256:5687ee8c6a3200830e44f988d16b0045f53293f7a873002d7bff70852331a078"}, - {file = "transitions-0.9.0.tar.gz", hash = "sha256:2f54d11bdb225779d7e729011e93a9fb717668ce3dc65f8d4f5a5d7ba2f48e10"}, -] -ttp = [ - {file = "ttp-0.9.1-py2.py3-none-any.whl", hash = "sha256:50d3f63a6b311f74d6928cfec0d22a962153c82ba2d1976c599873f32914b5bd"}, - {file = "ttp-0.9.1.tar.gz", hash = "sha256:25c9014d9c3f65e2f135053f9ec1fab98dc698bb999d0e8187dc0e64f8a3f549"}, -] -ttp-templates = [ - {file = "ttp_templates-0.3.1-py3-none-any.whl", hash = "sha256:ea85b5d5cc4db91654bba7c0c2bb1ac004daec78fe0f601787904d152bd08ad5"}, - {file = "ttp_templates-0.3.1.tar.gz", hash = "sha256:1916a8b165071fc818be22664b67eb7698dc439c287369c15559e00ea450a5b3"}, -] -typed-ast = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -yamllint = [ - {file = "yamllint-1.28.0.tar.gz", hash = "sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b"}, -] +tomli = [] +transitions = [] +ttp = [] +ttp-templates = [] +typed-ast = [] +typing-extensions = [] +urllib3 = [] +watchdog = [] +wrapt = [] +yamllint = [] yamlordereddictloader = [ {file = "yamlordereddictloader-0.4.0.tar.gz", hash = "sha256:7f30f0b99ea3f877f7cb340c570921fa9d639b7f69cba18be051e27f8de2080e"}, ] -zipp = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, -] +zipp = [] diff --git a/pyproject.toml b/pyproject.toml index c954bdf..00e3529 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,11 @@ invoke = "*" toml = "*" flake8 = "*" pydantic = {version = "^1.7.2", extras = ["dotenv"]} +# documentation dependencies +mkdocs = "1.3.1" +mkdocs-material = "8.3.9" +mkdocstrings = "0.19" +mkdocstrings-python = "0.7.1" [tool.poetry.plugins."nornir.plugins.inventory"] "NautobotInventory" = "nornir_nautobot.plugins.inventory.nautobot:NautobotInventory" From f0e46431b0f4ff732976d2f52b784e7171035fc3 Mon Sep 17 00:00:00 2001 From: susanhooks-al <110186911+susanhooks-al@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:44:45 -0600 Subject: [PATCH 10/65] Added mkdocs annotations --- .readthedocs.yml | 3 ++- docs/requirements.txt | 3 ++- mkdocs.yml | 6 +++--- poetry.lock | 11 ++++++++++- pyproject.toml | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index cc1f858..30e417b 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -19,4 +19,5 @@ mkdocs: # Use our docs/requirements.txt during installation. python: install: - - requirements: "docs/requirements.txt" \ No newline at end of file + - requirements: "docs/requirements.txt" + \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 49859c0..53cab3c 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,5 @@ mkdocs==1.3.1 mkdocs-material==8.3.9 mkdocstrings==0.19 -mkdocstrings-python==0.7.1 \ No newline at end of file +mkdocstrings-python==0.7.1 +mkdocs-version-annotations==1.0.0 \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 0182a9b..1e5855a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -60,12 +60,12 @@ plugins: nav: - Overview: "index.md" - - Inventory: + - Inventory: - Inventory Overview: "inventory/inventory.md" - Common Issues: "inventory/common_issues.md" - Processor Plugin: "processor/processor.md" - Task Plugin: "task/task.md" - - Developer Guide: + - Developer Guide: - Contributing: "dev/CONTRIBUTING.md" - Changelog: "dev/CHANGELOG.md" - - Nautobot Docs Home ↗︎: "https://docs.nautobot.com/" \ No newline at end of file + - Nautobot Docs Home ↗︎: "https://docs.nautobot.com/" diff --git a/poetry.lock b/poetry.lock index ba39602..4a3ac8e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -496,6 +496,14 @@ category = "dev" optional = false python-versions = ">=3.7" +[[package]] +name = "mkdocs-version-annotations" +version = "1.0.0" +description = "MkDocs plugin to add custom admonitions for documenting version differences" +category = "dev" +optional = false +python-versions = ">=3.7,<4.0" + [[package]] name = "mkdocstrings" version = "0.19.0" @@ -1272,7 +1280,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-co [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "98cce16484f5237c9e2bef951c2989838e950718aa3cbf4116e08b3e5b4ffff1" +content-hash = "ec13a46f05e3087e3e65fc00310e62c03d16eedd246a2811cf1ea1cb2e8afd48" [metadata.files] astroid = [] @@ -1332,6 +1340,7 @@ mkdocs = [] mkdocs-autorefs = [] mkdocs-material = [] mkdocs-material-extensions = [] +mkdocs-version-annotations = [] mkdocstrings = [] mkdocstrings-python = [] mypy-extensions = [] diff --git a/pyproject.toml b/pyproject.toml index 00e3529..f808936 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,6 +49,7 @@ mkdocs = "1.3.1" mkdocs-material = "8.3.9" mkdocstrings = "0.19" mkdocstrings-python = "0.7.1" +mkdocs-version-annotations = "1.0.0" [tool.poetry.plugins."nornir.plugins.inventory"] "NautobotInventory" = "nornir_nautobot.plugins.inventory.nautobot:NautobotInventory" From 440b93c63f3059556875a4869a65bad1646be9d8 Mon Sep 17 00:00:00 2001 From: susanhooks-al <110186911+susanhooks-al@users.noreply.github.com> Date: Wed, 22 Mar 2023 13:50:29 -0600 Subject: [PATCH 11/65] Yamllint update --- .readthedocs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 30e417b..a9d358e 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -20,4 +20,3 @@ mkdocs: python: install: - requirements: "docs/requirements.txt" - \ No newline at end of file From b7132f9de05dd71070fe19a3654940e52d5ad6b2 Mon Sep 17 00:00:00 2001 From: susanhooks-al <110186911+susanhooks-al@users.noreply.github.com> Date: Wed, 22 Mar 2023 14:36:32 -0600 Subject: [PATCH 12/65] Updated test for dynamic version --- tests/unit/test_nautobot_inventory.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_nautobot_inventory.py b/tests/unit/test_nautobot_inventory.py index aefe734..7e07257 100644 --- a/tests/unit/test_nautobot_inventory.py +++ b/tests/unit/test_nautobot_inventory.py @@ -6,6 +6,7 @@ # Third Party Imports import pytest +import requests from requests.sessions import Session from requests_mock import Mocker from nornir import InitNornir @@ -99,7 +100,7 @@ def test_nornir_nautobot_missing_token(): def test_api_session(nornir_nautobot_class): expected_headers = { - "User-Agent": "python-requests/2.28.1", + "User-Agent": f"python-requests/{requests.__version__}", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", From 1f2bd4c737be7249c7f2b4a9d05c92b00628b671 Mon Sep 17 00:00:00 2001 From: susanhooks-al <110186911+susanhooks-al@users.noreply.github.com> Date: Thu, 23 Mar 2023 15:13:45 -0600 Subject: [PATCH 13/65] updated logos, removed html --- .readthedocs.yml | 2 +- README.md | 21 ++---- docs/assets/favicon.ico | Bin 0 -> 15086 bytes docs/assets/favicon.png | Bin 3626 -> 0 bytes docs/assets/logo.png | Bin 5464 -> 0 bytes docs/assets/nautobot_logo.svg | 131 ++++++++++++++++++++++++++++++++++ docs/extra.css | 19 ----- mkdocs.yml | 6 +- 8 files changed, 142 insertions(+), 37 deletions(-) create mode 100644 docs/assets/favicon.ico delete mode 100644 docs/assets/favicon.png delete mode 100644 docs/assets/logo.png create mode 100644 docs/assets/nautobot_logo.svg delete mode 100644 docs/extra.css diff --git a/.readthedocs.yml b/.readthedocs.yml index a9d358e..9a0a64c 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -14,7 +14,7 @@ build: mkdocs: configuration: "mkdocs.yml" - # fail_on_warning: true + fail_on_warning: true # Use our docs/requirements.txt during installation. python: diff --git a/README.md b/README.md index 30aef06..2e5a697 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,7 @@ - -
-

Nornir Nautobot

-
-

- - - -
-

- +# Nornir Nautobot +[![GitHub Actions](https://github.com/nautobot/nornir-nautobot/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/nautobot/nornir-nautobot/actions) +[![PyPI Version](https://img.shields.io/pypi/v/nornir-nautobot)](https://pypi.org/project/nornir-nautobot/) +[![PyPI Downloads](https://img.shields.io/pypi/dm/nornir-nautobot)](https://pypi.org/project/nornir-nautobot/) Nornir-Nautobot is a set of utilities to help interact with Nautobot via Nornir. The nornir_nautobot project intends to solve two primary use cases. @@ -28,16 +21,16 @@ pip install nornir-nautobot The inventory plugin is used to gather inventory from a Nautobot instance. This queries the DCIM endpoint to gather information about the devices. -[Inventory](inventory/inventory.md) +[Inventory](https://docs.nautobot.com/projects/nornir-nautobot/en/latest/inventory/inventory/) ## Processor Plugin This is an opinionated plugin to help with network automation workflows with Nautobot. -[Processor Plugin](processor/processor.md) +[Processor Plugin](https://docs.nautobot.com/projects/nornir-nautobot/en/latest/processor/processor/) ## Task Plugin The task plugin helps with dispatching specific functions with multiple underlying OS. -[Task Plugin](task/task.md) \ No newline at end of file +[Task Plugin](https://docs.nautobot.com/projects/nornir-nautobot/en/latest/task/task/) \ No newline at end of file diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fcaa3d653334894025d867436969693afa2d7c51 GIT binary patch literal 15086 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 Lq@`FVZx!)Bwj{xy diff --git a/docs/assets/nautobot_logo.svg b/docs/assets/nautobot_logo.svg new file mode 100644 index 0000000..c9bba8e --- /dev/null +++ b/docs/assets/nautobot_logo.svg @@ -0,0 +1,131 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/extra.css b/docs/extra.css deleted file mode 100644 index 85d51a1..0000000 --- a/docs/extra.css +++ /dev/null @@ -1,19 +0,0 @@ -/* Images */ -img { - display: block; - margin-left: auto; - margin-right: auto; -} - -/* Tables */ -table { - margin-bottom: 24px; - width: 100%; -} -th { - background-color: #f0f0f0; - padding: 6px; -} -td { - padding: 6px; -} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 1e5855a..d5499ba 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,5 @@ --- -dev_addr: "0.0.0.0:8001" +dev_addr: "0.0.0.0:8002" site_name: "Nornir Nautobot Documentation" site_url: "https://nornir-nautobot.readthedocs.io" repo_url: "https://github.com/nautobot/nornir-nautobot" @@ -18,8 +18,8 @@ theme: - "search.suggest" - "search.highlight" - "search.share" - favicon: "assets/favicon.png" - logo: "assets/logo.png" + favicon: "assets/favicon.ico" + logo: "assets/nautobot_logo.svg" palette: # Palette toggle for light mode - media: "(prefers-color-scheme: light)" From c6bd6c5e47d0da4b5afa7f925146b57a4ba763a1 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 4 Apr 2023 21:18:36 +0200 Subject: [PATCH 14/65] "added Mikrotik support for get_config ROS 6 & 7" --- .../plugins/tasks/dispatcher/default.py | 1 + .../tasks/dispatcher/mikrotik_routeros.py | 98 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 4608b6e..4d688b0 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -33,6 +33,7 @@ "cisco_xr": "show run", "juniper_junos": "show configuration | display set", "arista_eos": "show run", + "mikrotik_routeros": "export terse", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py new file mode 100644 index 0000000..1b25200 --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -0,0 +1,98 @@ +"""network_importer driver for Mikrotik Router OS.""" + +import os +import re + +try: + from netmiko.ssh_exception import NetmikoAuthenticationException, NetmikoTimeoutException +except ImportError: + from netmiko import NetmikoAuthenticationException, NetmikoTimeoutException + +from netutils.config.clean import clean_config, sanitize_config +from nornir.core.exceptions import NornirSubTaskError +from nornir.core.task import Result, Task +from nornir_netmiko.tasks import netmiko_send_command + +from nornir_nautobot.exceptions import NornirNautobotException +from nornir_nautobot.utils.helpers import make_folder +from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver + +GET_VERSION_COMMAND = "system resource print" +GET_MAJOR_VERSION_REGEX = re.compile(r"version:\s+(\d+)\.\d+\.\d+") +GET_CONFIG_ROS_7 = "export terse show-sensitive" +GET_CONFIG_ROS_6 = "export terse" + + +class NautobotNornirDriver(DefaultNautobotNornirDriver): + """Driver for Mikrotik Router OS.""" + + @staticmethod + def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + """Get the latest configuration from the device using Netmiko. Overrides default get_config to account + for Mikrotik Router OS config scrubbing behavior since ROS >= 7.X. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + remove_lines (list): A list of regex lines to remove configurations. + substitute_lines (list): A list of dictionaries with to remove and replace lines. + + Returns: + Result: Nornir Result object with a dict as a result containing the running configuration + { "config: } + """ + task.host.platform = "mikrotik_routeros" #Patch for platform_slug mapping (temporal) + logger.log_debug(f"Analyzing Software Version for {task.host.name} on {task.host.platform}") + command = GET_VERSION_COMMAND + try: + result = task.run(task=netmiko_send_command, command_string=GET_VERSION_COMMAND) + except NornirSubTaskError as exc: + if isinstance(exc.result.exception, NetmikoAuthenticationException): + logger.log_failure(obj, f"Failed with an authentication issue: `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an authentication issue: `{exc.result.exception}`") + + if isinstance(exc.result.exception, NetmikoTimeoutException): + logger.log_failure(obj, f"Failed with a timeout issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with a timeout issue. `{exc.result.exception}`") + + logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") + + if result[0].failed: + return result + + search_result = re.search(GET_MAJOR_VERSION_REGEX, result[0].result) + major_version = search_result.group(1) + + if major_version > "6": + command = GET_CONFIG_ROS_7 + else: + command = GET_CONFIG_ROS_6 + + logger.log_debug(f"Found Mikrotik Router OS version {major_version}") + logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") + + try: + result = task.run(task=netmiko_send_command, command_string=command) + except NornirSubTaskError as exc: + logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") + + if result[0].failed: + return result + + running_config = result[0].result + + if remove_lines: + logger.log_debug("Removing lines from configuration based on `remove_lines` definition") + running_config = clean_config(running_config, remove_lines) + if substitute_lines: + logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") + running_config = sanitize_config(running_config, substitute_lines) + + make_folder(os.path.dirname(backup_file)) + + with open(backup_file, "w", encoding="utf8") as filehandler: + filehandler.write(running_config) + return Result(host=task.host, result={"config": running_config}) From 939e31f54820770a3437f0a669e56a0837e545cd Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 5 Apr 2023 13:12:56 +0200 Subject: [PATCH 15/65] modified default drivers mapping in __init__.py --- nornir_nautobot/plugins/tasks/dispatcher/__init__.py | 1 + .../plugins/tasks/dispatcher/mikrotik_routeros.py | 12 +++++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 8d0c831..2bb230f 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -18,6 +18,7 @@ "cisco_xr": "nornir_nautobot.plugins.tasks.dispatcher.cisco_ios_xr.NautobotNornirDriver", "juniper_junos": "nornir_nautobot.plugins.tasks.dispatcher.juniper_junos.NautobotNornirDriver", "arista_eos": "nornir_nautobot.plugins.tasks.dispatcher.arista_eos.NautobotNornirDriver", + "mikrotik_routeros": "nornir_nautobot.plugins.tasks.dispatcher.mikrotik_routeros.NautobotNornirDriver", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 1b25200..1bfc9fa 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -19,9 +19,8 @@ GET_VERSION_COMMAND = "system resource print" GET_MAJOR_VERSION_REGEX = re.compile(r"version:\s+(\d+)\.\d+\.\d+") -GET_CONFIG_ROS_7 = "export terse show-sensitive" -GET_CONFIG_ROS_6 = "export terse" - +GET_CONFIG_ROS = "export terse" +NETMIKO_DEVICE_TYPE = "mikrotik_routeros" class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" @@ -42,7 +41,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su Result: Nornir Result object with a dict as a result containing the running configuration { "config: } """ - task.host.platform = "mikrotik_routeros" #Patch for platform_slug mapping (temporal) + task.host.platform = NETMIKO_DEVICE_TYPE #Patch for platform_slug mapping (temporal) logger.log_debug(f"Analyzing Software Version for {task.host.name} on {task.host.platform}") command = GET_VERSION_COMMAND try: @@ -65,10 +64,9 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su search_result = re.search(GET_MAJOR_VERSION_REGEX, result[0].result) major_version = search_result.group(1) + command = GET_CONFIG_ROS if major_version > "6": - command = GET_CONFIG_ROS_7 - else: - command = GET_CONFIG_ROS_6 + command += " show-sensitive" logger.log_debug(f"Found Mikrotik Router OS version {major_version}") logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") From edba8ccef23de7c73f319e106f4dc7c684c6bc02 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 5 Apr 2023 13:33:11 +0200 Subject: [PATCH 16/65] linting to mikrotik_routeros.py --- nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 1bfc9fa..e4abdcf 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -22,6 +22,7 @@ GET_CONFIG_ROS = "export terse" NETMIKO_DEVICE_TYPE = "mikrotik_routeros" + class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" @@ -41,7 +42,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su Result: Nornir Result object with a dict as a result containing the running configuration { "config: } """ - task.host.platform = NETMIKO_DEVICE_TYPE #Patch for platform_slug mapping (temporal) + task.host.platform = NETMIKO_DEVICE_TYPE # Patch for platform_slug mapping (temporal) logger.log_debug(f"Analyzing Software Version for {task.host.name} on {task.host.platform}") command = GET_VERSION_COMMAND try: From 5924dc6f17e5e3f82f18b464b531bb4dcb08470d Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 12 Apr 2023 17:24:14 +0200 Subject: [PATCH 17/65] added ICX/Fastiron Nornir Driver --- nornir_nautobot/plugins/tasks/dispatcher/__init__.py | 1 + nornir_nautobot/plugins/tasks/dispatcher/default.py | 1 + .../plugins/tasks/dispatcher/ruckus_fastiron.py | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 8d0c831..ec7cb2b 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -18,6 +18,7 @@ "cisco_xr": "nornir_nautobot.plugins.tasks.dispatcher.cisco_ios_xr.NautobotNornirDriver", "juniper_junos": "nornir_nautobot.plugins.tasks.dispatcher.juniper_junos.NautobotNornirDriver", "arista_eos": "nornir_nautobot.plugins.tasks.dispatcher.arista_eos.NautobotNornirDriver", + "ruckus_fastiron": "nornir_nautobot.plugins.tasks.dispatcher.ruckus_fastiron.NautobotNornirDriver", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 4608b6e..b36213f 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -33,6 +33,7 @@ "cisco_xr": "show run", "juniper_junos": "show configuration | display set", "arista_eos": "show run", + "ruckus_fastiron": "show running-config", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py new file mode 100644 index 0000000..8e60f9d --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py @@ -0,0 +1,7 @@ +"""network_importer driver for Ruckus ICX/FastIron Switches.""" + +from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver + + +class NautobotNornirDriver(DefaultNautobotNornirDriver): + """Driver for Ruckus ICX/FastIron Switches.""" From a705d7a9d9f3525c562042f0a77899531a7c21f1 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 12 Apr 2023 17:34:21 +0200 Subject: [PATCH 18/65] fixed pydocstyle linting errors modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- .../plugins/tasks/dispatcher/mikrotik_routeros.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index e4abdcf..1fa10ac 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -28,8 +28,9 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): @staticmethod def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: - """Get the latest configuration from the device using Netmiko. Overrides default get_config to account - for Mikrotik Router OS config scrubbing behavior since ROS >= 7.X. + """Get the latest configuration from the device using Netmiko. Overrides default get_config. + + This accounts for Mikrotik Router OS config scrubbing behavior since ROS >= 7.X. Args: task (Task): Nornir Task. From e2697782227ac403251ecc211d3c3174b9bac5be Mon Sep 17 00:00:00 2001 From: Cristian Date: Wed, 19 Apr 2023 17:51:25 +0300 Subject: [PATCH 19/65] Update mkdocs.yml --- mkdocs.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index d5499ba..2cdb5be 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,7 +1,8 @@ --- -dev_addr: "0.0.0.0:8002" +dev_addr: "127.0.0.1:8002" site_name: "Nornir Nautobot Documentation" -site_url: "https://nornir-nautobot.readthedocs.io" +edit_uri: "edit/develop/docs" +site_url: "https://docs.nautobot.com/projects/nornir-nautobot/en/latest/" repo_url: "https://github.com/nautobot/nornir-nautobot" copyright: "Copyright © Network To Code" theme: From 89d3ca6df779bbd03f855b3aca879f5033479b72 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 21 Apr 2023 15:02:30 +0200 Subject: [PATCH 20/65] removed dependency with regex lib --- .../plugins/tasks/dispatcher/mikrotik_routeros.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 1fa10ac..4aa6607 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -1,7 +1,6 @@ """network_importer driver for Mikrotik Router OS.""" import os -import re try: from netmiko.ssh_exception import NetmikoAuthenticationException, NetmikoTimeoutException @@ -18,8 +17,7 @@ from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver GET_VERSION_COMMAND = "system resource print" -GET_MAJOR_VERSION_REGEX = re.compile(r"version:\s+(\d+)\.\d+\.\d+") -GET_CONFIG_ROS = "export terse" +GET_CONFIG_COMMAND = "export terse" NETMIKO_DEVICE_TYPE = "mikrotik_routeros" @@ -43,7 +41,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su Result: Nornir Result object with a dict as a result containing the running configuration { "config: } """ - task.host.platform = NETMIKO_DEVICE_TYPE # Patch for platform_slug mapping (temporal) + task.host.platform = NETMIKO_DEVICE_TYPE logger.log_debug(f"Analyzing Software Version for {task.host.name} on {task.host.platform}") command = GET_VERSION_COMMAND try: @@ -63,10 +61,9 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su if result[0].failed: return result - search_result = re.search(GET_MAJOR_VERSION_REGEX, result[0].result) - major_version = search_result.group(1) + major_version = result[0].result.split()[3].split('.')[0] - command = GET_CONFIG_ROS + command = GET_CONFIG_COMMAND if major_version > "6": command += " show-sensitive" From 10a0cf154bb6e636a54e1690be82d7d8c2ea26ef Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 24 Apr 2023 11:40:52 +0200 Subject: [PATCH 21/65] first draft mikrotik_routeros_api --- .../plugins/tasks/dispatcher/__init__.py | 1 + .../tasks/dispatcher/mikrotik_routeros_api.py | 212 ++++++++++++++++++ .../plugins/tasks/dispatcher/schema.py | 70 ++++++ 3 files changed, 283 insertions(+) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/schema.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 8d0c831..d169d96 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -18,6 +18,7 @@ "cisco_xr": "nornir_nautobot.plugins.tasks.dispatcher.cisco_ios_xr.NautobotNornirDriver", "juniper_junos": "nornir_nautobot.plugins.tasks.dispatcher.juniper_junos.NautobotNornirDriver", "arista_eos": "nornir_nautobot.plugins.tasks.dispatcher.arista_eos.NautobotNornirDriver", + "mikrotik_routeros_api": "nornir_nautobot.plugins.tasks.dispatcher.mikrotik_routeros_api.NautobotNornirDriver", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py new file mode 100644 index 0000000..df05ed3 --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -0,0 +1,212 @@ +"""default network_importer driver for Juniper.""" + +from .default import NautobotNornirDriver as DefaultNautobotNornirDriver +import routeros_api +import os +import json +import socket +from typing import Optional +import jinja2 +from dispatcher.schema import api_resources +from netutils.config.clean import clean_config, sanitize_config +from netutils.config.compliance import compliance +from netutils.dns import is_fqdn_resolvable +from netutils.ip import is_ip +from netutils.ping import tcp_ping +from nornir.core.exceptions import NornirSubTaskError +from nornir.core.task import Result, Task +from nornir_jinja2.plugins.tasks import template_file + +from nornir_nautobot.exceptions import NornirNautobotException +from nornir_nautobot.utils.helpers import make_folder + +class NautobotNornirDriver(DefaultNautobotNornirDriver): + """Default collection of Nornir Tasks based on Napalm.""" + + @staticmethod + def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + """Get the latest configuration from the device. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + backup_file (str): The file location of where the back configuration should be saved. + remove_lines (list): A list of regex lines to remove configurations. + substitute_lines (list): A list of dictionaries with to remove and replace lines. + + Returns: + Result: Nornir Result object with a dict as a result containing the running configuration + { "config: } + """ + logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") + connection = routeros_api.RouterOsApiPool( # inventory, secrets to be integrated + obj.primary_ip4.host, username=task.host.username, password=task.host.password, plaintext_login=True + ) + config_data = {} + api = connection.get_api() + + for api_resource in api_resources: + try: + resource = api.get_resource(api_resource["endpoint"]) + config_data[api_resource["endpoint"]] = resource.get() + except: + logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception.NameError}`") + raise NornirNautobotException( + f"`get_config` method failed with an unexpected issue: `{Exception}`" + ) + + running_config = json.dumps(config_data, indent=4) + if remove_lines: + logger.log_debug("Removing lines from configuration based on `remove_lines` definition") + running_config = clean_config(running_config, remove_lines) + + if substitute_lines: + logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") + running_config = sanitize_config(running_config, substitute_lines) + + make_folder(os.path.dirname(backup_file)) + + with open(backup_file, "w", encoding="utf8") as filehandler: + filehandler.write(running_config) + return Result(host=task.host, result={"config": running_config}) + + @staticmethod + def check_connectivity(task: Task, logger, obj) -> Result: + """Check the connectivity to a network device. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + + Returns: + Result: Nornir Result object. + """ + if is_ip(task.host.hostname): + ip_addr = task.host.hostname + else: + if not is_fqdn_resolvable(task.host.hostname): + logger.log_failure(obj, "There was not an IP or resolvable, preemptively failed.") + raise NornirNautobotException("There was not an IP or resolvable, preemptively failed.") + ip_addr = socket.gethostbyname(task.host.hostname) + + # TODO: Allow port to be configurable, allow ssl as well + port = 8728 + if not tcp_ping(ip_addr, port): + logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") + raise NornirNautobotException(f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") + if not task.host.username: + logger.log_failure(obj, "There was no username defined, preemptively failed.") + raise NornirNautobotException("There was no username defined, preemptively failed.") + if not task.host.password: + logger.log_failure(obj, "There was no password defined, preemptively failed.") + raise NornirNautobotException("There was no password defined, preemptively failed.") + + return Result(host=task.host) + + @staticmethod + def compliance_config( + task: Task, logger, obj, features: str, backup_file: str, intended_file: str, platform: str + ) -> Result: + """Compare two configurations against each other. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + features (dict): A dictionary describing the configurations required. + backup_file (str): The file location of where the back configuration should be saved. + intended_file (str): The file location of where the intended configuration should be saved. + platform (str): The platform slug of the device. + + Returns: + Result: Nornir Result object with a feature_data key of the compliance data. + """ + if not os.path.exists(backup_file): + logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") + raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") + + if not os.path.exists(intended_file): + logger.log_failure( + obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." + ) + raise NornirNautobotException( + f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." + ) + + try: + feature_data = compliance(features, backup_file, intended_file, platform) + except Exception as error: # pylint: disable=broad-except + logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") + raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") + return Result(host=task.host, result={"feature_data": feature_data}) + + @staticmethod + def generate_config( + task: Task, + logger, + obj, + jinja_template: str, + jinja_root_path: str, + output_file_location: str, + jinja_filters: Optional[dict] = None, + ) -> Result: + """A small wrapper around template_file Nornir task. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + jinja_template (str): The file location of the actual Jinja template. + jinja_root_path (str): The file folder where the file will be saved to. + jinja_filters (dict): The filters which will be added to the jinja2 environment. + output_file_location (str): The filename where the file will be saved to. + + Returns: + Result: Nornir Result object. + """ + try: + filled_template = task.run( + **task.host, + task=template_file, + template=jinja_template, + path=jinja_root_path, + jinja_filters=jinja_filters, + )[0].result + except NornirSubTaskError as exc: + if isinstance(exc.result.exception, jinja2.exceptions.UndefinedError): # pylint: disable=no-else-raise + logger.log_failure( + obj, + f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", + ) + raise NornirNautobotException( + f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``" + ) + elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): + logger.log_failure( + obj, + f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", + ) + raise NornirNautobotException( + f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``" + ) + elif isinstance(exc.result.exception, jinja2.TemplateNotFound): + logger.log_failure( + obj, + f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", + ) + raise NornirNautobotException( + f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``" + ) + elif isinstance(exc.result.exception, jinja2.TemplateError): + logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") + raise NornirNautobotException( + f"There was an issue general Jinja error: ``{str(exc.result.exception)}``" + ) + raise + + make_folder(os.path.dirname(output_file_location)) + with open(output_file_location, "w", encoding="utf8") as filehandler: + filehandler.write(filled_template) + return Result(host=task.host, result={"config": filled_template}) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/schema.py b/nornir_nautobot/plugins/tasks/dispatcher/schema.py new file mode 100644 index 0000000..7ab75de --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/schema.py @@ -0,0 +1,70 @@ +"""Schema.""" +# Make this one configurable json schema vs statically coded pydantic objects ? + +api_resources = [ + # rewrite this to be dynamic based on schema definition attached to the SerializedConfiguration.config_schema + { + "endpoint": "/interface", + "keys": ["name", "type", "mtu", "disabled"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "interfaces", + }, + { + "endpoint": "/ip/address", + "keys": ["address", "interface", "disabled", "comment"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "ip_address", + }, + { + "endpoint": "/system/identity", + "keys": ["name"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "hostname", + }, + { + "endpoint": "/system/ntp/client", + "keys": [ + "enabled", "primary-ntp", "secondary-ntp", + "server-dns-names", "mode", "poll-interval", + "active-server" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "ntp", + }, + { + "endpoint": "/ip/dns", + "keys": [ + "servers", "dynamic-servers", "use-doh-server" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "dns", + }, + { + "endpoint": "/snmp/community", + "keys": [ + "id", "name", "addresses", "security", + "read-access", "write-access", "default", + "disabled" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "snmp", + }, + { + "endpoint": "/system/logging/action", + "keys": [ + "id", "name", "target", "remote", + "remote-port", "src-address", "bsd-syslog", + "syslog-time-format", "syslog-facility", + "syslog-severity", "default" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "logging", + }, +] From bb5b19ce336f665c2df3604546036f7aa626c777 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 24 Apr 2023 12:49:03 +0200 Subject: [PATCH 22/65] saved schema import modification --- .../plugins/tasks/dispatcher/mikrotik_routeros_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index df05ed3..aec427b 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -7,7 +7,7 @@ import socket from typing import Optional import jinja2 -from dispatcher.schema import api_resources +from .schema import api_resources from netutils.config.clean import clean_config, sanitize_config from netutils.config.compliance import compliance from netutils.dns import is_fqdn_resolvable From 3926390fef07cb66fe3e9e0d50aeeb81d516e510 Mon Sep 17 00:00:00 2001 From: pvillar_netdev Date: Tue, 25 Apr 2023 13:29:23 +0200 Subject: [PATCH 23/65] Update mikrotik_routeros.py --- nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 4aa6607..c108dbc 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -27,7 +27,7 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): @staticmethod def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: """Get the latest configuration from the device using Netmiko. Overrides default get_config. - + This accounts for Mikrotik Router OS config scrubbing behavior since ROS >= 7.X. Args: @@ -61,7 +61,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su if result[0].failed: return result - major_version = result[0].result.split()[3].split('.')[0] + major_version = result[0].result.split()[3].split(".")[0] command = GET_CONFIG_COMMAND if major_version > "6": From 0b068e6d8b59d25aa445db57bc73bdd5a33b7737 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 25 Apr 2023 14:14:06 +0200 Subject: [PATCH 24/65] modified: /dispatcher/mikrotik_routeros.py --- .../tasks/dispatcher/mikrotik_routeros.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index c108dbc..4c36248 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -25,7 +25,14 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" @staticmethod - def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + def get_config( # pylint: disable=R0913 + task: Task, + logger, + obj, + backup_file: str, + remove_lines: list, + substitute_lines: list + ) -> Result: """Get the latest configuration from the device using Netmiko. Overrides default get_config. This accounts for Mikrotik Router OS config scrubbing behavior since ROS >= 7.X. @@ -49,14 +56,14 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su except NornirSubTaskError as exc: if isinstance(exc.result.exception, NetmikoAuthenticationException): logger.log_failure(obj, f"Failed with an authentication issue: `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an authentication issue: `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an authentication issue: `{exc.result.exception}`") # pylint: disable=W0707 if isinstance(exc.result.exception, NetmikoTimeoutException): logger.log_failure(obj, f"Failed with a timeout issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with a timeout issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with a timeout issue. `{exc.result.exception}`") # pylint: disable=W0707 logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") # pylint: disable=W0707 if result[0].failed: return result @@ -74,7 +81,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su result = task.run(task=netmiko_send_command, command_string=command) except NornirSubTaskError as exc: logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") + raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") # pylint: disable=W0707 if result[0].failed: return result From fd69d52335d6bb9b48a5728a1c13442889e967b2 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 25 Apr 2023 14:22:39 +0200 Subject: [PATCH 25/65] modified: /dispatcher/mikrotik_routeros.py --- .../tasks/dispatcher/mikrotik_routeros.py | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 4c36248..45f605b 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -25,13 +25,8 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" @staticmethod - def get_config( # pylint: disable=R0913 - task: Task, - logger, - obj, - backup_file: str, - remove_lines: list, - substitute_lines: list + def get_config( # pylint: disable=R0913 + task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list ) -> Result: """Get the latest configuration from the device using Netmiko. Overrides default get_config. @@ -56,14 +51,20 @@ def get_config( # pylint: disable=R0913 except NornirSubTaskError as exc: if isinstance(exc.result.exception, NetmikoAuthenticationException): logger.log_failure(obj, f"Failed with an authentication issue: `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an authentication issue: `{exc.result.exception}`") # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 + f"Failed with an authentication issue: `{exc.result.exception}`" + ) if isinstance(exc.result.exception, NetmikoTimeoutException): logger.log_failure(obj, f"Failed with a timeout issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with a timeout issue. `{exc.result.exception}`") # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 + f"Failed with a timeout issue. `{exc.result.exception}`" + ) logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 + f"Failed with an unknown issue. `{exc.result.exception}`" + ) if result[0].failed: return result @@ -81,7 +82,9 @@ def get_config( # pylint: disable=R0913 result = task.run(task=netmiko_send_command, command_string=command) except NornirSubTaskError as exc: logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") - raise NornirNautobotException(f"Failed with an unknown issue. `{exc.result.exception}`") # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 + f"Failed with an unknown issue. `{exc.result.exception}`" + ) if result[0].failed: return result From cdcb474fa67ca2d19483f819d1bad2c47b29083d Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 25 Apr 2023 17:51:02 +0200 Subject: [PATCH 26/65] modified: /dispatcher/mikrotik_routeros_api.py new file: /dispatcher/platform_settings/__init__.py new file: dispatcher/platform_settings/api_schemas.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 58 +++++++++++++-- .../dispatcher/platform_settings/__init__.py | 0 .../platform_settings/api_schemas.py | 70 +++++++++++++++++++ 3 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index aec427b..a5ca4cb 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -7,7 +7,8 @@ import socket from typing import Optional import jinja2 -from .schema import api_resources +from .platform_settings.api_schemas import mikrotik_resources +from deepdiff import DeepDiff from netutils.config.clean import clean_config, sanitize_config from netutils.config.compliance import compliance from netutils.dns import is_fqdn_resolvable @@ -46,16 +47,17 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su config_data = {} api = connection.get_api() - for api_resource in api_resources: + for mikrotik_resource in mikrotik_resources: try: - resource = api.get_resource(api_resource["endpoint"]) - config_data[api_resource["endpoint"]] = resource.get() + resource = api.get_resource(mikrotik_resource["endpoint"]) + config_data[mikrotik_resource["endpoint"]] = resource.get() except: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception.NameError}`") raise NornirNautobotException( f"`get_config` method failed with an unexpected issue: `{Exception}`" ) - + + connection.disconnect() running_config = json.dumps(config_data, indent=4) if remove_lines: logger.log_debug("Removing lines from configuration based on `remove_lines` definition") @@ -134,9 +136,53 @@ def compliance_config( raise NornirNautobotException( f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) + + try: + intended_config = json.loads(intended_file) + except Exception as error: + logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") + raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") + + try: + backup_config = json.loads(backup_file) + except Exception as error: + logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") + raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") + + cleaned_intended = { + mikrotik_resource["endpoint"]: [ + {k: v for k, v in item.items() if k in mikrotik_resource["keys"]} + for item in intended_config.get(mikrotik_resource["endpoint"], []) + ] + for mikrotik_resource in mikrotik_resources + } + + cleaned_backup = { + mikrotik_resource["endpoint"]: [ + {k: v for k, v in item.items() if k in mikrotik_resource["keys"]} + for item in backup_config.get(mikrotik_resource["endpoint"], []) + ] + for mikrotik_resource in mikrotik_resources + } + compliance_rules = [feature["name"] for feature in features] + feature_data = dict.fromkeys(compliance_rules) try: - feature_data = compliance(features, backup_file, intended_file, platform) + for mikrotik_resource in mikrotik_resources: + if mikrotik_resource["compliance_rule_name"] in feature_data.keys(): + feature_intended = cleaned_intended[mikrotik_resource["endpoint"]] + feature_backup = cleaned_backup[mikrotik_resource["endpoint"]] + ddiff = DeepDiff(feature_intended, feature_backup, ignore_order=True) + feature_data[mikrotik_resource["compliance_rule_name"]] = { + 'actual': feature_backup, + 'cannot_parse': True, + 'compliant': True if ddiff == {} else False, + 'extra': ddiff.get("iterable_item_added", {}), + 'intended': feature_intended, + 'missing': ddiff.get("iterable_item_removed", {}), + 'ordered_compliant': True, + 'unordered_compliant': True, + } except Exception as error: # pylint: disable=broad-except logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py new file mode 100644 index 0000000..4e554f2 --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py @@ -0,0 +1,70 @@ +"""Schema.""" +# Make this one configurable json schema vs statically coded pydantic objects ? + +mikrotik_resources = [ + # rewrite this to be dynamic based on schema definition attached to the SerializedConfiguration.config_schema + { + "endpoint": "/interface", + "keys": ["name", "type", "mtu", "disabled"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "interfaces", + }, + { + "endpoint": "/ip/address", + "keys": ["address", "interface", "disabled", "comment"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "ip_address", + }, + { + "endpoint": "/system/identity", + "keys": ["name"], + "unique": "", + "unique_together": (), + "compliance_rule_name": "hostname", + }, + { + "endpoint": "/system/ntp/client", + "keys": [ + "enabled", "primary-ntp", "secondary-ntp", + "server-dns-names", "mode", "poll-interval", + "active-server" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "ntp", + }, + { + "endpoint": "/ip/dns", + "keys": [ + "servers", "dynamic-servers", "use-doh-server" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "dns", + }, + { + "endpoint": "/snmp/community", + "keys": [ + "id", "name", "addresses", "security", + "read-access", "write-access", "default", + "disabled" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "snmp", + }, + { + "endpoint": "/system/logging/action", + "keys": [ + "id", "name", "target", "remote", + "remote-port", "src-address", "bsd-syslog", + "syslog-time-format", "syslog-facility", + "syslog-severity", "default" + ], + "unique": "", + "unique_together": (), + "compliance_rule_name": "logging", + }, +] From 4376f087b4d6410143897647b666c757ac5fd18b Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 25 Apr 2023 17:55:02 +0200 Subject: [PATCH 27/65] modified: /tasks/dispatcher/mikrotik_routeros_api.py modified: /tasks/dispatcher/platform_settings/api_schemas.py deleted: /tasks/dispatcher/schema.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 29 ++++---- .../platform_settings/api_schemas.py | 45 ++++++------ .../plugins/tasks/dispatcher/schema.py | 70 ------------------- 3 files changed, 39 insertions(+), 105 deletions(-) delete mode 100644 nornir_nautobot/plugins/tasks/dispatcher/schema.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index a5ca4cb..687db42 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -21,6 +21,7 @@ from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder + class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" @@ -53,11 +54,9 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su config_data[mikrotik_resource["endpoint"]] = resource.get() except: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception.NameError}`") - raise NornirNautobotException( - f"`get_config` method failed with an unexpected issue: `{Exception}`" - ) + raise NornirNautobotException(f"`get_config` method failed with an unexpected issue: `{Exception}`") - connection.disconnect() + connection.disconnect() running_config = json.dumps(config_data, indent=4) if remove_lines: logger.log_debug("Removing lines from configuration based on `remove_lines` definition") @@ -136,7 +135,7 @@ def compliance_config( raise NornirNautobotException( f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) - + try: intended_config = json.loads(intended_file) except Exception as error: @@ -147,7 +146,7 @@ def compliance_config( backup_config = json.loads(backup_file) except Exception as error: logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") + raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") cleaned_intended = { mikrotik_resource["endpoint"]: [ @@ -174,15 +173,15 @@ def compliance_config( feature_backup = cleaned_backup[mikrotik_resource["endpoint"]] ddiff = DeepDiff(feature_intended, feature_backup, ignore_order=True) feature_data[mikrotik_resource["compliance_rule_name"]] = { - 'actual': feature_backup, - 'cannot_parse': True, - 'compliant': True if ddiff == {} else False, - 'extra': ddiff.get("iterable_item_added", {}), - 'intended': feature_intended, - 'missing': ddiff.get("iterable_item_removed", {}), - 'ordered_compliant': True, - 'unordered_compliant': True, - } + "actual": feature_backup, + "cannot_parse": True, + "compliant": True if ddiff == {} else False, + "extra": ddiff.get("iterable_item_added", {}), + "intended": feature_intended, + "missing": ddiff.get("iterable_item_removed", {}), + "ordered_compliant": True, + "unordered_compliant": True, + } except Exception as error: # pylint: disable=broad-except logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py index 4e554f2..19a549f 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py @@ -27,42 +27,47 @@ { "endpoint": "/system/ntp/client", "keys": [ - "enabled", "primary-ntp", "secondary-ntp", - "server-dns-names", "mode", "poll-interval", - "active-server" - ], + "enabled", + "primary-ntp", + "secondary-ntp", + "server-dns-names", + "mode", + "poll-interval", + "active-server", + ], "unique": "", "unique_together": (), "compliance_rule_name": "ntp", }, - { + { "endpoint": "/ip/dns", - "keys": [ - "servers", "dynamic-servers", "use-doh-server" - ], + "keys": ["servers", "dynamic-servers", "use-doh-server"], "unique": "", "unique_together": (), "compliance_rule_name": "dns", }, - { + { "endpoint": "/snmp/community", - "keys": [ - "id", "name", "addresses", "security", - "read-access", "write-access", "default", - "disabled" - ], + "keys": ["id", "name", "addresses", "security", "read-access", "write-access", "default", "disabled"], "unique": "", "unique_together": (), "compliance_rule_name": "snmp", }, - { + { "endpoint": "/system/logging/action", "keys": [ - "id", "name", "target", "remote", - "remote-port", "src-address", "bsd-syslog", - "syslog-time-format", "syslog-facility", - "syslog-severity", "default" - ], + "id", + "name", + "target", + "remote", + "remote-port", + "src-address", + "bsd-syslog", + "syslog-time-format", + "syslog-facility", + "syslog-severity", + "default", + ], "unique": "", "unique_together": (), "compliance_rule_name": "logging", diff --git a/nornir_nautobot/plugins/tasks/dispatcher/schema.py b/nornir_nautobot/plugins/tasks/dispatcher/schema.py deleted file mode 100644 index 7ab75de..0000000 --- a/nornir_nautobot/plugins/tasks/dispatcher/schema.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Schema.""" -# Make this one configurable json schema vs statically coded pydantic objects ? - -api_resources = [ - # rewrite this to be dynamic based on schema definition attached to the SerializedConfiguration.config_schema - { - "endpoint": "/interface", - "keys": ["name", "type", "mtu", "disabled"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "interfaces", - }, - { - "endpoint": "/ip/address", - "keys": ["address", "interface", "disabled", "comment"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "ip_address", - }, - { - "endpoint": "/system/identity", - "keys": ["name"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "hostname", - }, - { - "endpoint": "/system/ntp/client", - "keys": [ - "enabled", "primary-ntp", "secondary-ntp", - "server-dns-names", "mode", "poll-interval", - "active-server" - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "ntp", - }, - { - "endpoint": "/ip/dns", - "keys": [ - "servers", "dynamic-servers", "use-doh-server" - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "dns", - }, - { - "endpoint": "/snmp/community", - "keys": [ - "id", "name", "addresses", "security", - "read-access", "write-access", "default", - "disabled" - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "snmp", - }, - { - "endpoint": "/system/logging/action", - "keys": [ - "id", "name", "target", "remote", - "remote-port", "src-address", "bsd-syslog", - "syslog-time-format", "syslog-facility", - "syslog-severity", "default" - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "logging", - }, -] From 1095736fb07bab835cad4f30cdfc09f02ff5fae3 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 26 Apr 2023 15:07:25 +0200 Subject: [PATCH 28/65] modified: /dispatcher/mikrotik_routeros_api.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 687db42..dcba1ea 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -1,32 +1,37 @@ -"""default network_importer driver for Juniper.""" +"""default network_importer API-based driver for Mikrotik RouterOS.""" -from .default import NautobotNornirDriver as DefaultNautobotNornirDriver -import routeros_api import os import json -import socket from typing import Optional +import socket import jinja2 -from .platform_settings.api_schemas import mikrotik_resources + +import routeros_api from deepdiff import DeepDiff + from netutils.config.clean import clean_config, sanitize_config from netutils.config.compliance import compliance from netutils.dns import is_fqdn_resolvable from netutils.ip import is_ip from netutils.ping import tcp_ping + from nornir.core.exceptions import NornirSubTaskError from nornir.core.task import Result, Task + from nornir_jinja2.plugins.tasks import template_file from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder +from .default import NautobotNornirDriver as DefaultNautobotNornirDriver +from .platform_settings.api_schemas import mikrotik_resources + class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" @staticmethod - def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: # pylint: disable=R0913 """Get the latest configuration from the device. Args: @@ -53,8 +58,8 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su resource = api.get_resource(mikrotik_resource["endpoint"]) config_data[mikrotik_resource["endpoint"]] = resource.get() except: - logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception.NameError}`") - raise NornirNautobotException(f"`get_config` method failed with an unexpected issue: `{Exception}`") + logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception}`") + raise NornirNautobotException(f"`get_config` method failed with an unexpected issue: `{Exception}`") # pylint: disable=W0707 connection.disconnect() running_config = json.dumps(config_data, indent=4) @@ -89,25 +94,25 @@ def check_connectivity(task: Task, logger, obj) -> Result: else: if not is_fqdn_resolvable(task.host.hostname): logger.log_failure(obj, "There was not an IP or resolvable, preemptively failed.") - raise NornirNautobotException("There was not an IP or resolvable, preemptively failed.") + raise NornirNautobotException("There was not an IP or resolvable, preemptively failed.") # pylint: disable=W0707 ip_addr = socket.gethostbyname(task.host.hostname) # TODO: Allow port to be configurable, allow ssl as well port = 8728 if not tcp_ping(ip_addr, port): logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") - raise NornirNautobotException(f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") + raise NornirNautobotException(f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") # pylint: disable=W0707 if not task.host.username: logger.log_failure(obj, "There was no username defined, preemptively failed.") - raise NornirNautobotException("There was no username defined, preemptively failed.") + raise NornirNautobotException("There was no username defined, preemptively failed.") # pylint: disable=W0707 if not task.host.password: logger.log_failure(obj, "There was no password defined, preemptively failed.") - raise NornirNautobotException("There was no password defined, preemptively failed.") + raise NornirNautobotException("There was no password defined, preemptively failed.") # pylint: disable=W0707 return Result(host=task.host) @staticmethod - def compliance_config( + def compliance_config( # pylint: disable=R0913,R0914 task: Task, logger, obj, features: str, backup_file: str, intended_file: str, platform: str ) -> Result: """Compare two configurations against each other. @@ -126,13 +131,13 @@ def compliance_config( """ if not os.path.exists(backup_file): logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") - raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") + raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") # pylint: disable=W0707 if not os.path.exists(intended_file): logger.log_failure( obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) @@ -140,13 +145,13 @@ def compliance_config( intended_config = json.loads(intended_file) except Exception as error: logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") + raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") # pylint: disable=W0707 try: backup_config = json.loads(backup_file) except Exception as error: logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") + raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") # pylint: disable=W0707 cleaned_intended = { mikrotik_resource["endpoint"]: [ @@ -175,7 +180,7 @@ def compliance_config( feature_data[mikrotik_resource["compliance_rule_name"]] = { "actual": feature_backup, "cannot_parse": True, - "compliant": True if ddiff == {} else False, + "compliant": not bool(ddiff), "extra": ddiff.get("iterable_item_added", {}), "intended": feature_intended, "missing": ddiff.get("iterable_item_removed", {}), @@ -184,11 +189,11 @@ def compliance_config( } except Exception as error: # pylint: disable=broad-except logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") + raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") # pylint: disable=W0707 return Result(host=task.host, result={"feature_data": feature_data}) @staticmethod - def generate_config( + def generate_config( # pylint: disable=R0913 task: Task, logger, obj, @@ -225,7 +230,7 @@ def generate_config( obj, f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): @@ -233,7 +238,7 @@ def generate_config( obj, f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateNotFound): @@ -241,12 +246,12 @@ def generate_config( obj, f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateError): logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"There was an issue general Jinja error: ``{str(exc.result.exception)}``" ) raise From 6765f925f0c3775d1714fba6680f7bf625e5b59c Mon Sep 17 00:00:00 2001 From: pato23arg Date: Wed, 26 Apr 2023 15:11:16 +0200 Subject: [PATCH 29/65] modified: /tasks/dispatcher/mikrotik_routeros_api.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index dcba1ea..44457f1 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -31,7 +31,9 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" @staticmethod - def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: # pylint: disable=R0913 + def get_config( + task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + ) -> Result: # pylint: disable=R0913 """Get the latest configuration from the device. Args: @@ -59,7 +61,9 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su config_data[mikrotik_resource["endpoint"]] = resource.get() except: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception}`") - raise NornirNautobotException(f"`get_config` method failed with an unexpected issue: `{Exception}`") # pylint: disable=W0707 + raise NornirNautobotException( + f"`get_config` method failed with an unexpected issue: `{Exception}`" + ) # pylint: disable=W0707 connection.disconnect() running_config = json.dumps(config_data, indent=4) @@ -94,25 +98,33 @@ def check_connectivity(task: Task, logger, obj) -> Result: else: if not is_fqdn_resolvable(task.host.hostname): logger.log_failure(obj, "There was not an IP or resolvable, preemptively failed.") - raise NornirNautobotException("There was not an IP or resolvable, preemptively failed.") # pylint: disable=W0707 + raise NornirNautobotException( + "There was not an IP or resolvable, preemptively failed." + ) # pylint: disable=W0707 ip_addr = socket.gethostbyname(task.host.hostname) # TODO: Allow port to be configurable, allow ssl as well port = 8728 if not tcp_ping(ip_addr, port): logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") - raise NornirNautobotException(f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") # pylint: disable=W0707 + raise NornirNautobotException( + f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed." + ) # pylint: disable=W0707 if not task.host.username: logger.log_failure(obj, "There was no username defined, preemptively failed.") - raise NornirNautobotException("There was no username defined, preemptively failed.") # pylint: disable=W0707 + raise NornirNautobotException( + "There was no username defined, preemptively failed." + ) # pylint: disable=W0707 if not task.host.password: logger.log_failure(obj, "There was no password defined, preemptively failed.") - raise NornirNautobotException("There was no password defined, preemptively failed.") # pylint: disable=W0707 + raise NornirNautobotException( + "There was no password defined, preemptively failed." + ) # pylint: disable=W0707 return Result(host=task.host) @staticmethod - def compliance_config( # pylint: disable=R0913,R0914 + def compliance_config( # pylint: disable=R0913,R0914 task: Task, logger, obj, features: str, backup_file: str, intended_file: str, platform: str ) -> Result: """Compare two configurations against each other. @@ -131,13 +143,15 @@ def compliance_config( # pylint: disable=R0913,R0914 """ if not os.path.exists(backup_file): logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") - raise NornirNautobotException(f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") # pylint: disable=W0707 + raise NornirNautobotException( + f"Backup file Not Found at location: `{backup_file}`, preemptively failed." + ) # pylint: disable=W0707 if not os.path.exists(intended_file): logger.log_failure( obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) - raise NornirNautobotException( # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." ) @@ -145,13 +159,13 @@ def compliance_config( # pylint: disable=R0913,R0914 intended_config = json.loads(intended_file) except Exception as error: logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") # pylint: disable=W0707 + raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") # pylint: disable=W0707 try: backup_config = json.loads(backup_file) except Exception as error: logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") # pylint: disable=W0707 + raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") # pylint: disable=W0707 cleaned_intended = { mikrotik_resource["endpoint"]: [ @@ -189,11 +203,11 @@ def compliance_config( # pylint: disable=R0913,R0914 } except Exception as error: # pylint: disable=broad-except logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") # pylint: disable=W0707 + raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") # pylint: disable=W0707 return Result(host=task.host, result={"feature_data": feature_data}) @staticmethod - def generate_config( # pylint: disable=R0913 + def generate_config( # pylint: disable=R0913 task: Task, logger, obj, @@ -230,7 +244,7 @@ def generate_config( # pylint: disable=R0913 obj, f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): @@ -238,7 +252,7 @@ def generate_config( # pylint: disable=R0913 obj, f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateNotFound): @@ -246,12 +260,12 @@ def generate_config( # pylint: disable=R0913 obj, f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", ) - raise NornirNautobotException( # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``" ) elif isinstance(exc.result.exception, jinja2.TemplateError): logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") - raise NornirNautobotException( # pylint: disable=W0707 + raise NornirNautobotException( # pylint: disable=W0707 f"There was an issue general Jinja error: ``{str(exc.result.exception)}``" ) raise From 913065ffaa986f967ae7c8a3494172f1001cd40e Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 2 May 2023 19:32:29 +0200 Subject: [PATCH 30/65] modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- .../tasks/dispatcher/mikrotik_routeros.py | 68 +++++++++++++++---- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 45f605b..3ddedc5 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -24,6 +24,57 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" + @staticmethod + def _remove_lines(logger, _running_config: str, remove_lines: list) -> str: + """Removes lines in configuration as specified in Remove Lines list. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + remove_lines (list): A list of regex lines to remove configurations. + + Returns: + Result: Clean running configuration if remove lines set. + """ + if not remove_lines: + return _running_config + logger.log_debug("Removing lines from configuration based on `remove_lines` definition") + return clean_config(_running_config, remove_lines) + + @staticmethod + def _substitute_lines(logger, _running_config: str, substitute_lines: list) -> str: + """Substitutes lines in configuration as specified in substitute Lines list. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + substitute_lines (list): A list of dictionaries with to remove and replace lines. + + Returns: + Result: running configuration with substitutions. + """ + if not substitute_lines: + return _running_config + logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") + return sanitize_config(_running_config, substitute_lines) + + @staticmethod + def _save_file(logger, backup_file: str, _running_config: str) -> None: + """Saves Running Configuration to a specified file. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + backup_file (str): String representing backup file path. + + Returns: + Result: Running Config is saved into backup file path. + """ + make_folder(os.path.dirname(backup_file)) + logger.log_debug(f"Saving Configuration to file: {backup_file}") + with open(backup_file, "w", encoding="utf8") as filehandler: + filehandler.write(_running_config) + @staticmethod def get_config( # pylint: disable=R0913 task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list @@ -89,17 +140,10 @@ def get_config( # pylint: disable=R0913 if result[0].failed: return result - running_config = result[0].result + _running_config = result[0].result - if remove_lines: - logger.log_debug("Removing lines from configuration based on `remove_lines` definition") - running_config = clean_config(running_config, remove_lines) - if substitute_lines: - logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") - running_config = sanitize_config(running_config, substitute_lines) + _running_config = NautobotNornirDriver._remove_lines(logger, _running_config, remove_lines) + _running_config = NautobotNornirDriver._substitute_lines(logger, _running_config, substitute_lines) + NautobotNornirDriver._save_file(logger, backup_file, _running_config) - make_folder(os.path.dirname(backup_file)) - - with open(backup_file, "w", encoding="utf8") as filehandler: - filehandler.write(running_config) - return Result(host=task.host, result={"config": running_config}) + return Result(host=task.host, result={"config": _running_config}) From b0d3471032cefc0479d8c1e5a755ee285b25b9a9 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 5 May 2023 16:57:47 +0200 Subject: [PATCH 31/65] modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 152 ------------------ 1 file changed, 152 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 44457f1..a84ebe2 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -122,155 +122,3 @@ def check_connectivity(task: Task, logger, obj) -> Result: ) # pylint: disable=W0707 return Result(host=task.host) - - @staticmethod - def compliance_config( # pylint: disable=R0913,R0914 - task: Task, logger, obj, features: str, backup_file: str, intended_file: str, platform: str - ) -> Result: - """Compare two configurations against each other. - - Args: - task (Task): Nornir Task. - logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. - obj (Device): A Nautobot Device Django ORM object instance. - features (dict): A dictionary describing the configurations required. - backup_file (str): The file location of where the back configuration should be saved. - intended_file (str): The file location of where the intended configuration should be saved. - platform (str): The platform slug of the device. - - Returns: - Result: Nornir Result object with a feature_data key of the compliance data. - """ - if not os.path.exists(backup_file): - logger.log_failure(obj, f"Backup file Not Found at location: `{backup_file}`, preemptively failed.") - raise NornirNautobotException( - f"Backup file Not Found at location: `{backup_file}`, preemptively failed." - ) # pylint: disable=W0707 - - if not os.path.exists(intended_file): - logger.log_failure( - obj, f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." - ) - raise NornirNautobotException( # pylint: disable=W0707 - f"Intended config file NOT Found at location: `{intended_file}`, preemptively failed." - ) - - try: - intended_config = json.loads(intended_file) - except Exception as error: - logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open intended config File: {str(error)}") # pylint: disable=W0707 - - try: - backup_config = json.loads(backup_file) - except Exception as error: - logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"Failed to open backup config File: {str(error)}") # pylint: disable=W0707 - - cleaned_intended = { - mikrotik_resource["endpoint"]: [ - {k: v for k, v in item.items() if k in mikrotik_resource["keys"]} - for item in intended_config.get(mikrotik_resource["endpoint"], []) - ] - for mikrotik_resource in mikrotik_resources - } - - cleaned_backup = { - mikrotik_resource["endpoint"]: [ - {k: v for k, v in item.items() if k in mikrotik_resource["keys"]} - for item in backup_config.get(mikrotik_resource["endpoint"], []) - ] - for mikrotik_resource in mikrotik_resources - } - - compliance_rules = [feature["name"] for feature in features] - feature_data = dict.fromkeys(compliance_rules) - try: - for mikrotik_resource in mikrotik_resources: - if mikrotik_resource["compliance_rule_name"] in feature_data.keys(): - feature_intended = cleaned_intended[mikrotik_resource["endpoint"]] - feature_backup = cleaned_backup[mikrotik_resource["endpoint"]] - ddiff = DeepDiff(feature_intended, feature_backup, ignore_order=True) - feature_data[mikrotik_resource["compliance_rule_name"]] = { - "actual": feature_backup, - "cannot_parse": True, - "compliant": not bool(ddiff), - "extra": ddiff.get("iterable_item_added", {}), - "intended": feature_intended, - "missing": ddiff.get("iterable_item_removed", {}), - "ordered_compliant": True, - "unordered_compliant": True, - } - except Exception as error: # pylint: disable=broad-except - logger.log_failure(obj, f"UNKNOWN Failure of: {str(error)}") - raise NornirNautobotException(f"UNKNOWN Failure of: {str(error)}") # pylint: disable=W0707 - return Result(host=task.host, result={"feature_data": feature_data}) - - @staticmethod - def generate_config( # pylint: disable=R0913 - task: Task, - logger, - obj, - jinja_template: str, - jinja_root_path: str, - output_file_location: str, - jinja_filters: Optional[dict] = None, - ) -> Result: - """A small wrapper around template_file Nornir task. - - Args: - task (Task): Nornir Task. - logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. - obj (Device): A Nautobot Device Django ORM object instance. - jinja_template (str): The file location of the actual Jinja template. - jinja_root_path (str): The file folder where the file will be saved to. - jinja_filters (dict): The filters which will be added to the jinja2 environment. - output_file_location (str): The filename where the file will be saved to. - - Returns: - Result: Nornir Result object. - """ - try: - filled_template = task.run( - **task.host, - task=template_file, - template=jinja_template, - path=jinja_root_path, - jinja_filters=jinja_filters, - )[0].result - except NornirSubTaskError as exc: - if isinstance(exc.result.exception, jinja2.exceptions.UndefinedError): # pylint: disable=no-else-raise - logger.log_failure( - obj, - f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``", - ) - raise NornirNautobotException( # pylint: disable=W0707 - f"There was a jinja2.exceptions.UndefinedError error: ``{str(exc.result.exception)}``" - ) - elif isinstance(exc.result.exception, jinja2.TemplateSyntaxError): - logger.log_failure( - obj, - f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``", - ) - raise NornirNautobotException( # pylint: disable=W0707 - f"There was a jinja2.TemplateSyntaxError error: ``{str(exc.result.exception)}``" - ) - elif isinstance(exc.result.exception, jinja2.TemplateNotFound): - logger.log_failure( - obj, - f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``", - ) - raise NornirNautobotException( # pylint: disable=W0707 - f"There was an issue finding the template and a jinja2.TemplateNotFound error was raised: ``{str(exc.result.exception)}``" - ) - elif isinstance(exc.result.exception, jinja2.TemplateError): - logger.log_failure(obj, f"There was an issue general Jinja error: ``{str(exc.result.exception)}``") - raise NornirNautobotException( # pylint: disable=W0707 - f"There was an issue general Jinja error: ``{str(exc.result.exception)}``" - ) - raise - - make_folder(os.path.dirname(output_file_location)) - with open(output_file_location, "w", encoding="utf8") as filehandler: - filehandler.write(filled_template) - return Result(host=task.host, result={"config": filled_template}) From ae35943809c6e3687ac10b4a01ede221f649be1d Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 5 May 2023 18:11:41 +0200 Subject: [PATCH 32/65] lint: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../tasks/dispatcher/mikrotik_routeros_api.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index a84ebe2..abe28f2 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -2,24 +2,17 @@ import os import json -from typing import Optional import socket -import jinja2 import routeros_api -from deepdiff import DeepDiff from netutils.config.clean import clean_config, sanitize_config -from netutils.config.compliance import compliance from netutils.dns import is_fqdn_resolvable from netutils.ip import is_ip from netutils.ping import tcp_ping -from nornir.core.exceptions import NornirSubTaskError from nornir.core.task import Result, Task -from nornir_jinja2.plugins.tasks import template_file - from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder @@ -59,10 +52,10 @@ def get_config( try: resource = api.get_resource(mikrotik_resource["endpoint"]) config_data[mikrotik_resource["endpoint"]] = resource.get() - except: - logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{Exception}`") + except Exception as error: + logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{error}`") raise NornirNautobotException( - f"`get_config` method failed with an unexpected issue: `{Exception}`" + f"`get_config` method failed with an unexpected issue: `{error}`" ) # pylint: disable=W0707 connection.disconnect() From 8fa01de267904d9744d1614559948cce2941756c Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 5 May 2023 18:21:25 +0200 Subject: [PATCH 33/65] pylint: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../plugins/tasks/dispatcher/mikrotik_routeros_api.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index abe28f2..5fb6cc3 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -4,7 +4,7 @@ import json import socket -import routeros_api +import routeros_api # pylint: disable=E0401 from netutils.config.clean import clean_config, sanitize_config from netutils.dns import is_fqdn_resolvable @@ -24,9 +24,9 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" @staticmethod - def get_config( + def get_config( # pylint: disable=R0913 task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list - ) -> Result: # pylint: disable=R0913 + ) -> Result: """Get the latest configuration from the device. Args: From 9371844eeaa94ad26a85ecdeb02f462f8c18d1bb Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 5 May 2023 18:24:17 +0200 Subject: [PATCH 34/65] black: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../plugins/tasks/dispatcher/mikrotik_routeros_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 5fb6cc3..efca96b 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -4,7 +4,7 @@ import json import socket -import routeros_api # pylint: disable=E0401 +import routeros_api # pylint: disable=E0401 from netutils.config.clean import clean_config, sanitize_config from netutils.dns import is_fqdn_resolvable @@ -24,7 +24,7 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" @staticmethod - def get_config( # pylint: disable=R0913 + def get_config( # pylint: disable=R0913 task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list ) -> Result: """Get the latest configuration from the device. From e82b23b179a30b941836d42fe656bf6939b73b34 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 5 May 2023 18:29:21 +0200 Subject: [PATCH 35/65] pylint: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../plugins/tasks/dispatcher/mikrotik_routeros_api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index efca96b..b754907 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -54,9 +54,9 @@ def get_config( # pylint: disable=R0913 config_data[mikrotik_resource["endpoint"]] = resource.get() except Exception as error: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{error}`") - raise NornirNautobotException( + raise NornirNautobotException( # pylint: disable=W0707 f"`get_config` method failed with an unexpected issue: `{error}`" - ) # pylint: disable=W0707 + ) connection.disconnect() running_config = json.dumps(config_data, indent=4) From 1cd8e15832f9b4ccfea84ff8bd711fc2699776b5 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 12:14:50 +0200 Subject: [PATCH 36/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py deleted: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py deleted: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py --- .../plugins/tasks/dispatcher/default.py | 11 +++ .../tasks/dispatcher/mikrotik_routeros_api.py | 8 +- .../dispatcher/platform_settings/__init__.py | 0 .../platform_settings/api_schemas.py | 75 ------------------- 4 files changed, 15 insertions(+), 79 deletions(-) delete mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py delete mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index b36213f..105661f 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -26,6 +26,16 @@ from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder +ROUTEROS_API_ENDPOINTS = [ + "/system/identity", + "/interface", + "/ip/address", + "/system/ntp/client", + "/ip/dns", + "/snmp/community", + "/system/logging/action" +] + RUN_COMMAND_MAPPING = { "default": "show run", "cisco_nxos": "show run", @@ -34,6 +44,7 @@ "juniper_junos": "show configuration | display set", "arista_eos": "show run", "ruckus_fastiron": "show running-config", + "mikrotik_routeros_api": ROUTEROS_API_ENDPOINTS, } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index b754907..2fbe732 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -17,7 +17,7 @@ from nornir_nautobot.utils.helpers import make_folder from .default import NautobotNornirDriver as DefaultNautobotNornirDriver -from .platform_settings.api_schemas import mikrotik_resources +from .default import RUN_COMMAND_MAPPING class NautobotNornirDriver(DefaultNautobotNornirDriver): @@ -48,10 +48,10 @@ def get_config( # pylint: disable=R0913 config_data = {} api = connection.get_api() - for mikrotik_resource in mikrotik_resources: + for endpoint in RUN_COMMAND_MAPPING["mikrotik_routeros_api"]: try: - resource = api.get_resource(mikrotik_resource["endpoint"]) - config_data[mikrotik_resource["endpoint"]] = resource.get() + resource = api.get_resource(endpoint) + config_data[endpoint] = resource.get() except Exception as error: logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{error}`") raise NornirNautobotException( # pylint: disable=W0707 diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py deleted file mode 100644 index 19a549f..0000000 --- a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/api_schemas.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Schema.""" -# Make this one configurable json schema vs statically coded pydantic objects ? - -mikrotik_resources = [ - # rewrite this to be dynamic based on schema definition attached to the SerializedConfiguration.config_schema - { - "endpoint": "/interface", - "keys": ["name", "type", "mtu", "disabled"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "interfaces", - }, - { - "endpoint": "/ip/address", - "keys": ["address", "interface", "disabled", "comment"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "ip_address", - }, - { - "endpoint": "/system/identity", - "keys": ["name"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "hostname", - }, - { - "endpoint": "/system/ntp/client", - "keys": [ - "enabled", - "primary-ntp", - "secondary-ntp", - "server-dns-names", - "mode", - "poll-interval", - "active-server", - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "ntp", - }, - { - "endpoint": "/ip/dns", - "keys": ["servers", "dynamic-servers", "use-doh-server"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "dns", - }, - { - "endpoint": "/snmp/community", - "keys": ["id", "name", "addresses", "security", "read-access", "write-access", "default", "disabled"], - "unique": "", - "unique_together": (), - "compliance_rule_name": "snmp", - }, - { - "endpoint": "/system/logging/action", - "keys": [ - "id", - "name", - "target", - "remote", - "remote-port", - "src-address", - "bsd-syslog", - "syslog-time-format", - "syslog-facility", - "syslog-severity", - "default", - ], - "unique": "", - "unique_together": (), - "compliance_rule_name": "logging", - }, -] From 0401f6f6e98b3888a15c851a5697698802f6b101 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 12:16:28 +0200 Subject: [PATCH 37/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 105661f..3737cde 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -33,7 +33,7 @@ "/system/ntp/client", "/ip/dns", "/snmp/community", - "/system/logging/action" + "/system/logging/action", ] RUN_COMMAND_MAPPING = { From 6931c477baf4e209e953f81753237d805ffac8ba Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 12:17:54 +0200 Subject: [PATCH 38/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 3737cde..dea12a9 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -34,7 +34,7 @@ "/ip/dns", "/snmp/community", "/system/logging/action", -] +] RUN_COMMAND_MAPPING = { "default": "show run", From 6267e22a74e46fc475cdd87117495a5e4e714eb7 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 12:59:09 +0200 Subject: [PATCH 39/65] modified: pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index f808936..382abcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" +routeros-api = "^0.17.0" [tool.poetry.dev-dependencies] pytest = "*" From 9ec2a198487cc4756825bee927f45f671bc893ec Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 13:06:19 +0200 Subject: [PATCH 40/65] Revert " modified: pyproject.toml" This reverts commit 6267e22a74e46fc475cdd87117495a5e4e714eb7. --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 382abcb..f808936 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,6 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" -routeros-api = "^0.17.0" [tool.poetry.dev-dependencies] pytest = "*" From ac205202067c3db25cdcaacf31db83e7cc0b2696 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 13:17:56 +0200 Subject: [PATCH 41/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- .../plugins/tasks/dispatcher/default.py | 51 +++++++++++++++++++ .../tasks/dispatcher/mikrotik_routeros.py | 51 ------------------- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 1010873..34acde3 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -229,6 +229,57 @@ def generate_config( filehandler.write(filled_template) return Result(host=task.host, result={"config": filled_template}) + @staticmethod + def _remove_lines(logger, _running_config: str, remove_lines: list) -> str: + """Removes lines in configuration as specified in Remove Lines list. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + remove_lines (list): A list of regex lines to remove configurations. + + Returns: + Result: Clean running configuration if remove lines set. + """ + if not remove_lines: + return _running_config + logger.log_debug("Removing lines from configuration based on `remove_lines` definition") + return clean_config(_running_config, remove_lines) + + @staticmethod + def _substitute_lines(logger, _running_config: str, substitute_lines: list) -> str: + """Substitutes lines in configuration as specified in substitute Lines list. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + substitute_lines (list): A list of dictionaries with to remove and replace lines. + + Returns: + Result: running configuration with substitutions. + """ + if not substitute_lines: + return _running_config + logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") + return sanitize_config(_running_config, substitute_lines) + + @staticmethod + def _save_file(logger, backup_file: str, _running_config: str) -> None: + """Saves Running Configuration to a specified file. + + Args: + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + _running_config (str): a device running configuration. + backup_file (str): String representing backup file path. + + Returns: + Result: Running Config is saved into backup file path. + """ + make_folder(os.path.dirname(backup_file)) + logger.log_debug(f"Saving Configuration to file: {backup_file}") + with open(backup_file, "w", encoding="utf8") as filehandler: + filehandler.write(_running_config) + class NetmikoNautobotNornirDriver(NautobotNornirDriver): """Default collection of Nornir Tasks based on Netmiko.""" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 3ddedc5..1b27a6d 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -24,57 +24,6 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" - @staticmethod - def _remove_lines(logger, _running_config: str, remove_lines: list) -> str: - """Removes lines in configuration as specified in Remove Lines list. - - Args: - logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. - _running_config (str): a device running configuration. - remove_lines (list): A list of regex lines to remove configurations. - - Returns: - Result: Clean running configuration if remove lines set. - """ - if not remove_lines: - return _running_config - logger.log_debug("Removing lines from configuration based on `remove_lines` definition") - return clean_config(_running_config, remove_lines) - - @staticmethod - def _substitute_lines(logger, _running_config: str, substitute_lines: list) -> str: - """Substitutes lines in configuration as specified in substitute Lines list. - - Args: - logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. - _running_config (str): a device running configuration. - substitute_lines (list): A list of dictionaries with to remove and replace lines. - - Returns: - Result: running configuration with substitutions. - """ - if not substitute_lines: - return _running_config - logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") - return sanitize_config(_running_config, substitute_lines) - - @staticmethod - def _save_file(logger, backup_file: str, _running_config: str) -> None: - """Saves Running Configuration to a specified file. - - Args: - logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. - _running_config (str): a device running configuration. - backup_file (str): String representing backup file path. - - Returns: - Result: Running Config is saved into backup file path. - """ - make_folder(os.path.dirname(backup_file)) - logger.log_debug(f"Saving Configuration to file: {backup_file}") - with open(backup_file, "w", encoding="utf8") as filehandler: - filehandler.write(_running_config) - @staticmethod def get_config( # pylint: disable=R0913 task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list From 7f8f45c1441987e9eb7e2d72fc2d3746468e005b Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 9 May 2023 13:21:39 +0200 Subject: [PATCH 42/65] flake8: import cleanup --- nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 1b27a6d..2f375b8 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -1,19 +1,15 @@ """network_importer driver for Mikrotik Router OS.""" -import os - try: from netmiko.ssh_exception import NetmikoAuthenticationException, NetmikoTimeoutException except ImportError: from netmiko import NetmikoAuthenticationException, NetmikoTimeoutException -from netutils.config.clean import clean_config, sanitize_config from nornir.core.exceptions import NornirSubTaskError from nornir.core.task import Result, Task from nornir_netmiko.tasks import netmiko_send_command from nornir_nautobot.exceptions import NornirNautobotException -from nornir_nautobot.utils.helpers import make_folder from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver GET_VERSION_COMMAND = "system resource print" From baa03270674af92c0973d10dd492f61158af87da Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 12 May 2023 14:28:21 +0200 Subject: [PATCH 43/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py new file: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py new file: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py --- .../plugins/tasks/dispatcher/default.py | 28 ++++--------------- .../tasks/dispatcher/mikrotik_routeros_api.py | 3 +- .../dispatcher/platform_settings/__init__.py | 0 .../platform_settings/configuration.py | 23 +++++++++++++++ 4 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index dea12a9..44b2806 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -25,32 +25,14 @@ from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder - -ROUTEROS_API_ENDPOINTS = [ - "/system/identity", - "/interface", - "/ip/address", - "/system/ntp/client", - "/ip/dns", - "/snmp/community", - "/system/logging/action", -] - -RUN_COMMAND_MAPPING = { - "default": "show run", - "cisco_nxos": "show run", - "cisco_ios": "show run", - "cisco_xr": "show run", - "juniper_junos": "show configuration | display set", - "arista_eos": "show run", - "ruckus_fastiron": "show running-config", - "mikrotik_routeros_api": ROUTEROS_API_ENDPOINTS, -} +from .platform_settings.configuration import COMMAND_MAPPINGS class NautobotNornirDriver: """Default collection of Nornir Tasks based on Napalm.""" + RUN_COMMAND_MAPPING = COMMAND_MAPPINGS + @staticmethod def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: """Get the latest configuration from the device. @@ -259,7 +241,9 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su { "config: } """ logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") - command = RUN_COMMAND_MAPPING.get(task.host.platform, RUN_COMMAND_MAPPING["default"]) + command = NautobotNornirDriver.RUN_COMMAND_MAPPING.get( + task.host.platform, NautobotNornirDriver.RUN_COMMAND_MAPPING["default"] + ) try: result = task.run(task=netmiko_send_command, command_string=command) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 2fbe732..1f9c5df 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -17,7 +17,6 @@ from nornir_nautobot.utils.helpers import make_folder from .default import NautobotNornirDriver as DefaultNautobotNornirDriver -from .default import RUN_COMMAND_MAPPING class NautobotNornirDriver(DefaultNautobotNornirDriver): @@ -48,7 +47,7 @@ def get_config( # pylint: disable=R0913 config_data = {} api = connection.get_api() - for endpoint in RUN_COMMAND_MAPPING["mikrotik_routeros_api"]: + for endpoint in NautobotNornirDriver.RUN_COMMAND_MAPPING["mikrotik_routeros_api"]: try: resource = api.get_resource(endpoint) config_data[endpoint] = resource.get() diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py new file mode 100644 index 0000000..95b45e5 --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py @@ -0,0 +1,23 @@ +"""Used to define default platform settings.""" + +ROUTEROS_API_ENDPOINTS = [ + "/system/identity", + "/interface", + "/ip/address", + "/system/ntp/client", + "/ip/dns", + "/snmp/community", + "/system/logging/action", +] + +COMMAND_MAPPINGS = { + "default": "show run", + "cisco_nxos": "show run", + "cisco_ios": "show run", + "cisco_xr": "show run", + "juniper_junos": "show configuration | display set", + "arista_eos": "show run", + "mikrotik_routeros": "export terse", + "ruckus_fastiron": "show running-config", + "mikrotik_routeros_api": ROUTEROS_API_ENDPOINTS, +} From 8f8999ccdf7eff420780a74cc4eac0a8c04735a2 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 15 May 2023 11:49:32 +0200 Subject: [PATCH 44/65] modified: nornir_nautobot/plugins/tasks/dispatcher/arista_eos.py modified: nornir_nautobot/plugins/tasks/dispatcher/cisco_asa.py modified: nornir_nautobot/plugins/tasks/dispatcher/cisco_ios.py modified: nornir_nautobot/plugins/tasks/dispatcher/cisco_ios_xr.py modified: nornir_nautobot/plugins/tasks/dispatcher/cisco_nxos.py modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/juniper_junos.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py deleted: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py deleted: nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py modified: nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py modified: pyproject.toml --- .../plugins/tasks/dispatcher/arista_eos.py | 2 ++ .../plugins/tasks/dispatcher/cisco_asa.py | 2 ++ .../plugins/tasks/dispatcher/cisco_ios.py | 2 ++ .../plugins/tasks/dispatcher/cisco_ios_xr.py | 2 ++ .../plugins/tasks/dispatcher/cisco_nxos.py | 2 ++ .../plugins/tasks/dispatcher/default.py | 9 ++++---- .../plugins/tasks/dispatcher/juniper_junos.py | 2 ++ .../tasks/dispatcher/mikrotik_routeros_api.py | 12 +++++++++- .../dispatcher/platform_settings/__init__.py | 0 .../platform_settings/configuration.py | 23 ------------------- .../tasks/dispatcher/ruckus_fastiron.py | 2 ++ pyproject.toml | 1 + 12 files changed, 30 insertions(+), 29 deletions(-) delete mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py delete mode 100644 nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/arista_eos.py b/nornir_nautobot/plugins/tasks/dispatcher/arista_eos.py index 626dd36..bcb32e6 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/arista_eos.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/arista_eos.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Collection of Nornir Tasks specific to Arista EOS devices.""" + + config_command = "show run" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/cisco_asa.py b/nornir_nautobot/plugins/tasks/dispatcher/cisco_asa.py index 7ce2398..11e7958 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/cisco_asa.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/cisco_asa.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Cisco ASA.""" + + config_command = "show run" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios.py b/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios.py index 552524c..86e8d01 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Cisco IOS.""" + + config_command = "show run" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios_xr.py b/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios_xr.py index 9f3574d..da021d1 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios_xr.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/cisco_ios_xr.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Cisco IOS-XR.""" + + config_command = "show run" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/cisco_nxos.py b/nornir_nautobot/plugins/tasks/dispatcher/cisco_nxos.py index 035f51b..e8d58a1 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/cisco_nxos.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/cisco_nxos.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Cisco NXOS.""" + + config_command = "show run" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 44b2806..83f161b 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -25,13 +25,12 @@ from nornir_nautobot.exceptions import NornirNautobotException from nornir_nautobot.utils.helpers import make_folder -from .platform_settings.configuration import COMMAND_MAPPINGS class NautobotNornirDriver: """Default collection of Nornir Tasks based on Napalm.""" - RUN_COMMAND_MAPPING = COMMAND_MAPPINGS + config_command = "show run" @staticmethod def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: @@ -225,6 +224,8 @@ def generate_config( class NetmikoNautobotNornirDriver(NautobotNornirDriver): """Default collection of Nornir Tasks based on Netmiko.""" + config_command = "show run" + @staticmethod def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: """Get the latest configuration from the device using Netmiko. @@ -241,9 +242,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su { "config: } """ logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") - command = NautobotNornirDriver.RUN_COMMAND_MAPPING.get( - task.host.platform, NautobotNornirDriver.RUN_COMMAND_MAPPING["default"] - ) + command = NetmikoNautobotNornirDriver.config_command try: result = task.run(task=netmiko_send_command, command_string=command) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/juniper_junos.py b/nornir_nautobot/plugins/tasks/dispatcher/juniper_junos.py index 7d02e35..c36c845 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/juniper_junos.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/juniper_junos.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Collection of Nornir Tasks specific to Juniper Junos devices.""" + + config_command = "show configuration | display set" diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 1f9c5df..8ab5e45 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -22,6 +22,16 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Default collection of Nornir Tasks based on Napalm.""" + config_command = [ + "/system/identity", + "/interface", + "/ip/address", + "/system/ntp/client", + "/ip/dns", + "/snmp/community", + "/system/logging/action", + ] + @staticmethod def get_config( # pylint: disable=R0913 task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list @@ -47,7 +57,7 @@ def get_config( # pylint: disable=R0913 config_data = {} api = connection.get_api() - for endpoint in NautobotNornirDriver.RUN_COMMAND_MAPPING["mikrotik_routeros_api"]: + for endpoint in NautobotNornirDriver.config_command: try: resource = api.get_resource(endpoint) config_data[endpoint] = resource.get() diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py b/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py deleted file mode 100644 index 95b45e5..0000000 --- a/nornir_nautobot/plugins/tasks/dispatcher/platform_settings/configuration.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Used to define default platform settings.""" - -ROUTEROS_API_ENDPOINTS = [ - "/system/identity", - "/interface", - "/ip/address", - "/system/ntp/client", - "/ip/dns", - "/snmp/community", - "/system/logging/action", -] - -COMMAND_MAPPINGS = { - "default": "show run", - "cisco_nxos": "show run", - "cisco_ios": "show run", - "cisco_xr": "show run", - "juniper_junos": "show configuration | display set", - "arista_eos": "show run", - "mikrotik_routeros": "export terse", - "ruckus_fastiron": "show running-config", - "mikrotik_routeros_api": ROUTEROS_API_ENDPOINTS, -} diff --git a/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py index 8e60f9d..a341c41 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_fastiron.py @@ -5,3 +5,5 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Ruckus ICX/FastIron Switches.""" + + config_command = "show running-config" diff --git a/pyproject.toml b/pyproject.toml index f808936..382abcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,6 +30,7 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" +routeros-api = "^0.17.0" [tool.poetry.dev-dependencies] pytest = "*" From f64f2693f1b8d23cdff30a4a5e29f8fcb418cea3 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 15 May 2023 11:56:33 +0200 Subject: [PATCH 45/65] modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 1 - nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 34acde3..8affe36 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -34,7 +34,6 @@ "juniper_junos": "show configuration | display set", "arista_eos": "show run", "ruckus_fastiron": "show running-config", - "mikrotik_routeros": "export terse", } diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 2f375b8..ce46508 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -19,6 +19,8 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" + + config_command = "export terse" @staticmethod def get_config( # pylint: disable=R0913 @@ -67,7 +69,7 @@ def get_config( # pylint: disable=R0913 major_version = result[0].result.split()[3].split(".")[0] - command = GET_CONFIG_COMMAND + command = NautobotNornirDriver.config_command if major_version > "6": command += " show-sensitive" From 98cd9977912caf9b427c0d27ce416d61541c4bd9 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 15 May 2023 11:57:22 +0200 Subject: [PATCH 46/65] modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index ce46508..09fc93c 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -19,7 +19,7 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" - + config_command = "export terse" @staticmethod From 3196f1805cd44518e928c4f9863c1c912946e227 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 15 May 2023 12:06:20 +0200 Subject: [PATCH 47/65] modified: poetry.lock (routeros-api dep) --- poetry.lock | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/poetry.lock b/poetry.lock index 4a3ac8e..c28f97c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1044,6 +1044,17 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "routeros-api" +version = "0.17.0" +description = "Python API to RouterBoard devices produced by MikroTik." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + [[package]] name = "ruamel.yaml" version = "0.17.21" From eb5c86cb704171cc711b00cab23875082e4a15e2 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Mon, 15 May 2023 12:14:43 +0200 Subject: [PATCH 48/65] modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index 09fc93c..c209ea2 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -13,7 +13,6 @@ from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver GET_VERSION_COMMAND = "system resource print" -GET_CONFIG_COMMAND = "export terse" NETMIKO_DEVICE_TYPE = "mikrotik_routeros" From d2f55ca86c3c0b882acad73d550934d24bbd6991 Mon Sep 17 00:00:00 2001 From: pvillar_netdev Date: Mon, 15 May 2023 12:43:40 +0200 Subject: [PATCH 49/65] Update poetry.lock --- poetry.lock | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index c28f97c..18aa4f9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1050,7 +1050,11 @@ version = "0.17.0" description = "Python API to RouterBoard devices produced by MikroTik." category = "main" optional = false -python-versions = "*" +python-versions = ">=3" +files = [ + {file = "RouterOS-api-0.17.0.tar.gz", hash = "sha256:1b9898460ecc4667b54e477d495b74c2f24ae0aac4c90dd0e62f23ec7eae8252"}, + {file = "RouterOS_api-0.17.0-py2.py3-none-any.whl", hash = "sha256:bf38da94a570875eaa87ff537558f765a4697dbce1a9753070194b687f441bf0"}, +] [package.dependencies] six = "*" From a67450f3f8f2061ac2d6fe1efbc5e102974b089f Mon Sep 17 00:00:00 2001 From: Joe Wesch Date: Tue, 16 May 2023 09:07:37 -0500 Subject: [PATCH 50/65] Changes revert_in to seconds and allows for None --- nornir_nautobot/plugins/tasks/dispatcher/default.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index bbeee13..5f9c319 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -312,13 +312,17 @@ def provision_config( { "config: } """ logger.log_success(obj, "Config provision starting") + # Sending None to napalm_configure for revert_in will disable it, so we don't want a default value. + revert_in = os.getenv("NORNIR_NAUTOBOT_REVERT_IN_SECONDS") + if revert_in is not None: + revert_in = int(revert_in) try: push_result = task.run( task=napalm_configure, configuration=config, replace=True, - revert_in=int(os.getenv("NORNIR_NAUTOBOT_REVERT_IN_MINUTES")), + revert_in=revert_in, ) except NornirSubTaskError as exc: logger.log_failure(obj, f"Failed with an unknown issue. `{exc.result.exception}`") From 2ce9b632be58b2d254910ab8a47c254f8da7486d Mon Sep 17 00:00:00 2001 From: Joe Wesch Date: Tue, 16 May 2023 09:08:03 -0500 Subject: [PATCH 51/65] Setting the minimum of nornir-napalm to 0.4.0 --- poetry.lock | 1407 +++++++++++++++++++++++++++++++++++++----------- pyproject.toml | 2 +- 2 files changed, 1093 insertions(+), 316 deletions(-) diff --git a/poetry.lock b/poetry.lock index 4a3ac8e..3b9264f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "astroid" version = "2.11.7" @@ -5,29 +7,18 @@ description = "An abstract syntax tree for Python with inference support." category = "dev" optional = false python-versions = ">=3.6.2" +files = [ + {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, + {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, +] [package.dependencies] lazy-object-proxy = ">=1.4.0" +setuptools = ">=20.0" typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} wrapt = ">=1.11,<2" -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -cov = ["attrs", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs"] -docs = ["furo", "sphinx", "myst-parser", "zope.interface", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["attrs", "zope.interface"] -tests-no-zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] -tests_no_zope = ["hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist", "cloudpickle", "mypy (>=0.971,<0.990)", "pytest-mypy-plugins"] - [[package]] name = "bandit" version = "1.7.5" @@ -35,6 +26,10 @@ description = "Security oriented static analyser for python code." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, + {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, +] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} @@ -44,9 +39,9 @@ rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "beautifulsoup4 (>=4.8.0)", "pylint (==1.9.4)", "tomli (>=1.1.0)"] +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"] +yaml = ["PyYAML"] [[package]] name = "bcrypt" @@ -55,6 +50,29 @@ description = "Modern password hashing for your software and your servers" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] [package.extras] tests = ["pytest (>=3.2.1,!=3.3.0)"] @@ -62,11 +80,38 @@ typecheck = ["mypy"] [[package]] name = "black" -version = "23.1.0" +version = "23.3.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-23.3.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9"}, + {file = "black-23.3.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2"}, + {file = "black-23.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c"}, + {file = "black-23.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b"}, + {file = "black-23.3.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d"}, + {file = "black-23.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70"}, + {file = "black-23.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326"}, + {file = "black-23.3.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b"}, + {file = "black-23.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2"}, + {file = "black-23.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331"}, + {file = "black-23.3.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5"}, + {file = "black-23.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961"}, + {file = "black-23.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3"}, + {file = "black-23.3.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266"}, + {file = "black-23.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab"}, + {file = "black-23.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb"}, + {file = "black-23.3.0-py3-none-any.whl", hash = "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4"}, + {file = "black-23.3.0.tar.gz", hash = "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940"}, +] [package.dependencies] click = ">=8.0.0" @@ -91,14 +136,22 @@ description = "A decorator for caching properties in classes." category = "dev" optional = false python-versions = "*" +files = [ + {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, + {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, +] [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] [[package]] name = "cffi" @@ -107,6 +160,72 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" @@ -118,6 +237,83 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] [[package]] name = "click" @@ -126,6 +322,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -138,25 +338,50 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "cryptography" -version = "39.0.2" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "ruff", "mypy", "types-pytz", "types-requests", "check-manifest"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "check-manifest", "mypy", "ruff"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-shard (>=0.1.2)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-shard (>=0.1.2)", "pytest-subtests", "pytest-xdist"] test-randomorder = ["pytest-randomly"] tox = ["tox"] @@ -167,6 +392,10 @@ description = "serialize all of python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] [package.extras] graph = ["objgraph (>=1.7.2)"] @@ -178,23 +407,30 @@ description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] [package.extras] test = ["pytest (>=6)"] [[package]] name = "flake8" -version = "3.9.2" -description = "the modular source code checker: pep8 pyflakes and co" +version = "2.3.0" +description = "the modular source code checker: pep8, pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = "*" +files = [ + {file = "flake8-2.3.0-py2.py3-none-any.whl", hash = "sha256:c99cc9716d6655d9c8bcb1e77632b8615bf0abd282d7abd9f5c2148cad7fc669"}, + {file = "flake8-2.3.0.tar.gz", hash = "sha256:5ee1a43ccd0716d6061521eec6937c983efa027793013e572712c4da55c7c83e"}, +] [package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" +mccabe = ">=0.2.1" +pep8 = ">=1.5.7" +pyflakes = ">=0.8.1" [[package]] name = "future" @@ -203,6 +439,9 @@ description = "Clean single-source support for Python 3 and 2" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] [[package]] name = "ghp-import" @@ -211,12 +450,16 @@ description = "Copy your docs directly to the gh-pages branch." category = "dev" optional = false python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] [package.dependencies] python-dateutil = ">=2.8.1" [package.extras] -dev = ["twine", "markdown", "flake8", "wheel"] +dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "gitdb" @@ -225,6 +468,10 @@ description = "Git Object Database" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] [package.dependencies] smmap = ">=3.0.1,<6" @@ -236,6 +483,10 @@ description = "GitPython is a Python library used to interact with Git repositor category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.31-py3-none-any.whl", hash = "sha256:f04893614f6aa713a60cbbe1e6a97403ef633103cdd0ef5eb6efe0deb98dbe8d"}, + {file = "GitPython-3.1.31.tar.gz", hash = "sha256:8ce3bcf69adfdf7c7d503e78fd3b1c492af782d58893b650adb2ac8912ddd573"}, +] [package.dependencies] gitdb = ">=4.0.1,<5" @@ -243,19 +494,20 @@ typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.8\"" [[package]] name = "griffe" -version = "0.25.5" +version = "0.27.5" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "griffe-0.27.5-py3-none-any.whl", hash = "sha256:15b48fc3cebfc1c1a1a2f6e8177f6644a4a54517322e08e224fdf671454b34d7"}, + {file = "griffe-0.27.5.tar.gz", hash = "sha256:96fbc7a264bdb32b4da227bed6a16f2509e028a12d7471dbb48c2785bb01817f"}, +] [package.dependencies] cached-property = {version = "*", markers = "python_version < \"3.8\""} colorama = ">=0.4" -[package.extras] -async = ["aiofiles (>=0.7,<1.0)"] - [[package]] name = "idna" version = "3.4" @@ -263,6 +515,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "importlib-metadata" @@ -271,15 +527,19 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, + {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" @@ -288,14 +548,22 @@ description = "brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "invoke" -version = "2.0.0" +version = "2.1.2" description = "Pythonic task execution" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "invoke-2.1.2-py3-none-any.whl", hash = "sha256:bfc904df1c9e9fe1a881933de661fe054b8db616ff2c4cf78e00407fe473ba5d"}, + {file = "invoke-2.1.2.tar.gz", hash = "sha256:a6cc1f06f75bacd0b1e11488fa3bf3e62f85e31f62e2c0172188613ba5b070e2"}, +] [[package]] name = "isort" @@ -304,12 +572,16 @@ description = "A Python utility / library to sort Python imports." category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, + {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, +] [package.extras] -pipfile-deprecated-finder = ["pipreqs", "requirementslib", "pip-shims (>=0.5.2)"] -requirements-deprecated-finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] [[package]] name = "jinja2" @@ -318,6 +590,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -332,6 +608,10 @@ description = "Junos 'EZ' automation for non-programmers" category = "main" optional = false python-versions = ">=3.5, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "junos-eznc-2.6.7.tar.gz", hash = "sha256:b3ab81dafb160cd16cba8f26b92b6f5c3333a8d30566a7ebd966fc1f313b0980"}, + {file = "junos_eznc-2.6.7-py2.py3-none-any.whl", hash = "sha256:6ee9d74228ebaca01381eb88dbe21765006d76935960fd4e6cd8d67248b11644"}, +] [package.dependencies] jinja2 = ">=2.7.1" @@ -354,6 +634,44 @@ description = "A fast and thorough lazy object proxy." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] [[package]] name = "lxml" @@ -362,11 +680,90 @@ description = "Powerful and Pythonic XML processing library combining libxml2/li category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] +htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=0.29.7)"] [[package]] @@ -376,6 +773,10 @@ description = "Python implementation of Markdown." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, + {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, +] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} @@ -390,6 +791,10 @@ description = "Python port of markdown-it. Markdown parsing, done right!" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "markdown-it-py-2.2.0.tar.gz", hash = "sha256:7c9a5e412688bc771c67432cbfebcdd686c93ce6484913dccf06cb5a0bea35a1"}, + {file = "markdown_it_py-2.2.0-py3-none-any.whl", hash = "sha256:5a35f8d1870171d9acc47b99612dc146129b631baf04970128b568f190d0cc30"}, +] [package.dependencies] mdurl = ">=0.1,<1.0" @@ -397,12 +802,12 @@ typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code_style = ["pre-commit (>=3.0,<4.0)"] +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 = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] @@ -412,14 +817,70 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win32.whl", hash = "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603"}, + {file = "MarkupSafe-2.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win32.whl", hash = "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625"}, + {file = "MarkupSafe-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win32.whl", hash = "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859"}, + {file = "MarkupSafe-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win32.whl", hash = "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2"}, + {file = "MarkupSafe-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win32.whl", hash = "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7"}, + {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, + {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, +] [[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" @@ -428,6 +889,10 @@ description = "Markdown URL utilities" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] [[package]] name = "mergedeep" @@ -436,6 +901,10 @@ description = "A deep merge function for 🐍." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] [[package]] name = "mkdocs" @@ -444,6 +913,10 @@ description = "Project documentation with Markdown." category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mkdocs-1.3.1-py3-none-any.whl", hash = "sha256:fda92466393127d2da830bc6edc3a625a14b436316d1caf347690648e774c4f0"}, + {file = "mkdocs-1.3.1.tar.gz", hash = "sha256:a41a2ff25ce3bbacc953f9844ba07d106233cd76c88bac1f59cb1564ac0d87ed"}, +] [package.dependencies] click = ">=3.3" @@ -467,6 +940,10 @@ description = "Automatically link across pages in MkDocs." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, + {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, +] [package.dependencies] Markdown = ">=3.3" @@ -479,6 +956,10 @@ description = "Documentation that simply works" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs-material-8.3.9.tar.gz", hash = "sha256:dc82b667d2a83f0de581b46a6d0949732ab77e7638b87ea35b770b33bc02e75a"}, + {file = "mkdocs_material-8.3.9-py2.py3-none-any.whl", hash = "sha256:263f2721f3abe533b61f7c8bed435a0462620912742c919821ac2d698b4bfe67"}, +] [package.dependencies] jinja2 = ">=3.0.2" @@ -495,6 +976,10 @@ description = "Extension pack for Python Markdown and MkDocs Material." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocs_material_extensions-1.1.1-py3-none-any.whl", hash = "sha256:e41d9f38e4798b6617ad98ca8f7f1157b1e4385ac1459ca1e4ea219b556df945"}, + {file = "mkdocs_material_extensions-1.1.1.tar.gz", hash = "sha256:9c003da71e2cc2493d910237448c672e00cefc800d3d6ae93d2fc69979e3bd93"}, +] [[package]] name = "mkdocs-version-annotations" @@ -503,6 +988,10 @@ description = "MkDocs plugin to add custom admonitions for documenting version d category = "dev" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "mkdocs-version-annotations-1.0.0.tar.gz", hash = "sha256:6786024b37d27b330fda240b76ebec8e7ce48bd5a9d7a66e99804559d088dffa"}, + {file = "mkdocs_version_annotations-1.0.0-py3-none-any.whl", hash = "sha256:385004eb4a7530dd87a227e08cd907ce7a8fe21fdf297720a4149c511bcf05f5"}, +] [[package]] name = "mkdocstrings" @@ -511,6 +1000,10 @@ description = "Automatic documentation from sources, for MkDocs." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-0.19.0-py3-none-any.whl", hash = "sha256:3217d510d385c961f69385a670b2677e68e07b5fea4a504d86bf54c006c87c7d"}, + {file = "mkdocstrings-0.19.0.tar.gz", hash = "sha256:efa34a67bad11229d532d89f6836a8a215937548623b64f3698a1df62e01cc3e"}, +] [package.dependencies] Jinja2 = ">=2.11.1" @@ -532,6 +1025,10 @@ description = "A Python handler for mkdocstrings." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "mkdocstrings-python-0.7.1.tar.gz", hash = "sha256:c334b382dca202dfa37071c182418a6df5818356a95d54362a2b24822ca3af71"}, + {file = "mkdocstrings_python-0.7.1-py3-none-any.whl", hash = "sha256:a22060bfa374697678e9af4e62b020d990dad2711c98f7a9fac5c0345bef93c7"}, +] [package.dependencies] griffe = ">=0.11.1" @@ -544,6 +1041,9 @@ description = "Experimental type system extensions for programs checked with the category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, +] [[package]] name = "napalm" @@ -552,6 +1052,10 @@ description = "Network Automation and Programmability Abstraction Layer with Mul category = "main" optional = false python-versions = "*" +files = [ + {file = "napalm-4.0.0-py2.py3-none-any.whl", hash = "sha256:e4289f6966974b485c1f3de3e8f4a11ac2ed2825e975bbd5afc006331b1e4c36"}, + {file = "napalm-4.0.0.tar.gz", hash = "sha256:40e1bd297ac4102c14c0d427c51d61c3a12d5d5bec163750733941ad82a464ee"}, +] [package.dependencies] cffi = ">=1.11.3" @@ -568,6 +1072,7 @@ pyeapi = ">=0.8.2" pyYAML = "*" requests = ">=2.7.0" scp = "*" +setuptools = ">=38.4.0" textfsm = "<=1.1.2" ttp = "*" ttp-templates = "*" @@ -580,10 +1085,14 @@ description = "Python library for NETCONF clients" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "ncclient-0.6.13.tar.gz", hash = "sha256:f9f8cea8bcbe057e1b948b9cd1b241eafb8a3f73c4981fbdfa1cc6ed69c0a7b3"}, +] [package.dependencies] lxml = ">=3.3.0" paramiko = ">=1.15.0" +setuptools = ">0.6" six = "*" [[package]] @@ -593,6 +1102,10 @@ description = "A network address manipulation library for Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, + {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, +] [[package]] name = "netmiko" @@ -601,6 +1114,10 @@ description = "Multi-vendor library to simplify legacy CLI connections to networ category = "main" optional = false python-versions = "*" +files = [ + {file = "netmiko-4.1.2-py3-none-any.whl", hash = "sha256:ee1e88ecbd07f619b0bc1e90648f82a64a0adee5968c3068621bbdadbfec5c03"}, + {file = "netmiko-4.1.2.tar.gz", hash = "sha256:f5ede2a28670d3dfd3470061468665f80f9b4906ed20e6b0fb4d9e1c9be67afc"}, +] [package.dependencies] ntc-templates = ">=2.0.0" @@ -608,6 +1125,7 @@ paramiko = ">=2.7.2" pyserial = "*" pyyaml = ">=5.3" scp = ">=0.13.3" +setuptools = ">=38.4.0" tenacity = "*" textfsm = "1.1.2" @@ -618,6 +1136,10 @@ description = "Common helper functions useful in network automation." category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "netutils-1.4.1-py3-none-any.whl", hash = "sha256:41002e42b205149fbe6739b7fdbc778ed843e87fabba9691d3d06a35f7876fd4"}, + {file = "netutils-1.4.1.tar.gz", hash = "sha256:4f7501478d810bcd3c64edfe064fa8962a1572636f4fceee2538fc9d3616fbe2"}, +] [package.extras] optionals = ["napalm (>=4.0.0,<5.0.0)"] @@ -629,6 +1151,10 @@ description = "Pluggable multi-threaded framework with inventory management to h category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "nornir-3.3.0-py3-none-any.whl", hash = "sha256:4590d96edb5044e6a9e6f84e15625d32932177a10654040f99e145d73b352479"}, + {file = "nornir-3.3.0.tar.gz", hash = "sha256:1c6fd283bcdff9972358b126703c0990e9076dff1dfdc211e3077d45ada937d5"}, +] [package.dependencies] importlib-metadata = {version = ">=4,<5", markers = "python_version < \"3.10\""} @@ -637,7 +1163,7 @@ mypy_extensions = ">=0.4.1,<0.5.0" typing_extensions = ">=4.1,<5.0" [package.extras] -docs = ["sphinx (>=4,<5)", "sphinx_rtd_theme (>=1.0,<2.0)", "sphinxcontrib-napoleon (>=0.7,<0.8)", "jupyter (>=1,<2)", "nbsphinx (>=0.8,<0.9)", "pygments (>=2,<3)", "sphinx-issues (>=3.0,<4.0)"] +docs = ["jupyter (>=1,<2)", "nbsphinx (>=0.8,<0.9)", "pygments (>=2,<3)", "sphinx (>=4,<5)", "sphinx-issues (>=3.0,<4.0)", "sphinx_rtd_theme (>=1.0,<2.0)", "sphinxcontrib-napoleon (>=0.7,<0.8)"] [[package]] name = "nornir-jinja2" @@ -646,6 +1172,10 @@ description = "Jinja2 plugins for nornir" category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "nornir_jinja2-0.2.0-py3-none-any.whl", hash = "sha256:0c446bec7a8492923d4eb9ca00fb327603b41bc35d5f0112843c048737b506b1"}, + {file = "nornir_jinja2-0.2.0.tar.gz", hash = "sha256:9ee5e725fe5543dcba4ec8b976804e9e88ecd356ea3b62bad97578cea0de1f75"}, +] [package.dependencies] jinja2 = ">=2.11.2,<4" @@ -653,11 +1183,15 @@ nornir = ">=3,<4" [[package]] name = "nornir-napalm" -version = "0.3.0" +version = "0.4.0" description = "NAPALM's plugins for nornir" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "nornir_napalm-0.4.0-py3-none-any.whl", hash = "sha256:20a41499aecf9c4e41181b18a73b2ee3ab7763824645ac0eb80abb3973a5f17e"}, + {file = "nornir_napalm-0.4.0.tar.gz", hash = "sha256:84e0711ccbdf24bdb228042ab530bf688d6b2b8f12c65fa3cb73499c6974a9de"}, +] [package.dependencies] napalm = ">=4,<5" @@ -670,6 +1204,10 @@ description = "Netmiko's plugins for Nornir" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "nornir_netmiko-0.2.0-py3-none-any.whl", hash = "sha256:6960e7ae0b0566a46750634ec7ab3b3a081e09afb554f593bc547bb9383d41b1"}, + {file = "nornir_netmiko-0.2.0.tar.gz", hash = "sha256:78c93b11ef21a8dd55689b82e47149061ab653cc7fe641e43886c847d171f486"}, +] [package.dependencies] netmiko = ">=4.0.0,<5.0.0" @@ -682,6 +1220,10 @@ description = "Collection of plugins and functions for nornir that don't require category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" +files = [ + {file = "nornir_utils-0.2.0-py3-none-any.whl", hash = "sha256:b4c430793a74f03affd5ff2d90abc8c67a28c7ff325f48e3a01a9a44ec71b844"}, + {file = "nornir_utils-0.2.0.tar.gz", hash = "sha256:4de6aaa35e5c1a98e1c84db84a008b0b1e974dc65d88484f2dcea3e30c95fbc2"}, +] [package.dependencies] colorama = ">=0.4.3,<0.5.0" @@ -694,17 +1236,25 @@ description = "TextFSM Templates for Network Devices, and Python wrapper for Tex category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "ntc_templates-3.3.0-py3-none-any.whl", hash = "sha256:b0941824212ae50668cf9b882e848512d09487128a491909eab9afc30f808a85"}, + {file = "ntc_templates-3.3.0.tar.gz", hash = "sha256:a74014431715c2029a2d0f065bca447312d55171cea191db1189689ea076b82d"}, +] [package.dependencies] textfsm = ">=1.1.0,<2.0.0" [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "paramiko" @@ -713,6 +1263,10 @@ description = "SSH2 protocol library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "paramiko-3.1.0-py3-none-any.whl", hash = "sha256:f0caa660e797d9cd10db6fc6ae81e2c9b2767af75c3180fcd0e46158cd368d7f"}, + {file = "paramiko-3.1.0.tar.gz", hash = "sha256:6950faca6819acd3219d4ae694a23c7a87ee38d084f70c1724b0c0dbb8b75769"}, +] [package.dependencies] bcrypt = ">=3.2" @@ -720,8 +1274,8 @@ cryptography = ">=3.3" pynacl = ">=1.5" [package.extras] -all = ["pyasn1 (>=0.1.7)", "invoke (>=2.0)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] +all = ["gssapi (>=1.4.1)", "invoke (>=2.0)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] invoke = ["invoke (>=2.0)"] [[package]] @@ -731,6 +1285,10 @@ description = "Utility library for gitignore style pattern matching of file path category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] [[package]] name = "pbr" @@ -739,21 +1297,41 @@ description = "Python Build Reasonableness" category = "dev" optional = false python-versions = ">=2.6" +files = [ + {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, + {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, +] + +[[package]] +name = "pep8" +version = "1.7.1" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "pep8-1.7.1-py2.py3-none-any.whl", hash = "sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee"}, + {file = "pep8-1.7.1.tar.gz", hash = "sha256:fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374"}, +] [[package]] name = "platformdirs" -version = "3.1.1" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, +] [package.dependencies] -typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} +typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)", "sphinx (>=6.1.3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest (>=7.2.1)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -762,6 +1340,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -770,14 +1352,6 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pycodestyle" -version = "2.7.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - [[package]] name = "pycparser" version = "2.21" @@ -785,14 +1359,56 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pydantic" -version = "1.10.6" +version = "1.10.7" description = "Data validation and settings management using python type hints" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e79e999e539872e903767c417c897e729e015872040e56b96e67968c3b918b2d"}, + {file = "pydantic-1.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:01aea3a42c13f2602b7ecbbea484a98169fb568ebd9e247593ea05f01b884b2e"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:516f1ed9bc2406a0467dd777afc636c7091d71f214d5e413d64fef45174cfc7a"}, + {file = "pydantic-1.10.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae150a63564929c675d7f2303008d88426a0add46efd76c3fc797cd71cb1b46f"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ecbbc51391248116c0a055899e6c3e7ffbb11fb5e2a4cd6f2d0b93272118a209"}, + {file = "pydantic-1.10.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f4a2b50e2b03d5776e7f21af73e2070e1b5c0d0df255a827e7c632962f8315af"}, + {file = "pydantic-1.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:a7cd2251439988b413cb0a985c4ed82b6c6aac382dbaff53ae03c4b23a70e80a"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:68792151e174a4aa9e9fc1b4e653e65a354a2fa0fed169f7b3d09902ad2cb6f1"}, + {file = "pydantic-1.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe2507b8ef209da71b6fb5f4e597b50c5a34b78d7e857c4f8f3115effaef5fe"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a86d8c8db68086f1e30a530f7d5f83eb0685e632e411dbbcf2d5c0150e8dcd"}, + {file = "pydantic-1.10.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75ae19d2a3dbb146b6f324031c24f8a3f52ff5d6a9f22f0683694b3afcb16fb"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:464855a7ff7f2cc2cf537ecc421291b9132aa9c79aef44e917ad711b4a93163b"}, + {file = "pydantic-1.10.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:193924c563fae6ddcb71d3f06fa153866423ac1b793a47936656e806b64e24ca"}, + {file = "pydantic-1.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:b4a849d10f211389502059c33332e91327bc154acc1845f375a99eca3afa802d"}, + {file = "pydantic-1.10.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cc1dde4e50a5fc1336ee0581c1612215bc64ed6d28d2c7c6f25d2fe3e7c3e918"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cfe895a504c060e5d36b287ee696e2fdad02d89e0d895f83037245218a87fe"}, + {file = "pydantic-1.10.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:670bb4683ad1e48b0ecb06f0cfe2178dcf74ff27921cdf1606e527d2617a81ee"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:950ce33857841f9a337ce07ddf46bc84e1c4946d2a3bba18f8280297157a3fd1"}, + {file = "pydantic-1.10.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c15582f9055fbc1bfe50266a19771bbbef33dd28c45e78afbe1996fd70966c2a"}, + {file = "pydantic-1.10.7-cp37-cp37m-win_amd64.whl", hash = "sha256:82dffb306dd20bd5268fd6379bc4bfe75242a9c2b79fec58e1041fbbdb1f7914"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c7f51861d73e8b9ddcb9916ae7ac39fb52761d9ea0df41128e81e2ba42886cd"}, + {file = "pydantic-1.10.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6434b49c0b03a51021ade5c4daa7d70c98f7a79e95b551201fff682fc1661245"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d34ab766fa056df49013bb6e79921a0265204c071984e75a09cbceacbbdd5d"}, + {file = "pydantic-1.10.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:701daea9ffe9d26f97b52f1d157e0d4121644f0fcf80b443248434958fd03dc3"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf135c46099ff3f919d2150a948ce94b9ce545598ef2c6c7bf55dca98a304b52"}, + {file = "pydantic-1.10.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0f85904f73161817b80781cc150f8b906d521fa11e3cdabae19a581c3606209"}, + {file = "pydantic-1.10.7-cp38-cp38-win_amd64.whl", hash = "sha256:9f6f0fd68d73257ad6685419478c5aece46432f4bdd8d32c7345f1986496171e"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c230c0d8a322276d6e7b88c3f7ce885f9ed16e0910354510e0bae84d54991143"}, + {file = "pydantic-1.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:976cae77ba6a49d80f461fd8bba183ff7ba79f44aa5cfa82f1346b5626542f8e"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d45fc99d64af9aaf7e308054a0067fdcd87ffe974f2442312372dfa66e1001d"}, + {file = "pydantic-1.10.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2a5ebb48958754d386195fe9e9c5106f11275867051bf017a8059410e9abf1f"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:abfb7d4a7cd5cc4e1d1887c43503a7c5dd608eadf8bc615413fc498d3e4645cd"}, + {file = "pydantic-1.10.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80b1fab4deb08a8292d15e43a6edccdffa5377a36a4597bb545b93e79c5ff0a5"}, + {file = "pydantic-1.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:d71e69699498b020ea198468e2480a2f1e7433e32a3a99760058c6520e2bea7e"}, + {file = "pydantic-1.10.7-py3-none-any.whl", hash = "sha256:0cd181f1d0b1d00e2b705f1bf1ac7799a2d938cce3376b8007df62b29be3c2c6"}, + {file = "pydantic-1.10.7.tar.gz", hash = "sha256:cfc83c0678b6ba51b0532bea66860617c4cd4251ecf76e9846fa5a9f3454e97e"}, +] [package.dependencies] python-dotenv = {version = ">=0.10.4", optional = true, markers = "extra == \"dotenv\""} @@ -809,6 +1425,10 @@ description = "Python docstring style checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019"}, + {file = "pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1"}, +] [package.dependencies] importlib-metadata = {version = ">=2.0.0,<5.0.0", markers = "python_version < \"3.8\""} @@ -824,6 +1444,9 @@ description = "Python Client for eAPI" category = "main" optional = false python-versions = "*" +files = [ + {file = "pyeapi-0.8.4.tar.gz", hash = "sha256:c33ad1eadd8ebac75f63488df9412081ce0b024c9e1da12a37196a5c60427c54"}, +] [package.dependencies] netaddr = "*" @@ -834,19 +1457,27 @@ test = ["coverage", "mock"] [[package]] name = "pyflakes" -version = "2.3.1" +version = "3.0.1" 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.6" +files = [ + {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, + {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, +] [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] [package.extras] plugins = ["importlib-metadata"] @@ -858,6 +1489,10 @@ description = "python code static checker" category = "dev" optional = false python-versions = ">=3.6.2" +files = [ + {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, + {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, +] [package.dependencies] astroid = ">=2.11.5,<=2.12.0-dev0" @@ -874,11 +1509,15 @@ testutil = ["gitpython (>3)"] [[package]] name = "pymdown-extensions" -version = "9.10" +version = "10.0.1" description = "Extension pack for Python Markdown." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pymdown_extensions-10.0.1-py3-none-any.whl", hash = "sha256:ae66d84013c5d027ce055693e09a4628b67e9dec5bce05727e45b0918e36f274"}, + {file = "pymdown_extensions-10.0.1.tar.gz", hash = "sha256:b44e1093a43b8a975eae17b03c3a77aad4681b3b56fce60ce746dbef1944c8cb"}, +] [package.dependencies] markdown = ">=3.2" @@ -891,13 +1530,25 @@ description = "Python binding to the Networking and Cryptography (NaCl) library" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] [package.dependencies] cffi = ">=1.4.1" [package.extras] docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pynautobot" @@ -906,6 +1557,10 @@ description = "Nautobot API client library" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "pynautobot-1.4.0-py3-none-any.whl", hash = "sha256:6bc053b095728ed0af40d097a7513c3e16c51ec63aad46f691f50b3f6c82bdfe"}, + {file = "pynautobot-1.4.0.tar.gz", hash = "sha256:87c93976248f99f2adc0e22d7a39e7f0aac3460451607078bfee93742742c9d4"}, +] [package.dependencies] requests = ">=2.20.0,<3.0.0" @@ -917,9 +1572,13 @@ description = "pyparsing module - Classes and methods to define and execute pars category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyserial" @@ -928,20 +1587,27 @@ description = "Python Serial Port Extension" category = "main" optional = false python-versions = "*" +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] [package.extras] cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -951,7 +1617,7 @@ pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "python-dateutil" @@ -960,6 +1626,10 @@ description = "Extensions to the standard Python datetime module" category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" @@ -971,6 +1641,10 @@ description = "Read key-value pairs from a .env file and set them as environment category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, +] [package.extras] cli = ["click (>=5.0)"] @@ -982,6 +1656,48 @@ description = "YAML parser and emitter for Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] [[package]] name = "pyyaml-env-tag" @@ -990,27 +1706,35 @@ description = "A custom YAML tag for referencing environment variables in YAML f category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] [package.dependencies] pyyaml = "*" [[package]] name = "requests" -version = "2.28.2" +version = "2.30.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, +] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-mock" @@ -1019,6 +1743,10 @@ description = "Mock out responses from the requests package" category = "dev" optional = false python-versions = "*" +files = [ + {file = "requests-mock-1.10.0.tar.gz", hash = "sha256:59c9c32419a9fb1ae83ec242d98e889c45bd7d7a65d48375cc243ec08441658b"}, + {file = "requests_mock-1.10.0-py2.py3-none-any.whl", hash = "sha256:2fdbb637ad17ee15c06f33d31169e71bf9fe2bdb7bc9da26185be0dd8d842699"}, +] [package.dependencies] requests = ">=2.3,<3" @@ -1026,15 +1754,19 @@ six = "*" [package.extras] fixture = ["fixtures"] -test = ["fixtures", "mock", "purl", "pytest", "sphinx", "testrepository (>=0.0.18)", "testtools", "requests-futures"] +test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testrepository (>=0.0.18)", "testtools"] [[package]] name = "rich" -version = "13.3.2" +version = "13.3.5" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "dev" optional = false python-versions = ">=3.7.0" +files = [ + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, +] [package.dependencies] markdown-it-py = ">=2.2.0,<3.0.0" @@ -1045,27 +1777,69 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9 jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] -name = "ruamel.yaml" -version = "0.17.21" +name = "ruamel-yaml" +version = "0.17.26" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "main" optional = false python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.26-py3-none-any.whl", hash = "sha256:25d0ee82a0a9a6f44683dcf8c282340def4074a4562f3a24f55695bb254c1693"}, + {file = "ruamel.yaml-0.17.26.tar.gz", hash = "sha256:baa2d0a5aad2034826c439ce61c142c07082b76f4791d54145e131206e998059"}, +] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.6", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} [package.extras] docs = ["ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] -name = "ruamel.yaml.clib" +name = "ruamel-yaml-clib" version = "0.2.7" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, + {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, +] [[package]] name = "scp" @@ -1074,10 +1848,31 @@ description = "scp module for paramiko" category = "main" optional = false python-versions = "*" +files = [ + {file = "scp-0.14.5-py2.py3-none-any.whl", hash = "sha256:d224535dd8ed00294f52b0e0e18fde7a6fb7a3d06b97ede9e3f750fa7bf75c09"}, + {file = "scp-0.14.5.tar.gz", hash = "sha256:64f0015899b3d212cb8088e7d40ebaf0686889ff0e243d5c1242efe8b50f053e"}, +] [package.dependencies] paramiko = "*" +[[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "six" version = "1.16.0" @@ -1085,6 +1880,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "smmap" @@ -1093,6 +1892,10 @@ description = "A pure Python implementation of a sliding window memory map manag category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] [[package]] name = "snowballstemmer" @@ -1101,6 +1904,10 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "dev" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "stevedore" @@ -1109,6 +1916,10 @@ description = "Manage dynamic plugins for Python applications" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "stevedore-3.5.2-py3-none-any.whl", hash = "sha256:fa2630e3d0ad3e22d4914aff2501445815b9a4467a6edc49387c667a38faf5bf"}, + {file = "stevedore-3.5.2.tar.gz", hash = "sha256:cf99f41fc0d5a4f185ca4d3d42b03be9011b0a1ec1a4ea1a282be1b4b306dcc2"}, +] [package.dependencies] importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} @@ -1121,6 +1932,10 @@ description = "Retry code until it succeeds" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, + {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, +] [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] @@ -1132,6 +1947,10 @@ description = "Python module for parsing semi-structured text into python tables category = "main" optional = false python-versions = "*" +files = [ + {file = "textfsm-1.1.2-py2.py3-none-any.whl", hash = "sha256:f3d4e9bd4344935a08e6844e53d6220e2e4fb7e465bee51fa909152ed6bab406"}, + {file = "textfsm-1.1.2.tar.gz", hash = "sha256:85a450b441aff04b1cac726bdb36f35534a5b196cca08c8bc14fddd879c4255c"}, +] [package.dependencies] future = "*" @@ -1144,6 +1963,10 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomli" @@ -1152,6 +1975,10 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "transitions" @@ -1160,6 +1987,10 @@ description = "A lightweight, object-oriented Python state machine implementatio category = "main" optional = false python-versions = "*" +files = [ + {file = "transitions-0.9.0-py2.py3-none-any.whl", hash = "sha256:5687ee8c6a3200830e44f988d16b0045f53293f7a873002d7bff70852331a078"}, + {file = "transitions-0.9.0.tar.gz", hash = "sha256:2f54d11bdb225779d7e729011e93a9fb717668ce3dc65f8d4f5a5d7ba2f48e10"}, +] [package.dependencies] six = "*" @@ -1170,23 +2001,31 @@ test = ["pytest"] [[package]] name = "ttp" -version = "0.9.2" +version = "0.9.4" description = "Template Text Parser" category = "main" optional = false python-versions = ">=2.7,<4.0" +files = [ + {file = "ttp-0.9.4-py2.py3-none-any.whl", hash = "sha256:550e26fd742703f9fd0fac09e3701766190d4551978fccdead294d49cdec2423"}, + {file = "ttp-0.9.4.tar.gz", hash = "sha256:44aaef0561f83d588563918157a502fc9f928e5bc3867026c2cc7b5a8c0dc3e1"}, +] [package.extras] -full = ["cerberus (>=1.3.0,<1.4.0)", "jinja2 (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "deepdiff (>=5.8.0,<5.9.0)", "openpyxl (>=3.0.0,<3.1.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)", "n2g (>=0.2.0,<0.3.0)"] -docs = ["readthedocs-sphinx-search (==0.1.1)", "Sphinx (==4.3.0)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] +docs = ["Sphinx (==4.3.0)", "readthedocs-sphinx-search (==0.1.1)", "sphinx_rtd_theme (==1.0.0)", "sphinxcontrib-applehelp (==1.0.1)", "sphinxcontrib-devhelp (==1.0.1)", "sphinxcontrib-htmlhelp (==2.0.0)", "sphinxcontrib-jsmath (==1.0.1)", "sphinxcontrib-napoleon (==0.7)", "sphinxcontrib-qthelp (==1.0.2)", "sphinxcontrib-serializinghtml (==1.1.5)", "sphinxcontrib-spelling (==7.2.1)"] +full = ["cerberus (>=1.3.0,<1.4.0)", "deepdiff (>=5.8.0,<5.9.0)", "jinja2 (>=3.0.0,<3.1.0)", "n2g (>=0.2.0,<0.3.0)", "openpyxl (>=3.0.0,<3.1.0)", "pyyaml (==6.0)", "tabulate (>=0.8.0,<0.9.0)", "ttp_templates (<1.0.0)", "yangson (>=1.4.0,<1.5.0)"] [[package]] name = "ttp-templates" -version = "0.3.2" +version = "0.3.5" description = "Template Text Parser Templates collections" category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "ttp_templates-0.3.5-py3-none-any.whl", hash = "sha256:4985a68640468127a0e31021672039cd88a8b9c3dd9289cad67839209cddaf30"}, + {file = "ttp_templates-0.3.5.tar.gz", hash = "sha256:e59870d4f65bd4aaf89178dc9065a7db8b80a23d5d79b5d6ffd041312d5ec5a6"}, +] [package.dependencies] ttp = ">=0.6.0" @@ -1201,6 +2040,32 @@ description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] [[package]] name = "typing-extensions" @@ -1209,19 +2074,28 @@ description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, + {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"}, +] [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "watchdog" @@ -1230,6 +2104,35 @@ description = "Filesystem events monitoring" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] [package.extras] watchmedo = ["PyYAML (>=3.10)"] @@ -1241,19 +2144,103 @@ description = "Module for decorators, wrappers and monkey patching." category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] [[package]] name = "yamllint" -version = "1.30.0" +version = "1.31.0" description = "A linter for YAML files." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "yamllint-1.31.0-py3-none-any.whl", hash = "sha256:15f4bdb645e6a4a0a22fe5415bc38b4a934c51419b30104896d2f3f95e329185"}, + {file = "yamllint-1.31.0.tar.gz", hash = "sha256:2d83f1d12f733e162a87e06b176149d7bb9c5bae4a9e5fce1c771d7f703f7a65"}, +] [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" +[package.extras] +dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] + [[package]] name = "yamlordereddictloader" version = "0.4.0" @@ -1261,6 +2248,9 @@ description = "YAML loader and dump for PyYAML allowing to keep keys order." category = "main" optional = false python-versions = "*" +files = [ + {file = "yamlordereddictloader-0.4.0.tar.gz", hash = "sha256:7f30f0b99ea3f877f7cb340c570921fa9d639b7f69cba18be051e27f8de2080e"}, +] [package.dependencies] pyyaml = "*" @@ -1272,229 +2262,16 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.7" -content-hash = "ec13a46f05e3087e3e65fc00310e62c03d16eedd246a2811cf1ea1cb2e8afd48" - -[metadata.files] -astroid = [] -attrs = [] -bandit = [] -bcrypt = [] -black = [] -cached-property = [ - {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, - {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, -] -certifi = [] -cffi = [] -charset-normalizer = [] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [] -cryptography = [] -dill = [] -exceptiongroup = [] -flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, -] -future = [] -ghp-import = [] -gitdb = [] -gitpython = [] -griffe = [] -idna = [] -importlib-metadata = [] -iniconfig = [] -invoke = [] -isort = [] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -junos-eznc = [] -lazy-object-proxy = [] -lxml = [] -markdown = [] -markdown-it-py = [] -markupsafe = [] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -mdurl = [] -mergedeep = [ - {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, - {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, -] -mkdocs = [] -mkdocs-autorefs = [] -mkdocs-material = [] -mkdocs-material-extensions = [] -mkdocs-version-annotations = [] -mkdocstrings = [] -mkdocstrings-python = [] -mypy-extensions = [] -napalm = [] -ncclient = [] -netaddr = [ - {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, - {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, -] -netmiko = [] -netutils = [] -nornir = [] -nornir-jinja2 = [] -nornir-napalm = [] -nornir-netmiko = [] -nornir-utils = [] -ntc-templates = [] -packaging = [] -paramiko = [] -pathspec = [] -pbr = [] -platformdirs = [] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pydantic = [] -pydocstyle = [] -pyeapi = [ - {file = "pyeapi-0.8.4.tar.gz", hash = "sha256:c33ad1eadd8ebac75f63488df9412081ce0b024c9e1da12a37196a5c60427c54"}, -] -pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, -] -pygments = [] -pylint = [] -pymdown-extensions = [] -pynacl = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] -pynautobot = [] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyserial = [ - {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, - {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, -] -pytest = [] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -python-dotenv = [] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -pyyaml-env-tag = [ - {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, - {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, -] -requests = [] -requests-mock = [] -rich = [] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.21-py3-none-any.whl", hash = "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7"}, - {file = "ruamel.yaml-0.17.21.tar.gz", hash = "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af"}, -] -"ruamel.yaml.clib" = [] -scp = [] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -stevedore = [] -tenacity = [] -textfsm = [ - {file = "textfsm-1.1.2-py2.py3-none-any.whl", hash = "sha256:f3d4e9bd4344935a08e6844e53d6220e2e4fb7e465bee51fa909152ed6bab406"}, - {file = "textfsm-1.1.2.tar.gz", hash = "sha256:85a450b441aff04b1cac726bdb36f35534a5b196cca08c8bc14fddd879c4255c"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomli = [] -transitions = [] -ttp = [] -ttp-templates = [] -typed-ast = [] -typing-extensions = [] -urllib3 = [] -watchdog = [] -wrapt = [] -yamllint = [] -yamlordereddictloader = [ - {file = "yamlordereddictloader-0.4.0.tar.gz", hash = "sha256:7f30f0b99ea3f877f7cb340c570921fa9d639b7f69cba18be051e27f8de2080e"}, -] -zipp = [] +content-hash = "755e68cd1479c6ab33ba2723830a76c8d0a5a50a814982e0c3bf67d69d49bb48" diff --git a/pyproject.toml b/pyproject.toml index 99d0339..69ce4db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ python = "^3.7" nornir = "^3.0.0" requests = "^2.25.1" nornir-utils = "^0" -nornir-napalm = "^0" +nornir-napalm = "^0.4.0" nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" From afb7f818fa866bf57c6971724c27e8fd4458e442 Mon Sep 17 00:00:00 2001 From: Joe Wesch Date: Tue, 16 May 2023 09:11:33 -0500 Subject: [PATCH 52/65] Revert pinning pylint --- poetry.lock | 59 +++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3b9264f..94d379b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -417,20 +417,21 @@ test = ["pytest (>=6)"] [[package]] name = "flake8" -version = "2.3.0" -description = "the modular source code checker: pep8, pyflakes and co" +version = "3.9.2" +description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ - {file = "flake8-2.3.0-py2.py3-none-any.whl", hash = "sha256:c99cc9716d6655d9c8bcb1e77632b8615bf0abd282d7abd9f5c2148cad7fc669"}, - {file = "flake8-2.3.0.tar.gz", hash = "sha256:5ee1a43ccd0716d6061521eec6937c983efa027793013e572712c4da55c7c83e"}, + {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, + {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, ] [package.dependencies] -mccabe = ">=0.2.1" -pep8 = ">=1.5.7" -pyflakes = ">=0.8.1" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.7.0,<2.8.0" +pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "future" @@ -872,14 +873,14 @@ files = [ [[package]] name = "mccabe" -version = "0.7.0" +version = "0.6.1" description = "McCabe checker, plugin for flake8" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = "*" files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] [[package]] @@ -1302,18 +1303,6 @@ files = [ {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, ] -[[package]] -name = "pep8" -version = "1.7.1" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "pep8-1.7.1-py2.py3-none-any.whl", hash = "sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee"}, - {file = "pep8-1.7.1.tar.gz", hash = "sha256:fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374"}, -] - [[package]] name = "platformdirs" version = "3.5.1" @@ -1352,6 +1341,18 @@ importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pycodestyle" +version = "2.7.0" +description = "Python style guide checker" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, +] + [[package]] name = "pycparser" version = "2.21" @@ -1457,14 +1458,14 @@ test = ["coverage", "mock"] [[package]] name = "pyflakes" -version = "3.0.1" +version = "2.3.1" description = "passive checker of Python programs" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] [[package]] @@ -2274,4 +2275,4 @@ testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "755e68cd1479c6ab33ba2723830a76c8d0a5a50a814982e0c3bf67d69d49bb48" +content-hash = "d68c22b5979dcf414443c24603a397c8da65551f0db7085463104fe088cc869a" diff --git a/pyproject.toml b/pyproject.toml index 69ce4db..326093f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ pytest = "*" requests_mock = "*" pyyaml = "*" black = "*" -pylint = "^2.12.0" +pylint = "*" pydocstyle = "*" yamllint = "*" bandit = "*" From 0a0ab8cfc9fa77704aa98346c0f1a949c86cee33 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Thu, 18 May 2023 19:48:24 +0200 Subject: [PATCH 53/65] feature: add api-ssl support feature: refactor get_config method type modified: nornir_nautobot/plugins/tasks/dispatcher/default.py modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py --- .../plugins/tasks/dispatcher/default.py | 14 ++++++--- .../tasks/dispatcher/mikrotik_routeros_api.py | 31 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/default.py b/nornir_nautobot/plugins/tasks/dispatcher/default.py index 83f161b..3c0c074 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/default.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/default.py @@ -32,8 +32,10 @@ class NautobotNornirDriver: config_command = "show run" - @staticmethod - def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + @classmethod + def get_config( + cls, task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + ) -> Result: """Get the latest configuration from the device. Args: @@ -226,8 +228,10 @@ class NetmikoNautobotNornirDriver(NautobotNornirDriver): config_command = "show run" - @staticmethod - def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list) -> Result: + @classmethod + def get_config( + cls, task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + ) -> Result: """Get the latest configuration from the device using Netmiko. Args: @@ -242,7 +246,7 @@ def get_config(task: Task, logger, obj, backup_file: str, remove_lines: list, su { "config: } """ logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") - command = NetmikoNautobotNornirDriver.config_command + command = cls.config_command try: result = task.run(task=netmiko_send_command, command_string=command) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 8ab5e45..9eea16c 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -1,6 +1,7 @@ """default network_importer API-based driver for Mikrotik RouterOS.""" import os +import ssl import json import socket @@ -32,9 +33,9 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): "/system/logging/action", ] - @staticmethod - def get_config( # pylint: disable=R0913 - task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + @classmethod + def get_config( # pylint: disable=R0913,R0914 + cls, task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list ) -> Result: """Get the latest configuration from the device. @@ -51,13 +52,25 @@ def get_config( # pylint: disable=R0913 { "config: } """ logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") - connection = routeros_api.RouterOsApiPool( # inventory, secrets to be integrated - obj.primary_ip4.host, username=task.host.username, password=task.host.password, plaintext_login=True + sslctx = ssl.create_default_context() + sslctx.set_ciphers("ADH-AES256-GCM-SHA384:ADH-AES256-SHA256:@SECLEVEL=0") + connection = routeros_api.RouterOsApiPool( + task.host.hostname, + username=task.host.username, + password=task.host.password, + use_ssl=True, + ssl_context=sslctx, + plaintext_login=True, ) config_data = {} - api = connection.get_api() - - for endpoint in NautobotNornirDriver.config_command: + try: + api = connection.get_api() + except Exception as error: + logger.log_failure(obj, f"`get_config` method failed with an unexpected issue: `{error}`") + raise NornirNautobotException( # pylint: disable=W0707 + f"`get_config` method failed with an unexpected issue: `{error}`" + ) + for endpoint in cls.config_command: try: resource = api.get_resource(endpoint) config_data[endpoint] = resource.get() @@ -106,7 +119,7 @@ def check_connectivity(task: Task, logger, obj) -> Result: ip_addr = socket.gethostbyname(task.host.hostname) # TODO: Allow port to be configurable, allow ssl as well - port = 8728 + port = 8729 if not tcp_ping(ip_addr, port): logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") raise NornirNautobotException( From 689400feba03c813822b4ed81d4630e07480e987 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Thu, 18 May 2023 19:54:20 +0200 Subject: [PATCH 54/65] fix: made it compatible with #79 modified: nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py --- .../plugins/tasks/dispatcher/mikrotik_routeros.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index c209ea2..c90450d 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -12,7 +12,6 @@ from nornir_nautobot.exceptions import NornirNautobotException from .default import NetmikoNautobotNornirDriver as DefaultNautobotNornirDriver -GET_VERSION_COMMAND = "system resource print" NETMIKO_DEVICE_TYPE = "mikrotik_routeros" @@ -20,10 +19,11 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): """Driver for Mikrotik Router OS.""" config_command = "export terse" + version_command = "system resource print" - @staticmethod - def get_config( # pylint: disable=R0913 - task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + @classmethod + def get_config( # pylint: disable=R0913,R0914 + cls, task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list ) -> Result: """Get the latest configuration from the device using Netmiko. Overrides default get_config. @@ -42,9 +42,8 @@ def get_config( # pylint: disable=R0913 """ task.host.platform = NETMIKO_DEVICE_TYPE logger.log_debug(f"Analyzing Software Version for {task.host.name} on {task.host.platform}") - command = GET_VERSION_COMMAND try: - result = task.run(task=netmiko_send_command, command_string=GET_VERSION_COMMAND) + result = task.run(task=netmiko_send_command, command_string=cls.version_command) except NornirSubTaskError as exc: if isinstance(exc.result.exception, NetmikoAuthenticationException): logger.log_failure(obj, f"Failed with an authentication issue: `{exc.result.exception}`") @@ -68,7 +67,7 @@ def get_config( # pylint: disable=R0913 major_version = result[0].result.split()[3].split(".")[0] - command = NautobotNornirDriver.config_command + command = cls.config_command if major_version > "6": command += " show-sensitive" From 0e63be91e2ff1e4d2b2c4eae6fa0af895dc872a9 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Thu, 25 May 2023 19:33:17 +0200 Subject: [PATCH 55/65] modified: pyproject.toml,edited routeros-api dep type. --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 382abcb..aa2d3f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" -routeros-api = "^0.17.0" +routeros-api = {version = "^0.17.0", optional = true} [tool.poetry.dev-dependencies] pytest = "*" @@ -52,6 +52,9 @@ mkdocstrings = "0.19" mkdocstrings-python = "0.7.1" mkdocs-version-annotations = "1.0.0" +[tool.poetry.extras] +mikrotik_driver = ["routeros-api"] + [tool.poetry.plugins."nornir.plugins.inventory"] "NautobotInventory" = "nornir_nautobot.plugins.inventory.nautobot:NautobotInventory" From 580f5ff9298406ca8c7fcf12960b37c225c6e365 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 26 May 2023 13:55:54 +0200 Subject: [PATCH 56/65] modified: mikrotik_routeros_api.py, routeros-api import with graceful failure. --- .../tasks/dispatcher/mikrotik_routeros_api.py | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 9eea16c..864745e 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -5,7 +5,10 @@ import json import socket -import routeros_api # pylint: disable=E0401 +try: + import routeros_api # pylint: disable=E0401 +except ImportError: + routeros_api = None from netutils.config.clean import clean_config, sanitize_config from netutils.dns import is_fqdn_resolvable @@ -54,14 +57,19 @@ def get_config( # pylint: disable=R0913,R0914 logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") sslctx = ssl.create_default_context() sslctx.set_ciphers("ADH-AES256-GCM-SHA384:ADH-AES256-SHA256:@SECLEVEL=0") - connection = routeros_api.RouterOsApiPool( - task.host.hostname, - username=task.host.username, - password=task.host.password, - use_ssl=True, - ssl_context=sslctx, - plaintext_login=True, - ) + try: + connection = routeros_api.RouterOsApiPool( + task.host.hostname, + username=task.host.username, + password=task.host.password, + use_ssl=True, + ssl_context=sslctx, + plaintext_login=True, + ) + except AttributeError: + raise NornirNautobotException( # pylint: disable=W0707 + "`routeros_api` module missing, check your environment" + ) config_data = {} try: api = connection.get_api() From a305f6338d4c1330a850abb1a3172149485ee644 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Fri, 26 May 2023 14:23:00 +0200 Subject: [PATCH 57/65] modified: mikrotik_routeros.py, compatibility with #79 --- .../plugins/tasks/dispatcher/mikrotik_routeros.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py index c90450d..f7343f6 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros.py @@ -87,8 +87,8 @@ def get_config( # pylint: disable=R0913,R0914 _running_config = result[0].result - _running_config = NautobotNornirDriver._remove_lines(logger, _running_config, remove_lines) - _running_config = NautobotNornirDriver._substitute_lines(logger, _running_config, substitute_lines) - NautobotNornirDriver._save_file(logger, backup_file, _running_config) + _running_config = cls._remove_lines(logger, _running_config, remove_lines) + _running_config = cls._substitute_lines(logger, _running_config, substitute_lines) + cls._save_file(logger, backup_file, _running_config) return Result(host=task.host, result={"config": _running_config}) From b3fc919b97adc14cf78c31f48ac0203993c5b5db Mon Sep 17 00:00:00 2001 From: Joe Wesch Date: Fri, 26 May 2023 13:36:22 -0500 Subject: [PATCH 58/65] Fixes minimum version while allowing minor updates --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 326093f..29dad3b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ python = "^3.7" nornir = "^3.0.0" requests = "^2.25.1" nornir-utils = "^0" -nornir-napalm = "^0.4.0" +nornir-napalm = ">=0.4.0 <1.0.0" nornir-jinja2 = "^0" nornir-netmiko = "^0" pynautobot = "^1.0.1" From af8cf5dcd3fff93a80fe6d55953e1147e2253043 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 6 Jun 2023 10:28:20 +0200 Subject: [PATCH 59/65] feat: added local user collection endpoint to list of defaults. --- .../plugins/tasks/dispatcher/mikrotik_routeros_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py index 864745e..85caa32 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/mikrotik_routeros_api.py @@ -28,6 +28,7 @@ class NautobotNornirDriver(DefaultNautobotNornirDriver): config_command = [ "/system/identity", + "/user", "/interface", "/ip/address", "/system/ntp/client", From 274d97117b914d334d44eb8af357b97d485a83a5 Mon Sep 17 00:00:00 2001 From: pvillar_netdev Date: Tue, 6 Jun 2023 20:03:50 +0200 Subject: [PATCH 60/65] RE-Create ruckus_smartzone_api.py --- .../tasks/dispatcher/ruckus_smartzone_api.py | 223 ++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 nornir_nautobot/plugins/tasks/dispatcher/ruckus_smartzone_api.py diff --git a/nornir_nautobot/plugins/tasks/dispatcher/ruckus_smartzone_api.py b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_smartzone_api.py new file mode 100644 index 0000000..4908916 --- /dev/null +++ b/nornir_nautobot/plugins/tasks/dispatcher/ruckus_smartzone_api.py @@ -0,0 +1,223 @@ +"""default network_importer API-based driver for Ruckus Smartzone WLC.""" + +import os +import json +import socket +import asyncio +import httpx # pylint: disable=E0401 +import requests + +from netutils.dns import is_fqdn_resolvable +from netutils.ip import is_ip +from netutils.ping import tcp_ping +from netutils.config.clean import clean_config, sanitize_config + +from nornir.core.task import Result, Task + +from nornir_nautobot.exceptions import NornirNautobotException +from nornir_nautobot.utils.helpers import make_folder + +from .default import NautobotNornirDriver as DefaultNautobotNornirDriver + +AP_PLATFORM_LIST = ["ruckus_access_point", "ruckus-access-point"] + + +class NautobotNornirDriver(DefaultNautobotNornirDriver): + """Default collection of Nornir Tasks tailored for Ruckus Smart Zone Controllers.""" + + wlc_endpoints = { + "simple_endpoints": [ + "/cluster/state", + "/controller", + "/system/snmpAgent", + "/system/syslog", + "/system/systemTime", + "/profiles/dnsserver", + "/apRules", + ], + "nested_endpoints": [ + "/apRules", + ], + } + + ap_endpoints = { + "simple_endpoints": [ + "/rkszones", + "/aps", + ], + } + + @staticmethod + def _api_auth(session_params: tuple) -> dict: + controller_ip, username, password = session_params + headers = {"Accept": "application/json", "Content-Type": "application/json;charset=UTF-8"} + api_version = "v9_1" + base_url = f"https://{controller_ip}:8443/wsg/api/public/{api_version}" + response = requests.post( # nosec + f"{base_url}/serviceTicket", + verify=False, + headers=headers, + json={"username": username, "password": password}, + ) + if response.status_code == 200: + data = response.json() + service_ticket = data.get("serviceTicket") + else: + raise NornirNautobotException( # pylint: disable=W0707 + f"`_api_auth` method failed with an unexpected issue: HTTP Error `{response.status_code}`" + ) + + return service_ticket + + @staticmethod + def _build_urls( + wlc_ip4: tuple, + token: str, + endpoints: dict, + extras: dict, + ) -> dict: + url_dict = {} + headers = {"Accept": "application/json", "Content-Type": "application/json;charset=UTF-8"} + api_version = "v9_1" + simple_endpoints = endpoints.get("simple_endpoints", []) + nested_endpoints = endpoints.get("nested_endpoints", []) + + base_url = f"https://{wlc_ip4}:8443/wsg/api/public/{api_version}" + + for uri in endpoints.get("simple_endpoints"): + if extras: + url_dict[uri] = f'{base_url}{uri}/{extras.get(uri, "")}?serviceTicket={token}' + else: + url_dict[uri] = f"{base_url}{uri}?serviceTicket={token}" + + for uri in nested_endpoints: + if uri in simple_endpoints: + uri_list = [] + response = requests.get( + url=f"{base_url}{uri}?serviceTicket={token}", verify=False, headers=headers # nosec + ) + if response.status_code == 200: + item_list = response.json().get("list") + else: + raise NornirNautobotException( # pylint: disable=W0707 + f"`{uri}` endpoint failed with code: HTTP Error `{response.status_code}`" + ) + uri_list = [f'{uri}/{item["id"]}' for item in item_list] + for uri_list_item in uri_list: + url_dict[uri_list_item] = f"{base_url}{uri_list_item}?serviceTicket={token}" + else: + raise NornirNautobotException( # pylint: disable=W0707 + f"`{uri}` endpoint missing in simple endpoints list, schema invalid`" + ) + + return url_dict + + @staticmethod + async def _async_get_data(url_dict: dict) -> dict: + # login use session params + headers = {"Accept": "application/json", "Content-Type": "application/json;charset=UTF-8"} + + async with httpx.AsyncClient(verify=False) as client: # nosec + client.headers = headers + coroutines = [client.get(url) for url in url_dict.values()] + results = await asyncio.gather(*coroutines) + + api_data = {url: result.json() for url, result in zip(url_dict.keys(), results) if result.status_code == 200} + + return api_data + + @classmethod + def get_config( # pylint: disable=R0913,R0914 + cls, task: Task, logger, obj, backup_file: str, remove_lines: list, substitute_lines: list + ) -> Result: + """Get the latest configuration from the device. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + backup_file (str): The file location of where the back configuration should be saved. + remove_lines (list): A list of regex lines to remove configurations. + substitute_lines (list): A list of dictionaries with to remove and replace lines. + + Returns: + Result: Nornir Result object with a dict as a result containing the running configuration + { "config: } + """ + logger.log_debug(f"Executing get_config for {task.host.name} on {task.host.platform}") + _extras = {} + if task.host.platform in AP_PLATFORM_LIST: + _wlc_ip4 = obj.get_computed_field("wireless_controller") + _extras["/rkszones"] = obj.get_computed_field("wireless_zone") + _extras["/aps"] = obj.cf.get("basemac", "") + _endpoints = cls.ap_endpoints + else: + _wlc_ip4 = task.host.hostname + _endpoints = cls.wlc_endpoints + + _session_params = (_wlc_ip4, task.host.username, task.host.password) + _token = cls._api_auth(_session_params) + url_dict = cls._build_urls(_wlc_ip4, _token, _endpoints, _extras) + config_data = asyncio.run(cls._async_get_data(url_dict)) + running_config = json.dumps(config_data, indent=4) + + if remove_lines: + logger.log_debug("Removing lines from configuration based on `remove_lines` definition") + running_config = clean_config(running_config, remove_lines) + + if substitute_lines: + logger.log_debug("Substitute lines from configuration based on `substitute_lines` definition") + running_config = sanitize_config(running_config, substitute_lines) + + make_folder(os.path.dirname(backup_file)) + + with open(backup_file, "w", encoding="utf8") as filehandler: + filehandler.write(running_config) + return Result(host=task.host, result={"config": running_config}) + + @staticmethod + def check_connectivity(task: Task, logger, obj) -> Result: + """Check the connectivity to a network device. + + Args: + task (Task): Nornir Task. + logger (NornirLogger): Custom NornirLogger object to reflect job results (via Nautobot Jobs) and Python logger. + obj (Device): A Nautobot Device Django ORM object instance. + + Returns: + Result: Nornir Result object. + """ + hostname = ( + obj.get_computed_field("wireless_controller") + if task.host.platform in AP_PLATFORM_LIST + else task.host.hostname + ) + if is_ip(hostname): + ip_addr = hostname + else: + if not is_fqdn_resolvable(hostname): + logger.log_failure(obj, "There was not an IP or resolvable, preemptively failed.") + raise NornirNautobotException( + "There was not an IP or resolvable, preemptively failed." + ) # pylint: disable=W0707 + ip_addr = socket.gethostbyname(hostname) + + # TODO: Allow port to be configurable, allow ssl as well + port = 8443 + if not tcp_ping(ip_addr, port): + logger.log_failure(obj, f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed.") + raise NornirNautobotException( + f"Could not connect to IP: {ip_addr} and port: {port}, preemptively failed." + ) # pylint: disable=W0707 + if not task.host.username: + logger.log_failure(obj, "There was no username defined, preemptively failed.") + raise NornirNautobotException( + "There was no username defined, preemptively failed." + ) # pylint: disable=W0707 + if not task.host.password: + logger.log_failure(obj, "There was no password defined, preemptively failed.") + raise NornirNautobotException( + "There was no password defined, preemptively failed." + ) # pylint: disable=W0707 + + return Result(host=task.host) From 324edab3c80a37f3043d2d06c01866f16dbd10f4 Mon Sep 17 00:00:00 2001 From: pvillar_netdev Date: Tue, 6 Jun 2023 20:07:10 +0200 Subject: [PATCH 61/65] Update __init__.py --- nornir_nautobot/plugins/tasks/dispatcher/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py index 47bc983..b52f206 100644 --- a/nornir_nautobot/plugins/tasks/dispatcher/__init__.py +++ b/nornir_nautobot/plugins/tasks/dispatcher/__init__.py @@ -21,6 +21,8 @@ "mikrotik_routeros_api": "nornir_nautobot.plugins.tasks.dispatcher.mikrotik_routeros_api.NautobotNornirDriver", "ruckus_fastiron": "nornir_nautobot.plugins.tasks.dispatcher.ruckus_fastiron.NautobotNornirDriver", "mikrotik_routeros": "nornir_nautobot.plugins.tasks.dispatcher.mikrotik_routeros.NautobotNornirDriver", + "ruckus_smartzone_api": "nornir_nautobot.plugins.tasks.dispatcher.ruckus_smartzone_api.NautobotNornirDriver", + "ruckus_access_point": "nornir_nautobot.plugins.tasks.dispatcher.ruckus_smartzone_api.NautobotNornirDriver", } From fa9185710f36a11222b6a2e8cbcc6ac2db5bd61e Mon Sep 17 00:00:00 2001 From: pvillar_netdev Date: Tue, 6 Jun 2023 20:07:59 +0200 Subject: [PATCH 62/65] Update pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 758f154..8e515a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ nornir-netmiko = "^0" pynautobot = "^1.0.1" netutils = "^1" routeros-api = {version = "^0.17.0", optional = true} +httpx = "^0.24.1" [tool.poetry.dev-dependencies] pytest = "*" From 9cd794dae21b1485754e155bf6da98da41f933d6 Mon Sep 17 00:00:00 2001 From: pato23arg Date: Tue, 6 Jun 2023 20:23:09 +0200 Subject: [PATCH 63/65] modified: poetry.lock --- poetry.lock | 109 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index d4e3974..2156b32 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,27 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.7.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0"}, + {file = "anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +doc = ["Sphinx (>=6.1.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] [[package]] name = "astroid" @@ -404,7 +427,7 @@ graph = ["objgraph (>=1.7.2)"] name = "exceptiongroup" version = "1.1.1" description = "Backport of PEP 654 (exception groups)" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -509,6 +532,67 @@ files = [ cached-property = {version = "*", markers = "python_version < \"3.8\""} colorama = ">=0.4" +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[[package]] +name = "httpcore" +version = "0.17.2" +description = "A minimal low-level HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpcore-0.17.2-py3-none-any.whl", hash = "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36"}, + {file = "httpcore-0.17.2.tar.gz", hash = "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af"}, +] + +[package.dependencies] +anyio = ">=3.0,<5.0" +certifi = "*" +h11 = ">=0.13,<0.15" +sniffio = ">=1.0.0,<2.0.0" + +[package.extras] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + +[[package]] +name = "httpx" +version = "0.24.1" +description = "The next generation HTTP client." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, + {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, +] + +[package.dependencies] +certifi = "*" +httpcore = ">=0.15.0,<0.18.0" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] + [[package]] name = "idna" version = "3.4" @@ -1782,8 +1866,8 @@ name = "routeros-api" version = "0.17.0" description = "Python API to RouterBoard devices produced by MikroTik." category = "main" -optional = false -python-versions = ">=3" +optional = true +python-versions = "*" files = [ {file = "RouterOS-api-0.17.0.tar.gz", hash = "sha256:1b9898460ecc4667b54e477d495b74c2f24ae0aac4c90dd0e62f23ec7eae8252"}, {file = "RouterOS_api-0.17.0-py2.py3-none-any.whl", hash = "sha256:bf38da94a570875eaa87ff537558f765a4697dbce1a9753070194b687f441bf0"}, @@ -1913,6 +1997,18 @@ files = [ {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, ] +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + [[package]] name = "snowballstemmer" version = "2.2.0" @@ -2287,7 +2383,10 @@ files = [ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +[extras] +mikrotik-driver = ["routeros-api"] + [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "d68c22b5979dcf414443c24603a397c8da65551f0db7085463104fe088cc869a" +content-hash = "7b6179b42b3d41db301bb468ce1c0ef69dec96e92b8caf685da826c0fb12a86b" From 4c940addf84d756549167abfe81dc2b71c598286 Mon Sep 17 00:00:00 2001 From: Josh VanDeraa Date: Tue, 6 Jun 2023 14:00:42 -0500 Subject: [PATCH 64/65] Release 2.4.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8e515a2..451197e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "nornir-nautobot" -version = "2.3.0" +version = "2.4.0" description = "Nornir Nautobot" authors = ["Network to Code, LLC "] readme = "README.md" From b3187eb84239e681a96123b0fe9f124150f7f8aa Mon Sep 17 00:00:00 2001 From: Josh VanDeraa Date: Wed, 7 Jun 2023 08:12:15 -0500 Subject: [PATCH 65/65] Updates changelog. --- docs/dev/CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/dev/CHANGELOG.md b/docs/dev/CHANGELOG.md index b4d6992..e4147fd 100644 --- a/docs/dev/CHANGELOG.md +++ b/docs/dev/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## v2.4.0 + +- (#61) Be more clear on error messages by @itdependsnetworks +- (#66) Add basic typing to the methods in logger by @KalleDK +- (#75) Documentation refactor by @susanhooks +- (#77) added ICX/Fastiron Nornir Driver by @pato23arg +- (#78) Fix RTD docs build by @cmsirbu +- (#83) Adds provision_config method by @joewesch +- (#76) Mikrotik RouterOS CLI Support by @pato23arg +- (#79) Mikrotik RouterOS API support by @pato23arg +- (#85) Ruckus Smartzone WLC and Access Point Driver by @pato23arg + +## New Contributors +* @KalleDK made their first contribution in https://github.com/nautobot/nornir-nautobot/pull/66 +* @susanhooks made their first contribution in https://github.com/nautobot/nornir-nautobot/pull/75 +* @pato23arg made their first contribution in https://github.com/nautobot/nornir-nautobot/pull/77 +* @cmsirbu made their first contribution in https://github.com/nautobot/nornir-nautobot/pull/78 +* @joewesch made their first contribution in https://github.com/nautobot/nornir-nautobot/pull/83 + ## v2.3.0 - (#67) fix pylint, tests, and drop py36 support #67