--- a/pvl/dns/zone.py Mon Dec 16 20:01:47 2013 +0200
+++ b/pvl/dns/zone.py Mon Dec 16 20:20:48 2013 +0200
@@ -386,7 +386,7 @@
def __getitem__ (self, offset) :
return self.base + offset
-def parse_generate_field (line, field) :
+def parse_generate_field (field, line=None) :
"""
Parse a $GENERATE lhs/rhs field:
$
@@ -396,17 +396,17 @@
Returns a wrapper that builds the field-value when called with the index.
- >>> parse_generate_field(None, "foo")(1)
+ >>> parse_generate_field("foo")(1)
'foo'
- >>> parse_generate_field(None, "foo-$")(1)
+ >>> parse_generate_field("foo-$")(1)
'foo-1'
- >>> parse_generate_field(None, "foo-$$")(1)
+ >>> parse_generate_field("foo-$$")(1)
'foo-$'
- >>> parse_generate_field(None, "\$")(1)
+ >>> parse_generate_field("\$")(1)
'$'
- >>> parse_generate_field(None, "10.0.0.${100}")(1)
+ >>> parse_generate_field("10.0.0.${100}")(1)
'10.0.0.101'
- >>> parse_generate_field(None, "foo-${0,2,d}")(1)
+ >>> parse_generate_field("foo-${0,2,d}")(1)
'foo-01'
"""
@@ -486,6 +486,26 @@
return value_func
+def parse_generate_range (field) :
+ """
+ Parse a <start>-<stop>[/<step>] field
+ """
+
+ if '/' in field :
+ field, step = field.split('/')
+ step = int(step)
+ else :
+ step = 1
+
+ start, stop = field.split('-')
+ start = int(start)
+ stop = int(stop)
+
+ log.debug(" range: start=%r, stop=%r, step=%r", start, stop, step)
+
+ # inclusive
+ return range(start, stop + 1, step)
+
def process_generate (line, origin, parts) :
"""
Process a
@@ -493,26 +513,10 @@
directive into a series of ZoneResource's.
"""
- range = parts.pop(0)
-
- # parse range
- if '/' in range :
- range, step = range.split('/')
- step = int(step)
- else :
- step = 1
+ range = parse_generate_range(parts.pop(0))
- start, stop = range.split('-')
- start = int(start)
- stop = int(stop)
-
- log.debug(" range: start=%r, stop=%r, step=%r", start, stop, step)
-
- # inclusive
- range = xrange(start, stop + 1, step)
-
- lhs_func = parse_generate_field(line, parts.pop(0))
- rhs_func = parse_generate_field(line, parts.pop(-1))
+ lhs_func = parse_generate_field(parts.pop(0), line=line)
+ rhs_func = parse_generate_field(parts.pop(-1), line=line)
body = parts
for i in range :