Skip to content

Commit 83edc8b

Browse files
committed
docs: rewrite all pages to match criteria4s style — concise, English, code-first
1 parent 26063b9 commit 83edc8b

7 files changed

Lines changed: 411 additions & 859 deletions

File tree

teckel-docs/docs/api.md

Lines changed: 28 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,57 @@
11
# API Reference
22

3-
Cuando la CLI no es suficiente — porque necesitas integrar Teckel en una aplicación existente, controlar el ciclo de vida del SparkSession, o componer pipelines con otra lógica — usas el módulo `teckel-api` directamente desde Scala.
4-
5-
El API está construido sobre Cats Effect y ofrece tres entry points con distintos niveles de abstracción. Elige el que mejor encaje con tu estilo de código.
6-
73
## Entry Points
84

9-
### `etl[F, O]` — Fully polymorphic
5+
Three entry points are available, differing in effect abstraction and execution model.
6+
7+
### `etl[F, O]`
108

11-
El entry point más genérico. Parametrizado sobre el efecto `F[_]` y el tipo de resultado `O`. Útil si ya tienes un stack de efectos definido y quieres integrar Teckel sin fijar `IO`.
9+
Generic, parameterized over effect type `F[_]` and result type `O`.
1210

1311
```scala
1412
import com.eff3ct.teckel.api._
1513
import cats.effect.IO
1614

17-
val yaml: String =
18-
"""
19-
|input:
20-
| - name: source
21-
| format: csv
22-
| path: 'data/input.csv'
23-
| options:
24-
| header: true
25-
|output:
26-
| - name: source
27-
| format: parquet
28-
| mode: overwrite
29-
| path: 'data/output'
30-
""".stripMargin
31-
32-
// F = IO, O = Unit → ejecuta el pipeline y escribe el output
33-
// Requiere SparkSession implícito y EvalContext[Unit] en scope
15+
// F = IO, O = Unit → execute mode (writes output files)
16+
// Requires implicit SparkSession and EvalContext[Unit] in scope
3417
val program: IO[Unit] = etl[IO, Unit](yaml)
3518
```
3619

37-
### `etlIO[O]` — Fija F = IO
20+
### `etlIO[O]`
3821

39-
El más habitual cuando trabajas con Cats Effect. Fija `F = IO` para no tener que especificarlo:
22+
Fixes `F = IO`.
4023

4124
```scala
4225
import com.eff3ct.teckel.api._
43-
import cats.effect.IO
44-
45-
val yaml: String = "..." // contenido YAML
4626

4727
val program: IO[Unit] = etlIO[Unit](yaml)
4828
```
4929

50-
### `unsafeETL[O]` — Síncrono y bloqueante
30+
### `unsafeETL[O]`
5131

52-
Ejecuta el pipeline de forma síncrona. Sin efectos, sin IO. Conveniente para scripts, jobs batch simples, o tests donde no quieres gestionar runtime de Cats Effect:
32+
Synchronous, blocking. Convenient for scripts and tests.
5333

5434
```scala
5535
import com.eff3ct.teckel.api._
5636

57-
val yaml: String = "..." // contenido YAML
58-
59-
unsafeETL[Unit](yaml) // bloquea hasta completar
37+
unsafeETL[Unit](yaml) // blocks until completion
6038
```
6139

62-
## Modos de evaluación
40+
## Evaluation Modes
6341

64-
El tipo `O` que pasas a cualquiera de los entry points determina qué hace Teckel con el pipeline. Hay dos contextos de evaluación disponibles.
42+
The type parameter `O` determines what Teckel does with the pipeline.
6543

6644
### Execute (`O = Unit`)
6745

68-
El modo por defecto. Ejecuta el DAG completo y escribe los outputs a sus destinos. Es el comportamiento que esperarías de un job ETL normal.
46+
Runs the full DAG and writes outputs.
6947

7048
```scala
71-
import com.eff3ct.teckel.api._
72-
73-
unsafeETL[Unit](yaml) // ejecuta y escribe
49+
unsafeETL[Unit](yaml)
7450
```
7551

7652
### Debug (`O = Context[DataFrame]`)
7753

78-
En lugar de escribir los outputs, devuelve todos los DataFrames intermedios como un `Map[String, DataFrame]`. Extremadamente útil para testing y depuración — puedes inspeccionar el estado del pipeline en cada paso sin tocar el almacenamiento.
54+
Returns all intermediate DataFrames without writing to storage. Useful for testing.
7955

