iro/config.py
author Sandro Knauß <bugs@sandroknauss.de>
Tue, 15 Apr 2025 01:19:47 +0200
changeset 312 42fd5075a5d1
parent 306 b31978c0c043
permissions -rw-r--r--
2to3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 287
diff changeset
    21
228
944edbe51145 setup.py updated - using iro.py
Sandro Knauß <knauss@netzguerilla.net>
parents: 224
diff changeset
    22
from twisted.python import log
944edbe51145 setup.py updated - using iro.py
Sandro Knauß <knauss@netzguerilla.net>
parents: 224
diff changeset
    23
306
b31978c0c043 suche auch im Homeverzeichnis nach config Datei.
hefee
parents: 294
diff changeset
    24
import os.path
312
Sandro Knauß <bugs@sandroknauss.de>
parents: 306
diff changeset
    25
from configparser import ConfigParser
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    26
import signal
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    27
from functools import partial
282
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 269
diff changeset
    28
try:
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 269
diff changeset
    29
    from collections import OrderedDict
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 269
diff changeset
    30
except ImportError:
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 269
diff changeset
    31
    from ordereddict import OrderedDict
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    32
312
Sandro Knauß <bugs@sandroknauss.de>
parents: 306
diff changeset
    33
from .validate import vInteger
Sandro Knauß <bugs@sandroknauss.de>
parents: 306
diff changeset
    34
from .error import NeededOption
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    36
class MyConfigParser(ConfigParser):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    37
    """Configparser that also validate configfile.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    38
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    39
    It is possile to restiger function, that are called, when config file is reloaded
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    40
    """
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
    def __init__(self):
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
        ConfigParser.__init__(self)
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        self.reloadList=[]
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    45
    def read(self,files):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    46
        """reads an validate configuration file"""
184
6b0ff82dff81 testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents: 179
diff changeset
    47
        from offer import getProvider
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    48
        r = ConfigParser.read(self, files)
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    49
        for s in self.sections():
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    50
            if s == "main":
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    51
                main.validate(self.items(s))
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    52
            else:
184
6b0ff82dff81 testing Must argument and Provider section
Sandro Knauß <knauss@netzguerilla.net>
parents: 179
diff changeset
    53
                getProvider("tmp", self.get(s,'typ'), self.items(s))
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    54
        return r
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    55
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    56
    def reload_(self):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    57
        """run all registered function."""
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    58
        for f in self.reloadList:
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
            f()
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
    def registerReload(self, func):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    62
        """adds **func** to reloadList.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    63
        
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    64
        func ist called with no arguments.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    65
        """
147
e96e50ae6352 adding config module
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
        self.reloadList.append(func)
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    67
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    68
class Option():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    69
    """One Option in the configuration file"""
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    70
    def __init__(self, validate, long="", help="", must=False, default=None):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    71
        """
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    72
        :param func validate: a validate function, it has to return the value, if valid and raise an error if not.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    73
        :param string long: long description
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    74
        :param string help: the help text
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    75
        :param boolean must: Is this option nessasary
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    76
        :param default: default value
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    77
        """
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    78
        self.validate = validate
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    79
        self.long=long
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    80
        self.help = help
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    81
        self.must = must
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    82
        self.default = default
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
    83
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
    84
