# HG changeset patch # User Tero Marttila # Date 1234152711 -7200 # Node ID 3fa90f00c0c435b5110900724bf18809651d97a3 # Parent 01429f140b066ab343eaf69ca8b502d0e75f1eca implement handling of None values to URL.build diff -r 01429f140b06 -r 3fa90f00c0c4 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 '')