943acbc573
Durcit la convention de nommage des projets (dérive constatée : 'Sliding Automation', 'code_versioning'... au lieu des formes canoniques). - trilium_api.py : projets_canoniques() lit le référentiel = valeurs du label projet sur les notes de type=projet (source unique, pas de constante en dur). Note-projet CodeVersioning créée (manquait). - mcp_server.py : _valider_projet() branché dans les 6 tools de création (add_decision/history/backlog, new_conversation, create_entite, add_skill). Refuse un projet non canonique (suggestion si faute) ou inconnu (renvoi au processus de création de projet). Ne verrouille pas si référentiel illisible. - lint_audit.py : VAL-nommage aligné sur le référentiel (attrape casse, espace ET snake_case ; l'ancien 'contient un espace' ratait code_versioning). - Données : 79 notes ré-étiquetées vers les 3 formes canoniques. Quality by design : l'erreur de nommage devient impossible à l'écriture, le Lint n'est plus que le filet de sécurité.
92 lines
2.4 KiB
Python
92 lines
2.4 KiB
Python
"""
|
|
Thin wrappers around common functions.
|
|
|
|
Subpackages contain potentially unstable extensions.
|
|
"""
|
|
from warnings import warn
|
|
|
|
from ..auto import tqdm as tqdm_auto
|
|
from ..std import TqdmDeprecationWarning, tqdm
|
|
from ..utils import ObjectWrapper
|
|
|
|
__author__ = {"github.com/": ["casperdcl"]}
|
|
__all__ = ['tenumerate', 'tzip', 'tmap']
|
|
|
|
|
|
class DummyTqdmFile(ObjectWrapper):
|
|
"""Dummy file-like that will write to tqdm"""
|
|
|
|
def __init__(self, wrapped):
|
|
super().__init__(wrapped)
|
|
self._buf = []
|
|
|
|
def write(self, x, nolock=False):
|
|
nl = b"\n" if isinstance(x, bytes) else "\n"
|
|
pre, sep, post = x.rpartition(nl)
|
|
if sep:
|
|
blank = type(nl)()
|
|
tqdm.write(blank.join(self._buf + [pre, sep]),
|
|
end=blank, file=self._wrapped, nolock=nolock)
|
|
self._buf = [post]
|
|
else:
|
|
self._buf.append(x)
|
|
|
|
def __del__(self):
|
|
if self._buf:
|
|
blank = type(self._buf[0])()
|
|
try:
|
|
tqdm.write(blank.join(self._buf), end=blank, file=self._wrapped)
|
|
except (OSError, ValueError):
|
|
pass
|
|
|
|
|
|
def builtin_iterable(func):
|
|
"""Returns `func`"""
|
|
warn("This function has no effect, and will be removed in tqdm==5.0.0",
|
|
TqdmDeprecationWarning, stacklevel=2)
|
|
return func
|
|
|
|
|
|
def tenumerate(iterable, start=0, total=None, tqdm_class=tqdm_auto, **tqdm_kwargs):
|
|
"""
|
|
Equivalent of `numpy.ndenumerate` or builtin `enumerate`.
|
|
|
|
Parameters
|
|
----------
|
|
tqdm_class : [default: tqdm.auto.tqdm].
|
|
"""
|
|
try:
|
|
import numpy as np
|
|
except ImportError:
|
|
pass
|
|
else:
|
|
if isinstance(iterable, np.ndarray):
|
|
return tqdm_class(np.ndenumerate(iterable), total=total or iterable.size,
|
|
**tqdm_kwargs)
|
|
return enumerate(tqdm_class(iterable, total=total, **tqdm_kwargs), start)
|
|
|
|
|
|
def tzip(iter1, *iter2plus, **tqdm_kwargs):
|
|
"""
|
|
Equivalent of builtin `zip`.
|
|
|
|
Parameters
|
|
----------
|
|
tqdm_class : [default: tqdm.auto.tqdm].
|
|
"""
|
|
kwargs = tqdm_kwargs.copy()
|
|
tqdm_class = kwargs.pop("tqdm_class", tqdm_auto)
|
|
yield from zip(tqdm_class(iter1, **kwargs), *iter2plus)
|
|
|
|
|
|
def tmap(function, *sequences, **tqdm_kwargs):
|
|
"""
|
|
Equivalent of builtin `map`.
|
|
|
|
Parameters
|
|
----------
|
|
tqdm_class : [default: tqdm.auto.tqdm].
|
|
"""
|
|
for i in tzip(*sequences, **tqdm_kwargs):
|
|
yield function(*i)
|