Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

# ***** BEGIN LICENSE BLOCK ***** 

# Version: MPL 1.1/GPL 2.0/LGPL 2.1 

# 

# The contents of this file are subject to the Mozilla Public License Version 

# 1.1 (the "License"); you may not use this file except in compliance with 

# the License. You may obtain a copy of the License at 

# http://www.mozilla.org/MPL/ 

# 

# Software distributed under the License is distributed on an "AS IS" basis, 

# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 

# for the specific language governing rights and limitations under the 

# License. 

# 

# The Original Code is configman 

# 

# The Initial Developer of the Original Code is 

# Mozilla Foundation 

# Portions created by the Initial Developer are Copyright (C) 2011 

# the Initial Developer. All Rights Reserved. 

# 

# Contributor(s): 

#    K Lars Lohn, lars@mozilla.com 

#    Peter Bengtsson, peterbe@mozilla.com 

# 

# Alternatively, the contents of this file may be used under the terms of 

# either the GNU General Public License Version 2 or later (the "GPL"), or 

# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 

# in which case the provisions of the GPL or the LGPL are applicable instead 

# of those above. If you wish to allow use of your version of this file only 

# under the terms of either the GPL or the LGPL, and not to allow others to 

# use your version of this file under the terms of the MPL, indicate your 

# decision by deleting the provisions above and replace them with the notice 

# and other provisions required by the GPL or the LGPL. If you do not delete 

# the provisions above, a recipient may use your version of this file under 

# the terms of any one of the MPL, the GPL or the LGPL. 

# 

# ***** END LICENSE BLOCK ***** 

 

import sys 

import re 

import datetime 

import types 

import inspect 

 

import datetime_util as dtu 

 

 

#------------------------------------------------------------------------------ 

def option_value_str(an_option): 

    """return an instance of Option's value as a string. 

 

    The option instance doesn't actually have to be from the Option class. All 

    it requires is that the passed option instance has a ``value`` attribute. 

    """ 

    if an_option.value is None: 

        return '' 

    try: 

        converter = to_string_converters[type(an_option.value)] 

        s = converter(an_option.value) 

    except KeyError: 

        if not isinstance(an_option.value, basestring): 

            s = unicode(an_option.value) 

        else: 

            s = an_option.value 

    if an_option.from_string_converter in converters_requiring_quotes: 

        s = "'''%s'''" % s 

    return s 

 

 

#------------------------------------------------------------------------------ 

def str_dict_keys(a_dict): 

    """return a modified dict where all the keys that are anything but str get 

    converted to str. 

    E.g. 

 

      >>> result = str_dict_keys({u'name': u'Peter', u'age': 99, 1: 2}) 

      >>> # can't compare whole dicts in doctests 

      >>> result['name'] 

      u'Peter' 

      >>> result['age'] 

      99 

      >>> result[1] 

      2 

 

    The reason for this is that in Python <= 2.6.4 doing 

    ``MyClass(**{u'name': u'Peter'})`` would raise a TypeError 

 

    Note that only unicode types are converted to str types. 

    The reason for that is you might have a class that looks like this:: 

 

        class Option(object): 

            def __init__(self, foo=None, bar=None, **kwargs): 

                ... 

 

    And it's being used like this:: 

 

        Option(**{u'foo':1, u'bar':2, 3:4}) 

 

    Then you don't want to change that {3:4} part which becomes part of 

    `**kwargs` inside the __init__ method. 

    Using integers as parameter keys is a silly example but the point is that 

    due to the python 2.6.4 bug only unicode keys are converted to str. 

    """ 

    new_dict = {} 

    for key in a_dict: 

        if isinstance(key, unicode): 

            new_dict[str(key)] = a_dict[key] 

        else: 

            new_dict[key] = a_dict[key] 

    return new_dict 

 

 

#------------------------------------------------------------------------------ 

