alist.driver 源代码

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Author: Kai Peng

from copy import deepcopy
from typing import Any

[文档]class AlistDriverAttribute(dict): """ 驱动属性。驱动包含 ``name``、``label``、``type``、``default``、 ``values``、``required``、``description`` 等字段。所有字段初始化之后无法修改。 """ def __init__(self, **attr): super().__init__() for key in ['name', 'label', 'type', 'default', 'values', 'required', 'description']: super().__setitem__(key, attr[key])
[文档] def get_name(self): """获取驱动属性的名字""" return self['name']
[文档] def is_required(self): """属性是否必须提供。返回True表示必须提供。""" return self['required']
def __str__(self) -> str: return f'attr: {self.get_name()} required: {self["required"]}' def __repr__(self) -> str: return self.__str__() def __setitem__(self, __key: Any, __value: Any) -> None: raise NotImplemented def __delitem__(self, __key: Any) -> None: raise NotImplemented
[文档]class AlistDriver(object): """ 描述Alist驱动。一个驱动包含若干个属性。 """ def __init__(self, name, attrs): self.name = name self.attrs = list() for attr in attrs: self.attrs.append(AlistDriverAttribute(**attr))
[文档] def get_attr(self, name) -> AlistDriverAttribute: """ 获取驱动属性。 :param name: 属性的名字 """ for attr in self.attrs: if name == attr['name']: return attr raise KeyError(f"{name} not found")
[文档] def get_name(self): """获取驱动的名字""" return self.name
[文档] def get_required(self): """获取驱动必须提供的属性""" required = list() for attr in self.attrs: if attr['required']: required.append(attr.get_name()) return required
def __str__(self) -> str: s = f"driver: {self.name}\n" for attr in self.attrs: s += f'{attr}\n' return s def __repr__(self) -> str: return self.__str__()
[文档]class AlistAdminDrivers(object): """ 驱动列表。api ``/api/admin/drivers`` 的实现。 """ drivers = list() def __init__(self, alist, endpoint) -> None: self.alist = alist self.endpoint = f'{endpoint}/drivers' self.drivers = deepcopy(self.drivers)
[文档] def get(self): """ 获取所有驱动的列表,包含驱动必须提供的属性。 :return: 驱动列表 """ if len(self.drivers) == 0: results = self.alist.get(self.endpoint) for name in results: self.drivers.append(AlistDriver(name, results[name])) func_name = f"driver_{name.replace('.', '_')}" setattr(self.alist, func_name, self._factory_get_driver(name)) return self.drivers
def __call__(self) -> Any: return self.get()
[文档] def get_driver(self, name) -> AlistDriver: """ 获取指定名字的驱动。 :param name: 驱动的名字。 """ drivers = self.get() for d in drivers: if d.get_name() == name: return d raise KeyError(f'driver \'{name}\' not found')
def _factory_get_driver(self, name): def get_driver_wrapper(): return self.get_driver(name) return get_driver_wrapper