Skip to content

Commit 64edfb6

Browse files
GankraMichaReiser
andauthored
[ty] add legacy namespace package support (#20897)
Detect legacy namespace packages and treat them like namespace packages when looking them up as the *parent* of the module we're interested in. In all other cases treat them like a regular package. (This PR is coauthored by @MichaReiser in a shared coding session) Fixes astral-sh/ty#838 --------- Co-authored-by: Micha Reiser <[email protected]>
1 parent 96b1563 commit 64edfb6

File tree

2 files changed

+405
-2
lines changed

2 files changed

+405
-2
lines changed
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
# Legacy namespace packages
2+
3+
## `__import__("pkgutil").extend_path`
4+
5+
```toml
6+
[environment]
7+
extra-paths = ["/airflow-core/src", "/providers/amazon/src/"]
8+
```
9+
10+
`/airflow-core/src/airflow/__init__.py`:
11+
12+
```py
13+
__path__ = __import__("pkgutil").extend_path(__path__, __name__)
14+
__version__ = "3.2.0"
15+
```
16+
17+
`/providers/amazon/src/airflow/__init__.py`:
18+
19+
```py
20+
__path__ = __import__("pkgutil").extend_path(__path__, __name__)
21+
```
22+
23+
`/providers/amazon/src/airflow/providers/__init__.py`:
24+
25+
```py
26+
__path__ = __import__("pkgutil").extend_path(__path__, __name__)
27+
```
28+
29+
`/providers/amazon/src/airflow/providers/amazon/__init__.py`:
30+
31+
```py
32+
__version__ = "9.15.0"
33+
```
34+
35+
`test.py`:
36+
37+
```py
38+
from airflow import __version__ as airflow_version
39+
from airflow.providers.amazon import __version__ as amazon_provider_version
40+
41+
reveal_type(airflow_version) # revealed: Literal["3.2.0"]
42+
reveal_type(amazon_provider_version) # revealed: Literal["9.15.0"]
43+
```
44+
45+
## `pkgutil.extend_path`
46+
47+
```toml
48+
[environment]
49+
extra-paths = ["/airflow-core/src", "/providers/amazon/src/"]
50+
```
51+
52+
`/airflow-core/src/airflow/__init__.py`:
53+
54+
```py
55+
import pkgutil
56+
57+
__path__ = pkgutil.extend_path(__path__, __name__)
58+
__version__ = "3.2.0"
59+
```
60+
61+
`/providers/amazon/src/airflow/__init__.py`:
62+
63+
```py
64+
import pkgutil
65+
66+
__path__ = pkgutil.extend_path(__path__, __name__)
67+
```
68+
69+
`/providers/amazon/src/airflow/providers/__init__.py`:
70+
71+
```py
72+
import pkgutil
73+
74+
__path__ = pkgutil.extend_path(__path__, __name__)
75+
```
76+
77+
`/providers/amazon/src/airflow/providers/amazon/__init__.py`:
78+
79+
```py
80+
__version__ = "9.15.0"
81+
```
82+
83+
`test.py`:
84+
85+
```py
86+
from airflow import __version__ as airflow_version
87+
from airflow.providers.amazon import __version__ as amazon_provider_version
88+
89+
reveal_type(airflow_version) # revealed: Literal["3.2.0"]
90+
reveal_type(amazon_provider_version) # revealed: Literal["9.15.0"]
91+
```
92+
93+
## `extend_path` with keyword arguments
94+
95+
```toml
96+
[environment]
97+
extra-paths = ["/airflow-core/src", "/providers/amazon/src/"]
98+
```
99+
100+
`/airflow-core/src/airflow/__init__.py`:
101+
102+
```py
103+
import pkgutil
104+
105+
__path__ = pkgutil.extend_path(name=__name__, path=__path__)
106+
__version__ = "3.2.0"
107+
```
108+
109+
`/providers/amazon/src/airflow/__init__.py`:
110+
111+
```py
112+
import pkgutil
113+
114+
__path__ = pkgutil.extend_path(name=__name__, path=__path__)
115+
```
116+
117+
`/providers/amazon/src/airflow/providers/__init__.py`:
118+
119+
```py
120+
import pkgutil
121+
122+
__path__ = pkgutil.extend_path(name=__name__, path=__path__)
123+
```
124+
125+
`/providers/amazon/src/airflow/providers/amazon/__init__.py`:
126+
127+
```py
128+
__version__ = "9.15.0"
129+
```
130+
131+
`test.py`:
132+
133+
```py
134+
from airflow import __version__ as airflow_version
135+
from airflow.providers.amazon import __version__ as amazon_provider_version
136+
137+
reveal_type(airflow_version) # revealed: Literal["3.2.0"]
138+
reveal_type(amazon_provider_version) # revealed: Literal["9.15.0"]
139+
```
140+
141+
## incorrect `__import__` arguments
142+
143+
```toml
144+
[environment]
145+
extra-paths = ["/airflow-core/src", "/providers/amazon/src/"]
146+
```
147+
148+
`/airflow-core/src/airflow/__init__.py`:
149+
150+
```py
151+
__path__ = __import__("not_pkgutil").extend_path(__path__, __name__)
152+
__version__ = "3.2.0"
153+
```
154+
155+
`/providers/amazon/src/airflow/__init__.py`:
156+
157+
```py
158+
__path__ = __import__("not_pkgutil").extend_path(__path__, __name__)
159+
```
160+
161+
`/providers/amazon/src/airflow/providers/__init__.py`:
162+
163+
```py
164+
__path__ = __import__("not_pkgutil").extend_path(__path__, __name__)
165+
```
166+
167+
`/providers/amazon/src/airflow/providers/amazon/__init__.py`:
168+
169+
```py
170+
__version__ = "9.15.0"
171+
```
172+
173+
`test.py`:
174+
175+
```py
176+
from airflow.providers.amazon import __version__ as amazon_provider_version # error: [unresolved-import]
177+
from airflow import __version__ as airflow_version
178+
179+
reveal_type(airflow_version) # revealed: Literal["3.2.0"]
180+
```
181+
182+
## incorrect `extend_path` arguments
183+
184+
```toml
185+
[environment]
186+
extra-paths = ["/airflow-core/src", "/providers/amazon/src/"]
187+
```
188+
189+
`/airflow-core/src/airflow/__init__.py`:
190+
191+
```py
192+
__path__ = __import__("pkgutil").extend_path(__path__, "other_module")
193+
__version__ = "3.2.0"
194+
```
195+
196+
`/providers/amazon/src/airflow/__init__.py`:
197+
198+
```py
199+
__path__ = __import__("pkgutil").extend_path(__path__, "other_module")
200+
```
201+
202+
`/providers/amazon/src/airflow/providers/__init__.py`:
203+
204+
```py
205+
__path__ = __import__("pkgutil").extend_path(__path__, "other_module")
206+
```
207+
208+
`/providers/amazon/src/airflow/providers/amazon/__init__.py`:
209+
210+
```py
211+
__version__ = "9.15.0"
212+
```
213+
214+
`test.py`:
215+
216+
```py
217+
from airflow.providers.amazon import __version__ as amazon_provider_version # error: [unresolved-import]
218+
from airflow import __version__ as airflow_version
219+
220+
reveal_type(airflow_version) # revealed: Literal["3.2.0"]
221+
```

0 commit comments

Comments
 (0)