Singularity/lib/abc.py

95 lines
2.1 KiB
Python

import typing as t
####################
# Directory Wrappers
#
class DirWrap:
def __init__(self, fname, *data: t.List[t.Union["DirWrap", "FileWrap"]]):
self.name = fname
self.contains = {d.name: d for d in data}
self._raw_data = data
def stringify(self, level=0) -> str:
s = ""
for key, value in self.contains.items():
s += (
""
+ ""
+ "" * (4 * level)
+ " "
+ key
+ ("/" if isinstance(value, DirWrap) else "")
+ "\n"
)
if isinstance(value, DirWrap):
s += value.stringify(level + 1)
return s
class FileWrap:
def __init__(self, fname: str, fdata: t.Union[bytes, str]) -> None:
self.name = fname
self.data = fdata.encode() if isinstance(fdata, str) else fdata
#########
# Streams
#
class IStream:
def __init__(self, file) -> None:
self.file = file
def write(self, *data):
self.file.write(*data)
class IOStream:
def __init__(self, fdin: IStream, fdout: "OStream") -> None:
self.fdin = fdin
self.fdout = fdout
def write(self, *data):
self.fdin.write(*data)
def read(self):
return self.fdout.read()
class OStream:
def __init__(self, file) -> None:
self.file = file
def read(self):
return self.file.read()
class Key:
def __init__(self, kpath, key, hash, randomart):
self.kp = kpath
self.key = key
self.hash = hash
self.randomart = randomart
def dump(self):
open(self.kp, "wb+").write(
"--- BEGIN FERNET CRYPTOGRAPHY KEY ---\n".encode()
+ self.key
+ f"\n{self.hash}\n".encode()
+ "\n--- END FERNET CRYPTOGRAPHY KEY ---".encode()
)
@classmethod
def kimport(cls, kp):
k = open(kp, "rb").read().splitlines()
key = k[1]
hash = k[2].decode()
from random_art.randomart import drunkenwalk, draw
randomart = draw(drunkenwalk(key), hash)
return cls(kp, key, hash, randomart)