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_functools,
47 brain_gi,
48 brain_hashlib,
49 brain_http,
50 brain_hypothesis,
51 brain_io,
52 brain_mechanize,
53 brain_multiprocessing,
54 brain_namedtuple_enum,
55 brain_numpy_core_einsumfunc,
56 brain_numpy_core_fromnumeric,
57 brain_numpy_core_function_base,
58 brain_numpy_core_multiarray,
59 brain_numpy_core_numeric,
60 brain_numpy_core_numerictypes,
61 brain_numpy_core_umath,
62 brain_numpy_ma,
63 brain_numpy_ndarray,
64 brain_numpy_random_mtrand,
65 brain_pathlib,
66 brain_pkg_resources,
67 brain_pytest,
68 brain_qt,
69 brain_random,
70 brain_re,
71 brain_regex,
72 brain_responses,
73 brain_scipy_signal,
74 brain_signal,
75 brain_six,
76 brain_sqlalchemy,
77 brain_ssl,
78 brain_statistics,
79 brain_subprocess,
80 brain_threading,
81 brain_type,
82 brain_typing,
83 brain_unittest,
84 brain_uuid,
85 )
86
87 brain_argparse.register(manager)
88 brain_attrs.register(manager)
89 brain_boto3.register(manager)
90 brain_builtin_inference.register(manager)
91 brain_collections.register(manager)
92 brain_crypt.register(manager)
93 brain_ctypes.register(manager)
94 brain_curses.register(manager)
95 brain_dataclasses.register(manager)
96 brain_datetime.register(manager)
97 brain_dateutil.register(manager)
98 brain_functools.register(manager)
99 brain_gi.register(manager)
100 brain_hashlib.register(manager)
101 brain_http.register(manager)
102 brain_hypothesis.register(manager)
103 brain_io.register(manager)
104 brain_mechanize.register(manager)
105 brain_multiprocessing.register(manager)
106 brain_namedtuple_enum.register(manager)
107 brain_numpy_core_einsumfunc.register(manager)
108 brain_numpy_core_fromnumeric.register(manager)
109 brain_numpy_core_function_base.register(manager)
110 brain_numpy_core_multiarray.register(manager)
111 brain_numpy_core_numerictypes.register(manager)
112 brain_numpy_core_umath.register(manager)
113 brain_numpy_random_mtrand.register(manager)
114 brain_numpy_ma.register(manager)
115 brain_numpy_ndarray.register(manager)
116 brain_numpy_core_numeric.register(manager)
117 brain_pathlib.register(manager)
118 brain_pkg_resources.register(manager)
119 brain_pytest.register(manager)
120 brain_qt.register(manager)
121 brain_random.register(manager)
122 brain_re.register(manager)
123 brain_regex.register(manager)
124 brain_responses.register(manager)
125 brain_scipy_signal.register(manager)
126 brain_signal.register(manager)
127 brain_six.register(manager)
128 brain_sqlalchemy.register(manager)
129 brain_ssl.register(manager)
130 brain_statistics.register(manager)
131 brain_subprocess.register(manager)
132 brain_threading.register(manager)
133 brain_type.register(manager)
134 brain_typing.register(manager)
135 brain_unittest.register(manager)
136 brain_uuid.register(manager)
137
138
139def is_class_var(node: NodeNG) -> bool:
140 """Return True if node is a ClassVar, with or without subscripting."""
141 try:
142 inferred = next(node.infer())
143 except (InferenceError, StopIteration):
144 return False
145
146 return getattr(inferred, "name", "") == "ClassVar"