Fixes
- BIMI: stop masking
MultipleBIMIRecords,UnrelatedTXTRecordFoundAtBIMI,
andBIMIRecordInWrongLocationbehindBIMIRecordNotFound. The
apex-fallback handler also had a missingraise, so a record placed at
the apex (instead of the_bimiselector) was silently treated as
"not found" (#246). - BIMI: extend the grammar to accept the canonical
lps=value
format — a comma-separated list of local-part selectors per
draft-bimi-14 § 4.3.14.
The grammar previously only accepted values matching one of
bimi1, an HTTPS URL,personal, orbrand, so the canonical
comma-separated form raisedBIMISyntaxError. Also fix the parser
to write the parsed selector list back to the tag value (#246). - DMARC: stop masking
DMARCRecordInWrongLocationbehind
DMARCRecordNotFoundin_query_dmarc_record's apex-fallback path (#248). - SMTP: the cache-write paths in
test_tlsandtest_starttlsused
if cache:, which is falsy for an emptyExpiringDict. The first
cache entry was silently dropped, so subsequent SMTP probes kept
hitting the network (#244). - SPF:
parse_spf_record's redirect handler usedexcept DNSException as error:, shadowing the function-levelerroraccumulator. Python
deletes the name on except-block exit, so the trailingif error:
raisedUnboundLocalError(#247).
Changes
- Test suite reorganized from a single
tests.pyinto per-module
files undertests/. Network-dependent tests are paired with
fully-mocked counterparts; CI runs the mocked branch, local runs
the real-network branch. - Project test coverage raised from 67% to 96%; every module is now
at ≥ 90%. Coverage and test results are uploaded to Codecov on
each CI run.