blahblah
Fake data generator for district42 schema
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)
value
)
schema.bool(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
value
)
schema.int(sch = schema.int(42)
assert fake(sch) == 42
value
)
schema.int.min(sch = schema.int.min(0)
assert 0 <= fake(sch) <= INT_MAX
value
)
schema.int.max(sch = schema.int.max(0)
assert INT_MIN <= fake(sch) <= 0
Float
schema.float
sch = schema.float
assert isinstance(fake(sch), float)
value
)
schema.float(sch = schema.float(3.14)
assert fake(sch) == 3.14
value
)
schema.float.min(sch = schema.float.min(0.0)
assert fake(sch) >= 0.0
value
)
schema.float.max(sch = schema.float.max(0.0)
assert fake(sch) <= 0.0
Str
schema.str
sch = schema.str
generated = fake(sch)
assert isinstance(generated, str)
length
)
schema.str.len(sch = schema.str.len(10)
generated = fake(sch)
assert len(generated) == 10
min_length
, max_length
)
schema.str.len(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
letters
)
schema.str.alphabet(digits = "01234567890"
sch = schema.str.alphabet(digits)
generated = fake(sch)
assert all(x in digits for x in generated)
substr
)
schema.str.contains(sch = schema.str.contains("@")
generated = fake(sch)
assert "@" in generated
pattern
)
schema.str.regex(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)
elements
)
schema.list(sch = schema.list([schema.int(1), schema.int(2)])
generated = fake(sch)
assert generated = [1, 2]
type
)
schema.list(sch = schema.list(schema.int)
generated = fake(sch)
assert all(isinstance(x) for x in generated)
type
).len(length
)
schema.list(sch = schema.list(schema.int).len(3)
generated = fake(sch)
assert len(generated) == 3
type
).len(min_length
, max_length
)
schema.list(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)
keys
)
schema.dict(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)
*types
)
schema.any(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