fix: clear the type checker and linter findings
flake8 reported 49 findings and pyright 10, and two of them were real bugs rather than matters of style. The rest were unused imports and four functions over the complexity limit. - Unlock a DOI folder with the id the DOI response carries, rather than an attribute the model does not have, which raised `AttributeError` on every locked DOI folder. - Size the `ls` Size column from the sub-folder on the row rather than from its parent, which pushed the later columns out of line. - Share the path resolution and the destination checks between `cp` and `mv`, and split the recursive download and the `ls` row printing, bringing all four functions under the complexity limit. - Accept a client built without a connection, which `config` and `version` rely on, and report the reason if one is then asked for. - Declare the config protocol's constructor for the type checker alone, so the protocol keeps its guard against being instantiated. - Remove 41 unused imports, and let flake8 accept black's spacing. - Point pyright at the project's own environment, without which it resolved no dependency and reported 124 findings that were not real. - Cover the two fixes and the shared `cp`/`mv` paths with new tests.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.api import FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models import FolderAccessLevel
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
from unicodedata import normalize
|
||||
|
||||
from mdrsclient.api import FilesApi, FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models.file import find_file
|
||||
|
||||
|
||||
class CpCommand(BaseCommand):
|
||||
|
||||
@@ -1,12 +1,8 @@
|
||||
import json
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.api import FilesApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models.file import find_file
|
||||
|
||||
|
||||
class FileMetadataCommand(BaseCommand):
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.api import LaboratoriesApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
|
||||
|
||||
|
||||
+38
-28
@@ -1,10 +1,10 @@
|
||||
import json
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
from typing import Any, Final
|
||||
|
||||
from pydantic.dataclasses import dataclass
|
||||
|
||||
from mdrsclient.api import FilesApi, FoldersApi
|
||||
from mdrsclient.api import FoldersApi
|
||||
from mdrsclient.client import MdrsClient
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.config import build_download_url
|
||||
@@ -95,25 +95,24 @@ class LsCommand(BaseCommand):
|
||||
def _ls_json(cls, context: LsCommandContext, folder: Folder, files: list[File]) -> None:
|
||||
print(json.dumps(cls._folder2dict(context, folder, files), ensure_ascii=False))
|
||||
|
||||
LABELS: Final[dict[str, str]] = {
|
||||
"type": "Type",
|
||||
"acl": "Access",
|
||||
"laboratory": "Laboratory",
|
||||
"size": "Size",
|
||||
"date": "Date",
|
||||
"name": "Name",
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def _ls_plain(cls, context: LsCommandContext, folder: Folder, files: list[File]) -> None:
|
||||
label = {
|
||||
"type": "Type",
|
||||
"acl": "Access",
|
||||
"laboratory": "Laboratory",
|
||||
"size": "Size",
|
||||
"date": "Date",
|
||||
"name": "Name",
|
||||
}
|
||||
length: dict[str, int] = {}
|
||||
for key in label.keys():
|
||||
length[key] = len(label[key]) if not context.is_quiet else 0
|
||||
def _column_widths(cls, context: LsCommandContext, folder: Folder, files: list[File]) -> dict[str, int]:
|
||||
"""Width of each column: the widest of its heading and everything printed under it."""
|
||||
length = {key: len(label) if not context.is_quiet else 0 for key, label in cls.LABELS.items()}
|
||||
for sub_folder in folder.sub_folders:
|
||||
sub_laboratory = context.client.connection.laboratories.find_by_id(sub_folder.laboratory_id)
|
||||
sub_laboratory_name = sub_laboratory.name if sub_laboratory is not None else "(invalid)"
|
||||
sub_laboratory_name = cls._laboratory_name(context, sub_folder.laboratory_id)
|
||||
length["acl"] = max(length["acl"], len(sub_folder.access_level_name))
|
||||
length["laboratory"] = max(length["laboratory"], len(sub_laboratory_name))
|
||||
length["size"] = max(length["size"], len(str(folder.size)))
|
||||
length["size"] = max(length["size"], len(str(sub_folder.size)))
|
||||
length["date"] = max(length["date"], len(sub_folder.updated_at_name))
|
||||
length["name"] = max(length["name"], len(sub_folder.name))
|
||||
for file in files:
|
||||
@@ -122,6 +121,27 @@ class LsCommand(BaseCommand):
|
||||
length["name"] = max(length["name"], len(file.name))
|
||||
length["acl"] = max(length["acl"], len(folder.access_level_name))
|
||||
length["laboratory"] = max(length["laboratory"], len(context.laboratory.name))
|
||||
return length
|
||||
|
||||
@classmethod
|
||||
def _ls_plain_children(cls, context: LsCommandContext, folder: Folder) -> None:
|
||||
"""List each sub-folder in turn, passing over the ones the caller cannot open."""
|
||||
print("")
|
||||
folder_api = FoldersApi(context.client.connection)
|
||||
for sub_folder in sorted(folder.sub_folders, key=lambda x: x.name):
|
||||
try:
|
||||
if sub_folder.lock:
|
||||
folder_api.auth(sub_folder.id, context.password)
|
||||
sub_detail = folder_api.retrieve(sub_folder.id)
|
||||
sub_files = context.client.find_files(sub_folder.id)
|
||||
except UnauthorizedException:
|
||||
continue
|
||||
cls._ls_plain(context, sub_detail, sub_files)
|
||||
|
||||
@classmethod
|
||||
def _ls_plain(cls, context: LsCommandContext, folder: Folder, files: list[File]) -> None:
|
||||
label = cls.LABELS
|
||||
length = cls._column_widths(context, folder, files)
|
||||
header = (
|
||||
f"{label['type']:{length['type']}}\t{label['acl']:{length['acl']}}\t"
|
||||
f"{label['laboratory']:{length['laboratory']}}\t{label['size']:{length['size']}}\t"
|
||||
@@ -152,17 +172,7 @@ class LsCommand(BaseCommand):
|
||||
)
|
||||
|
||||
if context.is_recursive:
|
||||
print("")
|
||||
for sub_folder in sorted(folder.sub_folders, key=lambda x: x.name):
|
||||
folder_api = FoldersApi(context.client.connection)
|
||||
try:
|
||||
if sub_folder.lock:
|
||||
folder_api.auth(sub_folder.id, context.password)
|
||||
folder = folder_api.retrieve(sub_folder.id)
|
||||
files = context.client.find_files(sub_folder.id)
|
||||
cls._ls_plain(context, folder, files)
|
||||
except UnauthorizedException:
|
||||
pass
|
||||
cls._ls_plain_children(context, folder)
|
||||
|
||||
@classmethod
|
||||
def _folder2dict(
|
||||
|
||||
@@ -2,7 +2,6 @@ import json
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.api import FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
from unicodedata import normalize
|
||||
|
||||
from mdrsclient.api import FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models.file import find_file
|
||||
|
||||
|
||||
class MkdirCommand(BaseCommand):
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
from unicodedata import normalize
|
||||
|
||||
from mdrsclient.api import FilesApi, FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models.file import find_file
|
||||
|
||||
|
||||
class MvCommand(BaseCommand):
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.api import FilesApi, FoldersApi
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
from mdrsclient.exceptions import IllegalArgumentException
|
||||
from mdrsclient.models.file import find_file
|
||||
|
||||
|
||||
class RmCommand(BaseCommand):
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
from argparse import Namespace
|
||||
from typing import Any
|
||||
|
||||
from mdrsclient.__version__ import __version__
|
||||
from mdrsclient.commands.base import BaseCommand
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user