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.3.2.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

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

blahblah-1.3.2-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: blahblah-1.3.2.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for blahblah-1.3.2.tar.gz
Algorithm Hash digest
SHA256 e66e07c3fe26d66c232906fbb46a62fcb3ea78e76795afa11039021eb3a0298d
MD5 07ac671c17cda8a406678052c0eb5732
BLAKE2b-256 68908c732182be8e366619e013539590fe3d9fc63dc478414a306694a8244e13

See more details on using hashes here.

File details

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

File metadata

  • Download URL: blahblah-1.3.2-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.11

File hashes

Hashes for blahblah-1.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 eaa9506293c363090aeb4707afbbec780ae0225b0b1f681d5eebd9e5cdb575b4
MD5 54961e3f60491024d380a5cc6336e84d
BLAKE2b-256 4e4ae86e33bf7e5cb35b63a1050fec451c367f03d6c5c9758fc1397aaeecc0ed

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