Skip to main content

dragon

terramare

python: 3.10+ license: MIT PyPI PyPI - Downloads docs: pages

ci status coverage Checked with mypy Code style: black Conventional Commits

Automatically construct complex objects from simple Python types.

Highlights:

  • No boilerplate: terramare uses Python's standard type hints to determine how to construct instances of a class;
  • Format-agnostic: terramare takes simple Python types as input - pass it the output from json.load, toml.load, or yaml.load;
  • Non-invasive: terramare requires no modifications to your existing classes and functions beyond standard type hints;

Full documentation available at https://tomwatson1024.gitlab.io/terramare/.

Example

Deserializing a Simple Class

Consider the following simple class, defined using attrs for brevity:

>>> from typing import List
>>> import attr
>>> import terramare

>>> @attr.s(auto_attribs=True)
... class Example:
...     words: List[str]
...
...     def __str__(self):
...         return " ".join(self.words)

Deserializing an instance of the class from a dictionary is as simple as:

>>> print(terramare.structure({"words": ["hello", "world!"]}, into=Example))
hello world!

Deserializing a More Complex Class

Consider the Person class defined below:

>>> from typing import NamedTuple, NewType, Sequence
>>> import attr
>>> import terramare

    # `terramare` handles NamedTuples
>>> class Location(NamedTuple):
...     longitude: float
...     latitude: float


    # `terramare` handles NewType aliases
>>> JobTitle = NewType("JobTitle", str)


    # `terramare` handles custom classes [experimental]
>>> @terramare.auto
... class Occupation:
...     def __init__(self, title: JobTitle, field: str):
...         self.title = title
...         self.field = field
...
...     def __eq__(self, other):
...         if isinstance(other, self.__class__):
...             return vars(self) == vars(other)
...         return False
...
...     def __repr__(self):
...         return "Occupation('{0.title}', '{0.field}')".format(self)


>>> @attr.s(auto_attribs=True)
... class Person:
...     name: str
...     age: int
...     friends: Sequence[str]
...
...     # `terramare` handles complex member variable types
...     location: Location
...     occupation: Occupation

Again, deserialization is a single function call:

>>> terramare.structure(
...     {
...         "name": "Alice",
...         "age": 20,
...         "friends": ["Bob", "Charlie"],
...         "location": [51.5074, 0.1278],
...         "occupation": {"title": "programmer", "field": "technology"}
...     },
...     into=Person,
... )
Person(name='Alice', age=20, friends=['Bob', 'Charlie'], location=Location(longitude=51.5074, latitude=0.1278), occupation=Occupation('programmer', 'technology'))

Installation

Install using pip:

pip install terramare

Alternatives

Check out:

  • pydantic - "Data validation and settings management using python type annotations". A much more mature library also using Python's standard type hints for deserialization that requires a little more integration with your code;
  • schematics - "...combine types into structures, validate them, and transform the shapes of your data based on simple descriptions". Uses custom types instead of Python's standard type hints;
  • cerberus - "...provides powerful yet simple and lightweight data validation functionality out of the box and is designed to be easily extensible, allowing for custom validation". Schema validation that doesn't change the type of the primitive value.

Download files

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

Source Distribution

terramare-0.6.0.tar.gz (36.1 kB view details)

Uploaded Source

Built Distribution

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

terramare-0.6.0-py3-none-any.whl (46.4 kB view details)

Uploaded Python 3

File details

Details for the file terramare-0.6.0.tar.gz.

File metadata

  • Download URL: terramare-0.6.0.tar.gz
  • Upload date:
  • Size: 36.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.13 Linux/5.15.154+

File hashes

Hashes for terramare-0.6.0.tar.gz
Algorithm Hash digest
SHA256 ba122926619309eadfc389ceb218d809bd984c07249320472b3fd9b468b6565d
MD5 cc0f89cb7ec9bae9bd75cc1771195a2a
BLAKE2b-256 aab7e43e6783f160824958bb34a94adaaabe35f90e14e35fabbc0b3a368c6357

See more details on using hashes here.

File details

Details for the file terramare-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: terramare-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 46.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.1 CPython/3.12.13 Linux/5.15.154+

File hashes

Hashes for terramare-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c2d077b0ee50ac8926bf3802c4e750c8b9d184b89cb3496e9b5a3fd5fdccad63
MD5 61d0b8981247fe1cb99e00653c489d53
BLAKE2b-256 e08ec819cf50c4c5836d725f27be4c9d86fb13d77f19fc92199b52902e21dbc6

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 files

0.5.8

2 files

0.5.5

2 files

0.5.4

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.3

2 files

0.4.2

2 files

0.4.1

2 files

0.4.0

2 files

0.3.6

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page