{"id":47629709,"url":"https://github.com/netzulo/ine-explorer","last_synced_at":"2026-04-01T23:11:54.395Z","repository":{"id":334286870,"uuid":"1140867262","full_name":"netzulo/ine-explorer","owner":"netzulo","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-23T21:47:53.000Z","size":47,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-24T10:26:05.815Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/netzulo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-23T21:21:58.000Z","updated_at":"2026-01-23T21:48:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/netzulo/ine-explorer","commit_stats":null,"previous_names":["netzulo/ine-explorer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/netzulo/ine-explorer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netzulo%2Fine-explorer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netzulo%2Fine-explorer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netzulo%2Fine-explorer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netzulo%2Fine-explorer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/netzulo","download_url":"https://codeload.github.com/netzulo/ine-explorer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/netzulo%2Fine-explorer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-01T23:11:53.588Z","updated_at":"2026-04-01T23:11:54.378Z","avatar_url":"https://github.com/netzulo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ine-scripts\n\nCLI de scripts que replica las funciones clave del paquete R ineapir (es-ine) sobre la API JSON del INE (wstempus).\n\n## Descripción\n\n`ine-scripts` es una herramienta de línea de comandos Node.js ESM que proporciona acceso completo a la API JSON del Instituto Nacional de Estadística (INE) de España. Ofrece funcionalidades para:\n\n- Gestión de operaciones, tablas y series estadísticas\n- Descarga de metadatos y datos con caché, rate-limiting y reintentos\n- Almacenamiento en SQLite con exportación a JSONL\n- Normalización de datos a formato Parquet\n- Detección de cambios por checksum y lastModified\n- Búsqueda de texto completo (FTS) en el catálogo\n\n## Características\n\n### API REST del INE (wstempus)\n\n- ✅ Operaciones estadísticas\n- ✅ Tablas de operaciones\n- ✅ Series temporales\n- ✅ Metadatos y datos\n\n### Parámetros soportados\n\n- `nult`: Número de últimos elementos\n- `date`: Filtro por fecha\n- `det`: Nivel de detalle\n- `tip`: Tipo de recurso\n- `page`: Paginación\n- `tv`, `g1..gN`: Filtros adicionales\n\n### Almacenamiento y procesamiento\n\n- 📦 **SQLite**: Base de datos local para catálogo\n- 📄 **JSONL**: Exportación/importación en formato línea\n- 🗂️ **Parquet**: Normalización para análisis\n- 🔍 **FTS**: Búsqueda de texto completo\n- 💾 **Caché**: Sistema de caché para optimizar descargas\n- 🔄 **Diff**: Detección de cambios por checksum/lastModified\n\n## Instalación\n\n```bash\nnpm install\n```\n\n## Uso\n\n### Comandos disponibles\n\n#### Operaciones\n\n```bash\n# Listar operaciones locales\nnode src/cli.js operations --list\n\n# Sincronizar operaciones desde la API\nnode src/cli.js operations --sync\n\n# Obtener operación específica\nnode src/cli.js operations --get IPC\n\n# Sincronizar con parámetros\nnode src/cli.js operations --sync --nult 10 --det 2\n\n# Exportar a JSONL\nnode src/cli.js operations --list --export-jsonl operations.jsonl\n\n# Exportar a Parquet\nnode src/cli.js operations --list --export-parquet operations.parquet\n```\n\n#### Tablas\n\n```bash\n# Sincronizar tablas de una operación\nnode src/cli.js tables --sync IPC30138\n\n# Listar tablas de una operación\nnode src/cli.js tables --operation IPC30138\n\n# Obtener tabla específica\nnode src/cli.js tables --get 50902\n\n# Exportar tabla a Parquet\nnode src/cli.js tables --get 50902 --export-parquet tabla.parquet\n```\n\n#### Series\n\n```bash\n# Sincronizar series de una tabla\nnode src/cli.js series --sync 50902\n\n# Listar series de una tabla\nnode src/cli.js series --table 50902\n\n# Obtener datos de una serie\nnode src/cli.js series --data IPC251852\n\n# Obtener datos con filtros\nnode src/cli.js series --data IPC251852 --nult 12 --tv 1 --g1 100\n\n# Exportar serie a Parquet\nnode src/cli.js series --data IPC251852 --export-parquet serie.parquet\n```\n\n#### Búsqueda (FTS)\n\n```bash\n# Buscar en todo el catálogo\nnode src/cli.js search \"precio consumo\"\n\n# Buscar solo en operaciones\nnode src/cli.js search \"IPC\" --type operations\n\n# Buscar solo en tablas\nnode src/cli.js search \"nacional\" --type tables\n\n# Buscar solo en series\nnode src/cli.js search \"mensual\" --type series\n```\n\n#### Detección de cambios\n\n```bash\n# Verificar cambios en una operación\nnode src/cli.js diff --id IPC30138 --type operation\n\n# Verificar cambios en una tabla\nnode src/cli.js diff --id 50902 --type table\n\n# Verificar cambios en una serie\nnode src/cli.js diff --id IPC251852 --type series\n```\n\n#### Importar/Exportar\n\n```bash\n# Exportar catálogo completo\nnode src/cli.js export --file catalog.jsonl\n\n# Exportar solo operaciones\nnode src/cli.js export --file operations.jsonl --type operations\n\n# Importar catálogo\nnode src/cli.js import --file catalog.jsonl\n```\n\n## Estructura del proyecto\n\n```\nine-scripts/\n├── src/\n│   ├── api-client.js         # Cliente HTTP con rate-limiting y retries\n│   ├── storage.js             # Gestor SQLite con FTS\n│   ├── parquet-exporter.js    # Exportador a formato Parquet\n│   ├── cli.js                 # Interface de línea de comandos\n│   └── index.js               # Exports para uso programático\n├── tests/\n│   ├── api-client.test.js\n│   ├── storage.test.js\n│   └── parquet-exporter.test.js\n├── data/                      # Base de datos y caché (generado)\n│   ├── catalog.db\n│   └── cache/\n├── .github/\n│   └── workflows/\n│       └── ci.yml             # GitHub Actions CI\n├── package.json\n├── eslint.config.js\n└── README.md\n```\n\n## API Programática\n\nTambién puedes usar `ine-scripts` como biblioteca:\n\n```javascript\nimport { INEApiClient, StorageManager, ParquetExporter } from './src/index.js';\n\n// Cliente API\nconst client = new INEApiClient({\n  retries: 3,\n  rateLimit: 10,\n  rateLimitInterval: 1000\n});\n\nconst operations = await client.getOperations({ nult: 5 });\n\n// Almacenamiento\nconst storage = new StorageManager({\n  dbPath: './data/catalog.db',\n  cachePath: './data/cache'\n});\n\nawait storage.init();\nawait storage.saveOperation(operations[0]);\n\n// Exportar a Parquet\nconst exporter = new ParquetExporter({\n  outputDir: './data/parquet'\n});\n\nawait exporter.exportSeries(seriesData, 'output.parquet');\n```\n\n### Runner del ejemplo\n\nPara ejecutar el ejemplo anterior sin copiar código ni configurar nada adicional, usa el runner incluido:\n\n```bash\nnpm run example\n```\n\nEste comando ejecuta el script de ejemplo en [examples/programmatic-runner.js](examples/programmatic-runner.js), crea/actualiza la base de datos en [data/catalog.db](data/catalog.db) y exporta un archivo Parquet en [data/parquet/example-series.parquet](data/parquet/example-series.parquet).\n\n## Desarrollo\n\n### Ejecutar tests\n\n```bash\nnpm test\n```\n\n### Ejecutar linter\n\n```bash\nnpm run lint\nnpm run lint:fix\n```\n\n### Estructura de datos\n\nLa base de datos SQLite incluye:\n\n- **operations**: Operaciones estadísticas del INE\n- **tables**: Tablas asociadas a operaciones\n- **series**: Series temporales asociadas a tablas\n- ***_fts**: Tablas FTS5 para búsqueda de texto completo\n\nCada tabla incluye:\n- `id`: Identificador único\n- `code`: Código del recurso\n- `name`: Nombre descriptivo\n- `metadata`: JSON con metadatos completos\n- `checksum`: SHA-256 para detección de cambios\n- `last_modified`: Fecha de última modificación\n- `created_at`, `updated_at`: Timestamps\n\n## Dependencias principales\n\n- **better-sqlite3**: Base de datos SQLite con soporte FTS5\n- **commander**: Parser de CLI\n- **p-retry**: Reintentos con backoff exponencial\n- **p-throttle**: Rate limiting\n- **parquetjs**: Lectura/escritura de archivos Parquet\n\n## Compatibilidad\n\n- Node.js \u003e= 18.0.0\n- ESM (ECMAScript Modules)\n\n## Licencia\n\nMIT\n\n## Referencias\n\n- [API INE wstempus](https://www.ine.es/dyngs/DataLab/manual.html?cid=45)\n- [Paquete R ineapir](https://github.com/oddworldng/ineapir)\n\n## Contribuir\n\nLas contribuciones son bienvenidas. Por favor:\n\n1. Fork el proyecto\n2. Crea una rama para tu feature (`git checkout -b feature/amazing-feature`)\n3. Commit tus cambios (`git commit -m 'Add amazing feature'`)\n4. Push a la rama (`git push origin feature/amazing-feature`)\n5. Abre un Pull Request\n\n## Soporte\n\nPara reportar bugs o solicitar features, por favor abre un issue en GitHub.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetzulo%2Fine-explorer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetzulo%2Fine-explorer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetzulo%2Fine-explorer/lists"}