Skip to main content

Primitize is a library that facilitates converting dataclass instances into primitive objects.

Project description

Primitize

Primitize is a library that facilitates converting dataclass instances into primitive objects. It provides facilites to massage the data, validate it and write it out to file in pretty much any format you would want.

Example usage

Generating configuration files

Imagine we want to generate configuration files for several clusters, we have good sensible defaults but nothing is always exactly the same. In this example, we want each cluster configuration to be written in a json file.

from dataclasses import dataclass
from enum import Enum
import json

from primitize.core import primitize, primitized


class HostType(Enum):
    COMPUTE = "Compute"
    WEB = "Web"
    STORAGE = "Storage"


@dataclass
class User:
    username: str


@dataclass
class Cluster:
    name: str
    size: int = primitized(validator=lambda x: x > 0)
    host_type: HostType = primitized(default=HostType.WEB, modifier=lambda x: x.value)
    admins: Set[User] = primitized(
        default_factory=set,
        modifier=lambda x: sorted(x),
        validator: lambda x: len(x) > 0,
    )

    def prepare_primitization(self: "Cluster") -> None:
        """If this method exists, it is called as the first step of primitization.

        It is typical to perform x-fields updates here."""
        pass



clusters ={
    Cluster("A", 3, HostType.COMPUTE, {User("root")}),
    Cluster("B", 3, admins={User("root")}),
    Cluster("C", 3, HostType.STORAGE, {User("foo")}),
}

for cluster in clusters:
    prim = primitize(cluster)
    payload = json.dumps(prim, sort_keys=True, indent=4)
    with (Path(".") / "output" / f"{cluster.name}.json").open("w") as fd:
        fd.write(payload)

Upon executing this, you will find the following files under ./output/:

./output/A.json:

{
    "name": "A",
    "size": 3,
    "host_type": "Compute",
    "admins": [
        "root"
    ]
}

./output/B.json:

{
    "name": "A",
    "size": 3,
    "host_type": "Web",
    "admins": [
        "root"
    ]
}

./output/C.json:

{
    "name": "C",
    "size": 3,
    "host_type": "Storage",
    "admins": [
        "foo"
    ]
}

How is this different from X ?

Why not use protobuf or thrift ?

Similar to protobuf and thrift, primitizer allows you to validate and serialize data. However you are in control of the serialization and the file format. Primitizer can easily generate pretty much any format (json, yaml, properties, xml, ini, etc.).

Why no use jsonnet ?

Primitizer can generate any file format, just not json

Why not jinja ?

Primitizer is full Python, so you have access to the entire API. As such you can do whatever you want with the objects to are manipulating. Primitizer also offers strong validation primitives to allow you to check the data for errors before writing it out.

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

primitize-1.1.tar.gz (4.0 kB view details)

Uploaded Source

Built Distribution

primitize-1.1-py3-none-any.whl (7.9 kB view details)

Uploaded Python 3

File details

Details for the file primitize-1.1.tar.gz.

File metadata

  • Download URL: primitize-1.1.tar.gz
  • Upload date:
  • Size: 4.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.0

File hashes

Hashes for primitize-1.1.tar.gz
Algorithm Hash digest
SHA256 6ac212b4f3e35a739f7efab183b659f55f29cd405b4f41ad92ec0d261799d804
MD5 b6984f29d24e1b1c60f7f9b4fd34286c
BLAKE2b-256 5a0ebca36fc28709505d72773536d7fdab92d7f17fc4b98e6e186364c7f15bad

See more details on using hashes here.

File details

Details for the file primitize-1.1-py3-none-any.whl.

File metadata

  • Download URL: primitize-1.1-py3-none-any.whl
  • Upload date:
  • Size: 7.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.0

File hashes

Hashes for primitize-1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b5b743944ece7dbb82b7af9e187c1b2d5e37f4d02e0fb7cd65cca02bf39739b0
MD5 1947afb69c40018b131b8a738b0eb260
BLAKE2b-256 13f8493ba220b04e1393b995b340e0ef1e3d983df06a2cdcbd0183326a383b81

See more details on using hashes here.

Supported by

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