PEP 598: Adjust terminology and other updates (#1109)
- use baseline feature release and incremental feature release rather than major/minor feature release - introduce a new "feature_complete" flag on sys.version_info to allow the branch state to be inspected at runtime - impose a runtime feature detection requirement on all features added in incremental feature releases
This commit is contained in:
parent
efc5a1d88f
commit
a721d2c854
305
pep-0598.rst
305
pep-0598.rst
|
@ -1,5 +1,5 @@
|
||||||
PEP: 598
|
PEP: 598
|
||||||
Title: Introducing minor feature releases
|
Title: Introducing incremental feature releases
|
||||||
Version: $Revision$
|
Version: $Revision$
|
||||||
Last-Modified: $Date$
|
Last-Modified: $Date$
|
||||||
Author: Nick Coghlan <ncoghlan@gmail.com>
|
Author: Nick Coghlan <ncoghlan@gmail.com>
|
||||||
|
@ -31,10 +31,16 @@ releases.
|
||||||
This PEP presents a competing proposal to instead *slow down* the frequency of
|
This PEP presents a competing proposal to instead *slow down* the frequency of
|
||||||
parallel installable major feature releases that change the filesystem layout
|
parallel installable major feature releases that change the filesystem layout
|
||||||
and CPython ABI to a consistent 24 month cycle, but to compensate for this by
|
and CPython ABI to a consistent 24 month cycle, but to compensate for this by
|
||||||
introducing the notion of build compatible minor feature releases, and then
|
introducing the notion of build compatible incremental feature releases, and
|
||||||
deferring the full feature freeze of a given major release series from the
|
then deferring the full feature freeze of a given major release series from the
|
||||||
initial X.Y.0 release to an X.Y.Z minor feature release that occurs ~12 months
|
initial baseline X.Y.0 release to a subsequent X.Y.Z feature complete release
|
||||||
after that initial release.
|
that occurs ~12 months after the initial baseline feature release.
|
||||||
|
|
||||||
|
A new ``feature_complete`` attribute on the ``sys.version_info`` structure will
|
||||||
|
provide a programmatic indicator as to whether or not a release series remains
|
||||||
|
open to further incremental feature releases. Alternate implementations of
|
||||||
|
Python would also be free to clear this flag to indicate that their support for
|
||||||
|
their nominal Python version may still be a work in progress.
|
||||||
|
|
||||||
The existing cycle and the new cycle would be synchronised on their feature
|
The existing cycle and the new cycle would be synchronised on their feature
|
||||||
freeze release dates, so the full Python 3.9.x feature freeze would occur in
|
freeze release dates, so the full Python 3.9.x feature freeze would occur in
|
||||||
|
@ -61,11 +67,11 @@ release timeline would look like:
|
||||||
* 2020-08: 3.9.0bX (final beta release that locks ABI compatibility)
|
* 2020-08: 3.9.0bX (final beta release that locks ABI compatibility)
|
||||||
* 2020-09: 3.9.0rc1
|
* 2020-09: 3.9.0rc1
|
||||||
* ... additional release candidates as determined by the release manager
|
* ... additional release candidates as determined by the release manager
|
||||||
* 2020-10: 3.9.0
|
* 2020-10: 3.9.0 (BFR - baseline feature release)
|
||||||
* 2021-01: 3.9.1
|
* 2021-01: 3.9.1 (IFR - incremental feature release)
|
||||||
* 2021-04: 3.9.2
|
* 2021-04: 3.9.2 (IFR)
|
||||||
* 2021-07: 3.9.3
|
* 2021-07: 3.9.3 (IFR)
|
||||||
* 2021-10: 3.9.4 (final minor feature release)
|
* 2021-10: 3.9.4 (feature complete release)
|
||||||
* 2022-01: 3.9.5
|
* 2022-01: 3.9.5
|
||||||
* 2022-04: 3.9.6
|
* 2022-04: 3.9.6
|
||||||
* 2022-07: 3.9.7
|
* 2022-07: 3.9.7
|
||||||
|
@ -73,8 +79,13 @@ release timeline would look like:
|
||||||
* ... additional security fix only releases as needed
|
* ... additional security fix only releases as needed
|
||||||
* 2025-10: 3.9.x branch closed
|
* 2025-10: 3.9.x branch closed
|
||||||
|
|
||||||
|
Feature complete release numbers would typically be written without any
|
||||||
|
qualifier (as they are today), while the baseline and incremental feature
|
||||||
|
releases would be expected to have a qualifier appended indicating that they
|
||||||
|
aren't a traditional CPython release (``3.9.0 (BFR)``, ``3.9.1 (IFR)``, etc).
|
||||||
|
|
||||||
The Python 3.10 release series would start being published the month after the
|
The Python 3.10 release series would start being published the month after the
|
||||||
final Python 3.9 minor feature release, in parallel with the final 12 months
|
first Python 3.9 feature complete release, in parallel with the final 12 months
|
||||||
of routine Python 3.9 maintenance releases:
|
of routine Python 3.9 maintenance releases:
|
||||||
|
|
||||||
* 2021-11: 3.10.0a1
|
* 2021-11: 3.10.0a1
|
||||||
|
@ -84,11 +95,11 @@ of routine Python 3.9 maintenance releases:
|
||||||
* 2022-08: 3.10.0bX (final beta release that locks ABI compatibility)
|
* 2022-08: 3.10.0bX (final beta release that locks ABI compatibility)
|
||||||
* 2022-09: 3.10.0rc1
|
* 2022-09: 3.10.0rc1
|
||||||
* ... additional release candidates as determined by the release manager
|
* ... additional release candidates as determined by the release manager
|
||||||
* 2022-10: 3.10.0
|
* 2022-10: 3.10.0 (BFR)
|
||||||
* 2023-01: 3.10.1
|
* 2023-01: 3.10.1 (IFR)
|
||||||
* 2023-04: 3.10.2
|
* 2023-04: 3.10.2 (IFR)
|
||||||
* 2023-07: 3.10.3
|
* 2023-07: 3.10.3 (IFR)
|
||||||
* 2023-10: 3.10.4 (final minor feature release)
|
* 2023-10: 3.10.4
|
||||||
* 2024-01: 3.10.5
|
* 2024-01: 3.10.5
|
||||||
* 2024-04: 3.10.6
|
* 2024-04: 3.10.6
|
||||||
* 2024-07: 3.10.7
|
* 2024-07: 3.10.7
|
||||||
|
@ -101,10 +112,10 @@ In this model, there are always two or three active branches:
|
||||||
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
||||||
* 2019-10 -> 2020-05: 3.9.0 pre-beta, 3.8.x maintenance
|
* 2019-10 -> 2020-05: 3.9.0 pre-beta, 3.8.x maintenance
|
||||||
* 2020-05 -> 2020-10: 3.10.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
* 2020-05 -> 2020-10: 3.10.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
||||||
* 2020-10 -> 2021-10: 3.10.0 pre-alpha, 3.9.x feature addition, 3.8.x maintenance
|
* 2020-10 -> 2021-10: 3.10.0 pre-alpha, 3.9.x feature releases, 3.8.x maintenance
|
||||||
* 2021-10 -> 2022-05: 3.10.0 pre-beta, 3.9.x maintenance
|
* 2021-10 -> 2022-05: 3.10.0 pre-beta, 3.9.x maintenance
|
||||||
* 2022-05 -> 2022-10: 3.11.0 pre-alpha, 3.10.0 pre-release, 3.9.x maintenance
|
* 2022-05 -> 2022-10: 3.11.0 pre-alpha, 3.10.0 pre-release, 3.9.x maintenance
|
||||||
* 2022-10 -> 2023-10: 3.11.0 pre-alpha, 3.10.x feature addition, 3.9.x maintenance
|
* 2022-10 -> 2023-10: 3.11.0 pre-alpha, 3.10.x feature releases, 3.9.x maintenance
|
||||||
* 2023-10 -> 2024-05: 3.11.0 pre-beta, 3.10.x maintenance
|
* 2023-10 -> 2024-05: 3.11.0 pre-beta, 3.10.x maintenance
|
||||||
* 2024-05 -> 2024-10: 3.12.0 pre-alpha, 3.11.0 pre-release, 3.10.x maintenance
|
* 2024-05 -> 2024-10: 3.12.0 pre-alpha, 3.11.0 pre-release, 3.10.x maintenance
|
||||||
* ... etc
|
* ... etc
|
||||||
|
@ -118,11 +129,11 @@ once I have one to add.
|
||||||
|
|
||||||
This is quite similar to the status quo, but with a more consistent cadence,
|
This is quite similar to the status quo, but with a more consistent cadence,
|
||||||
alternating between major feature release years (2020, 2022, etc) that focus
|
alternating between major feature release years (2020, 2022, etc) that focus
|
||||||
on the alpha and beta cycle for a new major feature release (while continuing
|
on the alpha and beta cycle for a new baseline feature release (while continuing
|
||||||
to publish maintenance releases for the previous major release series), and
|
to publish maintenance releases for the previous major release series), and
|
||||||
minor feature release years (2021, 2023, etc), that focus on making smaller
|
incremental feature release years (2021, 2023, etc), that focus on making
|
||||||
improvements to the current major release series (while making plans for the
|
smaller improvements to the current major release series (while making plans
|
||||||
next major release the following year).
|
for the next major release series the following year).
|
||||||
|
|
||||||
|
|
||||||
Proposal
|
Proposal
|
||||||
|
@ -131,11 +142,11 @@ Proposal
|
||||||
Excluding alpha and beta releases, CPython currently has 3 different kinds
|
Excluding alpha and beta releases, CPython currently has 3 different kinds
|
||||||
of release increment:
|
of release increment:
|
||||||
|
|
||||||
* Feature release (i.e. ``X.Y.0`` releases)
|
* Feature release (i.e. X.Y.0 releases)
|
||||||
* Maintenance release (``X.Y.Z`` releases within ~2 years of ``X.Y.0``)
|
* Maintenance release (X.Y.Z releases within ~2 years of X.Y.0)
|
||||||
* Source-only security release (subsequent ``X.Y.Z`` releases)
|
* Source-only security release (subsequent X.Y.Z releases)
|
||||||
|
|
||||||
Feature freeze takes place at the time of the ``X.Y.0b1`` release.
|
Feature freeze takes place at the time of the X.Y.0b1 release.
|
||||||
Build compatibility freeze now takes place at the time of the last beta release
|
Build compatibility freeze now takes place at the time of the last beta release
|
||||||
(providing time for projects to upload wheel archives to PyPI prior to the
|
(providing time for projects to upload wheel archives to PyPI prior to the
|
||||||
first release candidate).
|
first release candidate).
|
||||||
|
@ -149,43 +160,44 @@ This then creates the following periods in the lifecycle of a release series:
|
||||||
* End of life (no further releases of any kind)
|
* End of life (no further releases of any kind)
|
||||||
|
|
||||||
The proposal in this PEP is that the "Feature release" category be split up into
|
The proposal in this PEP is that the "Feature release" category be split up into
|
||||||
two different kinds of feature release:
|
three different kinds of feature release:
|
||||||
|
|
||||||
* Major feature release (``X.Y.0`` releases)
|
* Baseline feature release (X.Y.0 releases)
|
||||||
* Minor feature release (``X.Y.Z`` releases within ~1 year of ``X.Y.0``)
|
* Incremental feature release (any X.Y.Z releases published between a
|
||||||
* Maintenance release (``X.Y.Z`` releases within ~1-2 years of of ``X.Y.0``)
|
baseline feature release and the corresponding feature complete release)
|
||||||
|
* Feature complete release (a specific X.Y.Z release ~1 year after X.Y.0)
|
||||||
|
* Maintenance release (X.Y.Z releases within ~1 years of the feature complete release)
|
||||||
* Source-only security release (subsequent ``X.Y.Z`` releases)
|
* Source-only security release (subsequent ``X.Y.Z`` releases)
|
||||||
|
|
||||||
This would then introduce a new "Feature additions" phase in the release series
|
This would then introduce a new "Feature releases" phase in the release series
|
||||||
lifecycle:
|
lifecycle:
|
||||||
|
|
||||||
* Pre-beta (release series is the CPython development branch)
|
* Pre-beta (release series is the CPython development branch)
|
||||||
* Beta (release enters feature additions mode, ABI compatibility not yet locked)
|
* Beta (release enters feature additions mode, ABI compatibility not yet locked)
|
||||||
* Feature additions (ABI locked, API additions accepted)
|
* Feature releases (ABI locked, backwards compatible API additions accepted)
|
||||||
* Maintenance only (ABI locked, only bug fixes & docs enhancements accepted)
|
* Maintenance (ABI locked, only bug fixes & docs enhancements accepted)
|
||||||
* Security fix only (no further binary releases, only security fixes accepted)
|
* Security fix only (no further binary releases, only security fixes accepted)
|
||||||
* End of life (no further releases of any kind)
|
* End of life (no further releases of any kind)
|
||||||
|
|
||||||
The pre-release beta period would be relaxed to use the minor feature release
|
The pre-release beta period would be relaxed to use the incremental feature
|
||||||
policy for changes, rather than the stricter maintenance-only release policy.
|
release policy for changes, rather than the stricter maintenance release policy.
|
||||||
|
|
||||||
The existing "Maintenance" release series state would be renamed to
|
For governance purposes, baseline feature releases are the only releases that
|
||||||
"Maintenance only", as "Feature addition" releases are also maintenance
|
would qualify as a "feature release" in the PEP 13 sense (incremental feature
|
||||||
releases (just as maintenance releases can also be security fix releases).
|
releases wouldn't count).
|
||||||
|
|
||||||
For governance purposes, major feature releases are the only releases that
|
|
||||||
would qualify as a "feature release" in the PEP 13 sense (minor feature releases
|
|
||||||
wouldn't count).
|
|
||||||
|
|
||||||
|
|
||||||
Major feature releases
|
Baseline feature releases and major release series
|
||||||
----------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
Major feature releases are just the existing feature releases, given a new name
|
Baseline feature releases are essentially just the existing feature releases,
|
||||||
to help distinguish them from the new minor feature releases.
|
given a new name to help distinguish them from the new incremental feature
|
||||||
|
releases, and also to help indicate that unlike their predecessors, they are
|
||||||
|
no longer considered feature complete at release.
|
||||||
|
|
||||||
Major feature releases would continue to define the following language, build,
|
Baseline feature releases would continue to define a new major release series,
|
||||||
and installation compatibility constraints:
|
locking in the following language, build, and installation compatibility
|
||||||
|
constraints for the remainder of that series:
|
||||||
|
|
||||||
- Python language grammar
|
- Python language grammar
|
||||||
- ``ast`` module AST format
|
- ``ast`` module AST format
|
||||||
|
@ -196,7 +208,7 @@ and installation compatibility constraints:
|
||||||
- default package and module import directories
|
- default package and module import directories
|
||||||
- default installation filename and directories
|
- default installation filename and directories
|
||||||
|
|
||||||
Major feature releases would also continue to be the only releases where:
|
Baseline feature releases would also continue to be the only releases where:
|
||||||
|
|
||||||
- new deprecations, pending deprecations, and other warnings can be introduced
|
- new deprecations, pending deprecations, and other warnings can be introduced
|
||||||
- existing pending deprecations can be converted to full deprecations
|
- existing pending deprecations can be converted to full deprecations
|
||||||
|
@ -204,31 +216,40 @@ Major feature releases would also continue to be the only releases where:
|
||||||
- other changes requiring "Porting to Python X.Y" entries in the What's New
|
- other changes requiring "Porting to Python X.Y" entries in the What's New
|
||||||
document can be introduced
|
document can be introduced
|
||||||
|
|
||||||
Key characteristics of major feature releases:
|
Key characteristics of a major release series:
|
||||||
|
|
||||||
- a major feature release installation does not conflict with installations of
|
- an installation within one major release series does not conflict with
|
||||||
other major feature releases (i.e. they can be installed in parallel)
|
installations of other major release series (i.e. they can be installed in parallel)
|
||||||
- a major feature release installation can be updated to a later minor release
|
- an installation within a major release series can be updated to a later minor
|
||||||
without requiring reinstallation or any other changes to previously installed
|
release within the same series without requiring reinstallation or any other
|
||||||
components
|
changes to previously installed components
|
||||||
- major feature releases may contain higher risk changes to the language and
|
|
||||||
|
Key characteristics of a baseline feature release:
|
||||||
|
|
||||||
|
- in a baseline feature release, ``sys.version_info.feature_complete == False``
|
||||||
|
- in a baseline feature release, ``sys.version_info.minor == 0``
|
||||||
|
- baseline feature releases may contain higher risk changes to the language and
|
||||||
interpreter, such as grammar modifications, major refactoring of interpreter
|
interpreter, such as grammar modifications, major refactoring of interpreter
|
||||||
and standard library internals, or potentially invasive feature additions with
|
and standard library internals, or potentially invasive feature additions that
|
||||||
a risk of unintended side effects on other existing functionality
|
carry a risk of unintended side effects on other existing functionality
|
||||||
|
- features introduced in a baseline feature release are the *only* features
|
||||||
|
permitted to rely on ``sys.version_info`` as their sole runtime indicator
|
||||||
|
of the feature's availability
|
||||||
|
|
||||||
Key expectations around major feature releases and release series:
|
Key expectations around major release series and baseline feature releases:
|
||||||
|
|
||||||
- most public projects will only actively test against the *most recent*
|
- most public projects will only actively test against the *most recent*
|
||||||
minor release within a release series
|
minor release within a release series
|
||||||
- many (most?) public projects will only add a new release series to their test
|
- many (most?) public projects will only add a new release series to their test
|
||||||
matrix *after* the initial feature release has already been published, which
|
matrix *after* the initial baseline feature release has already been published,
|
||||||
can make it difficult to resolve issues that require providing new flags or
|
which can make it difficult to resolve issues that require providing new flags
|
||||||
APIs to explicitly opt-in to old behaviour after a default behaviour changed
|
or APIs to explicitly opt-in to old behaviour after a default behaviour changed
|
||||||
- private projects with known target environments will test against whichever
|
- private projects with known target environments will test against whichever
|
||||||
minor release version they're actually using
|
minor release version they're actually using
|
||||||
- most private projects will also only consider migrating to a new release
|
- most private projects will also only consider migrating to a new release
|
||||||
series *after* the initial feature release has already been published, again
|
series *after* the initial baseline feature release has already been published,
|
||||||
posing a problem if the resolution of their problems requires an API addition
|
again posing a problem if the resolution of their problems requires an API
|
||||||
|
addition
|
||||||
|
|
||||||
|
|
||||||
The key motivation of the proposal in this PEP is that the public and private
|
The key motivation of the proposal in this PEP is that the public and private
|
||||||
|
@ -240,19 +261,20 @@ handles them, rather than changing our processes in a way that then means the
|
||||||
wider community needs to adjust to us rather than the other way around.
|
wider community needs to adjust to us rather than the other way around.
|
||||||
|
|
||||||
|
|
||||||
Minor feature releases
|
Incremental feature releases
|
||||||
----------------------
|
----------------------------
|
||||||
|
|
||||||
Minor feature releases are the key new process addition being proposed by this
|
Incremental feature releases are the key new process addition being proposed by
|
||||||
PEP. They are subject to the same strict runtime compatibility requirements
|
this PEP. They are subject to the same strict runtime compatibility requirements
|
||||||
as the existing maintenance releases, but would have the following more
|
as the existing maintenance releases, but would have the following more
|
||||||
relaxed policies around API additions and enhancements:
|
relaxed policies around API additions and enhancements:
|
||||||
|
|
||||||
* new public APIs can be added to any standard library module (including builtins)
|
* new public APIs can be added to any standard library module (including builtins)
|
||||||
* new optional arguments can be added to existing APIs (including builtins)
|
* subject to the feature detection requirement below, new optional arguments can
|
||||||
|
be added to existing APIs (including builtins)
|
||||||
* new public APIs can be added to the stable C ABI (with appropriate version guards)
|
* new public APIs can be added to the stable C ABI (with appropriate version guards)
|
||||||
* new public APIs can be added to the CPython C API
|
* new public APIs can be added to the CPython C API
|
||||||
* with the approval of the release manager, backwards compatible semantic
|
* with the approval of the release manager, backwards compatible reliability
|
||||||
improvements can be made to existing APIs and syntactic constructs
|
improvements can be made to existing APIs and syntactic constructs
|
||||||
* with the approval of the release manager, performance improvements can be
|
* with the approval of the release manager, performance improvements can be
|
||||||
incorporated for existing APIs and syntactic constructs
|
incorporated for existing APIs and syntactic constructs
|
||||||
|
@ -262,17 +284,52 @@ The intent of this change in policy is to allow usability improvements for new
|
||||||
rather than requiring users to incur the inherent delay and costs of waiting for
|
rather than requiring users to incur the inherent delay and costs of waiting for
|
||||||
and then upgrading to the next major release series.
|
and then upgrading to the next major release series.
|
||||||
|
|
||||||
Key expectations around minor feature releases:
|
Key characteristics of an incremental feature release:
|
||||||
|
|
||||||
|
- in an incremental feature release, ``sys.version_info.feature_complete == False``
|
||||||
|
- in an incremental feature release, ``sys.version_info.minor != 0``
|
||||||
|
- all API additions made in an incremental feature release must support
|
||||||
|
efficient runtime feature detection that doesn't rely on either
|
||||||
|
``sys.version_info`` or runtime code object introspection. In most cases, a
|
||||||
|
simple ``hasattr`` check on the affected module will serve this purpose, but
|
||||||
|
when it doesn't, an alternative approach will need to be implemented as part
|
||||||
|
of the feature addition. Prior art in this area includes the
|
||||||
|
``pickle.HIGHEST_PROTOCOL`` attribute, the ``hashlib.algorithms_available``
|
||||||
|
set, and the various ``os.supports_*`` sets that the ``os`` module already
|
||||||
|
offers for platform dependent capability detection
|
||||||
|
|
||||||
|
Key expectations around incremental feature releases:
|
||||||
|
|
||||||
- "don't break existing installations on upgrade" remains a key requirement
|
- "don't break existing installations on upgrade" remains a key requirement
|
||||||
for minor releases, even with the more permissive change inclusion policy
|
for all minor releases, even with the more permissive change inclusion policy
|
||||||
- more intrusive changes should still be deferred to the next major feature
|
- more intrusive changes should still be deferred to the next baseline feature
|
||||||
release
|
release
|
||||||
- public Python projects that start relying on features added in a minor feature
|
- public Python projects that start relying on features added in an incremental
|
||||||
release should set their ``Python-Requires`` metadata appropriately (projects
|
feature release should set their ``Python-Requires`` metadata appropriately
|
||||||
already do this when necessary - e.g. ``aiohttp`` specifically requires
|
(projects already do this when necessary - e.g. ``aiohttp`` specifically
|
||||||
3.5.3 or later due to an issue with ``asyncio.get_event_loop()`` in earlier
|
requires 3.5.3 or later due to an issue with ``asyncio.get_event_loop()``
|
||||||
versions)
|
in earlier versions)
|
||||||
|
|
||||||
|
Some standard library modules may also impose their own restrictions on
|
||||||
|
acceptable changes in incremental feature releases (for example, new hash
|
||||||
|
algorithms should only ever be added to ``hashlib.algorithms_guaranteed`` in
|
||||||
|
a baseline feature release - incremental feature releases would only be
|
||||||
|
permitted to add algorithms to ``hashlib.algorithms_available``)
|
||||||
|
|
||||||
|
|
||||||
|
Feature complete release and subsequent maintenance releases
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
The feature complete release for a given major release series would be
|
||||||
|
developed under the normal policy for an incremental feature release, but
|
||||||
|
would have one distinguishing feature:
|
||||||
|
|
||||||
|
- in a feature complete release, ``sys.version_info.feature_complete == True``
|
||||||
|
|
||||||
|
Any subsequent maintenance and security fix only releases would also have that
|
||||||
|
flag set, and may informally be referred to as "feature complete releases".
|
||||||
|
For release series definition purposes though, the feature complete release
|
||||||
|
is the first one that sets that flag to "True".
|
||||||
|
|
||||||
|
|
||||||
Motivation
|
Motivation
|
||||||
|
@ -283,8 +340,8 @@ for change in PEP 596: the current 18-24 month gap between feature releases has
|
||||||
a lot of undesirable consequences, especially for the standard library (see
|
a lot of undesirable consequences, especially for the standard library (see
|
||||||
PEP 596 for further articulation of the details).
|
PEP 596 for further articulation of the details).
|
||||||
|
|
||||||
The concern with the specific proposal in PEP 596 is that it doubles the number
|
This PEP's concern with the specific proposal in PEP 596 is that it doubles the
|
||||||
of actively supported Python branches, increasing the complexity of
|
number of actively supported Python branches, increasing the complexity of
|
||||||
compatibility testing matrices for the entire Python community, increasing the
|
compatibility testing matrices for the entire Python community, increasing the
|
||||||
number of binary Python wheels to be uploaded to PyPI when not using the stable
|
number of binary Python wheels to be uploaded to PyPI when not using the stable
|
||||||
ABI, and just generally having a high chance of inflicting a relatively high
|
ABI, and just generally having a high chance of inflicting a relatively high
|
||||||
|
@ -292,9 +349,10 @@ level of additional cost across the entire Python ecosystem.
|
||||||
|
|
||||||
The view taken in this PEP is that there's an alternative approach that provides
|
The view taken in this PEP is that there's an alternative approach that provides
|
||||||
most of the benefits of a faster major release without actually incurring the
|
most of the benefits of a faster major release without actually incurring the
|
||||||
associated costs: we can split the current X.Y.0 "feature freeze" into two parts,
|
associated costs: we can split the current X.Y.0 "feature freeze" into two
|
||||||
such that X.Y.0 only imposes a "runtime compatibility freeze", and the full
|
parts, such that the baseline X.Y.0 release only imposes a
|
||||||
feature freeze is deferred until later in the release series lifecycle.
|
"runtime compatibility freeze", and the full standard library feature freeze
|
||||||
|
is deferred until later in the release series lifecycle.
|
||||||
|
|
||||||
|
|
||||||
Caveats and Limitations
|
Caveats and Limitations
|
||||||
|
@ -311,8 +369,8 @@ annual cadence for both contributors and end users, so adjustments ideally would
|
||||||
be rare.
|
be rare.
|
||||||
|
|
||||||
This PEP does not dictate a specific cadence for minor releases within a release
|
This PEP does not dictate a specific cadence for minor releases within a release
|
||||||
series - it just specifies the timelines for transitions between the release
|
series - it just specifies the rouch timelines for transitions between the
|
||||||
series lifecycle phases (pre-alpha, alpha, beta, feature additions,
|
release series lifecycle phases (pre-alpha, alpha, beta, feature releases,
|
||||||
bug fixes, security fixes). The number of minor releases within each phase is
|
bug fixes, security fixes). The number of minor releases within each phase is
|
||||||
determined by the release manager for that series based on how frequently they
|
determined by the release manager for that series based on how frequently they
|
||||||
and the rest of the release team for that series are prepared to undertake the
|
and the rest of the release team for that series are prepared to undertake the
|
||||||
|
@ -321,7 +379,7 @@ associated work.
|
||||||
However, for the sake of the example timelines, the PEP assumes quarterly
|
However, for the sake of the example timelines, the PEP assumes quarterly
|
||||||
minor releases (the cadence used for Python 3.6 and 3.7, splitting the
|
minor releases (the cadence used for Python 3.6 and 3.7, splitting the
|
||||||
difference between the twice yearly cadence used for some historical release
|
difference between the twice yearly cadence used for some historical release
|
||||||
series, and the monthly cadence expected for Python 3.8 and 3.9).
|
series, and the monthly cadence planned for Python 3.8 and 3.9).
|
||||||
|
|
||||||
|
|
||||||
Design Discussion
|
Design Discussion
|
||||||
|
@ -335,15 +393,18 @@ in a major version update create additional work for large sections of the
|
||||||
wider Python community.
|
wider Python community.
|
||||||
|
|
||||||
Decoupling those layout changes from the Python version numbering scheme is also
|
Decoupling those layout changes from the Python version numbering scheme is also
|
||||||
something that in and of itself involves making backwards incompatible changes.
|
something that would in and of itself involves making backwards incompatible
|
||||||
|
changes, as well as adjusting community expectations around which versions will
|
||||||
|
install over the top of each other, and which can be installed in parallel on
|
||||||
|
a single system.
|
||||||
|
|
||||||
We also don't have a straightforward means to communicate to the community "Only
|
We also don't have a straightforward means to communicate to the community
|
||||||
support major version X.Y until X.Y+1 is out, but support X.Z until X.Z+2 is
|
variations in support periods like "Only support major version X.Y until
|
||||||
out".
|
X.Y+1 is out, but support X.Z until X.Z+2 is out".
|
||||||
|
|
||||||
So this PEP takes as its starting assumption that the vast majority of Python
|
So this PEP takes as its starting assumption that the vast majority of Python
|
||||||
users simply *shouldn't need to care* that we're changing our release policy,
|
users simply *shouldn't need to care* that we're changing our release policy,
|
||||||
and the only folks that will be affected will be those that are eagerly waiting
|
and the only folks that should be affected are those that are eagerly waiting
|
||||||
for standard library improvements, and other backwards compatible interpreter
|
for standard library improvements, and other backwards compatible interpreter
|
||||||
enhancements.
|
enhancements.
|
||||||
|
|
||||||
|
@ -355,7 +416,7 @@ This PEP proposes that feature additions be limited to 12 months after the
|
||||||
initial major feature release.
|
initial major feature release.
|
||||||
|
|
||||||
The primary motivation for that is specifically to sync up with the Ubuntu LTS
|
The primary motivation for that is specifically to sync up with the Ubuntu LTS
|
||||||
timing, such that the final minor feature release for Python 3.9.x gets
|
timing, such that the feature complete release for the Python 3.9.x series gets
|
||||||
published in October 2021, ready for inclusion in the Ubuntu 22.04 release.
|
published in October 2021, ready for inclusion in the Ubuntu 22.04 release.
|
||||||
(other LTS Linux distributions like RHEL, SLES, and Debian don't have a fixed
|
(other LTS Linux distributions like RHEL, SLES, and Debian don't have a fixed
|
||||||
publishing cadence, so they can more easily tweak their LTS timing a bit to
|
publishing cadence, so they can more easily tweak their LTS timing a bit to
|
||||||
|
@ -378,12 +439,12 @@ months of minor feature releases:
|
||||||
* 2020-05: 3.9.0b3 (final beta release that locks ABI compatibility)
|
* 2020-05: 3.9.0b3 (final beta release that locks ABI compatibility)
|
||||||
* 2020-06: 3.9.0rc1
|
* 2020-06: 3.9.0rc1
|
||||||
* ... additional release candidates as determined by the release manager
|
* ... additional release candidates as determined by the release manager
|
||||||
* 2020-07: 3.9.0
|
* 2020-07: 3.9.0 (BFR)
|
||||||
* 2020-10: 3.9.1
|
* 2020-10: 3.9.1 (IFR)
|
||||||
* 2021-01: 3.9.2
|
* 2021-01: 3.9.2 (IFR)
|
||||||
* 2021-04: 3.9.3
|
* 2021-04: 3.9.3 (IFR)
|
||||||
* 2021-07: 3.9.4
|
* 2021-07: 3.9.4 (IFR)
|
||||||
* 2021-10: 3.9.5 (final minor feature release)
|
* 2021-10: 3.9.5
|
||||||
* 2022-01: 3.9.6
|
* 2022-01: 3.9.6
|
||||||
* 2022-04: 3.9.7
|
* 2022-04: 3.9.7
|
||||||
* 2022-07: 3.9.8
|
* 2022-07: 3.9.8
|
||||||
|
@ -393,16 +454,16 @@ months of minor feature releases:
|
||||||
|
|
||||||
This approach would mean there were still always two or three active branches,
|
This approach would mean there were still always two or three active branches,
|
||||||
it's just that proportionally more time would be spent with a branch in the
|
it's just that proportionally more time would be spent with a branch in the
|
||||||
"feature additions" phase, as compared to the "pre-alpha", "pre-beta", and
|
"feature releases" phase, as compared to the "pre-alpha", "pre-beta", and
|
||||||
"pre-release" phases:
|
"pre-release" phases:
|
||||||
|
|
||||||
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
||||||
* 2019-10 -> 2020-03: 3.9.0 pre-beta, 3.8.x maintenance
|
* 2019-10 -> 2020-03: 3.9.0 pre-beta, 3.8.x maintenance
|
||||||
* 2020-03 -> 2020-07: 3.10.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
* 2020-03 -> 2020-07: 3.10.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
||||||
* 2020-07 -> 2021-10: 3.10.0 pre-alpha, 3.9.x feature addition, 3.8.x maintenance
|
* 2020-07 -> 2021-10: 3.10.0 pre-alpha, 3.9.x feature releases, 3.8.x maintenance
|
||||||
* 2021-10 -> 2022-03: 3.10.0 pre-beta, 3.9.x maintenance
|
* 2021-10 -> 2022-03: 3.10.0 pre-beta, 3.9.x maintenance
|
||||||
* 2022-03 -> 2022-07: 3.11.0 pre-alpha, 3.10.0 pre-release, 3.9.x maintenance
|
* 2022-03 -> 2022-07: 3.11.0 pre-alpha, 3.10.0 pre-release, 3.9.x maintenance
|
||||||
* 2022-07 -> 2023-10: 3.11.0 pre-alpha, 3.10.x feature addition, 3.9.x maintenance
|
* 2022-07 -> 2023-10: 3.11.0 pre-alpha, 3.10.x feature releases, 3.9.x maintenance
|
||||||
* 2023-10 -> 2024-03: 3.11.0 pre-beta, 3.10.x maintenance
|
* 2023-10 -> 2024-03: 3.11.0 pre-beta, 3.10.x maintenance
|
||||||
* 2024-03 -> 2024-07: 3.12.0 pre-alpha, 3.11.0 pre-release, 3.10.x maintenance
|
* 2024-03 -> 2024-07: 3.12.0 pre-alpha, 3.11.0 pre-release, 3.10.x maintenance
|
||||||
* ... etc
|
* ... etc
|
||||||
|
@ -420,7 +481,7 @@ be backported to the most recent maintenance branch for 12 of those months.
|
||||||
The variant of the proposal that moves the beta branch point earlier in the
|
The variant of the proposal that moves the beta branch point earlier in the
|
||||||
release series lifecycle would increase that period of no direct releases to
|
release series lifecycle would increase that period of no direct releases to
|
||||||
21 months - the only period where releases were made directly from the main
|
21 months - the only period where releases were made directly from the main
|
||||||
branch would be during the relatively short window between the last minor
|
branch would be during the relatively short window between the last incremental
|
||||||
feature release of the previous release series, and the beta branch point a
|
feature release of the previous release series, and the beta branch point a
|
||||||
few months later.
|
few months later.
|
||||||
|
|
||||||
|
@ -445,9 +506,9 @@ Why not switch directly to full semantic versioning?
|
||||||
----------------------------------------------------
|
----------------------------------------------------
|
||||||
|
|
||||||
If this were a versioning design document for a new language, it *would* use
|
If this were a versioning design document for a new language, it *would* use
|
||||||
semantic versioning: the policies described above for major feature releases
|
semantic versioning: the policies described above for baseline feature releases
|
||||||
would be applied to X.0.0 releases, the policies for minor feature releases
|
would be applied to X.0.0 releases, the policies for incremental feature
|
||||||
would be applied to X.Y.0 releases, and the policies for maintenance only
|
releases would be applied to X.Y.0 releases, and the policies for maintenance
|
||||||
releases would be applied to X.Y.Z releases.
|
releases would be applied to X.Y.Z releases.
|
||||||
|
|
||||||
The problem for Python specifically is that all the policies and properties for
|
The problem for Python specifically is that all the policies and properties for
|
||||||
|
@ -456,9 +517,9 @@ associated with the first *two* fields of the version number, and it has been
|
||||||
that way for the better part of thirty years.
|
that way for the better part of thirty years.
|
||||||
|
|
||||||
As a result, it makes sense to split out the policy question of introducing
|
As a result, it makes sense to split out the policy question of introducing
|
||||||
minor feature releases in the first place from the technical question of making
|
incremental feature releases in the first place from the technical question of
|
||||||
the version numbering scheme better match the semantics of the different release
|
making the version numbering scheme better match the semantics of the different
|
||||||
types.
|
release types.
|
||||||
|
|
||||||
If the proposal in this PEP were to be accepted by the Steering Council for
|
If the proposal in this PEP were to be accepted by the Steering Council for
|
||||||
Python 3.9, then a better time to tackle that technical question would be for
|
Python 3.9, then a better time to tackle that technical question would be for
|
||||||
|
@ -468,14 +529,16 @@ checks for the major version being exactly 3 rather than 3 or greater), or
|
||||||
"Python 3.10" (code incorrectly assuming that the minor version will always
|
"Python 3.10" (code incorrectly assuming that the minor version will always
|
||||||
contain exactly one decimal digit).
|
contain exactly one decimal digit).
|
||||||
|
|
||||||
There are complex pros and cons on both sides of that future choice, and this
|
While the test of this PEP assumes that the release published in 2022 would be
|
||||||
PEP would merely add one more potential pro in favour of choosing the
|
3.10, there are complex pros and cons on both sides of that future choice, and
|
||||||
"Python 4.0" option, with the caveat that we would also need to amend the
|
this PEP does arguably add a potential pro in favour of choosing the
|
||||||
|
"Python 4.0" option (with the caveat that we would also need to amend the
|
||||||
affected installation layout and compatibility markers to only consider the
|
affected installation layout and compatibility markers to only consider the
|
||||||
major version number (rather than both the major and minor version).
|
major version number, rather than both the major and minor version).
|
||||||
|
|
||||||
If such a change were to be proposed and accepted, then the example 3.10.x
|
If such a version numbering change were to be proposed and accepted, then the
|
||||||
timeline given above would instead become the following 4.x series timeline:
|
example 3.10.x timeline given above would instead become the following 4.x
|
||||||
|
series timeline:
|
||||||
|
|
||||||
* 2021-11: 4.0.0a1
|
* 2021-11: 4.0.0a1
|
||||||
* ... additional alpha releases as determined by the release manager
|
* ... additional alpha releases as determined by the release manager
|
||||||
|
@ -484,11 +547,11 @@ timeline given above would instead become the following 4.x series timeline:
|
||||||
* 2022-08: 4.0.0bX (final beta release that locks ABI compatibility)
|
* 2022-08: 4.0.0bX (final beta release that locks ABI compatibility)
|
||||||
* 2022-09: 4.0.0rc1
|
* 2022-09: 4.0.0rc1
|
||||||
* ... additional release candidates as determined by the release manager
|
* ... additional release candidates as determined by the release manager
|
||||||
* 2022-10: 4.0.0
|
* 2022-10: 4.0.0 (BFR)
|
||||||
* 2023-01: 4.1.0
|
* 2023-01: 4.1.0 (IFR)
|
||||||
* 2023-04: 4.2.0
|
* 2023-04: 4.2.0 (IFR)
|
||||||
* 2023-07: 4.3.0
|
* 2023-07: 4.3.0 (IFR)
|
||||||
* 2023-10: 4.4.0 (final minor feature release)
|
* 2023-10: 4.4.0 (IFR)
|
||||||
* 2024-01: 4.4.1
|
* 2024-01: 4.4.1
|
||||||
* 2024-04: 4.4.2
|
* 2024-04: 4.4.2
|
||||||
* 2024-07: 4.4.3
|
* 2024-07: 4.4.3
|
||||||
|
@ -501,10 +564,10 @@ And the 5 year schedule forecast would look like:
|
||||||
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
* 2019-04 -> 2019-10: 3.9.0 pre-alpha, 3.8.0 pre-release, 3.7.x maintenance
|
||||||
* 2019-10 -> 2020-05: 3.9.0 pre-beta, 3.8.x maintenance
|
* 2019-10 -> 2020-05: 3.9.0 pre-beta, 3.8.x maintenance
|
||||||
* 2020-05 -> 2020-10: 4.0.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
* 2020-05 -> 2020-10: 4.0.0 pre-alpha, 3.9.0 pre-release, 3.8.x maintenance
|
||||||
* 2020-10 -> 2021-10: 4.0.0 pre-alpha, 3.9.x feature addition, 3.8.x maintenance
|
* 2020-10 -> 2021-10: 4.0.0 pre-alpha, 3.9.x feature releases, 3.8.x maintenance
|
||||||
* 2021-10 -> 2022-05: 4.0.0 pre-beta, 3.9.x maintenance
|
* 2021-10 -> 2022-05: 4.0.0 pre-beta, 3.9.x maintenance
|
||||||
* 2022-05 -> 2022-10: 5.0.0 pre-alpha, 4.0.0 pre-release, 3.9.x maintenance
|
* 2022-05 -> 2022-10: 5.0.0 pre-alpha, 4.0.0 pre-release, 3.9.x maintenance
|
||||||
* 2022-10 -> 2023-10: 5.0.0 pre-alpha, 4.x.0 feature addition, 3.9.x maintenance
|
* 2022-10 -> 2023-10: 5.0.0 pre-alpha, 4.x.0 feature releases, 3.9.x maintenance
|
||||||
* 2023-10 -> 2024-05: 5.0.0 pre-beta, 4.x.y maintenance
|
* 2023-10 -> 2024-05: 5.0.0 pre-beta, 4.x.y maintenance
|
||||||
* 2024-05 -> 2024-10: 6.0.0 pre-alpha, 5.0.0 pre-release, 4.x.y maintenance
|
* 2024-05 -> 2024-10: 6.0.0 pre-alpha, 5.0.0 pre-release, 4.x.y maintenance
|
||||||
* ... etc
|
* ... etc
|
||||||
|
|
Loading…
Reference in New Issue