def io_converter(input_str): 

    """ a conversion function for to select stdout, stderr or open a file for 

    writing""" 

    if type(input_str) is str: 

        input_str_lower = input_str.lower() 

        if input_str_lower == 'stdout': 

            return sys.stdout 

        if input_str_lower == 'stderr': 

            return sys.stderr 

        return open(input_str, "w") 

    return input_str 

 

 

#------------------------------------------------------------------------------ 

def timedelta_converter(input_str): 

    """a conversion function for time deltas""" 

    if isinstance(input_str, basestring): 

        days, hours, minutes, seconds = 0, 0, 0, 0 

        details = input_str.split(':') 

        if len(details) >= 4: 

            days = int(details[-4]) 

        if len(details) >= 3: 

            hours = int(details[-3]) 

        if len(details) >= 2: 

            minutes = int(details[-2]) 

        if len(details) >= 1: 

            seconds = int(details[-1]) 

        return datetime.timedelta(days=days, 

                                      hours=hours, 

                                      minutes=minutes, 

                                      seconds=seconds) 

    raise ValueError(input_str) 

 

 

#------------------------------------------------------------------------------ 

def boolean_converter(input_str): 

    """ a conversion function for boolean 

    """ 

    return input_str.lower() in ("true", "t", "1", "y", "yes") 

 

 

#------------------------------------------------------------------------------ 

import __builtin__ 

_all_named_builtins = dir(__builtin__) 

 

 

def class_converter(input_str): 

    """ a conversion that will import a module and class name 

    """ 

    if not input_str: 

        return None 

    if '.' not in input_str and input_str in _all_named_builtins: 

        return eval(input_str) 

    parts = input_str.split('.') 

    try: 

        # first try as a complete module 

        package = __import__(input_str) 

    except ImportError: 

        # it must be a class from a module 

        if len(parts) == 1: 

            # since it has only one part, it must be a class from __main__ 

            parts = ('__main__', input_str) 

        package = __import__('.'.join(parts[:-1]), globals(), locals(), []) 

    obj = package 

    for name in parts[1:]: 

        obj = getattr(obj, name) 

    return obj 

 

 

#------------------------------------------------------------------------------ 

def regex_converter(input_str): 

    return re.compile(input_str) 

 

compiled_regexp_type = type(re.compile(r'x')) 

 

#------------------------------------------------------------------------------ 

from_string_converters = {int: int, 

                          float: float, 

                          str: str, 

                          unicode: unicode, 

                          bool: boolean_converter, 

                          datetime.datetime: dtu.datetime_from_ISO_string, 

                          datetime.date: dtu.date_from_ISO_string, 

                          datetime.timedelta: timedelta_converter, 

                          type: class_converter, 

                          types.FunctionType: class_converter, 

                          compiled_regexp_type: regex_converter, 

                          } 

 

 

#------------------------------------------------------------------------------ 

def py_obj_to_str(a_thing): 

    if a_thing is None: 

        return '' 

    if inspect.ismodule(a_thing): 

        return a_thing.__name__ 

    if a_thing.__module__ == '__builtin__': 

        return a_thing.__name__ 

    if a_thing.__module__ == "__main__": 

        return a_thing.__name__ 

    return "%s.%s" % (a_thing.__module__, a_thing.__name__) 

 

 

#------------------------------------------------------------------------------ 

to_string_converters = {int: str, 

                        float: str, 

                        str: str, 

                        unicode: unicode, 

                        bool: lambda x: 'True' if x else 'False', 

                        datetime.datetime: dtu.datetime_to_ISO_string, 

                        datetime.date: dtu.date_to_ISO_string, 

                        datetime.timedelta: dtu.timedelta_to_str, 

                        type: py_obj_to_str, 

                        types.FunctionType: py_obj_to_str, 

                        compiled_regexp_type: lambda x: x.pattern, 

                        } 

 

 

#------------------------------------------------------------------------------ 

#converters_requiring_quotes = [eval, eval_to_regex_converter] 

converters_requiring_quotes = [eval, regex_converter]