Skip to content

Remove dev dependencies from PyPI constraints.#53631

Merged
potiuk merged 1 commit intoapache:mainfrom
potiuk:remove-dev-dependencies-from-pypi-constraints
Aug 2, 2025
Merged

Remove dev dependencies from PyPI constraints.#53631
potiuk merged 1 commit intoapache:mainfrom
potiuk:remove-dev-dependencies-from-pypi-constraints

Conversation

@potiuk
Copy link
Member

@potiuk potiuk commented Jul 22, 2025

Historically, PyPI constraints of airflow contained also the development dependencies of Airflow - because it was not very easy to separate and remove them from the "core" constraints.

This however might not be really needed and those dev tools could be removed from PyPI constraints.

There are however certain consequences:

a) currently when we generate PyPi constraints we generally know that the dependencies of ours have been tested at some point of time at least when we released the provider - because potentially some of our dev dependencies might limit some 3rd-party deps

b) if we remove devel deps when we generate the PyPI constraints this might change - i.e. removal of development dependencies might cause some of the transient dependencies to be upgraded to newer - potentially incompatible versions. It's not very likely but possible.

This means that if we remove devel deps, there is a higher risk that constraints published for users might contain dependency versions that has never been tested in our CI.

Another option considered is to use a) and b) and remove the dependencies missing in b) from a) - leaving the versions that were matching the versions used during CI. This however has limited impact on the users (just removes the "devel noise" from PyPI constraints

  • and the noise that should not matter when installing airflow). And it has anothe risk that some edge cases might kick-in. For example there might be a case where our dependencies add or remove their transient dependencies, which might change status of those from devel to prod or the other way round. And it's quite a bit more complex.

^ Add meaningful description above
Read the Pull Request Guidelines for more information.
In case of fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in a newsfragment file, named {pr_number}.significant.rst or {issue_number}.significant.rst, in airflow-core/newsfragments.

@potiuk potiuk requested a review from ashb as a code owner July 22, 2025 12:39
@potiuk potiuk added the all versions If set, the CI build will be forced to use all versions of Python/K8S/DBs label Jul 22, 2025
@potiuk potiuk requested a review from gopidesupavan as a code owner July 22, 2025 12:39
@boring-cyborg boring-cyborg bot added area:dev-tools backport-to-v3-1-test Mark PR with this label to backport to v3-1-test branch labels Jul 22, 2025
@potiuk potiuk marked this pull request as draft July 22, 2025 12:40
@potiuk
Copy link
Member Author

potiuk commented Jul 22, 2025

note - this is experimental.. I want to run it to see the impact it will bring, to be able to probably start discussion on devlist whether we can accept the risks involved (but I would like to have some real examples of consequences).

@jscheffl
Copy link
Contributor

If there is a risk that we hat dev-dependencies not contained in constraints... would it help to split these out in a separate constraint file and keep this just for CI purposes? Don't know otherwise if the diff is easy to be calculated...

@jscheffl
Copy link
Contributor

If there is a risk that we hat dev-dependencies not contained in constraints... would it help to split these out in a separate constraint file and keep this just for CI purposes? Don't know otherwise if the diff is easy to be calculated...

OMG, sorry, now reading the email thread... okay sorry - understand this is a bit more complex...

@potiuk
Copy link
Member Author

potiuk commented Jul 23, 2025

OMG, sorry, now reading the email thread... okay sorry - understand this is a bit more complex...

Yeah. It's not separate file - we really want to keep dev deps in pyproject.toml - and dev dependency group is a "standard" feature of uv and the nice thing about it is that it gets automatically installed when you run uv sync (for your current project that you are in working directory of) but dev dependnecies of any dependent projects are not.

So we want to keep that workflow - it's nice and useful (for example when you cd task-sdk and run uv sync there - you will only get dev dependencies of task-sdk but no dev dependencies of task-sdk's dependencies which is exactly what you expect - you want use "dev" dependencies of task-sdk for tests, but you want to just "use" the dependent libraries as if they were in production - so you do not want to pull their development dependencies.

And in this case it's not even that - the problem is that those development dependencies might have their own dependnecies - and they might (but do not have to be) be production dependencies of other dependencies. Yes ... the word "dependency" is used far too often in the previous sentence 😱

In short. Yes. It's complex.

Historically, `PyPI` constraints of airflow contained also the
development dependencies of Airflow - because it was not very easy
to separate and remove them from the "core" constraints.

This however might not be really needed and those dev tools could be
removed from PyPI constraints.

