Update black

This commit is contained in:
thatmattlove 2021-12-06 17:12:30 -07:00
parent ec28ccafbc
commit c049569cab
27 changed files with 236 additions and 158 deletions

View file

@ -20,7 +20,8 @@ async def http_handler(request, exc):
"""Handle web server errors."""
return JSONResponse(
{"output": exc.detail, "level": "danger", "keywords": []}, status_code=exc.status_code,
{"output": exc.detail, "level": "danger", "keywords": []},
status_code=exc.status_code,
)
@ -36,5 +37,6 @@ async def validation_handler(request, exc):
"""Handle Pydantic validation errors raised by FastAPI."""
error = exc.errors()[0]
return JSONResponse(
{"output": error["msg"], "level": "error", "keywords": error["loc"]}, status_code=422,
{"output": error["msg"], "level": "error", "keywords": error["loc"]},
status_code=422,
)

View file

@ -50,7 +50,9 @@ def get_ui_params():
async def send_webhook(
query_data: Query, request: Request, timestamp: datetime,
query_data: Query,
request: Request,
timestamp: datetime,
):
"""If webhooks are enabled, get request info and send a webhook."""
params = use_state("params")

View file

@ -168,7 +168,7 @@ def get_connection_id():
def _remove_none_values(dictionary):
""" Remove dictionary keys whose value is None."""
"""Remove dictionary keys whose value is None."""
return list(map(dictionary.pop, [i for i in dictionary if dictionary[i] is None]))
@ -180,7 +180,7 @@ def _remove_none_values(dictionary):
class BaseSSHTunnelForwarderError(Exception):
""" Exception raised by :class:`SSHTunnelForwarder` errors """
"""Exception raised by :class:`SSHTunnelForwarder` errors"""
def __init__(self, *args, **kwargs):
self.value = kwargs.pop("value", args[0] if args else "")
@ -190,7 +190,7 @@ class BaseSSHTunnelForwarderError(Exception):
class HandlerSSHTunnelForwarderError(BaseSSHTunnelForwarderError):
""" Exception for Tunnel forwarder errors """
"""Exception for Tunnel forwarder errors"""
pass
@ -203,7 +203,7 @@ class HandlerSSHTunnelForwarderError(BaseSSHTunnelForwarderError):
class _ForwardHandler(socketserver.BaseRequestHandler):
""" Base handler for tunnel connections """
"""Base handler for tunnel connections"""
remote_address = None
ssh_transport = None
@ -227,7 +227,9 @@ class _ForwardHandler(socketserver.BaseRequestHandler):
if not chan.recv_ready():
break
data = chan.recv(1024)
self.logger.trace("<<< IN {0} recv: {1} <<<".format(self.info, hexlify(data)),)
self.logger.trace(
"<<< IN {0} recv: {1} <<<".format(self.info, hexlify(data)),
)
self.request.sendall(data)
def handle(self):
@ -687,7 +689,11 @@ class SSHTunnelForwarder:
else:
forward_maker_class = self._make_ssh_forward_server_class
_Server = forward_maker_class(remote_address)
ssh_forward_server = _Server(local_bind_address, _Handler, logger=self.logger,)
ssh_forward_server = _Server(
local_bind_address,
_Handler,
logger=self.logger,
)
if ssh_forward_server:
ssh_forward_server.daemon_threads = self.daemon_forward_servers
@ -699,7 +705,8 @@ class SSHTunnelForwarder:
"Problem setting up ssh {0} <> {1} forwarder. You can "
"suppress this exception by using the `mute_exceptions`"
"argument".format(
address_to_str(local_bind_address), address_to_str(remote_address),
address_to_str(local_bind_address),
address_to_str(remote_address),
),
)
except IOError:
@ -969,7 +976,9 @@ class SSHTunnelForwarder:
- ``paramiko.Pkey`` - it will be transparently added to loaded keys
"""
ssh_loaded_pkeys = SSHTunnelForwarder.get_keys(
logger=logger, host_pkey_directories=host_pkey_directories, allow_agent=allow_agent,
logger=logger,
host_pkey_directories=host_pkey_directories,
allow_agent=allow_agent,
)
if isinstance(ssh_pkey, str):
@ -1109,7 +1118,12 @@ class SSHTunnelForwarder:
for pkey_class in (
(key_type,)
if key_type
else (paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey, paramiko.Ed25519Key,)
else (
paramiko.RSAKey,
paramiko.DSSKey,
paramiko.ECDSAKey,
paramiko.Ed25519Key,
)
):
try:
ssh_pkey = pkey_class.from_private_key_file(pkey_file, password=pkey_password)
@ -1184,7 +1198,8 @@ class SSHTunnelForwarder:
self._create_tunnels()
if not self.is_active:
self._raise(
BaseSSHTunnelForwarderError, reason="Could not establish session to SSH gateway",
BaseSSHTunnelForwarderError,
reason="Could not establish session to SSH gateway",
)
for _srv in self._server_list:
thread = threading.Thread(
@ -1198,7 +1213,8 @@ class SSHTunnelForwarder:
self.is_alive = any(self.tunnel_is_up.values())
if not self.is_alive:
self._raise(
HandlerSSHTunnelForwarderError, "An error occurred while opening tunnels.",
HandlerSSHTunnelForwarderError,
"An error occurred while opening tunnels.",
)
def stop(self) -> None:
@ -1386,7 +1402,7 @@ class SSHTunnelForwarder:
@property
def is_active(self) -> bool:
""" Return True if the underlying SSH transport is up """
"""Return True if the underlying SSH transport is up"""
if "_transport" in self.__dict__ and self._transport.is_active():
return True
return False

View file

@ -42,7 +42,8 @@ def init_params() -> "Params":
# Set up syslog logging if enabled.
if params.logging.syslog is not None and params.logging.syslog.enable:
enable_syslog_logging(
syslog_host=params.logging.syslog.host, syslog_port=params.logging.syslog.port,
syslog_host=params.logging.syslog.host,
syslog_port=params.logging.syslog.port,
)
if params.logging.http is not None and params.logging.http.enable:
@ -113,7 +114,9 @@ def init_ui_params(*, params: "Params", devices: "Devices") -> "UIParameters":
from hyperglass.constants import PARSED_RESPONSE_FIELDS, __version__
content_greeting = get_markdown(
config=params.web.greeting, default="", params={"title": params.web.greeting.title},
config=params.web.greeting,
default="",
params={"title": params.web.greeting.title},
)
content_credit = CREDIT.format(version=__version__)

View file

@ -19,7 +19,9 @@ if TYPE_CHECKING:
class ScrapeError(
PublicHyperglassError, template=MESSAGES.connection_error, level="danger",
PublicHyperglassError,
template=MESSAGES.connection_error,
level="danger",
):
"""Raised when an SSH driver error occurs."""

View file

@ -36,7 +36,9 @@ class Construct:
def __init__(self, device: "Device", query: "Query"):
"""Initialize command construction."""
log.debug(
"Constructing '{}' query for '{}'", query.query_type, str(query.query_target),
"Constructing '{}' query for '{}'",
query.query_type,
str(query.query_target),
)
self.query = query
self.device = device

View file

@ -24,5 +24,6 @@ class Webhook(BaseExternal):
return provider_class(config)
except KeyError:
raise UnsupportedError(
message="{p} is not yet supported as a webhook target.", p=config.provider.title(),
message="{p} is not yet supported as a webhook target.",
p=config.provider.title(),
)

View file

@ -229,8 +229,12 @@ def enable_syslog_logging(syslog_host: str, syslog_port: int) -> None:
from logging.handlers import SysLogHandler
_loguru_logger.add(
SysLogHandler(address=(str(syslog_host), syslog_port)), format=_FMT_BASIC, enqueue=True,
SysLogHandler(address=(str(syslog_host), syslog_port)),
format=_FMT_BASIC,
enqueue=True,
)
log.debug(
"Logging to syslog target {}:{} enabled", str(syslog_host), str(syslog_port),
"Logging to syslog target {}:{} enabled",
str(syslog_host),
str(syslog_port),
)

View file

@ -75,7 +75,8 @@ def register_all_plugins() -> None:
for failure in failures:
log.warning(
"Plugin {!r} is not a valid hyperglass plugin and was not registered", failure,
"Plugin {!r} is not a valid hyperglass plugin and was not registered",
failure,
)

View file

@ -55,7 +55,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
except ValueError:
raise InputInvalid(
params.messages.invalid_input, target=value, query_type=query_type_params.display_name,
params.messages.invalid_input,
target=value,
query_type=query_type_params.display_name,
)
# Test the valid IP address to determine if it is:
@ -65,7 +67,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
# ...and returns an error if so.
if valid_ip.is_reserved or valid_ip.is_unspecified or valid_ip.is_loopback:
raise InputInvalid(
params.messages.invalid_input, target=value, query_type=query_type_params.display_name,
params.messages.invalid_input,
target=value,
query_type=query_type_params.display_name,
)
ip_version = valid_ip.version
@ -103,7 +107,10 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
new_ip = valid_ip.network_address
log.debug(
"Converted '{o}' to '{n}' for '{q}' query", o=valid_ip, n=new_ip, q=query_type,
"Converted '{o}' to '{n}' for '{q}' query",
o=valid_ip,
n=new_ip,
q=query_type,
)
valid_ip = new_ip
@ -121,7 +128,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
if containing_prefix is None:
log.error(
"Unable to find containing prefix for {}. Got: {}", str(valid_ip), network_info,
"Unable to find containing prefix for {}. Got: {}",
str(valid_ip),
network_info,
)
raise InputInvalid("{q} does not have a containing prefix", q=ip_str)
@ -132,7 +141,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
except ValueError as err:
log.error(
"Unable to find containing prefix for {q}. Error: {e}", q=str(valid_ip), e=err,
"Unable to find containing prefix for {q}. Error: {e}",
q=str(valid_ip),
e=err,
)
raise InputInvalid("{q} does does not have a containing prefix", q=valid_ip)

View file

@ -14,7 +14,9 @@ class _IPv4(CommandSet):
bgp_aspath: StrictStr = "ip route print where bgp-as-path={target}"
bgp_route: StrictStr = "ip route print where dst-address={target}"
ping: StrictStr = "ping src-address={source} count=5 {target}"
traceroute: StrictStr = "tool traceroute src-address={source} timeout=1 duration=5 count=1 {target}"
traceroute: StrictStr = (
"tool traceroute src-address={source} timeout=1 duration=5 count=1 {target}"
)
class _IPv6(CommandSet):
@ -24,7 +26,9 @@ class _IPv6(CommandSet):
bgp_aspath: StrictStr = "ipv6 route print where bgp-as-path={target}"
bgp_route: StrictStr = "ipv6 route print where dst-address={target}"
ping: StrictStr = "ping src-address={source} count=5 {target}"
traceroute: StrictStr = "tool traceroute src-address={source} timeout=1 duration=5 count=1 {target}"
traceroute: StrictStr = (
"tool traceroute src-address={source} timeout=1 duration=5 count=1 {target}"
)
class _VPNIPv4(CommandSet):

View file

@ -24,7 +24,7 @@ class _IPv6(CommandSet):
bgp_aspath: StrictStr = 'show bgp ipv6 unicast quote-regexp "{target}"'
bgp_route: StrictStr = "show bgp ipv6 unicast {target} | exclude pathid:|Epoch"
ping: StrictStr = "ping ipv6 {target} repeat 5 source {source}"
traceroute: StrictStr = ("traceroute ipv6 {target} timeout 1 probe 2 source {source}")
traceroute: StrictStr = "traceroute ipv6 {target} timeout 1 probe 2 source {source}"
class _VPNIPv4(CommandSet):
@ -34,7 +34,7 @@ class _VPNIPv4(CommandSet):
bgp_aspath: StrictStr = 'show bgp vpnv4 unicast vrf {vrf} quote-regexp "{target}"'
bgp_route: StrictStr = "show bgp vpnv4 unicast vrf {vrf} {target}"
ping: StrictStr = "ping vrf {vrf} {target} repeat 5 source {source}"
traceroute: StrictStr = ("traceroute vrf {vrf} {target} timeout 1 probe 2 source {source}")
traceroute: StrictStr = "traceroute vrf {vrf} {target} timeout 1 probe 2 source {source}"
class _VPNIPv6(CommandSet):
@ -44,7 +44,7 @@ class _VPNIPv6(CommandSet):
bgp_aspath: StrictStr = 'show bgp vpnv6 unicast vrf {vrf} quote-regexp "{target}"'
bgp_route: StrictStr = "show bgp vpnv6 unicast vrf {vrf} {target}"
ping: StrictStr = "ping vrf {vrf} {target} repeat 5 source {source}"
traceroute: StrictStr = ("traceroute vrf {vrf} {target} timeout 1 probe 2 source {source}")
traceroute: StrictStr = "traceroute vrf {vrf} {target} timeout 1 probe 2 source {source}"
class CiscoIOSCommands(CommandGroup):

View file

@ -30,8 +30,12 @@ class _IPv6(CommandSet):
class _VPNIPv4(CommandSet):
"""Default commands for dual afi commands."""
bgp_community: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
bgp_aspath: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
bgp_community: StrictStr = (
"display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
)
bgp_aspath: StrictStr = (
"display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
)
bgp_route: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table {target}"
ping: StrictStr = "ping -vpn-instance {vrf} -c 5 -a {source} {target}"
traceroute: StrictStr = "tracert -q 2 -f 1 -vpn-instance {vrf} -a {source} {target}"
@ -40,8 +44,12 @@ class _VPNIPv4(CommandSet):
class _VPNIPv6(CommandSet):
"""Default commands for dual afi commands."""
bgp_community: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
bgp_aspath: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
bgp_community: StrictStr = (
"display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
)
bgp_aspath: StrictStr = (
"display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
)
bgp_route: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table {target}"
ping: StrictStr = "ping vpnv6 vpn-instance {vrf} -c 5 -a {source} {target}"
traceroute: StrictStr = "tracert -q 2 -f 1 vpn-instance {vrf} -a {source} {target}"

View file

@ -44,7 +44,9 @@ class _VPNIPv6(CommandSet):
bgp_aspath: StrictStr = 'show route protocol bgp table {vrf}.inet6.0 aspath-regex "{target}"'
bgp_community: StrictStr = "show route protocol bgp table {vrf}.inet6.0 community {target}"
ping: StrictStr = "ping inet6 routing-instance {vrf} {target} count 5 source {source}"
traceroute: StrictStr = "traceroute inet6 routing-instance {vrf} {target} wait 2 source {source}"
traceroute: StrictStr = (
"traceroute inet6 routing-instance {vrf} {target} wait 2 source {source}"
)
_structured = CommandGroup(

View file

@ -10,7 +10,9 @@ from .common import CommandSet, CommandGroup
class _IPv4(CommandSet):
"""Validation model for default VRF IPv4 commands."""
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv4 unicast community {target}"'
bgp_community: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp ipv4 unicast community {target}"'
)
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv4 unicast regexp {target}"'
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv4 unicast {target}"'
ping: StrictStr = "ping {target} ipv4 source {source} count 5 timeout 1"
@ -20,7 +22,9 @@ class _IPv4(CommandSet):
class _IPv6(CommandSet):
"""Validation model for default VRF IPv6 commands."""
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv6 unicast community {target}"'
bgp_community: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp ipv6 unicast community {target}"'
)
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv6 unicast regexp {target}"'
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv6 unicast {target}"'
ping: StrictStr = "ping {target} ipv6 source {source} count 5 timeout 1"
@ -30,9 +34,15 @@ class _IPv6(CommandSet):
class _VPNIPv4(CommandSet):
"""Validation model for non-default ipv6 commands."""
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast community {target}"'
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast regexp {target}"'
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast {target}"'
bgp_community: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast community {target}"'
)
bgp_aspath: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast regexp {target}"'
)
bgp_route: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast {target}"'
)
ping: StrictStr = "dataplane shell ping -4 -c 5 -W 1 -I {vrf} -S {source} {target}"
traceroute: StrictStr = "dataplane shell traceroute -4 -w 1 -q 1 -i {vrf} -s {source} {target}"
@ -40,9 +50,15 @@ class _VPNIPv4(CommandSet):
class _VPNIPv6(CommandSet):
"""Validation model for non-default ipv6 commands."""
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast community {target}"'
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast regexp {target}"'
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast {target}"'
bgp_community: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast community {target}"'
)
bgp_aspath: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast regexp {target}"'
)
bgp_route: StrictStr = (
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast {target}"'
)
ping: StrictStr = "dataplane shell ping -6 -c 5 -W 1 -I {vrf} -S {source} {target}"
traceroute: StrictStr = "dataplane shell traceroute -6 -w 1 -q 1 -i {vrf} -s {source} {target}"

View file

@ -23,7 +23,9 @@ class EndpointConfig(HyperglassModel):
description="Displayed inside each API endpoint section.",
)
summary: StrictStr = Field(
..., title="Endpoint Summary", description="Displayed beside the API endpoint URI.",
...,
title="Endpoint Summary",
description="Displayed beside the API endpoint URI.",
)
@ -39,7 +41,9 @@ class Docs(HyperglassModel):
description="OpenAPI UI library to use for the hyperglass API docs. Currently, the options are [Swagger UI](/fixme) and [Redoc](/fixme).",
)
base_url: HttpUrl = Field(
"https://lg.example.net", title="Base URL", description="Base URL used in request samples.",
"https://lg.example.net",
title="Base URL",
description="Base URL used in request samples.",
)
uri: AnyUri = Field(
"/api/docs",

View file

@ -93,7 +93,9 @@ class Params(ParamsPublic, HyperglassModel):
description="Allowed CORS hosts. By default, no CORS hosts are allowed.",
)
netmiko_delay_factor: IntFloat = Field(
0.1, title="Netmiko Delay Factor", description="Override the netmiko global delay factor.",
0.1,
title="Netmiko Delay Factor",
description="Override the netmiko global delay factor.",
)
plugins: List[StrictStr] = []

View file

@ -80,7 +80,9 @@ class BgpCommunity(HyperglassModel):
"""Validation model for bgp_community configuration."""
enable: StrictBool = Field(
True, title="Enable", description="Enable or disable the BGP Community query type.",
True,
title="Enable",
description="Enable or disable the BGP Community query type.",
)
display_name: StrictStr = Field(
"BGP Community",
@ -109,7 +111,9 @@ class BgpAsPath(HyperglassModel):
"""Validation model for bgp_aspath configuration."""
enable: StrictBool = Field(
True, title="Enable", description="Enable or disable the BGP AS Path query type.",
True,
title="Enable",
description="Enable or disable the BGP AS Path query type.",
)
display_name: StrictStr = Field(
"BGP AS Path",

View file

@ -158,7 +158,10 @@ class AristaRoute(_AristaBase):
)
serialized = BGPRouteTable(
vrf=self.vrf, count=count, routes=routes, winning_weight=WINNING_WEIGHT,
vrf=self.vrf,
count=count,
routes=routes,
winning_weight=WINNING_WEIGHT,
)
log.debug("Serialized Arista response: {}", serialized)

View file

@ -111,7 +111,10 @@ class FRRRoute(_FRRBase):
)
serialized = BGPRouteTable(
vrf=vrf, count=len(routes), routes=routes, winning_weight="high",
vrf=vrf,
count=len(routes),
routes=routes,
winning_weight="high",
)
log.info("Serialized FRR response: {}", serialized)

View file

@ -107,7 +107,9 @@ class HyperglassSettings(BaseSettings):
password = values.get("redis_password")
if password is not None:
dsn = "redis://:{}@{}/{!s}".format(
password.get_secret_value(), values["redis_host"], values["redis_db"],
password.get_secret_value(),
values["redis_host"],
values["redis_db"],
)
return dsn
return value

View file

@ -68,7 +68,9 @@ class PluginManager(t.Generic[PluginT]):
# Sort with built-in plugins last.
return sorted(
sorted_by_name, key=lambda p: -1 if p.__hyperglass_builtin__ else 1, reverse=True,
sorted_by_name,
key=lambda p: -1 if p.__hyperglass_builtin__ else 1,
reverse=True,
)
@property

View file

@ -180,5 +180,7 @@ class RedisManager:
)
return RedisManagerPipeline(
parent=self.instance, instance=self.instance.pipeline(), namespace=self.namespace,
parent=self.instance,
instance=self.instance.pipeline(),
namespace=self.namespace,
)

View file

@ -245,7 +245,10 @@ def deep_convert_keys(_dict: t.Type[DeepConvert], predicate: t.Callable[[str], s
return converted
def at_least(minimum: int, value: int,) -> int:
def at_least(
minimum: int,
value: int,
) -> int:
"""Get a number value that is at least a specified minimum."""
if value < minimum:
return minimum

View file

@ -163,7 +163,11 @@ async def build_ui(app_path: Path):
def generate_opengraph(
image_path: Path, max_width: int, max_height: int, target_path: Path, background_color: str,
image_path: Path,
max_width: int,
max_height: int,
target_path: Path,
background_color: str,
):
"""Generate an OpenGraph compliant image."""
# Third Party
@ -362,7 +366,11 @@ async def build_frontend( # noqa: C901
migrate_images(app_path, params)
generate_opengraph(
params.web.opengraph.image, 1200, 630, images_dir, params.web.theme.colors.black,
params.web.opengraph.image,
1200,
630,
images_dir,
params.web.theme.colors.black,
)
except Exception as err:

163
poetry.lock generated
View file

@ -97,23 +97,29 @@ typecheck = ["mypy"]
[[package]]
name = "black"
version = "19.10b0"
version = "21.12b0"
description = "The uncompromising code formatter."
category = "dev"
optional = false
python-versions = ">=3.6"
python-versions = ">=3.6.2"
[package.dependencies]
appdirs = "*"
attrs = ">=18.1.0"
click = ">=6.5"
pathspec = ">=0.6,<1"
regex = "*"
toml = ">=0.9.4"
typed-ast = ">=1.4.0"
click = ">=7.1.2"
mypy-extensions = ">=0.4.3"
pathspec = ">=0.9.0,<1"
platformdirs = ">=2"
tomli = ">=0.2.6,<2.0.0"
typing-extensions = [
{version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
{version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
]
[package.extras]
d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
colorama = ["colorama (>=0.4.3)"]
d = ["aiohttp (>=3.7.4)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
python2 = ["typed-ast (>=1.4.3)"]
uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "certifi"
@ -309,15 +315,16 @@ pycodestyle = "*"
[[package]]
name = "flake8-black"
version = "0.1.2"
version = "0.2.3"
description = "flake8 plugin to call black as a code style validator"
category = "dev"
optional = false
python-versions = "*"
[package.dependencies]
black = ">=19.3b0"
black = "*"
flake8 = ">=3.0.0"
toml = "*"
[[package]]
name = "flake8-breakpoint"
@ -654,6 +661,14 @@ category = "dev"
optional = false
python-versions = ">=3.5"
[[package]]
name = "mypy-extensions"
version = "0.4.3"
description = "Experimental type system extensions for programs checked with the mypy typechecker."
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "netmiko"
version = "3.4.0"
@ -723,11 +738,11 @@ invoke = ["invoke (>=1.3)"]
[[package]]
name = "pathspec"
version = "0.8.0"
version = "0.9.0"
description = "Utility library for gitignore style pattern matching of file paths."
category = "dev"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
[[package]]
name = "pbr"
@ -756,6 +771,18 @@ category = "main"
optional = false
python-versions = ">=3.5"
[[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 = "1.0.0"
@ -983,14 +1010,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
[package.extras]
hiredis = ["hiredis (>=0.1.3)"]
[[package]]
name = "regex"
version = "2020.9.27"
description = "Alternative regular expression module, to replace re."
category = "dev"
optional = false
python-versions = "*"
[[package]]
name = "reportlab"
version = "3.5.53"
@ -1196,12 +1215,12 @@ optional = false
python-versions = "*"
[[package]]
name = "typed-ast"
version = "1.4.1"
description = "a fork of Python 2 and 3 ast modules with type comment support"
name = "tomli"
version = "1.2.2"
description = "A lil' TOML parser"
category = "dev"
optional = false
python-versions = "*"
python-versions = ">=3.6"
[[package]]
name = "typer"
@ -1222,7 +1241,7 @@ test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (
[[package]]
name = "typing-extensions"
version = "3.7.4.3"
version = "3.10.0.2"
description = "Backported and Experimental Type Hints for Python 3.5+"
category = "main"
optional = false
@ -1322,7 +1341,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
[metadata]
lock-version = "1.1"
python-versions = ">=3.8.1,<4.0"
content-hash = "ba2c36614f210b1e9a0fe576a7854bef0e03f678da7b7d5eba724cb794c7baf1"
content-hash = "9cf4f894339409dfed596d10a3e87b8b1da77062f6e8a3c877435f609c247cf2"
[metadata.files]
aiofiles = [
@ -1363,8 +1382,8 @@ bcrypt = [
{file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"},
]
black = [
{file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"},
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
{file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"},
{file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"},
]
certifi = [
{file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
@ -1484,7 +1503,8 @@ flake8-bandit = [
{file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
]
flake8-black = [
{file = "flake8-black-0.1.2.tar.gz", hash = "sha256:b79d8d868bd42dc2c1f27469b92a984ecab3579ad285a8708ea5f19bf6c1f3a2"},
{file = "flake8-black-0.2.3.tar.gz", hash = "sha256:c199844bc1b559d91195ebe8620216f21ed67f2cc1ff6884294c91a0d2492684"},
{file = "flake8_black-0.2.3-py3-none-any.whl", hash = "sha256:cc080ba5b3773b69ba102b6617a00cc4ecbad8914109690cfda4d565ea435d96"},
]
flake8-breakpoint = [
{file = "flake8-breakpoint-1.1.0.tar.gz", hash = "sha256:5bc70d478f0437a3655d094e1d2fca81ddacabaa84d99db45ad3630bf2004064"},
@ -1641,6 +1661,10 @@ mslex = [
{file = "mslex-0.3.0-py2.py3-none-any.whl", hash = "sha256:380cb14abf8fabf40e56df5c8b21a6d533dc5cbdcfe42406bbf08dda8f42e42a"},
{file = "mslex-0.3.0.tar.gz", hash = "sha256:4a1ac3f25025cad78ad2fe499dd16d42759f7a3801645399cce5c404415daa97"},
]
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"},
]
netmiko = [
{file = "netmiko-3.4.0-py3-none-any.whl", hash = "sha256:b66f25717db3609878f83c85604349dd40a0ab494d8eafd817dcde8388131136"},
{file = "netmiko-3.4.0.tar.gz", hash = "sha256:acadb9dd97864ee848e2032f1f0e301c7b31e7a4153757d98f5c8ba1b9614993"},
@ -1662,8 +1686,8 @@ paramiko = [
{file = "paramiko-2.7.2.tar.gz", hash = "sha256:7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035"},
]
pathspec = [
{file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"},
{file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"},
{file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
{file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
]
pbr = [
{file = "pbr-5.5.0-py2.py3-none-any.whl", hash = "sha256:5adc0f9fc64319d8df5ca1e4e06eea674c26b80e6f00c530b18ce6a6592ead15"},
@ -1703,6 +1727,10 @@ pillow = [
{file = "Pillow-7.2.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"},
{file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"},
]
platformdirs = [
{file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"},
{file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"},
]
pluggy = [
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
@ -1853,35 +1881,6 @@ redis = [
{file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"},
{file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"},
]
regex = [
{file = "regex-2020.9.27-cp27-cp27m-win32.whl", hash = "sha256:d23a18037313714fb3bb5a94434d3151ee4300bae631894b1ac08111abeaa4a3"},
{file = "regex-2020.9.27-cp27-cp27m-win_amd64.whl", hash = "sha256:84e9407db1b2eb368b7ecc283121b5e592c9aaedbe8c78b1a2f1102eb2e21d19"},
{file = "regex-2020.9.27-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f18875ac23d9aa2f060838e8b79093e8bb2313dbaaa9f54c6d8e52a5df097be"},
{file = "regex-2020.9.27-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae91972f8ac958039920ef6e8769277c084971a142ce2b660691793ae44aae6b"},
{file = "regex-2020.9.27-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9a02d0ae31d35e1ec12a4ea4d4cca990800f66a917d0fb997b20fbc13f5321fc"},
{file = "regex-2020.9.27-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ebbe29186a3d9b0c591e71b7393f1ae08c83cb2d8e517d2a822b8f7ec99dfd8b"},
{file = "regex-2020.9.27-cp36-cp36m-win32.whl", hash = "sha256:4707f3695b34335afdfb09be3802c87fa0bc27030471dbc082f815f23688bc63"},
{file = "regex-2020.9.27-cp36-cp36m-win_amd64.whl", hash = "sha256:9bc13e0d20b97ffb07821aa3e113f9998e84994fe4d159ffa3d3a9d1b805043b"},
{file = "regex-2020.9.27-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f1b3afc574a3db3b25c89161059d857bd4909a1269b0b3cb3c904677c8c4a3f7"},
{file = "regex-2020.9.27-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5533a959a1748a5c042a6da71fe9267a908e21eded7a4f373efd23a2cbdb0ecc"},
{file = "regex-2020.9.27-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:1fe0a41437bbd06063aa184c34804efa886bcc128222e9916310c92cd54c3b4c"},
{file = "regex-2020.9.27-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:c570f6fa14b9c4c8a4924aaad354652366577b4f98213cf76305067144f7b100"},
{file = "regex-2020.9.27-cp37-cp37m-win32.whl", hash = "sha256:eda4771e0ace7f67f58bc5b560e27fb20f32a148cbc993b0c3835970935c2707"},
{file = "regex-2020.9.27-cp37-cp37m-win_amd64.whl", hash = "sha256:60b0e9e6dc45683e569ec37c55ac20c582973841927a85f2d8a7d20ee80216ab"},
{file = "regex-2020.9.27-cp38-cp38-manylinux1_i686.whl", hash = "sha256:088afc8c63e7bd187a3c70a94b9e50ab3f17e1d3f52a32750b5b77dbe99ef5ef"},
{file = "regex-2020.9.27-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eaf548d117b6737df379fdd53bdde4f08870e66d7ea653e230477f071f861121"},
{file = "regex-2020.9.27-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:41bb65f54bba392643557e617316d0d899ed5b4946dccee1cb6696152b29844b"},
{file = "regex-2020.9.27-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8d69cef61fa50c8133382e61fd97439de1ae623fe943578e477e76a9d9471637"},
{file = "regex-2020.9.27-cp38-cp38-win32.whl", hash = "sha256:f2388013e68e750eaa16ccbea62d4130180c26abb1d8e5d584b9baf69672b30f"},
{file = "regex-2020.9.27-cp38-cp38-win_amd64.whl", hash = "sha256:4318d56bccfe7d43e5addb272406ade7a2274da4b70eb15922a071c58ab0108c"},
{file = "regex-2020.9.27-cp39-cp39-manylinux1_i686.whl", hash = "sha256:84cada8effefe9a9f53f9b0d2ba9b7b6f5edf8d2155f9fdbe34616e06ececf81"},
{file = "regex-2020.9.27-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:816064fc915796ea1f26966163f6845de5af78923dfcecf6551e095f00983650"},
{file = "regex-2020.9.27-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:5d892a4f1c999834eaa3c32bc9e8b976c5825116cde553928c4c8e7e48ebda67"},
{file = "regex-2020.9.27-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c9443124c67b1515e4fe0bb0aa18df640965e1030f468a2a5dc2589b26d130ad"},
{file = "regex-2020.9.27-cp39-cp39-win32.whl", hash = "sha256:49f23ebd5ac073765ecbcf046edc10d63dcab2f4ae2bce160982cb30df0c0302"},
{file = "regex-2020.9.27-cp39-cp39-win_amd64.whl", hash = "sha256:3d20024a70b97b4f9546696cbf2fd30bae5f42229fbddf8661261b1eaff0deb7"},
{file = "regex-2020.9.27.tar.gz", hash = "sha256:a6f32aea4260dfe0e55dc9733ea162ea38f0ea86aa7d0f77b15beac5bf7b369d"},
]
reportlab = [
{file = "reportlab-3.5.53-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:73bc92579692609837fb13f271f7436fdb7b6ddebb9e10185452d45814c365c3"},
{file = "reportlab-3.5.53-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b727050ec5dfc4baeded07199d4640156f360ff4624b0194d8e91b234fc0c26b"},
@ -1990,46 +1989,18 @@ toml = [
{file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"},
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
]
typed-ast = [
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"},
{file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"},
{file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"},
{file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"},
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"},
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"},
{file = "typed_ast-1.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fcf135e17cc74dbfbc05894ebca928ffeb23d9790b3167a674921db19082401f"},
{file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"},
{file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"},
{file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"},
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"},
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"},
{file = "typed_ast-1.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f208eb7aff048f6bea9586e61af041ddf7f9ade7caed625742af423f6bae3298"},
{file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"},
{file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"},
{file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"},
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"},
{file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"},
{file = "typed_ast-1.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7e4c9d7658aaa1fc80018593abdf8598bf91325af6af5cce4ce7c73bc45ea53d"},
{file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"},
{file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"},
{file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"},
{file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"},
{file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"},
{file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"},
{file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"},
{file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"},
{file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"},
{file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
tomli = [
{file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
{file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
]
typer = [
{file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"},
{file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"},
]
typing-extensions = [
{file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
{file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"},
{file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"},
{file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
{file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
{file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
]
uvicorn = [
{file = "uvicorn-0.13.4-py3-none-any.whl", hash = "sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524"},

View file

@ -56,10 +56,10 @@ xmltodict = "^0.12.0"
[tool.poetry.dev-dependencies]
bandit = "^1.6.2"
black = "^19.10b0"
black = "^21.12b0"
flake8 = "^3.8"
flake8-bandit = "^2.1.2"
flake8-black = "^0.1.1"
flake8-black = "^0.2.2"
flake8-breakpoint = "^1.1.0"
flake8-bugbear = "^20.1.0"
flake8-builtins = "^1.4.2"