A collection of base classes for Domain-Driven Design (DDD) value objects and entities in Python
Project description
DDD Value Objects for Python
A comprehensive collection of base classes and specialized types for implementing Domain-Driven Design (DDD) patterns in Python. This library provides a robust foundation for building maintainable, type-safe, and self-validating domain models using Value Objects and Entities.
Key Features
- Base Classes: Robust base classes for both Primitive and Composite Value Objects.
- Immutability: Designed to be immutable, ensuring domain integrity.
- Structural Equality: Value Objects are compared by their attributes, not by identity.
- Self-Validation: Built-in validation for common domain types (Emails, UUIDs, URLs, etc.).
- Strong Typing: Leverages Python generics for type safety and better IDE support.
- Entity Support: Base class for Entities with identity-based equality.
Installation
Install using pip:
pip install ddd-value-objects
Or using uv:
uv add ddd-value-objects
Core Concepts
Value Objects
In DDD, a Value Object is an object that represents a descriptive aspect of the domain with no conceptual identity. They are defined by their attributes and are immutable. Two value objects are considered equal if all their attributes are equal.
Primitive Value Objects
Wrap single primitive types (str, int, float, bool) to give them domain meaning.
Composite Value Objects
Combine multiple values into a single domain concept (e.g., Money which consists of an amount and a currency).
Entities
Entities have a unique identity that persists over time, regardless of changes to their attributes.
Usage Examples
1. Primitive Value Objects
You can extend base classes to create domain-specific types:
from ddd_value_objects import StringValueObject, IntValueObject, InvalidArgumentError
class UserName(StringValueObject):
pass
class UserAge(IntValueObject):
def __init__(self, value: int):
super().__init__(value)
if value < 0 or value > 150:
raise InvalidArgumentError(f"Age {value} is out of valid range (0-150)")
# Usage
name1 = UserName("Alice")
name2 = UserName("Alice")
age = UserAge(30)
print(name1 == name2) # True (Structural equality)
print(name1.value) # "Alice"
2. Specialized Value Objects
The library includes many pre-built, self-validating types:
from ddd_value_objects import (
EmailValueObject,
UuidValueObject,
UrlValueObject,
PhoneNumberValueObject,
CurrencyValueObject
)
email = EmailValueObject("user@example.com")
user_id = UuidValueObject("550e8400-e29b-41d4-a716-446655440000")
website = UrlValueObject("https://github.com")
currency = CurrencyValueObject("USD") # Validates ISO 4217 code
3. Composite Value Objects (e.g., Money)
Handle complex types that group multiple values:
from ddd_value_objects import MoneyValueObject
price = MoneyValueObject(99.99, "USD")
tax = MoneyValueObject(10.00, "USD")
# Arithmetic operations (if supported by implementation)
total = price.add(tax)
print(total.amount) # 109.99
print(total.currency) # "USD"
4. Enum Value Objects
Restrict values to a specific set:
from enum import Enum
from ddd_value_objects import EnumValueObject
class UserRole(Enum):
ADMIN = "admin"
USER = "user"
class RoleValueObject(EnumValueObject):
def __init__(self, value: str):
# Pass the value and a list of valid ValueObjects
super().__init__(
StringValueObject(value),
[StringValueObject(r.value) for r in UserRole]
)
role = RoleValueObject("admin")
5. Entities
Use the Entity base class for objects with identity:
from ddd_value_objects import Entity, UuidValueObject
class Product(Entity):
def __init__(self, product_id: str, name: str):
# Entity expects a string ID which it wraps in a UuidValueObject
super().__init__(product_id)
self.name = name
product1 = Product("550e8400-e29b-41d4-a716-446655440000", "Laptop")
product2 = Product("550e8400-e29b-41d4-a716-446655440000", "Updated Laptop Name")
print(product1 == product2) # True (Same identity/ID)
Available Value Objects
| Category | Classes |
|---|---|
| Primitives | StringValueObject, IntValueObject, FloatValueObject, BoolValueObject |
| Numeric | PositiveIntValueObject, PositiveFloatValueObject |
| Identity | UuidValueObject |
| Network | EmailValueObject, UrlValueObject, IpAddressValueObject |
| Communication | PhoneNumberValueObject, CountryCodeValueObject (ISO 3166-1 alpha-2) |
| Temporal | DateTimeValueObject, DateValueObject (Unix timestamps) |
| Financial | CurrencyValueObject (ISO 4217), MoneyValueObject |
| Others | EnumValueObject, CompositeValueObject |
Development and Testing
We use uv for dependency management and pytest for testing.
Setup
# Clone the repository
git clone https://github.com/youruser/ddd-value-objects.git
cd ddd-value-objects
# Install dependencies
uv sync
Running Tests
uv run pytest
License
This project is licensed under the MIT License. See the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ddd_value_objects-0.1.3.tar.gz.
File metadata
- Download URL: ddd_value_objects-0.1.3.tar.gz
- Upload date:
- Size: 13.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4012bb91f7017b65cd110298efb30e92808d8d74c8c65ddfc77b3a423d8d09c7
|
|
| MD5 |
92637c225b98d4f58c8b8ad5e126c1d0
|
|
| BLAKE2b-256 |
d0b5e79151865e8977f107a17a9cc899cecec462b0498ad55484e592669f594a
|
Provenance
The following attestation bundles were made for ddd_value_objects-0.1.3.tar.gz:
Publisher:
code.yml on josedejesuschavez/ddd-value-objects
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ddd_value_objects-0.1.3.tar.gz -
Subject digest:
4012bb91f7017b65cd110298efb30e92808d8d74c8c65ddfc77b3a423d8d09c7 - Sigstore transparency entry: 782066555
- Sigstore integration time:
-
Permalink:
josedejesuschavez/ddd-value-objects@b4c44b0c820b36a7b9a90cbf7c2fb4bfcbc97a97 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/josedejesuschavez
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
code.yml@b4c44b0c820b36a7b9a90cbf7c2fb4bfcbc97a97 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ddd_value_objects-0.1.3-py3-none-any.whl.
File metadata
- Download URL: ddd_value_objects-0.1.3-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
746162f169d715c754209375cfabf9e7a06cdaf11371e246f2e6483df1a1112c
|
|
| MD5 |
96079ce3fe73ea0aeba693ebcebc4039
|
|
| BLAKE2b-256 |
c690f871d7a3e8597f778135753937311336cf9ae6f3232a9d6e3afd6cb8ddf4
|
Provenance
The following attestation bundles were made for ddd_value_objects-0.1.3-py3-none-any.whl:
Publisher:
code.yml on josedejesuschavez/ddd-value-objects
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ddd_value_objects-0.1.3-py3-none-any.whl -
Subject digest:
746162f169d715c754209375cfabf9e7a06cdaf11371e246f2e6483df1a1112c - Sigstore transparency entry: 782066556
- Sigstore integration time:
-
Permalink:
josedejesuschavez/ddd-value-objects@b4c44b0c820b36a7b9a90cbf7c2fb4bfcbc97a97 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/josedejesuschavez
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
code.yml@b4c44b0c820b36a7b9a90cbf7c2fb4bfcbc97a97 -
Trigger Event:
release
-
Statement type: