1
1
from __future__ import annotations
2
2
3
3
4
- def is_legacy_bundled_package (prefix : str ) -> bool :
5
- return prefix in legacy_bundled_packages
4
+ def is_module_from_legacy_bundled_package (module : str ) -> bool :
5
+ top_level = module .split ("." , 1 )[0 ]
6
+ return top_level in legacy_bundled_packages
6
7
7
8
8
- def approved_stub_package_exists (prefix : str ) -> bool :
9
- return is_legacy_bundled_package (prefix ) or prefix in non_bundled_packages
9
+ def approved_stub_package_exists (module : str ) -> bool :
10
+ top_level = module .split ("." , 1 )[0 ]
11
+ if top_level in legacy_bundled_packages :
12
+ return True
13
+ if top_level in non_bundled_packages_flat :
14
+ return True
15
+ if top_level in non_bundled_packages_namespace :
16
+ namespace = non_bundled_packages_namespace [top_level ]
17
+ components = module .split ("." )
18
+ for i in range (len (components ), 0 , - 1 ):
19
+ module = "." .join (components [:i ])
20
+ if module in namespace :
21
+ return True
22
+ return False
10
23
11
24
12
- def stub_distribution_name (prefix : str ) -> str :
13
- return legacy_bundled_packages .get (prefix ) or non_bundled_packages [prefix ]
25
+ def stub_distribution_name (module : str ) -> str | None :
26
+ top_level = module .split ("." , 1 )[0 ]
27
+
28
+ dist = legacy_bundled_packages .get (top_level )
29
+ if dist :
30
+ return dist
31
+ dist = non_bundled_packages_flat .get (top_level )
32
+ if dist :
33
+ return dist
34
+
35
+ if top_level in non_bundled_packages_namespace :
36
+ namespace = non_bundled_packages_namespace [top_level ]
37
+ components = module .split ("." )
38
+ for i in range (len (components ), 0 , - 1 ):
39
+ module = "." .join (components [:i ])
40
+ dist = namespace .get (module )
41
+ if dist :
42
+ return dist
43
+
44
+ return None
14
45
15
46
16
47
# Stubs for these third-party packages used to be shipped with mypy.
17
48
#
18
49
# Map package name to PyPI stub distribution name.
19
- legacy_bundled_packages = {
50
+ legacy_bundled_packages : dict [ str , str ] = {
20
51
"aiofiles" : "types-aiofiles" ,
21
52
"bleach" : "types-bleach" ,
22
53
"boto" : "types-boto" ,
@@ -32,7 +63,6 @@ def stub_distribution_name(prefix: str) -> str:
32
63
"docutils" : "types-docutils" ,
33
64
"first" : "types-first" ,
34
65
"gflags" : "types-python-gflags" ,
35
- "google.protobuf" : "types-protobuf" ,
36
66
"markdown" : "types-Markdown" ,
37
67
"mock" : "types-mock" ,
38
68
"OpenSSL" : "types-pyOpenSSL" ,
@@ -66,20 +96,17 @@ def stub_distribution_name(prefix: str) -> str:
66
96
# include packages that have a release that includes PEP 561 type
67
97
# information.
68
98
#
69
- # Package name can have one or two components ('a' or 'a.b').
70
- #
71
99
# Note that these packages are omitted for now:
72
100
# pika: typeshed's stubs are on PyPI as types-pika-ts.
73
101
# types-pika already exists on PyPI, and is more complete in many ways,
74
102
# but is a non-typeshed stubs package.
75
- non_bundled_packages = {
103
+ non_bundled_packages_flat : dict [ str , str ] = {
76
104
"MySQLdb" : "types-mysqlclient" ,
77
105
"PIL" : "types-Pillow" ,
78
106
"PyInstaller" : "types-pyinstaller" ,
79
107
"Xlib" : "types-python-xlib" ,
80
108
"aws_xray_sdk" : "types-aws-xray-sdk" ,
81
109
"babel" : "types-babel" ,
82
- "backports.ssl_match_hostname" : "types-backports.ssl_match_hostname" ,
83
110
"braintree" : "types-braintree" ,
84
111
"bs4" : "types-beautifulsoup4" ,
85
112
"bugbear" : "types-flake8-bugbear" ,
@@ -107,7 +134,6 @@ def stub_distribution_name(prefix: str) -> str:
107
134
"flask_migrate" : "types-Flask-Migrate" ,
108
135
"fpdf" : "types-fpdf2" ,
109
136
"gdb" : "types-gdb" ,
110
- "google.cloud.ndb" : "types-google-cloud-ndb" ,
111
137
"hdbcli" : "types-hdbcli" ,
112
138
"html5lib" : "types-html5lib" ,
113
139
"httplib2" : "types-httplib2" ,
@@ -123,7 +149,6 @@ def stub_distribution_name(prefix: str) -> str:
123
149
"oauthlib" : "types-oauthlib" ,
124
150
"openpyxl" : "types-openpyxl" ,
125
151
"opentracing" : "types-opentracing" ,
126
- "paho.mqtt" : "types-paho-mqtt" ,
127
152
"parsimonious" : "types-parsimonious" ,
128
153
"passlib" : "types-passlib" ,
129
154
"passpy" : "types-passpy" ,
@@ -171,3 +196,10 @@ def stub_distribution_name(prefix: str) -> str:
171
196
"pandas" : "pandas-stubs" , # https://github.com/pandas-dev/pandas-stubs
172
197
"lxml" : "lxml-stubs" , # https://github.com/lxml/lxml-stubs
173
198
}
199
+
200
+
201
+ non_bundled_packages_namespace : dict [str , dict [str , str ]] = {
202
+ "backports" : {"backports.ssl_match_hostname" : "types-backports.ssl_match_hostname" },
203
+ "google" : {"google.cloud.ndb" : "types-google-cloud-ndb" , "google.protobuf" : "types-protobuf" },
204
+ "paho" : {"paho.mqtt" : "types-paho-mqtt" },
205
+ }
0 commit comments