Skip to main content

Provides random samples of given json schema

Project description

freddy

Provides randomized json data (samples) that complies with a given schema.

Works both for json schema and pydantic models.

Usage

pydantic

import datetime
from pprint import pprint
from typing import List, Optional
from pydantic import BaseModel, Field
import freddy


class User(BaseModel):
    id: int
    name = 'John Doe'
    signup_ts: Optional[datetime.datetime] = None
    friends: List[int] = []
    pattern_field: str = Field(..., regex=r"^[-_a-zA-Z0-9]+$")


sample = freddy.sample(User)
pprint(sample)
{'id': 452, 'signup_ts': '1903-03-12T20:20:00', 'friends': [675, 408], 'pattern_field': 'EUvKs7BIK-Ne', 'name': 'xfphlync'}
User.validate(sample)
User(id=452, signup_ts=datetime.datetime(1903, 3, 12, 20, 20), friends=[675, 408], pattern_field='EUvKs7BIK-Ne', name='xfphlync')

jsonschema

from pprint import pprint
import jsonschema
import freddy

family_schema = {
    "type": "array",
    "items": {
        "properties": {
            "member": {"$ref": "#/definitions/person"},
            "role": {"$ref": "#/definitions/role"},
        },
        "type": "object",
    },
    "maxItems": 5,
    "minItems": 1,
    "definitions": {
        "person": {
            "properties": {
                "age": {"type": "integer"},
                "name": {"type": "string"},
                "pets": {
                    "items": {"$ref": "#/definitions/pet"},
                    "maxItems": 2,
                    "type": "array",
                },
            },
            "type": "object",
        },
        "pet": {
            "properties": {
                "kind": {"enum": ["dog", "cat"], "type": "string"},
                "name": {"type": "string"},
            },
            "type": "object",
        },
        "role": {
            "enum": [
                "father",
                "mather",
                "son",
                "daughter",
                "aunt",
                "grandma",
                "grandpa",
            ],
            "type": "string",
        },
    }
}

# Get 10 random samples
for i in range(10):
    sample_family = freddy.sample(family_schema)

    # Validate against schema
    jsonschema.validate(sample_family, family_schema)

pprint(sample_family)
[
    {"member": {"age": 77, "name": "k", "pets": []}, "role": "grandma"},
    {"member": {"age": 64, "name": "naifvxf", "pets": []}, "role": "grandpa"},
    {
        "member": {
            "age": 23,
            "name": "itruydotrj",
            "pets": [{"kind": "cat", "name": "o"}, {"kind": "cat", "name": "uonmvfgd"}],
        },
        "role": "son",
    },
]

Install

pip install freddy

Development

# Clone the repo
git@github.com:lferran/freddy.git
cd freddy

make develop

# Run tests
make tests

JSON Schema support

Conforms to JSON Schema Draft 7. The following features are supported:

  • boolean type

  • null type

  • string type

  • number type

  • integer type

  • array type

  • object type

  • definitions/references

  • Boolean type

  • consts

  • exclusiveMinimum and exclusiveMaximum in integers and numbers.

  • number multipleOf keyword

  • string pattern regex keyword

  • required keyword

  • additionalProperties

  • all string built-in formats

  • be able to provide custom basic type factories

  • multiple types: {"type": ["string", "array"]}

  • look into allOf: generate multiple objects + merge

Does not support:

  • ID referencing
  • allOf and not keywords
  • conditional keywords if, then and else
  • patternProperties on objects
  • property and schema dependencies on objects.

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

freddy-3.1.0.tar.gz (6.9 kB view details)

Uploaded Source

File details

Details for the file freddy-3.1.0.tar.gz.

File metadata

  • Download URL: freddy-3.1.0.tar.gz
  • Upload date:
  • Size: 6.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.6

File hashes

Hashes for freddy-3.1.0.tar.gz
Algorithm Hash digest
SHA256 37f6e075efede218a6b1870589d39eadb930a88fc908e3ecbdd47be73b0f7eb5
MD5 25bdab09ea95fa12f6b59dfe5b220534
BLAKE2b-256 831efe1299025001761a1cd0c29ed8fff15a4ca98f332ee6fa8fc372a4dfb9f9

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