Skip to main content

Copier's built-in Jinja2 extension, inspired by Ansible, outsourced for you

Project description

Copier's built-in Jinja2 Extension

Tests Python versions PyPI Formatter & Linter: Ruff Type-checker: mypy

Copier's built-in Jinja2 extension, inspired by Ansible, outsourced for you.

Installation

  • With pip:

    pip install jinja2-copier-extension
    
  • With uv:

    uv add jinja2-copier-extension
    
  • With poetry:

    poetry add jinja2-copier-extension
    
  • With pdm:

    pdm add jinja2-copier-extension
    
  • With pipx (injected into the pipx-managed virtual env of a package):

    pipx inject PACKAGE jinja2-copier-extension
    
  • With uvx (injected into the uvx-managed virtual env of a package):

    uvx --with jinja2-copier-extension PACKAGE
    

Usage

Register the extension in your Jinja2 environment to use the provided filters:

from jinja2 import Environment

env = Environment(extensions=["jinja2_copier_extension.CopierExtension"])

# Example:
template = env.from_string("The current time is {{ '%H:%M' | strftime }}")
result = template.render()
print(result)

Filters

The extension provides the following Jinja2 filters:

Base64

b64decode(value: str, encoding: str = "utf-8") → str

Decode a Base64 encoded string.

Example:

Template
{{ 'aGVsbG8gd29ybGQ=' | b64decode }}
Output
"hello world"

b64encode(value: str, encoding: str = "utf-8") → str

Encode a Base64 encoded string.

Example:

Template
{{ 'hello world' | b64encode }}
Output
"YSBzdHJpbmc="

Date/Time

strftime(format: str, second: float | None = None) → str

Convert a Unix timestamp to a date/time string according to a date/time format.

Example:

Template
{{ '%H:%M:%S' | strftime }}
Output
"02:03:04"

to_datetime(string: str, format: str = "%Y-%m-%d %H:%M:%S") → datetime

Convert a string containing date/time information to a datetime object.

Example:

Template
{{ '2016-08-14 20:00:12' | to_datetime }}
Output
datetime.datetime(2016, 8, 14, 20, 0, 12)

Hashing

hash(data: str, algorithm: str = "sha1") → str

Hash data using a configurable algorithm.

Example:

Template
{{ 'hello world' | hash }}
Output
"2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"

md5(data: str) → str

Hash data using the MD5 algorithm.

Example:

Template
{{ 'hello world' | md5 }}
Output
"5eb63bbbe01eeed093cb22bb8f5acdc3"

sha1(data: str) → str

Hash data using the SHA1 algorithm.

Example:

Template
{{ 'hello world' | sha1 }}
Output
"2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"

JSON

from_json(data: str, /, **kwargs: Any) → Any

Deserialize JSON data.

Example:

Template
{% filter from_json %}
{
  "name": "Jane",
  "age": 30
}
{% endfilter %}
Output
{"name": "Jane", "age": 30}

to_json(obj: Any, /, **kwargs: Any) → str

Serialize an object as JSON.

Example:

Template
{{ {'name': 'Jane', 'age': 30} | to_json }}
Output
{"name": "Jane", "age": 30}

to_nice_json(obj: Any, /, **kwargs: Any) → str

Serialize an object as JSON with nice formatting.

Example:

Template
{{ {'name': 'Jane', 'age': 30} | to_nice_json }}
Output
{
    "age": 30,
    "name": "Jane"
}

Filesystem

basename(path: str) → str

Get the final component of a path.

Example:

Template
{{ '/etc/asdf/foo.txt' | basename }}
Output
"foo.txt"

dirname(path: str) → str

Get the directory component of a path.

Example:

Template
{{ '/etc/asdf/foo.txt' | basename }}
Output
"/etc/asdf"

expanduser(path: str) → str

Expand a path with the ~ and ~user constructions.

Example:

Template
{{ '~/path/to/foo.txt' | expanduser }}
Output
"/home/<user>/path/to/foo.txt"    # Linux
"/Users/<user>/path/to/foo.txt"   # macOS
"C:/Users/<user>/path/to/foo.txt" # Windows

expandvars(path: str) → str

Expand a path with the shell variables of form $var and ${var}.

