Shared enums and optional PostgreSQL helpers for email workflows
Project description
wr-common-lib
Shared enums and optional PostgreSQL helpers for the email table.
| PyPI | wr-common-lib |
|---|---|
| import | wr_common_lib |
Requires Python 3.12+.
Install
pip install wr-common-lib
pip install "wr-common-lib[db]" # adds async-db-tools
Package layout
src/wr_common_lib/
├── __init__.py # __version__
└── email/
├── __init__.py # public exports
├── constants.py # MailFlow, MailStatus
├── types.py # OutboundTask, InboundTask
└── db_oper.py # EmailDbOper ([db] extra)
Enums
MailFlow and MailStatus are StrEnum values aligned with PostgreSQL mail_flow / mail_status.
from wr_common_lib.email import MailFlow, MailStatus
MailFlow.OUTBOUND
MailStatus.QUEUED.value # use .value in raw SQL parameters
MailStatus.SENT.is_terminal
Status flows
Outbound (sender): PENDING → QUEUED → SENT | FAILED
Outbound (webhook): SENT → DELIVERED | BOUNCED | DEFERRED
Inbound: RECEIVED → PARSED | PARSE_FAILED
EmailDbOper
Requires the [db] extra and a async-db-tools PostgresPool.
EmailDbOper is lazy-imported: from wr_common_lib.email import MailStatus does not require async-db-tools.
from wr_common_lib.email import EmailDbOper, MailStatus, OutboundTask
db_oper = EmailDbOper(pool)
# Outbound
email_id = await db_oper.mark_queued(task)
await db_oper.mark_sent(email_id)
await db_oper.mark_failed(email_id)
# Lookup
row = await db_oper.find_by_content_hash("...")
# Inbound
email_id = await db_oper.insert_inbound_received(task, content_hash)
await db_oper.mark_parsed(email_id, {"key": "value"})
await db_oper.mark_parse_failed(email_id)
Task dict fields
Outbound (mark_queued):
| Field | Required |
|---|---|
imo, voyage_id, mail_from, to, content_hash |
yes |
id |
no (update existing row) |
cc, subject, content, attachments, created_user_id |
no |
Inbound (insert_inbound_received):
| Field | Required |
|---|---|
imo, voyage_id, mail_from, mail_to |
yes |
mail_cc, subject, body_markdown, raw_text, attachments |
no |
brevo_uuid, message_id, in_reply_to |
no (stored in parsed_data) |
Inserts use ON CONFLICT (content_hash) for idempotent upserts.
Dependencies
| install | brings in |
|---|---|
wr-common-lib |
— |
wr-common-lib[db] |
async-db-tools |
Your application still owns the database URL and pool lifecycle.
Development
pip install -e ".[db]"
uv version 0.1.2 # bump before release
export UV_PUBLISH_TOKEN=pypi-...
uv build && uv publish
PyPI does not allow re-uploading the same version; always bump the version for a new release.
License
MIT — see LICENSE.
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 wr_common_lib-0.1.3.tar.gz.
File metadata
- Download URL: wr_common_lib-0.1.3.tar.gz
- Upload date:
- Size: 4.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fff1fd6d7a78a8b7dfbf33dfe57bcd8bc8ade4516f21a502411af7ec0afa8128
|
|
| MD5 |
95e5eb2aad44f561f89d9e67abdf460e
|
|
| BLAKE2b-256 |
33b681e8885bf3f3cc3a8015a137a9f969e8e4a2e6c65a3930502beb61073935
|
File details
Details for the file wr_common_lib-0.1.3-py3-none-any.whl.
File metadata
- Download URL: wr_common_lib-0.1.3-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3f396bf78ec6ca6f7fa4d724e2c38c289497dad8e5b028e580805c5d3d11413
|
|
| MD5 |
44edd7699d46315c60cbc9b8cf14c472
|
|
| BLAKE2b-256 |
d07e88d856a3d6107a6dcb353f164baafbfa589d634fd5bbaf1cf029d9c39f1a
|