diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2009-10-18 23:15:55 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2009-10-18 23:15:55 +0200 |
commit | 9513aa01fab73f53e4fe18644c7d5b530a66c6a1 (patch) | |
tree | b5f9113b04215d1cc31d91fd7a1ef05e3b90c441 /lib/git/config.py | |
parent | 657a57adbff49c553752254c106ce1d5b5690cf8 (diff) | |
download | gitpython-9513aa01fab73f53e4fe18644c7d5b530a66c6a1.tar.gz |
Added frame for configuration reader involving a meta class, decorators and tests - most of which still has to be filled out
Diffstat (limited to 'lib/git/config.py')
-rw-r--r-- | lib/git/config.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/git/config.py b/lib/git/config.py new file mode 100644 index 00000000..c7f2c398 --- /dev/null +++ b/lib/git/config.py @@ -0,0 +1,100 @@ +# config.py +# Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors +# +# This module is part of GitPython and is released under +# the BSD License: http://www.opensource.org/licenses/bsd-license.php +""" +Module containing module parser implementation able to properly read and write +configuration files +""" + +import re +from ConfigParser import RawConfigParser + +class _MetaParserBuilder(type): + """ + Utlity class wrapping methods into decorators that assure read-only properties + """ + +def _needs_values(func): + """Returns method assuring we read values (on demand) before we try to access them""" + return func + +def _ensure_writable(non_const_func): + """Return method that checks whether given non constant function may be called. + If so, the instance will be set dirty""" + + + +class GitConfigParser(RawConfigParser, object): + """ + Implements specifics required to read git style configuration files. + + This variation behaves much like the git.config command such that the configuration + will be read on demand based on the filepath given during initialization. + + The changes will automatically be written once the instance goes out of scope, but + can be triggered manually as well. + + The configuration file will be locked if you intend to change values preventing other + instances to write concurrently. + """ + __metaclass__ = _MetaParserBuilder + + OPTCRE = re.compile( + r'\s?(?P<option>[^:=\s][^:=]*)' # very permissive, incuding leading whitespace + r'\s*(?P<vi>[:=])\s*' # any number of space/tab, + # followed by separator + # (either : or =), followed + # by any # space/tab + r'(?P<value>.*)$' # everything up to eol + ) + + # list of RawConfigParser methods able to change the instance + _mutating_methods_ = tuple() + + + def __init__(self, file_or_files, read_only=True): + """ + Initialize a configuration reader to read the given file_or_files and to + possibly allow changes to it by setting read_only False + """ + self._file_or_files = file_or_files + self._read_only = read_only + self._is_initialized = False + self._is_dirty = False + + def __del__(self): + """ + Write pending changes if required and release locks + """ + + def read(self): + """ + Read configuration information from our file or files + """ + if self._is_initialized: + return + + self._is_initialized = True + + @_ensure_writable + def write(self): + """ + Write our changes to our file + + Raise + AssertionError if this is a read-only writer instance + """ + if not self._is_dirty: + return + + self._is_dirty = False + + @property + def read_only(self): + """ + Returns + True if this instance may change the configuration file + """ + return self._read_only |