Example:

Template
{{ '$HOME/path/to/foo.txt' | expandvars }}
Output
"/home/<user>/path/to/foo.txt"    # Linux
"/Users/<user>/path/to/foo.txt"   # macOS
"C:/Users/<user>/path/to/foo.txt" # Windows

fileglob(pattern: str) → list[str]

Get all files in a filesystem subtree accoring to a glob pattern.

Example:

Filesystem
📁 .
├── 📄 a.txt
├── 📄 b.csv
└── 📁 c
    ├── 📄 d.txt
    └── 📄 e.json
Template
{{ '**/*.txt' | fileglob() | sort }}
Output
["a.txt", "c/d.txt"]

realpath(path: str) → str

Get the canonical form of a path.

Example:

Filesystem
📁 .
└── 📁 a
    ├── 📁 b
    │   └── 📄 foo.txt
    └── 📁 c
        └── 📄 bar.txt
Template
{{ 'a/c/../b/foo.txt' | realpath }}
Output
"<cwd>/a/b/foo.txt"

splitext(path: str) → tuple[str, str]

Split the extension of a path.

Example:

Template
{{ 'foo.txt' | splitext }}
Output
("foo", ".txt")

win_basename(path: str) → str

Get the final component of a Windows path.

Example:

Template
{{ 'C:/Temp/asdf/foo.txt' | win_basename }}
Output
"foo.txt"

win_dirname(path: str) → str

Get the directory component of a Windows path.

Example:

Template
{{ 'C:/Temp/asdf/foo.txt' | win_dirname }}
Output
"C:/Temp/asdf"

win_splitdrive(path: str) → tuple[str, str]

Split a Windows path into a drive and path.

Example:

Template
{{ 'C:/Temp/asdf/foo.txt' | win_splitdrive }}
Output
("C:", "/Temp/asdf/foo.txt")

Random

shuffle[T](seq: Sequence[T], seed: str | None = None) → list[T]

Shuffle a sequence of elements.

Example:

Template
{{ [1, 2, 3] | shuffle(seed=123) }}
Output
[2, 1, 3]

ans_random[T](stop: int | Sequence[T], start: int = 0, step: int = 0, seed: str | None = None) → int | T

Generate a random integer in a range or choose a random element from a sequence.

Example:

Template
{{ 100 | ans_random(seed='123') }}
Output
93

random_mac(prefix: str, seed: str | None = None) → str

Generate a random MAC address given a prefix.

Example:

Template
{{ '52:54' | random_mac(seed='123') }}
Output
"52:54:25:a4:fc:1f"

Regular expressions

regex_escape(pattern: str, re_type: Literal["python", "posix_basic"] = "python") → str

Escape special characters in a regex pattern string.

Example:

Template
{{ '^a.*b(.+)\c?$' | regex_escape }}
Output
r"\^a\.\*b\(\.\+\)\\c\?\$"

regex_findall(string: str, regex: str, multiline: bool = False, ignorecase: bool = False) → list[str] | list[tuple[str, ...]]

Extract non-overlapping regex matches using re.findall.

Example:

Template
{{ 'foo bar' | regex_findall('[a-z]+') }}
Output
["foo", "bar"]

regex_replace(string: str, pattern: str, replacement: str, ignorecase: bool = False, multiline: bool = False) → str

Substitute non-overlapping regex matches using re.sub.

Example:

Template
{{ 'copier' | regex_replace('^(.*)ier$', '\\1y') }}
Output
"copy"

regex_search(string: str, pattern: str, *args: str, ignorecase: bool = False, multiline: bool = False) → str | list[str] | None

Search a string for a regex match using re.search.

Example:

Template
{{ 'foo/bar' | regex_search('[a-z]+') }}
Output
"foo"

Shell

quote(value: str) → str

Shell-escape a string.

Example:

Template
echo {{ 'hello world' | quote }}
Output
"echo 'hello world'"

Types

bool(value: Any) → bool

Parse anything to boolean.

  1. Cast to number. Then: 0 → False; anything else → True.
  2. Find YAML booleans, YAML nulls or "none" in it and use it appropriately.
  3. Cast to boolean using standard Python bool(value).

