summaryrefslogtreecommitdiff
path: root/coverage/config.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2012-11-25 17:16:59 -0500
committerNed Batchelder <ned@nedbatchelder.com>2012-11-25 17:16:59 -0500
commit8416ddba416b9a4c12fb1033101bbca9d11ac8ca (patch)
treee2fab0b701bc7d9c8de4f7d3e4a65a9079508492 /coverage/config.py
parentc33865dc58bf1e0c2aaa9a935d1c8594b844dee3 (diff)
downloadpython-coveragepy-git-8416ddba416b9a4c12fb1033101bbca9d11ac8ca.tar.gz
Config files now can use environment variables. #97.
Diffstat (limited to 'coverage/config.py')
-rw-r--r--coverage/config.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/coverage/config.py b/coverage/config.py
index 8f1f6710..8edd6c65 100644
--- a/coverage/config.py
+++ b/coverage/config.py
@@ -1,6 +1,6 @@
"""Config file for coverage.py"""
-import os, sys
+import os, re, sys
from coverage.backward import string_class, iitems
# In py3, # ConfigParser was renamed to the more-standard configparser
@@ -10,7 +10,7 @@ except ImportError:
import ConfigParser as configparser
-class HandyConfigParser(configparser.ConfigParser):
+class HandyConfigParser(configparser.RawConfigParser):
"""Our specialization of ConfigParser."""
def read(self, filename):
@@ -18,7 +18,28 @@ class HandyConfigParser(configparser.ConfigParser):
kwargs = {}
if sys.version_info >= (3, 2):
kwargs['encoding'] = "utf-8"
- configparser.ConfigParser.read(self, filename, **kwargs)
+ configparser.RawConfigParser.read(self, filename, **kwargs)
+
+ def get(self, *args, **kwargs):
+ v = configparser.RawConfigParser.get(self, *args, **kwargs)
+ def dollar_replace(m):
+ """Called for each $replacement."""
+ # Only one of the groups will have matched, just get its text.
+ word = [w for w in m.groups() if w is not None][0]
+ if word == "$":
+ return "$"
+ else:
+ return os.environ.get(word, '')
+
+ dollar_pattern = r"""(?x) # Use extended regex syntax
+ \$(?: # A dollar sign, then
+ (?P<v1>\w+) | # a plain word,
+ {(?P<v2>\w+)} | # or a {-wrapped word,
+ (?P<char>[$]) # or a dollar sign.
+ )
+ """
+ v = re.sub(dollar_pattern, dollar_replace, v)
+ return v
def getlist(self, section, option):
"""Read a list of strings.