summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartinko2012-02-17 09:43:22 +0000
committermartinko2012-02-17 09:43:22 +0000
commitcc6358bca8445898441af6883fa0357a3a695cc5 (patch)
treee9847537ec3c36ebfd299ac34b4438d917a6236c
parentb013f553319e0e2db7db2a5de0080ad23d2101cf (diff)
added support for sizes specified in human readable format
Config options that hold size in bytes can now be specified in human readable format. Examples: 1, 2 B, 3K, 4 MB
-rw-r--r--python/skytools/__init__.py1
-rw-r--r--python/skytools/config.py15
-rw-r--r--python/skytools/parsing.py17
3 files changed, 30 insertions, 3 deletions
diff --git a/python/skytools/__init__.py b/python/skytools/__init__.py
index 51d4e26c..6bdeb51e 100644
--- a/python/skytools/__init__.py
+++ b/python/skytools/__init__.py
@@ -33,6 +33,7 @@ _symbols = {
'gzip_append': 'skytools.gzlog:gzip_append',
# skytools.parsing
'dedent': 'skytools.parsing:dedent',
+ 'hsize_to_bytes': 'skytools.parsing:hsize_to_bytes',
'parse_acl': 'skytools.parsing:parse_acl',
'parse_logtriga_sql': 'skytools.parsing:parse_logtriga_sql',
'parse_pgarray': 'skytools.parsing:parse_pgarray',
diff --git a/python/skytools/config.py b/python/skytools/config.py
index 9f19306f..3e58139b 100644
--- a/python/skytools/config.py
+++ b/python/skytools/config.py
@@ -3,6 +3,8 @@
import os, os.path, ConfigParser, socket
+import skytools
+
__all__ = ['Config']
class Config(object):
@@ -161,6 +163,19 @@ class Config(object):
return fn
+ def getbytes(self, key, default=None):
+ """Reads a size value in human format, if not set then default.
+
+ Examples: 1, 2 B, 3K, 4 MB
+ """
+ try:
+ s = self.cf.get(self.main_section, key)
+ except ConfigParser.NoOptionError:
+ if default is None:
+ raise Exception("Config value not set: " + key)
+ s = default
+ return skytools.hsize_to_bytes(s)
+
def get_wildcard(self, key, values=[], default=None):
"""Reads a wildcard property from conf and returns its string value, if not set then default."""
diff --git a/python/skytools/parsing.py b/python/skytools/parsing.py
index ec40550e..c7061ed4 100644
--- a/python/skytools/parsing.py
+++ b/python/skytools/parsing.py
@@ -7,7 +7,7 @@ import skytools
__all__ = [
"parse_pgarray", "parse_logtriga_sql", "parse_tabbed_table",
"parse_statements", 'sql_tokenizer', 'parse_sqltriga_sql',
- "parse_acl", "dedent"]
+ "parse_acl", "dedent", "hsize_to_bytes"]
_rc_listelem = re.compile(r'( [^,"}]+ | ["] ( [^"\\]+ | [\\]. )* ["] )', re.X)
@@ -219,7 +219,7 @@ def parse_sqltriga_sql(op, sql, pklist=None, splitkeys=False):
def parse_tabbed_table(txt):
r"""Parse a tab-separated table into list of dicts.
-
+
Expect first row to be column names.
Very primitive.
@@ -434,7 +434,18 @@ def dedent(doc):
res.append('')
return '\n'.join(res)
+
+def hsize_to_bytes (input):
+ """ Convert sizes from human format to bytes (string to integer) """
+
+ assert isinstance (input, str)
+ m = re.match (r"^([0-9]+) *([KMGTPEZY]?)B?$", input.strip(), re.IGNORECASE)
+ if not m: raise ValueError ("cannot parse: %s" % input)
+ units = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']
+ bytes = int(m.group(1)) * 1024 ** units.index(m.group(2).upper())
+ return bytes
+
+
if __name__ == '__main__':
import doctest
doctest.testmod()
-