[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

please unblock python-webob 0.9.3-1



Hi,

Please unblock python-webob 0.9.3-1. It's a new upstream but a bug fix
only release.

From upstream changelog:
* Fixed resp.set_cookie(max_age=timedelta(...))
* request.POST now supports PUT requests with the appropriate Content-Type.

It's in unstable since 10 days and no bugs has been reported against it.
Package has one[1] rev. dependency in Lenny: python-weberror and it
works fine with python-webob 0.9.3 (I'm [co-]maintaining all 3 mentioned
packages)

I'm attaching diffstat and
`debdiff python-webob_0.9.{2,3}-1.dsc | filterdiff -x '*/doc/*' -x '*/test/*'`
output.

TIA

[1] python-pylons 0.9.7~rc, which also depends on this package, is in
    experimental for now
-- 
:wq!
 PKG-INFO                   |    2 -
 WebOb.egg-info/PKG-INFO    |    2 -
 WebOb.egg-info/SOURCES.txt |    1 
 debian/changelog           |    6 +++++
 docs/conf.py               |    2 -
 docs/differences.txt       |    6 -----
 docs/file-example.txt      |    6 ++---
 docs/index.txt             |    2 -
 docs/news.txt              |    8 +++++++
 docs/reference.txt         |   42 +++++++++++++++++++++++++++-------------
 docs/test-file.txt         |    1 
 setup.cfg                  |    4 ++-
 setup.py                   |    4 +--
 tests/test_request.py      |    2 -
 tests/test_request.txt     |   28 ++++++++++++++------------
 tests/test_response.txt    |   10 ++++-----
 webob/__init__.py          |   47 ++++++++++++++++++++++++++++++++-------------
 webob/multidict.py         |    4 +--
 18 files changed, 114 insertions(+), 63 deletions(-)
diff -Nru python-webob-0.9.2/debian/changelog python-webob-0.9.3/debian/changelog
--- python-webob-0.9.2/debian/changelog	2008-09-25 22:41:58.000000000 +0200
+++ python-webob-0.9.3/debian/changelog	2008-09-25 22:41:58.000000000 +0200
@@ -1,3 +1,9 @@
+python-webob (0.9.3-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Piotr Ożarowski <piotr@debian.org>  Mon, 15 Sep 2008 21:26:02 +0200
+
 python-webob (0.9.2-1) unstable; urgency=low
 
   * New upstream release
diff -Nru python-webob-0.9.2/docs/conf.py python-webob-0.9.3/docs/conf.py
diff -Nru python-webob-0.9.2/docs/differences.txt python-webob-0.9.3/docs/differences.txt
diff -Nru python-webob-0.9.2/docs/file-example.txt python-webob-0.9.3/docs/file-example.txt
diff -Nru python-webob-0.9.2/docs/index.txt python-webob-0.9.3/docs/index.txt
diff -Nru python-webob-0.9.2/docs/news.txt python-webob-0.9.3/docs/news.txt
diff -Nru python-webob-0.9.2/docs/reference.txt python-webob-0.9.3/docs/reference.txt
diff -Nru python-webob-0.9.2/docs/test-file.txt python-webob-0.9.3/docs/test-file.txt
diff -Nru python-webob-0.9.2/PKG-INFO python-webob-0.9.3/PKG-INFO
--- python-webob-0.9.2/PKG-INFO	2008-06-13 18:46:08.000000000 +0200
+++ python-webob-0.9.3/PKG-INFO	2008-09-15 04:30:33.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: WebOb
-Version: 0.9.2
+Version: 0.9.3
 Summary: WSGI request and response object
 Home-page: http://pythonpaste.org/webob/
 Author: Ian Bicking
diff -Nru python-webob-0.9.2/setup.cfg python-webob-0.9.3/setup.cfg
--- python-webob-0.9.2/setup.cfg	2008-06-13 18:46:08.000000000 +0200
+++ python-webob-0.9.3/setup.cfg	2008-09-15 04:30:33.000000000 +0200
@@ -7,9 +7,11 @@
 command_packages = buildutils.pudge_command, buildutils.publish_command
 
 [nosetests]
-detailed-errors = True
 doctest-extension = txt
+detailed-errors = True
 with-doctest = True
+exclude = jsonrpc-example.txt
+include = docs
 
 [publish]
 doc-dest = scp://ianb@webwareforpython.org/home/paste/htdocs/webob/
diff -Nru python-webob-0.9.2/setup.py python-webob-0.9.3/setup.py
--- python-webob-0.9.2/setup.py	2008-06-13 18:45:44.000000000 +0200
+++ python-webob-0.9.3/setup.py	2008-09-15 04:29:54.000000000 +0200
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 import sys, os
 
-version = '0.9.2'
+version = '0.9.3'
 
 setup(name='WebOb',
       version=version,
@@ -31,5 +31,5 @@
       include_package_data=True,
       zip_safe=True,
       test_suite='nose.collector',
-      tests_require=['dtopt', 'nose', 'webtest']
+      tests_require=['dtopt', 'nose', 'tempita', 'webtest', 'wsgiproxy']
       )
diff -Nru python-webob-0.9.2/tests/test_request.py python-webob-0.9.3/tests/test_request.py
diff -Nru python-webob-0.9.2/tests/test_request.txt python-webob-0.9.3/tests/test_request.txt
diff -Nru python-webob-0.9.2/tests/test_response.txt python-webob-0.9.3/tests/test_response.txt
diff -Nru python-webob-0.9.2/webob/__init__.py python-webob-0.9.3/webob/__init__.py
--- python-webob-0.9.2/webob/__init__.py	2008-06-13 18:45:44.000000000 +0200
+++ python-webob-0.9.3/webob/__init__.py	2008-09-15 04:29:54.000000000 +0200
@@ -300,7 +300,7 @@
         dt = dt.timetuple()
     if isinstance(dt, (tuple, time.struct_time)):
         dt = calendar.timegm(dt)
-    if not isinstance(dt, (float, int)):
+    if not isinstance(dt, (float, int, long)):
         raise ValueError(
             "You must pass in a datetime, date, time tuple, or integer object, not %r" % dt)
     return formatdate(dt)
@@ -857,14 +857,16 @@
 
     def str_POST(self):
         """
-        Return a MultiDict containing all the variables from a POST
-        form request.  Does *not* return anything for non-POST
-        requests or for non-form requests (returns empty dict-like
-        object in that case).
+        Return a MultiDict containing all the variables from a form
+        request. Returns an empty dict-like object for non-form
+        requests.
+
+        Form requests are typically POST requests, however PUT requests
+        with an appropriate Content-Type are also supported.
         """
         env = self.environ
-        if self.method != 'POST':
-            return NoVars('Not a POST request')
+        if self.method not in ('POST', 'PUT'):
+            return NoVars('Not a form request')
         if 'webob._parsed_post_vars' in env:
             vars, body_file = env['webob._parsed_post_vars']
             if body_file is self.body_file:
@@ -879,8 +881,9 @@
         content_type = self.content_type
         if ';' in content_type:
             content_type = content_type.split(';', 1)[0]
-        if content_type not in ('', 'application/x-www-form-urlencoded',
-                                'multipart/form-data'):
+        if (self.method == 'PUT' and not content_type) or \
+                content_type not in ('', 'application/x-www-form-urlencoded',
+                                     'multipart/form-data'):
             # Not an HTML form submission
             return NoVars('Not an HTML form submission (Content-Type: %s)'
                           % content_type)
@@ -1119,7 +1122,7 @@
         if remove_range:
             check_keys += ['HTTP_IF_RANGE', 'HTTP_RANGE']
         if remove_match:
-            check_keys.append('HTTP_IF_MATCH')
+            check_keys.append('HTTP_IF_NONE_MATCH')
         if remove_modified:
             check_keys.append('HTTP_IF_MODIFIED_SINCE')
         if remove_encoding:
@@ -1673,6 +1676,12 @@
             raise TypeError(
                 "You can only set the body to a str (not %s)"
                 % type(value))
+        try:
+            if self._body or self._app_iter:
+                self.content_md5 = None
+        except AttributeError:
+            # if setting body early in initialization _body and _app_iter don't exist yet
+            pass
         self._body = value
         self.content_length = len(value)
         self._app_iter = None
@@ -1766,7 +1775,7 @@
         cookies = BaseCookie()
         cookies[key] = value
         if isinstance(max_age, timedelta):
-            max_age = timedelta.seconds + timedelta.days*24*60*60
+            max_age = max_age.seconds + max_age.days*24*60*60
         if max_age is not None and expires is None:
             expires = datetime.utcnow() + timedelta(seconds=max_age)
         if isinstance(expires, timedelta):
@@ -1786,6 +1795,10 @@
             if var_value is not None and var_value is not False:
                 cookies[key][var_name.replace('_', '-')] = str(var_value)
         header_value = cookies[key].output(header='').lstrip()
+        if header_value.endswith(';'):
+            # Python 2.4 adds a trailing ; to the end, strip it to be
+            # consistent with 2.5
+            header_value = header_value[:-1]
         self.headerlist.append(('Set-Cookie', header_value))
 
     def delete_cookie(self, key, path='/', domain=None):
@@ -1820,6 +1833,10 @@
                 del cookies[key]
                 header = cookies.output(header='').lstrip()
             if header:
+                if header.endswith(';'):
+                    # Python 2.4 adds a trailing ; to the end, strip it
+                    # to be consistent with 2.5
+                    header = header[:-1]
                 self.headers.add('Set-Cookie', header)
         if not found:
             raise KeyError(
@@ -1954,6 +1971,7 @@
         identity are supported).
         """
         if encoding == 'identity':
+            self.decode_content()
             return
         if encoding != 'gzip':
             raise ValueError(
@@ -2012,13 +2030,14 @@
 
     etag = header_getter('ETag', rfc_section='14.19')
 
-    def md5_etag(self, body=None, set_content_md5=False):
+    def md5_etag(self, body=None, set_content_md5=False, set_conditional_response=False):
         """
         Generate an etag for the response object using an MD5 hash of
         the body (the body parameter, or ``self.body`` if not given)
 
         Sets ``self.etag``
-        If set_content_md5 is True sets self.content_md5 as well
+        If ``set_content_md5`` is True sets ``self.content_md5`` as well
+        If ``set_conditional_response`` is True sets ``self.conditional_response`` to True
         """
         if body is None:
             body = self.body
@@ -2028,6 +2047,8 @@
         self.etag = md5_digest
         if set_content_md5:
             self.content_md5 = md5_digest
+        if set_conditional_response:
+            self.conditional_response = True
 
     expires = converter(
         header_getter('Expires', rfc_section='14.21'),
diff -Nru python-webob-0.9.2/webob/multidict.py python-webob-0.9.3/webob/multidict.py
--- python-webob-0.9.2/webob/multidict.py	2008-06-13 18:45:44.000000000 +0200
+++ python-webob-0.9.3/webob/multidict.py	2008-09-15 04:29:54.000000000 +0200
@@ -595,8 +595,8 @@
     ['a', 'a', 'b']
     >>> d.items()
     [('a', 1), ('a', 2), ('b', 4)]
-    >>> d.mixed()
-    {'a': [1, 2], 'b': 4}
+    >>> d.mixed() == {'a': [1, 2], 'b': 4}
+    True
     >>> MultiDict([('a', 'b')], c=2)
     MultiDict([('a', 'b'), ('c', 2)])
     """}
diff -Nru python-webob-0.9.2/WebOb.egg-info/PKG-INFO python-webob-0.9.3/WebOb.egg-info/PKG-INFO
--- python-webob-0.9.2/WebOb.egg-info/PKG-INFO	2008-06-13 18:46:06.000000000 +0200
+++ python-webob-0.9.3/WebOb.egg-info/PKG-INFO	2008-09-15 04:30:32.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: WebOb
-Version: 0.9.2
+Version: 0.9.3
 Summary: WSGI request and response object
 Home-page: http://pythonpaste.org/webob/
 Author: Ian Bicking
diff -Nru python-webob-0.9.2/WebOb.egg-info/SOURCES.txt python-webob-0.9.3/WebOb.egg-info/SOURCES.txt
--- python-webob-0.9.2/WebOb.egg-info/SOURCES.txt	2008-06-13 18:46:07.000000000 +0200
+++ python-webob-0.9.3/WebOb.egg-info/SOURCES.txt	2008-09-15 04:30:32.000000000 +0200
@@ -17,6 +17,7 @@
 docs/license.txt
 docs/news.txt
 docs/reference.txt
+docs/test-file.txt
 docs/wiki-example.txt
 docs/comment-example-code/example.py
 docs/jsonrpc-example-code/jsonrpc.py

Attachment: pgpL6WqFnkisf.pgp
Description: PGP signature


Reply to: