docs: CLAUDE.md v0.2.3 - initDeferred() y rangos negativos

Documentación añadida:
- initDeferred(): control manual sin auto-crear archivo
- Arquitectura 3 fuentes (File > BD > Defaults)
- Validación rangos negativos: "-100-100" soportado
- Historial con commits 0ef5efd y 957767d

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
reugenio 2025-12-18 19:05:06 +01:00
parent 957767d865
commit 9b1d85c8c3

View file

@ -26,9 +26,9 @@ PATH=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2:$PATH zig
| Campo | Valor |
|-------|-------|
| **Nombre** | zcatconfig |
| **Version** | v0.2.1 |
| **Version** | v0.2.3 |
| **Fecha inicio** | 2025-12-17 |
| **Estado** | FUNCIONAL - Integrado en zsimifactu |
| **Estado** | FUNCIONAL - Integrado en zsimifactu (arquitectura 3 fuentes) |
| **Lenguaje** | Zig 0.15.2 |
| **Dependencias** | Ninguna (Zig puro) |
@ -208,10 +208,15 @@ const zcatconfig = @import("zcatconfig");
// Crear ConfigManager tipado
const MyConfigManager = zcatconfig.ConfigManager(&variables, MyConfig, "mi_app");
// Inicializar (carga o crea archivo)
// Opcion 1: init() - Carga o crea archivo automaticamente
var manager = try MyConfigManager.init(allocator, "config.txt");
defer manager.deinit(); // Auto-save si dirty
// Opcion 2: initDeferred() - NO carga/crea archivo (control manual)
var manager = MyConfigManager.initDeferred(allocator, "config.txt");
// Luego cargar manualmente cuando sea necesario:
try manager.load(); // o manager.save() para crear
// Acceso
const cfg = manager.getConfig();
try manager.set("@mi_variable", "nuevo_valor");
@ -220,6 +225,39 @@ try manager.set("@mi_variable", "nuevo_valor");
manager.addObserver(myCallback, my_context);
```
### initDeferred() - Control manual de archivo (v0.2.3)
Cuando necesitas controlar **cuándo** se crea/carga el archivo (ej: arquitectura 3 fuentes):
```zig
// Caso de uso: File > BD > Defaults
// 1. Crear manager SIN cargar archivo
var manager = MyConfigManager.initDeferred(allocator, "config.txt");
// 2. Verificar si existe archivo
const archivo_existe = std.fs.cwd().access("config.txt", .{}) catch false;
// 3. Verificar si BD tiene config
const bd_tiene_config = checkDatabase();
// 4. Aplicar prioridad
if (archivo_existe) {
try manager.load(); // Cargar de archivo
syncToBd(&manager); // Sync a BD
} else if (bd_tiene_config) {
loadFromBd(&manager); // Cargar de BD
try manager.save(); // Crear archivo
} else {
try manager.save(); // Crear con defaults
syncToBd(&manager); // Sync defaults a BD
}
```
**Por qué initDeferred()?**
- `init()` llama `loadOrCreate()` que crea el archivo con defaults
- Si BD tiene valores, el archivo ya existe antes de poder verificar
- `initDeferred()` permite verificar BD primero, luego decidir
### FileWatcher (hot-reload)
```zig
@ -243,6 +281,46 @@ zcatconfig.loadFromString(&variables, Config, &config, defaults);
---
## VALIDACION DE RANGOS (v0.2.3)
### Rangos negativos soportados
La validación de rangos ahora soporta valores mínimos negativos:
```zig
// Definición de variable con rango negativo
.{ .name = "offset_x", .var_type = .integer, .range = "-100-100", ... }
.{ .name = "offset_y", .var_type = .integer, .range = "-50-50", ... }
.{ .name = "temperature", .var_type = .float, .range = "-40.0-85.0", ... }
```
### Bug corregido (commit `957767d`)
**Problema:** `splitScalar('-')` dividía `"-100-100"` como `["", "100", "100"]`
**Solución:** Buscar el separador '-' excluyendo el primer carácter si es negativo:
```zig
const separator_pos = blk: {
const start: usize = if (range.len > 0 and range[0] == '-') 1 else 0;
for (range[start..], start..) |c, i| {
if (c == '-') break :blk i;
}
return false;
};
```
### Formatos de rango válidos
| Rango | Mínimo | Máximo | Notas |
|-------|--------|--------|-------|
| `"0-100"` | 0 | 100 | Positivo simple |
| `"-100-100"` | -100 | 100 | Negativo a positivo |
| `"-50-50"` | -50 | 50 | Centrado en cero |
| `"-100-0"` | -100 | 0 | Solo negativos |
---
## EQUIPO
- **Usuario (R.Eugenio)**: Desarrollador principal
@ -252,8 +330,10 @@ zcatconfig.loadFromString(&variables, Config, &config, defaults);
## HISTORIAL
| Fecha | Version | Cambios |
|-------|---------|---------|
| 2025-12-18 | v0.2.1 | FileWatcher, loadFromString, updateMtime |
| 2025-12-17 | v0.2.0 | ConfigManager con observers, auto-save, isDirty |
| 2025-12-17 | v0.1.0 | Proyecto creado, Engine + persistence |
| Fecha | Version | Commit | Cambios |
|-------|---------|--------|---------|
| 2025-12-18 | v0.2.3 | `957767d` | validateIntRange/Float fix: rangos negativos `"-100-100"` |
| 2025-12-18 | v0.2.2 | `0ef5efd` | initDeferred(): control manual sin auto-crear archivo |
| 2025-12-18 | v0.2.1 | - | FileWatcher, loadFromString, updateMtime |
| 2025-12-17 | v0.2.0 | - | ConfigManager con observers, auto-save, isDirty |
| 2025-12-17 | v0.1.0 | - | Proyecto creado, Engine + persistence |