--- 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 '')