Coverage for python / lsstDebug.py: 0%

15 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-14 23:26 +0000

1# 

2# LSST Data Management System 

3# Copyright 2008, 2009, 2010 LSST Corporation. 

4# 

5# This product includes software developed by the 

6# LSST Project (http://www.lsst.org/). 

7# 

8# This program is free software: you can redistribute it and/or modify 

9# it under the terms of the GNU General Public License as published by 

10# the Free Software Foundation, either version 3 of the License, or 

11# (at your option) any later version. 

12# 

13# This program is distributed in the hope that it will be useful, 

14# but WITHOUT ANY WARRANTY; without even the implied warranty of 

15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

16# GNU General Public License for more details. 

17# 

18# You should have received a copy of the LSST License Statement and 

19# the GNU General Public License along with this program. If not, 

20# see <http://www.lsstcorp.org/LegalNotices/>. 

21# 

22__all__ = ("Info", "getDebugFrame") 

23 

24 

25# 

26# Define a class to configure debugging information 

27# 

28class Info: 

29 """An object cognisant of debugging parameters appropriate for module 

30 ``modname``. 

31 

32 Any request for a value will return False unless that value has 

33 been set, either in the module or as an attribute of this object. 

34 

35 E.g. 

36 

37 .. code-block:: python 

38 

39 import lsstDebug 

40 

41 display = lsstDebug.Info(__name__).display 

42 

43 will set display to `False`, unless display has been set with 

44 

45 .. code-block:: python 

46 

47 lsstDebug.Info(__name__).display = True 

48 

49 Why is this interesting? Because you can replace `lsstDebug.Info` with 

50 your own version, e.g. 

51 

52 .. code-block:: python 

53 

54 import lsstDebug 

55 

56 def DebugInfo(name): 

57 # N.b. lsstDebug.Info(name) would call us recursively 

58 di = lsstDebug.getInfo(name) 

59 if name == "foo": 

60 di.display = dict(repair=1, background=2, calibrate=3) 

61 

62 return di 

63 

64 lsstDebug.Info = DebugInfo 

65 

66 Parameters 

67 ---------- 

68 modname : `str` 

69 Module name. 

70 

71 Raises 

72 ------ 

73 KeyError 

74 Raised if ``modname`` is not loaded. 

75 """ 

76 def __init__(self, modname): 

77 import sys 

78 self.__dict__["_dict"] = sys.modules[modname].__dict__ 

79 self._modname = modname 

80 

81 def __getattr__(self, what): 

82 """Return the value of the variable "what" in ``self.__modname`` 

83 if set, else False""" 

84 return self._dict.get(what, False) 

85 

86 def __setattr__(self, what, value): 

87 """Set the value of the variable "what" in ``self.__modname`` 

88 to value""" 

89 self._dict[what] = value 

90 

91 

92getInfo = Info 

93 

94 

95def getDebugFrame(debugDisplay, name): 

96 """ 

97 Attempt to extract a frame for displaying a product called ``name`` 

98 from the ``debugDisplay`` variable. 

99 

100 Per the above, an instance of `Info` can return an arbitrary object 

101 (or nothing) as its ``display`` attribute. It is convenient -- though not 

102 required -- that it be a dictionary mapping data products to frame 

103 numbers, as shown in the `lsstDebug.Info` example. Given such a dictionary, 

104 this function extracts and returns the appropriate frame number. If 

105 ``debugDisplay`` is not a collection, or if ``name`` is not found within 

106 it, we return `None`. 

107 

108 Parameters 

109 ---------- 

110 debugDisplay : `object` 

111 The contents of ``lsstDebug.Info(__name__).display``. 

112 name : `str` 

113 The name of the data product to be displayed. 

114 

115 Returns 

116 ------- 

117 frame : `int` 

118 A frame number, or `None`. 

119 """ 

120 if hasattr(debugDisplay, "__contains__") and name in debugDisplay: 

121 return debugDisplay[name] 

122 else: 

123 return None