Compare commits

...

5 commits

4 changed files with 22 additions and 3 deletions

View file

@ -80,6 +80,15 @@ class Cache:
except KeyError:
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):
'''
Remove the key and return its value, or raise KeyError.

View file

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

View file

@ -94,6 +94,9 @@ class Extension:
def __hash__(self):
return hash(self.ext)
def __len__(self):
return len(self.ext)
def __repr__(self):
return f'Extension({repr(self.ext)})'
@ -434,6 +437,14 @@ class Path:
with self.open(mode, **kwargs) as handle:
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):
'''
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)
else:
formatter = Formatter('[{asctime}.{msecs:03.0f}] {levelname}:{name}:{message}', style='{', datefmt=datefmt)
formatter.default_msec_format = '%s.%03d'
handler.setFormatter(formatter)
handler.setLevel(level)
root.addHandler(handler)