Statistics
| Branch: | Tag: | Revision:

root / lib / ht.py @ 62e0e880

History | View | Annotate | Download (3.7 kB)

1
#
2
#
3

    
4
# Copyright (C) 2010 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Module implementing the parameter types code."""
23

    
24
from ganeti import compat
25

    
26
# Modifiable default values; need to define these here before the
27
# actual LUs
28

    
29
def EmptyList():
30
  """Returns an empty list.
31

32
  """
33
  return []
34

    
35

    
36
def EmptyDict():
37
  """Returns an empty dict.
38

39
  """
40
  return {}
41

    
42

    
43
#: The without-default default value
44
NoDefault = object()
45

    
46

    
47
#: The no-type (value to complex to check it in the type system)
48
NoType = object()
49

    
50

    
51
# Some basic types
52
def TNotNone(val):
53
  """Checks if the given value is not None.
54

55
  """
56
  return val is not None
57

    
58

    
59
def TNone(val):
60
  """Checks if the given value is None.
61

62
  """
63
  return val is None
64

    
65

    
66
def TBool(val):
67
  """Checks if the given value is a boolean.
68

69
  """
70
  return isinstance(val, bool)
71

    
72

    
73
def TInt(val):
74
  """Checks if the given value is an integer.
75

76
  """
77
  return isinstance(val, int)
78

    
79

    
80
def TFloat(val):
81
  """Checks if the given value is a float.
82

83
  """
84
  return isinstance(val, float)
85

    
86

    
87
def TString(val):
88
  """Checks if the given value is a string.
89

90
  """
91
  return isinstance(val, basestring)
92

    
93

    
94
def TTrue(val):
95
  """Checks if a given value evaluates to a boolean True value.
96

97
  """
98
  return bool(val)
99

    
100

    
101
def TElemOf(target_list):
102
  """Builds a function that checks if a given value is a member of a list.
103

104
  """
105
  return lambda val: val in target_list
106

    
107

    
108
# Container types
109
def TList(val):
110
  """Checks if the given value is a list.
111

112
  """
113
  return isinstance(val, list)
114

    
115

    
116
def TDict(val):
117
  """Checks if the given value is a dictionary.
118

119
  """
120
  return isinstance(val, dict)
121

    
122

    
123
def TIsLength(size):
124
  """Check is the given container is of the given size.
125

126
  """
127
  return lambda container: len(container) == size
128

    
129

    
130
# Combinator types
131
def TAnd(*args):
132
  """Combine multiple functions using an AND operation.
133

134
  """
135
  def fn(val):
136
    return compat.all(t(val) for t in args)
137
  return fn
138

    
139

    
140
def TOr(*args):
141
  """Combine multiple functions using an AND operation.
142

143
  """
144
  def fn(val):
145
    return compat.any(t(val) for t in args)
146
  return fn
147

    
148

    
149
def TMap(fn, test):
150
  """Checks that a modified version of the argument passes the given test.
151

152
  """
153
  return lambda val: test(fn(val))
154

    
155

    
156
# Type aliases
157

    
158
#: a non-empty string
159
TNonEmptyString = TAnd(TString, TTrue)
160

    
161

    
162
#: a maybe non-empty string
163
TMaybeString = TOr(TNonEmptyString, TNone)
164

    
165

    
166
#: a maybe boolean (bool or none)
167
TMaybeBool = TOr(TBool, TNone)
168

    
169

    
170
#: a positive integer
171
TPositiveInt = TAnd(TInt, lambda v: v >= 0)
172

    
173
#: a strictly positive integer
174
TStrictPositiveInt = TAnd(TInt, lambda v: v > 0)
175

    
176

    
177
def TListOf(my_type):
178
  """Checks if a given value is a list with all elements of the same type.
179

180
  """
181
  return TAnd(TList,
182
               lambda lst: compat.all(my_type(v) for v in lst))
183

    
184

    
185
def TDictOf(key_type, val_type):
186
  """Checks a dict type for the type of its key/values.
187

188
  """
189
  return TAnd(TDict,
190
              lambda my_dict: (compat.all(key_type(v) for v in my_dict.keys())
191
                               and compat.all(val_type(v)
192
                                              for v in my_dict.values())))