8056
```scala
8157
import com.eff3ct.teckel.api._
@@ -84,67 +60,42 @@ import org.apache.spark.sql.DataFrame
8460

8561
val assets: Context[DataFrame] = unsafeETL[Context[DataFrame]](yaml)
8662

87-
// Todos los assets del pipeline están disponibles por nombre
88-
assets.foreach { case (name, df) =>
89-
println(s"\n=== $name ===")
90-
df.show(10)
91-
df.printSchema()
92-
}
93-
94-
// O accede a uno específico
95-
val activeUsers: DataFrame = assets("active_users")
63+
assets("active_users").show()
9664
```
9765

98-
Este modo es especialmente valioso en tests de integración: puedes verificar el resultado de transformaciones intermedias sin necesitar un sistema de ficheros real.
99-
100-
## Inspección sin Spark
66+
## Inspect Without Spark
10167

102-
Estas utilidades analizan el YAML y generan información sobre el pipeline sin necesitar un SparkSession — son puramente funcionales y muy rápidas.
68+
These utilities parse and analyze the pipeline without a `SparkSession`.
10369

10470
### Dry Run
10571

106-
Genera el plan de ejecución en texto: qué pasos se van a ejecutar, en qué orden y con qué configuración. También valida las referencias entre assets.
107-
10872
```scala mdoc:compile-only
10973
import com.eff3ct.teckel.api.DryRun
11074

111-
val yaml: String = "..." // contenido YAML
75+
val yaml: String = "..." // YAML content
11276

11377
DryRun.explain(yaml) match {
114-
case Right(plan) => println(plan)
115-
case Left(error) => println(s"Error: ${error.getMessage}")
78+
case Right(plan) => println(plan)
79+
case Left(err: Throwable) => println(s"Error: ${err.getMessage}")
11680
}
11781
```
11882

119-
### DocGen
120-
121-
Convierte el pipeline en documentación Markdown. Describe todas las fuentes, transformaciones y destinos con sus parámetros. Útil para mantener la documentación sincronizada con el pipeline real.
83+
### Doc Generation
12284

12385
```scala mdoc:compile-only
12486
import com.eff3ct.teckel.api.DocGen
12587

126-
val yaml: String = "..." // contenido YAML
88+
val yaml: String = "..." // YAML content
12789

128-
DocGen.generate(yaml).foreach(println)
90+
DocGen.generate(yaml).foreach(s => println(s))
12991
```
13092

131-
### GraphViz
132-
133-
Genera una representación gráfica del DAG. Soporta tres formatos: `mermaid` (el más habitual para GitHub/Notion), `dot` (para Graphviz) y `ascii` (para terminales).
93+
### DAG Visualization
13494

13595
```scala mdoc:compile-only
13696
import com.eff3ct.teckel.api.GraphViz
13797

138-
val yaml: String = "..." // contenido YAML
139-
140-
// Mermaid — se puede pegar directamente en GitHub o Notion
141-
val mermaid: Either[Throwable, String] = GraphViz.generate(yaml, "mermaid")
142-
143-
// DOT — para renderizar con graphviz o dot
144-
val dot: Either[Throwable, String] = GraphViz.generate(yaml, "dot")
145-
146-
// ASCII — para terminales y logs
147-
val ascii: Either[Throwable, String] = GraphViz.generate(yaml, "ascii")
98+
val yaml: String = "..." // YAML content
14899

149-
mermaid.foreach(println)
100+
GraphViz.generate(yaml, "mermaid").foreach(s => println(s)) // mermaid | dot | ascii
150101
```

teckel-docs/docs/cli.md

Lines changed: 22 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,49 @@
11
# CLI
22

3-
La CLI de Teckel es la forma más directa de usar el framework: construyes el uber JAR, apuntas a tu pipeline YAML y listo. No hace falta escribir ni una línea de Scala.
4-
5-
## Construir el JAR
6-
7-
El artefacto CLI incluye Spark empaquetado, así que no necesitas tener Spark instalado por separado:
3+
## Build
84

95
```bash
106
sbt cli/assembly
7+
# Output: cli/target/scala-2.13/teckel-etl_2.13.jar
118
```
129

13-
El JAR resultante queda en `cli/target/scala-2.13/teckel-etl_2.13.jar`. Este es el binario que usarás para todo.
14-
15-
## Ejecutar un pipeline
16-
17-
### Desde un fichero YAML
18-
19-
La forma más habitual. Apuntas al fichero con `-f`:
10+
## Running a Pipeline
2011

2112
```bash
13+
# From a file
2214
java -jar teckel-etl_2.13.jar -f pipeline.yaml
23-
```
2415

25-
### Desde stdin
26-
27-
Si generas el YAML dinámicamente o lo recibes de otra herramienta, puedes pasarlo por stdin con `-c`:
28-
29-
```bash
16+
# From stdin
3017
cat pipeline.yaml | java -jar teckel-etl_2.13.jar -c
31-
32-
# O generado dinámicamente
33-
envsubst < pipeline.template.yaml | java -jar teckel-etl_2.13.jar -c
3418
```
3519

