fix linter messages

This commit is contained in:
Jeff Epler 2023-12-04 19:10:06 -06:00
parent cdac5f90e5
commit 556b997ae4
No known key found for this signature in database
GPG key ID: D5BF15AB975AB4DE
2 changed files with 40 additions and 18 deletions

View file

@ -1,3 +1,7 @@
# SPDX-FileCopyrightText: 2023 Jeff Epler
#
# SPDX-License-Identifier: MIT
textual
pyperclip
pyotp

View file

@ -12,7 +12,7 @@ import pathlib
import subprocess
from urllib.parse import parse_qsl, unquote, urlparse
import re
from typing import TYPE_CHECKING, Dict, Any, Sequence, cast
from typing import TYPE_CHECKING, Any, Sequence, cast
from textual.app import App, ComposeResult
from textual.widget import Widget
@ -29,19 +29,26 @@ import tomllib
# workaround for pyperclip being un-typed
if TYPE_CHECKING:
def pyperclip_paste() -> str: ...
def pyperclip_copy(data: str) -> None: ...
def pyperclip_paste() -> str:
...
def pyperclip_copy(data: str) -> None:
...
else:
from pyperclip import paste as pyperclip_paste
from pyperclip import copy as pyperclip_copy
from typing import TypeGuard # use `typing_extensions` for Python 3.9 and below
def is_str_list(val: Any) -> TypeGuard[list[str]]:
"""Determines whether all objects in the list are strings"""
if not isinstance(val, list): return False
if not isinstance(val, list):
return False
return all(isinstance(x, str) for x in val)
# Copied from pyotp with the issuer mismatch check removed and HTOP support removed
def parse_uri(uri: str) -> pyotp.TOTP:
"""
@ -58,7 +65,7 @@ def parse_uri(uri: str) -> pyotp.TOTP:
secret = None
# Data we'll parse to the correct constructor
otp_data = {} # type: Dict[str, Any]
otp_data: dict[str, Any] = {}
# Parse with URLlib
parsed_uri = urlparse(unquote(uri))
@ -131,7 +138,8 @@ class TOTPLabel(Label, can_focus=True):
super().__init__(
f"{otp.totp.name} / {otp.totp.issuer}",
classes=f"otp-name otp-name-{otp.id} otp-{otp.id}",
expand=True)
expand=True,
)
@property
def css_class(self) -> str:
@ -141,7 +149,7 @@ class TOTPLabel(Label, can_focus=True):
raise RuntimeError("Class not found")
@property
def related(self, arg:str="") -> DOMQuery[Widget]:
def related(self, arg: str = "") -> DOMQuery[Widget]:
return self.screen.query(f".{self.css_class}{arg}")
def related_remove_class(self, cls: str) -> None:
@ -152,11 +160,13 @@ class TOTPLabel(Label, can_focus=True):
for widget in self.related:
widget.add_class(cls)
class TOTPButton(Button, can_focus=False):
def __init__(self, otp: "OTPData", label: str, classes: str):
def __init__(self, otp: "TOTPData", label: str, classes: str):
self.otp = otp
super().__init__(label=label, classes=classes)
@dataclass
class TOTPData:
totp: pyotp.TOTP
@ -173,14 +183,16 @@ class TOTPData:
def __post_init__(self) -> None:
self.name_widget = TOTPLabel(self)
self.copy_widget = TOTPButton(self, "🗐 ",
classes=f"otp-copy otp-copy-{self.id} otp-{self.id}")
self.show_widget = TOTPButton(self, "👀",
classes=f"otp-show otp-show-{self.id} otp-{self.id}")
self.copy_widget = TOTPButton(
self, "🗐 ", classes=f"otp-copy otp-copy-{self.id} otp-{self.id}"
)
self.show_widget = TOTPButton(
self, "👀", classes=f"otp-show otp-show-{self.id} otp-{self.id}"
)
self.value_widget = Label(
"*" * self.totp.digits,
classes=f"otp-value otp-value-{self.id} otp-{self.id}",
expand=True
expand=True,
)
self.progress_widget = ProgressBar(
classes=f"otp-progress otp-progress-{self.id} otp-{self.id}",
@ -198,7 +210,13 @@ class TOTPData:
@property
def widgets(self) -> Sequence[Widget]:
return self.value_widget, self.name_widget, self.copy_widget, self.show_widget, self.progress_widget
return (
self.value_widget,
self.name_widget,
self.copy_widget,
self.show_widget,
self.progress_widget,
)
class TTOTP(App[None]):
@ -222,7 +240,7 @@ class TTOTP(App[None]):
self.otp_data: list[TOTPData] = []
self.timer: Timer | None = None
self.clear_clipboard_time: Timer | None = None
self.copied = ''
self.copied = ""
def on_mount(self) -> None:
self.timer_func()
@ -268,10 +286,10 @@ class TTOTP(App[None]):
self.notify("Code copied", title="")
def on_button_pressed(self, event):
button = event.button
def on_button_pressed(self, event: Button.Pressed) -> None:
button = cast(TOTPButton, event.button)
self.screen.set_focus(button.otp.name_widget)
if 'otp-show' in button.classes:
if "otp-show" in button.classes:
self.action_show()
else:
self.action_copy()