Skip to content
Merged
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
14 changes: 12 additions & 2 deletions Doc/c-api/unicode.rst
Original file line number Diff line number Diff line change
Expand Up @@ -321,12 +321,22 @@ These APIs can be used to work with surrogates:

Check if *ch* is a low surrogate (``0xDC00 <= ch <= 0xDFFF``).

.. c:function:: Py_UCS4 Py_UNICODE_HIGH_SURROGATE(Py_UCS4 ch)

Return the high UTF-16 surrogate (``0xD800`` to ``0xDBFF``) for a Unicode
code point in the range ``[0x10000; 0x10FFFF]``.

.. c:function:: Py_UCS4 Py_UNICODE_LOW_SURROGATE(Py_UCS4 ch)

Return the low UTF-16 surrogate (``0xDC00`` to ``0xDFFF``) for a Unicode
code point in the range ``[0x10000; 0x10FFFF]``.

.. c:function:: Py_UCS4 Py_UNICODE_JOIN_SURROGATES(Py_UCS4 high, Py_UCS4 low)

Join two surrogate code points and return a single :c:type:`Py_UCS4` value.
*high* and *low* are respectively the leading and trailing surrogates in a
surrogate pair. *high* must be in the range [0xD800; 0xDBFF] and *low* must
be in the range [0xDC00; 0xDFFF].
surrogate pair. *high* must be in the range ``[0xD800; 0xDBFF]`` and *low* must
be in the range ``[0xDC00; 0xDFFF]``.


Creating and accessing Unicode strings
Expand Down
2 changes: 1 addition & 1 deletion Doc/library/email.headerregistry.rst
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ variant, :attr:`~.BaseHeader.max_count` is set to 1.
``inline`` and ``attachment`` are the only valid values in common use.


.. class:: ContentTransferEncoding
.. class:: ContentTransferEncodingHeader

Handles the :mailheader:`Content-Transfer-Encoding` header.

Expand Down
2 changes: 1 addition & 1 deletion Doc/library/http.client.rst
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ This module provides the following function:

Parse the headers from a file pointer *fp* representing a HTTP
request/response. The file has to be a :class:`~io.BufferedIOBase` reader
(i.e. not text) and must provide a valid :rfc:`2822` style header.
(i.e. not text) and must provide a valid :rfc:`5322` style header.

This function returns an instance of :class:`http.client.HTTPMessage`
that holds the header fields, but no payload
Expand Down
2 changes: 1 addition & 1 deletion Doc/library/http.server.rst
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ instantiation, of which this module provides three different variants:
variable. This instance parses and manages the headers in the HTTP
request. The :func:`~http.client.parse_headers` function from
:mod:`http.client` is used to parse the headers and it requires that the
HTTP request provide a valid :rfc:`2822` style header.
HTTP request provide a valid :rfc:`5322` style header.

.. attribute:: rfile

Expand Down
1 change: 1 addition & 0 deletions Doc/library/logging.handlers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,7 @@ timed intervals.
.. method:: getFilesToDelete()

Returns a list of filenames which should be deleted as part of rollover. These
are the absolute paths of the oldest backup log files written by the handler.

.. method:: shouldRollover(record)

Expand Down
2 changes: 1 addition & 1 deletion Doc/library/mailbox.rst
Original file line number Diff line number Diff line change
Expand Up @@ -917,7 +917,7 @@ Supported mailbox formats are Maildir, mbox, MH, Babyl, and MMDF.
copied; furthermore, any format-specific information is converted insofar as
possible if *message* is a :class:`!Message` instance. If *message* is a string,
a byte string,
or a file, it should contain an :rfc:`2822`\ -compliant message, which is read
or a file, it should contain an :rfc:`5322`\ -compliant message, which is read
and parsed. Files should be open in binary mode, but text mode files
are accepted for backward compatibility.

Expand Down
28 changes: 19 additions & 9 deletions Doc/library/sys.monitoring.rst
Original file line number Diff line number Diff line change
Expand Up @@ -216,14 +216,17 @@ by another event:

The :monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events
are controlled by the :monitoring-event:`CALL` event.
:monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be seen if the
corresponding :monitoring-event:`CALL` event is being monitored.
:monitoring-event:`C_RETURN` and :monitoring-event:`C_RAISE` events will only be
seen if the corresponding :monitoring-event:`CALL` event is being monitored.


