aboutsummaryrefslogtreecommitdiffstats
path: root/libbe/mapfile.py
diff options
context:
space:
mode:
Diffstat (limited to 'libbe/mapfile.py')
-rw-r--r--libbe/mapfile.py110
1 files changed, 12 insertions, 98 deletions
diff --git a/libbe/mapfile.py b/libbe/mapfile.py
index 6a8e23e..82eadae 100644
--- a/libbe/mapfile.py
+++ b/libbe/mapfile.py
@@ -12,92 +12,6 @@ class FileString(object):
self.str += line
-def parse(f):
- """Parses a mapfile, returns a Dictionary
-
- >>> f = FileString("1:q\\n2:q\\n3:q\\n>p\\n4:q\\n5:q\\n6:q\\n")
- >>> parse(f)["q"]
- 'p'
- >>> parse("1:q\\n2:q\\n3:q\\n>r\\n4:q\\n5:q\\n6:q\\n")["q"]
- 'r'
- >>> parse("1:q:5\\n>s\\n2:q:5\\n")["q:5"]
- 's'
- >>> parse("1:q\\n>s\\n2:q\\n1:q\\n>s\\n2:q\\n")
- Traceback (most recent call last):
- File "<stdin>", line 1, in ?
- File "libbe/mapfile.py", line 41, in parse
- assert (lnum == prev_num + 1)
- AssertionError
- >>> parse("1:q\\n>s\\n2:q\\n1:l\\n>s\\n2:l\\n1:q\\n>s\\n2:q\\n")
- Traceback (most recent call last):
- AssertionError
- >>> parse("1:q\\n>s\\n>s\\n2:q\\n")
- Traceback (most recent call last):
- AssertionError
- """
- if isinstance(f, basestring):
- f = FileString(f)
- result = {}
- name = None
- prev_num = None
- for line in f:
- value = None
- # Handle values
- if line.startswith(">"):
- assert (name is not None)
- assert (not result.has_key(name))
- result[name] = line[1:].rstrip("\n")
- # Handle names
- else:
- lname = ":".join(line.split(":")[1:]).rstrip("\n")
- lnum = int(line.split(":")[0])
-
- #special-case the first execution
- if name is None:
- name = lname
-
- #ensure sequential operation
- elif lname == name:
- assert (lnum == prev_num + 1)
- #if name changes, start over at 1
- else:
- if lnum != 1:
- assert(lname != name)
- raise "%i %s %s" % (lnum, lname, name)
- assert (lnum == 1)
- name = lname
- prev_num = lnum
- return result
-
-
-def generate(f, map, context=3):
- """
- >>> f = FileString()
- >>> generate(f, {"q":"p"})
- >>> f.str
- '1:q\\n2:q\\n3:q\\n>p\\n4:q\\n5:q\\n6:q\\n'
- >>> parse(f)["q"]
- 'p'
- >>> f = FileString()
- >>> generate(f, {"a":"b", "c":"d", "e":"f"})
- >>> dict = parse(f)
- >>> dict["a"]
- 'b'
- >>> dict["c"]
- 'd'
- >>> dict["e"]
- 'f'
- """
- assert(context > 0)
- keys = map.keys()
- keys.sort()
- for key in keys:
- for i in range(context):
- f.write("%i:%s\n" % (i+1, key))
- f.write(">%s\n" % map[key])
- for i in range(context):
- f.write("%i:%s\n" % (i+context+1, key))
-
class IllegalKey(Exception):
def __init__(self, key):
Exception.__init__(self, 'Illegal key "%s"' % key)
@@ -108,28 +22,28 @@ class IllegalValue(Exception):
Exception.__init__(self, 'Illegal value "%s"' % value)
self.value = value
-def generate2(f, map, context=3):
+def generate(f, map, context=3):
"""Generate a format-2 mapfile. This is a simpler format, but should merge
better, because there's no chance of confusion for appends, and lines
are unique for both key and value.
>>> f = FileString()
- >>> generate2(f, {"q":"p"})
+ >>> generate(f, {"q":"p"})
>>> f.str
'\\n\\n\\nq=p\\n\\n\\n\\n'
- >>> generate2(f, {"q=":"p"})
+ >>> generate(f, {"q=":"p"})
Traceback (most recent call last):
IllegalKey: Illegal key "q="
- >>> generate2(f, {"q\\n":"p"})
+ >>> generate(f, {"q\\n":"p"})
Traceback (most recent call last):
IllegalKey: Illegal key "q\\n"
- >>> generate2(f, {"":"p"})
+ >>> generate(f, {"":"p"})
Traceback (most recent call last):
IllegalKey: Illegal key ""
- >>> generate2(f, {">q":"p"})
+ >>> generate(f, {">q":"p"})
Traceback (most recent call last):
IllegalKey: Illegal key ">q"
- >>> generate2(f, {"q":"p\\n"})
+ >>> generate(f, {"q":"p\\n"})
Traceback (most recent call last):
IllegalValue: Illegal value "p\\n"
"""
@@ -160,16 +74,16 @@ def get_file(f):
else:
return f
-def parse2(f):
+def parse(f):
"""
Parse a format-2 mapfile.
- >>> parse2('\\n\\n\\nq=p\\n\\n\\n\\n')['q']
+ >>> parse('\\n\\n\\nq=p\\n\\n\\n\\n')['q']
'p'
- >>> parse2('\\n\\nq=\\'p\\'\\n\\n\\n\\n')['q']
+ >>> parse('\\n\\nq=\\'p\\'\\n\\n\\n\\n')['q']
"\'p\'"
>>> f = FileString()
- >>> generate2(f, {"a":"b", "c":"d", "e":"f"})
- >>> dict = parse2(f)
+ >>> generate(f, {"a":"b", "c":"d", "e":"f"})
+ >>> dict = parse(f)
>>> dict["a"]
'b'
>>> dict["c"]