There are however certain consequences:

a) currently when we generate PyPi constraints we generally *know* that
the dependencies of ours have been tested at some point of time at
least when we released the provider - because potentially some of our
dev dependencies might limit some 3rd-party deps

b) if we remove devel deps when we generate the PyPI constraints this
**might** change - i.e. removal of development dependencies might
cause some of the transient dependencies to be upgraded to newer -
potentially incompatible versions. It's not very likely but possible.

This means that if we remove devel deps, there is a higher risk that
constraints published for users might contain dependency versions
that has never been tested in our CI.

Another option considered is to use a) and b) and remove the
dependencies missing in b) from a) - leaving the versions that were
matching the versions used during CI. This however has limited impact
on the users (just removes the "devel noise" from PyPI constraints
- and the noise that should not matter when installing airflow). And
it has anothe risk that some edge cases might kick-in. For example
there might be a case where our dependencies add or remove their
transient dependencies, which might change status of those from
devel to prod or the other way round. And it's quite a bit more
complex.
@potiuk potiuk force-pushed the remove-dev-dependencies-from-pypi-constraints branch from 2959e09 to afcd0a2 Compare August 1, 2025 17:54
@potiuk potiuk marked this pull request as ready for review August 1, 2025 17:54
@jscheffl jscheffl removed the backport-to-v3-1-test Mark PR with this label to backport to v3-1-test branch label Aug 1, 2025
@jscheffl jscheffl added this to the Airflow 3.1.0 milestone Aug 1, 2025
@potiuk potiuk merged commit 41cd862 into apache:main Aug 2, 2025
376 of 381 checks passed
@potiuk potiuk deleted the remove-dev-dependencies-from-pypi-constraints branch August 2, 2025 07:12
ferruzzi pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Aug 7, 2025
Historically, `PyPI` constraints of airflow contained also the
development dependencies of Airflow - because it was not very easy
to separate and remove them from the "core" constraints.

This however might not be really needed and those dev tools could be
removed from PyPI constraints.

There are however certain consequences:

a) currently when we generate PyPi constraints we generally *know* that
the dependencies of ours have been tested at some point of time at
least when we released the provider - because potentially some of our
dev dependencies might limit some 3rd-party deps

b) if we remove devel deps when we generate the PyPI constraints this
**might** change - i.e. removal of development dependencies might
cause some of the transient dependencies to be upgraded to newer -
potentially incompatible versions. It's not very likely but possible.

This means that if we remove devel deps, there is a higher risk that
constraints published for users might contain dependency versions
that has never been tested in our CI.

Another option considered is to use a) and b) and remove the
dependencies missing in b) from a) - leaving the versions that were
matching the versions used during CI. This however has limited impact
on the users (just removes the "devel noise" from PyPI constraints
- and the noise that should not matter when installing airflow). And
it has anothe risk that some edge cases might kick-in. For example
there might be a case where our dependencies add or remove their
transient dependencies, which might change status of those from
devel to prod or the other way round. And it's quite a bit more
complex.
fweilun pushed a commit to fweilun/airflow that referenced this pull request Aug 11, 2025
Historically, `PyPI` constraints of airflow contained also the
development dependencies of Airflow - because it was not very easy
to separate and remove them from the "core" constraints.

This however might not be really needed and those dev tools could be
removed from PyPI constraints.

There are however certain consequences:

a) currently when we generate PyPi constraints we generally *know* that
the dependencies of ours have been tested at some point of time at
least when we released the provider - because potentially some of our
dev dependencies might limit some 3rd-party deps

b) if we remove devel deps when we generate the PyPI constraints this
**might** change - i.e. removal of development dependencies might
cause some of the transient dependencies to be upgraded to newer -
potentially incompatible versions. It's not very likely but possible.

This means that if we remove devel deps, there is a higher risk that
constraints published for users might contain dependency versions
that has never been tested in our CI.

Another option considered is to use a) and b) and remove the
dependencies missing in b) from a) - leaving the versions that were
matching the versions used during CI. This however has limited impact
on the users (just removes the "devel noise" from PyPI constraints
- and the noise that should not matter when installing airflow). And
it has anothe risk that some edge cases might kick-in. For example
there might be a case where our dependencies add or remove their
transient dependencies, which might change status of those from
devel to prod or the other way round. And it's quite a bit more
complex.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

all versions If set, the CI build will be forced to use all versions of Python/K8S/DBs area:dev-tools

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants