summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2011-11-04 12:00:15 +0000
committerMarko Kreen2011-11-04 12:00:15 +0000
commit073b183cafb5f3d40ff495b4291aa0a616646712 (patch)
treed4e8c4c7aec5c96845f8b6cf5323230fa13b3f25
parentb313b88013f8427f2dacb160e5bc84895793e4cb (diff)
skytools.dedent: new function for removing indent
extract code from .print_ini and make usable elsewhere too.
-rw-r--r--python/skytools/__init__.py1
-rw-r--r--python/skytools/parsing.py34
-rw-r--r--python/skytools/scripting.py17
3 files changed, 36 insertions, 16 deletions
diff --git a/python/skytools/__init__.py b/python/skytools/__init__.py
index 22d68300..661d3546 100644
--- a/python/skytools/__init__.py
+++ b/python/skytools/__init__.py
@@ -83,6 +83,7 @@ _symbols = {
'parse_statements': 'skytools.parsing:parse_statements',
'parse_tabbed_table': 'skytools.parsing:parse_tabbed_table',
'sql_tokenizer': 'skytools.parsing:sql_tokenizer',
+ 'dedent': 'skytools.parsing:dedent',
# skytools.dbstruct
'SeqStruct': 'skytools.dbstruct:SeqStruct',
'TableStruct': 'skytools.dbstruct:TableStruct',
diff --git a/python/skytools/parsing.py b/python/skytools/parsing.py
index 5f6ab9ad..ec40550e 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"]
+ "parse_acl", "dedent"]
_rc_listelem = re.compile(r'( [^,"}]+ | ["] ( [^"\\]+ | [\\]. )* ["] )', re.X)
@@ -402,6 +402,38 @@ def parse_acl(acl):
return (target, perm, owner)
+
+def dedent(doc):
+ r"""Relaxed dedent.
+
+ - takes whitespace to be removed from first indented line.
+ - allows empty or non-indented lines at the start
+ - allows first line to be unindented
+ - skips empty lines at the start
+ - ignores indent of empty lines
+ - if line does not match common indent, is stays unchanged
+
+ >>> dedent(' Line1:\n Line 2\n')
+ 'Line1:\n Line 2\n'
+ >>> dedent(' \nLine1:\n Line 2\n Line 3\n Line 4')
+ 'Line1:\nLine 2\n Line 3\n Line 4\n'
+ """
+ pfx = None
+ res = []
+ for ln in doc.splitlines():
+ ln = ln.rstrip()
+ if not pfx and len(res) < 2:
+ if not ln:
+ continue
+ wslen = len(ln) - len(ln.lstrip())
+ pfx = ln[ : wslen]
+ if pfx:
+ if ln.startswith(pfx):
+ ln = ln[ len(pfx) : ]
+ res.append(ln)
+ res.append('')
+ return '\n'.join(res)
+
if __name__ == '__main__':
import doctest
doctest.testmod()
diff --git a/python/skytools/scripting.py b/python/skytools/scripting.py
index d671954d..6d19d223 100644
--- a/python/skytools/scripting.py
+++ b/python/skytools/scripting.py
@@ -188,7 +188,6 @@ def _init_log(job_name, service_name, cf, log_level, is_daemon):
return log
-
class BaseScript(object):
"""Base class for service scripts.
@@ -323,24 +322,12 @@ class BaseScript(object):
def _print_ini_frag(self, doc):
# use last '::' block as config template
- pos = doc and doc.rfind('::') or -1
+ pos = doc and doc.rfind('::\n') or -1
if pos < 0:
return
doc = doc[pos+2 : ].rstrip()
- # and remove same prefix from all the following lines
- pfx = None
- for ln in doc.splitlines():
- if not pfx:
- if not ln.strip():
- continue
- wslen = len(ln) - len(ln.lstrip())
- pfx = ln[ : wslen]
- if pfx:
- if ln.startswith(pfx):
- print(ln[ len(pfx) : ])
- else:
- print(ln)
+ print(skytools.dedent(doc))
print('')
def load_config(self):