Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wr_common_lib-0.1.3.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wr_common_lib-0.1.3-py3-none-any.whl (6.3 kB view details)

Uploaded Python 3

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

Hashes for wr_common_lib-0.1.3.tar.gz
Algorithm Hash digest
SHA256 fff1fd6d7a78a8b7dfbf33dfe57bcd8bc8ade4516f21a502411af7ec0afa8128
MD5 95e5eb2aad44f561f89d9e67abdf460e
BLAKE2b-256 33b681e8885bf3f3cc3a8015a137a9f969e8e4a2e6c65a3930502beb61073935

See more details on using hashes here.

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

Hashes for wr_common_lib-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 d3f396bf78ec6ca6f7fa4d724e2c38c289497dad8e5b028e580805c5d3d11413
MD5 44edd7699d46315c60cbc9b8cf14c472
BLAKE2b-256 d07e88d856a3d6107a6dcb353f164baafbfa589d634fd5bbaf1cf029d9c39f1a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page