Hide keyboard shortcuts

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

# 

# LSST Data Management System 

# Copyright 2008, 2009, 2010 LSST Corporation. 

# 

# This product includes software developed by the 

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

# 

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

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

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

# (at your option) any later version. 

# 

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

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

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

# GNU General Public License for more details. 

# 

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

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

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

# 

from .config import Field, _typeStr 

from .callStack import getStackFrame 

 

 

__all__ = ["RangeField"] 

 

 

class RangeField(Field): 

""" 

Defines a Config Field which allows only a range of values. 

The range is defined by providing min and/or max values. 

If min or max is None, the range will be open in that direction 

If inclusive[Min|Max] is True the range will include the [min|max] value 

 

""" 

 

supportedTypes = set((int, float)) 

 

def __init__(self, doc, dtype, default=None, optional=False, 

min=None, max=None, inclusiveMin=True, inclusiveMax=False): 

42 ↛ 43line 42 didn't jump to line 43, because the condition on line 42 was never true if dtype not in self.supportedTypes: 

raise ValueError("Unsupported RangeField dtype %s" % (_typeStr(dtype))) 

source = getStackFrame() 

45 ↛ 46line 45 didn't jump to line 46, because the condition on line 45 was never true if min is None and max is None: 

raise ValueError("min and max cannot both be None") 

 

48 ↛ 49line 48 didn't jump to line 49, because the condition on line 48 was never true if min is not None and max is not None: 

if min > max: 

raise ValueError("min = %s > %s = max" % (min, max)) 

elif min == max and not (inclusiveMin and inclusiveMax): 

raise ValueError("min = max = %s and min and max not both inclusive" % (min,)) 

 

self.min = min 

self.max = max 

 

57 ↛ 58line 57 didn't jump to line 58, because the condition on line 57 was never true if inclusiveMax: 

self.maxCheck = lambda x, y: True if y is None else x <= y 

else: 

60 ↛ exitline 60 didn't run the lambda on line 60 self.maxCheck = lambda x, y: True if y is None else x < y 

61 ↛ 64line 61 didn't jump to line 64, because the condition on line 61 was never false if inclusiveMin: 

62 ↛ exitline 62 didn't run the lambda on line 62 self.minCheck = lambda x, y: True if y is None else x >= y 

else: 

self.minCheck = lambda x, y: True if y is None else x > y 

self._setup(doc, dtype=dtype, default=default, check=None, optional=optional, source=source) 

self.rangeString = "%s%s,%s%s" % \ 

(("[" if inclusiveMin else "("), 

("-inf" if self.min is None else self.min), 

("inf" if self.max is None else self.max), 

("]" if inclusiveMax else ")")) 

self.__doc__ += "\n\nValid Range = " + self.rangeString 

 

def _validateValue(self, value): 

Field._validateValue(self, value) 

if not self.minCheck(value, self.min) or \ 

not self.maxCheck(value, self.max): 

msg = "%s is outside of valid range %s" % (value, self.rangeString) 

raise ValueError(msg)