.. _monitoring-event-global:

Other events
''''''''''''

Other events are not necessarily tied to a specific location in the
program and cannot be individually disabled.
program and cannot be individually disabled via :data:`DISABLE`.

The other events that can be monitored are:

Expand Down Expand Up @@ -289,12 +292,13 @@ in Python (see :ref:`c-api-monitoring`).

.. function:: get_local_events(tool_id: int, code: CodeType, /) -> int

Returns all the local events for *code*
Returns all the :ref:`local events <monitoring-event-local>` for *code*

.. function:: set_local_events(tool_id: int, code: CodeType, event_set: int, /) -> None

Activates all the local events for *code* which are set in *event_set*.
Raises a :exc:`ValueError` if *tool_id* is not in use.
Activates all the :ref:`local events <monitoring-event-local>` for *code*
which are set in *event_set*. Raises a :exc:`ValueError` if *tool_id* is not
in use.


Disabling events
Expand All @@ -305,15 +309,21 @@ Disabling events
A special value that can be returned from a callback function to disable
events for the current code location.

Local events can be disabled for a specific code location by returning
:data:`sys.monitoring.DISABLE` from a callback function. This does not change
which events are set, or any other code locations for the same event.
:ref:`Local events <monitoring-event-local>` can be disabled for a specific code
location by returning :data:`sys.monitoring.DISABLE` from a callback function.
This does not change which events are set, or any other code locations for the
same event.

Disabling events for specific locations is very important for high
performance monitoring. For example, a program can be run under a
debugger with no overhead if the debugger disables all monitoring
except for a few breakpoints.

If :data:`DISABLE` is returned by a callback for a
:ref:`global event <monitoring-event-global>`, :exc:`ValueError` will be raised
by the interpreter in a non-specific location (that is, no traceback will be
provided).

.. function:: restart_events() -> None

Enable all the events that were disabled by :data:`sys.monitoring.DISABLE`
Expand Down
5 changes: 3 additions & 2 deletions Doc/library/time.rst
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ Functions
calculations when the day of the week and the year are specified.

Here is an example, a format for dates compatible with that specified in the
:rfc:`2822` Internet email standard. [1]_ ::
:rfc:`5322` Internet email standard. [1]_ ::

>>> from time import gmtime, strftime
>>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
Expand Down Expand Up @@ -1066,4 +1066,5 @@ Timezone Constants
strict reading of the original 1982 :rfc:`822` standard calls for a two-digit
year (``%y`` rather than ``%Y``), but practice moved to 4-digit years long before the
year 2000. After that, :rfc:`822` became obsolete and the 4-digit year has
been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`.
been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`,
with :rfc:`5322` continuing this requirement.
2 changes: 1 addition & 1 deletion Doc/tutorial/stdlib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ sophisticated and robust capabilities of its larger packages. For example:
names, no direct knowledge or handling of XML is needed.

* The :mod:`email` package is a library for managing email messages, including
MIME and other :rfc:`2822`-based message documents. Unlike :mod:`smtplib` and
MIME and other :rfc:`5322`-based message documents. Unlike :mod:`smtplib` and
:mod:`poplib` which actually send and receive messages, the email package has
a complete toolset for building or decoding complex message structures
(including attachments) and for implementing internet encoding and header
Expand Down
3 changes: 3 additions & 0 deletions Lib/_colorize.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ class Argparse(ThemeSection):
label: str = ANSIColors.BOLD_YELLOW
action: str = ANSIColors.BOLD_GREEN
reset: str = ANSIColors.RESET
error: str = ANSIColors.BOLD_MAGENTA
warning: str = ANSIColors.BOLD_YELLOW
message: str = ANSIColors.MAGENTA


@dataclass(frozen=True, kw_only=True)
Expand Down
22 changes: 19 additions & 3 deletions Lib/argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -2749,6 +2749,14 @@ def _print_message(self, message, file=None):
except (AttributeError, OSError):
pass

def _get_theme(self, file=None):
from _colorize import can_colorize, get_theme

if self.color and can_colorize(file=file):
return get_theme(force_color=True).argparse
else:
return get_theme(force_no_color=True).argparse

