implement handling of None values to URL.build
authorTero Marttila <terom@fixme.fi>
Mon, 09 Feb 2009 06:11:51 +0200
changeset 54 3fa90f00c0c4
parent 53 01429f140b06
child 55 d36efeb64650
implement handling of None values to URL.build
urltree.py
--- a/urltree.py	Mon Feb 09 06:04:15 2009 +0200
+++ b/urltree.py	Mon Feb 09 06:11:51 2009 +0200
@@ -213,19 +213,8 @@
             Return either the assigned value from values, our default value, or raise an error
         """
         
-        # lookup the value obj to use
-        value = values.get(self.key)
-        
-        if not value and self.default is not None :
-            value = self.default
-        
-        elif not value :
-            raise URLError("No value given for label %r" % (self.key, ))
-        
-        # convert value back to str
-        value = self.type.build(value)
-        
-        return value
+        # just proxy to build_default
+        return build_default[1]
 
     def build_default (self, values) :
         """
@@ -233,19 +222,24 @@
 
             XXX: copy-paste from build()
         """
-
+ 
         # state
         is_default = False
-
-        # lookup the value obj to use
-        value = values.get(self.key)
         
-        if not value and self.default is not None :
-            is_default = True
-            value = self.default
+        # value given?
+        if self.key not in values or values[self.key] is None :
+            # error on missing non-default
+            if self.default is None :
+                raise URLError("No value given for label %r" % (self.key, ))
+            
+            # use default
+            else :
+                is_default = True
+                value = self.default
         
-        elif not value :
-            raise URLError("No value given for label %r" % (self.key, ))
+        else :
+            # lookup the value obj to use
+            value = values[self.key]
         
         # convert value back to str
         value = self.type.build(value)
@@ -253,7 +247,6 @@
         # return
         return (is_default, value)
 
-
 class SimpleValueLabel (ValueLabel) :
     """
         A label that has a name and a simple string value
@@ -634,6 +627,8 @@
         """
             Build an absolute URL pointing to this target, with the given values. Default values are left off if they
             are at the end of the URL.
+
+            Values given as None are ignored.
         """
         
         # collect segments as a list of (is_default, segment) values
@@ -650,10 +645,10 @@
         assert segments
         
         # join
-        url = '/'.join(segment for is_default, segment in segments)
+        url = '/'.join(segment for is_default, segment in segments if segment is not None)
         
         # build query args
-        query_args = dict((key, type.build(values[key])) for key, (type, default) in self.query_args.iteritems() if key in values)
+        query_args = dict((key, type.build(values[key])) for key, (type, default) in self.query_args.iteritems() if key in values and values[key] is not None)
 
         return "%s%s" % (url, '?%s' % ('&'.join('%s=%s' % tup for tup in query_args.iteritems())) if query_args else '')