refactor(config): abstract config storage and enable dependency injection

Abstract the configuration storage mechanism to allow using custom
configurations, such as in-memory setups, when using the tool as
a library. This aligns the configuration architecture with the
session cache abstraction.

- Define ConfigInterface protocol and InMemoryConfig class
- Make CacheFile, InMemoryCache, ConfigFile, and InMemoryConfig
  explicitly inherit their interfaces
- Update MdrsService and MdrsClient to accept customizable
  config_class and config instances
- Add validation to check remote parameter consistency in
  create_connection
- Remove unused imports across command files
This commit is contained in:
2026-07-02 23:30:33 +09:00
parent 8ce9e09e69
commit b95fc0cd7d
7 changed files with 78 additions and 34 deletions
+11 -16
View File
@@ -4,6 +4,7 @@ from unicodedata import normalize
from mdrsclient.api import DoiApi, FilesApi, FoldersApi, LaboratoriesApi, UsersApi
from mdrsclient.cache import CacheInterface
from mdrsclient.config import ConfigInterface
from mdrsclient.connection import MDRSConnection
from mdrsclient.exceptions import IllegalArgumentException, MDRSException, UnauthorizedException, UnexpectedException
from mdrsclient.models import File, Folder, Laboratory, Token, User
@@ -14,12 +15,14 @@ from mdrsclient.services import MdrsService
class MdrsClient(MdrsService):
"""Service layer client for MDRS."""
def __init__(self, connection: MDRSConnection):
super().__init__(connection)
def __init__(self, connection: MDRSConnection, config_class: type[ConfigInterface] | None = None):
super().__init__(connection, config_class)
@classmethod
def from_remote(cls, remote: str, cache: CacheInterface | None = None) -> "MdrsClient":
return cls(cls.create_connection(remote, cache))
def from_remote(
cls, remote: str, cache: CacheInterface | None = None, config: ConfigInterface | None = None
) -> "MdrsClient":
return cls(cls.create_connection(remote, cache, config))
def mkdir(self, remote_path: str) -> None:
remote, laboratory_name, r_path = self.parse_remote_host_with_path(remote_path)
@@ -208,36 +211,28 @@ class MdrsClient(MdrsService):
return f"mdrs {__version__}"
def config_create(self, remote: str, url: str) -> None:
from mdrsclient.config import ConfigFile
remote = self.parse_remote_host(remote)
config = ConfigFile(remote)
config = self.config_class(remote)
if config.url is not None:
raise IllegalArgumentException(f"Remote host `{remote}` is already exists.")
else:
config.url = url
def config_update(self, remote: str, url: str) -> None:
from mdrsclient.config import ConfigFile
remote = self.parse_remote_host(remote)
config = ConfigFile(remote)
config = self.config_class(remote)
if config.url is None:
raise IllegalArgumentException(f"Remote host `{remote}` is not exists.")
else:
config.url = url
def config_list(self) -> list:
from mdrsclient.config import ConfigFile
config = ConfigFile("")
config = self.config_class("")
return config.list()
def config_delete(self, remote: str) -> None:
from mdrsclient.config import ConfigFile
remote = self.parse_remote_host(remote)
config = ConfigFile(remote)
config = self.config_class(remote)
if config.url is None:
raise IllegalArgumentException(f"Remote host `{remote}` is not exists.")
else: