diff options
author | Marko Kreen | 2011-11-04 12:00:15 +0000 |
---|---|---|
committer | Marko Kreen | 2011-11-04 12:00:15 +0000 |
commit | 073b183cafb5f3d40ff495b4291aa0a616646712 (patch) | |
tree | d4e8c4c7aec5c96845f8b6cf5323230fa13b3f25 | |
parent | b313b88013f8427f2dacb160e5bc84895793e4cb (diff) |
skytools.dedent: new function for removing indent
extract code from .print_ini and make usable elsewhere too.
-rw-r--r-- | python/skytools/__init__.py | 1 | ||||
-rw-r--r-- | python/skytools/parsing.py | 34 | ||||
-rw-r--r-- | python/skytools/scripting.py | 17 |
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): |