Compare commits

...

5 commits

4 changed files with 22 additions and 3 deletions

View file

@ -80,6 +80,15 @@ class Cache:
except KeyError: except KeyError:
return fallback return fallback
def keys(self):
return list(self.cache.keys())
def items(self):
return [(key, value) for (key, (value, timestamp)) in self.cache.items()]
def values(self):
return [value for (value, timestamp) in self.cache.values()]
def pop(self, key): def pop(self, key):
''' '''
Remove the key and return its value, or raise KeyError. Remove the key and return its value, or raise KeyError.

View file

@ -20,10 +20,10 @@ class DotDict:
def __getattr__(self, key): def __getattr__(self, key):
try: try:
return self.__dict__[key] return self.__dict__[key]
except KeyError: except KeyError as exc:
if self.__default is not NO_DEFAULT: if self.__default is not NO_DEFAULT:
return self.__default return self.__default
raise raise AttributeError from exc
def __setattr__(self, key, value): def __setattr__(self, key, value):
self.__dict__[key] = value self.__dict__[key] = value

View file

@ -94,6 +94,9 @@ class Extension:
def __hash__(self): def __hash__(self):
return hash(self.ext) return hash(self.ext)
def __len__(self):
return len(self.ext)
def __repr__(self): def __repr__(self):
return f'Extension({repr(self.ext)})' return f'Extension({repr(self.ext)})'
@ -434,6 +437,14 @@ class Path:
with self.open(mode, **kwargs) as handle: with self.open(mode, **kwargs) as handle:
return handle.read() return handle.read()
def read_generator(self, mode, chunk_size, **kwargs):
with self.open(mode, **kwargs) as handle:
while True:
chunk = handle.read(chunk_size)
if not chunk:
break
yield chunk
def readlines(self, mode, **kwargs): def readlines(self, mode, **kwargs):
''' '''
Shortcut function for opening the file handle and reading lines from it. Shortcut function for opening the file handle and reading lines from it.

View file

@ -61,7 +61,6 @@ def add_root_handler(level):
formatter = Formatter('[{asctime}.{msecs:03.0f}] {levelname}:{name}.{funcName}:{message}', style='{', datefmt=datefmt) formatter = Formatter('[{asctime}.{msecs:03.0f}] {levelname}:{name}.{funcName}:{message}', style='{', datefmt=datefmt)
else: else:
formatter = Formatter('[{asctime}.{msecs:03.0f}] {levelname}:{name}:{message}', style='{', datefmt=datefmt) formatter = Formatter('[{asctime}.{msecs:03.0f}] {levelname}:{name}:{message}', style='{', datefmt=datefmt)
formatter.default_msec_format = '%s.%03d'
handler.setFormatter(formatter) handler.setFormatter(formatter)
handler.setLevel(level) handler.setLevel(level)
root.addHandler(handler) root.addHandler(handler)