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

# ***** 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 dotdict 

from option import Option, Aggregation 

 

from copy import deepcopy 

 

 

class Namespace(dotdict.DotDict): 

 

    def __init__(self, doc=''): 

        super(Namespace, self).__init__() 

        object.__setattr__(self, '_doc', doc)  # force into attributes 

 

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

    def __deepcopy__(self, memo): 

        # necessary because this class implements its own __setattr__ which 

        # defeats the generic 'deepcopy' function. 

        n = Namespace(doc=self._doc) 

        for k, v in self.iteritems(): 

            n[k] = deepcopy(v) 

        return n 

 

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

    def __setattr__(self, name, value): 

        if isinstance(value, (Option, Namespace, Aggregation)): 

            # then they know what they're doing already 

            o = value 

        else: 

            o = Option(name=name, default=value, value=value) 

        self.__setitem__(name, o) 

 

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

    def add_option(self, name, *args, **kwargs): 

        an_option = Option(name, *args, **kwargs) 

        self[name] = an_option 

 

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

    def add_aggregation(self, name, function): 

        an_aggregation = Aggregation(name, function) 

        self[name] = an_aggregation 

 

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

    def namespace(self, name, doc=''): 

        self[name] = Namespace(doc=doc) 

 

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

    def set_value(self, name, value, strict=True): 

 

        name_parts = name.split('.', 1) 

        prefix = name_parts[0] 

        try: 

            candidate = self[prefix] 

        except KeyError: 

            if strict: 

                raise 

            self[prefix] = candidate = Option(name) 

        candidate_type = type(candidate) 

        if candidate_type == Namespace: 

            candidate.set_value(name_parts[1], value, strict) 

        else: 

            candidate.set_value(value)