Skip to main content

Fake data generator for district42 schema

Project description

blahblah

Codecov PyPI PyPI - Downloads Python Version

Fake data generator for district42 schema

(!) Work in progress, breaking changes are possible until v2.0 is released

Installation

pip3 install blahblah

Usage

from blahblah import fake
from district42 import schema

UserSchema = schema.dict({
    'id': schema.int.min(1),
    'name': schema.str.regex(r"[a-z0-9_]+"),
    'is_deleted': schema.bool,
})

print(fake(UserSchema))

Documentation

None

schema.none

sch = schema.none

assert fake(sch) is None

Bool

schema.bool

sch = schema.bool

assert fake(sch) in (True, False)

schema.bool(value)

sch = schema.bool(True)

assert fake(sch) is True

Int

schema.int

INT_MIN = -(2 ** 63)
INT_MAX = 2 ** 63 - 1

sch = schema.int

assert INT_MIN <= fake(sch) <= INT_MAX

schema.int(value)

sch = schema.int(42)

assert fake(sch) == 42

schema.int.min(value)

sch = schema.int.min(0)

assert 0 <= fake(sch) <= INT_MAX

schema.int.max(value)

sch = schema.int.max(0)

assert INT_MIN <= fake(sch) <= 0

Float

schema.float

sch = schema.float

assert isinstance(fake(sch), float)

schema.float(value)

sch = schema.float(3.14)

assert fake(sch) == 3.14

schema.float.min(value)

sch = schema.float.min(0.0)

assert fake(sch) >= 0.0

schema.float.max(value)

sch = schema.float.max(0.0)

assert fake(sch) <= 0.0

Str

schema.str

sch = schema.str

generated = fake(sch)
assert isinstance(generated, str)

schema.str.len(length)

sch = schema.str.len(10)

generated = fake(sch)
assert len(generated) == 10

schema.str.len(min_length, max_length)

sch = schema.str.len(1, ...)

generated = fake(sch)
assert len(generated) >= 1
sch = schema.str.len(..., 32)

generated = fake(sch)
assert len(generated) <= 32
sch = schema.str.len(1, 32)

generated = fake(sch)
assert 1 <= len(generated) <= 32

schema.str.alphabet(letters)

digits = "01234567890"
sch = schema.str.alphabet(digits)

generated = fake(sch)
assert all(x in digits for x in generated)

schema.str.contains(substr)

sch = schema.str.contains("@")

generated = fake(sch)
assert "@" in generated

schema.str.regex(pattern)

import re
sch = schema.str.regex(r"[a-z]+")

generated = fake(sch)
assert re.match(r"[a-z]+", generated)

List

schema.list

sch = schema.list

generated = fake(sch)
assert isinstance(generated, list)

schema.list(elements)

sch = schema.list([schema.int(1), schema.int(2)])

generated = fake(sch)
assert generated = [1, 2]

schema.list(type)

sch = schema.list(schema.int)

generated = fake(sch)
assert all(isinstance(x) for x in generated)

schema.list(type).len(length)

sch = schema.list(schema.int).len(3)

generated = fake(sch)
assert len(generated) == 3

schema.list(type).len(min_length, max_length)

sch = schema.list(schema.int).len(1, ...)

generated = fake(sch)
assert len(generated) >= 1
sch = schema.list(schema.int).len(..., 10)

generated = fake(sch)
assert len(generated) <= 10
sch = schema.list(schema.int).len(1, 10)

generated = fake(sch)
assert 1 <= len(generated) <= 10

Dict

schema.dict

sch = schema.dict

generated = fake(sch)
assert isinstance(generated, dict)

schema.dict(keys)

sch = schema.dict({
    "id": schema.int,
    "name": schema.str | schema.none,
    optional("platform"): schema.str,
})

generated = fake(sch)
assert isinstance(generated["id"], int)
assert isinstance(generated["name"], (str, type(None))
assert generated.keys() == {"id", "name"}

Any

schema.any

sch = schema.any

generated = fake(sch)
assert isinstance(generated, object)

schema.any(*types)

sch = schema.any(schema.str, schema.int)

generated = fake(sch)
assert isinstance(generated, (str, int))

Custom Types

1. Declare Schema

from typing import Any
from uuid import UUID
from district42 import Props, SchemaVisitor, SchemaVisitorReturnType as ReturnType
from district42.types import Schema
from niltype import Nilable


class UUIDProps(Props):
    @property
    def value(self) -> Nilable[UUID]:
        return self.get("value")


class UUIDSchema(Schema[UUIDProps]):
    def __accept__(self, visitor: SchemaVisitor[ReturnType], **kwargs: Any) -> ReturnType:
        return visitor.visit_uuid(self, **kwargs)

    def __call__(self, /, value: UUID) -> "UUIDSchema":
        return self.__class__(self.props.update(value=value))

2. Register Generator

from typing import Any
from uuid import UUID, uuid4
from blahblah import Generator
from niltype import Nil


class UUIDGenerator(Generator, extend=True):
    def visit_uuid(self, schema: UUIDSchema, **kwargs: Any) -> UUID:
        if schema.props.value is not Nil:
            return schema.props.value
        return uuid4()

3. Use

from blahblah import fake
from district42 import register_type, schema

register_type("uuid", UUIDSchema)

print(fake(schema.uuid))
# 0d9d188a-4f1f-4bce-ba6e-51ca3732900e

Full code available here: district42_exp_types/uuid

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

blahblah-1.5.0.tar.gz (15.9 kB view hashes)

Uploaded source

Built Distribution

blahblah-1.5.0-py3-none-any.whl (19.8 kB view hashes)

Uploaded py3

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page