Hello here,

There was - apparently - one outstanding issue in the new provider
structure - VSCode had trouble with recognising imports for cross-provider
imports - because apparently it did not recognise implicit - also called
native - packages (i.e. folders without __init__.py). We tested it with
Mikhail and Jens and tried to get it working and I **think** we finally
succeeded to make it works for all cases (AKA "we have cake and ate it
too"):

* uv sync works
* pip install -e . -e ./providers/PROVIDER works
* pytest tests all work with adding the right PYTHONPATH
* Intellij properly recognizes the imports for both providers and
cross-providers
* VSCode also recognizes the imports and allows to navigate

You will still need to add "tests" folder as "test source" in IntelliJ (you
can also add "src" folders as sources but that should not be needed if you
use uv sync-ed virtualenv)  if tests are cross-importing stuff from other
test files. This is documented  in our contributing guide [1[   and Mikhail
will add equivalent screenshots for VScode

That required us to add many more `__init__.py` files with so-called
"legacy" namespaces (for airflow/providers/common etc. packages),. One
watchout - despite the "legacy" name - this form is not deprecated, it has
no impact on provider packages generated (the .whl files still have
implicit - essentially empty - namespace packages) and we can continue
building and releasing provider packages as usual. PR for that in [2] and
you can read more details there.

Maybe someday the support in IDES will be better and we might turn airflow
into fully "implicit packages driven" when we restructure airflow and we
will be able to remove all the unneeded __init__.py files then. But it is
not that day yet.

For now - we have a pre-commit that automatically generates and updates
files in providers ('check-providers-subpackages-init-file-exist')  - so
you should not have to worry about doing anything when you add a  new
provider the __init__.py files will be sorted for you automatically when
you commit your code. Just commit what it creates/updates.

You can read more about namespace packages in [3] - but this is a pretty
convoluted subject and we had to figure out how to do it best with a little
trial-and-error - especially because of various support from IDEs and other
tooling (mypy was particularly picky to get right with the new setup).

[1] Pycharm quick-start contributing guide:
https://github.com/apache/airflow/blob/main/contributing-docs/quick-start-ide/contributors_quick_start_pycharm.rst

[2] Legacy namespace PR: https://github.com/apache/airflow/pull/47064

[3] Namespace packages standard:
https://packaging.python.org/en/latest/guides/packaging-namespace-packages/

J.

Reply via email to