# ===============
# Exiting methods
# ===============
Expand All @@ -2768,13 +2776,21 @@ def error(self, message):
should either exit or raise an exception.
"""
self.print_usage(_sys.stderr)
theme = self._get_theme(file=_sys.stderr)
fmt = _('%(prog)s: error: %(message)s\n')
fmt = fmt.replace('error: %(message)s',
f'{theme.error}error:{theme.reset} {theme.message}%(message)s{theme.reset}')

args = {'prog': self.prog, 'message': message}
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
self.exit(2, fmt % args)

def _warning(self, message):
theme = self._get_theme(file=_sys.stderr)
fmt = _('%(prog)s: warning: %(message)s\n')
fmt = fmt.replace('warning: %(message)s',
f'{theme.warning}warning:{theme.reset} {theme.message}%(message)s{theme.reset}')
args = {'prog': self.prog, 'message': message}
self._print_message(_('%(prog)s: warning: %(message)s\n') % args, _sys.stderr)

self._print_message(fmt % args, _sys.stderr)

def __getattr__(name):
if name == "__version__":
Expand Down
13 changes: 8 additions & 5 deletions Lib/email/_parseaddr.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,9 @@ def _parsedate_tz(data):
return None
# Check for a yy specified in two-digit format, then convert it to the
# appropriate four-digit format, according to the POSIX standard. RFC 822
# calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822)
# mandates a 4-digit yy. For more information, see the documentation for
# calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822) already
# mandated a 4-digit yy, and RFC 5322 (which obsoletes RFC 2822) continues
# this requirement. For more information, see the documentation for
# the time module.
if yy < 100:
# The year is between 1969 and 1999 (inclusive).
Expand Down Expand Up @@ -233,9 +234,11 @@ def __init__(self, field):
self.CR = '\r\n'
self.FWS = self.LWS + self.CR
self.atomends = self.specials + self.LWS + self.CR
# Note that RFC 2822 now specifies '.' as obs-phrase, meaning that it
# is obsolete syntax. RFC 2822 requires that we recognize obsolete
# syntax, so allow dots in phrases.
# Note that RFC 2822 section 4.1 introduced '.' as obs-phrase to handle
# existing practice (periods in display names), even though it was not
# allowed in RFC 822. RFC 5322 section 4.1 (which obsoletes RFC 2822)
# continues this requirement. We must recognize obsolete syntax, so
# allow dots in phrases.
self.phraseends = self.atomends.replace('.', '')
self.field = field
self.commentlist = []
Expand Down
2 changes: 1 addition & 1 deletion Lib/email/_policybase.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ def _fold(self, name, value, sanitize):
h = value
if h is not None:
# The Header class interprets a value of None for maxlinelen as the
# default value of 78, as recommended by RFC 2822.
# default value of 78, as recommended by RFC 5322 section 2.1.1.
maxlinelen = 0
if self.max_line_length is not None:
maxlinelen = self.max_line_length
Expand Down
4 changes: 2 additions & 2 deletions Lib/email/feedparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
NLCRE_bol = re.compile(r'(\r\n|\r|\n)')
NLCRE_eol = re.compile(r'(\r\n|\r|\n)\z')
NLCRE_crack = re.compile(r'(\r\n|\r|\n)')
# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character
# RFC 5322 section 3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character
# except controls, SP, and ":".
headerRE = re.compile(r'^(From |[\041-\071\073-\176]*:|[\t ])')
EMPTYSTRING = ''
Expand Down Expand Up @@ -294,7 +294,7 @@ def _parsegen(self):
return
if self._cur.get_content_maintype() == 'message':
# The message claims to be a message/* type, then what follows is
# another RFC 2822 message.
# another RFC 5322 message.
for retval in self._parsegen():
if retval is NeedMoreData:
yield NeedMoreData
Expand Down
2 changes: 1 addition & 1 deletion Lib/email/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(self, outfp, mangle_from_=None, maxheaderlen=None, *,
expanded to 8 spaces) than maxheaderlen, the header will split as
defined in the Header class. Set maxheaderlen to zero to disable
header wrapping. The default is 78, as recommended (but not required)
by RFC 2822.
by RFC 5322 section 2.1.1.

The policy keyword specifies a policy object that controls a number of
aspects of the generator's operation. If no policy is specified,
Expand Down
2 changes: 1 addition & 1 deletion Lib/email/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ def _decode_uu(encoded):
class Message:
"""Basic message object.

