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

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 astroid import arguments, inference_tip, nodes 

8from astroid.context import InferenceContext 

9from astroid.exceptions import UseInferenceDefault 

10from astroid.manager import AstroidManager 

11 

12 

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() 

18 

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(),)) 

36 

37 

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 

47 

48 

49AstroidManager().register_transform( 

50 nodes.Call, inference_tip(infer_namespace), _looks_like_namespace 

51)