36-
## Inspeccionar antes de ejecutar
37-
38-
Teckel tiene varias herramientas para entender lo que va a pasar antes de lanzar el job de Spark. Son especialmente útiles en CI, en revisiones de código, o simplemente cuando estás depurando un pipeline nuevo.
20+
## Dry Run
3921

40-
### Dry-run
41-
42-
Analiza el pipeline, valida las referencias cruzadas entre assets y muestra el plan de ejecución paso a paso. No instancia ningún SparkSession — es completamente ligero:
22+
Validates references and prints the execution plan. Does not start Spark.
4323

4424
```bash
4525
java -jar teckel-etl_2.13.jar -f pipeline.yaml --dry-run
4626
```
4727

48-
Si hay referencias rotas (un `from` que apunta a un asset que no existe, por ejemplo), aparecerán en el report antes de que intentes ejecutar nada.
49-
50-
### Generar documentación
28+
## Documentation Generation
5129

52-
Convierte el pipeline en un documento Markdown legible por humanos. Describe cada fuente, transformación y destino con sus parámetros:
30+
Generates a Markdown summary of inputs, transformations, and outputs.
5331

5432
```bash
5533
java -jar teckel-etl_2.13.jar -f pipeline.yaml --doc
5634
```
5735

58-
Útil para mantener la documentación sincronizada con el código — si el YAML cambia, el doc refleja el cambio automáticamente.
59-
60-
### Visualizar el DAG
36+
## DAG Visualization
6137

62-
Genera un grafo del pipeline que muestra las dependencias entre assets:
38+
Generates a Mermaid diagram of the pipeline graph.
6339

6440
```bash
6541
java -jar teckel-etl_2.13.jar -f pipeline.yaml --graph
6642
```
6743

68-
La salida por defecto es un diagrama Mermaid, que puedes pegar directamente en GitHub, Notion o cualquier herramienta que lo soporte.
44+
## Environment Variables
6945

70-
## Variables de entorno
71-
72-
Los valores en el YAML pueden referenciar variables de entorno usando la sintaxis `${VARIABLE}`. Esto permite tener un pipeline genérico y parametrizarlo en tiempo de ejecución:
46+
Reference environment variables in YAML using `${VAR}` syntax:
7347

7448
```yaml
7549
input:
@@ -78,38 +52,22 @@ input:
7852
path: '${INPUT_PATH}'
7953
options:
8054
header: true
81-
82-
output:
83-
- name: source
84-
format: parquet
85-
mode: overwrite
86-
path: '${OUTPUT_PATH}'
8755
```
8856
89-
Pasa las variables como variables de entorno al lanzar el JAR:
90-
9157
```bash
92-
INPUT_PATH=data/raw/2024-01.csv \
93-
OUTPUT_PATH=data/processed/2024-01 \
94-
java -jar teckel-etl_2.13.jar -f pipeline.yaml
58+
INPUT_PATH=data/input.csv java -jar teckel-etl_2.13.jar -f pipeline.yaml
9559
```
9660

97-
## Servidor REST embebido
98-
99-
Para casos donde quieres exponer tus pipelines como un servicio HTTP — integración con orquestadores, plataformas de datos, o simplemente para invocarlo desde otras herramientas — Teckel incluye un servidor embebido sin dependencias adicionales:
61+
## REST API Server
10062

10163
```bash
10264
java -jar teckel-etl_2.13.jar --server --port 8080
10365
```
10466

105-
Los endpoints disponibles son:
106-
107-
| Método | Path | Descripción |
108-
|--------|------|-------------|
109-
| `GET` | `/health` | Comprueba que el servidor está activo |
110-
| `POST` | `/dry-run` | Devuelve el plan de ejecución de un pipeline (body: YAML) |
111-
| `POST` | `/doc` | Genera documentación Markdown de un pipeline |
112-
| `POST` | `/graph` | Genera el DAG del pipeline en Mermaid |
113-
| `POST` | `/validate` | Valida la sintaxis y referencias de un pipeline |
114-
115-
Todos los endpoints `POST` esperan el YAML del pipeline como cuerpo de la petición y devuelven texto plano.
67+
| Method | Path | Description |
68+
|--------|-------------|------------------------------------|
69+
| GET | `/health` | Health check |
70+
| POST | `/dry-run` | Execution plan (body: YAML) |
71+
| POST | `/doc` | Markdown documentation (body: YAML)|
72+
| POST | `/graph` | DAG visualization (body: YAML) |
73+
| POST | `/validate` | Validate pipeline (body: YAML) |

0 commit comments

Comments
 (0)