docs: nest generated docs under docs/lib and docs/mcp
This commit is contained in:
@@ -22,14 +22,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -43,28 +36,28 @@
|
||||
"name": "MailIntakeAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 18, 93)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 19, 94)>",
|
||||
"docstring": "Base adapter interface for mail providers.\n\nNotes:\n **Guarantees:**\n\n - Discover messages matching a query.\n - Retrieve full message payloads.\n - Retrieve full thread payloads.\n\n **Lifecycle:**\n\n - Adapters are intentionally read-only and must not mutate provider state.",
|
||||
"members": {
|
||||
"iter_message_refs": {
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 34, 63)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 35, 64)>",
|
||||
"docstring": "Iterate over lightweight message references matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n Dict[str, str]:\n Dictionaries containing message and thread identifiers.\n\nNotes:\n **Guarantees:**\n\n - Implementations must yield dictionaries containing at least\n `message_id` and `thread_id`.\n\nExample:\n Typical yield:\n\n ```python\n {\n \"message_id\": \"...\",\n \"thread_id\": \"...\"\n }\n ```"
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 65, 78)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 66, 79)>",
|
||||
"docstring": "Fetch a full raw message by message identifier.\n\nArgs:\n message_id (str):\n Provider-specific message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native message payload (e.g., Gmail message JSON structure)."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 80, 93)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 81, 94)>",
|
||||
"docstring": "Fetch a full raw thread by thread identifier.\n\nArgs:\n thread_id (str):\n Provider-specific thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native thread payload."
|
||||
}
|
||||
}
|
||||
@@ -8,14 +8,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -69,13 +62,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -92,11 +78,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeGmailAdapter": {
|
||||
"name": "MailIntakeGmailAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 28, 189)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 29, 184)>",
|
||||
"docstring": "Gmail read-only adapter.\n\nThis adapter implements the `MailIntakeAdapter` interface using the\nGmail REST API. It translates the generic mail intake contract into\nGmail-specific API calls.\n\nNotes:\n **Responsibilities:**\n\n - This class is the ONLY place where `googleapiclient` is imported.\n - Gmail REST semantics are known.\n - `.execute()` is called.\n\n **Constraints:**\n\n - Must remain thin and imperative.\n - Must not perform parsing or interpretation.\n - Must not expose Gmail-specific types beyond this class.",
|
||||
"members": {
|
||||
"service": {
|
||||
@@ -110,21 +103,21 @@
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 92, 133)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 93, 128)>",
|
||||
"docstring": "Iterate over message references matching the query.\n\nArgs:\n query (str):\n Gmail search query string.\n\nYields:\n Dict[str, str]:\n Dictionaries containing ``message_id`` and ``thread_id``.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 135, 161)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 130, 156)>",
|
||||
"docstring": "Fetch a full Gmail message by message ID.\n\nArgs:\n message_id (str):\n Gmail message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail message payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 163, 189)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 158, 184)>",
|
||||
"docstring": "Fetch a full Gmail thread by thread ID.\n\nArgs:\n thread_id (str):\n Gmail thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail thread payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
}
|
||||
}
|
||||
@@ -96,14 +96,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -117,28 +110,28 @@
|
||||
"name": "MailIntakeAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 18, 93)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 19, 94)>",
|
||||
"docstring": "Base adapter interface for mail providers.\n\nNotes:\n **Guarantees:**\n\n - Discover messages matching a query.\n - Retrieve full message payloads.\n - Retrieve full thread payloads.\n\n **Lifecycle:**\n\n - Adapters are intentionally read-only and must not mutate provider state.",
|
||||
"members": {
|
||||
"iter_message_refs": {
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 34, 63)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 35, 64)>",
|
||||
"docstring": "Iterate over lightweight message references matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n Dict[str, str]:\n Dictionaries containing message and thread identifiers.\n\nNotes:\n **Guarantees:**\n\n - Implementations must yield dictionaries containing at least\n `message_id` and `thread_id`.\n\nExample:\n Typical yield:\n\n ```python\n {\n \"message_id\": \"...\",\n \"thread_id\": \"...\"\n }\n ```"
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 65, 78)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 66, 79)>",
|
||||
"docstring": "Fetch a full raw message by message identifier.\n\nArgs:\n message_id (str):\n Provider-specific message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native message payload (e.g., Gmail message JSON structure)."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 80, 93)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 81, 94)>",
|
||||
"docstring": "Fetch a full raw thread by thread identifier.\n\nArgs:\n thread_id (str):\n Provider-specific thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native thread payload."
|
||||
}
|
||||
}
|
||||
@@ -156,14 +149,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -217,13 +203,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -240,11 +219,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeGmailAdapter": {
|
||||
"name": "MailIntakeGmailAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 28, 189)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 29, 184)>",
|
||||
"docstring": "Gmail read-only adapter.\n\nThis adapter implements the `MailIntakeAdapter` interface using the\nGmail REST API. It translates the generic mail intake contract into\nGmail-specific API calls.\n\nNotes:\n **Responsibilities:**\n\n - This class is the ONLY place where `googleapiclient` is imported.\n - Gmail REST semantics are known.\n - `.execute()` is called.\n\n **Constraints:**\n\n - Must remain thin and imperative.\n - Must not perform parsing or interpretation.\n - Must not expose Gmail-specific types beyond this class.",
|
||||
"members": {
|
||||
"service": {
|
||||
@@ -258,21 +244,21 @@
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 92, 133)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 93, 128)>",
|
||||
"docstring": "Iterate over message references matching the query.\n\nArgs:\n query (str):\n Gmail search query string.\n\nYields:\n Dict[str, str]:\n Dictionaries containing ``message_id`` and ``thread_id``.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 135, 161)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 130, 156)>",
|
||||
"docstring": "Fetch a full Gmail message by message ID.\n\nArgs:\n message_id (str):\n Gmail message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail message payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 163, 189)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 158, 184)>",
|
||||
"docstring": "Fetch a full Gmail thread by thread ID.\n\nArgs:\n thread_id (str):\n Gmail thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail thread payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
"name": "Sequence",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.Sequence",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'typing.Sequence')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'collections.abc.Sequence')>",
|
||||
"docstring": null
|
||||
},
|
||||
"google": {
|
||||
@@ -32,13 +32,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Request', 'google.auth.transport.requests.Request')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Credentials": {
|
||||
"name": "Credentials",
|
||||
"kind": "alias",
|
||||
@@ -46,6 +39,13 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Credentials', 'google.oauth2.credentials.Credentials')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -135,7 +135,7 @@
|
||||
"name": "Sequence",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.Sequence",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'typing.Sequence')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'collections.abc.Sequence')>",
|
||||
"docstring": null
|
||||
},
|
||||
"google": {
|
||||
@@ -152,13 +152,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Request', 'google.auth.transport.requests.Request')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Credentials": {
|
||||
"name": "Credentials",
|
||||
"kind": "alias",
|
||||
@@ -166,6 +159,13 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Credentials', 'google.oauth2.credentials.Credentials')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -11,18 +11,11 @@
|
||||
"signature": "<bound method Alias.signature of Alias('dataclass', 'dataclasses.dataclass')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.config.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeConfig": {
|
||||
"name": "MailIntakeConfig",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.config.MailIntakeConfig",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeConfig', 18, 57)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeConfig', 17, 56)>",
|
||||
"docstring": "Global configuration for `mail-intake`.\n\nNotes:\n **Guarantees:**\n\n - This configuration is intentionally explicit and immutable.\n - No implicit environment reads or global state.\n - Explicit configuration over implicit defaults.\n - No direct environment or filesystem access.\n - This model is safe to pass across layers and suitable for\n serialization.",
|
||||
"members": {
|
||||
"provider": {
|
||||
@@ -150,13 +150,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('pickle', 'pickle')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.pickle.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -247,11 +240,11 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nRedis-backed credential persistence for Mail Intake.\n\nThis module provides a Redis-based implementation of the\n`CredentialStore` abstraction, enabling credential persistence\nacross distributed and horizontally scaled deployments.\n\nThe Redis credential store is designed for environments where\nauthentication credentials must be shared safely across multiple\nprocesses, containers, or nodes, such as container orchestration\nplatforms and microservice architectures.\n\nKey characteristics:\n\n- Distributed-safe, shared storage using Redis.\n- Explicit, caller-defined serialization and deserialization.\n- No reliance on unsafe mechanisms such as `pickle`.\n- Optional time-to-live (TTL) support for automatic credential expiry.\n\nThis module is responsible solely for persistence concerns.\nCredential validation, refresh, rotation, and acquisition remain the\nresponsibility of authentication provider implementations.",
|
||||
"members": {
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'collections.abc.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
@@ -261,13 +254,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('TypeVar', 'typing.TypeVar')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'typing.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"CredentialStore": {
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
@@ -407,13 +393,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Generic', 'typing.Generic')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.store.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -432,28 +411,28 @@
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.credentials.store.CredentialStore",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 29, 105)>",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 28, 104)>",
|
||||
"docstring": "Abstract base class defining a generic persistence interface.\n\nUsed for authentication credentials across different backends.\n\nNotes:\n **Responsibilities:**\n\n - Provide persistent storage separating life-cycle management from\n storage mechanics.\n - Keep implementation focused only on persistence.\n\n **Constraints:**\n\n - The store is intentionally agnostic to:\n - The concrete credential type being stored.\n - The serialization format used to persist credentials.\n - The underlying storage backend or durability guarantees.",
|
||||
"members": {
|
||||
"load": {
|
||||
"name": "load",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.load",
|
||||
"signature": "<bound method Function.signature of Function('load', 50, 68)>",
|
||||
"signature": "<bound method Function.signature of Function('load', 49, 67)>",
|
||||
"docstring": "Load previously persisted credentials.\n\nReturns:\n Optional[T]:\n An instance of type `T` if credentials are available and\n loadable; otherwise `None`.\n\nNotes:\n **Guarantees:**\n\n - Implementations should return `None` when no credentials are\n present or when stored credentials cannot be successfully\n decoded or deserialized.\n - The store must not attempt to validate, refresh, or otherwise\n interpret the returned credentials."
|
||||
},
|
||||
"save": {
|
||||
"name": "save",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.save",
|
||||
"signature": "<bound method Function.signature of Function('save', 70, 89)>",
|
||||
"signature": "<bound method Function.signature of Function('save', 69, 88)>",
|
||||
"docstring": "Persist credentials to the underlying storage backend.\n\nArgs:\n credentials (T):\n The credential object to persist.\n\nNotes:\n **Lifecycle:**\n\n - This method is invoked when credentials are newly obtained or have been refreshed and are known to be valid at the time of persistence\n\n **Responsibilities:**\n\n - Ensuring durability appropriate to the deployment context\n - Applying encryption or access controls where required\n - Overwriting any previously stored credentials"
|
||||
},
|
||||
"clear": {
|
||||
"name": "clear",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.clear",
|
||||
"signature": "<bound method Function.signature of Function('clear', 91, 105)>",
|
||||
"signature": "<bound method Function.signature of Function('clear', 90, 104)>",
|
||||
"docstring": "Remove any persisted credentials from the store.\n\nNotes:\n **Lifecycle:**\n\n - This method is called when credentials are known to be invalid, revoked, corrupted, or otherwise unusable\n - Must ensure that no stale authentication material remains accessible\n\n **Guarantees:**\n\n - Implementations should treat this operation as idempotent"
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('pickle', 'pickle')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.pickle.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -4,11 +4,11 @@
|
||||
"path": "mail_intake.credentials.redis",
|
||||
"docstring": "# Summary\n\nRedis-backed credential persistence for Mail Intake.\n\nThis module provides a Redis-based implementation of the\n`CredentialStore` abstraction, enabling credential persistence\nacross distributed and horizontally scaled deployments.\n\nThe Redis credential store is designed for environments where\nauthentication credentials must be shared safely across multiple\nprocesses, containers, or nodes, such as container orchestration\nplatforms and microservice architectures.\n\nKey characteristics:\n\n- Distributed-safe, shared storage using Redis.\n- Explicit, caller-defined serialization and deserialization.\n- No reliance on unsafe mechanisms such as `pickle`.\n- Optional time-to-live (TTL) support for automatic credential expiry.\n\nThis module is responsible solely for persistence concerns.\nCredential validation, refresh, rotation, and acquisition remain the\nresponsibility of authentication provider implementations.",
|
||||
"objects": {
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'collections.abc.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
@@ -18,13 +18,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('TypeVar', 'typing.TypeVar')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'typing.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"CredentialStore": {
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
@@ -25,13 +25,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Generic', 'typing.Generic')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.store.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -50,28 +43,28 @@
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.credentials.store.CredentialStore",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 29, 105)>",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 28, 104)>",
|
||||
"docstring": "Abstract base class defining a generic persistence interface.\n\nUsed for authentication credentials across different backends.\n\nNotes:\n **Responsibilities:**\n\n - Provide persistent storage separating life-cycle management from\n storage mechanics.\n - Keep implementation focused only on persistence.\n\n **Constraints:**\n\n - The store is intentionally agnostic to:\n - The concrete credential type being stored.\n - The serialization format used to persist credentials.\n - The underlying storage backend or durability guarantees.",
|
||||
"members": {
|
||||
"load": {
|
||||
"name": "load",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.load",
|
||||
"signature": "<bound method Function.signature of Function('load', 50, 68)>",
|
||||
"signature": "<bound method Function.signature of Function('load', 49, 67)>",
|
||||
"docstring": "Load previously persisted credentials.\n\nReturns:\n Optional[T]:\n An instance of type `T` if credentials are available and\n loadable; otherwise `None`.\n\nNotes:\n **Guarantees:**\n\n - Implementations should return `None` when no credentials are\n present or when stored credentials cannot be successfully\n decoded or deserialized.\n - The store must not attempt to validate, refresh, or otherwise\n interpret the returned credentials."
|
||||
},
|
||||
"save": {
|
||||
"name": "save",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.save",
|
||||
"signature": "<bound method Function.signature of Function('save', 70, 89)>",
|
||||
"signature": "<bound method Function.signature of Function('save', 69, 88)>",
|
||||
"docstring": "Persist credentials to the underlying storage backend.\n\nArgs:\n credentials (T):\n The credential object to persist.\n\nNotes:\n **Lifecycle:**\n\n - This method is invoked when credentials are newly obtained or have been refreshed and are known to be valid at the time of persistence\n\n **Responsibilities:**\n\n - Ensuring durability appropriate to the deployment context\n - Applying encryption or access controls where required\n - Overwriting any previously stored credentials"
|
||||
},
|
||||
"clear": {
|
||||
"name": "clear",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.clear",
|
||||
"signature": "<bound method Function.signature of Function('clear', 91, 105)>",
|
||||
"signature": "<bound method Function.signature of Function('clear', 90, 104)>",
|
||||
"docstring": "Remove any persisted credentials from the store.\n\nNotes:\n **Lifecycle:**\n\n - This method is called when credentials are known to be invalid, revoked, corrupted, or otherwise unusable\n - Must ensure that no stale authentication material remains accessible\n\n **Guarantees:**\n\n - Implementations should treat this operation as idempotent"
|
||||
}
|
||||
}
|
||||
@@ -34,6 +34,13 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nHigh-level mail ingestion orchestration for Mail Intake.\n\nThis module provides the primary, provider-agnostic entry point for\nreading and processing mail data.\n\nIt coordinates:\n\n- Mail adapter access.\n- Message and thread iteration.\n- Header and body parsing.\n- Normalization and model construction.\n\nNo provider-specific logic or API semantics are permitted in this layer.",
|
||||
"members": {
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"datetime": {
|
||||
"name": "datetime",
|
||||
"kind": "alias",
|
||||
@@ -41,20 +48,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -92,6 +85,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -215,12 +215,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
@@ -229,12 +229,12 @@
|
||||
"signature": "<bound method Alias.signature of Alias('extract_sender', 'mail_intake.parsers.headers.extract_sender')>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
},
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"normalize_subject": {
|
||||
"name": "normalize_subject",
|
||||
@@ -243,32 +243,25 @@
|
||||
"signature": "<bound method Alias.signature of Alias('normalize_subject', 'mail_intake.parsers.subject.normalize_subject')>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeReader": {
|
||||
"name": "MailIntakeReader",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 31, 171)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 32, 172)>",
|
||||
"docstring": "High-level read-only ingestion interface.\n\nNotes:\n **Responsibilities:**\n\n - This class is the primary entry point for consumers of the\n Mail Intake library.\n - It orchestrates the full ingestion pipeline:\n - Querying the adapter for message references.\n - Fetching raw provider messages.\n - Parsing and normalizing message data.\n - Constructing domain models.\n\n **Constraints:**\n\n - This class is intentionally: Provider-agnostic, stateless beyond\n iteration scope, read-only.",
|
||||
"members": {
|
||||
"iter_messages": {
|
||||
"name": "iter_messages",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_messages",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 62, 80)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 63, 81)>",
|
||||
"docstring": "Iterate over parsed messages matching a provider query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeMessage:\n Fully parsed and normalized `MailIntakeMessage` instances.\n\nRaises:\n MailIntakeParsingError:\n If a message cannot be parsed."
|
||||
},
|
||||
"iter_threads": {
|
||||
"name": "iter_threads",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_threads",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 82, 120)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 83, 121)>",
|
||||
"docstring": "Iterate over threads constructed from messages matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeThread:\n An iterator of `MailIntakeThread` instances.\n\nRaises:\n `MailIntakeParsingError`:\n If a message cannot be parsed.\n\nNotes:\n **Guarantees:**\n\n - Messages are grouped by `thread_id` and yielded as complete\n thread objects containing all associated messages."
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,13 @@
|
||||
"path": "mail_intake.ingestion.reader",
|
||||
"docstring": "# Summary\n\nHigh-level mail ingestion orchestration for Mail Intake.\n\nThis module provides the primary, provider-agnostic entry point for\nreading and processing mail data.\n\nIt coordinates:\n\n- Mail adapter access.\n- Message and thread iteration.\n- Header and body parsing.\n- Normalization and model construction.\n\nNo provider-specific logic or API semantics are permitted in this layer.",
|
||||
"objects": {
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"datetime": {
|
||||
"name": "datetime",
|
||||
"kind": "alias",
|
||||
@@ -11,20 +18,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -62,6 +55,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -185,12 +185,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
@@ -199,12 +199,12 @@
|
||||
"signature": "<bound method Alias.signature of Alias('extract_sender', 'mail_intake.parsers.headers.extract_sender')>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
},
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"normalize_subject": {
|
||||
"name": "normalize_subject",
|
||||
@@ -213,32 +213,25 @@
|
||||
"signature": "<bound method Alias.signature of Alias('normalize_subject', 'mail_intake.parsers.subject.normalize_subject')>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeReader": {
|
||||
"name": "MailIntakeReader",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 31, 171)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 32, 172)>",
|
||||
"docstring": "High-level read-only ingestion interface.\n\nNotes:\n **Responsibilities:**\n\n - This class is the primary entry point for consumers of the\n Mail Intake library.\n - It orchestrates the full ingestion pipeline:\n - Querying the adapter for message references.\n - Fetching raw provider messages.\n - Parsing and normalizing message data.\n - Constructing domain models.\n\n **Constraints:**\n\n - This class is intentionally: Provider-agnostic, stateless beyond\n iteration scope, read-only.",
|
||||
"members": {
|
||||
"iter_messages": {
|
||||
"name": "iter_messages",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_messages",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 62, 80)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 63, 81)>",
|
||||
"docstring": "Iterate over parsed messages matching a provider query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeMessage:\n Fully parsed and normalized `MailIntakeMessage` instances.\n\nRaises:\n MailIntakeParsingError:\n If a message cannot be parsed."
|
||||
},
|
||||
"iter_threads": {
|
||||
"name": "iter_threads",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_threads",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 82, 120)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 83, 121)>",
|
||||
"docstring": "Iterate over threads constructed from messages matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeThread:\n An iterator of `MailIntakeThread` instances.\n\nRaises:\n `MailIntakeParsingError`:\n If a message cannot be parsed.\n\nNotes:\n **Guarantees:**\n\n - Messages are grouped by `thread_id` and yielded as complete\n thread objects containing all associated messages."
|
||||
}
|
||||
}
|
||||
@@ -18,18 +18,11 @@
|
||||
"signature": "<bound method Alias.signature of Alias('dataclass', 'dataclasses.dataclass')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.config.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeConfig": {
|
||||
"name": "MailIntakeConfig",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.config.MailIntakeConfig",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeConfig', 18, 57)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeConfig', 17, 56)>",
|
||||
"docstring": "Global configuration for `mail-intake`.\n\nNotes:\n **Guarantees:**\n\n - This configuration is intentionally explicit and immutable.\n - No implicit environment reads or global state.\n - Explicit configuration over implicit defaults.\n - No direct environment or filesystem access.\n - This model is safe to pass across layers and suitable for\n serialization.",
|
||||
"members": {
|
||||
"provider": {
|
||||
@@ -207,14 +200,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.base.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -228,28 +214,28 @@
|
||||
"name": "MailIntakeAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 18, 93)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeAdapter', 19, 94)>",
|
||||
"docstring": "Base adapter interface for mail providers.\n\nNotes:\n **Guarantees:**\n\n - Discover messages matching a query.\n - Retrieve full message payloads.\n - Retrieve full thread payloads.\n\n **Lifecycle:**\n\n - Adapters are intentionally read-only and must not mutate provider state.",
|
||||
"members": {
|
||||
"iter_message_refs": {
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 34, 63)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 35, 64)>",
|
||||
"docstring": "Iterate over lightweight message references matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n Dict[str, str]:\n Dictionaries containing message and thread identifiers.\n\nNotes:\n **Guarantees:**\n\n - Implementations must yield dictionaries containing at least\n `message_id` and `thread_id`.\n\nExample:\n Typical yield:\n\n ```python\n {\n \"message_id\": \"...\",\n \"thread_id\": \"...\"\n }\n ```"
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 65, 78)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 66, 79)>",
|
||||
"docstring": "Fetch a full raw message by message identifier.\n\nArgs:\n message_id (str):\n Provider-specific message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native message payload (e.g., Gmail message JSON structure)."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.base.MailIntakeAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 80, 93)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 81, 94)>",
|
||||
"docstring": "Fetch a full raw thread by thread identifier.\n\nArgs:\n thread_id (str):\n Provider-specific thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native thread payload."
|
||||
}
|
||||
}
|
||||
@@ -267,14 +253,7 @@
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.adapters.gmail.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
@@ -328,13 +307,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -351,11 +323,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeAdapterError": {
|
||||
"name": "MailIntakeAdapterError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeAdapterError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeAdapterError', 'mail_intake.exceptions.MailIntakeAdapterError')>",
|
||||
"docstring": "Errors raised by mail provider adapters.\n\nNotes:\n **Lifecycle:**\n\n - Raised when a provider adapter encounters API errors, transport\n failures, or invalid provider responses."
|
||||
},
|
||||
"MailIntakeGmailAdapter": {
|
||||
"name": "MailIntakeGmailAdapter",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 28, 189)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeGmailAdapter', 29, 184)>",
|
||||
"docstring": "Gmail read-only adapter.\n\nThis adapter implements the `MailIntakeAdapter` interface using the\nGmail REST API. It translates the generic mail intake contract into\nGmail-specific API calls.\n\nNotes:\n **Responsibilities:**\n\n - This class is the ONLY place where `googleapiclient` is imported.\n - Gmail REST semantics are known.\n - `.execute()` is called.\n\n **Constraints:**\n\n - Must remain thin and imperative.\n - Must not perform parsing or interpretation.\n - Must not expose Gmail-specific types beyond this class.",
|
||||
"members": {
|
||||
"service": {
|
||||
@@ -369,21 +348,21 @@
|
||||
"name": "iter_message_refs",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.iter_message_refs",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 92, 133)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_message_refs', 93, 128)>",
|
||||
"docstring": "Iterate over message references matching the query.\n\nArgs:\n query (str):\n Gmail search query string.\n\nYields:\n Dict[str, str]:\n Dictionaries containing ``message_id`` and ``thread_id``.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_message": {
|
||||
"name": "fetch_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_message",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 135, 161)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_message', 130, 156)>",
|
||||
"docstring": "Fetch a full Gmail message by message ID.\n\nArgs:\n message_id (str):\n Gmail message identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail message payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
},
|
||||
"fetch_thread": {
|
||||
"name": "fetch_thread",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.adapters.gmail.MailIntakeGmailAdapter.fetch_thread",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 163, 189)>",
|
||||
"signature": "<bound method Function.signature of Function('fetch_thread', 158, 184)>",
|
||||
"docstring": "Fetch a full Gmail thread by thread ID.\n\nArgs:\n thread_id (str):\n Gmail thread identifier.\n\nReturns:\n Dict[str, Any]:\n Provider-native Gmail thread payload.\n\nRaises:\n MailIntakeAdapterError:\n If the Gmail API returns an error."
|
||||
}
|
||||
}
|
||||
@@ -530,7 +509,7 @@
|
||||
"name": "Sequence",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.Sequence",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'typing.Sequence')>",
|
||||
"signature": "<bound method Alias.signature of Alias('Sequence', 'collections.abc.Sequence')>",
|
||||
"docstring": null
|
||||
},
|
||||
"google": {
|
||||
@@ -547,13 +526,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Request', 'google.auth.transport.requests.Request')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Credentials": {
|
||||
"name": "Credentials",
|
||||
"kind": "alias",
|
||||
@@ -561,6 +533,13 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Credentials', 'google.oauth2.credentials.Credentials')>",
|
||||
"docstring": null
|
||||
},
|
||||
"InstalledAppFlow": {
|
||||
"name": "InstalledAppFlow",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.auth.google.InstalledAppFlow",
|
||||
"signature": "<bound method Alias.signature of Alias('InstalledAppFlow', 'google_auth_oauthlib.flow.InstalledAppFlow')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeAuthProvider": {
|
||||
"name": "MailIntakeAuthProvider",
|
||||
"kind": "class",
|
||||
@@ -815,13 +794,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('pickle', 'pickle')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.pickle.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -912,11 +884,11 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nRedis-backed credential persistence for Mail Intake.\n\nThis module provides a Redis-based implementation of the\n`CredentialStore` abstraction, enabling credential persistence\nacross distributed and horizontally scaled deployments.\n\nThe Redis credential store is designed for environments where\nauthentication credentials must be shared safely across multiple\nprocesses, containers, or nodes, such as container orchestration\nplatforms and microservice architectures.\n\nKey characteristics:\n\n- Distributed-safe, shared storage using Redis.\n- Explicit, caller-defined serialization and deserialization.\n- No reliance on unsafe mechanisms such as `pickle`.\n- Optional time-to-live (TTL) support for automatic credential expiry.\n\nThis module is responsible solely for persistence concerns.\nCredential validation, refresh, rotation, and acquisition remain the\nresponsibility of authentication provider implementations.",
|
||||
"members": {
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'collections.abc.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
@@ -926,13 +898,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('TypeVar', 'typing.TypeVar')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Callable": {
|
||||
"name": "Callable",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.redis.Callable",
|
||||
"signature": "<bound method Alias.signature of Alias('Callable', 'typing.Callable')>",
|
||||
"docstring": null
|
||||
},
|
||||
"CredentialStore": {
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
@@ -1072,13 +1037,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Generic', 'typing.Generic')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.credentials.store.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"TypeVar": {
|
||||
"name": "TypeVar",
|
||||
"kind": "alias",
|
||||
@@ -1097,28 +1055,28 @@
|
||||
"name": "CredentialStore",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.credentials.store.CredentialStore",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 29, 105)>",
|
||||
"signature": "<bound method Class.signature of Class('CredentialStore', 28, 104)>",
|
||||
"docstring": "Abstract base class defining a generic persistence interface.\n\nUsed for authentication credentials across different backends.\n\nNotes:\n **Responsibilities:**\n\n - Provide persistent storage separating life-cycle management from\n storage mechanics.\n - Keep implementation focused only on persistence.\n\n **Constraints:**\n\n - The store is intentionally agnostic to:\n - The concrete credential type being stored.\n - The serialization format used to persist credentials.\n - The underlying storage backend or durability guarantees.",
|
||||
"members": {
|
||||
"load": {
|
||||
"name": "load",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.load",
|
||||
"signature": "<bound method Function.signature of Function('load', 50, 68)>",
|
||||
"signature": "<bound method Function.signature of Function('load', 49, 67)>",
|
||||
"docstring": "Load previously persisted credentials.\n\nReturns:\n Optional[T]:\n An instance of type `T` if credentials are available and\n loadable; otherwise `None`.\n\nNotes:\n **Guarantees:**\n\n - Implementations should return `None` when no credentials are\n present or when stored credentials cannot be successfully\n decoded or deserialized.\n - The store must not attempt to validate, refresh, or otherwise\n interpret the returned credentials."
|
||||
},
|
||||
"save": {
|
||||
"name": "save",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.save",
|
||||
"signature": "<bound method Function.signature of Function('save', 70, 89)>",
|
||||
"signature": "<bound method Function.signature of Function('save', 69, 88)>",
|
||||
"docstring": "Persist credentials to the underlying storage backend.\n\nArgs:\n credentials (T):\n The credential object to persist.\n\nNotes:\n **Lifecycle:**\n\n - This method is invoked when credentials are newly obtained or have been refreshed and are known to be valid at the time of persistence\n\n **Responsibilities:**\n\n - Ensuring durability appropriate to the deployment context\n - Applying encryption or access controls where required\n - Overwriting any previously stored credentials"
|
||||
},
|
||||
"clear": {
|
||||
"name": "clear",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.credentials.store.CredentialStore.clear",
|
||||
"signature": "<bound method Function.signature of Function('clear', 91, 105)>",
|
||||
"signature": "<bound method Function.signature of Function('clear', 90, 104)>",
|
||||
"docstring": "Remove any persisted credentials from the store.\n\nNotes:\n **Lifecycle:**\n\n - This method is called when credentials are known to be invalid, revoked, corrupted, or otherwise unusable\n - Must ensure that no stale authentication material remains accessible\n\n **Guarantees:**\n\n - Implementations should treat this operation as idempotent"
|
||||
}
|
||||
}
|
||||
@@ -1164,6 +1122,13 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nHigh-level mail ingestion orchestration for Mail Intake.\n\nThis module provides the primary, provider-agnostic entry point for\nreading and processing mail data.\n\nIt coordinates:\n\n- Mail adapter access.\n- Message and thread iteration.\n- Header and body parsing.\n- Normalization and model construction.\n\nNo provider-specific logic or API semantics are permitted in this layer.",
|
||||
"members": {
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'collections.abc.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"datetime": {
|
||||
"name": "datetime",
|
||||
"kind": "alias",
|
||||
@@ -1171,20 +1136,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Iterator": {
|
||||
"name": "Iterator",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Iterator",
|
||||
"signature": "<bound method Alias.signature of Alias('Iterator', 'typing.Iterator')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.ingestion.reader.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -1222,6 +1173,13 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -1345,12 +1303,12 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
@@ -1359,12 +1317,12 @@
|
||||
"signature": "<bound method Alias.signature of Alias('extract_sender', 'mail_intake.parsers.headers.extract_sender')>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
},
|
||||
"extract_body": {
|
||||
"name": "extract_body",
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.extract_body",
|
||||
"signature": "<bound method Alias.signature of Alias('extract_body', 'mail_intake.parsers.body.extract_body')>",
|
||||
"docstring": "Extract the best-effort message body from a Gmail payload.\n\nPriority:\n\n1. `text/plain`\n2. `text/html` (stripped to text)\n3. Single-part body\n4. Empty string (if nothing usable found)\n\nArgs:\n payload (Dict[str, Any]):\n Provider-native message payload dictionary.\n\nReturns:\n str:\n Extracted plain-text message body."
|
||||
"path": "mail_intake.ingestion.reader.parse_headers",
|
||||
"signature": "<bound method Alias.signature of Alias('parse_headers', 'mail_intake.parsers.headers.parse_headers')>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"normalize_subject": {
|
||||
"name": "normalize_subject",
|
||||
@@ -1373,32 +1331,25 @@
|
||||
"signature": "<bound method Alias.signature of Alias('normalize_subject', 'mail_intake.parsers.subject.normalize_subject')>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
},
|
||||
"MailIntakeParsingError": {
|
||||
"name": "MailIntakeParsingError",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeParsingError",
|
||||
"signature": "<bound method Alias.signature of Alias('MailIntakeParsingError', 'mail_intake.exceptions.MailIntakeParsingError')>",
|
||||
"docstring": "Errors encountered while parsing message content.\n\nNotes:\n **Lifecycle:**\n\n - Raised when raw provider payloads cannot be interpreted or\n normalized into internal domain models."
|
||||
},
|
||||
"MailIntakeReader": {
|
||||
"name": "MailIntakeReader",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 31, 171)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeReader', 32, 172)>",
|
||||
"docstring": "High-level read-only ingestion interface.\n\nNotes:\n **Responsibilities:**\n\n - This class is the primary entry point for consumers of the\n Mail Intake library.\n - It orchestrates the full ingestion pipeline:\n - Querying the adapter for message references.\n - Fetching raw provider messages.\n - Parsing and normalizing message data.\n - Constructing domain models.\n\n **Constraints:**\n\n - This class is intentionally: Provider-agnostic, stateless beyond\n iteration scope, read-only.",
|
||||
"members": {
|
||||
"iter_messages": {
|
||||
"name": "iter_messages",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_messages",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 62, 80)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_messages', 63, 81)>",
|
||||
"docstring": "Iterate over parsed messages matching a provider query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeMessage:\n Fully parsed and normalized `MailIntakeMessage` instances.\n\nRaises:\n MailIntakeParsingError:\n If a message cannot be parsed."
|
||||
},
|
||||
"iter_threads": {
|
||||
"name": "iter_threads",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.ingestion.reader.MailIntakeReader.iter_threads",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 82, 120)>",
|
||||
"signature": "<bound method Function.signature of Function('iter_threads', 83, 121)>",
|
||||
"docstring": "Iterate over threads constructed from messages matching a query.\n\nArgs:\n query (str):\n Provider-specific query string used to filter messages.\n\nYields:\n MailIntakeThread:\n An iterator of `MailIntakeThread` instances.\n\nRaises:\n `MailIntakeParsingError`:\n If a message cannot be parsed.\n\nNotes:\n **Guarantees:**\n\n - Messages are grouped by `thread_id` and yielded as complete\n thread objects containing all associated messages."
|
||||
}
|
||||
}
|
||||
@@ -1558,25 +1509,11 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.message.MailIntakeMessage",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 19, 80)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 18, 79)>",
|
||||
"docstring": "Canonical internal representation of a single email message.\n\nNotes:\n **Guarantees:**\n\n - This model represents a fully parsed and normalized email message.\n - It is intentionally provider-agnostic and suitable for\n persistence, indexing, and downstream processing.\n\n **Constraints:**\n\n - No provider-specific identifiers, payloads, or API semantics\n should appear in this model.",
|
||||
"members": {
|
||||
"message_id": {
|
||||
@@ -1674,20 +1611,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Set": {
|
||||
"name": "Set",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Set",
|
||||
"signature": "<bound method Alias.signature of Alias('Set', 'typing.Set')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -1764,7 +1687,7 @@
|
||||
"name": "MailIntakeThread",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 20, 81)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 19, 80)>",
|
||||
"docstring": "Canonical internal representation of an email thread.\n\nNotes:\n **Guarantees:**\n\n - A thread groups multiple related messages under a single subject\n and participant set.\n - It is designed to support reasoning over conversational context\n such as job applications, interviews, follow-ups, and ongoing discussions.\n - This model is provider-agnostic and safe to persist.",
|
||||
"members": {
|
||||
"thread_id": {
|
||||
@@ -1806,17 +1729,10 @@
|
||||
"name": "add_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread.add_message",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 60, 81)>",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 59, 80)>",
|
||||
"docstring": "Add a message to the thread and update derived fields.\n\nArgs:\n message (MailIntakeMessage):\n Parsed mail message to add to the thread.\n\nNotes:\n **Responsibilities:**\n\n - Appends the message to the thread.\n - Tracks unique participants.\n - Updates the last activity timestamp."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1871,13 +1787,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('base64', 'base64')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -1885,13 +1794,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"BeautifulSoup": {
|
||||
"name": "BeautifulSoup",
|
||||
"kind": "alias",
|
||||
@@ -1922,46 +1824,18 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nMessage header parsing utilities for Mail Intake.\n\nThis module provides helper functions for normalizing and extracting\nuseful information from provider-native message headers.\n\nThe functions here are intentionally simple and tolerant of malformed\nor incomplete header data.",
|
||||
"members": {
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Tuple": {
|
||||
"name": "Tuple",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Tuple",
|
||||
"signature": "<bound method Alias.signature of Alias('Tuple', 'typing.Tuple')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.parse_headers",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 16, 64)>",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 14, 62)>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.extract_sender",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 67, 102)>",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 65, 100)>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
}
|
||||
}
|
||||
@@ -1984,7 +1858,7 @@
|
||||
"name": "normalize_subject",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.subject.normalize_subject",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 22, 62)>",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 21, 61)>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
}
|
||||
}
|
||||
@@ -148,25 +148,11 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.message.MailIntakeMessage",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 19, 80)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 18, 79)>",
|
||||
"docstring": "Canonical internal representation of a single email message.\n\nNotes:\n **Guarantees:**\n\n - This model represents a fully parsed and normalized email message.\n - It is intentionally provider-agnostic and suitable for\n persistence, indexing, and downstream processing.\n\n **Constraints:**\n\n - No provider-specific identifiers, payloads, or API semantics\n should appear in this model.",
|
||||
"members": {
|
||||
"message_id": {
|
||||
@@ -264,20 +250,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Set": {
|
||||
"name": "Set",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Set",
|
||||
"signature": "<bound method Alias.signature of Alias('Set', 'typing.Set')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -354,7 +326,7 @@
|
||||
"name": "MailIntakeThread",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 20, 81)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 19, 80)>",
|
||||
"docstring": "Canonical internal representation of an email thread.\n\nNotes:\n **Guarantees:**\n\n - A thread groups multiple related messages under a single subject\n and participant set.\n - It is designed to support reasoning over conversational context\n such as job applications, interviews, follow-ups, and ongoing discussions.\n - This model is provider-agnostic and safe to persist.",
|
||||
"members": {
|
||||
"thread_id": {
|
||||
@@ -396,17 +368,10 @@
|
||||
"name": "add_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread.add_message",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 60, 81)>",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 59, 80)>",
|
||||
"docstring": "Add a message to the thread and update derived fields.\n\nArgs:\n message (MailIntakeMessage):\n Parsed mail message to add to the thread.\n\nNotes:\n **Responsibilities:**\n\n - Appends the message to the thread.\n - Tracks unique participants.\n - Updates the last activity timestamp."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,25 +18,11 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.message.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.message.MailIntakeMessage",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 19, 80)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeMessage', 18, 79)>",
|
||||
"docstring": "Canonical internal representation of a single email message.\n\nNotes:\n **Guarantees:**\n\n - This model represents a fully parsed and normalized email message.\n - It is intentionally provider-agnostic and suitable for\n persistence, indexing, and downstream processing.\n\n **Constraints:**\n\n - No provider-specific identifiers, payloads, or API semantics\n should appear in this model.",
|
||||
"members": {
|
||||
"message_id": {
|
||||
@@ -25,20 +25,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('datetime', 'datetime.datetime')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Set": {
|
||||
"name": "Set",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Set",
|
||||
"signature": "<bound method Alias.signature of Alias('Set', 'typing.Set')>",
|
||||
"docstring": null
|
||||
},
|
||||
"MailIntakeMessage": {
|
||||
"name": "MailIntakeMessage",
|
||||
"kind": "class",
|
||||
@@ -115,7 +101,7 @@
|
||||
"name": "MailIntakeThread",
|
||||
"kind": "class",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 20, 81)>",
|
||||
"signature": "<bound method Class.signature of Class('MailIntakeThread', 19, 80)>",
|
||||
"docstring": "Canonical internal representation of an email thread.\n\nNotes:\n **Guarantees:**\n\n - A thread groups multiple related messages under a single subject\n and participant set.\n - It is designed to support reasoning over conversational context\n such as job applications, interviews, follow-ups, and ongoing discussions.\n - This model is provider-agnostic and safe to persist.",
|
||||
"members": {
|
||||
"thread_id": {
|
||||
@@ -157,17 +143,10 @@
|
||||
"name": "add_message",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.models.thread.MailIntakeThread.add_message",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 60, 81)>",
|
||||
"signature": "<bound method Function.signature of Function('add_message', 59, 80)>",
|
||||
"docstring": "Add a message to the thread and update derived fields.\n\nArgs:\n message (MailIntakeMessage):\n Parsed mail message to add to the thread.\n\nNotes:\n **Responsibilities:**\n\n - Appends the message to the thread.\n - Tracks unique participants.\n - Updates the last activity timestamp."
|
||||
}
|
||||
}
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.models.thread.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('base64', 'base64')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -25,13 +18,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"BeautifulSoup": {
|
||||
"name": "BeautifulSoup",
|
||||
"kind": "alias",
|
||||
@@ -4,46 +4,18 @@
|
||||
"path": "mail_intake.parsers.headers",
|
||||
"docstring": "# Summary\n\nMessage header parsing utilities for Mail Intake.\n\nThis module provides helper functions for normalizing and extracting\nuseful information from provider-native message headers.\n\nThe functions here are intentionally simple and tolerant of malformed\nor incomplete header data.",
|
||||
"objects": {
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Tuple": {
|
||||
"name": "Tuple",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Tuple",
|
||||
"signature": "<bound method Alias.signature of Alias('Tuple', 'typing.Tuple')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.parse_headers",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 16, 64)>",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 14, 62)>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.extract_sender",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 67, 102)>",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 65, 100)>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
}
|
||||
}
|
||||
@@ -46,13 +46,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('base64', 'base64')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Any": {
|
||||
"name": "Any",
|
||||
"kind": "alias",
|
||||
@@ -60,13 +53,6 @@
|
||||
"signature": "<bound method Alias.signature of Alias('Any', 'typing.Any')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.body.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"BeautifulSoup": {
|
||||
"name": "BeautifulSoup",
|
||||
"kind": "alias",
|
||||
@@ -97,46 +83,18 @@
|
||||
"signature": null,
|
||||
"docstring": "# Summary\n\nMessage header parsing utilities for Mail Intake.\n\nThis module provides helper functions for normalizing and extracting\nuseful information from provider-native message headers.\n\nThe functions here are intentionally simple and tolerant of malformed\nor incomplete header data.",
|
||||
"members": {
|
||||
"Dict": {
|
||||
"name": "Dict",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Dict",
|
||||
"signature": "<bound method Alias.signature of Alias('Dict', 'typing.Dict')>",
|
||||
"docstring": null
|
||||
},
|
||||
"List": {
|
||||
"name": "List",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.List",
|
||||
"signature": "<bound method Alias.signature of Alias('List', 'typing.List')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Tuple": {
|
||||
"name": "Tuple",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Tuple",
|
||||
"signature": "<bound method Alias.signature of Alias('Tuple', 'typing.Tuple')>",
|
||||
"docstring": null
|
||||
},
|
||||
"Optional": {
|
||||
"name": "Optional",
|
||||
"kind": "alias",
|
||||
"path": "mail_intake.parsers.headers.Optional",
|
||||
"signature": "<bound method Alias.signature of Alias('Optional', 'typing.Optional')>",
|
||||
"docstring": null
|
||||
},
|
||||
"parse_headers": {
|
||||
"name": "parse_headers",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.parse_headers",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 16, 64)>",
|
||||
"signature": "<bound method Function.signature of Function('parse_headers', 14, 62)>",
|
||||
"docstring": "Convert a list of Gmail-style headers into a normalized dict.\n\nArgs:\n raw_headers (List[Dict[str, str]]):\n List of header dictionaries, each containing `name` and `value` keys.\n\nReturns:\n Dict[str, str]:\n Dictionary mapping lowercase header names to stripped values.\n\nNotes:\n **Guarantees:**\n\n - Provider payloads (such as Gmail) typically represent headers as a\n list of name/value mappings.\n - This function normalizes them into a case-insensitive dictionary\n keyed by lowercase header names.\n\nExample:\n Typical usage:\n\n ```python\n Input:\n [\n {\"name\": \"From\", \"value\": \"John Doe <john@example.com>\"},\n {\"name\": \"Subject\", \"value\": \"Re: Interview Update\"},\n ]\n\n Output:\n {\n \"from\": \"John Doe <john@example.com>\",\n \"subject\": \"Re: Interview Update\",\n }\n ```"
|
||||
},
|
||||
"extract_sender": {
|
||||
"name": "extract_sender",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.headers.extract_sender",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 67, 102)>",
|
||||
"signature": "<bound method Function.signature of Function('extract_sender', 65, 100)>",
|
||||
"docstring": "Extract sender email and optional display name from headers.\n\nArgs:\n headers (Dict[str, str]):\n Normalized header dictionary as returned by `parse_headers()`.\n\nReturns:\n Tuple[str, Optional[str]]:\n A tuple `(email, name)` where `email` is the sender email address\n and `name` is the display name, or `None` if unavailable.\n\nNotes:\n **Responsibilities:**\n\n - This function parses the `From` header and attempts to extract\n sender email address and optional human-readable display name.\n\nExample:\n Typical values:\n\n - `\"John Doe <john@example.com>\"` -> `(\"john@example.com\", \"John Doe\")`\n - `\"john@example.com\"` -> `(\"john@example.com\", None)`"
|
||||
}
|
||||
}
|
||||
@@ -159,7 +117,7 @@
|
||||
"name": "normalize_subject",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.subject.normalize_subject",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 22, 62)>",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 21, 61)>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@
|
||||
"name": "normalize_subject",
|
||||
"kind": "function",
|
||||
"path": "mail_intake.parsers.subject.normalize_subject",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 22, 62)>",
|
||||
"signature": "<bound method Function.signature of Function('normalize_subject', 21, 61)>",
|
||||
"docstring": "Normalize an email subject for thread-level comparison.\n\nArgs:\n subject (str):\n Raw subject line from a message header.\n\nReturns:\n str:\n Normalized subject string suitable for thread grouping.\n\nNotes:\n **Responsibilities:**\n\n - Strips common prefixes such as `Re:`, `Fwd:`, and `FW:`.\n - Repeats prefix stripping to handle stacked prefixes.\n - Collapses excessive whitespace.\n - Preserves original casing (no lowercasing).\n\n **Guarantees:**\n\n - This function is intentionally conservative and avoids aggressive\n transformations that could alter the semantic meaning of the subject."
|
||||
}
|
||||
}
|
||||
@@ -63,6 +63,7 @@ markdown_extensions:
|
||||
- pymdownx.tilde
|
||||
- pymdownx.mark
|
||||
site_name: mail_intake
|
||||
docs_dir: docs/lib
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Core API:
|
||||
|
||||
Reference in New Issue
Block a user