On Sun, Apr 12, 2009 at 3:23 PM, Jacob Holm <span dir="ltr"><<a href="mailto:jh@improva.dk">jh@improva.dk</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Mart<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">   >>> add_query_params('<a href="http://example.com/a/b/c?a=b" target="_blank">http://example.com/a/b/c?a=b</a>', b='d', foo='/bar')<br>
</div>
    '<a href="http://example.com/a/b/c?a=b&b=d&foo=%2Fbar" target="_blank">http://example.com/a/b/c?a=b&b=d&foo=%2Fbar</a> <<a href="http://example.com/a/b/c?a=b&b=d&foo=%2Fbar" target="_blank">http://example.com/a/b/c?a=b&b=d&foo=%2Fbar</a>>'<br>

<br>
Duplicates are discarded:<br>
</blockquote>
<br>
Why discard duplicates?  They are valid and have a well-defined meaning.</blockquote><div class="im"><br><br>The bad thing about reasoning about query strings is that there is no comprehensive documentation about their meaning. Both RFC 1738 and RFC 3986 are rather vague in that matter. But I agree that duplicates actually have a meaning (an ordered list of identical values), so I'll remove the bits that prune them unless anyone opposes (which I doubt).<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im"><br>
But if a value is given, the empty key is considered a duplicate (i.e. the<br>
case of a&a=b is considered nonsensical):<br>
</div></blockquote>
<br>
Again, it is a valid url and this will change its meaning.  Why?</blockquote><div><br>I'm uncertain whether a&a=b has a meaning, but don't see any harm in supporting it, so I'll add the feature.<br><br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">
<br>
    >>> add_query_params('<a href="http://example.com/a/b/c?a" target="_blank">http://example.com/a/b/c?a</a>', a='b', c=None)<br></div>
    '<a href="http://example.com/a/b/c?a=b&c" target="_blank">http://example.com/a/b/c?a=b&c</a> <<a href="http://example.com/a/b/c?a=b&c" target="_blank">http://example.com/a/b/c?a=b&c</a>>'<div class="im">
<br>
<br>
If you need to pass in key names that are not allowed in keyword arguments,<br>
pass them via a dictionary in second argument:<br>
<br>
    >>> add_query_params('foo', {"+'|äüö": 'bar'})<br>
    'foo?%2B%27%7C%C3%A4%C3%BC%C3%B6=bar'<br>
<br>
Order of original parameters is retained, although similar keys are grouped<br>
together. <br>
</div></blockquote>
<br>
Why the grouping?  Is it a side effect of your desire to discard duplicates?   Changing the order like that changes the meaning of the url.  A concrete case where the order of field names matters is the ":records" converter in <a href="http://pypi.python.org/pypi/zope.httpform/1.0.1" target="_blank">http://pypi.python.org/pypi/zope.httpform/1.0.1</a> (a small independent package extracted from the form handling code in zope).</blockquote>
<div><br> It's also related to duplicate handling, but it mostly relates to the data structure used in the initial implementation (an OrderedDict). Re-grouping is removed now and not having to deal with duplicates simplified the code considerably (using a simple list of key-value tuples now).<br>
<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
If you change it to keep duplicates and not unnecessarily mangle the field order I am +1, else I am -0.</blockquote><div><br>Thanks for your input! Changes pushed to github (see the updated behaviour there as well):<br><br>
<a href="http://github.com/mrts/qparams/blob/4f32670b55082f8d0ef01c33524145c3264c161a/qparams.py">http://github.com/mrts/qparams/blob/4f32670b55082f8d0ef01c33524145c3264c161a/qparams.py</a><br><br>MS<br></div></div>