rybak


Namerybak JSON
Version 0.5.0 PyPI version JSON
download
home_pageNone
SummaryDirectory-tree generator library
upload_time2024-10-27 20:32:41
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Rybak

_/ˈrɨ.bak/_

Directory-tree generator library.

## Synopsis

Rybak is an extension of template engines, which instead of rendering a single file or string, renders a whole
directory.

In a way it's similar to
[Cookiecutter](https://pypi.org/project/cookiecutter/) or
[Copier](https://pypi.org/project/copier/),
but while these programs are designed specifically for generating software projects scaffolding,
Rybak is a library for generating arbitrary directory tree structures.

Rybak template is a directory consisting of template files.
[Jinja](https://pypi.org/project/jinja2/), and
[Mako](https://pypi.org/project/mako/)
are supported, though one project can only use a single template engine.

Goals:

- [x] generate directory-tree based on a user-provided template and data,
- [x] keep track and remove files that aren't produced by the template,
- [x] allow for multiple files to be generated from a single template file,
- [ ] support but don't require templates to be git or other DCVS repositories.

Non-goals:

- command line interface,
- prompting users for template data.

## Usage

```python
from pathlib import Path
from rybak import TreeTemplate
from rybak.jinja import JinjaAdapter
from jinja2.loaders import FileSystemLoader

TreeTemplate(
    JinjaAdapter(loader=FileSystemLoader('template_root')),
).render(
    {'likes': {
        'Alice': 'Bob',
        'Bob': 'Charlie',
        'Charlie': 'cats',
    }},
    Path('target_root'),
)
```

- `template_root`:
  is the directory containing template files, in this case Jinja templates. Templates can be used in file content, file
  names and directory names.

### Multiple template roots

With Jinja Adapter you can use `ChoiceLoader` with a collection of `FileSystemLoader` and `PackageLoader` instances.

Mako adapter accepts a collection of directories.

### Single template multiple data

Template files can be applied to collections of items.
In order to do so, a special function is made available, `loop_over` that iterates over a passed collection. The
function can only be used in templates in file names.

`loop_over` returns the element of the collection, so that it can be used to render name.

model:

```python
names = [
    'Alice',
    'Bob',
    'Charlie',
]
```

file name:
`{{loop_over(names)}}`
would produce three files: Alice, Bob and Charlie.

The current item is also available during rendering the file contents, as model variable `item`.

Of course, we might want different value in the file name and its content. For that we can manipulate the `loop_over`s
result:

model:

```python
likes = {
    'Alice': 'Bob',
    'Bob': 'Charlie',
    'Charlie': 'cats',
}
```

file name: `{{loop_over(likes.items())[0]}}`

file content: `{{item[1]}}`

`loop_over(likes.items())` produces a key-value tuple for each file, and `[0]` accesses the key.

Similarly, `{{items}}` would produce the same key-value pair, and [1] accesses the value.

Alternatively, the model could be a list of complex objects:

model:

```python
likes = [
    {'name': 'Alice', 'likes': 'Bob'},
    {'name': 'Bob', 'likes': 'Charlie'},
    {'name': 'Charlie', 'likes': 'cats'},
]
```

In this case the file name template simplifies to `{{loop_over(likes).name}}` and the content template
to `{{item.likes}}`.

## Installation

Rybak templates can work with either of Jinja, Mako or Torado; so typically you need to install Rybak and one of those
libraries.

installing `rybak[jinja]` or `rybak[mako]` will handle this.

## Name

'y' is pronounced like in 'sit',
'a' like in 'father', just shorter.

Rybak is a Polish word for fisherman.

The original idea was to only support Mako templates, which is named by a species of a shark.

Functionality of this library is provided by the template engine, so picture a fisherman pulled by a shark.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "rybak",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "Rafa\u0142 Krupi\u0144ski <rafalkrupinski@users.noreply.github.com>",
    "download_url": "https://files.pythonhosted.org/packages/8f/76/81fd4eb5bb606426319e0eb81a48146c6e7848798e696bb33b9dd31bf062/rybak-0.5.0.tar.gz",
    "platform": null,
    "description": "# Rybak\n\n_/\u02c8r\u0268.bak/_\n\nDirectory-tree generator library.\n\n## Synopsis\n\nRybak is an extension of template engines, which instead of rendering a single file or string, renders a whole\ndirectory.\n\nIn a way it's similar to\n[Cookiecutter](https://pypi.org/project/cookiecutter/) or\n[Copier](https://pypi.org/project/copier/),\nbut while these programs are designed specifically for generating software projects scaffolding,\nRybak is a library for generating arbitrary directory tree structures.\n\nRybak template is a directory consisting of template files.\n[Jinja](https://pypi.org/project/jinja2/), and\n[Mako](https://pypi.org/project/mako/)\nare supported, though one project can only use a single template engine.\n\nGoals:\n\n- [x] generate directory-tree based on a user-provided template and data,\n- [x] keep track and remove files that aren't produced by the template,\n- [x] allow for multiple files to be generated from a single template file,\n- [ ] support but don't require templates to be git or other DCVS repositories.\n\nNon-goals:\n\n- command line interface,\n- prompting users for template data.\n\n## Usage\n\n```python\nfrom pathlib import Path\nfrom rybak import TreeTemplate\nfrom rybak.jinja import JinjaAdapter\nfrom jinja2.loaders import FileSystemLoader\n\nTreeTemplate(\n    JinjaAdapter(loader=FileSystemLoader('template_root')),\n).render(\n    {'likes': {\n        'Alice': 'Bob',\n        'Bob': 'Charlie',\n        'Charlie': 'cats',\n    }},\n    Path('target_root'),\n)\n```\n\n- `template_root`:\n  is the directory containing template files, in this case Jinja templates. Templates can be used in file content, file\n  names and directory names.\n\n### Multiple template roots\n\nWith Jinja Adapter you can use `ChoiceLoader` with a collection of `FileSystemLoader` and `PackageLoader` instances.\n\nMako adapter accepts a collection of directories.\n\n### Single template multiple data\n\nTemplate files can be applied to collections of items.\nIn order to do so, a special function is made available, `loop_over` that iterates over a passed collection. The\nfunction can only be used in templates in file names.\n\n`loop_over` returns the element of the collection, so that it can be used to render name.\n\nmodel:\n\n```python\nnames = [\n    'Alice',\n    'Bob',\n    'Charlie',\n]\n```\n\nfile name:\n`{{loop_over(names)}}`\nwould produce three files: Alice, Bob and Charlie.\n\nThe current item is also available during rendering the file contents, as model variable `item`.\n\nOf course, we might want different value in the file name and its content. For that we can manipulate the `loop_over`s\nresult:\n\nmodel:\n\n```python\nlikes = {\n    'Alice': 'Bob',\n    'Bob': 'Charlie',\n    'Charlie': 'cats',\n}\n```\n\nfile name: `{{loop_over(likes.items())[0]}}`\n\nfile content: `{{item[1]}}`\n\n`loop_over(likes.items())` produces a key-value tuple for each file, and `[0]` accesses the key.\n\nSimilarly, `{{items}}` would produce the same key-value pair, and [1] accesses the value.\n\nAlternatively, the model could be a list of complex objects:\n\nmodel:\n\n```python\nlikes = [\n    {'name': 'Alice', 'likes': 'Bob'},\n    {'name': 'Bob', 'likes': 'Charlie'},\n    {'name': 'Charlie', 'likes': 'cats'},\n]\n```\n\nIn this case the file name template simplifies to `{{loop_over(likes).name}}` and the content template\nto `{{item.likes}}`.\n\n## Installation\n\nRybak templates can work with either of Jinja, Mako or Torado; so typically you need to install Rybak and one of those\nlibraries.\n\ninstalling `rybak[jinja]` or `rybak[mako]` will handle this.\n\n## Name\n\n'y' is pronounced like in 'sit',\n'a' like in 'father', just shorter.\n\nRybak is a Polish word for fisherman.\n\nThe original idea was to only support Mako templates, which is named by a species of a shark.\n\nFunctionality of this library is provided by the template engine, so picture a fisherman pulled by a shark.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Directory-tree generator library",
    "version": "0.5.0",
    "project_urls": {
        "Changelog": "https://github.com/python-lapidary/rybak/blob/main/CHANGELOG.md",
        "Issues": "https://github.com/python-lapidary/rybak/issues",
        "Repository": "https://github.com/python-lapidary/rybak"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "95a6b09acdb6667a9f574a1c124dbecbec1136167ce6fc1bbd1ee3ea08832a7e",
                "md5": "255dc8080391a91beec2274902efe75f",
                "sha256": "34d377b01b0e37ade633589526863428782018d8f46100577452f4181583faae"
            },
            "downloads": -1,
            "filename": "rybak-0.5.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "255dc8080391a91beec2274902efe75f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 8970,
            "upload_time": "2024-10-27T20:32:40",
            "upload_time_iso_8601": "2024-10-27T20:32:40.194897Z",
            "url": "https://files.pythonhosted.org/packages/95/a6/b09acdb6667a9f574a1c124dbecbec1136167ce6fc1bbd1ee3ea08832a7e/rybak-0.5.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8f7681fd4eb5bb606426319e0eb81a48146c6e7848798e696bb33b9dd31bf062",
                "md5": "ca0db75a6dd7f6ce27e35d01cf0445c4",
                "sha256": "9733f6dcb1969092b7ceb0d65454d921ff7f33f24f4da5390e0b1674bfbc26bd"
            },
            "downloads": -1,
            "filename": "rybak-0.5.0.tar.gz",
            "has_sig": false,
            "md5_digest": "ca0db75a6dd7f6ce27e35d01cf0445c4",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 22290,
            "upload_time": "2024-10-27T20:32:41",
            "upload_time_iso_8601": "2024-10-27T20:32:41.444296Z",
            "url": "https://files.pythonhosted.org/packages/8f/76/81fd4eb5bb606426319e0eb81a48146c6e7848798e696bb33b9dd31bf062/rybak-0.5.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-27 20:32:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "python-lapidary",
    "github_project": "rybak",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "rybak"
}
        
Elapsed time: 0.31834s