A message object is defined as something that has a bunch of RFC 2822
A message object is defined as something that has a bunch of RFC 5322
headers and a payload. It may optionally have an envelope header
(a.k.a. Unix-From or From_ header). If the message is a container (i.e. a
multipart or a message/rfc822), then the payload is a list of Message
Expand Down
10 changes: 5 additions & 5 deletions Lib/email/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Author: Barry Warsaw, Thomas Wouters, Anthony Baxter
# Contact: [email protected]

"""A parser of RFC 2822 and MIME email messages."""
"""A parser of RFC 5322 and MIME email messages."""

__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser',
'FeedParser', 'BytesFeedParser']
Expand All @@ -15,13 +15,13 @@

class Parser:
def __init__(self, _class=None, *, policy=compat32):
"""Parser of RFC 2822 and MIME email messages.
"""Parser of RFC 5322 and MIME email messages.

Creates an in-memory object tree representing the email message, which
can then be manipulated and turned over to a Generator to return the
textual representation of the message.

The string must be formatted as a block of RFC 2822 headers and header
The string must be formatted as a block of RFC 5322 headers and header
continuation lines, optionally preceded by a 'Unix-from' header. The
header block is terminated either by the end of the string or by a
blank line.
Expand Down Expand Up @@ -75,13 +75,13 @@ def parsestr(self, text, headersonly=True):
class BytesParser:

def __init__(self, *args, **kw):
"""Parser of binary RFC 2822 and MIME email messages.
"""Parser of binary RFC 5322 and MIME email messages.

Creates an in-memory object tree representing the email message, which
can then be manipulated and turned over to a Generator to return the
textual representation of the message.

The input must be formatted as a block of RFC 2822 headers and header
The input must be formatted as a block of RFC 5322 headers and header
continuation lines, optionally preceded by a 'Unix-from' header. The
header block is terminated either by the end of the input or by a
blank line.
Expand Down
4 changes: 2 additions & 2 deletions Lib/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ def _read_headers(fp, max_headers):

def _parse_header_lines(header_lines, _class=HTTPMessage):
"""
Parses only RFC2822 headers from header lines.
Parses only RFC 5322 headers from header lines.

email Parser wants to see strings rather than bytes.
But a TextIOWrapper around self.rfile would buffer too many bytes
Expand All @@ -244,7 +244,7 @@ def _parse_header_lines(header_lines, _class=HTTPMessage):
return email.parser.Parser(_class=_class).parsestr(hstring)

def parse_headers(fp, _class=HTTPMessage, *, _max_headers=None):
"""Parses only RFC2822 headers from a file pointer."""
"""Parses only RFC 5322 headers from a file pointer."""

headers = _read_headers(fp, _max_headers)
return _parse_header_lines(headers, _class)
Expand Down
6 changes: 3 additions & 3 deletions Lib/smtplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -917,7 +917,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None,
The arguments are as for sendmail, except that msg is an
email.message.Message object. If from_addr is None or to_addrs is
None, these arguments are taken from the headers of the Message as
described in RFC 2822 (a ValueError is raised if there is more than
described in RFC 5322 (a ValueError is raised if there is more than
one set of 'Resent-' headers). Regardless of the values of from_addr and
to_addr, any Bcc field (or Resent-Bcc field, when the Message is a
resent) of the Message object won't be transmitted. The Message
Expand All @@ -931,7 +931,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None,
policy.

"""
# 'Resent-Date' is a mandatory field if the Message is resent (RFC 2822
# 'Resent-Date' is a mandatory field if the Message is resent (RFC 5322
# Section 3.6.6). In such a case, we use the 'Resent-*' fields. However,
# if there is more than one 'Resent-' block there's no way to
# unambiguously determine which one is the most recent in all cases,
Expand All @@ -950,7 +950,7 @@ def send_message(self, msg, from_addr=None, to_addrs=None,
else:
raise ValueError("message has more than one 'Resent-' header block")
if from_addr is None:
# Prefer the sender field per RFC 2822:3.6.2.
# Prefer the sender field per RFC 5322 section 3.6.2.
from_addr = (msg[header_prefix + 'Sender']
if (header_prefix + 'Sender') in msg
else msg[header_prefix + 'From'])
Expand Down
Loading
Loading