Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/astroid/brain/brain_argparse.py: 52%
23 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:53 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:53 +0000
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
5from __future__ import annotations
7from astroid import arguments, inference_tip, nodes
8from astroid.context import InferenceContext
9from astroid.exceptions import UseInferenceDefault
10from astroid.manager import AstroidManager
13def infer_namespace(node, context: InferenceContext | None = None):
14 callsite = arguments.CallSite.from_call(node, context=context)
15 if not callsite.keyword_arguments:
16 # Cannot make sense of it.
17 raise UseInferenceDefault()
19 class_node = nodes.ClassDef(
20 "Namespace",
21 lineno=node.lineno,
22 col_offset=node.col_offset,
23 parent=nodes.Unknown(),
24 end_lineno=node.end_lineno,
25 end_col_offset=node.end_col_offset,
26 )
27 # Set parent manually until ClassDef constructor fixed:
28 # https://github.com/pylint-dev/astroid/issues/1490
29 class_node.parent = node.parent
30 for attr in set(callsite.keyword_arguments):
31 fake_node = nodes.EmptyNode()
32 fake_node.parent = class_node
33 fake_node.attrname = attr
34 class_node.instance_attrs[attr] = [fake_node]
35 return iter((class_node.instantiate_class(),))
38def _looks_like_namespace(node) -> bool:
39 func = node.func
40 if isinstance(func, nodes.Attribute):
41 return (
42 func.attrname == "Namespace"
43 and isinstance(func.expr, nodes.Name)
44 and func.expr.name == "argparse"
45 )
46 return False
49AstroidManager().register_transform(
50 nodes.Call, inference_tip(infer_namespace), _looks_like_namespace
51)