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 v, o: v > 0)
    host_type: HostType = primitized(
        default=HostType.WEB, modifier=lambda v, o: v.value
    )
    admins: Set[User] = primitized(
        default_factory=set,
        modifier=lambda v, o: sorted(x),
        validator: lambda v, o: len(x) > 0,
    )



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 ?

Primitize Protobuf/Thrift TypedDict Jinja
Modifiers Yes No No No
Validators Type & Custom Type Type No
Language support Python only Multiple Python Custom DSL
Full Python API Yes No Yes No
Format flexibility Yes No No Yes
  • Modifiers: Primitize allows you to define functions that will massage the values prior to serialization, this allows your to rename, or reformat data to make the serialization easier. A typical usecase for this is to have the values of a type that is easy to manipulate and use a modifier to rewrite it to the what your end format expects
  • Validators: Primitize uses standard Python typing so mypy will ensure you have type checking. In Primitize you can also define functions that allows you to ensure that the value is correct upon serialization.
  • Language support: Primitize is a python library, as such it is primarily useful in Python.
  • Full Python API: Unlike a restrictive DSL, with Primitize it is really just your Python program running, so you can do whatever you want, we just help you convert dataclasses into primitive types so it is easier to write out.
  • Format flexibility: Primitize doesn't write data out for you so you can write it out as anything you want. Do you want json ? json.dumps(primitize(data)) Do you want yaml ? yaml.dumps(primitize(data)). It's that simple.

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-2020.5.10.tar.gz (4.6 kB view details)

Uploaded Source

Built Distribution

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

primitize-2020.5.10-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for primitize-2020.5.10.tar.gz
Algorithm Hash digest
SHA256 2c41513b2047c895dc4cc5f4b7c891f18be1167aa0cebfee31ed429914842c0b
MD5 05ffc99784dd6483068ee3934939a4cc
BLAKE2b-256 e7ef552d013e44fefe67bd44d576c1af77e629df65ce00a46f4c4e638fe87906

See more details on using hashes here.

File details

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

File metadata

  • Download URL: primitize-2020.5.10-py3-none-any.whl
  • Upload date:
  • Size: 8.3 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/46.1.3 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.0

File hashes

Hashes for primitize-2020.5.10-py3-none-any.whl
Algorithm Hash digest
SHA256 33bef957677db9c0a3d29a29c766c835510bd2ca7aef75d8671e467a3d151c6b
MD5 51b96670f6ee05bf75de756d3b4a9727
BLAKE2b-256 eb7827052165986452ae63de6f79b440f4a0f15465a769d02dd795c42cba2aee

See more details on using hashes here.

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