This commit is contained in:
Izalia Mae 2021-10-04 22:08:25 -04:00
parent 4895c86f9f
commit ab87e880a1
4 changed files with 64 additions and 25 deletions

View file

@ -44,8 +44,9 @@ class DBusClientBase(DBusBase):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.proxy = None self.proxy = None
self.methods = DotDict() self.method = DotDict()
self.signals = DotDict() self.prop = DotDict()
self.signal = DotDict()
def __enter__(self): def __enter__(self):
@ -57,6 +58,35 @@ class DBusClientBase(DBusBase):
self.disconnect() self.disconnect()
def __getattr__(self, key, default=Exception):
try:
return self.method[key]
except KeyError as e:
if default != Exception:
return default
raise e from None
def __getattr__2(self, key):
try:
return self.method[key]
except:
pass
try:
return self.prop[key]
except:
pass
try:
return self.signal[key]
except:
pass
raise AttributeError(f'Not a method, property, or signal: {key}')
def connect(self): def connect(self):
self.proxy = self.get_proxy(self.dbuspath) self.proxy = self.get_proxy(self.dbuspath)
@ -92,21 +122,29 @@ class DBusClientBase(DBusBase):
def sig_connect(self, signal, callback, *args, original_args=True, **kwargs): def sig_connect(self, signal, callback, *args, original_args=True, **kwargs):
if original_args: if original_args:
self.signals[signal].connect(lambda *sigargs, **sigkwargs: callback(*sigargs, *args, **sigkwargs, **kwargs)) self.signal[signal].connect(lambda *sigargs, **sigkwargs: callback(*sigargs, *args, **sigkwargs, **kwargs))
else: else:
self.signals[signal].connect(lambda *sigargs, **sigkargs: callback(*args, **kwargs)) self.signal[signal].connect(lambda *sigargs, **sigkargs: callback(*args, **kwargs))
def sig_disconnect(self, signal):
self.signal[signal].disconnect()
def set_method(self, name): def set_method(self, name):
self.methods[name] = partial(self.cmd, name) if name not in self.method:
setattr(self, name, partial(self.cmd, name)) self.method[name] = partial(self.cmd, name)
def set_property(self, name):
if name not in self.prop:
self.prop[name] = getattr(self.proxy, name)
def set_signal(self, name): def set_signal(self, name):
signal = getattr(self.proxy, name) if name not in self.signal:
self.signals[name] = signal self.signal[name] = getattr(self.proxy, name)
setattr(self, name, partial(self.connect, name))
def set_methods_and_signals(self, namespace=None): def set_methods_and_signals(self, namespace=None):
@ -115,13 +153,12 @@ class DBusClientBase(DBusBase):
for e in element: for e in element:
name = e.attrib['name'] name = e.attrib['name']
if getattr(self, name, None):
izzylog.verbose('Tried to add an existing method or signal:', name)
continue
if e.tag == 'method': if e.tag == 'method':
self.set_method(name) self.set_method(name)
if e.tag == 'property':
self.set_property(name)
elif e.tag == 'signal': elif e.tag == 'signal':
self.set_signal(name) self.set_signal(name)

View file

@ -80,7 +80,7 @@ class Path(str):
def delete(self): def delete(self):
if self.isdir: if self.isdir:
rmtree(self) shutil.rmtree(self, ignore_errors=True)
else: else:
os.remove(self) os.remove(self)
@ -125,7 +125,7 @@ class Path(str):
if recursive: if recursive:
return tuple(self.join(f) for dp, dn, fn in os.walk(self) for f in fn) return tuple(self.join(f) for dp, dn, fn in os.walk(self) for f in fn)
return [self.join(path) for path in os.listdir(self)] return tuple(self.join(path) for path in os.listdir(self))
def mkdir(self, mode=0o755): def mkdir(self, mode=0o755):
@ -139,10 +139,12 @@ class Path(str):
def move(self, path, overwrite=False): def move(self, path, overwrite=False):
if not overwrite and self.exists: dest = Path(path)
raise FileExistsError(f'Refusing to move file to existing destination: {path}')
shutil.move(self, path) if not overwrite and dest.exists:
raise FileExistsError(f'Refusing to move file to existing destination: {dest}')
shutil.move(self, dest)
def open(self, *args, **kwargs): def open(self, *args, **kwargs):

View file

@ -108,7 +108,7 @@ class Database:
if dbtype == 'sqlite': if dbtype == 'sqlite':
url = URL.create( url = URL.create(
drivername='sqlite', drivername='sqlite',
database=kwargs.pop('name') database=kwargs.get('name')
) )
else: else:
@ -122,11 +122,11 @@ class Database:
url = URL.create( url = URL.create(
drivername = dbtype, drivername = dbtype,
username = kwargs.pop('user', None), username = kwargs.get('user', None),
password = kwargs.pop('password', None), password = kwargs.get('password', None),
host = kwargs.pop('host', None), host = kwargs.get('host', None),
port = kwargs.pop('port', None), port = kwargs.get('port', None),
database = kwargs.pop('name'), database = kwargs.get('name'),
) )
self.db = create_engine(url, **engine_kwargs) self.db = create_engine(url, **engine_kwargs)

View file

@ -19,7 +19,7 @@ class Session(sqlalchemy_session):
self.cache = db.cache self.cache = db.cache
self.sessionid = random_gen(10) self.sessionid = random_gen(10)
self.database.sessions[self.sessionid] = self db.sessions[self.sessionid] = self
# remove in the future # remove in the future
self.db = db self.db = db