skytools.dedent: new function for removing indent
authorMarko Kreen <markokr@gmail.com>
Fri, 4 Nov 2011 12:00:15 +0000 (14:00 +0200)
committerMarko Kreen <markokr@gmail.com>
Fri, 4 Nov 2011 12:00:15 +0000 (14:00 +0200)
extract code from .print_ini and make usable elsewhere too.

python/skytools/__init__.py
python/skytools/parsing.py
python/skytools/scripting.py

index 22d683002040c8ac90f1e15e1f5af7040bbd12eb..661d3546a33fbfefea9b828600142219670af917 100644 (file)
@@ -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',
index 5f6ab9ade0b4f8ec7e701f647b700b456fd303b7..ec40550ed57a28cea354e7949d5fa606adb575b9 100644 (file)
@@ -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()
index d671954ded2d9e7b7bbc83d8483321a7e1a0ae0c..6d19d223b17ac04246c3ef8de5242c62c2a1556b 100644 (file)
@@ -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):