List factory
You can create a factory that generates list (or tuple). The elements of the list are always randomly generated each time.
In many cases, the factory is created with randlist instead of from_example because the generation of the list needs to be tailored to the application.
>>> import randog.factory
>>> factory = randog.factory.randlist(
... randog.factory.randint(0, 100),
... randog.factory.randstr(),
... )
>>> generated = factory.next()
>>> assert isinstance(generated, list)
>>> assert isinstance(generated[0], int)
>>> assert isinstance(generated[1], str)
Note
If you want to generate multiple records by a single factory, it may be appropriate to use iter rather than randlist.
>>> import randog.factory
>>> factory = randog.factory.randdict(
... id=randog.factory.randint(0, 999_999),
... price=randog.factory.randdecimal(0, 1000, decimal_len=2),
... )
>>> # generate 200 records
>>> record_list = list(factory.iter(200))
The same can be done for command execution by using --list or --repeat option.
Each elements
You can specify a factory for each element. Normally, the i-th factory is used to generate the i-th element, but if you are generating a list longer than the number of factories, repeat the last factory.
>>> import randog.factory
>>> el_factories = [
... randog.factory.randint(0, 100),
... randog.factory.randstr(),
... randog.factory.randbool(),
... ]
>>> factory = randog.factory.randlist(
... *el_factories,
... length=4,
... )
>>> generated = factory.next()
>>> assert isinstance(generated, list)
>>> assert len(generated) == 4
>>> assert isinstance(generated[0], int) # by el_factories[0]
>>> assert isinstance(generated[1], str) # by el_factories[1]
>>> assert isinstance(generated[2], bool) # by el_factories[2]
>>> assert isinstance(generated[3], bool) # by el_factories[2]
Therefore, if you want to generate a typical list where each element has no specific meaning, specify only one element factory.
>>> import randog.factory
>>> factory = randog.factory.randlist(
... randog.factory.randint(0, 100),
... length=4,
... )
>>> generated = factory.next()
>>> assert isinstance(generated, list)
>>> assert len(generated) == 4
>>> for el in generated:
... assert isinstance(el, int)
Length
The length of the list can also be randomized.
>>> import randog.factory
>>> factory = randog.factory.randlist(
... randog.factory.randint(0, 100),
... length=randog.factory.randint(3, 5),
... )
>>> # Repeat generation to make sure length is at random
>>> lengths = set(map(len, factory.iter(1000)))
>>> assert lengths == {3, 4, 5}
If no length is specified, the length will be the same as the number of pieces in the factory.
>>> import randog.factory
>>> el_factories = [
... randog.factory.randint(0, 100),
... randog.factory.randstr(),
... randog.factory.randbool(),
... ]
>>> factory = randog.factory.randlist(
... *el_factories,
... )
>>> generated = factory.next()
>>> assert isinstance(generated, list)
>>> assert len(generated) == len(el_factories)
Generate tuple
The attribute type can be used to generate a tuple instead of a list.
>>> import randog.factory
>>> factory = randog.factory.randlist(
... randog.factory.randint(0, 100),
... randog.factory.randstr(),
... type=tuple,
... )
>>> generated = factory.next()
>>> assert isinstance(generated, tuple)
Note
The length attribute is not necessary when generating a typical tuple in which each element has a separate schema, since omitting length will generate tuples with a length equal to the number of factories.
Warning
Other types that accept iterators can be specified as type, but if set is used, the number of elements is not guaranteed.
Factory by from_example
If you use from_example, for example, the code would look like this:
>>> import randog.factory
>>> factory = randog.factory.from_example([1, "a"])
>>> generated = factory.next()
>>> assert isinstance(generated, list)
>>> assert isinstance(generated[0], int)
>>> assert isinstance(generated[1], str)
Each element of the list given as an example is used as an example for each element of the generated list.