Metadata-Version: 2.1
Name: dddentity
Version: 0.1.0
Summary: DDD entity
Home-page: https://github.com/nekonoshiri/dddentity
License: MIT
Keywords: ddd,entity
Author: Shiri Nekono
Author-email: gexira.halen.toms@gmail.com
Maintainer: Shiri Nekono
Maintainer-email: gexira.halen.toms@gmail.com
Requires-Python: >=3.7,<4.0
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Utilities
Project-URL: Documentation, https://github.com/nekonoshiri/dddentity
Project-URL: Repository, https://github.com/nekonoshiri/dddentity
Description-Content-Type: text/markdown

# dddentity

[![PyPI](https://img.shields.io/pypi/v/dddentity)](https://pypi.org/project/dddentity/)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/dddentity)](https://pypi.org/project/dddentity/)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
[![license](https://img.shields.io/github/license/nekonoshiri/dddentity)](https://github.com/nekonoshiri/dddentity/blob/main/LICENSE)

DDD entity.

## Usage

```Python
from dddentity import Entity, ref

UserId = str


class User(Entity[UserId]):
    def __init__(self, id: UserId, name: str) -> None:
        self.id = id
        self.name = name

    def _ref_(self) -> UserId:
        return self.id


assert User("0001", "Gilgamesh") == User("0001", "Bilgamesh")

assert ref(User("0002", "Enkidu")) == "0002"
```

## Caveat

Currently `eq=False` must be set when using with dataclasses
to prevent to generate `__eq__()` method by dataclass.

```Python
@dataclass(eq=False)
class User(Entity[UserId]):
    ...
```

## API

### Module `dddentity`

#### *abstract class* `Entity[T]`

Entity class.
Classes implementing this class must implement abstract method `_ref_()`.

This class is hashable, satisfying the following conditions:

- `entity1 == entity2` iff `entity1._ref_() == entity2._ref_()`
- `hash(entity) == hash(entity._ref_())`

where entity, entity1, entity2 are entities.

##### *type parameter* `T`

Type of the identifier of the entity, which must be hashable.

##### *abstract method* `_ref_() -> T`

Shall return the identifier of the entity.

#### *function* `ref(entity: Entity[T]) -> T`

Return `entity._ref_()`.

