1# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
2# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
3# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt
4
5from __future__ import annotations
6
7from collections.abc import Callable
8from typing import TYPE_CHECKING
9
10from astroid.exceptions import InferenceError
11from astroid.manager import AstroidManager
12from astroid.nodes.scoped_nodes import Module
13
14if TYPE_CHECKING:
15 from astroid.nodes.node_ng import NodeNG
16
17
18def register_module_extender(
19 manager: AstroidManager, module_name: str, get_extension_mod: Callable[[], Module]
20) -> None:
21 def transform(node: Module) -> None:
22 extension_module = get_extension_mod()
23 for name, objs in extension_module.locals.items():
24 node.locals[name] = objs
25 for obj in objs:
26 if obj.parent is extension_module:
27 obj.parent = node
28
29 manager.register_transform(Module, transform, lambda n: n.name == module_name)
30
31
32# pylint: disable-next=too-many-locals
33def register_all_brains(manager: AstroidManager) -> None:
34 from astroid.brain import ( # pylint: disable=import-outside-toplevel
35 brain_argparse,
36 brain_attrs,
37 brain_boto3,
38 brain_builtin_inference,
39 brain_collections,
40 brain_crypt,
41 brain_ctypes,
42 brain_curses,
43 brain_dataclasses,
44 brain_datetime,
45 brain_dateutil,
46 brain_decimal,
47 brain_functools,
48 brain_gi,
49 brain_hashlib,
50 brain_http,
51 brain_hypothesis,
52 brain_io,
53 brain_mechanize,
54 brain_multiprocessing,
55 brain_namedtuple_enum,
56 brain_numpy_core_einsumfunc,
57 brain_numpy_core_fromnumeric,
58 brain_numpy_core_function_base,
59 brain_numpy_core_multiarray,
60 brain_numpy_core_numeric,
61 brain_numpy_core_numerictypes,
62 brain_numpy_core_umath,
63 brain_numpy_ma,
64 brain_numpy_ndarray,
65 brain_numpy_random_mtrand,
66 brain_pathlib,
67 brain_pkg_resources,
68 brain_pytest,
69 brain_qt,
70 brain_random,
71 brain_re,
72 brain_regex,
73 brain_responses,
74 brain_scipy_signal,
75 brain_signal,
76 brain_six,
77 brain_sqlalchemy,
78 brain_ssl,
79 brain_statistics,
80 brain_subprocess,
81 brain_threading,
82 brain_type,
83 brain_typing,
84 brain_unittest,
85 brain_uuid,
86 )
87
88 brain_argparse.register(manager)
89 brain_attrs.register(manager)
90 brain_boto3.register(manager)
91 brain_builtin_inference.register(manager)
92 brain_collections.register(manager)
93 brain_crypt.register(manager)
94 brain_ctypes.register(manager)
95 brain_curses.register(manager)
96 brain_dataclasses.register(manager)
97 brain_datetime.register(manager)
98 brain_dateutil.register(manager)
99 brain_decimal.register(manager)
100 brain_functools.register(manager)
101 brain_gi.register(manager)
102 brain_hashlib.register(manager)
103 brain_http.register(manager)
104 brain_hypothesis.register(manager)
105 brain_io.register(manager)
106 brain_mechanize.register(manager)
107 brain_multiprocessing.register(manager)
108 brain_namedtuple_enum.register(manager)
109 brain_numpy_core_einsumfunc.register(manager)
110 brain_numpy_core_fromnumeric.register(manager)
111 brain_numpy_core_function_base.register(manager)
112 brain_numpy_core_multiarray.register(manager)
113 brain_numpy_core_numerictypes.register(manager)
114 brain_numpy_core_umath.register(manager)
115 brain_numpy_random_mtrand.register(manager)
116 brain_numpy_ma.register(manager)
117 brain_numpy_ndarray.register(manager)
118 brain_numpy_core_numeric.register(manager)
119 brain_pathlib.register(manager)
120 brain_pkg_resources.register(manager)
121 brain_pytest.register(manager)
122 brain_qt.register(manager)
123 brain_random.register(manager)
124 brain_re.register(manager)
125 brain_regex.register(manager)
126 brain_responses.register(manager)
127 brain_scipy_signal.register(manager)
128 brain_signal.register(manager)
129 brain_six.register(manager)
130 brain_sqlalchemy.register(manager)
131 brain_ssl.register(manager)
132 brain_statistics.register(manager)
133 brain_subprocess.register(manager)
134 brain_threading.register(manager)
135 brain_type.register(manager)
136 brain_typing.register(manager)
137 brain_unittest.register(manager)
138 brain_uuid.register(manager)
139
140
141def is_class_var(node: NodeNG) -> bool:
142 """Return True if node is a ClassVar, with or without subscripting."""
143 try:
144 inferred = next(node.infer())
145 except (InferenceError, StopIteration):
146 return False
147
148 return getattr(inferred, "name", "") == "ClassVar"