pvl.dns.zone: factor out parse_generate_range
authorTero Marttila <terom@paivola.fi>
Mon, 16 Dec 2013 20:20:48 +0200
changeset 276 8db56588cefc
parent 275 4dc5cc30a278
child 277 5f0b67ba454f
pvl.dns.zone: factor out parse_generate_range
pvl/dns/zone.py
--- 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 :