Build: 0.1.8
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-03-08 01:01:39 +05:30
parent 8701bf92ac
commit 9191de9dff
200 changed files with 130793 additions and 18277 deletions

View File

@@ -77,7 +77,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="/." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -142,12 +144,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -173,154 +182,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="/." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="/ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="/models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="/adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="/auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="/parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="/config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -334,10 +195,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="/." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -380,13 +239,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -395,8 +264,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="/ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -405,8 +275,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -416,27 +292,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -476,13 +331,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -491,8 +358,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="/models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -501,8 +369,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -512,27 +386,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -595,13 +448,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -610,8 +475,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="/adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -620,8 +486,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -631,27 +503,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -714,13 +565,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -729,8 +600,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="/auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -739,8 +611,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -750,27 +628,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -925,13 +782,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -940,8 +811,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="/parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -950,8 +822,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -961,27 +839,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="/parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1067,13 +924,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1082,7 +947,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1189,6 +1054,8 @@
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1226,7 +1093,7 @@
<script id="__config" type="application/json">{"base": "/", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "/assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "/", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "/assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="/assets/javascripts/bundle.f55a23d4.min.js"></script>

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -607,6 +458,16 @@
@@ -614,7 +475,6 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -624,8 +484,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -634,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
@@ -645,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -734,6 +580,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.adapters.base-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAdapter
@@ -744,6 +609,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter.fetch_message" class="md-nav__link">
<span class="md-ellipsis">
fetch_message
@@ -778,6 +653,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -827,13 +712,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -842,8 +747,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -852,8 +758,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -863,27 +775,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -1038,13 +929,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1053,8 +958,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -1063,8 +969,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -1074,27 +986,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1180,13 +1071,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1195,7 +1094,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1305,6 +1204,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.adapters.base-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAdapter
@@ -1315,6 +1233,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.adapters.base.MailIntakeAdapter.fetch_message" class="md-nav__link">
<span class="md-ellipsis">
fetch_message
@@ -1349,6 +1277,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1375,7 +1313,7 @@
<h2 id="mail_intake.adapters.base" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.adapters.base</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.adapters.base</span>
</h2>
@@ -1383,6 +1321,8 @@
<div class="doc doc-contents first">
<p>Mail provider adapter contracts for Mail Intake.</p>
<hr />
<h4 id="mail_intake.adapters.base--summary">Summary</h4>
<p>This module defines the <strong>provider-agnostic adapter interface</strong> used for
read-only mail ingestion.</p>
<p>Adapters encapsulate all provider-specific access logic and expose a
@@ -1398,17 +1338,17 @@ types or semantics should leak beyond implementations of this interface.</p>
<h3 id="mail_intake.adapters.base-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.adapters.base.MailIntakeAdapter" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeAdapter</span>
<h4 id="mail_intake.adapters.base.MailIntakeAdapter" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeAdapter</span>
</h3>
</h4>
<div class="doc doc-contents ">
@@ -1417,13 +1357,22 @@ types or semantics should leak beyond implementations of this interface.</p>
<p>Base adapter interface for mail providers.</p>
<p>This interface defines the minimal contract required to:
- Discover messages matching a query
- Retrieve full message payloads
- Retrieve full thread payloads</p>
<p>Adapters are intentionally read-only and must not mutate provider state.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>- discover messages matching a query
- retrieve full message payloads
- retrieve full thread payloads
</code></pre></div></td></tr></table></div>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- adapters are intentionally read-only and must not mutate provider state
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
@@ -1434,22 +1383,22 @@ types or semantics should leak beyond implementations of this interface.</p>
<h5 id="mail_intake.adapters.base.MailIntakeAdapter-functions">Functions</h5>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.adapters.base.MailIntakeAdapter.fetch_message" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">fetch_message</span>
<h6 id="mail_intake.adapters.base.MailIntakeAdapter.fetch_message" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">fetch_message</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">fetch_message</span><span class="p">(</span><span class="n">message_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">fetch_message</span><span class="p">(</span><span class="n">message_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1500,17 +1449,8 @@ types or semantics should leak beyond implementations of this interface.</p>
</td>
<td>
<div class="doc-md-description">
<p>Provider-native message payload</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Dict">Dict</span>[str, <span title="typing.Any">Any</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>(e.g., Gmail message JSON structure).</p>
<p>Dict[str, Any]:
Provider-native message payload (e.g., Gmail message JSON structure).</p>
</div>
</td>
</tr>
@@ -1524,17 +1464,17 @@ types or semantics should leak beyond implementations of this interface.</p>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.adapters.base.MailIntakeAdapter.fetch_thread" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">fetch_thread</span>
<h6 id="mail_intake.adapters.base.MailIntakeAdapter.fetch_thread" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">fetch_thread</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">fetch_thread</span><span class="p">(</span><span class="n">thread_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">fetch_thread</span><span class="p">(</span><span class="n">thread_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1585,7 +1525,8 @@ types or semantics should leak beyond implementations of this interface.</p>
</td>
<td>
<div class="doc-md-description">
<p>Provider-native thread payload.</p>
<p>Dict[str, Any]:
Provider-native thread payload.</p>
</div>
</td>
</tr>
@@ -1599,24 +1540,21 @@ types or semantics should leak beyond implementations of this interface.</p>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.adapters.base.MailIntakeAdapter.iter_message_refs" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">iter_message_refs</span>
<h6 id="mail_intake.adapters.base.MailIntakeAdapter.iter_message_refs" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">iter_message_refs</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">iter_message_refs</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">iter_message_refs</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Iterate over lightweight message references matching a query.</p>
<p>Implementations must yield dictionaries containing at least:
- <code>message_id</code>: Provider-specific message identifier
- <code>thread_id</code>: Provider-specific thread identifier</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1663,7 +1601,8 @@ types or semantics should leak beyond implementations of this interface.</p>
</td>
<td>
<div class="doc-md-description">
<p>Dictionaries containing message and thread identifiers.</p>
<p>Dict[str, str]:
Dictionaries containing message and thread identifiers.</p>
</div>
</td>
</tr>
@@ -1671,12 +1610,24 @@ types or semantics should leak beyond implementations of this interface.</p>
</table>
<details class="example-yield" open>
<summary>Example yield</summary>
<p>{
"message_id": "...",
"thread_id": "..."
}</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Implementations must yield dictionaries containing at least ``message_id`` and ``thread_id``
</code></pre></div></td></tr></table></div>
</details>
<details class="example" open>
<summary>Example</summary>
<p>Typical yield:</p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code>{
&quot;message_id&quot;: &quot;...&quot;,
&quot;thread_id&quot;: &quot;...&quot;
}
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1715,6 +1666,8 @@ types or semantics should leak beyond implementations of this interface.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1752,7 +1705,7 @@ types or semantics should leak beyond implementations of this interface.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -727,13 +576,30 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -743,8 +609,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -753,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
@@ -764,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -853,6 +705,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.auth.base-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAuthProvider
@@ -863,6 +734,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider.get_credentials" class="md-nav__link">
<span class="md-ellipsis">
get_credentials
@@ -879,6 +760,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1020,13 +911,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1035,8 +940,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -1045,8 +951,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -1056,27 +968,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1162,13 +1053,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1177,7 +1076,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1287,6 +1186,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.auth.base-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAuthProvider
@@ -1297,6 +1215,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.base.MailIntakeAuthProvider.get_credentials" class="md-nav__link">
<span class="md-ellipsis">
get_credentials
@@ -1313,6 +1241,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1339,7 +1277,7 @@
<h2 id="mail_intake.auth.base" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.auth.base</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.auth.base</span>
</h2>
@@ -1347,6 +1285,8 @@
<div class="doc doc-contents first">
<p>Authentication provider contracts for Mail Intake.</p>
<hr />
<h4 id="mail_intake.auth.base--summary">Summary</h4>
<p>This module defines the <strong>authentication abstraction layer</strong> used by mail
adapters to obtain provider-specific credentials.</p>
<p>Authentication concerns are intentionally decoupled from adapter logic.
@@ -1362,17 +1302,17 @@ credentials are acquired, refreshed, or persisted.</p>
<h3 id="mail_intake.auth.base-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.auth.base.MailIntakeAuthProvider" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeAuthProvider</span>
<h4 id="mail_intake.auth.base.MailIntakeAuthProvider" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeAuthProvider</span>
</h3>
</h4>
<div class="doc doc-contents ">
@@ -1384,15 +1324,25 @@ credentials are acquired, refreshed, or persisted.</p>
<p>This interface enforces a strict contract between authentication
providers and mail adapters by requiring providers to explicitly
declare the type of credentials they return.</p>
<p>Authentication providers encapsulate all logic required to:
- Acquire credentials from an external provider
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code>- Acquire credentials from an external provider
- Refresh or revalidate credentials as needed
- Handle authentication-specific failure modes
- Coordinate with credential persistence layers where applicable</p>
<p>Mail adapters must treat returned credentials as opaque and
provider-specific, relying only on the declared credential type
expected by the adapter.</p>
- Coordinate with credential persistence layers where applicable
</code></pre></div></td></tr></table></div>
<p><strong>Constraints:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><code>- Mail adapters must treat returned credentials as opaque and provider-specific
- Mail adapters rely only on the declared credential type expected by the adapter
</code></pre></div></td></tr></table></div>
</details>
@@ -1404,60 +1354,45 @@ expected by the adapter.</p>
<h5 id="mail_intake.auth.base.MailIntakeAuthProvider-functions">Functions</h5>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.auth.base.MailIntakeAuthProvider.get_credentials" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">get_credentials</span>
<h6 id="mail_intake.auth.base.MailIntakeAuthProvider.get_credentials" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_credentials</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-abstractmethod"><code>abstractmethod</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">get_credentials</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">T</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">get_credentials</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">T</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Retrieve valid, provider-specific credentials.</p>
<p>This method is synchronous by design and represents the sole
entry point through which adapters obtain authentication
material.</p>
<p>Implementations must either return credentials of the declared
type <code>T</code> that are valid at the time of return or raise an
authentication-specific exception.</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<td><code>T</code></td> <td>
<code><span title="mail_intake.auth.base.T">T</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Credentials of type <code>T</code> suitable for immediate use by the</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="mail_intake.auth.base.T">T</span></code>
</td>
<td>
<div class="doc-md-description">
<p>corresponding mail adapter.</p>
<p>Credentials of type <code>T</code> suitable for immediate use by the
corresponding mail adapter.</p>
</div>
</td>
</tr>
@@ -1488,6 +1423,17 @@ credentials could not be obtained or validated.</p>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>- This method is synchronous by design
- Represents the sole entry point through which adapters obtain authentication material
- Implementations must either return credentials of the declared type ``T`` that are valid at the time of return or raise an exception
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1525,6 +1471,8 @@ credentials could not be obtained or validated.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1562,7 +1510,7 @@ credentials could not be obtained or validated.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -727,13 +576,30 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -743,8 +609,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -753,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
@@ -764,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -876,6 +728,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.auth.google-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeGoogleAuth
@@ -886,6 +757,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth.get_credentials" class="md-nav__link">
<span class="md-ellipsis">
get_credentials
@@ -902,6 +783,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1020,13 +911,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1035,8 +940,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -1045,8 +951,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -1056,27 +968,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1162,13 +1053,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1177,7 +1076,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1287,6 +1186,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.auth.google-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeGoogleAuth
@@ -1297,6 +1215,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.auth.google.MailIntakeGoogleAuth.get_credentials" class="md-nav__link">
<span class="md-ellipsis">
get_credentials
@@ -1313,6 +1241,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1339,7 +1277,7 @@
<h2 id="mail_intake.auth.google" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.auth.google</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.auth.google</span>
</h2>
@@ -1347,6 +1285,8 @@
<div class="doc doc-contents first">
<p>Google authentication provider implementation for Mail Intake.</p>
<hr />
<h4 id="mail_intake.auth.google--summary">Summary</h4>
<p>This module provides a <strong>Google OAuthbased authentication provider</strong>
used primarily for Gmail access.</p>
<p>It encapsulates all Google-specific authentication concerns, including:
@@ -1365,35 +1305,45 @@ used primarily for Gmail access.</p>
<h3 id="mail_intake.auth.google-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.auth.google.MailIntakeGoogleAuth" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeGoogleAuth</span>
<h4 id="mail_intake.auth.google.MailIntakeGoogleAuth" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeGoogleAuth</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">MailIntakeGoogleAuth</span><span class="p">(</span><span class="n">credentials_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">store</span><span class="p">:</span> <span class="n">CredentialStore</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="n">scopes</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">MailIntakeGoogleAuth</span><span class="p">(</span><span class="n">credentials_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">store</span><span class="p">:</span> <span class="n">CredentialStore</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="n">scopes</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.auth.base.MailIntakeAuthProvider" href="../base/#mail_intake.auth.base.MailIntakeAuthProvider">MailIntakeAuthProvider</a></code></p>
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.auth.base.MailIntakeAuthProvider" href="../../mail_intake/auth/base/#mail_intake.auth.base.MailIntakeAuthProvider">MailIntakeAuthProvider</a></code></p>
<p>Google OAuth provider for Gmail access.</p>
<p>This provider implements the <code>MailIntakeAuthProvider</code> interface using
Google's OAuth 2.0 flow and credential management libraries.</p>
<p>Responsibilities:
- Load cached credentials from a credential store when available
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code>- Load cached credentials from a credential store when available
- Refresh expired credentials when possible
- Initiate an interactive OAuth flow only when required
- Persist refreshed or newly obtained credentials via the store</p>
<p>This class is synchronous by design and maintains a minimal internal state.</p>
- Persist refreshed or newly obtained credentials via the store
</code></pre></div></td></tr></table></div>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This class is synchronous by design and maintains a minimal internal state
</code></pre></div></td></tr></table></div>
</details>
<p>Initialize the Google authentication provider.</p>
@@ -1415,8 +1365,7 @@ Google's OAuth 2.0 flow and credential management libraries.</p>
</td>
<td>
<div class="doc-md-description">
<p>Path to the Google OAuth client secrets file used to
initiate the OAuth 2.0 flow.</p>
<p>Path to the Google OAuth client secrets file used to initiate the OAuth 2.0 flow.</p>
</div>
</td>
<td>
@@ -1426,12 +1375,11 @@ initiate the OAuth 2.0 flow.</p>
<tr class="doc-section-item">
<td><code>store</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="mail_intake.credentials.store.CredentialStore" href="../../credentials/store/#mail_intake.credentials.store.CredentialStore">CredentialStore</a>[<span title="typing.Any">Any</span>]</code>
<code><a class="autorefs autorefs-internal" title="mail_intake.credentials.store.CredentialStore" href="../../mail_intake/credentials/store/#mail_intake.credentials.store.CredentialStore">CredentialStore</a>[<span title="google.oauth2.credentials.Credentials">Credentials</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>Credential store responsible for persisting and
retrieving Google OAuth credentials.</p>
<p>Credential store responsible for persisting and retrieving Google OAuth credentials.</p>
</div>
</td>
<td>
@@ -1466,55 +1414,41 @@ retrieving Google OAuth credentials.</p>
<h5 id="mail_intake.auth.google.MailIntakeGoogleAuth-functions">Functions</h5>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.auth.google.MailIntakeGoogleAuth.get_credentials" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">get_credentials</span>
<h6 id="mail_intake.auth.google.MailIntakeGoogleAuth.get_credentials" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">get_credentials</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">get_credentials</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Any</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">get_credentials</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Any</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Retrieve valid Google OAuth credentials.</p>
<p>This method attempts to:
1. Load cached credentials from the configured credential store
2. Refresh expired credentials when possible
3. Perform an interactive OAuth login as a fallback
4. Persist valid credentials for future use</p>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<td><code>Credentials</code></td> <td>
<code><span title="typing.Any">Any</span></code>
</td>
<td>
<div class="doc-md-description">
<p>A <code>google.oauth2.credentials.Credentials</code> instance suitable</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Any">Any</span></code>
</td>
<td>
<div class="doc-md-description">
<p>for use with Google API clients.</p>
<p>A <code>google.oauth2.credentials.Credentials</code> instance suitable
for use with Google API clients.</p>
</div>
</td>
</tr>
@@ -1533,7 +1467,7 @@ retrieving Google OAuth credentials.</p>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeAuthError" href="../../exceptions/#mail_intake.exceptions.MailIntakeAuthError">MailIntakeAuthError</a></code>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeAuthError" href="../../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeAuthError">MailIntakeAuthError</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1545,6 +1479,19 @@ or obtained via interactive authentication.</p>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code>- Load cached credentials from the configured credential store
- Refresh expired credentials when possible
- Perform an interactive OAuth login as a fallback
- Persist valid credentials for future use
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1582,6 +1529,8 @@ or obtained via interactive authentication.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1619,7 +1568,7 @@ or obtained via interactive authentication.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="./" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -725,13 +574,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -740,8 +609,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -750,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -761,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -936,13 +791,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -951,8 +820,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -961,8 +831,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -972,27 +848,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1080,13 +935,18 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -1183,6 +1043,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.config-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeConfig
@@ -1193,6 +1072,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig-attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
<nav class="md-nav" aria-label="Attributes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig.credentials_path" class="md-nav__link">
<span class="md-ellipsis">
credentials_path
@@ -1245,6 +1134,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1323,6 +1222,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.config-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeConfig
@@ -1333,6 +1251,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig-attributes" class="md-nav__link">
<span class="md-ellipsis">
Attributes
</span>
</a>
<nav class="md-nav" aria-label="Attributes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.config.MailIntakeConfig.credentials_path" class="md-nav__link">
<span class="md-ellipsis">
credentials_path
@@ -1385,6 +1313,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1411,7 +1349,7 @@
<h2 id="mail_intake.config" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.config</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.config</span>
</h2>
@@ -1419,6 +1357,8 @@
<div class="doc doc-contents first">
<p>Global configuration models for Mail Intake.</p>
<hr />
<h4 id="mail_intake.config--summary">Summary</h4>
<p>This module defines the <strong>top-level configuration object</strong> used to control
mail ingestion behavior across adapters, authentication providers, and
ingestion workflows.</p>
@@ -1434,37 +1374,45 @@ environment reads to ensure predictability and testability.</p>
<h3 id="mail_intake.config-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.config.MailIntakeConfig" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeConfig</span>
<h4 id="mail_intake.config.MailIntakeConfig" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeConfig</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small>
</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">MailIntakeConfig</span><span class="p">(</span><span class="n">provider</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">readonly</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">credentials_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">token_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span><span class="p">)</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">MailIntakeConfig</span><span class="p">(</span><span class="n">provider</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">readonly</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">credentials_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span><span class="p">,</span> <span class="n">token_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Global configuration for mail-intake.</p>
<p>This configuration is intentionally explicit and immutable.
No implicit environment reads or global state.</p>
<p>Design principles:
- Immutable once constructed
- Explicit configuration over implicit defaults
- No direct environment or filesystem access</p>
<p>This model is safe to pass across layers and suitable for serialization.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span></pre></div></td><td class="code"><div><pre><span></span><code>- This configuration is intentionally explicit and immutable
- No implicit environment reads or global state
- Explicit configuration over implicit defaults
- No direct environment or filesystem access
- This model is safe to pass across layers and suitable for serialization
</code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
@@ -1473,14 +1421,14 @@ No implicit environment reads or global state.</p>
<h5 id="mail_intake.config.MailIntakeConfig-attributes">Attributes</h5>
<div class="doc doc-object doc-attribute">
<h4 id="mail_intake.config.MailIntakeConfig.credentials_path" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">credentials_path</span>
<h6 id="mail_intake.config.MailIntakeConfig.credentials_path" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">credentials_path</span>
<span class="doc doc-labels">
@@ -1488,9 +1436,9 @@ No implicit environment reads or global state.</p>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="n">credentials_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="n">credentials_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1503,8 +1451,8 @@ No implicit environment reads or global state.</p>
<h4 id="mail_intake.config.MailIntakeConfig.provider" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">provider</span>
<h6 id="mail_intake.config.MailIntakeConfig.provider" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">provider</span>
<span class="doc doc-labels">
@@ -1512,9 +1460,9 @@ No implicit environment reads or global state.</p>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="n">provider</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;gmail&#39;</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="n">provider</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;gmail&#39;</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1527,8 +1475,8 @@ No implicit environment reads or global state.</p>
<h4 id="mail_intake.config.MailIntakeConfig.readonly" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">readonly</span>
<h6 id="mail_intake.config.MailIntakeConfig.readonly" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">readonly</span>
<span class="doc doc-labels">
@@ -1536,9 +1484,9 @@ No implicit environment reads or global state.</p>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="n">readonly</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="n">readonly</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1551,8 +1499,8 @@ No implicit environment reads or global state.</p>
<h4 id="mail_intake.config.MailIntakeConfig.token_path" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">token_path</span>
<h6 id="mail_intake.config.MailIntakeConfig.token_path" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">token_path</span>
<span class="doc doc-labels">
@@ -1560,9 +1508,9 @@ No implicit environment reads or global state.</p>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="n">token_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="n">token_path</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1575,8 +1523,8 @@ No implicit environment reads or global state.</p>
<h4 id="mail_intake.config.MailIntakeConfig.user_id" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">user_id</span>
<h6 id="mail_intake.config.MailIntakeConfig.user_id" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">user_id</span>
<span class="doc doc-labels">
@@ -1584,9 +1532,9 @@ No implicit environment reads or global state.</p>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;me&#39;</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;me&#39;</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1630,6 +1578,8 @@ No implicit environment reads or global state.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1667,7 +1617,7 @@ No implicit environment reads or global state.</p>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -727,13 +576,30 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -743,8 +609,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -753,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_5">
@@ -764,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -945,6 +797,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore" class="md-nav__link">
<span class="md-ellipsis">
PickleCredentialStore
@@ -955,6 +826,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore.clear" class="md-nav__link">
<span class="md-ellipsis">
clear
@@ -989,6 +870,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1038,13 +929,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1053,8 +958,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -1063,8 +969,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -1074,27 +986,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1180,13 +1071,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1195,7 +1094,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1305,6 +1204,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore" class="md-nav__link">
<span class="md-ellipsis">
PickleCredentialStore
@@ -1315,6 +1233,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.credentials.pickle.PickleCredentialStore.clear" class="md-nav__link">
<span class="md-ellipsis">
clear
@@ -1349,6 +1277,16 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1375,7 +1313,7 @@
<h2 id="mail_intake.credentials.pickle" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.credentials.pickle</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.credentials.pickle</span>
</h2>
@@ -1383,6 +1321,8 @@
<div class="doc doc-contents first">
<p>Local filesystembased credential persistence for Mail Intake.</p>
<hr />
<h4 id="mail_intake.credentials.pickle--summary">Summary</h4>
<p>This module provides a file-backed implementation of the
<code>CredentialStore</code> abstraction using Python's <code>pickle</code> module.</p>
<p>The pickle-based credential store is intended for local development,
@@ -1401,36 +1341,44 @@ untrusted environments.</p>
<h3 id="mail_intake.credentials.pickle-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.credentials.pickle.PickleCredentialStore" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">PickleCredentialStore</span>
<h4 id="mail_intake.credentials.pickle.PickleCredentialStore" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">PickleCredentialStore</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">PickleCredentialStore</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">PickleCredentialStore</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.credentials.store.CredentialStore" href="../store/#mail_intake.credentials.store.CredentialStore">CredentialStore</a>[<span title="mail_intake.credentials.pickle.T">T</span>]</code></p>
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.credentials.store.CredentialStore" href="../../mail_intake/credentials/store/#mail_intake.credentials.store.CredentialStore">CredentialStore</a>[<span title="mail_intake.credentials.pickle.T">T</span>]</code></p>
<p>Filesystem-backed credential store using pickle serialization.</p>
<p>This store persists credentials as a pickled object on the local
filesystem. It is a simple implementation intended primarily for
development, testing, and single-process execution contexts.</p>
<p>This implementation:
- Stores credentials on the local filesystem
- Uses pickle for serialization and deserialization
- Does not provide encryption, locking, or concurrency guarantees</p>
<p>Credential lifecycle management, validation, and refresh logic are
explicitly out of scope for this class.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>- Stores credentials on the local filesystem
- Uses pickle for serialization and deserialization
- Does not provide encryption, locking, or concurrency guarantees
</code></pre></div></td></tr></table></div>
<p><strong>Constraints:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Credential lifecycle management, validation, and refresh logic are explicitly out of scope for this class
</code></pre></div></td></tr></table></div>
</details>
<p>Initialize a pickle-backed credential store.</p>
@@ -1474,25 +1422,30 @@ The file will be created or overwritten as needed.</p>
<h5 id="mail_intake.credentials.pickle.PickleCredentialStore-functions">Functions</h5>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.credentials.pickle.PickleCredentialStore.clear" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">clear</span>
<h6 id="mail_intake.credentials.pickle.PickleCredentialStore.clear" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">clear</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">clear</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">clear</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Remove persisted credentials from the local filesystem.</p>
<p>This method deletes the credential file if it exists and should
be treated as an idempotent operation.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This method deletes the credential file if it exists and should be treated as an idempotent operation
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1500,21 +1453,17 @@ be treated as an idempotent operation.</p>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.credentials.pickle.PickleCredentialStore.load" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">load</span>
<h6 id="mail_intake.credentials.pickle.PickleCredentialStore.load" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">load</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">load</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">T</span><span class="p">]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">load</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">T</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Load credentials from the local filesystem.</p>
<p>If the credential file does not exist or cannot be successfully
deserialized, this method returns <code>None</code>.</p>
<p>The store does not attempt to validate or interpret the returned
credentials.</p>
<p><span class="doc-section-title">Returns:</span></p>
@@ -1532,23 +1481,24 @@ credentials.</p>
</td>
<td>
<div class="doc-md-description">
<p>An instance of type <code>T</code> if credentials are present and</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Optional">Optional</span>[<span title="mail_intake.credentials.pickle.T">T</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>successfully deserialized; otherwise <code>None</code>.</p>
<p>Optional[T]:
An instance of type <code>T</code> if credentials are present and
successfully deserialized; otherwise <code>None</code>.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><code>- If the credential file does not exist or cannot be successfully deserialized, this method returns ``None``
- The store does not attempt to validate or interpret the returned credentials
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1556,19 +1506,17 @@ credentials.</p>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.credentials.pickle.PickleCredentialStore.save" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">save</span>
<h6 id="mail_intake.credentials.pickle.PickleCredentialStore.save" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">save</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">save</span><span class="p">(</span><span class="n">credentials</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">save</span><span class="p">(</span><span class="n">credentials</span><span class="p">:</span> <span class="n">T</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Persist credentials to the local filesystem.</p>
<p>Any previously stored credentials at the configured path are
overwritten.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1599,6 +1547,13 @@ overwritten.</p>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Any previously stored credentials at the configured path are overwritten
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1636,6 +1591,8 @@ overwritten.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1673,7 +1630,7 @@ overwritten.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -84,7 +84,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -149,12 +151,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -180,156 +189,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href=".." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -343,10 +202,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -389,13 +246,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -404,8 +271,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -414,8 +282,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -425,27 +299,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -485,13 +338,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -500,8 +365,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -510,8 +376,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -521,27 +393,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -604,13 +455,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -619,8 +482,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -629,8 +493,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -640,27 +510,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -723,13 +572,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -738,8 +607,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -748,8 +618,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -759,27 +635,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -934,13 +789,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -949,8 +818,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -959,8 +829,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -970,27 +846,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1078,13 +933,18 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -1204,6 +1064,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.exceptions--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.exceptions-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.exceptions.MailIntakeAdapterError" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAdapterError
@@ -1242,6 +1121,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1297,6 +1181,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.exceptions--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.exceptions-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.exceptions.MailIntakeAdapterError" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeAdapterError
@@ -1335,6 +1238,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1361,7 +1269,7 @@
<h2 id="mail_intake.exceptions" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.exceptions</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.exceptions</span>
</h2>
@@ -1369,6 +1277,8 @@
<div class="doc doc-contents first">
<p>Exception hierarchy for Mail Intake.</p>
<hr />
<h4 id="mail_intake.exceptions--summary">Summary</h4>
<p>This module defines the <strong>canonical exception types</strong> used throughout the
Mail Intake library.</p>
<p>All library-raised errors derive from <code>MailIntakeError</code>. Consumers are
@@ -1384,29 +1294,34 @@ provider-specific or third-party exceptions.</p>
<h3 id="mail_intake.exceptions-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.exceptions.MailIntakeAdapterError" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeAdapterError</span>
<h4 id="mail_intake.exceptions.MailIntakeAdapterError" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeAdapterError</span>
</h3>
</h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
<p>Errors raised by mail provider adapters.</p>
<p>Raised when a provider adapter encounters API errors,
transport failures, or invalid provider responses.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Raised when a provider adapter encounters API errors, transport failures, or invalid provider responses
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1415,23 +1330,28 @@ transport failures, or invalid provider responses.</p>
<h3 id="mail_intake.exceptions.MailIntakeAuthError" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeAuthError</span>
<h4 id="mail_intake.exceptions.MailIntakeAuthError" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeAuthError</span>
</h3>
</h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
<p>Authentication and credential-related failures.</p>
<p>Raised when authentication providers are unable to acquire,
refresh, or persist valid credentials.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Raised when authentication providers are unable to acquire, refresh, or persist valid credentials
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1440,11 +1360,11 @@ refresh, or persist valid credentials.</p>
<h3 id="mail_intake.exceptions.MailIntakeError" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeError</span>
<h4 id="mail_intake.exceptions.MailIntakeError" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeError</span>
</h3>
</h4>
<div class="doc doc-contents ">
@@ -1453,12 +1373,19 @@ refresh, or persist valid credentials.</p>
<p>Base exception for all Mail Intake errors.</p>
<p>This is the root of the Mail Intake exception hierarchy.
All errors raised by the library must derive from this class.</p>
<p>Consumers should generally catch this type when handling
library-level failures.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span></pre></div></td><td class="code"><div><pre><span></span><code>- This is the root of the Mail Intake exception hierarchy
- All errors raised by the library must derive from this class
- Consumers should generally catch this type when handling library-level failures
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1467,23 +1394,28 @@ library-level failures.</p>
<h3 id="mail_intake.exceptions.MailIntakeParsingError" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeParsingError</span>
<h4 id="mail_intake.exceptions.MailIntakeParsingError" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeParsingError</span>
</h3>
</h4>
<div class="doc doc-contents ">
<p class="doc doc-class-bases">
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
Bases: <code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeError" href="../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeError">MailIntakeError</a></code></p>
<p>Errors encountered while parsing message content.</p>
<p>Raised when raw provider payloads cannot be interpreted
or normalized into internal domain models.</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Lifecycle:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Raised when raw provider payloads cannot be interpreted or normalized into internal domain models
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1513,6 +1445,8 @@ or normalized into internal domain models.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1550,7 +1484,7 @@ or normalized into internal domain models.</p>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item">
<a href="../../parsers/" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -392,6 +249,14 @@
@@ -399,7 +264,6 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -409,8 +273,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2" checked>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -419,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
@@ -430,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -519,6 +369,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeReader
@@ -529,6 +398,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader.iter_messages" class="md-nav__link">
<span class="md-ellipsis">
iter_messages
@@ -554,6 +433,25 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
@@ -580,13 +478,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -595,8 +505,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -605,8 +516,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -616,27 +533,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -699,13 +595,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -714,8 +622,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -724,8 +633,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -735,27 +650,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -818,13 +712,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -833,8 +747,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -843,8 +758,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -854,27 +775,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -1029,13 +929,27 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1044,8 +958,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../parsers/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -1054,8 +969,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
@@ -1065,27 +986,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../parsers/" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1171,13 +1071,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1186,7 +1094,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1296,6 +1204,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
<nav class="md-nav" aria-label="Classes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader" class="md-nav__link">
<span class="md-ellipsis">
MailIntakeReader
@@ -1306,6 +1233,16 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader.MailIntakeReader.iter_messages" class="md-nav__link">
<span class="md-ellipsis">
iter_messages
@@ -1331,6 +1268,25 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#mail_intake.ingestion.reader-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1357,7 +1313,7 @@
<h2 id="mail_intake.ingestion.reader" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.ingestion.reader</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.ingestion.reader</span>
</h2>
@@ -1365,6 +1321,8 @@
<div class="doc doc-contents first">
<p>High-level mail ingestion orchestration for Mail Intake.</p>
<hr />
<h4 id="mail_intake.ingestion.reader--summary">Summary</h4>
<p>This module provides the primary, provider-agnostic entry point for
reading and processing mail data.</p>
<p>It coordinates:
@@ -1383,36 +1341,37 @@ reading and processing mail data.</p>
<h3 id="mail_intake.ingestion.reader-classes">Classes</h3>
<div class="doc doc-object doc-class">
<h3 id="mail_intake.ingestion.reader.MailIntakeReader" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">MailIntakeReader</span>
<h4 id="mail_intake.ingestion.reader.MailIntakeReader" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-class"></code> <span class="doc doc-object-name doc-class-name">MailIntakeReader</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">MailIntakeReader</span><span class="p">(</span><span class="n">adapter</span><span class="p">:</span> <span class="n">MailIntakeAdapter</span><span class="p">)</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">MailIntakeReader</span><span class="p">(</span><span class="n">adapter</span><span class="p">:</span> <span class="n">MailIntakeAdapter</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>High-level read-only ingestion interface.</p>
<p>This class is the <strong>primary entry point</strong> for consumers of the Mail
Intake library.</p>
<p>It orchestrates the full ingestion pipeline:
- Querying the adapter for message references
- Fetching raw provider messages
- Parsing and normalizing message data
- Constructing domain models</p>
<p>This class is intentionally:
- Provider-agnostic
- Stateless beyond iteration scope
- Read-only</p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><code>- This class is the primary entry point for consumers of the Mail Intake library
- It orchestrates the full ingestion pipeline: Querying the adapter for message references, fetching raw provider messages, parsing and normalizing message data, constructing domain models
</code></pre></div></td></tr></table></div>
<p><strong>Constraints:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This class is intentionally: Provider-agnostic, stateless beyond iteration scope, read-only
</code></pre></div></td></tr></table></div>
</details>
<p>Initialize the mail reader.</p>
@@ -1430,12 +1389,11 @@ Intake library.</p>
<tr class="doc-section-item">
<td><code>adapter</code></td>
<td>
<code><a class="autorefs autorefs-internal" title="mail_intake.adapters.base.MailIntakeAdapter" href="../../adapters/base/#mail_intake.adapters.base.MailIntakeAdapter">MailIntakeAdapter</a></code>
<code><a class="autorefs autorefs-internal" title="mail_intake.adapters.base.MailIntakeAdapter" href="../../mail_intake/adapters/base/#mail_intake.adapters.base.MailIntakeAdapter">MailIntakeAdapter</a></code>
</td>
<td>
<div class="doc-md-description">
<p>Mail adapter implementation used to retrieve raw
messages and threads from a mail provider.</p>
<p>Mail adapter implementation used to retrieve raw messages and threads from a mail provider.</p>
</div>
</td>
<td>
@@ -1456,18 +1414,18 @@ messages and threads from a mail provider.</p>
<h5 id="mail_intake.ingestion.reader.MailIntakeReader-functions">Functions</h5>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.ingestion.reader.MailIntakeReader.iter_messages" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">iter_messages</span>
<h6 id="mail_intake.ingestion.reader.MailIntakeReader.iter_messages" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">iter_messages</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">iter_messages</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MailIntakeMessage</span><span class="p">]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">iter_messages</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MailIntakeMessage</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1507,13 +1465,13 @@ messages and threads from a mail provider.</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<td><code>MailIntakeMessage</code></td> <td>
<code><a class="autorefs autorefs-internal" title="mail_intake.models.message.MailIntakeMessage" href="../../models/message/#mail_intake.models.message.MailIntakeMessage">MailIntakeMessage</a></code>
</td>
<td>
@@ -1537,7 +1495,7 @@ messages and threads from a mail provider.</p>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeParsingError" href="../../exceptions/#mail_intake.exceptions.MailIntakeParsingError">MailIntakeParsingError</a></code>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeParsingError" href="../../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeParsingError">MailIntakeParsingError</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1555,19 +1513,17 @@ messages and threads from a mail provider.</p>
<div class="doc doc-object doc-function">
<h4 id="mail_intake.ingestion.reader.MailIntakeReader.iter_threads" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">iter_threads</span>
<h6 id="mail_intake.ingestion.reader.MailIntakeReader.iter_threads" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">iter_threads</span>
</h4>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">iter_threads</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MailIntakeThread</span><span class="p">]</span>
</code></pre></div>
</h6>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">iter_threads</span><span class="p">(</span><span class="n">query</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Iterator</span><span class="p">[</span><span class="n">MailIntakeThread</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Iterate over threads constructed from messages matching a query.</p>
<p>Messages are grouped by <code>thread_id</code> and yielded as complete thread
objects containing all associated messages.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1599,18 +1555,18 @@ objects containing all associated messages.</p>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<p><span class="doc-section-title">Yields:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><span title="typing.Iterator">Iterator</span>[<a class="autorefs autorefs-internal" title="mail_intake.models.thread.MailIntakeThread" href="../../models/thread/#mail_intake.models.thread.MailIntakeThread">MailIntakeThread</a>]</code>
<td><code>MailIntakeThread</code></td> <td>
<code><a class="autorefs autorefs-internal" title="mail_intake.models.thread.MailIntakeThread" href="../../models/thread/#mail_intake.models.thread.MailIntakeThread">MailIntakeThread</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1633,7 +1589,7 @@ objects containing all associated messages.</p>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeParsingError" href="../../exceptions/#mail_intake.exceptions.MailIntakeParsingError">MailIntakeParsingError</a></code>
<code><a class="autorefs autorefs-internal" title="mail_intake.exceptions.MailIntakeParsingError" href="../../mail_intake/exceptions/#mail_intake.exceptions.MailIntakeParsingError">MailIntakeParsingError</a></code>
</td>
<td>
<div class="doc-md-description">
@@ -1644,6 +1600,13 @@ objects containing all associated messages.</p>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- Messages are grouped by `thread_id` and yielded as complete thread objects containing all associated messages
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1655,7 +1618,7 @@ objects containing all associated messages.</p>
</div>
</div>
<h3 id="mail_intake.ingestion.reader-functions">Functions</h3>
@@ -1681,6 +1644,8 @@ objects containing all associated messages.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1718,7 +1683,7 @@ objects containing all associated messages.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -725,13 +574,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -740,8 +609,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -750,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -761,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -937,6 +792,18 @@
@@ -944,7 +811,6 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -954,8 +820,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -964,8 +831,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
@@ -975,27 +848,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1064,6 +916,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.body-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.body-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.body.extract_body" class="md-nav__link">
<span class="md-ellipsis">
extract_body
@@ -1075,6 +946,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1147,13 +1023,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1162,7 +1046,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1272,6 +1156,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.body-classes" class="md-nav__link">
<span class="md-ellipsis">
Classes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.body-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.body.extract_body" class="md-nav__link">
<span class="md-ellipsis">
extract_body
@@ -1283,6 +1186,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1309,7 +1217,7 @@
<h2 id="mail_intake.parsers.body" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.parsers.body</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.parsers.body</span>
</h2>
@@ -1331,19 +1239,19 @@ prefers human-readable text over fidelity to original formatting.</p>
<h3 id="mail_intake.parsers.body-classes">Classes</h3>
<h3 id="mail_intake.parsers.body-functions">Functions</h3>
<div class="doc doc-object doc-function">
<h3 id="mail_intake.parsers.body.extract_body" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">extract_body</span>
<h4 id="mail_intake.parsers.body.extract_body" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">extract_body</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">extract_body</span><span class="p">(</span><span class="n">payload</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">extract_body</span><span class="p">(</span><span class="n">payload</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
@@ -1434,6 +1342,8 @@ prefers human-readable text over fidelity to original formatting.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1471,7 +1381,7 @@ prefers human-readable text over fidelity to original formatting.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -725,13 +574,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -740,8 +609,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -750,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -761,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -937,6 +792,18 @@
@@ -944,7 +811,6 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -954,8 +820,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -964,8 +831,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
@@ -975,27 +848,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1087,6 +939,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers.extract_sender" class="md-nav__link">
<span class="md-ellipsis">
extract_sender
@@ -1107,6 +978,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1156,13 +1032,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1171,7 +1055,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1281,6 +1165,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.headers.extract_sender" class="md-nav__link">
<span class="md-ellipsis">
extract_sender
@@ -1301,6 +1204,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1327,7 +1235,7 @@
<h2 id="mail_intake.parsers.headers" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.parsers.headers</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.parsers.headers</span>
</h2>
@@ -1335,6 +1243,8 @@
<div class="doc doc-contents first">
<p>Message header parsing utilities for Mail Intake.</p>
<hr />
<h4 id="mail_intake.parsers.headers--summary">Summary</h4>
<p>This module provides helper functions for normalizing and extracting
useful information from provider-native message headers.</p>
<p>The functions here are intentionally simple and tolerant of malformed
@@ -1350,25 +1260,22 @@ or incomplete header data.</p>
<h3 id="mail_intake.parsers.headers-functions">Functions</h3>
<div class="doc doc-object doc-function">
<h3 id="mail_intake.parsers.headers.extract_sender" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">extract_sender</span>
<h4 id="mail_intake.parsers.headers.extract_sender" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">extract_sender</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">extract_sender</span><span class="p">(</span><span class="n">headers</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">extract_sender</span><span class="p">(</span><span class="n">headers</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Extract sender email and optional display name from headers.</p>
<p>This function parses the <code>From</code> header and attempts to extract:
- Sender email address
- Optional human-readable display name</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1389,8 +1296,7 @@ or incomplete header data.</p>
</td>
<td>
<div class="doc-md-description">
<p>Normalized header dictionary as returned by
:func:<code>parse_headers</code>.</p>
<p>Normalized header dictionary as returned by :func:<code>parse_headers</code>.</p>
</div>
</td>
<td>
@@ -1410,37 +1316,14 @@ or incomplete header data.</p>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>str</code>
</td>
<td>
<div class="doc-md-description">
<p>A tuple <code>(email, name)</code> where:</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Optional">Optional</span>[str]</code>
</td>
<td>
<div class="doc-md-description">
<ul>
<li><code>email</code> is the sender email address</li>
</ul>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><span title="typing.Tuple">Tuple</span>[str, <span title="typing.Optional">Optional</span>[str]]</code>
</td>
<td>
<div class="doc-md-description">
<ul>
<li><code>name</code> is the display name, or <code>None</code> if unavailable</li>
</ul>
<p>Tuple[str, Optional[str]]:
A tuple <code>(email, name)</code> where <code>email</code> is the sender email address and <code>name</code> is the display name, or <code>None</code> if unavailable.</p>
</div>
</td>
</tr>
@@ -1448,10 +1331,21 @@ or incomplete header data.</p>
</table>
<p><span class="doc-section-title">Examples:</span></p>
<p><code>"John Doe &lt;john@example.com&gt;"</code><code>("john@example.com", "John Doe")</code>
<code>"john@example.com"</code><code>("john@example.com", None)</code></p>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This function parses the ``From`` header and attempts to extract sender email address and optional human-readable display name
</code></pre></div></td></tr></table></div>
</details>
<details class="example" open>
<summary>Example</summary>
<p>Typical values:</p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><code>``&quot;John Doe &lt;john@example.com&gt;&quot;`` -&gt; ``(&quot;john@example.com&quot;, &quot;John Doe&quot;)``
``&quot;john@example.com&quot;`` -&gt; ``(&quot;john@example.com&quot;, None)``
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1459,20 +1353,17 @@ or incomplete header data.</p>
<div class="doc doc-object doc-function">
<h3 id="mail_intake.parsers.headers.parse_headers" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">parse_headers</span>
<h4 id="mail_intake.parsers.headers.parse_headers" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">parse_headers</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">parse_headers</span><span class="p">(</span><span class="n">raw_headers</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">parse_headers</span><span class="p">(</span><span class="n">raw_headers</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Convert a list of Gmail-style headers into a normalized dict.</p>
<p>Provider payloads (such as Gmail) typically represent headers as a list
of name/value mappings. This function normalizes them into a
case-insensitive dictionary keyed by lowercase header names.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1493,8 +1384,7 @@ case-insensitive dictionary keyed by lowercase header names.</p>
</td>
<td>
<div class="doc-md-description">
<p>List of header dictionaries, each containing
<code>name</code> and <code>value</code> keys.</p>
<p>List of header dictionaries, each containing <code>name</code> and <code>value</code> keys.</p>
</div>
</td>
<td>
@@ -1520,7 +1410,8 @@ case-insensitive dictionary keyed by lowercase header names.</p>
</td>
<td>
<div class="doc-md-description">
<p>Dictionary mapping lowercase header names to stripped values.</p>
<p>Dict[str, str]:
Dictionary mapping lowercase header names to stripped values.</p>
</div>
</td>
</tr>
@@ -1528,18 +1419,40 @@ case-insensitive dictionary keyed by lowercase header names.</p>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span></pre></div></td><td class="code"><div><pre><span></span><code>- Provider payloads (such as Gmail) typically represent headers as a list of name/value mappings
- This function normalizes them into a case-insensitive dictionary keyed by lowercase header names
</code></pre></div></td></tr></table></div>
</details>
<details class="example" open>
<summary>Example</summary>
<p>Input:
<p>Typical usage:</p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span></pre></div></td><td class="code"><div><pre><span></span><code>Input:
[
{"name": "From", "value": "John Doe <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#111;&#104;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">&#106;&#111;&#104;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;</a>"},
{"name": "Subject", "value": "Re: Interview Update"},
]</p>
<p>Output:
{&quot;name&quot;: &quot;From&quot;, &quot;value&quot;: &quot;John Doe &lt;john@example.com&gt;&quot;},
{&quot;name&quot;: &quot;Subject&quot;, &quot;value&quot;: &quot;Re: Interview Update&quot;},
]
Output:
{
"from": "John Doe <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#111;&#104;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">&#106;&#111;&#104;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;</a>",
"subject": "Re: Interview Update",
}</p>
&quot;from&quot;: &quot;John Doe &lt;john@example.com&gt;&quot;,
&quot;subject&quot;: &quot;Re: Interview Update&quot;,
}
</code></pre></div></td></tr></table></div>
</details>
</div>
@@ -1569,6 +1482,8 @@ case-insensitive dictionary keyed by lowercase header names.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1606,7 +1521,7 @@ case-insensitive dictionary keyed by lowercase header names.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because it is too large Load Diff

View File

@@ -86,7 +86,9 @@
<header class="md-header" data-md-component="header">
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="mail_intake" class="md-header__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -151,12 +153,19 @@
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
@@ -182,156 +191,6 @@
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../ingestion/" class="md-tabs__link">
Core API
</a>
</li>
<li class="md-tabs__item">
<a href="../../models/" class="md-tabs__link">
Domain Models
</a>
</li>
<li class="md-tabs__item">
<a href="../../adapters/" class="md-tabs__link">
Provider Adapters
</a>
</li>
<li class="md-tabs__item">
<a href="../../auth/" class="md-tabs__link">
Authentication & Storage
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../" class="md-tabs__link">
Normalization & Parsing
</a>
</li>
<li class="md-tabs__item">
<a href="../../config/" class="md-tabs__link">
Configuration & Errors
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
@@ -345,10 +204,8 @@
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="mail_intake" class="md-nav__button md-logo" aria-label="mail_intake" data-md-component="logo">
@@ -391,13 +248,23 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -406,8 +273,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_2" >
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../ingestion/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -416,8 +284,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2">
@@ -427,27 +301,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Ingestion
</span>
</a>
</li>
@@ -487,13 +340,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -502,8 +367,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../models/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -512,8 +378,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
@@ -523,27 +395,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../models/" class="md-nav__link">
<span class="md-ellipsis">
Models
</span>
</a>
</li>
@@ -606,13 +457,25 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -621,8 +484,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../adapters/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -631,8 +495,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
@@ -642,27 +512,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../adapters/" class="md-nav__link">
<span class="md-ellipsis">
Adapters
</span>
</a>
</li>
@@ -725,13 +574,33 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -740,8 +609,9 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<div class="md-nav__link md-nav__container">
<a href="../../auth/" class="md-nav__link ">
<span class="md-ellipsis">
@@ -750,8 +620,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
@@ -761,27 +637,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../auth/" class="md-nav__link">
<span class="md-ellipsis">
Auth
</span>
</a>
</li>
@@ -937,6 +792,18 @@
@@ -944,7 +811,6 @@
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
@@ -954,8 +820,9 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
@@ -964,8 +831,14 @@
</span>
<span class="md-nav__icon md-icon"></span>
</label>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
@@ -975,27 +848,6 @@
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Parsers
</span>
</a>
</li>
@@ -1110,6 +962,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject.normalize_subject" class="md-nav__link">
<span class="md-ellipsis">
normalize_subject
@@ -1121,6 +992,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1147,13 +1023,21 @@
<li class="md-nav__item md-nav__item--nested">
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
@@ -1162,7 +1046,7 @@
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
@@ -1272,6 +1156,25 @@
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject--summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject-functions" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
</a>
<nav class="md-nav" aria-label="Functions">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mail_intake.parsers.subject.normalize_subject" class="md-nav__link">
<span class="md-ellipsis">
normalize_subject
@@ -1283,6 +1186,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@@ -1309,7 +1217,7 @@
<h2 id="mail_intake.parsers.subject" class="doc doc-heading">
<span class="doc doc-object-name doc-module-name">mail_intake.parsers.subject</span>
<code class="doc-symbol doc-symbol-heading doc-symbol-module"></code> <span class="doc doc-object-name doc-module-name">mail_intake.parsers.subject</span>
</h2>
@@ -1317,6 +1225,8 @@
<div class="doc doc-contents first">
<p>Subject line normalization utilities for Mail Intake.</p>
<hr />
<h4 id="mail_intake.parsers.subject--summary">Summary</h4>
<p>This module provides helper functions for normalizing email subject lines
to enable reliable thread-level comparison and grouping.</p>
<p>Normalization is intentionally conservative to avoid altering semantic
@@ -1332,29 +1242,22 @@ meaning while removing common reply and forward prefixes.</p>
<h3 id="mail_intake.parsers.subject-functions">Functions</h3>
<div class="doc doc-object doc-function">
<h3 id="mail_intake.parsers.subject.normalize_subject" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">normalize_subject</span>
<h4 id="mail_intake.parsers.subject.normalize_subject" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-function"></code> <span class="doc doc-object-name doc-function-name">normalize_subject</span>
</h3>
<div class="doc-signature highlight"><pre><span></span><code><span class="nf">normalize_subject</span><span class="p">(</span><span class="n">subject</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span>
</code></pre></div>
</h4>
<div class="language-python doc-signature highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nf">normalize_subject</span><span class="p">(</span><span class="n">subject</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span>
</span></code></pre></div></td></tr></table></div>
<div class="doc doc-contents ">
<p>Normalize an email subject for thread-level comparison.</p>
<p>Operations:
- Strips common prefixes such as <code>Re:</code>, <code>Fwd:</code>, and <code>FW:</code>
- Repeats prefix stripping to handle stacked prefixes
- Collapses excessive whitespace
- Preserves original casing (no lowercasing)</p>
<p>This function is intentionally conservative and avoids aggressive
transformations that could alter the semantic meaning of the subject.</p>
<p><span class="doc-section-title">Parameters:</span></p>
@@ -1390,13 +1293,13 @@ transformations that could alter the semantic meaning of the subject.</p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Name</th> <th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<td><code>str</code></td> <td>
<code>str</code>
</td>
<td>
@@ -1408,6 +1311,22 @@ transformations that could alter the semantic meaning of the subject.</p>
</tbody>
</table>
<details class="notes" open>
<summary>Notes</summary>
<p><strong>Responsibilities:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span></pre></div></td><td class="code"><div><pre><span></span><code>- Strips common prefixes such as ``Re:``, ``Fwd:``, and ``FW:``
- Repeats prefix stripping to handle stacked prefixes
- Collapses excessive whitespace
- Preserves original casing (no lowercasing)
</code></pre></div></td></tr></table></div>
<p><strong>Guarantees:</strong></p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code>- This function is intentionally conservative and avoids aggressive transformations that could alter the semantic meaning of the subject
</code></pre></div></td></tr></table></div>
</details>
</div>
</div>
@@ -1436,6 +1355,8 @@ transformations that could alter the semantic meaning of the subject.</p>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
@@ -1473,7 +1394,7 @@ transformations that could alter the semantic meaning of the subject.</p>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.tabs", "navigation.expand", "navigation.top", "navigation.instant", "content.code.copy", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.f55a23d4.min.js"></script>

File diff suppressed because one or more lines are too long

Binary file not shown.