feat: referentiel projets dynamique + validation nommage by design

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é.
This commit is contained in:
2026-07-17 14:59:33 +02:00
parent d1e67431b6
commit 943acbc573
2425 changed files with 710525 additions and 6 deletions
@@ -0,0 +1,133 @@
Metadata-Version: 2.1
Name: wavedrom
Version: 2.0.3.post3
Summary: WaveDrom compatible python command line
Home-page: https://github.com/wallento/wavedrompy
Author: Aliaksei Chapyzhenka, BreizhGeek, Kazuki Yamamoto, Stefan Wallentowitz
Author-email: k4zuki@github.com, stefan@wallentowitz.de
License: UNKNOWN
Keywords: wavedrom svg
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Build Tools
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Description-Content-Type: text/markdown
Provides-Extra: test
License-File: LICENSE
# WaveDromPy
This is a python module and command line fully compatible with [WaveDrom](https://wavedrom.com/), which is originally implemented in JavaScript. It is useful if you want to generate wavedrom diagrams from a python environment or simply don't want to install the _Node.js_ environment just to use WaveDrom as simple command line.
WaveDromPy is for example used in [sphinxcontrib-wavedrom](https://pypi.org/project/sphinxcontrib-wavedrom/) to render wavedrom for Sphinx documentation. While the original project renders the diagrams in JavaScript in the browser, WaveDromPy renders them to SVG files.
This tool is a direct translation of original Javascript file _WaveDrom.js_ to Python. No extra feature added. We seek to have it fully compatible.
The tool _WaveDromPy_ directly converts _WaveDrom_ compatible JSON files into SVG format.
[![Build Status](https://travis-ci.org/wallento/wavedrompy.svg?branch=master)](https://travis-ci.org/wallento/wavedrompy)
[![PyPI version](https://badge.fury.io/py/wavedrom.svg)](https://badge.fury.io/py/wavedrom)
## Installation
It is most easy to just install wavedrom via pip/pypi:
pip install wavedrom
Alternatively you can install the latest version from this repository:
pip install git+https://github.com/wallento/wavedrompy
or from your local copy:
pip install .
## Usage
You can either use the tool from Python:
import wavedrom
svg = wavedrom.render("""
{ "signal": [
{ "name": "CK", "wave": "P.......", "period": 2 },
{ "name": "CMD", "wave": "x.3x=x4x=x=x=x=x", "data": "RAS NOP CAS NOP NOP NOP NOP", "phase": 0.5 },
{ "name": "ADDR", "wave": "x.=x..=x........", "data": "ROW COL", "phase": 0.5 },
{ "name": "DQS", "wave": "z.......0.1010z." },
{ "name": "DQ", "wave": "z.........5555z.", "data": "D0 D1 D2 D3" }
]}""")
svg.saveas("demo1.svg")
This will render a waveform as:
![Example 1](https://raw.githubusercontent.com/wallento/wavedrompy/2e8568d50561f534133d036fee3bd35756f416d9/doc/demo1.svg?sanitize=true "Example 1")
You can find more examples [in the WaveDrom tutorial](https://wavedrom.com/tutorial.html).
A second feature is that WaveDrom can render logic circuit diagrams:
import wavedrom
svg = wavedrom.render("""
{ "assign":[
["out",
["|",
["&", ["~", "a"], "b"],
["&", ["~", "b"], "a"]
]
]
]}""")
svg.saveas("demo2.svg")
This will render a as:
![Example 2](https://raw.githubusercontent.com/wallento/wavedrompy/2e8568d50561f534133d036fee3bd35756f416d9/doc/demo2.svg?sanitize=true "Example 2")
You can find more examples [in the WaveDrom tutorial2](https://wavedrom.com/tutorial2.html).
Finally, wavedrom can draw registers as bitfields:
import wavedrom
svg = wavedrom.render("""
{"reg": [
{ "name": "IPO", "bits": 8, "attr": "RO" },
{ "bits": 7 },
{ "name": "<o>B</o><b>R<i>K</i></b>", "bits": 5, "attr": "RW", "type": 4 },
{ "name": "CPK", "bits": 1 },
{ "name": "Clear", "bits": 3 },
{ "bits": 8 }
]
]}""")
svg.saveas("demo3.svg")
This will render as:
![Example 3](https://raw.githubusercontent.com/wallento/wavedrompy/2e8568d50561f534133d036fee3bd35756f416d9/doc/demo3.svg?sanitize=true "Example 3")
This mode is documented as part of the [bit-field](https://www.npmjs.com/package/bit-field) JavaScript package.
Alternatively, WaveDromPy can be called from the command line:
wavedrompy --input input.json --svg output.svg
## Important notice
The command line uses Python's JSON interpreter that is more restrictive (coherent with the JSOC spec), while the JavaScript json is more relaxed:
* All strings have to be written between quotes (""),
* Extra comma (,) not supported at end of lists or dictionaries
## AsciiDoctor example
An _AsciiDoctor_ example is provided to directly generate timing diagrams from _AsciiDoctor_ formatted documents.
@@ -0,0 +1,82 @@
.gitignore
.travis.yml
LICENSE
README.md
setup.cfg
setup.py
tox.ini
asciidoctor-example/asciidoctor-html.sh
asciidoctor-example/asciidoctor-pdf.sh
asciidoctor-example/example.adoc
asciidoctor-example/example.html
asciidoctor-example/example.pdf
asciidoctor-example/wavedrom_test0.svg
asciidoctor-example/wavedrom_test1.svg
asciidoctor-example/wavedrom_test10.svg
asciidoctor-example/wavedrom_test11.svg
asciidoctor-example/wavedrom_test12.svg
asciidoctor-example/wavedrom_test1n.svg
asciidoctor-example/wavedrom_test2.svg
asciidoctor-example/wavedrom_test3.svg
asciidoctor-example/wavedrom_test4.svg
asciidoctor-example/wavedrom_test5.svg
asciidoctor-example/wavedrom_test6.svg
asciidoctor-example/wavedrom_test7.svg
asciidoctor-example/wavedrom_test8.svg
asciidoctor-example/wavedrom_test9.svg
css/default.css
doc/demo1.svg
doc/demo2.svg
doc/demo3.svg
test/brick_regressions.py
test/conftest.py
test/diff.py
test/single_test.py
test/test_brick_regression.py
test/test_render.py
test/files/assign_74ls688.json
test/files/assign_binary2gray.json
test/files/assign_gray2binary.json
test/files/assign_iec60617.json
test/files/assign_xor.json
test/files/bitfield_0.json
test/files/issue_10.json
test/files/issue_11.json
test/files/issue_13.json
test/files/issue_14.json
test/files/issue_16.json
test/files/issue_7.json
test/files/signal_0.json
test/files/subcycle_0.json
test/files/subcycle_1.json
test/files/tutorial_0.json
test/files/tutorial_0n.json
test/files/tutorial_1.json
test/files/tutorial_10.json
test/files/tutorial_11.json
test/files/tutorial_12.json
test/files/tutorial_1n.json
test/files/tutorial_2.json
test/files/tutorial_3.json
test/files/tutorial_4.json
test/files/tutorial_5.json
test/files/tutorial_6.json
test/files/tutorial_7.json
test/files/tutorial_8.json
test/files/tutorial_9.json
wavedrom/__init__.py
wavedrom/assign.py
wavedrom/attrdict.py
wavedrom/base.py
wavedrom/bitfield.py
wavedrom/css.py
wavedrom/tspan.py
wavedrom/version.py
wavedrom/waveform.py
wavedrom/waveskin.py
wavedrom.egg-info/PKG-INFO
wavedrom.egg-info/SOURCES.txt
wavedrom.egg-info/dependency_links.txt
wavedrom.egg-info/entry_points.txt
wavedrom.egg-info/requires.txt
wavedrom.egg-info/top_level.txt
@@ -0,0 +1,3 @@
[console_scripts]
wavedrompy = wavedrom:main
@@ -0,0 +1,27 @@
../../../../bin/wavedrompy
../wavedrom/__init__.py
../wavedrom/__pycache__/__init__.cpython-39.pyc
../wavedrom/__pycache__/assign.cpython-39.pyc
../wavedrom/__pycache__/attrdict.cpython-39.pyc
../wavedrom/__pycache__/base.cpython-39.pyc
../wavedrom/__pycache__/bitfield.cpython-39.pyc
../wavedrom/__pycache__/css.cpython-39.pyc
../wavedrom/__pycache__/tspan.cpython-39.pyc
../wavedrom/__pycache__/version.cpython-39.pyc
../wavedrom/__pycache__/waveform.cpython-39.pyc
../wavedrom/__pycache__/waveskin.cpython-39.pyc
../wavedrom/assign.py
../wavedrom/attrdict.py
../wavedrom/base.py
../wavedrom/bitfield.py
../wavedrom/css.py
../wavedrom/tspan.py
../wavedrom/version.py
../wavedrom/waveform.py
../wavedrom/waveskin.py
PKG-INFO
SOURCES.txt
dependency_links.txt
entry_points.txt
requires.txt
top_level.txt
@@ -0,0 +1,8 @@
svgwrite
six
pyyaml
[test]
xmldiff
cairosvg
pillow