Skip to main content

A Python library for building custom document object models (DOMs) with built-in JSON schema checking

Project description

Python application docs codecov

A Python library for building custom document object models (DOMs) with built-in JSON schema checking.

Installation

In your system console, run:

pip install wysdom

Documentation

API documentation and examples can be found at:

Motivation

A common requirement in Python projects is to be able to load serialized structured data into Python objects. Typically, you might begin by using dictionaries to store this data and a library like json or PyYAML to parse the input.

However, this simple approach may create additional work elsewhere in your project, for the following four reasons.

First, the serialized data you are loading might be user-generated, untrusted strings, and so some validation is necessary to check that the document schema matches what you are expecting.

Second, you may want to provide some promises to the rest of your application about the attributes that exist in your data object and what their data types are. For example, given a data object config which holds your application’s configuration parameters, it is preferable to know that config.allow_nulls is a bool, as opposed to the subscript access style config[‘allow_nulls’] which may return a KeyError or an unexpected data type. This also enables your data objects to be covered by static type checking.

Third, you may want to add some additional functionality to your data objects in the form of properties and methods, including within the substructure of your data object. For example, a method config.database.test_connection().

Fourth, you may want to pass some sub-elements of your data object to components in your application, but have that sub-element retain awareness of the whole document. For example, a class instance db_service = DatabaseService(config.database) might need to access some attributes from the parent object config.

What wysdom does

With wysdom, you have one simple declarative way of defining the class structure of your data objects. You can then instantiate a data object using raw data in dict form, or directly deserialize it using one of wysdom’s mixin classes.

Objects created by wysdom retain an awareness of the overall Document Object Model (DOM), which can be queried using the supplied functions document(obj), parent(obj) and key(obj).

Classes created by wysdom also auto-generate a JSON object schema and use the jsonschema library to enable you to validate potential input.

Example Usage

User class definition:

from wysdom import (
    UserObject, UserProperty, SchemaArray, SchemaDict, key
)

class Address(UserObject):
    first_line = UserProperty(str)
    second_line = UserProperty(str)
    city = UserProperty(str)
    postal_code = UserProperty(int)

class Vehicle(UserObject):
    color: str = UserProperty(str)
    description: str = UserProperty(str)

    @property
    def license(self):
        return key(self)

class Person(UserObject):
    first_name = UserProperty(str)
    last_name = UserProperty(str)
    current_address = UserProperty(Address)
    previous_addresses = UserProperty(SchemaArray(Address))
    vehicles = UserProperty(SchemaDict(Vehicle))

Loading from dict:

person_instance = Person({
  "first_name": "Marge",
  "last_name": "Simpson",
  "current_address": {
    "first_line": "123 Fake Street",
    "second_line": "",
    "city": "Springfield",
    "postal_code": 58008
  },
  "previous_addresses": [{
    "first_line": "742 Evergreen Terrace",
    "second_line": "",
    "city": "Springfield",
    "postal_code": 58008
  }],
  "vehicles": {
    "eabf04": {
      "color": "orange",
      "description": "Station Wagon"
    }
  }
})

Reading attributes:

>>> person_instance.last_name
'Simpson'

>>> person_instance.current_address.first_line
'123 Fake Street'

>>> person_instance.previous_addresses[0].first_line
'742 Evergreen Terrace'

>>> person_instance.vehicles["eabf04"].color
'orange'

>>> person_instance.vehicles["eabf04"].license
'eabf04'

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

wysdom-0.1.4.tar.gz (21.1 kB view details)

Uploaded Source

Built Distribution

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

wysdom-0.1.4-py3-none-any.whl (28.3 kB view details)

Uploaded Python 3

File details

Details for the file wysdom-0.1.4.tar.gz.

File metadata

  • Download URL: wysdom-0.1.4.tar.gz
  • Upload date:
  • Size: 21.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for wysdom-0.1.4.tar.gz
Algorithm Hash digest
SHA256 67f25c21aac99efb9b87eaae0856cfc9b179ccbb0fcec06a39df1b7f9e127959
MD5 7193227e4f96a27cf68519e1fd9a89f3
BLAKE2b-256 85a8f12b2cd0fe3be923ece1d9a778b0cb1bdd3491adc21be4630ee665641860

See more details on using hashes here.

File details

Details for the file wysdom-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: wysdom-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 28.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/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for wysdom-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 b0bd6d883083c1b9cb64173f42b8391001976452cabd79cc192437b79a250a1a
MD5 5fd62f2ec7c951c1bc68b444a45aa243
BLAKE2b-256 c01823d7cbca0421c5fb41e9a67f9452f866fbd348cbfe4fe137853c9a6d60cc

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