Configuration
Catnip utilise une configuration hiérarchique avec des overrides par mode d'exécution.
Fichier de Configuration
Emplacement : ~/.config/catnip/catnip.toml
Voir catnip.toml.example à la racine du projet pour un fichier complet commenté.
Structure de Base
# Config globale
enable_cache = true
[optimize]
executor = "vm"
jit = false
tco = true
optimize = 3
[repl]
no_color = false
theme = "auto" # auto, dark, light
[format]
indent_size = 4
line_length = 120
[cache]
cache_max_size_mb = 100 # Limite 100 Mo ("unlimited" pour illimité)
cache_ttl_seconds = 86400 # TTL 24 heures ("unlimited" pour pas d'expiration)
Configuration Par Mode
Catnip charge des overrides selon le mode d'exécution détecté.
Fonctionnement
Les sections [mode.X] dans catnip.toml surchargent les valeurs globales selon le contexte d'exécution :
standalone: Scripts.catexécutés via CLI (fichier fourni en argument)repl: Session interactive (pas de fichier, stdin est un TTY)embedded: Catnip importé comme bibliothèque Python
Ordre de priorité :
DEFAULT < FILE (global) < FILE ([mode.X]) < ENV < CLI
Les overrides par mode s'appliquent après la config globale du fichier mais avant les variables d'environnement.
Modes d'Exécution
Catnip détecte automatiquement 3 modes d'exécution et applique des overrides spécifiques :
Mode standalone (Scripts)
Déclenchement : catnip script.cat
Objectif : Startup rapide, scripts batch, automation
Config recommandée :
[mode.standalone]
jit = false # Pas de JIT : startup instant
optimize = 1 # Compilation rapide
tco = true # TCO utile pour récursion
Use cases :
- Scripts système (config validation, data transform)
- Cron jobs, automation
- CLI tools en Catnip
Mode repl (Interactif)
Déclenchement : catnip (sans arguments, stdin = tty)
Objectif : Performance interactive, exploration
Config recommandée :
[mode.repl]
jit = true # JIT pour perf runtime
optimize = 2 # Équilibre perf/compilation
tco = true # TCO pour expérimentation
Use cases :
- Exploration interactive
- Debugging
- Calculs quick
Mode embedded (DSL Python)
Déclenchement : from catnip import Catnip (usage library)
Objectif : Prévisibilité, debugging facile, intégration simple
Config recommandée :
[mode.embedded]
jit = false # Pas de JIT : intégration simple
tco = false # Pas de TCO : call stacks clairs
optimize = 0 # Comportement prédictible
Use cases :
- DSL dans applications Python
- Pandas/data wrangling DSL
- Config DSL, rule engines
Note : le mode embedded n'est pas encore auto-détecté. Pour l'instant, utilisez les sections
[optimize]et[repl]classiques pour embedded.
Précédence des Configurations
Ordre de priorité (du plus faible au plus fort) :
- Defaults (hardcodés)
- Fichier config (
~/.config/catnip/catnip.toml) - Mode overrides (
[mode.standalone],[mode.repl],[mode.embedded]) - Variables d'environnement (
CATNIP_EXECUTOR,CATNIP_OPTIMIZE,CATNIP_THEME,NO_COLOR) - Arguments CLI (
-x,-o,--theme,--no-color)
Exemple de Précédence
# catnip.toml
[optimize]
jit = false
optimize = 3
[mode.standalone]
optimize = 1
# Base
$ catnip -c "42" # jit=false, optimize=3 (base config)
# Mode override
$ catnip script.cat # jit=false, optimize=1 (mode.standalone)
# Env var override
$ CATNIP_OPTIMIZE=jit catnip script.cat
# jit=true, optimize=1 (env > mode)
# CLI override (highest)
$ catnip -o jit:off -o level:2 script.cat
# jit=false, optimize=2 (cli > all)
Options de Cache
Le cache de compilation stocke les résultats de parsing/compilation pour accélérer les exécutions répétées.
Emplacement : ~/.cache/catnip/ (XDG_CACHE_HOME)
Configuration :
[cache]
cache_max_size_mb = 50 # Taille maximale en Mo
cache_ttl_seconds = 7200 # Durée de vie des entrées (secondes)
Valeurs spéciales :
"unlimited": pas de limite de taille ou de TTL- Défauts : 100 Mo, 24 heures
Gestion via CLI :
catnip cache stats # Statistiques (taille, hits/misses)
catnip cache prune # Nettoyer entrées expirées
catnip cache clear # Vider complètement le cache
Voir CLI pour plus de détails.
Diagnostics
Les erreurs internes (WeirdErrors) sont automatiquement loggées sur disque sous forme de rapports JSON. Ces rapports servent au diagnostic post-mortem : un utilisateur peut les partager pour signaler un bug.
Emplacement : ~/.local/state/catnip/weird/ (XDG_STATE_HOME)
Configuration :
[diagnostics]
log_weird_errors = true # Actif par défaut
max_weird_logs = 50 # Rotation automatique
Env var : CATNIP_WEIRD_LOG=off désactive le logging (priorité sur le TOML).
Le logging est silencieux : une erreur I/O lors de l'écriture du rapport ne masque jamais l'erreur originale. Fonctionne dans les deux contextes : Python (via PyO3) et standalone Rust.
Variables d'Environnement
CATNIP_EXECUTOR:vm(défaut),astCATNIP_OPTIMIZE: syntaxe identique à-o(ex:jit,tco:off,level:2)CATNIP_THEME:auto(défaut),dark,lightNO_COLOR:1pour désactiver les couleurs (standard freedesktop.org)CATNIP_FORMAT_INDENT_SIZE: taille indentation (défaut: 4)CATNIP_FORMAT_LINE_LENGTH: longueur ligne max (défaut: 120)CATNIP_WEIRD_LOG:on/offpour activer/désactiver le logging des erreurs internes
Inspecter la Configuration
# Voir config actuelle
$ catnip config show
# Avec sources (defaults, file, env, cli)
$ catnip config show --debug
$ catnip config show
# /home/ari/.config/catnip/catnip.toml
cache_max_size_mb = 100
cache_ttl_seconds = 86400
enable_cache = true
executor = vm
jit = false
log_weird_errors = true
max_weird_logs = 50
no_color = false
optimize = 3
tco = true
theme = auto
$ catnip config show --debug
Configuration from: /home/ari/.config/catnip/catnip.toml
cache_max_size_mb: 100 [default]
cache_ttl_seconds: 86400 [default]
enable_cache: True [default]
executor: 'vm' [default]
jit: False [default]
log_weird_errors: True [default]
max_weird_logs: 50 [default]
no_color: False [default]
optimize: 3 [default]
tco: True [default]
theme: 'auto' [default]
--- format config ---
format.indent_size: 4 [default]
format.line_length: 120 [default]
Exemples Pratiques
Dev : debugging avec AST interprète
export CATNIP_EXECUTOR=ast
export CATNIP_OPTIMIZE=tco:off,level:0
catnip myscript.cat
Prod : max performance
export CATNIP_OPTIMIZE=jit,level:3
catnip -o tco batch_processing.cat
CI : reproducibilité
[mode.standalone]
jit = false
tco = false
optimize = 0
Notes
- Les overrides par mode sont optionnels : si absents, la config de base s'applique
- Les 3 modes peuvent coexister dans le même fichier
- La détection de mode est automatique et transparente