class Config:
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    85
    """Base class for all classes, that uses option from configfile.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    86
    
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    87
    If one option is valid, the attribute is created with the value of the validate function.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    88
    """
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    89
    def __init__(self, name, options=None):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    90
        """
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    91
        :param string name: section name.
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    92
        :param `collections.OrderedDict` options: Orderd Dict of the configuration options (see :attr:`options`) 
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    93
        """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
    94
        self.name = name
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    95
        
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    96
        self.options = options
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
    97
        """Options :class:`collections.OrderedDict` for Options used in configuration file (see :class:`iro.config.Option`). Ordering of configuration fields are done by :attr:`order`. 
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    98
        
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
    99
        Sample::
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   100
        
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   101
            OrderedDict([
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   102
                ("dburl",Option(lambda x,y:x,long="Connection URL to database",must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   103
                ("port",Option(partial(vInteger,minv=0),long="Port under that twisted is running",must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   104
            ])
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   105
        
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   106
        A child class typically use update to add more options.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   107
        """
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   108
        
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   109
        self._init = True
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   110
        """indecates, if the config is loaded with config values."""
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   111
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   112
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   113
    def _read(self, cfg, write=False):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   114
        """Test or set configuration options.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   115
        
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   116
        :param dict cfg: The Configuration dict. Normally you use ``configParser.items("section")``.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   117
        :param boolean write: test or set the option to actual object.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   118
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   119
        :raises: :exc:`iro.error.NeededOption`
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   120
        """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   121
        c = dict(cfg)
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   122
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   123
        for o in self.options:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   124
            option = self.options[o]
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   125
            try:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   126
                value = option.validate(c[o],o)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   127
                if write:
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   128
                    self._init = False
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   129
                    setattr(self,o,value)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   130
            except KeyError:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   131
                if option.must:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   132
                    raise NeededOption(self.name, o)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   133
                elif write and option.default is not None:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   134
                    setattr(self, o, option.default)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   135
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   136
    def validate(self, cfg):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   137
        """Validate configuration.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   138
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   139
        :param dict cfg: The Configuration dict. Normally you use ``configParser.items("section")``.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   140
        """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   141
        self._read(cfg, False)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   142
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   143
    def load(self, cfg):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   144
        """Loads configuration into object.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   145
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   146
        :param dict cfg: The Configuration dict. Normally you use ``configParser.items("section")``.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   147
        """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   148
        self._read(cfg, True)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   149
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   150
    def same(self, other):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   151
        """returns ``True``, if the options of other object are the same"""
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   152
        for o in self.options:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   153
            if getattr(self,o) != getattr(other,o):
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   154
                return False
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   155
        else:
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   156
            return True
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   157
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   158
    def sampleConf(self):
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   159
        """returns a sample Configuration section.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   160
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   161
        This function also adds the long help text to the sample section.
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   162
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   163
        :return: a list of lines
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   164
        """
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   165
        ret=[]
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   166
        for o in self.options:
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   167
            opt=self.options[o]
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   168
            if opt.long:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   169
                ret.append("# "+opt.long)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   170
            if opt.must:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   171
                s= "%s = "%o
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   172
                if opt.default is not None:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   173
                    s += str(opt.default)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   174
                ret.append(s)
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   175
            else:
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   176
                ret.append("# %s = %s"%(o,opt.default))
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   177
            ret.append("")
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   178
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   179
        return ["[%s]"%self.name,]+ret
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 188
diff changeset
   180
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   181
def readConfig():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   182
    """Read the configuration and update all registered object (see :meth:`MyConfigParser.reload_`)."""
228
944edbe51145 setup.py updated - using iro.py
Sandro Knauß <knauss@netzguerilla.net>
parents: 224
diff changeset
   183
    log.msg("Reading configs.")
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   184
    configParser.read(confFiles)
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   185
    configParser.reload_()
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   186
    if main._init:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   187
        main.load(configParser.items("main"))
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   188
    else:
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   189
        m = Config("main", main_options)
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   190
        m.load(configParser.items("main"))
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   191
        if not main.same(m):
188
4d6130d91e56 test for config.same
Sandro Knauß <knauss@netzguerilla.net>
parents: 187
diff changeset
   192
            raise Exception("Main options can't be reloaded, please restart your Application.")
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   193
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   194
def init():
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   195
    """Load the main options."""
224
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   196
    configParser.read(confFiles)
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   197
    main.load(configParser.items("main"))
072de50834f9 adding init function that only loads main options
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   198
179
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   199
def registerSignal():
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   200
    '''register readConfig to SIGUSR2'''
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   201
    def rC(signal, frame):
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   202
        readConfig()
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   203
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   204
    signal.signal(signal.SIGUSR2,rC)
af65fcbd59d5 start with implementing iro.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 147
diff changeset
   205
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   206
configParser = MyConfigParser()
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   207
"""configParser to get configuration."""
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   208
306
b31978c0c043 suche auch im Homeverzeichnis nach config Datei.
hefee
parents: 294
diff changeset
   209
confFiles=["iro.conf", os.path.expanduser("~/.iro.conf"),"/etc/iro/iro.conf"]
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   210
"""Configfile list """
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 184
diff changeset
   211
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   212
main_options = OrderedDict([
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   213
    ("dburl",Option(lambda x,y:x,long="Connection URL to database",must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   214
    ("port",Option(partial(vInteger,minv=0),long="Port under that twisted is running",must=True)),
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   215
    ])
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   216
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   217
"options for main section"
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   218
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 267
diff changeset
   219
main = Config("main", main_options)
267
ef2df3f23cb1 adding docstring: iro
Sandro Knauß <knauss@netzguerilla.net>
parents: 228
diff changeset
   220
"""Main config options"""