Common Mixin

This mixin provides a common set of functionality that is slightly opinionated. Here’s an example usage:

from sqlalchemy import Column, Integer
from sqlalchemy.orm import declarative_base
from mortar_sqlalchemy.mixins import Common


Base = declarative_base()

class SampleModel(Common, Base):
  id = Column(Integer, primary_key=True)
  value = Column(Integer)

This mixin provides:

  • An automatically generated table name:

    >>> SampleModel.__tablename__
    'sample_model'
    
  • Equality and inequality based on comparison of the column values in the mapped object:

    >>> SampleModel(id=1, value=2) == SampleModel(id=1, value=2)
    True
    >>> SampleModel(id=1, value=2) == SampleModel(id=3, value=4)
    False
    
  • Hashability based on the Python identity of the object:

    >>> s = set()
    >>> s.add(SampleModel(id=1, value=2))
    >>> s.add(SampleModel(id=1, value=2))
    >>> s
    {SampleModel(id=1, value=2), SampleModel(id=1, value=2)}
    
  • String representation showing attribute names and values:

    >>> str(SampleModel(id=1, value=2))
    'SampleModel(id=1, value=2)'
    >>> repr(SampleModel(id=3, value=4))
    'SampleModel(id=3, value=4)'
    

It also registers a testfixtures.compare() comparer that uses the same equality and inequality as provided by the mixin, along with the ability to ignore certain columns:

>>> from testfixtures import compare
>>> compare(expected=SampleModel(id=1, value=2), actual=SampleModel(id=2, value=2))
Traceback (most recent call last):
...
AssertionError: SampleModel not as expected:

same:
['value']

values differ:
'id': 1 (expected) != 2 (actual)
>>> compare(
...     expected=SampleModel(id=1, value=2),
...     actual=SampleModel(id=2, value=2),
...     ignore_fields=['id'],
... )