arctyp 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # uv cache (CI): contains build venvs whose absolute symlinks must never
13
+ # end up packed into a source distribution
14
+ .uv-cache/
15
+
16
+ # PDF générés par les tests/compilations
17
+ *.pdf
18
+
19
+ # Projets de test locaux créés par `arctyp init`
20
+ proj/
21
+ doctor/
@@ -0,0 +1,76 @@
1
+ # CI/CD du paquet arctyp : test, build, publication.
2
+ #
3
+ # Publication uniquement sur un commit tagué :
4
+ # - Registre de paquets GitLab : automatique (CI_JOB_TOKEN, aucun secret à
5
+ # configurer) ;
6
+ # - PyPI : activée dès que la variable UV_PUBLISH_TOKEN existe
7
+ # (Paramètres > CI/CD > Variables, masquée et protégée).
8
+ #
9
+ # Le tag doit correspondre à la version de pyproject.toml (`v0.2.0` ou
10
+ # `0.2.0`), sinon la publication échoue avant tout envoi.
11
+
12
+ workflow:
13
+ rules:
14
+ # Évite les pipelines dupliqués (RM + branche) et couvre les tags.
15
+ - if: "$CI_PIPELINE_SOURCE == 'merge_request_event'"
16
+ - if: "$CI_COMMIT_BRANCH"
17
+ - if: "$CI_COMMIT_TAG"
18
+
19
+ stages: [test, build, publish]
20
+
21
+ variables:
22
+ UV_CACHE_DIR: .uv-cache
23
+
24
+ default:
25
+ image: ghcr.io/astral-sh/uv:python3.13-bookworm-slim
26
+ cache:
27
+ key:
28
+ files: [uv.lock]
29
+ paths: [$UV_CACHE_DIR]
30
+
31
+ test:
32
+ stage: test
33
+ script:
34
+ - uv sync --frozen
35
+ - uv run python -m unittest discover -s tests -v
36
+
37
+ build:
38
+ stage: build
39
+ script:
40
+ - uv build
41
+ artifacts:
42
+ paths: [dist/]
43
+ expire_in: 1 week
44
+
45
+ # Garde-fou partagé des publications : refuse d'envoyer si le tag et la
46
+ # version déclarée divergent (un upload PyPI est immuable).
47
+ .verify-tag:
48
+ before_script:
49
+ - |
50
+ VERSION=$(python -c \
51
+ "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
52
+ if [ "$VERSION" != "${CI_COMMIT_TAG#v}" ]; then
53
+ echo "✗ tag $CI_COMMIT_TAG ≠ version $VERSION (pyproject.toml) — abandon."
54
+ exit 1
55
+ fi
56
+
57
+ publish:gitlab:
58
+ stage: publish
59
+ extends: .verify-tag
60
+ rules:
61
+ - if: "$CI_COMMIT_TAG"
62
+ script:
63
+ - >
64
+ uv publish
65
+ --publish-url "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi"
66
+ --username gitlab-ci-token
67
+ --password "$CI_JOB_TOKEN"
68
+
69
+ publish:pypi:
70
+ stage: publish
71
+ extends: .verify-tag
72
+ # Sans la variable, ce job est simplement ignoré : le pipeline reste vert.
73
+ rules:
74
+ - if: "$CI_COMMIT_TAG && $UV_PUBLISH_TOKEN"
75
+ script:
76
+ - uv publish # lit UV_PUBLISH_TOKEN depuis l'environnement
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,140 @@
1
+ # Contribuer à arctyp
2
+
3
+ Guide pour les développeurs du projet : structure, conventions et procédure d'ajout d'une commande.
4
+ Voir aussi le [cahier des charges](../wiki/CDC.md) pour les spécifications complètes.
5
+
6
+ ## Environnement de développement
7
+
8
+ Prérequis : [uv](https://docs.astral.sh/uv/) (gère le venv, les dépendances et l'installation
9
+ éditable). Le compilateur Typst est fourni par le paquet Python `typst` (déjà une dépendance du
10
+ projet) — aucun binaire externe n'est requis.
11
+
12
+ ```bash
13
+ uv sync # installe les dépendances dans .venv et synchronise uv.lock
14
+ uv run arctyp --help # lance la CLI depuis les sources
15
+ uv lock --check # vérifie que uv.lock est à jour
16
+ ```
17
+
18
+ ## Structure
19
+
20
+ ```text
21
+ src/arctyp/
22
+ ├── cli.py # point d'entrée : parse, dispatch, codes de sortie
23
+ ├── parser.py # construit l'arbre argparse depuis le registre (validation incluse)
24
+ ├── decorators.py # @command / @argument + CommandSpec/ArgumentSpec + registre COMMANDS
25
+ ├── errors.py # ArctypError : erreur métier affichée sans traceback
26
+ ├── output.py # vocabulaire des messages (✔ / ✗, étapes, chemins)
27
+ ├── http.py # requêtes HTTP simples partagées (stdlib)
28
+ ├── plantuml.py # client PlantUML : encodage officiel + rendu SVG/PNG via l'API
29
+ ├── gitlab.py # client API GitLab : liste et archive des templates
30
+ ├── project.py # contexte projet partagé : racine, arctyp.toml, entrée main.typ
31
+ ├── pipeline.py # chaîne de compilation (diagrammes + Typst), partagée compile/watch
32
+ ├── commands/ # une commande (ou un groupe) par fichier, auto-découvert
33
+ │ └── compile.py # ex. : @command(name="compile") + @argument("pdf", ...)
34
+ └── tests/ # tests unittest (stdlib) : registre, parser, codes de sortie
35
+ ```
36
+
37
+ Le registre `decorators.COMMANDS` (liste typée de `CommandSpec`) est rempli à l'import du paquet
38
+ `arctyp.commands`, qui découvre automatiquement tous les modules du dossier (ordre alphabétique,
39
+ les fichiers préfixés `_` sont ignorés). `parser.build_parser()` lit ce registre, valide les
40
+ déclarations (noms dupliqués, `parent` inconnu, groupes mal formés) et construit l'arbre argparse ;
41
+ `cli.main()` se charge uniquement du dispatch et des codes de sortie.
42
+
43
+ ## Ajouter une commande
44
+
45
+ Créez un fichier dans `src/arctyp/commands/` — aucune inscription ailleurs n'est nécessaire.
46
+
47
+ ```python
48
+ """`arctyp ping` : exemple de nouvelle commande."""
49
+
50
+ from arctyp.decorators import argument, command
51
+ from arctyp.errors import ArctypError
52
+
53
+
54
+ @command(
55
+ name="ping",
56
+ help="envoie une requête de test au serveur PlantUML",
57
+ description="Longue description affichée par `arctyp ping --help`.",
58
+ )
59
+ @argument(
60
+ "--count",
61
+ type=int,
62
+ default=1,
63
+ help="nombre de requêtes à envoyer",
64
+ )
65
+ def cmd_ping(args) -> int:
66
+ # TODO : implémenter la logique.
67
+ raise not_implemented("ping")
68
+ ```
69
+
70
+ - `@command` : nom, `help` (liste des commandes), `description` (aide détaillée), `parent`
71
+ (sous-commande d'un groupe, ex. `list` dans `template`), `group=True` (marqueur de groupe),
72
+ `**kwargs` passés à `add_parser`.
73
+ - `@argument` : arguments positionnels et options, passés tels quels à `add_argument` ; s'empile
74
+ librement au-dessus ou en dessous de `@command`.
75
+ - Pour un groupe avec sous-commandes, déclarez un marqueur `group=True` puis les sous-commandes
76
+ avec `parent="nom-du-groupe"` (voir `commands/template.py`).
77
+ - Un bouchon lève `not_implemented("nom-de-la-commande")` (voir `errors.py`).
78
+
79
+ ## Conventions
80
+
81
+ - **Retour de commande** : chaque handler renvoie un `int` (code de sortie) ; `0` succès,
82
+ `1` erreur, `130` interruption (Ctrl-C).
83
+ - **Erreurs** : lever `ArctypError` pour toute erreur attendue — le message est affiché en une
84
+ ligne avec le préfixe `arctyp: erreur :`, sans traceback. Ne jamais laisser un traceback
85
+ atteindre l'utilisateur.
86
+ - **Messages** : en français, explicites et actionnables (que doit faire l'utilisateur ?).
87
+ - **Code** : identifiants et commentaires en anglais ; seules les chaînes visibles par
88
+ l'utilisateur (messages, aide, erreurs) restent en français.
89
+ - **Standard library only** : pas de nouvelle dépendance sans justification ; préférer
90
+ `urllib`, `tomllib`, `argparse`, `pathlib`. Seule exception actuelle :
91
+ `watchdog`, pour la surveillance par événements système de `arctyp watch`
92
+ (importé à la demande, ~400 ms de chargement non payés au démarrage de la CLI).
93
+ - **Rendu PlantUML** : tout rendu passe par `arctyp.plantuml` (encodage officiel PlantUML,
94
+ requête HTTP avant la compilation). Serveur par défaut : celui de l'école
95
+ (`plantuml.he-arc.ch`) ; l'option `--public` bascule sur l'API publique ; `ARCTYP_PLANTUML_URL`
96
+ ou `[plantuml] url` dans arctyp.toml vise un autre serveur.
97
+ - **Squelette** : tant que la logique n'est pas implémentée, lever `not_implemented("commande")`
98
+ (source unique du message « pas encore implémenté ») — les commandes doivent rester exécutables
99
+ (aide, args).
100
+ - **KISS / DRY** : pas d'abstraction superflue ; toute logique dupliquée deux fois ou plus est
101
+ factorisée (ex. `not_implemented`, `_add_subparsers`).
102
+ - **Validation** : à chaque modification, vérifier `uv run arctyp --help`, l'aide de la commande
103
+ touchée, et les codes de sortie attendus.
104
+
105
+ ## Vérifications avant de pousser
106
+
107
+ ```bash
108
+ uv lock --check
109
+ uv run python -m unittest discover -s tests -v # suite de tests (stdlib)
110
+ uv run arctyp --help
111
+ uv run arctyp doctor # diagnostique le projet et la chaîne (sortie propre)
112
+ uv run python -m arctyp --help
113
+ ```
114
+
115
+ ## Git
116
+
117
+ - Branche principale : `main` ; le suivi des tâches se fait via les issues GitLab du groupe.
118
+ - Identité locale du dépôt : `Yanis Amani <yanis.amani@he-arc.ch>` (`git config user.name/email`).
119
+
120
+ ## Publication d'une version (CI/CD)
121
+
122
+ Le pipeline `.gitlab-ci.yml` teste, construit puis publie automatiquement le paquet sur un
123
+ commit tagué : registre de paquets GitLab (toujours), PyPI (si configurée).
124
+
125
+ 1. Bumper la `version` dans `pyproject.toml`, commit sur `main`.
126
+ 2. Créer un tag aligné (`v0.2.0` ou `0.2.0`) et le pousser — sinon la publication échoue :
127
+ `git tag v0.2.0 && git push origin main v0.2.0`.
128
+ 3. Le job `publish:gitlab` publie via `$CI_JOB_TOKEN` (aucun secret à configurer) ; installer
129
+ ensuite depuis le registre du projet :
130
+
131
+ ```bash
132
+ uv tool install arctyp \
133
+ --index-url https://<gitlab>/api/v4/projects/<PROJECT_ID>/packages/pypi/simple
134
+ ```
135
+
136
+ Pour activer PyPI en plus : définir la variable `UV_PUBLISH_TOKEN`
137
+ (Paramètres > CI/CD > Variables ; masquée + protégée, token du compte pypi.org).
138
+ Sans cette variable, le job `publish:pypi` est ignoré et le pipeline reste vert.
139
+ Recommandé : protéger les tags (`Settings > Repository > Protected tags`) pour que seuls
140
+ les mainteneurs puissent déclencher une publication.
arctyp-0.1.2/PKG-INFO ADDED
@@ -0,0 +1,185 @@
1
+ Metadata-Version: 2.5
2
+ Name: arctyp
3
+ Version: 0.1.2
4
+ Summary: CLI d'orchestration pour la composition Typst à la HE-Arc : rend les diagrammes UML via PlantUML interne et compile le PDF en local.
5
+ Author-email: Yanis Amani <yanis.amani@he-arc.ch>, Elias Tormos <elias.tormos@he-arc.ch>, Younes Kherbach <younes.kherbach@he-arc.ch>
6
+ Requires-Python: >=3.13
7
+ Requires-Dist: typst>=0.15.0
8
+ Requires-Dist: watchdog>=6.0.0
9
+ Description-Content-Type: text/markdown
10
+
11
+ # arctyp
12
+
13
+ > Point d'entrée unique pour la composition de documents Typst à la HE-Arc : rend les diagrammes UML en interne, copie les templates officiels depuis GitLab dans le projet et compile le PDF, sans dépendre d'aucun service externe.
14
+
15
+ État : en cours de développement (projet P3, HES d'été 2026-2027).
16
+
17
+ ## Table des matières
18
+
19
+ - [Pourquoi ce projet](#pourquoi-ce-projet)
20
+ - [Fonctionnement](#fonctionnement)
21
+ - [Installation](#installation)
22
+ - [Démarrage rapide](#démarrage-rapide)
23
+ - [Commandes](#commandes)
24
+ - [Configuration](#configuration)
25
+ - [Utilisation hors ligne](#utilisation-hors-ligne)
26
+ - [Développement](#développement)
27
+ - [Décisions de conception](#décisions-de-conception)
28
+ - [Dépôts liés](#dépôts-liés)
29
+ - [Équipe](#équipe)
30
+
31
+ ## Pourquoi ce projet
32
+
33
+ Typst n'effectue aucun accès réseau à la compilation : un document ne peut ni appeler le serveur PlantUML, ni télécharger un template. C'est le rôle de `arctyp` d'orchestrer ces étapes, qui n'ont pas d'équivalent dans Typst seul. L'utilisateur final ne manipule donc que la CLI, sans connaître l'existence des serveurs sous-jacents.
34
+
35
+ ## Fonctionnement
36
+
37
+ `arctyp` orchestre la compilation Typst sur le poste de l'utilisateur :
38
+
39
+ 1. rendre les diagrammes `.puml` via le serveur PlantUML interne et écrire les SVG en cache ;
40
+ 2. compiler `main.typ` en PDF via le paquet Python `typst` (nom de sortie obligatoire).
41
+
42
+ Le projet est initialisé par `arctyp init` : un projet de base prêt à l'emploi
43
+ (`conf.typ`, `template.typ`, `uml.typ`, `main.typ`, `diagrams/`, `images/`),
44
+ avec dépôt Git. Les templates officiels se récupèrent directement avec Git
45
+ (`git clone` du dépôt `templates`) — la CLI ne gère pas les templates.
46
+
47
+ Aucun paquet Typst n'est installé : le projet compile tel quel. L'utilisateur écrit son contenu
48
+ dans `main.typ`, et peut modifier les paramètres (couleurs, marges, page de titre…) directement dans
49
+ les fichiers, sans réinstaller quoi que ce soit :
50
+
51
+ ```typst
52
+ #import "conf.typ": *
53
+ ```
54
+
55
+ Typst est épinglé dans la CLI, la CI, le web et la documentation : le même PDF est produit partout.
56
+ Version actuelle : **0.15.0** (paquet Python `typst` — dernière version publiée sur PyPI ; la 0.15.1 du
57
+ compilateur n'y est pas encore disponible). Le web (`arctyp-web`, typst.ts) épinglera la même version
58
+ de compilateur, écart documenté le temps que les paquets rattrapent la release.
59
+
60
+ ## Installation
61
+
62
+ Prérequis : `pipx` ou `uv` installés.
63
+
64
+ ```bash
65
+ pipx install arctyp
66
+ # ou
67
+ uv tool install arctyp
68
+ ```
69
+
70
+ ## Démarrage rapide
71
+
72
+ ```bash
73
+ # Initie un projet de base complet avec dépôt Git
74
+ arctyp init mon-rapport
75
+ cd mon-rapport
76
+
77
+ # Compile : rend les diagrammes, génère le PDF demandé (nom obligatoire)
78
+ arctyp compile mon-rapport.pdf
79
+ ```
80
+
81
+ ## Commandes
82
+
83
+ | Commande | Rôle |
84
+ |----------|------|
85
+ | `arctyp init [répertoire]` | Initie un projet de base complet (conf.typ, template.typ, uml.typ, dossiers diagrams/ et images/, dépôt Git) ; répertoire courant par défaut ; `--force` pour écraser un répertoire non vide |
86
+ | `arctyp uml <fichier.puml>` | Rend un diagramme UML via le serveur PlantUML interne ; `--public` pour l'API publique |
87
+ | `arctyp compile <rapport.pdf>` | Rendu des diagrammes, compilation du PDF ; le nom de sortie est obligatoire ; `--public` pour le serveur PlantUML public |
88
+ | `arctyp watch <rapport.pdf>` | Compile puis recompile à chaque modification (Ctrl-C pour arrêter) ; `--public` pour le serveur PlantUML public |
89
+ | `arctyp doctor` | Diagnostic de la configuration et de l'accessibilité des serveurs |
90
+
91
+ ## Configuration
92
+
93
+ Un fichier `arctyp.toml` à la racine du projet regroupe ses paramètres ; il est écrit par
94
+ `arctyp init`. Les URLs des serveurs viennent de l'environnement (jamais de ce fichier, qui
95
+ est versionné) :
96
+
97
+ ```toml
98
+ [project]
99
+ entry = "main.typ" # fichier d'entrée Typst
100
+
101
+ [plantuml]
102
+ format = "svg" # "svg" (défaut) ou "png" — l'extension de sortie suit
103
+
104
+ [compile] # options passées telles quelles à typst.compile
105
+ # pdf_standards = "a-2b" # PDF/A pour l'archivage
106
+ # font_paths = ["polices/"] # polices supplémentaires (charte graphique)
107
+ # ppi = 144 # résolution des conversions d'images
108
+ # sys_inputs = { date = "..." } # valeurs injectées dans le document
109
+ # format = "pdf" # format de sortie
110
+ ```
111
+
112
+ Variables d'environnement : `ARCTYP_PLANTUML_URL` ou `[plantuml] url` dans arctyp.toml pour
113
+ viser un autre serveur PlantUML ; sinon le serveur de l'école (`plantuml.he-arc.ch`) est
114
+ utilisé par défaut, et l'option `--public` (`uml`, `compile`, `watch`, `doctor`) bascule sur
115
+ l'API publique. `arctyp doctor` vérifie cette configuration et l'accessibilité de la
116
+ chaîne ; les messages d'erreur sont explicites et actionnables lorsque un serveur est
117
+ injoignable.
118
+
119
+ ## Utilisation hors ligne
120
+
121
+ Dès lors que les diagrammes ont été rendus au moins une fois, un document se recompile hors ligne, sans accès au réseau de l'école.
122
+
123
+ ## Développement
124
+
125
+ Le projet est géré avec `uv` : l'environnement virtuel, les dépendances et l'installation
126
+ éditable sont pris en charge par cet outil.
127
+
128
+ ```bash
129
+ # Installer les dépendances (crée .venv) et synchroniser uv.lock
130
+ uv sync
131
+
132
+ # Lancer la CLI depuis les sources (équivalent à `arctyp ...`)
133
+ uv run arctyp --help
134
+ uv run python -m arctyp --help
135
+
136
+ # Vérifier que le verrouillage des dépendances est à jour
137
+ uv lock --check
138
+
139
+ # Lancer la suite de tests (unittest, stdlib — aucune dépendance supplémentaire)
140
+ uv run python -m unittest discover -s tests -v
141
+ ```
142
+
143
+ **Test rapide** :
144
+
145
+ ```bash
146
+ uv run arctyp --version # -> arctyp 0.1.0
147
+ uv run arctyp uml diagrams/schema.puml # rend le diagramme via l'API PlantUML (foo.puml -> foo.svg)
148
+ uv run arctyp compile rapport.pdf # rend les diagrammes puis compile main.typ en PDF
149
+ uv run arctyp doctor # diagnostique le projet et la chaîne
150
+ ```
151
+
152
+ Les commandes sont déclarées via des décorateurs dans le paquet `arctyp.commands` (un fichier
153
+ par commande) ; voir [CONTRIBUTING.md](CONTRIBUTING.md) pour la structure, l'ajout d'une commande
154
+ et les conventions.
155
+
156
+ ## Décisions de conception
157
+
158
+ Les choix structurants sont détaillés, avec leurs alternatives, dans le
159
+ [registre des décisions du wiki](../wiki/DECISIONS.md). Résumé côté CLI :
160
+
161
+ - **Pas de gestion de templates** : les templates se récupèrent par `git clone` (D-02) — la CLI
162
+ n'a ni `login`, ni `publish`, ni liste.
163
+ - **Templates = fichiers ordinaires** : jamais de paquet `@he-arc` à installer (D-01) ;
164
+ `arctyp init` crée un projet de base prêt à l'emploi.
165
+ - **Diagrammes avant compilation** : Typst n'a pas accès au réseau — la CLI rend les `.puml` et la
166
+ fonction `uml()` des templates charge le résultat (D-03).
167
+ - **Stdlib-only + `watchdog`** (seule dépendance, importée paresseusement) et tests `unittest`
168
+ (D-06) ; commandes déclarées par décorateurs dans chaque fichier (D-07).
169
+ - **Version de Typst épinglée** : 0.15.0 côté paquet Python (maximum PyPI), 0.15.1 compilateur —
170
+ écart documenté (D-08).
171
+
172
+ ## Dépôts liés
173
+
174
+ | Dépôt | Rôle |
175
+ |-------|------|
176
+ | [`wiki`](../wiki/) | Documentation du projet : README global, cahier des charges, guides |
177
+ | [`templates`](../templates/) | Dépôt GitLab des templates officiels ; liste et téléchargement via l'API GitLab |
178
+ | [`plantuml`](../plantuml/) | Serveur PlantUML : `docker compose`, configuration de durcissement |
179
+ | [`arctyp-web`](../arctyp-web/) | Interface web de gestion des projets et compilation (exploratoire) |
180
+
181
+ Les spécifications fonctionnelles et non fonctionnelles détaillées figurent dans le [cahier des charges](../wiki/CDC.md).
182
+
183
+ ## Équipe
184
+
185
+ Elias Tormos, Yanis Amani, Younes Kherbach (projet P3, HES d'été 2026-2027). Encadrement : Le Callennec Benoit, Senn Julien.
arctyp-0.1.2/README.md ADDED
@@ -0,0 +1,175 @@
1
+ # arctyp
2
+
3
+ > Point d'entrée unique pour la composition de documents Typst à la HE-Arc : rend les diagrammes UML en interne, copie les templates officiels depuis GitLab dans le projet et compile le PDF, sans dépendre d'aucun service externe.
4
+
5
+ État : en cours de développement (projet P3, HES d'été 2026-2027).
6
+
7
+ ## Table des matières
8
+
9
+ - [Pourquoi ce projet](#pourquoi-ce-projet)
10
+ - [Fonctionnement](#fonctionnement)
11
+ - [Installation](#installation)
12
+ - [Démarrage rapide](#démarrage-rapide)
13
+ - [Commandes](#commandes)
14
+ - [Configuration](#configuration)
15
+ - [Utilisation hors ligne](#utilisation-hors-ligne)
16
+ - [Développement](#développement)
17
+ - [Décisions de conception](#décisions-de-conception)
18
+ - [Dépôts liés](#dépôts-liés)
19
+ - [Équipe](#équipe)
20
+
21
+ ## Pourquoi ce projet
22
+
23
+ Typst n'effectue aucun accès réseau à la compilation : un document ne peut ni appeler le serveur PlantUML, ni télécharger un template. C'est le rôle de `arctyp` d'orchestrer ces étapes, qui n'ont pas d'équivalent dans Typst seul. L'utilisateur final ne manipule donc que la CLI, sans connaître l'existence des serveurs sous-jacents.
24
+
25
+ ## Fonctionnement
26
+
27
+ `arctyp` orchestre la compilation Typst sur le poste de l'utilisateur :
28
+
29
+ 1. rendre les diagrammes `.puml` via le serveur PlantUML interne et écrire les SVG en cache ;
30
+ 2. compiler `main.typ` en PDF via le paquet Python `typst` (nom de sortie obligatoire).
31
+
32
+ Le projet est initialisé par `arctyp init` : un projet de base prêt à l'emploi
33
+ (`conf.typ`, `template.typ`, `uml.typ`, `main.typ`, `diagrams/`, `images/`),
34
+ avec dépôt Git. Les templates officiels se récupèrent directement avec Git
35
+ (`git clone` du dépôt `templates`) — la CLI ne gère pas les templates.
36
+
37
+ Aucun paquet Typst n'est installé : le projet compile tel quel. L'utilisateur écrit son contenu
38
+ dans `main.typ`, et peut modifier les paramètres (couleurs, marges, page de titre…) directement dans
39
+ les fichiers, sans réinstaller quoi que ce soit :
40
+
41
+ ```typst
42
+ #import "conf.typ": *
43
+ ```
44
+
45
+ Typst est épinglé dans la CLI, la CI, le web et la documentation : le même PDF est produit partout.
46
+ Version actuelle : **0.15.0** (paquet Python `typst` — dernière version publiée sur PyPI ; la 0.15.1 du
47
+ compilateur n'y est pas encore disponible). Le web (`arctyp-web`, typst.ts) épinglera la même version
48
+ de compilateur, écart documenté le temps que les paquets rattrapent la release.
49
+
50
+ ## Installation
51
+
52
+ Prérequis : `pipx` ou `uv` installés.
53
+
54
+ ```bash
55
+ pipx install arctyp
56
+ # ou
57
+ uv tool install arctyp
58
+ ```
59
+
60
+ ## Démarrage rapide
61
+
62
+ ```bash
63
+ # Initie un projet de base complet avec dépôt Git
64
+ arctyp init mon-rapport
65
+ cd mon-rapport
66
+
67
+ # Compile : rend les diagrammes, génère le PDF demandé (nom obligatoire)
68
+ arctyp compile mon-rapport.pdf
69
+ ```
70
+
71
+ ## Commandes
72
+
73
+ | Commande | Rôle |
74
+ |----------|------|
75
+ | `arctyp init [répertoire]` | Initie un projet de base complet (conf.typ, template.typ, uml.typ, dossiers diagrams/ et images/, dépôt Git) ; répertoire courant par défaut ; `--force` pour écraser un répertoire non vide |
76
+ | `arctyp uml <fichier.puml>` | Rend un diagramme UML via le serveur PlantUML interne ; `--public` pour l'API publique |
77
+ | `arctyp compile <rapport.pdf>` | Rendu des diagrammes, compilation du PDF ; le nom de sortie est obligatoire ; `--public` pour le serveur PlantUML public |
78
+ | `arctyp watch <rapport.pdf>` | Compile puis recompile à chaque modification (Ctrl-C pour arrêter) ; `--public` pour le serveur PlantUML public |
79
+ | `arctyp doctor` | Diagnostic de la configuration et de l'accessibilité des serveurs |
80
+
81
+ ## Configuration
82
+
83
+ Un fichier `arctyp.toml` à la racine du projet regroupe ses paramètres ; il est écrit par
84
+ `arctyp init`. Les URLs des serveurs viennent de l'environnement (jamais de ce fichier, qui
85
+ est versionné) :
86
+
87
+ ```toml
88
+ [project]
89
+ entry = "main.typ" # fichier d'entrée Typst
90
+
91
+ [plantuml]
92
+ format = "svg" # "svg" (défaut) ou "png" — l'extension de sortie suit
93
+
94
+ [compile] # options passées telles quelles à typst.compile
95
+ # pdf_standards = "a-2b" # PDF/A pour l'archivage
96
+ # font_paths = ["polices/"] # polices supplémentaires (charte graphique)
97
+ # ppi = 144 # résolution des conversions d'images
98
+ # sys_inputs = { date = "..." } # valeurs injectées dans le document
99
+ # format = "pdf" # format de sortie
100
+ ```
101
+
102
+ Variables d'environnement : `ARCTYP_PLANTUML_URL` ou `[plantuml] url` dans arctyp.toml pour
103
+ viser un autre serveur PlantUML ; sinon le serveur de l'école (`plantuml.he-arc.ch`) est
104
+ utilisé par défaut, et l'option `--public` (`uml`, `compile`, `watch`, `doctor`) bascule sur
105
+ l'API publique. `arctyp doctor` vérifie cette configuration et l'accessibilité de la
106
+ chaîne ; les messages d'erreur sont explicites et actionnables lorsque un serveur est
107
+ injoignable.
108
+
109
+ ## Utilisation hors ligne
110
+
111
+ Dès lors que les diagrammes ont été rendus au moins une fois, un document se recompile hors ligne, sans accès au réseau de l'école.
112
+
113
+ ## Développement
114
+
115
+ Le projet est géré avec `uv` : l'environnement virtuel, les dépendances et l'installation
116
+ éditable sont pris en charge par cet outil.
117
+
118
+ ```bash
119
+ # Installer les dépendances (crée .venv) et synchroniser uv.lock
120
+ uv sync
121
+
122
+ # Lancer la CLI depuis les sources (équivalent à `arctyp ...`)
123
+ uv run arctyp --help
124
+ uv run python -m arctyp --help
125
+
126
+ # Vérifier que le verrouillage des dépendances est à jour
127
+ uv lock --check
128
+
129
+ # Lancer la suite de tests (unittest, stdlib — aucune dépendance supplémentaire)
130
+ uv run python -m unittest discover -s tests -v
131
+ ```
132
+
133
+ **Test rapide** :
134
+
135
+ ```bash
136
+ uv run arctyp --version # -> arctyp 0.1.0
137
+ uv run arctyp uml diagrams/schema.puml # rend le diagramme via l'API PlantUML (foo.puml -> foo.svg)
138
+ uv run arctyp compile rapport.pdf # rend les diagrammes puis compile main.typ en PDF
139
+ uv run arctyp doctor # diagnostique le projet et la chaîne
140
+ ```
141
+
142
+ Les commandes sont déclarées via des décorateurs dans le paquet `arctyp.commands` (un fichier
143
+ par commande) ; voir [CONTRIBUTING.md](CONTRIBUTING.md) pour la structure, l'ajout d'une commande
144
+ et les conventions.
145
+
146
+ ## Décisions de conception
147
+
148
+ Les choix structurants sont détaillés, avec leurs alternatives, dans le
149
+ [registre des décisions du wiki](../wiki/DECISIONS.md). Résumé côté CLI :
150
+
151
+ - **Pas de gestion de templates** : les templates se récupèrent par `git clone` (D-02) — la CLI
152
+ n'a ni `login`, ni `publish`, ni liste.
153
+ - **Templates = fichiers ordinaires** : jamais de paquet `@he-arc` à installer (D-01) ;
154
+ `arctyp init` crée un projet de base prêt à l'emploi.
155
+ - **Diagrammes avant compilation** : Typst n'a pas accès au réseau — la CLI rend les `.puml` et la
156
+ fonction `uml()` des templates charge le résultat (D-03).
157
+ - **Stdlib-only + `watchdog`** (seule dépendance, importée paresseusement) et tests `unittest`
158
+ (D-06) ; commandes déclarées par décorateurs dans chaque fichier (D-07).
159
+ - **Version de Typst épinglée** : 0.15.0 côté paquet Python (maximum PyPI), 0.15.1 compilateur —
160
+ écart documenté (D-08).
161
+
162
+ ## Dépôts liés
163
+
164
+ | Dépôt | Rôle |
165
+ |-------|------|
166
+ | [`wiki`](../wiki/) | Documentation du projet : README global, cahier des charges, guides |
167
+ | [`templates`](../templates/) | Dépôt GitLab des templates officiels ; liste et téléchargement via l'API GitLab |
168
+ | [`plantuml`](../plantuml/) | Serveur PlantUML : `docker compose`, configuration de durcissement |
169
+ | [`arctyp-web`](../arctyp-web/) | Interface web de gestion des projets et compilation (exploratoire) |
170
+
171
+ Les spécifications fonctionnelles et non fonctionnelles détaillées figurent dans le [cahier des charges](../wiki/CDC.md).
172
+
173
+ ## Équipe
174
+
175
+ Elias Tormos, Yanis Amani, Younes Kherbach (projet P3, HES d'été 2026-2027). Encadrement : Le Callennec Benoit, Senn Julien.
@@ -0,0 +1,22 @@
1
+ [project]
2
+ name = "arctyp"
3
+ version = "0.1.2"
4
+ description = "CLI d'orchestration pour la composition Typst à la HE-Arc : rend les diagrammes UML via PlantUML interne et compile le PDF en local."
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Yanis Amani", email = "yanis.amani@he-arc.ch" },
8
+ { name = "Elias Tormos", email = "elias.tormos@he-arc.ch" },
9
+ { name = "Younes Kherbach", email = "younes.kherbach@he-arc.ch" },
10
+ ]
11
+ requires-python = ">=3.13"
12
+ dependencies = [
13
+ "typst>=0.15.0",
14
+ "watchdog>=6.0.0",
15
+ ]
16
+
17
+ [project.scripts]
18
+ arctyp = "arctyp.cli:main"
19
+
20
+ [build-system]
21
+ requires = ["hatchling"]
22
+ build-backend = "hatchling.build"
@@ -0,0 +1,22 @@
1
+ """arctyp — orchestration CLI for Typst composition at HE-Arc.
2
+
3
+ Renders UML diagrams via the internal PlantUML server and compiles the PDF
4
+ locally.
5
+ """
6
+
7
+ from importlib.metadata import PackageNotFoundError
8
+ from importlib.metadata import version as _package_version
9
+
10
+ APP_NAME = "arctyp"
11
+
12
+ try:
13
+ # Single source of truth: [project].version in pyproject.toml, read from
14
+ # the installed package's metadata (never duplicated in code).
15
+ __version__: str = _package_version(APP_NAME)
16
+ except PackageNotFoundError: # running from an uninstalled source tree
17
+ __version__ = "0.0.0+unknown"
18
+
19
+
20
+ def user_agent() -> str:
21
+ """Shared User-Agent for the CLI's HTTP requests (name + version, single source)."""
22
+ return f"{APP_NAME}/{__version__} (HE-Arc)"
@@ -0,0 +1,8 @@
1
+ """Support for `python -m arctyp`."""
2
+
3
+ import sys
4
+
5
+ from arctyp.cli import main
6
+
7
+ if __name__ == "__main__":
8
+ sys.exit(main())