diff --git a/hyperglass/api/error_handlers.py b/hyperglass/api/error_handlers.py index fbf8df9..01886a2 100644 --- a/hyperglass/api/error_handlers.py +++ b/hyperglass/api/error_handlers.py @@ -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, ) diff --git a/hyperglass/api/routes.py b/hyperglass/api/routes.py index b41ee04..3ed0aa9 100644 --- a/hyperglass/api/routes.py +++ b/hyperglass/api/routes.py @@ -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") diff --git a/hyperglass/compat/_sshtunnel.py b/hyperglass/compat/_sshtunnel.py index e3274e4..f370327 100644 --- a/hyperglass/compat/_sshtunnel.py +++ b/hyperglass/compat/_sshtunnel.py @@ -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) @@ -1170,7 +1184,7 @@ class SSHTunnelForwarder: def check_tunnels(self) -> None: """Check that if all tunnels are established and populates. - + :attr:`.tunnel_is_up` """ for _srv in self._server_list: @@ -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 diff --git a/hyperglass/configuration/validate.py b/hyperglass/configuration/validate.py index aa59619..5379283 100644 --- a/hyperglass/configuration/validate.py +++ b/hyperglass/configuration/validate.py @@ -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__) diff --git a/hyperglass/exceptions/public.py b/hyperglass/exceptions/public.py index 8126b58..f32bc1d 100644 --- a/hyperglass/exceptions/public.py +++ b/hyperglass/exceptions/public.py @@ -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.""" diff --git a/hyperglass/execution/drivers/_construct.py b/hyperglass/execution/drivers/_construct.py index 0327776..2c075da 100644 --- a/hyperglass/execution/drivers/_construct.py +++ b/hyperglass/execution/drivers/_construct.py @@ -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 diff --git a/hyperglass/external/webhooks.py b/hyperglass/external/webhooks.py index a9275ab..6653be2 100644 --- a/hyperglass/external/webhooks.py +++ b/hyperglass/external/webhooks.py @@ -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(), ) diff --git a/hyperglass/log.py b/hyperglass/log.py index 30a2487..3cb2180 100644 --- a/hyperglass/log.py +++ b/hyperglass/log.py @@ -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), ) diff --git a/hyperglass/main.py b/hyperglass/main.py index cf58629..ff00609 100644 --- a/hyperglass/main.py +++ b/hyperglass/main.py @@ -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, ) diff --git a/hyperglass/models/api/validators.py b/hyperglass/models/api/validators.py index 5def824..ef21f20 100644 --- a/hyperglass/models/api/validators.py +++ b/hyperglass/models/api/validators.py @@ -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) diff --git a/hyperglass/models/commands/_mikrotik_base.py b/hyperglass/models/commands/_mikrotik_base.py index 86ac480..39e1877 100644 --- a/hyperglass/models/commands/_mikrotik_base.py +++ b/hyperglass/models/commands/_mikrotik_base.py @@ -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): diff --git a/hyperglass/models/commands/cisco_ios.py b/hyperglass/models/commands/cisco_ios.py index e3af34a..7cc9da1 100644 --- a/hyperglass/models/commands/cisco_ios.py +++ b/hyperglass/models/commands/cisco_ios.py @@ -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): diff --git a/hyperglass/models/commands/huawei.py b/hyperglass/models/commands/huawei.py index eea35d1..480cc2f 100644 --- a/hyperglass/models/commands/huawei.py +++ b/hyperglass/models/commands/huawei.py @@ -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}" diff --git a/hyperglass/models/commands/juniper.py b/hyperglass/models/commands/juniper.py index c0091cc..c4e8c51 100644 --- a/hyperglass/models/commands/juniper.py +++ b/hyperglass/models/commands/juniper.py @@ -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( diff --git a/hyperglass/models/commands/tnsr.py b/hyperglass/models/commands/tnsr.py index 755a79d..c605b0a 100644 --- a/hyperglass/models/commands/tnsr.py +++ b/hyperglass/models/commands/tnsr.py @@ -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}" diff --git a/hyperglass/models/config/docs.py b/hyperglass/models/config/docs.py index 2c04343..abb2883 100644 --- a/hyperglass/models/config/docs.py +++ b/hyperglass/models/config/docs.py @@ -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", diff --git a/hyperglass/models/config/params.py b/hyperglass/models/config/params.py index 303d314..681ef49 100644 --- a/hyperglass/models/config/params.py +++ b/hyperglass/models/config/params.py @@ -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] = [] diff --git a/hyperglass/models/config/queries.py b/hyperglass/models/config/queries.py index e589bfa..90aaa0c 100644 --- a/hyperglass/models/config/queries.py +++ b/hyperglass/models/config/queries.py @@ -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", diff --git a/hyperglass/models/parsing/arista_eos.py b/hyperglass/models/parsing/arista_eos.py index 409ead4..3a04ce6 100644 --- a/hyperglass/models/parsing/arista_eos.py +++ b/hyperglass/models/parsing/arista_eos.py @@ -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) diff --git a/hyperglass/models/parsing/frr.py b/hyperglass/models/parsing/frr.py index 08162af..0014955 100644 --- a/hyperglass/models/parsing/frr.py +++ b/hyperglass/models/parsing/frr.py @@ -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) diff --git a/hyperglass/models/system.py b/hyperglass/models/system.py index e6df93f..1cd326e 100644 --- a/hyperglass/models/system.py +++ b/hyperglass/models/system.py @@ -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 diff --git a/hyperglass/plugins/_manager.py b/hyperglass/plugins/_manager.py index 216f406..9c566cc 100644 --- a/hyperglass/plugins/_manager.py +++ b/hyperglass/plugins/_manager.py @@ -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 diff --git a/hyperglass/state/redis.py b/hyperglass/state/redis.py index 62b0356..5aacf79 100644 --- a/hyperglass/state/redis.py +++ b/hyperglass/state/redis.py @@ -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, ) diff --git a/hyperglass/util/__init__.py b/hyperglass/util/__init__.py index 017202c..16ba04c 100644 --- a/hyperglass/util/__init__.py +++ b/hyperglass/util/__init__.py @@ -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 diff --git a/hyperglass/util/frontend.py b/hyperglass/util/frontend.py index b9f8d6f..430ceb3 100644 --- a/hyperglass/util/frontend.py +++ b/hyperglass/util/frontend.py @@ -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: diff --git a/poetry.lock b/poetry.lock index a5d7c7c..bd20c3d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -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"}, diff --git a/pyproject.toml b/pyproject.toml index a12e957..d9b0a5e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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"