forked from mirrors/thatmattlove-hyperglass
Update black
This commit is contained in:
parent
ec28ccafbc
commit
c049569cab
27 changed files with 236 additions and 158 deletions
|
|
@ -20,7 +20,8 @@ async def http_handler(request, exc):
|
||||||
"""Handle web server errors."""
|
"""Handle web server errors."""
|
||||||
|
|
||||||
return JSONResponse(
|
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."""
|
"""Handle Pydantic validation errors raised by FastAPI."""
|
||||||
error = exc.errors()[0]
|
error = exc.errors()[0]
|
||||||
return JSONResponse(
|
return JSONResponse(
|
||||||
{"output": error["msg"], "level": "error", "keywords": error["loc"]}, status_code=422,
|
{"output": error["msg"], "level": "error", "keywords": error["loc"]},
|
||||||
|
status_code=422,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,9 @@ def get_ui_params():
|
||||||
|
|
||||||
|
|
||||||
async def send_webhook(
|
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."""
|
"""If webhooks are enabled, get request info and send a webhook."""
|
||||||
params = use_state("params")
|
params = use_state("params")
|
||||||
|
|
|
||||||
|
|
@ -168,7 +168,7 @@ def get_connection_id():
|
||||||
|
|
||||||
|
|
||||||
def _remove_none_values(dictionary):
|
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]))
|
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):
|
class BaseSSHTunnelForwarderError(Exception):
|
||||||
""" Exception raised by :class:`SSHTunnelForwarder` errors """
|
"""Exception raised by :class:`SSHTunnelForwarder` errors"""
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.value = kwargs.pop("value", args[0] if args else "")
|
self.value = kwargs.pop("value", args[0] if args else "")
|
||||||
|
|
@ -190,7 +190,7 @@ class BaseSSHTunnelForwarderError(Exception):
|
||||||
|
|
||||||
|
|
||||||
class HandlerSSHTunnelForwarderError(BaseSSHTunnelForwarderError):
|
class HandlerSSHTunnelForwarderError(BaseSSHTunnelForwarderError):
|
||||||
""" Exception for Tunnel forwarder errors """
|
"""Exception for Tunnel forwarder errors"""
|
||||||
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -203,7 +203,7 @@ class HandlerSSHTunnelForwarderError(BaseSSHTunnelForwarderError):
|
||||||
|
|
||||||
|
|
||||||
class _ForwardHandler(socketserver.BaseRequestHandler):
|
class _ForwardHandler(socketserver.BaseRequestHandler):
|
||||||
""" Base handler for tunnel connections """
|
"""Base handler for tunnel connections"""
|
||||||
|
|
||||||
remote_address = None
|
remote_address = None
|
||||||
ssh_transport = None
|
ssh_transport = None
|
||||||
|
|
@ -227,7 +227,9 @@ class _ForwardHandler(socketserver.BaseRequestHandler):
|
||||||
if not chan.recv_ready():
|
if not chan.recv_ready():
|
||||||
break
|
break
|
||||||
data = chan.recv(1024)
|
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)
|
self.request.sendall(data)
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
|
|
@ -687,7 +689,11 @@ class SSHTunnelForwarder:
|
||||||
else:
|
else:
|
||||||
forward_maker_class = self._make_ssh_forward_server_class
|
forward_maker_class = self._make_ssh_forward_server_class
|
||||||
_Server = forward_maker_class(remote_address)
|
_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:
|
if ssh_forward_server:
|
||||||
ssh_forward_server.daemon_threads = self.daemon_forward_servers
|
ssh_forward_server.daemon_threads = self.daemon_forward_servers
|
||||||
|
|
@ -699,7 +705,8 @@ class SSHTunnelForwarder:
|
||||||
"Problem setting up ssh {0} <> {1} forwarder. You can "
|
"Problem setting up ssh {0} <> {1} forwarder. You can "
|
||||||
"suppress this exception by using the `mute_exceptions`"
|
"suppress this exception by using the `mute_exceptions`"
|
||||||
"argument".format(
|
"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:
|
except IOError:
|
||||||
|
|
@ -969,7 +976,9 @@ class SSHTunnelForwarder:
|
||||||
- ``paramiko.Pkey`` - it will be transparently added to loaded keys
|
- ``paramiko.Pkey`` - it will be transparently added to loaded keys
|
||||||
"""
|
"""
|
||||||
ssh_loaded_pkeys = SSHTunnelForwarder.get_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):
|
if isinstance(ssh_pkey, str):
|
||||||
|
|
@ -1109,7 +1118,12 @@ class SSHTunnelForwarder:
|
||||||
for pkey_class in (
|
for pkey_class in (
|
||||||
(key_type,)
|
(key_type,)
|
||||||
if key_type
|
if key_type
|
||||||
else (paramiko.RSAKey, paramiko.DSSKey, paramiko.ECDSAKey, paramiko.Ed25519Key,)
|
else (
|
||||||
|
paramiko.RSAKey,
|
||||||
|
paramiko.DSSKey,
|
||||||
|
paramiko.ECDSAKey,
|
||||||
|
paramiko.Ed25519Key,
|
||||||
|
)
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
ssh_pkey = pkey_class.from_private_key_file(pkey_file, password=pkey_password)
|
ssh_pkey = pkey_class.from_private_key_file(pkey_file, password=pkey_password)
|
||||||
|
|
@ -1170,7 +1184,7 @@ class SSHTunnelForwarder:
|
||||||
|
|
||||||
def check_tunnels(self) -> None:
|
def check_tunnels(self) -> None:
|
||||||
"""Check that if all tunnels are established and populates.
|
"""Check that if all tunnels are established and populates.
|
||||||
|
|
||||||
:attr:`.tunnel_is_up`
|
:attr:`.tunnel_is_up`
|
||||||
"""
|
"""
|
||||||
for _srv in self._server_list:
|
for _srv in self._server_list:
|
||||||
|
|
@ -1184,7 +1198,8 @@ class SSHTunnelForwarder:
|
||||||
self._create_tunnels()
|
self._create_tunnels()
|
||||||
if not self.is_active:
|
if not self.is_active:
|
||||||
self._raise(
|
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:
|
for _srv in self._server_list:
|
||||||
thread = threading.Thread(
|
thread = threading.Thread(
|
||||||
|
|
@ -1198,7 +1213,8 @@ class SSHTunnelForwarder:
|
||||||
self.is_alive = any(self.tunnel_is_up.values())
|
self.is_alive = any(self.tunnel_is_up.values())
|
||||||
if not self.is_alive:
|
if not self.is_alive:
|
||||||
self._raise(
|
self._raise(
|
||||||
HandlerSSHTunnelForwarderError, "An error occurred while opening tunnels.",
|
HandlerSSHTunnelForwarderError,
|
||||||
|
"An error occurred while opening tunnels.",
|
||||||
)
|
)
|
||||||
|
|
||||||
def stop(self) -> None:
|
def stop(self) -> None:
|
||||||
|
|
@ -1386,7 +1402,7 @@ class SSHTunnelForwarder:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_active(self) -> bool:
|
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():
|
if "_transport" in self.__dict__ and self._transport.is_active():
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,8 @@ def init_params() -> "Params":
|
||||||
# Set up syslog logging if enabled.
|
# Set up syslog logging if enabled.
|
||||||
if params.logging.syslog is not None and params.logging.syslog.enable:
|
if params.logging.syslog is not None and params.logging.syslog.enable:
|
||||||
enable_syslog_logging(
|
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:
|
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__
|
from hyperglass.constants import PARSED_RESPONSE_FIELDS, __version__
|
||||||
|
|
||||||
content_greeting = get_markdown(
|
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__)
|
content_credit = CREDIT.format(version=__version__)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,9 @@ if TYPE_CHECKING:
|
||||||
|
|
||||||
|
|
||||||
class ScrapeError(
|
class ScrapeError(
|
||||||
PublicHyperglassError, template=MESSAGES.connection_error, level="danger",
|
PublicHyperglassError,
|
||||||
|
template=MESSAGES.connection_error,
|
||||||
|
level="danger",
|
||||||
):
|
):
|
||||||
"""Raised when an SSH driver error occurs."""
|
"""Raised when an SSH driver error occurs."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,9 @@ class Construct:
|
||||||
def __init__(self, device: "Device", query: "Query"):
|
def __init__(self, device: "Device", query: "Query"):
|
||||||
"""Initialize command construction."""
|
"""Initialize command construction."""
|
||||||
log.debug(
|
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.query = query
|
||||||
self.device = device
|
self.device = device
|
||||||
|
|
|
||||||
3
hyperglass/external/webhooks.py
vendored
3
hyperglass/external/webhooks.py
vendored
|
|
@ -24,5 +24,6 @@ class Webhook(BaseExternal):
|
||||||
return provider_class(config)
|
return provider_class(config)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise UnsupportedError(
|
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(),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -229,8 +229,12 @@ def enable_syslog_logging(syslog_host: str, syslog_port: int) -> None:
|
||||||
from logging.handlers import SysLogHandler
|
from logging.handlers import SysLogHandler
|
||||||
|
|
||||||
_loguru_logger.add(
|
_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(
|
log.debug(
|
||||||
"Logging to syslog target {}:{} enabled", str(syslog_host), str(syslog_port),
|
"Logging to syslog target {}:{} enabled",
|
||||||
|
str(syslog_host),
|
||||||
|
str(syslog_port),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,8 @@ def register_all_plugins() -> None:
|
||||||
|
|
||||||
for failure in failures:
|
for failure in failures:
|
||||||
log.warning(
|
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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
|
||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise InputInvalid(
|
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:
|
# 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.
|
# ...and returns an error if so.
|
||||||
if valid_ip.is_reserved or valid_ip.is_unspecified or valid_ip.is_loopback:
|
if valid_ip.is_reserved or valid_ip.is_unspecified or valid_ip.is_loopback:
|
||||||
raise InputInvalid(
|
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
|
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
|
new_ip = valid_ip.network_address
|
||||||
|
|
||||||
log.debug(
|
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
|
valid_ip = new_ip
|
||||||
|
|
@ -121,7 +128,9 @@ def validate_ip(value, query_type, query_vrf): # noqa: C901
|
||||||
|
|
||||||
if containing_prefix is None:
|
if containing_prefix is None:
|
||||||
log.error(
|
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)
|
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:
|
except ValueError as err:
|
||||||
log.error(
|
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)
|
raise InputInvalid("{q} does does not have a containing prefix", q=valid_ip)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,9 @@ class _IPv4(CommandSet):
|
||||||
bgp_aspath: StrictStr = "ip route print where bgp-as-path={target}"
|
bgp_aspath: StrictStr = "ip route print where bgp-as-path={target}"
|
||||||
bgp_route: StrictStr = "ip route print where dst-address={target}"
|
bgp_route: StrictStr = "ip route print where dst-address={target}"
|
||||||
ping: StrictStr = "ping src-address={source} count=5 {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):
|
class _IPv6(CommandSet):
|
||||||
|
|
@ -24,7 +26,9 @@ class _IPv6(CommandSet):
|
||||||
bgp_aspath: StrictStr = "ipv6 route print where bgp-as-path={target}"
|
bgp_aspath: StrictStr = "ipv6 route print where bgp-as-path={target}"
|
||||||
bgp_route: StrictStr = "ipv6 route print where dst-address={target}"
|
bgp_route: StrictStr = "ipv6 route print where dst-address={target}"
|
||||||
ping: StrictStr = "ping src-address={source} count=5 {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):
|
class _VPNIPv4(CommandSet):
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ class _IPv6(CommandSet):
|
||||||
bgp_aspath: StrictStr = 'show bgp ipv6 unicast quote-regexp "{target}"'
|
bgp_aspath: StrictStr = 'show bgp ipv6 unicast quote-regexp "{target}"'
|
||||||
bgp_route: StrictStr = "show bgp ipv6 unicast {target} | exclude pathid:|Epoch"
|
bgp_route: StrictStr = "show bgp ipv6 unicast {target} | exclude pathid:|Epoch"
|
||||||
ping: StrictStr = "ping ipv6 {target} repeat 5 source {source}"
|
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):
|
class _VPNIPv4(CommandSet):
|
||||||
|
|
@ -34,7 +34,7 @@ class _VPNIPv4(CommandSet):
|
||||||
bgp_aspath: StrictStr = 'show bgp vpnv4 unicast vrf {vrf} quote-regexp "{target}"'
|
bgp_aspath: StrictStr = 'show bgp vpnv4 unicast vrf {vrf} quote-regexp "{target}"'
|
||||||
bgp_route: StrictStr = "show bgp vpnv4 unicast vrf {vrf} {target}"
|
bgp_route: StrictStr = "show bgp vpnv4 unicast vrf {vrf} {target}"
|
||||||
ping: StrictStr = "ping vrf {vrf} {target} repeat 5 source {source}"
|
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):
|
class _VPNIPv6(CommandSet):
|
||||||
|
|
@ -44,7 +44,7 @@ class _VPNIPv6(CommandSet):
|
||||||
bgp_aspath: StrictStr = 'show bgp vpnv6 unicast vrf {vrf} quote-regexp "{target}"'
|
bgp_aspath: StrictStr = 'show bgp vpnv6 unicast vrf {vrf} quote-regexp "{target}"'
|
||||||
bgp_route: StrictStr = "show bgp vpnv6 unicast vrf {vrf} {target}"
|
bgp_route: StrictStr = "show bgp vpnv6 unicast vrf {vrf} {target}"
|
||||||
ping: StrictStr = "ping vrf {vrf} {target} repeat 5 source {source}"
|
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):
|
class CiscoIOSCommands(CommandGroup):
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,12 @@ class _IPv6(CommandSet):
|
||||||
class _VPNIPv4(CommandSet):
|
class _VPNIPv4(CommandSet):
|
||||||
"""Default commands for dual afi commands."""
|
"""Default commands for dual afi commands."""
|
||||||
|
|
||||||
bgp_community: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
|
bgp_community: StrictStr = (
|
||||||
bgp_aspath: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table regular-expression {target}"
|
"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}"
|
bgp_route: StrictStr = "display bgp vpnv4 vpn-instance {vrf} routing-table {target}"
|
||||||
ping: StrictStr = "ping -vpn-instance {vrf} -c 5 -a {source} {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}"
|
traceroute: StrictStr = "tracert -q 2 -f 1 -vpn-instance {vrf} -a {source} {target}"
|
||||||
|
|
@ -40,8 +44,12 @@ class _VPNIPv4(CommandSet):
|
||||||
class _VPNIPv6(CommandSet):
|
class _VPNIPv6(CommandSet):
|
||||||
"""Default commands for dual afi commands."""
|
"""Default commands for dual afi commands."""
|
||||||
|
|
||||||
bgp_community: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
|
bgp_community: StrictStr = (
|
||||||
bgp_aspath: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table regular-expression {target}"
|
"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}"
|
bgp_route: StrictStr = "display bgp vpnv6 vpn-instance {vrf} routing-table {target}"
|
||||||
ping: StrictStr = "ping vpnv6 vpn-instance {vrf} -c 5 -a {source} {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}"
|
traceroute: StrictStr = "tracert -q 2 -f 1 vpn-instance {vrf} -a {source} {target}"
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,9 @@ class _VPNIPv6(CommandSet):
|
||||||
bgp_aspath: StrictStr = 'show route protocol bgp table {vrf}.inet6.0 aspath-regex "{target}"'
|
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}"
|
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}"
|
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(
|
_structured = CommandGroup(
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,9 @@ from .common import CommandSet, CommandGroup
|
||||||
class _IPv4(CommandSet):
|
class _IPv4(CommandSet):
|
||||||
"""Validation model for default VRF IPv4 commands."""
|
"""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_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}"'
|
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv4 unicast {target}"'
|
||||||
ping: StrictStr = "ping {target} ipv4 source {source} count 5 timeout 1"
|
ping: StrictStr = "ping {target} ipv4 source {source} count 5 timeout 1"
|
||||||
|
|
@ -20,7 +22,9 @@ class _IPv4(CommandSet):
|
||||||
class _IPv6(CommandSet):
|
class _IPv6(CommandSet):
|
||||||
"""Validation model for default VRF IPv6 commands."""
|
"""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_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}"'
|
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp ipv6 unicast {target}"'
|
||||||
ping: StrictStr = "ping {target} ipv6 source {source} count 5 timeout 1"
|
ping: StrictStr = "ping {target} ipv6 source {source} count 5 timeout 1"
|
||||||
|
|
@ -30,9 +34,15 @@ class _IPv6(CommandSet):
|
||||||
class _VPNIPv4(CommandSet):
|
class _VPNIPv4(CommandSet):
|
||||||
"""Validation model for non-default ipv6 commands."""
|
"""Validation model for non-default ipv6 commands."""
|
||||||
|
|
||||||
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast community {target}"'
|
bgp_community: StrictStr = (
|
||||||
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast regexp {target}"'
|
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast community {target}"'
|
||||||
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv4 unicast {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}"
|
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}"
|
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):
|
class _VPNIPv6(CommandSet):
|
||||||
"""Validation model for non-default ipv6 commands."""
|
"""Validation model for non-default ipv6 commands."""
|
||||||
|
|
||||||
bgp_community: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast community {target}"'
|
bgp_community: StrictStr = (
|
||||||
bgp_aspath: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast regexp {target}"'
|
'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast community {target}"'
|
||||||
bgp_route: StrictStr = 'dataplane shell sudo vtysh -c "show bgp vrf {vrf} ipv6 unicast {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}"
|
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}"
|
traceroute: StrictStr = "dataplane shell traceroute -6 -w 1 -q 1 -i {vrf} -s {source} {target}"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,9 @@ class EndpointConfig(HyperglassModel):
|
||||||
description="Displayed inside each API endpoint section.",
|
description="Displayed inside each API endpoint section.",
|
||||||
)
|
)
|
||||||
summary: StrictStr = Field(
|
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).",
|
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(
|
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(
|
uri: AnyUri = Field(
|
||||||
"/api/docs",
|
"/api/docs",
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,9 @@ class Params(ParamsPublic, HyperglassModel):
|
||||||
description="Allowed CORS hosts. By default, no CORS hosts are allowed.",
|
description="Allowed CORS hosts. By default, no CORS hosts are allowed.",
|
||||||
)
|
)
|
||||||
netmiko_delay_factor: IntFloat = Field(
|
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] = []
|
plugins: List[StrictStr] = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,9 @@ class BgpCommunity(HyperglassModel):
|
||||||
"""Validation model for bgp_community configuration."""
|
"""Validation model for bgp_community configuration."""
|
||||||
|
|
||||||
enable: StrictBool = Field(
|
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(
|
display_name: StrictStr = Field(
|
||||||
"BGP Community",
|
"BGP Community",
|
||||||
|
|
@ -109,7 +111,9 @@ class BgpAsPath(HyperglassModel):
|
||||||
"""Validation model for bgp_aspath configuration."""
|
"""Validation model for bgp_aspath configuration."""
|
||||||
|
|
||||||
enable: StrictBool = Field(
|
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(
|
display_name: StrictStr = Field(
|
||||||
"BGP AS Path",
|
"BGP AS Path",
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,10 @@ class AristaRoute(_AristaBase):
|
||||||
)
|
)
|
||||||
|
|
||||||
serialized = BGPRouteTable(
|
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)
|
log.debug("Serialized Arista response: {}", serialized)
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,10 @@ class FRRRoute(_FRRBase):
|
||||||
)
|
)
|
||||||
|
|
||||||
serialized = BGPRouteTable(
|
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)
|
log.info("Serialized FRR response: {}", serialized)
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,9 @@ class HyperglassSettings(BaseSettings):
|
||||||
password = values.get("redis_password")
|
password = values.get("redis_password")
|
||||||
if password is not None:
|
if password is not None:
|
||||||
dsn = "redis://:{}@{}/{!s}".format(
|
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 dsn
|
||||||
return value
|
return value
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,9 @@ class PluginManager(t.Generic[PluginT]):
|
||||||
|
|
||||||
# Sort with built-in plugins last.
|
# Sort with built-in plugins last.
|
||||||
return sorted(
|
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
|
@property
|
||||||
|
|
|
||||||
|
|
@ -180,5 +180,7 @@ class RedisManager:
|
||||||
)
|
)
|
||||||
|
|
||||||
return RedisManagerPipeline(
|
return RedisManagerPipeline(
|
||||||
parent=self.instance, instance=self.instance.pipeline(), namespace=self.namespace,
|
parent=self.instance,
|
||||||
|
instance=self.instance.pipeline(),
|
||||||
|
namespace=self.namespace,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -245,7 +245,10 @@ def deep_convert_keys(_dict: t.Type[DeepConvert], predicate: t.Callable[[str], s
|
||||||
return converted
|
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."""
|
"""Get a number value that is at least a specified minimum."""
|
||||||
if value < minimum:
|
if value < minimum:
|
||||||
return minimum
|
return minimum
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,11 @@ async def build_ui(app_path: Path):
|
||||||
|
|
||||||
|
|
||||||
def generate_opengraph(
|
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."""
|
"""Generate an OpenGraph compliant image."""
|
||||||
# Third Party
|
# Third Party
|
||||||
|
|
@ -362,7 +366,11 @@ async def build_frontend( # noqa: C901
|
||||||
migrate_images(app_path, params)
|
migrate_images(app_path, params)
|
||||||
|
|
||||||
generate_opengraph(
|
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:
|
except Exception as err:
|
||||||
|
|
|
||||||
163
poetry.lock
generated
163
poetry.lock
generated
|
|
@ -97,23 +97,29 @@ typecheck = ["mypy"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "black"
|
name = "black"
|
||||||
version = "19.10b0"
|
version = "21.12b0"
|
||||||
description = "The uncompromising code formatter."
|
description = "The uncompromising code formatter."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6.2"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
appdirs = "*"
|
click = ">=7.1.2"
|
||||||
attrs = ">=18.1.0"
|
mypy-extensions = ">=0.4.3"
|
||||||
click = ">=6.5"
|
pathspec = ">=0.9.0,<1"
|
||||||
pathspec = ">=0.6,<1"
|
platformdirs = ">=2"
|
||||||
regex = "*"
|
tomli = ">=0.2.6,<2.0.0"
|
||||||
toml = ">=0.9.4"
|
typing-extensions = [
|
||||||
typed-ast = ">=1.4.0"
|
{version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
|
||||||
|
{version = "!=3.10.0.1", markers = "python_version >= \"3.10\""},
|
||||||
|
]
|
||||||
|
|
||||||
[package.extras]
|
[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]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
|
|
@ -309,15 +315,16 @@ pycodestyle = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flake8-black"
|
name = "flake8-black"
|
||||||
version = "0.1.2"
|
version = "0.2.3"
|
||||||
description = "flake8 plugin to call black as a code style validator"
|
description = "flake8 plugin to call black as a code style validator"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
black = ">=19.3b0"
|
black = "*"
|
||||||
flake8 = ">=3.0.0"
|
flake8 = ">=3.0.0"
|
||||||
|
toml = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flake8-breakpoint"
|
name = "flake8-breakpoint"
|
||||||
|
|
@ -654,6 +661,14 @@ category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
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]]
|
[[package]]
|
||||||
name = "netmiko"
|
name = "netmiko"
|
||||||
version = "3.4.0"
|
version = "3.4.0"
|
||||||
|
|
@ -723,11 +738,11 @@ invoke = ["invoke (>=1.3)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pathspec"
|
name = "pathspec"
|
||||||
version = "0.8.0"
|
version = "0.9.0"
|
||||||
description = "Utility library for gitignore style pattern matching of file paths."
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
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]]
|
[[package]]
|
||||||
name = "pbr"
|
name = "pbr"
|
||||||
|
|
@ -756,6 +771,18 @@ category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
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]]
|
[[package]]
|
||||||
name = "pluggy"
|
name = "pluggy"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
|
@ -983,14 +1010,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
[package.extras]
|
[package.extras]
|
||||||
hiredis = ["hiredis (>=0.1.3)"]
|
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]]
|
[[package]]
|
||||||
name = "reportlab"
|
name = "reportlab"
|
||||||
version = "3.5.53"
|
version = "3.5.53"
|
||||||
|
|
@ -1196,12 +1215,12 @@ optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typed-ast"
|
name = "tomli"
|
||||||
version = "1.4.1"
|
version = "1.2.2"
|
||||||
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
description = "A lil' TOML parser"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typer"
|
name = "typer"
|
||||||
|
|
@ -1222,7 +1241,7 @@ test = ["shellingham (>=1.3.0,<2.0.0)", "pytest (>=4.4.0,<5.4.0)", "pytest-cov (
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "3.7.4.3"
|
version = "3.10.0.2"
|
||||||
description = "Backported and Experimental Type Hints for Python 3.5+"
|
description = "Backported and Experimental Type Hints for Python 3.5+"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
|
@ -1322,7 +1341,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = ">=3.8.1,<4.0"
|
python-versions = ">=3.8.1,<4.0"
|
||||||
content-hash = "ba2c36614f210b1e9a0fe576a7854bef0e03f678da7b7d5eba724cb794c7baf1"
|
content-hash = "9cf4f894339409dfed596d10a3e87b8b1da77062f6e8a3c877435f609c247cf2"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
aiofiles = [
|
aiofiles = [
|
||||||
|
|
@ -1363,8 +1382,8 @@ bcrypt = [
|
||||||
{file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"},
|
{file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"},
|
||||||
]
|
]
|
||||||
black = [
|
black = [
|
||||||
{file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"},
|
{file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"},
|
||||||
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
|
{file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"},
|
||||||
]
|
]
|
||||||
certifi = [
|
certifi = [
|
||||||
{file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
|
{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"},
|
{file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"},
|
||||||
]
|
]
|
||||||
flake8-black = [
|
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 = [
|
flake8-breakpoint = [
|
||||||
{file = "flake8-breakpoint-1.1.0.tar.gz", hash = "sha256:5bc70d478f0437a3655d094e1d2fca81ddacabaa84d99db45ad3630bf2004064"},
|
{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-py2.py3-none-any.whl", hash = "sha256:380cb14abf8fabf40e56df5c8b21a6d533dc5cbdcfe42406bbf08dda8f42e42a"},
|
||||||
{file = "mslex-0.3.0.tar.gz", hash = "sha256:4a1ac3f25025cad78ad2fe499dd16d42759f7a3801645399cce5c404415daa97"},
|
{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 = [
|
netmiko = [
|
||||||
{file = "netmiko-3.4.0-py3-none-any.whl", hash = "sha256:b66f25717db3609878f83c85604349dd40a0ab494d8eafd817dcde8388131136"},
|
{file = "netmiko-3.4.0-py3-none-any.whl", hash = "sha256:b66f25717db3609878f83c85604349dd40a0ab494d8eafd817dcde8388131136"},
|
||||||
{file = "netmiko-3.4.0.tar.gz", hash = "sha256:acadb9dd97864ee848e2032f1f0e301c7b31e7a4153757d98f5c8ba1b9614993"},
|
{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"},
|
{file = "paramiko-2.7.2.tar.gz", hash = "sha256:7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035"},
|
||||||
]
|
]
|
||||||
pathspec = [
|
pathspec = [
|
||||||
{file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"},
|
{file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
|
||||||
{file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"},
|
{file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
|
||||||
]
|
]
|
||||||
pbr = [
|
pbr = [
|
||||||
{file = "pbr-5.5.0-py2.py3-none-any.whl", hash = "sha256:5adc0f9fc64319d8df5ca1e4e06eea674c26b80e6f00c530b18ce6a6592ead15"},
|
{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-pp36-pypy36_pp73-win32.whl", hash = "sha256:25930fadde8019f374400f7986e8404c8b781ce519da27792cbe46eabec00c4d"},
|
||||||
{file = "Pillow-7.2.0.tar.gz", hash = "sha256:97f9e7953a77d5a70f49b9a48da7776dc51e9b738151b22dacf101641594a626"},
|
{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 = [
|
pluggy = [
|
||||||
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
||||||
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
{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-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"},
|
||||||
{file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"},
|
{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 = [
|
reportlab = [
|
||||||
{file = "reportlab-3.5.53-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:73bc92579692609837fb13f271f7436fdb7b6ddebb9e10185452d45814c365c3"},
|
{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"},
|
{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-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"},
|
||||||
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
|
{file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"},
|
||||||
]
|
]
|
||||||
typed-ast = [
|
tomli = [
|
||||||
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
|
{file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
|
||||||
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"},
|
{file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
|
||||||
{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"},
|
|
||||||
]
|
]
|
||||||
typer = [
|
typer = [
|
||||||
{file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"},
|
{file = "typer-0.4.0-py3-none-any.whl", hash = "sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338"},
|
||||||
{file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"},
|
{file = "typer-0.4.0.tar.gz", hash = "sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd"},
|
||||||
]
|
]
|
||||||
typing-extensions = [
|
typing-extensions = [
|
||||||
{file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
|
{file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"},
|
||||||
{file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"},
|
{file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"},
|
||||||
{file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"},
|
{file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"},
|
||||||
]
|
]
|
||||||
uvicorn = [
|
uvicorn = [
|
||||||
{file = "uvicorn-0.13.4-py3-none-any.whl", hash = "sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524"},
|
{file = "uvicorn-0.13.4-py3-none-any.whl", hash = "sha256:7587f7b08bd1efd2b9bad809a3d333e972f1d11af8a5e52a9371ee3a5de71524"},
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,10 @@ xmltodict = "^0.12.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
bandit = "^1.6.2"
|
bandit = "^1.6.2"
|
||||||
black = "^19.10b0"
|
black = "^21.12b0"
|
||||||
flake8 = "^3.8"
|
flake8 = "^3.8"
|
||||||
flake8-bandit = "^2.1.2"
|
flake8-bandit = "^2.1.2"
|
||||||
flake8-black = "^0.1.1"
|
flake8-black = "^0.2.2"
|
||||||
flake8-breakpoint = "^1.1.0"
|
flake8-breakpoint = "^1.1.0"
|
||||||
flake8-bugbear = "^20.1.0"
|
flake8-bugbear = "^20.1.0"
|
||||||
flake8-builtins = "^1.4.2"
|
flake8-builtins = "^1.4.2"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue