Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions compliance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# RFC 5322 Compliance Map

This document maps each ABNF production exercised by the parser to the parser method(s) and explicit test methods in `test_parser.py`.

| ABNF production | RFC section | Parser method(s) | Test cases exercising it | Status |
| --- | --- | --- | --- | --- |
| `address` | RFC 5322 3.4 | `AddressParser.parse()` / `_parse_any_address()` | `Test34AddressMailboxGroup.test_addr_spec_only_mailbox`<br>`Test34AddressMailboxGroup.test_name_addr_with_display_name`<br>`Test34AddressMailboxGroup.test_group_with_two_members`<br>`Test44Obsolete.test_obs_angle_addr_with_route` | Covered |
| `mailbox` | RFC 5322 3.4 | `AddressParser.parse()` / `_parse_mailbox()` | `Test34AddressMailboxGroup.test_addr_spec_only_mailbox`<br>`Test34AddressMailboxGroup.test_name_addr_with_display_name`<br>`Test34AddressMailboxGroup.test_angle_addr_without_display_name`<br>`Test34AddressMailboxGroup.test_mailbox_list_two_items`<br>`Test44Obsolete.test_obs_mailbox_list_with_leading_commas`<br>`Test44Obsolete.test_obs_mailbox_list_with_trailing_commas` | Covered |
| `name-addr` | RFC 5322 3.4 | `_parse_name_addr()` | `Test34AddressMailboxGroup.test_name_addr_with_display_name`<br>`Test34AddressMailboxGroup.test_angle_addr_without_display_name`<br>`Test34AddressMailboxGroup.test_mailbox_with_leading_cfws`<br>`Test34AddressMailboxGroup.test_mailbox_with_trailing_cfws`<br>`Test44Obsolete.test_obs_angle_addr_with_route`<br>`Test44Obsolete.test_obs_angle_addr_without_display_name` | Covered |
| `angle-addr` | RFC 5322 3.4 | `_parse_name_addr()` | `Test34AddressMailboxGroup.test_angle_addr_without_display_name`<br>`Test44Obsolete.test_obs_angle_addr_with_route`<br>`Test44Obsolete.test_obs_angle_addr_without_display_name` | Covered |
| `addr-spec` | RFC 5322 3.4.1 | `_parse_addr_spec()` / `_parse_addr_spec_body()` | `Test34AddressMailboxGroup.test_addr_spec_only_mailbox`<br>`Test341AddrSpecDomainLiteral.test_simple_dot_atom_addr_spec`<br>`Test341AddrSpecDomainLiteral.test_quoted_local_part_addr_spec`<br>`Test341AddrSpecDomainLiteral.test_ipv4_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_ipv6_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_plain_text` | Covered |
| `local-part` | RFC 5322 3.4.1 | `_parse_local_part()` | `Test341AddrSpecDomainLiteral.test_simple_dot_atom_addr_spec`<br>`Test341AddrSpecDomainLiteral.test_quoted_local_part_addr_spec`<br>`Test324QuotedString.test_quoted_string_empty_local_part`<br>`Test324QuotedString.test_quoted_string_with_spaces`<br>`Test44Obsolete.test_obs_local_part_with_quoted_word`<br>`Test44Obsolete.test_obs_local_part_with_cfws` | Covered |
| `domain` | RFC 5322 3.4.1 | `_parse_domain()` | `Test341AddrSpecDomainLiteral.test_simple_dot_atom_addr_spec`<br>`Test341AddrSpecDomainLiteral.test_ipv4_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_ipv6_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_plain_text`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_cfws`<br>`Test44Obsolete.test_obs_domain_with_cfws` | Covered |
| `dot-atom` | RFC 5322 3.2.4, used in RFC 5322 3.4.1 | `_parse_dot_atom()` | `Test325MiscTokens.test_atom_local_part_with_plus`<br>`Test325MiscTokens.test_dot_atom_domain_with_multiple_labels`<br>`Test341AddrSpecDomainLiteral.test_simple_dot_atom_addr_spec`<br>`Test34AddressMailboxGroup.test_addr_spec_only_mailbox`<br>`Test44Obsolete.test_obs_local_part_with_cfws`<br>`Test44Obsolete.test_obs_domain_with_cfws` | Covered |
| `quoted-string` | RFC 5322 3.2.5 | `_parse_quoted_string()` | `Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_double_quote`<br>`Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_backslash`<br>`Test324QuotedString.test_quoted_string_empty_local_part`<br>`Test324QuotedString.test_quoted_string_with_spaces`<br>`Test324QuotedString.test_quoted_string_with_escaped_quote`<br>`Test324QuotedString.test_quoted_string_with_escaped_backslash`<br>`Test324QuotedString.test_quoted_string_with_folded_whitespace`<br>`Test324QuotedString.test_quoted_string_with_escaped_comma`<br>`Test324QuotedString.test_quoted_string_as_display_name`<br>`Test324QuotedString.test_quoted_string_with_punctuation_chars`<br>`Test44Obsolete.test_obs_local_part_with_quoted_word` | Covered |
| `CFWS` | RFC 5322 3.2.2-3.2.3 | `_skip_cfws()` / `_parse_comment()` / `_consume_fws()` | `Test322FWS.test_fws_single_spaces_in_display_name`<br>`Test322FWS.test_fws_tab_in_display_name`<br>`Test322FWS.test_fws_crlf_in_display_name`<br>`Test322FWS.test_fws_in_quoted_string_local_part`<br>`Test322FWS.test_fws_in_address_list`<br>`Test323CFWSComments.test_leading_and_trailing_comments_around_addr_spec`<br>`Test323CFWSComments.test_comments_between_display_name_words`<br>`Test323CFWSComments.test_nested_comment_text_collected`<br>`Test323CFWSComments.test_comments_before_angle_addr`<br>`Test323CFWSComments.test_comments_around_at_sign`<br>`Test323CFWSComments.test_comments_on_domain_side`<br>`Test323CFWSComments.test_comments_in_group_name`<br>`Test323CFWSComments.test_comments_in_address_list_items`<br>`Test34AddressMailboxGroup.test_mailbox_with_leading_cfws`<br>`Test34AddressMailboxGroup.test_mailbox_with_trailing_cfws`<br>`Test34AddressMailboxGroup.test_address_list_with_comment_wrapped_items`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_cfws`<br>`Test44Obsolete.test_obs_group_list_with_comments` | Covered |
| `FWS` | RFC 5322 3.2.2 | `_starts_fws()` / `_consume_fws()` | `Test322FWS.test_fws_single_spaces_in_display_name`<br>`Test322FWS.test_fws_tab_in_display_name`<br>`Test322FWS.test_fws_crlf_in_display_name`<br>`Test322FWS.test_fws_in_quoted_string_local_part`<br>`Test322FWS.test_fws_in_address_list` | Covered |
| `comment` | RFC 5322 3.2.3 | `_parse_comment()` | `Test321QuotedPair.test_quoted_pair_in_comment`<br>`Test322FWS.test_fws_in_address_list`<br>`Test323CFWSComments.test_leading_and_trailing_comments_around_addr_spec`<br>`Test323CFWSComments.test_comments_between_display_name_words`<br>`Test323CFWSComments.test_nested_comment_text_collected`<br>`Test323CFWSComments.test_comments_before_angle_addr`<br>`Test323CFWSComments.test_comments_around_at_sign`<br>`Test323CFWSComments.test_comments_on_domain_side`<br>`Test323CFWSComments.test_comments_in_group_name`<br>`Test323CFWSComments.test_comments_in_address_list_items`<br>`Test44Obsolete.test_obs_group_list_with_comments` | Covered |
| `quoted-pair` | RFC 5322 3.2.1 | `_parse_quoted_pair()` | `Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_double_quote`<br>`Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_backslash`<br>`Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_at_sign`<br>`Test321QuotedPair.test_quoted_pair_in_quoted_string_escaped_space`<br>`Test321QuotedPair.test_quoted_pair_in_comment`<br>`Test324QuotedString.test_quoted_string_with_escaped_quote`<br>`Test324QuotedString.test_quoted_string_with_escaped_backslash`<br>`Test324QuotedString.test_quoted_string_with_escaped_comma` | Covered |
| `dtext` | RFC 5322 3.4.1 | `_parse_domain_literal()` / `_is_dtext()` | `Test341AddrSpecDomainLiteral.test_ipv4_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_ipv6_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_plain_text`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_dtext_punctuation`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_cfws` | Covered |
| `domain-literal` | RFC 5322 3.4.1 | `_parse_domain_literal()` | `Test341AddrSpecDomainLiteral.test_ipv4_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_ipv6_domain_literal`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_plain_text`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_dtext_punctuation`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_cfws`<br>`TestEdgeCases.test_empty_domain_literal` | Covered |
| `atom` | RFC 5322 3.2.4 | `_parse_atom_text()` / `_parse_atom_text_with_cfws()` | `Test325MiscTokens.test_atom_local_part_with_plus`<br>`Test325MiscTokens.test_dot_atom_domain_with_multiple_labels`<br>`Test325MiscTokens.test_phrase_with_atoms_and_quoted_word`<br>`Test341AddrSpecDomainLiteral.test_domain_literal_with_plain_text`<br>`Test323CFWSComments.test_comments_between_display_name_words` | Covered |
| `word` | RFC 5322 3.2.4-3.2.5 | `_parse_word_in_obs()` / `_parse_quoted_string()` / `_parse_atom_text_with_cfws()` | `Test324QuotedString.test_quoted_string_as_display_name`<br>`Test325MiscTokens.test_phrase_with_atoms_and_quoted_word`<br>`Test44Obsolete.test_obs_local_part_with_quoted_word` | Covered |
| `phrase` | RFC 5322 3.2.4 | `_parse_phrase()` | `Test323CFWSComments.test_comments_between_display_name_words`<br>`Test323CFWSComments.test_comments_in_group_name`<br>`Test324QuotedString.test_quoted_string_as_display_name`<br>`Test325MiscTokens.test_phrase_with_atoms_and_quoted_word`<br>`Test34AddressMailboxGroup.test_name_addr_with_display_name`<br>`Test34AddressMailboxGroup.test_address_list_two_name_addrs` | Covered |
| `address-list` | RFC 5322 3.4 | `AddressParser.parse_address_list()` / `_parse_address_list(kind="address")` | `Test322FWS.test_fws_in_address_list`<br>`Test323CFWSComments.test_comments_in_address_list_items`<br>`Test34AddressMailboxGroup.test_address_list_two_name_addrs`<br>`Test34AddressMailboxGroup.test_group_in_address_list`<br>`Test34AddressMailboxGroup.test_address_list_with_comment_wrapped_items`<br>`Test44Obsolete.test_obs_address_list_with_route_and_mailbox`<br>`Test44Obsolete.test_obs_group_list_with_comments`<br>`Test44Obsolete.test_obs_mailbox_list_with_leading_commas` | Covered |
| `mailbox-list` | RFC 5322 3.4 | `AddressParser.parse_mailbox_list()` / `_parse_address_list(kind="mailbox")` | `Test34AddressMailboxGroup.test_mailbox_list_two_items`<br>`Test341AddrSpecDomainLiteral.test_mailbox_list_with_domain_literals`<br>`Test44Obsolete.test_obs_mailbox_list_with_leading_commas`<br>`Test44Obsolete.test_obs_mailbox_list_with_trailing_commas` | Covered |
| `group` | RFC 5322 3.4 | `_parse_group()` | `Test34AddressMailboxGroup.test_group_with_two_members`<br>`Test34AddressMailboxGroup.test_empty_group`<br>`Test34AddressMailboxGroup.test_group_with_comment_only_members`<br>`Test34AddressMailboxGroup.test_group_in_address_list`<br>`Test44Obsolete.test_obs_group_list_only_commas`<br>`Test44Obsolete.test_obs_group_list_with_comments` | Covered |
| `group-list` | RFC 5322 3.4 | `_parse_group_list()` | `Test34AddressMailboxGroup.test_group_with_two_members`<br>`Test34AddressMailboxGroup.test_group_in_address_list`<br>`Test44Obsolete.test_obs_group_list_only_commas`<br>`Test44Obsolete.test_obs_group_list_with_comments` | Covered |
| `obs-local-part` | RFC 5322 4.4 | `_parse_obs_local_part()` | `Test44Obsolete.test_obs_local_part_with_quoted_word`<br>`Test44Obsolete.test_obs_local_part_with_cfws`<br>`TestInvalidRejection.test_reject_obsolete_local_part_in_strict_mode` | Covered |
| `obs-domain` | RFC 5322 4.4 | `_parse_obs_domain()` | `Test44Obsolete.test_obs_domain_with_cfws`<br>`TestInvalidRejection.test_reject_obsolete_domain_in_strict_mode` | Covered |
| `obs-angle-addr` | RFC 5322 4.4 | `_parse_name_addr()` / `_parse_obs_route()` | `Test44Obsolete.test_obs_angle_addr_with_route`<br>`Test44Obsolete.test_obs_angle_addr_without_display_name`<br>`TestInvalidRejection.test_reject_obsolete_route_in_strict_mode` | Covered |
| `obs-route` | RFC 5322 4.4 | `_parse_obs_route()` | `Test44Obsolete.test_obs_angle_addr_with_route`<br>`Test44Obsolete.test_obs_angle_addr_without_display_name`<br>`TestInvalidRejection.test_reject_obsolete_route_in_strict_mode` | Covered |
| `obs-group-list` | RFC 5322 4.4 | `_parse_group_list()` in permissive mode | `Test44Obsolete.test_obs_group_list_only_commas`<br>`Test44Obsolete.test_obs_group_list_with_comments`<br>`TestInvalidRejection.test_reject_group_missing_semicolon` | Covered |
| `obs-mbox-list` | RFC 5322 4.4 | `_parse_address_list(kind="mailbox")` in permissive mode | `Test44Obsolete.test_obs_mailbox_list_with_leading_commas`<br>`Test44Obsolete.test_obs_mailbox_list_with_trailing_commas` | Covered |
| `obs-addr-list` | RFC 5322 4.4 | `_parse_address_list(kind="address")` in permissive mode | `Test44Obsolete.test_obs_address_list_with_route_and_mailbox`<br>`Test44Obsolete.test_obs_group_list_with_comments` | Covered |

## Notes

- `AddressParser(strict=True)` rejects obsolete productions and malformed list members.
- `AddressParser(strict=False)` accepts the RFC 5322 section 4.4 obsolete mailbox, route, and list forms.
- `RFC5322Address.comments` captures collected CFWS/comment text for the cases above.
- `RFC5322Address.source` preserves the original parsed slice for top-level address parses.
Loading
Loading