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 details)

Uploaded Source

Built Distribution

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

Uploaded Python 3

File details

Details for the file blahblah-1.5.0.tar.gz.

File metadata

  • Download URL: blahblah-1.5.0.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blahblah-1.5.0.tar.gz
Algorithm Hash digest
SHA256 b497219e17b29c63a22fc3a0d747e46b70c690f9ac7ce3a9fb28ef0506de2cad
MD5 b3d1841215653005df60b4949c174f2f
BLAKE2b-256 25e72f0e9841b87cc804746250f8c32eddf1c03568ee93c01712f28007246f3e

See more details on using hashes here.

File details

Details for the file blahblah-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: blahblah-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.12

File hashes

Hashes for blahblah-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ecabcd18a855a0f1ab4fe76877813f21ad45b755982202af8ddf11a1911c3eb
MD5 457cf43bebcd76f595f092930f6fe749
BLAKE2b-256 4afb44113feadc63ee42bbc373b1f872f11d08b90a115ea71894d5bd76520d5e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page