| Name | scribe-templates JSON | 
            
| Version | 
                  0.3.1
                   
                  JSON | 
            
 | download  | 
            
| home_page | None  | 
            
| Summary | Rapid DOCX generation from Jinja2 templates – YAML + pydantic + Typer. | 
            | upload_time | 2025-07-30 15:22:27 | 
            | maintainer | None | 
            
            | docs_url | None | 
            | author | Alex | 
            
            | requires_python | >=3.10 | 
            
            
            | license | None | 
            | keywords | 
                 | 
            | VCS | 
                
                    | 
                
            
            | bugtrack_url | 
                
                 | 
             
            
            | requirements | 
                
                  No requirements were recorded.
                
             | 
            
| Travis-CI | 
                
                   No Travis.
                
             | 
            | coveralls test coverage | 
                
                   No coveralls.
                
             | 
        
        
            
            # scribe
> Rapid DOCX generation from Jinja2 templates – YAML + pydantic + Typer
`scribe` turns structured data (YAML / JSON / CSV / Excel) into polished Microsoft Word documents using **docxtpl** templates.  
It targets bulk workflows (tens - hundreds of files) yet remains friendly for single-document scripting.
---
## Installation
```bash
pip install scribe     # from PyPI (coming soon)
# or from source
pip install -e .
```
Python 3.10 + and LibreOffice/Microsoft Word (to open the results) are
required. On first use it will create `outputs/` directory next to the project root.
## Quick Start
```bash
# see registered templates
$ scribe list-templates
• annual_report         templates/annual_report.docx
# scan disk for unregistered templates
$ scribe list-templates --all
# generate one file
$ scribe generate annual_report data/report.yaml
# bulk render from CSV (one row per document)
$ scribe generate annual_report data/bulk.csv --delimiter ';'
```
### Global flags: 
| flag                         | default | description                       |
| ---------------------------- | ------- | --------------------------------- |
| `--log-level`                | INFO    | DEBUG / INFO / WARNING / ERROR    |
| `--log-json / --no-log-json` | -       | one-line JSON logs (for CI / k8s) |
### Discover and register new templates
```bash
$ scribe discover-templates
✓ 3 template(s) written to config/discovered_templates.yaml
# merge the snippet into config/app.yaml
```
## Public API (import and use in your own scripts)
```python
from pathlib import Path
from decimal import Decimal
from scribe import (
    DataLoader,
    TemplateFinder,
    get_settings,
    make_context,
    generate_docx,
)
# 1) pick a template
tpl_cfg = TemplateFinder().discover()[0]        # annual_report
# 2) load data
raw = DataLoader.load(Path("data/report.yaml"))  # dict or list[dict]
# 3) validate via side-car schema (if any)
ctx = make_context(tpl_cfg.path, raw)            # BaseDocContext or subclass
# 4) render
out_path = generate_docx(ctx, tpl_cfg, Path("outputs"))
print("wrote", out_path)
```
## Configuration
| source | precedence |
| ------ | ---------- |
| **CLI kwargs** | highest |
| `SCRIBE_*` environment variables | |
| `.env` file in CWD | |
| `config/app.yaml` | base |
### Environment variables
| name | example | purpose |
| ---- | ------- | ------- |
| `SCRIBE_OUTPUT_DIR` | `/tmp/reports` | override default outputs dir |
| `SCRIBE_TEMPLATES_DIR` | `/srv/docx:/opt/private` (path-sep list) | additional template search roots |
| `SCRIBE_LOG_JSON` | `1` | enable JSON logs in any context |
## Template validation (optional)
Add a file next to your template:
```yaml
# templates/annual_report.schema.yaml
client_name: str
report_date: date
summary: str
revenue: Decimal
details: List[scribe.models.custom:Detail]
```
`make_context` will generate a Pydantic model on the fly and coerce/validate incoming data before rendering.
## Rich text/conditional styling
`config/app.yaml`
```yaml
templates:
  - name: annual_report
    path: templates/annual_report.docx
    output_naming: "{client_name}_{report_date:%Y%m%d}.docx"
    options:
      richtext:
        status:
          - when: { equals: "APPROVED" }
            style: { bold: true, color: "008000" }
          - when: { equals: "REJECTED" }
            style: { bold: true, color: "CC0000" }
```
In your DOCX reference {{ richtext_status }} to get coloured text; the plain {{ status }} remains unchanged.
## Development & tests
```bash
# Linting & type-checking
ruff check scribe
mypy scribe
# Test suite
pytest -q --cov=scribe
```
### Commit conventions
- Black-formatted, fully-typed code
- NumPy-style docstrings
- CI matrix: Python 3.10 & 3.11
Feel free to open issues or PRs – contributions welcome!
            
         
        Raw data
        
            {
    "_id": null,
    "home_page": null,
    "name": "scribe-templates",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": null,
    "author": "Alex",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/98/15/31f65d5a4c85aa81adc4edf68aafd0cfe07973c7bff45c7085288c4c1dee/scribe_templates-0.3.1.tar.gz",
    "platform": null,
    "description": "# scribe\n\n> Rapid DOCX generation from Jinja2 templates \u2013 YAML + pydantic + Typer\n\n`scribe` turns structured data (YAML / JSON / CSV / Excel) into polished Microsoft Word documents using **docxtpl** templates.  \nIt targets bulk workflows (tens - hundreds of files) yet remains friendly for single-document scripting.\n\n---\n\n## Installation\n\n```bash\npip install scribe     # from PyPI (coming soon)\n# or from source\npip install -e .\n```\nPython 3.10 + and LibreOffice/Microsoft Word (to open the results) are\nrequired. On first use it will create `outputs/` directory next to the project root.\n\n## Quick Start\n\n```bash\n# see registered templates\n$ scribe list-templates\n\u2022 annual_report         templates/annual_report.docx\n\n# scan disk for unregistered templates\n$ scribe list-templates --all\n\n# generate one file\n$ scribe generate annual_report data/report.yaml\n\n# bulk render from CSV (one row per document)\n$ scribe generate annual_report data/bulk.csv --delimiter ';'\n```\n\n### Global flags: \n\n| flag                         | default | description                       |\n| ---------------------------- | ------- | --------------------------------- |\n| `--log-level`                | INFO    | DEBUG / INFO / WARNING / ERROR    |\n| `--log-json / --no-log-json` | -       | one-line JSON logs (for CI / k8s) |\n\n\n### Discover and register new templates\n\n```bash\n$ scribe discover-templates\n\u2713 3 template(s) written to config/discovered_templates.yaml\n# merge the snippet into config/app.yaml\n```\n\n## Public API (import and use in your own scripts)\n\n```python\nfrom pathlib import Path\nfrom decimal import Decimal\n\nfrom scribe import (\n    DataLoader,\n    TemplateFinder,\n    get_settings,\n    make_context,\n    generate_docx,\n)\n\n# 1) pick a template\ntpl_cfg = TemplateFinder().discover()[0]        # annual_report\n\n# 2) load data\nraw = DataLoader.load(Path(\"data/report.yaml\"))  # dict or list[dict]\n\n# 3) validate via side-car schema (if any)\nctx = make_context(tpl_cfg.path, raw)            # BaseDocContext or subclass\n\n# 4) render\nout_path = generate_docx(ctx, tpl_cfg, Path(\"outputs\"))\nprint(\"wrote\", out_path)\n```\n\n## Configuration\n\n| source | precedence |\n| ------ | ---------- |\n| **CLI kwargs** | highest |\n| `SCRIBE_*` environment variables | |\n| `.env` file in CWD | |\n| `config/app.yaml` | base |\n\n### Environment variables\n| name | example | purpose |\n| ---- | ------- | ------- |\n| `SCRIBE_OUTPUT_DIR` | `/tmp/reports` | override default outputs dir |\n| `SCRIBE_TEMPLATES_DIR` | `/srv/docx:/opt/private` (path-sep list) | additional template search roots |\n| `SCRIBE_LOG_JSON` | `1` | enable JSON logs in any context |\n\n\n## Template validation (optional)\n\nAdd a file next to your template:\n\n```yaml\n# templates/annual_report.schema.yaml\nclient_name: str\nreport_date: date\nsummary: str\nrevenue: Decimal\ndetails: List[scribe.models.custom:Detail]\n```\n\n`make_context` will generate a Pydantic model on the fly and coerce/validate incoming data before rendering.\n\n## Rich text/conditional styling\n\n`config/app.yaml`\n```yaml\ntemplates:\n  - name: annual_report\n    path: templates/annual_report.docx\n    output_naming: \"{client_name}_{report_date:%Y%m%d}.docx\"\n    options:\n      richtext:\n        status:\n          - when: { equals: \"APPROVED\" }\n            style: { bold: true, color: \"008000\" }\n          - when: { equals: \"REJECTED\" }\n            style: { bold: true, color: \"CC0000\" }\n```\nIn your DOCX reference {{ richtext_status }} to get coloured text; the plain {{ status }} remains unchanged.\n\n## Development & tests\n\n```bash\n# Linting & type-checking\nruff check scribe\nmypy scribe\n\n# Test suite\npytest -q --cov=scribe\n```\n\n### Commit conventions\n- Black-formatted, fully-typed code\n- NumPy-style docstrings\n- CI matrix: Python 3.10 & 3.11\n\nFeel free to open issues or PRs \u2013 contributions welcome!\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Rapid DOCX generation from Jinja2 templates \u2013 YAML + pydantic + Typer.",
    "version": "0.3.1",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "47235f1e28aa7bef037e4f2ece323f3d6539163b90c854da43f2693bf5a1b696",
                "md5": "db3adddd0d799d5f385eb9eb0616841d",
                "sha256": "0986b9aa6a8bbf0296bf3391122a951d329ec29090cc771017b42c37c905da7c"
            },
            "downloads": -1,
            "filename": "scribe_templates-0.3.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "db3adddd0d799d5f385eb9eb0616841d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 37561,
            "upload_time": "2025-07-30T15:22:26",
            "upload_time_iso_8601": "2025-07-30T15:22:26.046789Z",
            "url": "https://files.pythonhosted.org/packages/47/23/5f1e28aa7bef037e4f2ece323f3d6539163b90c854da43f2693bf5a1b696/scribe_templates-0.3.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "981531f65d5a4c85aa81adc4edf68aafd0cfe07973c7bff45c7085288c4c1dee",
                "md5": "f58b99478802c30c71201c527517c216",
                "sha256": "c792c331e4fb1dca96e83f7712df9657cafdce877115e079dd60a8e312d5846a"
            },
            "downloads": -1,
            "filename": "scribe_templates-0.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "f58b99478802c30c71201c527517c216",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 29793,
            "upload_time": "2025-07-30T15:22:27",
            "upload_time_iso_8601": "2025-07-30T15:22:27.463727Z",
            "url": "https://files.pythonhosted.org/packages/98/15/31f65d5a4c85aa81adc4edf68aafd0cfe07973c7bff45c7085288c4c1dee/scribe_templates-0.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-30 15:22:27",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "scribe-templates"
}