Example:

Template
{{ 'yes' | bool }}
Output
True

type_debug(obj: object) → str

Get the type name of an object.

Example:

Template
{{ 123 | type_debug }}
Output
"int"

Utilities

ans_groupby[V](value: Iterable[V], attribute: str | int) → list[tuple[str | int, list[V]]]

Group a sequence of objects by an attribute.

Example:

Template
{{ [{'name': 'Jane', 'age': 30}, {'name': 'Alice', 'age': 30}, {'name': 'John', 'age': 20}] | ans_groupby('age') }}
Output
[(20, [{"name": "John", "age": 20}]), (30, [{"name": "Jane", "age": 30}, {"name": "Alice", "age": 30}])]

extract(key: Any, container: Any, morekeys: Any | Sequence[Any] | None = None) → Any | Undefined

Extract a value from a container.

Example:

Template
{{ 'k' | extract({'k': 'v'}) }}
Output
"v"

flatten(seq: Sequence[Any], levels: int | None = None) → list[Any]

Flatten nested sequences, filter out None values.

Example:

Template
{{ [1, [None, [2, None, [3]]]] | flatten }}
Output
[1, 2, 3]

mandatory[T](value: T, msg: str | None = None) → T

Require a value to be defined.

Example:

Template
{{ 'foo' | mandatory }}
Output
"foo"

ternary(condition: bool | None, true_val: Any, false_val: Any, none_val: Any = MISSING) → Any

Return a true/false/none value depending on a condition.

Example:

Template
{{ 'true' | ternary('t', 'f') }}
Output
"t"

UUID

to_uuid(name: str) → str

Generate a UUID v5 string from a name.

The UUID namespace is the DNS namespace https://github.com/copier-org/copier.

Example:

Template
{{ 'foo' | to_uuid }}
Output
"faf9357a-ee2a-58ed-94fd-cc8661984561"

YAML

from_yaml(value: str) → Any

Deserialize YAML data.

Example:

Template
{% filter from_yaml %}
name: Jane
age: 30
{% endfilter %}
Output
{"name": "Jane", "age": 30}

from_yaml_all(value: str) → Iterator[Any]

Deserialize multi-document YAML data.

Example:

Template
{% filter from_yaml | list %}
name: Jane
age: 30
---
name: John
age: 20
{% endfilter %}
Output
[{"name": "Jane", "age": 30}, {"name": "John", "age": 20}]

to_yaml(value: Any, /, **kwargs: Any) → str

Serialize data as YAML.

Example:

Template
{{ [{'name': 'Jane', 'age': 30}] | to_yaml }}
Output
- name: Jane
  age: 30'

to_nice_yaml(value: Any, /, **kwargs: Any) → str

Serialize data as YAML with nice formatting.

Example:

Template
{{ [{'name': 'Jane', 'age': 30}] | to_nice_yaml }}
Output
-   name: Jane
    age: 30

Contributions

Contributions are always welcome via filing issues or submitting pull requests. Please check the contribution guide for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jinja2_copier_extension-0.1.0.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jinja2_copier_extension-0.1.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file jinja2_copier_extension-0.1.0.tar.gz.

File metadata

  • Download URL: jinja2_copier_extension-0.1.0.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for jinja2_copier_extension-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d28890855fa89d2c91c9cdaab36775c68137a96a33ca631b65bd18a17523a666
MD5 01188c394a888ce2d90b581948181d1e
BLAKE2b-256 e7918acedb3558687d2e0be186148f0cb932f1ad30c7bb9165408c0fa14760ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for jinja2_copier_extension-0.1.0.tar.gz:

Publisher: release.yml on copier-org/jinja2-copier-extension

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file jinja2_copier_extension-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for jinja2_copier_extension-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0b8756756d7258929e09ed3a7c9455255e560c7d70964291852863d0ee7ab858
MD5 8ad67d267eb2fa8df5cacf9854e359eb
BLAKE2b-256 f7bfcdda464f14f0d7cd2b5279e4a89ee2f9975c0ea31de13c8c49bd544568a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for jinja2_copier_extension-0.1.0-py3-none-any.whl:

Publisher: release.yml on copier-org/jinja2-copier-extension

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page