Skip to main content

Actions Status codecov Documentation Status

sqlalchemy-model-factory aims to make it easy to write factory functions for sqlalchemy models, particularly for use in testing.

It should make it easy to define as many factories as you might want, with as little boilerplate as possible, while remaining as unopinionated as possible about the behavior going in your factories.

Installation

pip install sqlalchemy-model-factory

Usage

Suppose you've defined a Widget model, and for example you want to test some API code that queries for Widget instances. Couple of factory functions might look like so:

# tests/test_example_which_uses_pytest
from sqlalchemy_model_factory import autoincrement, register_at
from . import models

@register_at('widget')
def new_widget(name, weight, color, size, **etc):
    """My goal is to allow you to specify *all* the options a widget might require.
    """
    return Widget(name, weight, color, size, **etc)

@register_at('widget', name='default')
@autoincrement
def new_default_widget(autoincrement=1):
    """My goal is to give you a widget with as little input as possible.
    """
    # I'm gonna call the other factory function...because i can!
    return new_widget(
        f'default_name{autoincrement}',
        weight=autoincrement,
        color='rgb({0}, {0}, {0})'.format(autoincrement),
        size=autoincrement,
    )

What this does, is register those functions to the registry of factory functions, within the "widget" namespace, at the name (defaults to new) location in the namespace.

So when I go to write a test, all I need to do is accept the mf fixture (and lets say a session db connection fixture to make assertions against) and I can call all the factories that have been registered.

def test_example_model(mf, session):
    widget1 = mf.widget.new('name', 1, 'rgb(0, 0, 0)', 1)
    widget2 = mf.widget.default()
    widget3 = mf.widget.default()
    widget4 = mf.widget.default()

    widgets = session.query(Widget).all()
    assert len(widgets) == 4
    assert widgets[0].name == 'name'
    assert widgets[1].id == widget2.id
    assert widgets[2].name == widget3.name
    assert widgets[3].color == 'rgb(3, 3, 3)'

In a simple toy example, where you don't gain much on the calls themselves the benefits are primarily:

  • The instances are automatically put into the database and cleaned up after the test.
  • You can make assertions without hardcoding the values, because you get back a handle on the object.

But as the graph of models required to set up a particular scenario grows:

  • You can define factories as complex as you want
    • They can create related objects and assign them to relationships
    • They can be given sources of randomness or uniqueness to not violate constraints
    • They can compose with eachother (when called normally, they're the same as the original function).

Release files for sqlalchemy-model-factory 0.4.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sqlalchemy-model-factory 0.4.6
File Size Uploaded
sqlalchemy-model-factory-0.4.6.tar.gz 15.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sqlalchemy-model-factory 0.4.6
File Interpreter ABI Platform
sqlalchemy_model_factory-0.4.6-py3-none-any.whl Python 3 none any Details

Total release size: 33.5 kB

Release files / sqlalchemy-model-factory-0.4.6.tar.gz

Download URL sqlalchemy-model-factory-0.4.6.tar.gz
Size 15.4 kB
Tags Source
SHA-256 checksum
How to use checksums
195ad9169867b447b528142b506db6489a5d9ab98104e557b28c2d4af8f581ac
BLAKE2b-256 checksum
How to use checksums
4cc5dbca8f81db86ee657632e647519f80b0b77ff0ceae65d6b9155bb8b4984f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.2.0 CPython/3.9.16 Linux/5.15.0-1035-azure

Release files / sqlalchemy_model_factory-0.4.6-py3-none-any.whl

Download URL sqlalchemy_model_factory-0.4.6-py3-none-any.whl
Size 18.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ae84e15c5f53897d834c17c3d2d6491d29f60914a4f63ea5f7557e4079676d7f
BLAKE2b-256 checksum
How to use checksums
0a0b2e5b643e16fe2ad6e816d5cc94f11fde521146c59728cd1a6c3d28a10eb0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.2.0 CPython/3.9.16 Linux/5.15.0-1035-azure

Release history Release notifications | RSS feed

This release

0.4.6 This release

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page