Hello community,

here is the log from the commit of package python3-WebOb for openSUSE:Factory 
checked in at 2015-04-18 10:39:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-WebOb (Old)
 and      /work/SRC/openSUSE:Factory/.python3-WebOb.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python3-WebOb"

Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-WebOb/python3-WebOb.changes      
2015-01-26 16:47:07.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python3-WebOb.new/python3-WebOb.changes 
2015-04-18 10:39:59.000000000 +0200
@@ -1,0 +2,58 @@
+Wed Apr 15 15:33:02 UTC 2015 - a...@gmx.de
+
+- update to version 1.4.1:
+  * Backwards Incompatibilities
+    + Morsel will no longer accept a cookie value that does not meet
+      RFC6265’s cookie-octet specification. Upon calling
+      Morsel.serialize a warning will be issued, in the future this
+      will raise a ValueError, please update your cookie handling
+      code. See https://github.com/Pylons/webob/pull/172
+    + The cookie-octet specification in RFC6265 states the following
+      characters are valid in a cookie value:
+    + Hex Range Actual Characters ——— —————– [0x21 ] ! [0x25-0x2B]
+      #$%&’()*+ [0x2D-0x3A] -./0123456789: [0x3C-0x5B]
+      <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ [0x5D-0x7E]
+      ]^_`abcdefghijklmnopqrstuvwxyz{|}~
+    + RFC6265 suggests using base 64 to serialize data before storing
+      data in a cookie.
+    + response.set_cookie now uses the internal make_cookie API, which
+      will issue warnings if cookies are set with invalid bytes. See
+      https://github.com/Pylons/webob/pull/172
+  * Features
+    + Add support for some new caching headers, stale-while-revalidate
+      and stale-if-error that can be used by reverse proxies to cache
+      stale responses temporarily if the backend disappears. From
+      RFC5861. See https://github.com/Pylons/webob/pull/189
+  * Bug Fixes
+    + Response.status now uses duck-typing for integers, and has also
+      learned to raise a ValueError if the status isn’t an integer
+      followed by a space, and then the reason. See
+      https://github.com/Pylons/webob/pull/191
+    + Fixed a bug in webob.multidict.GetDict which resulted in the
+      QUERY_STRING not being updated when changes were made to query
+      params using Request.GET.extend().
+    + Read the body of a request if we think it might have a
+      body. This fixes PATCH to support bodies. See
+      https://github.com/Pylons/webob/pull/184
+    + Response.from_file returns HTTP headers as latin1 rather than
+      UTF-8, this fixes the usage on Google AppEngine. See
+      https://github.com/Pylons/webob/issues/99 and
+      https://github.com/Pylons/webob/pull/150
+    + Fix a bug in parsing the auth parameters that contained bad
+      white space. This makes the parsing fall in line with what’s
+      required in RFC7235. See
+      https://github.com/Pylons/webob/issues/158
+    + Use ‘rn’ line endings in Response.__str__. See:
+      https://github.com/Pylons/webob/pull/146
+  * Documentation Changes
+    + response.set_cookie now has proper documentation for max_age and
+      expires. The code has also been refactored to use
+      cookies.make_cookie instead of duplicating the code. This fixes
+      https://github.com/Pylons/webob/issues/166 and
+      https://github.com/Pylons/webob/issues/171
+    + Documentation didn’t match the actual code for the wsgify
+      function signature. See https://github.com/Pylons/webob/pull/167
+    + Remove the WebDAV only from certain HTTP Exceptions, these
+      exceptions may also be used by REST services for example.
+
+-------------------------------------------------------------------

Old:
----
  WebOb-1.4.tar.gz

New:
----
  WebOb-1.4.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python3-WebOb.spec ++++++
--- /var/tmp/diff_new_pack.R7NraP/_old  2015-04-18 10:39:59.000000000 +0200
+++ /var/tmp/diff_new_pack.R7NraP/_new  2015-04-18 10:39:59.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python3-WebOb
 #
-# Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           python3-WebOb
-Version:        1.4
+Version:        1.4.1
 Release:        0
 Summary:        WSGI request and response object
 License:        MIT

++++++ WebOb-1.4.tar.gz -> WebOb-1.4.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/.gitignore new/WebOb-1.4.1/.gitignore
--- old/WebOb-1.4/.gitignore    2013-12-07 04:05:28.000000000 +0100
+++ new/WebOb-1.4.1/.gitignore  1970-01-01 01:00:00.000000000 +0100
@@ -1,24 +0,0 @@
-WebOb.egg-info
-*.pyc
-*.pyo
-*.swp
-*~
-TEST*
-testenv
-docs/_build/*
-dist/
-build/
-.coverage
-*.egg
-glob:_coverage
-Session.vim
-*_coverage/**
-*,cover
-*_fixt.py
-*$py.class
-.tox/
-coverage.xml
-nosetests.xml
-env*/
-_website/
-__pycache__/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/.travis.yml new/WebOb-1.4.1/.travis.yml
--- old/WebOb-1.4/.travis.yml   2014-02-22 17:44:46.000000000 +0100
+++ new/WebOb-1.4.1/.travis.yml 1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-language: python
-
-python:
-  - 2.6
-  - 2.7
-  - 3.2
-  - 3.3
-  - pypy
-
-install: python setup.py install
-
-script: python setup.py nosetests
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/PKG-INFO new/WebOb-1.4.1/PKG-INFO
--- old/WebOb-1.4/PKG-INFO      2014-05-15 03:30:52.000000000 +0200
+++ new/WebOb-1.4.1/PKG-INFO    2015-04-14 17:39:57.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: WebOb
-Version: 1.4
+Version: 1.4.1
 Summary: WSGI request and response object
 Home-page: http://webob.org/
 Author: Pylons Project
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/WebOb.egg-info/PKG-INFO 
new/WebOb-1.4.1/WebOb.egg-info/PKG-INFO
--- old/WebOb-1.4/WebOb.egg-info/PKG-INFO       2014-05-15 03:30:49.000000000 
+0200
+++ new/WebOb-1.4.1/WebOb.egg-info/PKG-INFO     2015-04-14 17:39:57.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: WebOb
-Version: 1.4
+Version: 1.4.1
 Summary: WSGI request and response object
 Home-page: http://webob.org/
 Author: Pylons Project
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/WebOb.egg-info/SOURCES.txt 
new/WebOb-1.4.1/WebOb.egg-info/SOURCES.txt
--- old/WebOb-1.4/WebOb.egg-info/SOURCES.txt    2014-05-15 03:30:51.000000000 
+0200
+++ new/WebOb-1.4.1/WebOb.egg-info/SOURCES.txt  2015-04-14 17:39:57.000000000 
+0200
@@ -1,10 +1,6 @@
-.gitignore
-.travis.yml
 MANIFEST.in
 setup.cfg
 setup.py
-tox.ini
-toxfast.ini
 WebOb.egg-info/PKG-INFO
 WebOb.egg-info/SOURCES.txt
 WebOb.egg-info/dependency_links.txt
@@ -34,6 +30,7 @@
 docs/jsonrpc-example-code/test_jsonrpc.txt
 docs/modules/client.txt
 docs/modules/dec.txt
+docs/modules/exceptions.txt
 docs/modules/static.txt
 docs/modules/webob.txt
 docs/pycon2011/pycon-py3k-sprint.txt
@@ -59,6 +56,7 @@
 tests/test_compat.pyc
 tests/test_cookies.py
 tests/test_cookies.pyc
+tests/test_cookies_bw.pyc
 tests/test_datetime_utils.py
 tests/test_datetime_utils.pyc
 tests/test_dec.py
@@ -94,78 +92,107 @@
 tests/__pycache__/__init__.cpython-32.pyc
 tests/__pycache__/__init__.cpython-33.pyc
 tests/__pycache__/__init__.cpython-34.pyc
+tests/__pycache__/__init__.pypy3-24.pyc
 tests/__pycache__/performance_test.cpython-32.pyc
 tests/__pycache__/performance_test.cpython-33.pyc
 tests/__pycache__/performance_test.cpython-34.pyc
+tests/__pycache__/performance_test.pypy3-24.pyc
 tests/__pycache__/test_acceptparse.cpython-32.pyc
 tests/__pycache__/test_acceptparse.cpython-33.pyc
 tests/__pycache__/test_acceptparse.cpython-34.pyc
+tests/__pycache__/test_acceptparse.pypy3-24.pyc
 tests/__pycache__/test_byterange.cpython-32.pyc
 tests/__pycache__/test_byterange.cpython-33.pyc
 tests/__pycache__/test_byterange.cpython-34.pyc
+tests/__pycache__/test_byterange.pypy3-24.pyc
 tests/__pycache__/test_cachecontrol.cpython-32.pyc
 tests/__pycache__/test_cachecontrol.cpython-33.pyc
 tests/__pycache__/test_cachecontrol.cpython-34.pyc
+tests/__pycache__/test_cachecontrol.pypy3-24.pyc
 tests/__pycache__/test_client.cpython-32.pyc
 tests/__pycache__/test_client.cpython-33.pyc
 tests/__pycache__/test_client.cpython-34.pyc
+tests/__pycache__/test_client.pypy3-24.pyc
 tests/__pycache__/test_client_functional.cpython-32.pyc
 tests/__pycache__/test_client_functional.cpython-33.pyc
 tests/__pycache__/test_client_functional.cpython-34.pyc
+tests/__pycache__/test_client_functional.pypy3-24.pyc
 tests/__pycache__/test_compat.cpython-32.pyc
 tests/__pycache__/test_compat.cpython-33.pyc
 tests/__pycache__/test_compat.cpython-34.pyc
+tests/__pycache__/test_compat.pypy3-24.pyc
 tests/__pycache__/test_cookies.cpython-32.pyc
 tests/__pycache__/test_cookies.cpython-33.pyc
 tests/__pycache__/test_cookies.cpython-34.pyc
+tests/__pycache__/test_cookies.pypy3-24.pyc
+tests/__pycache__/test_cookies_bw.cpython-32.pyc
+tests/__pycache__/test_cookies_bw.cpython-33.pyc
+tests/__pycache__/test_cookies_bw.cpython-34.pyc
+tests/__pycache__/test_cookies_bw.pypy3-24.pyc
 tests/__pycache__/test_datetime_utils.cpython-32.pyc
 tests/__pycache__/test_datetime_utils.cpython-33.pyc
 tests/__pycache__/test_datetime_utils.cpython-34.pyc
+tests/__pycache__/test_datetime_utils.pypy3-24.pyc
 tests/__pycache__/test_dec.cpython-32.pyc
 tests/__pycache__/test_dec.cpython-33.pyc
 tests/__pycache__/test_dec.cpython-34.pyc
+tests/__pycache__/test_dec.pypy3-24.pyc
 tests/__pycache__/test_descriptors.cpython-32.pyc
 tests/__pycache__/test_descriptors.cpython-33.pyc
 tests/__pycache__/test_descriptors.cpython-34.pyc
+tests/__pycache__/test_descriptors.pypy3-24.pyc
 tests/__pycache__/test_etag.cpython-32.pyc
 tests/__pycache__/test_etag.cpython-33.pyc
 tests/__pycache__/test_etag.cpython-34.pyc
+tests/__pycache__/test_etag.pypy3-24.pyc
 tests/__pycache__/test_etag_nose.cpython-32.pyc
 tests/__pycache__/test_etag_nose.cpython-33.pyc
 tests/__pycache__/test_etag_nose.cpython-34.pyc
+tests/__pycache__/test_etag_nose.pypy3-24.pyc
 tests/__pycache__/test_exc.cpython-32.pyc
 tests/__pycache__/test_exc.cpython-33.pyc
 tests/__pycache__/test_exc.cpython-34.pyc
+tests/__pycache__/test_exc.pypy3-24.pyc
 tests/__pycache__/test_headers.cpython-32.pyc
 tests/__pycache__/test_headers.cpython-33.pyc
 tests/__pycache__/test_headers.cpython-34.pyc
+tests/__pycache__/test_headers.pypy3-24.pyc
 tests/__pycache__/test_in_wsgiref.cpython-32.pyc
 tests/__pycache__/test_in_wsgiref.cpython-33.pyc
 tests/__pycache__/test_in_wsgiref.cpython-34.pyc
+tests/__pycache__/test_in_wsgiref.pypy3-24.pyc
 tests/__pycache__/test_misc.cpython-32.pyc
 tests/__pycache__/test_misc.cpython-33.pyc
 tests/__pycache__/test_misc.cpython-34.pyc
+tests/__pycache__/test_misc.pypy3-24.pyc
 tests/__pycache__/test_multidict.cpython-32.pyc
 tests/__pycache__/test_multidict.cpython-33.pyc
 tests/__pycache__/test_multidict.cpython-34.pyc
+tests/__pycache__/test_multidict.pypy3-24.pyc
 tests/__pycache__/test_request.cpython-32.pyc
 tests/__pycache__/test_request.cpython-33.pyc
 tests/__pycache__/test_request.cpython-34.pyc
+tests/__pycache__/test_request.pypy3-24.pyc
 tests/__pycache__/test_request_nose.cpython-32.pyc
 tests/__pycache__/test_request_nose.cpython-33.pyc
 tests/__pycache__/test_request_nose.cpython-34.pyc
+tests/__pycache__/test_request_nose.pypy3-24.pyc
 tests/__pycache__/test_response.cpython-32.pyc
 tests/__pycache__/test_response.cpython-33.pyc
 tests/__pycache__/test_response.cpython-34.pyc
+tests/__pycache__/test_response.pypy3-24.pyc
 tests/__pycache__/test_static.cpython-32.pyc
 tests/__pycache__/test_static.cpython-33.pyc
 tests/__pycache__/test_static.cpython-34.pyc
+tests/__pycache__/test_static.pypy3-24.pyc
 tests/__pycache__/test_transcode.cpython-32.pyc
 tests/__pycache__/test_transcode.cpython-33.pyc
 tests/__pycache__/test_transcode.cpython-34.pyc
+tests/__pycache__/test_transcode.pypy3-24.pyc
 tests/__pycache__/test_util.cpython-32.pyc
 tests/__pycache__/test_util.cpython-33.pyc
 tests/__pycache__/test_util.cpython-34.pyc
+tests/__pycache__/test_util.pypy3-24.pyc
 webob/__init__.py
 webob/acceptparse.py
 webob/byterange.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/WebOb.egg-info/requires.txt 
new/WebOb-1.4.1/WebOb.egg-info/requires.txt
--- old/WebOb-1.4/WebOb.egg-info/requires.txt   2014-05-15 03:30:49.000000000 
+0200
+++ new/WebOb-1.4.1/WebOb.egg-info/requires.txt 2015-04-14 17:39:57.000000000 
+0200
@@ -1,8 +1,7 @@
 
-
 [docs]
 Sphinx
 
 [testing]
 nose
-coverage
\ No newline at end of file
+coverage
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/docs/index.txt 
new/WebOb-1.4.1/docs/index.txt
--- old/WebOb-1.4/docs/index.txt        2014-04-16 17:16:51.000000000 +0200
+++ new/WebOb-1.4.1/docs/index.txt      2015-04-13 22:15:31.000000000 +0200
@@ -7,6 +7,7 @@
    modules/webob
    modules/dec
    modules/static
+   modules/exceptions
    differences
    file-example
    wiki-example
@@ -143,8 +144,8 @@
 Methods
 -------
 
-There are `several methods <class-webob.Request.html#__init__>`_ but
-only a few you'll use often:
+There are several methods in :class:`webob.Request` but only a few you'll use
+often:
 
 ``Request.blank(base_url)``:
     Creates a new request with blank information, based at the given
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/docs/modules/exceptions.txt 
new/WebOb-1.4.1/docs/modules/exceptions.txt
--- old/WebOb-1.4/docs/modules/exceptions.txt   1970-01-01 01:00:00.000000000 
+0100
+++ new/WebOb-1.4.1/docs/modules/exceptions.txt 2015-04-04 05:09:18.000000000 
+0200
@@ -0,0 +1,64 @@
+:mod:`webob.exc` -- WebOb Exceptions
+====================================
+
+.. automodule:: webob.exc
+
+HTTP Exceptions
+---------------
+
+.. autoexception:: HTTPException
+.. autoexception:: WSGIHTTPException
+.. autoexception:: HTTPError
+.. autoexception:: HTTPRedirection
+.. autoexception:: HTTPOk
+.. autoexception:: HTTPCreated
+.. autoexception:: HTTPAccepted
+.. autoexception:: HTTPNonAuthoritativeInformation
+.. autoexception:: HTTPNoContent
+.. autoexception:: HTTPResetContent
+.. autoexception:: HTTPPartialContent
+.. autoexception:: _HTTPMove
+.. autoexception:: HTTPMultipleChoices
+.. autoexception:: HTTPMovedPermanently
+.. autoexception:: HTTPFound
+.. autoexception:: HTTPSeeOther
+.. autoexception:: HTTPNotModified
+.. autoexception:: HTTPUseProxy
+.. autoexception:: HTTPTemporaryRedirect
+.. autoexception:: HTTPClientError
+.. autoexception:: HTTPBadRequest
+.. autoexception:: HTTPUnauthorized
+.. autoexception:: HTTPPaymentRequired
+.. autoexception:: HTTPForbidden
+.. autoexception:: HTTPNotFound
+.. autoexception:: HTTPMethodNotAllowed
+.. autoexception:: HTTPNotAcceptable
+.. autoexception:: HTTPProxyAuthenticationRequired
+.. autoexception:: HTTPRequestTimeout
+.. autoexception:: HTTPConflict
+.. autoexception:: HTTPGone
+.. autoexception:: HTTPLengthRequired
+.. autoexception:: HTTPPreconditionFailed
+.. autoexception:: HTTPRequestEntityTooLarge
+.. autoexception:: HTTPRequestURITooLong
+.. autoexception:: HTTPUnsupportedMediaType
+.. autoexception:: HTTPRequestRangeNotSatisfiable
+.. autoexception:: HTTPExpectationFailed
+.. autoexception:: HTTPUnprocessableEntity
+.. autoexception:: HTTPLocked
+.. autoexception:: HTTPFailedDependency
+.. autoexception:: HTTPPreconditionRequired
+.. autoexception:: HTTPTooManyRequests
+.. autoexception:: HTTPRequestHeaderFieldsTooLarge
+.. autoexception:: HTTPUnavailableForLegalReasons
+.. autoexception:: HTTPServerError
+.. autoexception:: HTTPInternalServerError
+.. autoexception:: HTTPNotImplemented
+.. autoexception:: HTTPBadGateway
+.. autoexception:: HTTPServiceUnavailable
+.. autoexception:: HTTPGatewayTimeout
+.. autoexception:: HTTPVersionNotSupported
+.. autoexception:: HTTPInsufficientStorage
+.. autoexception:: HTTPNetworkAuthenticationRequired
+.. autoexception:: HTTPExceptionMiddleware
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/docs/news.txt new/WebOb-1.4.1/docs/news.txt
--- old/WebOb-1.4/docs/news.txt 2014-05-15 03:26:20.000000000 +0200
+++ new/WebOb-1.4.1/docs/news.txt       2015-04-14 17:33:59.000000000 +0200
@@ -1,7 +1,28 @@
 News
 ====
 
-1.4 (2013-05-14)
+1.4.1 (2015-04-14)
+------------------
+
+Bug Fixes
+~~~~~~~~~
+
+- Request.body would get mangled if the body was JSON but the right
+  content_type was not set. See https://github.com/Pylons/webob/pull/192
+
+- Read the body of a request if we think it might have a body. This fixes PATCH
+  to support bodies. See https://github.com/Pylons/webob/pull/184
+
+Documentation Changes
+~~~~~~~~~~~~~~~~~~~~~
+
+- Documentation didn't match the actual code for the wsgify function signature.
+  See https://github.com/Pylons/webob/pull/167
+
+- Remove the WebDAV only from certain HTTP Exceptions, these exceptions may
+  also be used by REST services for example.
+
+1.4 (2014-05-14)
 ----------------
 
 Features
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/setup.cfg new/WebOb-1.4.1/setup.cfg
--- old/WebOb-1.4/setup.cfg     2014-05-15 03:30:52.000000000 +0200
+++ new/WebOb-1.4.1/setup.cfg   2015-04-14 17:39:57.000000000 +0200
@@ -13,7 +13,7 @@
 universal = 1
 
 [egg_info]
-tag_build = 
 tag_date = 0
 tag_svn_revision = 0
+tag_build = 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/setup.py new/WebOb-1.4.1/setup.py
--- old/WebOb-1.4/setup.py      2014-05-15 03:24:30.000000000 +0200
+++ new/WebOb-1.4.1/setup.py    2015-04-14 17:33:16.000000000 +0200
@@ -1,6 +1,6 @@
 from setuptools import setup
 
-version = '1.4'
+version = '1.4.1'
 
 testing_extras = ['nose', 'coverage']
 
Files old/WebOb-1.4/tests/__init__.pyc and new/WebOb-1.4.1/tests/__init__.pyc 
differ
Files old/WebOb-1.4/tests/__pycache__/__init__.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/__init__.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/__init__.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/__init__.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/__init__.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/__init__.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/__init__.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/__init__.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/performance_test.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/performance_test.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/performance_test.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/performance_test.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/performance_test.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/performance_test.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/performance_test.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/performance_test.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_acceptparse.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_acceptparse.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_acceptparse.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_acceptparse.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_acceptparse.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_acceptparse.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_acceptparse.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_acceptparse.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_byterange.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_byterange.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_byterange.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_byterange.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_byterange.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_byterange.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_byterange.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_byterange.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cachecontrol.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cachecontrol.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cachecontrol.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cachecontrol.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cachecontrol.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cachecontrol.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cachecontrol.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cachecontrol.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client_functional.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client_functional.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client_functional.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client_functional.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client_functional.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client_functional.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_client_functional.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_client_functional.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_compat.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_compat.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_compat.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_compat.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_compat.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_compat.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_compat.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_compat.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies_bw.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies_bw.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies_bw.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies_bw.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies_bw.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies_bw.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_cookies_bw.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_cookies_bw.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_datetime_utils.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_datetime_utils.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_datetime_utils.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_datetime_utils.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_datetime_utils.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_datetime_utils.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_datetime_utils.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_datetime_utils.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_dec.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_dec.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_dec.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_dec.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_dec.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_dec.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_dec.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_dec.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_descriptors.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_descriptors.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_descriptors.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_descriptors.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_descriptors.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_descriptors.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_descriptors.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_descriptors.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag_nose.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag_nose.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag_nose.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag_nose.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag_nose.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag_nose.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_etag_nose.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_etag_nose.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_exc.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_exc.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_exc.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_exc.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_exc.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_exc.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_exc.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_exc.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_headers.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_headers.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_headers.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_headers.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_headers.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_headers.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_headers.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_headers.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_in_wsgiref.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_in_wsgiref.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_in_wsgiref.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_in_wsgiref.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_in_wsgiref.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_in_wsgiref.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_in_wsgiref.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_in_wsgiref.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_misc.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_misc.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_misc.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_misc.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_misc.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_misc.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_misc.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_misc.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_multidict.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_multidict.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_multidict.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_multidict.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_multidict.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_multidict.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_multidict.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_multidict.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request_nose.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request_nose.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request_nose.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request_nose.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request_nose.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request_nose.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_request_nose.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_request_nose.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_response.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_response.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_response.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_response.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_response.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_response.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_response.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_response.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_static.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_static.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_static.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_static.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_static.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_static.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_static.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_static.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_transcode.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_transcode.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_transcode.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_transcode.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_transcode.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_transcode.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_transcode.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_transcode.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_util.cpython-32.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_util.cpython-32.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_util.cpython-33.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_util.cpython-33.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_util.cpython-34.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_util.cpython-34.pyc differ
Files old/WebOb-1.4/tests/__pycache__/test_util.pypy3-24.pyc and 
new/WebOb-1.4.1/tests/__pycache__/test_util.pypy3-24.pyc differ
Files old/WebOb-1.4/tests/performance_test.pyc and 
new/WebOb-1.4.1/tests/performance_test.pyc differ
Files old/WebOb-1.4/tests/test_acceptparse.pyc and 
new/WebOb-1.4.1/tests/test_acceptparse.pyc differ
Files old/WebOb-1.4/tests/test_byterange.pyc and 
new/WebOb-1.4.1/tests/test_byterange.pyc differ
Files old/WebOb-1.4/tests/test_cachecontrol.pyc and 
new/WebOb-1.4.1/tests/test_cachecontrol.pyc differ
Files old/WebOb-1.4/tests/test_client.pyc and 
new/WebOb-1.4.1/tests/test_client.pyc differ
Files old/WebOb-1.4/tests/test_client_functional.pyc and 
new/WebOb-1.4.1/tests/test_client_functional.pyc differ
Files old/WebOb-1.4/tests/test_compat.pyc and 
new/WebOb-1.4.1/tests/test_compat.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/tests/test_cookies.py 
new/WebOb-1.4.1/tests/test_cookies.py
--- old/WebOb-1.4/tests/test_cookies.py 2014-02-22 17:50:32.000000000 +0100
+++ new/WebOb-1.4.1/tests/test_cookies.py       2015-04-13 22:15:31.000000000 
+0200
@@ -160,11 +160,6 @@
     result = repr(v)
     eq_(result, "<Morsel: a='b'>")
 
-def test_strings_differ():
-    from webob.util import strings_differ
-
-    eq_(strings_differ('test1', 'test'), True)
-
 class TestRequestCookies(unittest.TestCase):
     def _makeOne(self, environ):
         from webob.cookies import RequestCookies
Files old/WebOb-1.4/tests/test_cookies.pyc and 
new/WebOb-1.4.1/tests/test_cookies.pyc differ
Files old/WebOb-1.4/tests/test_cookies_bw.pyc and 
new/WebOb-1.4.1/tests/test_cookies_bw.pyc differ
Files old/WebOb-1.4/tests/test_datetime_utils.pyc and 
new/WebOb-1.4.1/tests/test_datetime_utils.pyc differ
Files old/WebOb-1.4/tests/test_dec.pyc and new/WebOb-1.4.1/tests/test_dec.pyc 
differ
Files old/WebOb-1.4/tests/test_descriptors.pyc and 
new/WebOb-1.4.1/tests/test_descriptors.pyc differ
Files old/WebOb-1.4/tests/test_etag.pyc and new/WebOb-1.4.1/tests/test_etag.pyc 
differ
Files old/WebOb-1.4/tests/test_etag_nose.pyc and 
new/WebOb-1.4.1/tests/test_etag_nose.pyc differ
Files old/WebOb-1.4/tests/test_exc.pyc and new/WebOb-1.4.1/tests/test_exc.pyc 
differ
Files old/WebOb-1.4/tests/test_headers.pyc and 
new/WebOb-1.4.1/tests/test_headers.pyc differ
Files old/WebOb-1.4/tests/test_in_wsgiref.pyc and 
new/WebOb-1.4.1/tests/test_in_wsgiref.pyc differ
Files old/WebOb-1.4/tests/test_misc.pyc and new/WebOb-1.4.1/tests/test_misc.pyc 
differ
Files old/WebOb-1.4/tests/test_multidict.pyc and 
new/WebOb-1.4.1/tests/test_multidict.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/tests/test_request.py 
new/WebOb-1.4.1/tests/test_request.py
--- old/WebOb-1.4/tests/test_request.py 2014-05-15 03:09:30.000000000 +0200
+++ new/WebOb-1.4.1/tests/test_request.py       2015-04-13 17:44:52.000000000 
+0200
@@ -512,6 +512,21 @@
         result = req.POST
         self.assertEqual(result['var1'], 'value1')
 
+    def test_POST_json_no_content_type(self):
+        data = b'{"password": "last centurion", "email": "r...@wiggy.net"}'
+        INPUT = BytesIO(data)
+        environ = {'wsgi.input': INPUT,
+                   'REQUEST_METHOD': 'POST',
+                   'CONTENT_LENGTH':len(data),
+                   'webob.is_body_seekable': True,
+                  }
+        req = self._makeOne(environ)
+        r_1 = req.body
+        r_2 = req.POST
+        r_3 = req.body
+        self.assertEqual(r_1, b'{"password": "last centurion", "email": 
"r...@wiggy.net"}')
+        self.assertEqual(r_3, b'{"password": "last centurion", "email": 
"r...@wiggy.net"}')
+
     def test_PUT_bad_content_type(self):
         from webob.multidict import NoVars
         data = b'input'
@@ -2865,6 +2880,14 @@
         )
         self.assertRaises(ValueError, cls.from_file, val_file)
 
+    def test_from_file_patch(self):
+        cls = self._getTargetClass()
+        req = cls.from_bytes(_test_req_patch)
+        self.assertEqual("PATCH", req.method)
+        self.assertTrue(len(req.body))
+        self.assertTrue(req.body in _test_req_patch)
+        self.assertEqual(_test_req_patch, req.as_bytes())
+
     def test_from_bytes(self):
         # A valid request without a Content-Length header should still read
         # the full body.
@@ -2972,14 +2995,10 @@
             content_type='multipart/form-data; boundary=boundary',
             POST=_cgi_escaping_body
         )
-        f0 = req.body_file_raw
         post1 = req.POST
-        f1 = req.body_file_raw
-        self.assertTrue(f1 is not f0)
+        self.assertTrue('webob._parsed_post_vars' in req.environ)
         post2 = req.POST
-        f2 = req.body_file_raw
         self.assertTrue(post1 is post2)
-        self.assertTrue(f1 is f2)
 
 
     def test_middleware_body(self):
@@ -3383,6 +3402,11 @@
                            'application/x-www-form-urlencoded')
         self.assertEqual(body.read(), b'bananas=bananas')
 
+    def test_readable(self):
+        from webob.request import FakeCGIBody
+        body = FakeCGIBody({'bananas': 'bananas'}, 'application/something')
+        self.assertTrue(body.readable())
+
 
 class Test_cgi_FieldStorage__repr__patch(unittest.TestCase):
     def _callFUT(self, fake):
@@ -3563,6 +3587,14 @@
 ------------------------------deb95b63e42a--
 """
 
+_test_req_patch = b"""
+PATCH /webob/ HTTP/1.1
+Content-Length: 14
+Content-Type: application/json
+
+{"foo": "bar"}
+"""
+
 _test_req2 = b"""
 POST / HTTP/1.0
 Content-Length: 0
@@ -3606,6 +3638,7 @@
 
 
 _test_req = _norm_req(_test_req)
+_test_req_patch = _norm_req(_test_req_patch)
 _test_req2 = _norm_req(_test_req2) + b'\r\n'
 _test_req_multipart_charset = _norm_req(_test_req_multipart_charset)
 
Files old/WebOb-1.4/tests/test_request.pyc and 
new/WebOb-1.4.1/tests/test_request.pyc differ
Files old/WebOb-1.4/tests/test_request_nose.pyc and 
new/WebOb-1.4.1/tests/test_request_nose.pyc differ
Files old/WebOb-1.4/tests/test_response.pyc and 
new/WebOb-1.4.1/tests/test_response.pyc differ
Files old/WebOb-1.4/tests/test_static.pyc and 
new/WebOb-1.4.1/tests/test_static.pyc differ
Files old/WebOb-1.4/tests/test_transcode.pyc and 
new/WebOb-1.4.1/tests/test_transcode.pyc differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/tests/test_util.py 
new/WebOb-1.4.1/tests/test_util.py
--- old/WebOb-1.4/tests/test_util.py    2014-05-15 03:21:14.000000000 +0200
+++ new/WebOb-1.4.1/tests/test_util.py  2015-04-13 17:44:52.000000000 +0200
@@ -48,3 +48,47 @@
         from webob.util import warn_deprecation
         warn_deprecation('foo', v[:3], 1)
         self.assertEqual(len(self.warnings), 1)
+
+class Test_strings_differ(unittest.TestCase):
+    def _callFUT(self, *args, **kw):
+        from webob.util import strings_differ
+        return strings_differ(*args, **kw)
+
+    def test_it(self):
+        self.assertFalse(self._callFUT(b'foo', b'foo'))
+        self.assertTrue(self._callFUT(b'123', b'345'))
+        self.assertTrue(self._callFUT(b'1234', b'123'))
+        self.assertTrue(self._callFUT(b'123', b'1234'))
+
+    def test_it_with_internal_comparator(self):
+        result = self._callFUT(b'foo', b'foo', compare_digest=None)
+        self.assertFalse(result)
+
+        result = self._callFUT(b'123', b'abc', compare_digest=None)
+        self.assertTrue(result)
+
+    def test_it_with_external_comparator(self):
+        class DummyComparator(object):
+            called = False
+            def __init__(self, ret_val):
+                self.ret_val = ret_val
+
+            def __call__(self, a, b):
+                self.called = True
+                return self.ret_val
+
+        dummy_compare = DummyComparator(True)
+        result = self._callFUT(b'foo', b'foo', compare_digest=dummy_compare)
+        self.assertTrue(dummy_compare.called)
+        self.assertFalse(result)
+
+        dummy_compare = DummyComparator(False)
+        result = self._callFUT(b'123', b'345', compare_digest=dummy_compare)
+        self.assertTrue(dummy_compare.called)
+        self.assertTrue(result)
+
+        dummy_compare = DummyComparator(False)
+        result = self._callFUT(b'abc', b'abc', compare_digest=dummy_compare)
+        self.assertTrue(dummy_compare.called)
+        self.assertTrue(result)
+
Files old/WebOb-1.4/tests/test_util.pyc and new/WebOb-1.4.1/tests/test_util.pyc 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/tox.ini new/WebOb-1.4.1/tox.ini
--- old/WebOb-1.4/tox.ini       2014-04-16 17:16:51.000000000 +0200
+++ new/WebOb-1.4.1/tox.ini     1970-01-01 01:00:00.000000000 +0100
@@ -1,17 +0,0 @@
-[tox]
-envlist =
-    py26,py27,py32,py33,py34,pypy,cover
-
-[testenv]
-commands =
-    python setup.py dev
-    python setup.py nosetests
-
-[testenv:cover]
-basepython =
-    python2.6
-commands =
-    python setup.py dev
-    python setup.py nosetests --with-xunit --with-xcoverage
-deps =
-    nosexcover
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/toxfast.ini new/WebOb-1.4.1/toxfast.ini
--- old/WebOb-1.4/toxfast.ini   2012-10-31 19:21:40.000000000 +0100
+++ new/WebOb-1.4.1/toxfast.ini 1970-01-01 01:00:00.000000000 +0100
@@ -1,10 +0,0 @@
-[tox]
-envlist =
-    py26,py32
-
-[testenv]
-commands =
-    python setup.py dev
-    python setup.py nosetests
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/webob/dec.py new/WebOb-1.4.1/webob/dec.py
--- old/WebOb-1.4/webob/dec.py  2012-01-31 17:47:47.000000000 +0100
+++ new/WebOb-1.4.1/webob/dec.py        2015-04-04 05:14:18.000000000 +0200
@@ -222,7 +222,7 @@
         Use this like::
 
             @wsgify.middleware
-            def restrict_ip(app, req, ips):
+            def restrict_ip(req, app, ips):
                 if req.remote_addr not in ips:
                     raise webob.exc.HTTPForbidden('Bad IP: %s' % 
req.remote_addr)
                 return app
@@ -236,7 +236,7 @@
         Or if you want to write output-rewriting middleware::
 
             @wsgify.middleware
-            def all_caps(app, req):
+            def all_caps(req, app):
                 resp = req.get_response(app)
                 resp.body = resp.body.upper()
                 return resp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/webob/exc.py new/WebOb-1.4.1/webob/exc.py
--- old/WebOb-1.4/webob/exc.py  2014-05-15 03:09:30.000000000 +0200
+++ new/WebOb-1.4.1/webob/exc.py        2015-04-04 05:09:18.000000000 +0200
@@ -1,6 +1,4 @@
 """
-HTTP Exception
---------------
 This module processes Python exceptions that relate to HTTP exceptions
 by defining a set of exceptions, all subclasses of HTTPException.
 Each exception, in addition to being a Python exception that can be
@@ -20,56 +18,59 @@
 Exception
   HTTPException
     HTTPOk
-      * 200 - HTTPOk
-      * 201 - HTTPCreated
-      * 202 - HTTPAccepted
-      * 203 - HTTPNonAuthoritativeInformation
-      * 204 - HTTPNoContent
-      * 205 - HTTPResetContent
-      * 206 - HTTPPartialContent
+      * 200 - :class:`HTTPOk`
+      * 201 - :class:`HTTPCreated`
+      * 202 - :class:`HTTPAccepted`
+      * 203 - :class:`HTTPNonAuthoritativeInformation`
+      * 204 - :class:`HTTPNoContent`
+      * 205 - :class:`HTTPResetContent`
+      * 206 - :class:`HTTPPartialContent`
     HTTPRedirection
-      * 300 - HTTPMultipleChoices
-      * 301 - HTTPMovedPermanently
-      * 302 - HTTPFound
-      * 303 - HTTPSeeOther
-      * 304 - HTTPNotModified
-      * 305 - HTTPUseProxy
-      * 306 - Unused (not implemented, obviously)
-      * 307 - HTTPTemporaryRedirect
+      * 300 - :class:`HTTPMultipleChoices`
+      * 301 - :class:`HTTPMovedPermanently`
+      * 302 - :class:`HTTPFound`
+      * 303 - :class:`HTTPSeeOther`
+      * 304 - :class:`HTTPNotModified`
+      * 305 - :class:`HTTPUseProxy`
+      * 307 - :class:`HTTPTemporaryRedirect`
     HTTPError
       HTTPClientError
-        * 400 - HTTPBadRequest
-        * 401 - HTTPUnauthorized
-        * 402 - HTTPPaymentRequired
-        * 403 - HTTPForbidden
-        * 404 - HTTPNotFound
-        * 405 - HTTPMethodNotAllowed
-        * 406 - HTTPNotAcceptable
-        * 407 - HTTPProxyAuthenticationRequired
-        * 408 - HTTPRequestTimeout
-        * 409 - HTTPConflict
-        * 410 - HTTPGone
-        * 411 - HTTPLengthRequired
-        * 412 - HTTPPreconditionFailed
-        * 413 - HTTPRequestEntityTooLarge
-        * 414 - HTTPRequestURITooLong
-        * 415 - HTTPUnsupportedMediaType
-        * 416 - HTTPRequestRangeNotSatisfiable
-        * 417 - HTTPExpectationFailed
-        * 428 - HTTPPreconditionRequired
-        * 429 - HTTPTooManyRequests
-        * 431 - HTTPRequestHeaderFieldsTooLarge
+        * 400 - :class:`HTTPBadRequest`
+        * 401 - :class:`HTTPUnauthorized`
+        * 402 - :class:`HTTPPaymentRequired`
+        * 403 - :class:`HTTPForbidden`
+        * 404 - :class:`HTTPNotFound`
+        * 405 - :class:`HTTPMethodNotAllowed`
+        * 406 - :class:`HTTPNotAcceptable`
+        * 407 - :class:`HTTPProxyAuthenticationRequired`
+        * 408 - :class:`HTTPRequestTimeout`
+        * 409 - :class:`HTTPConflict`
+        * 410 - :class:`HTTPGone`
+        * 411 - :class:`HTTPLengthRequired`
+        * 412 - :class:`HTTPPreconditionFailed`
+        * 413 - :class:`HTTPRequestEntityTooLarge`
+        * 414 - :class:`HTTPRequestURITooLong`
+        * 415 - :class:`HTTPUnsupportedMediaType`
+        * 416 - :class:`HTTPRequestRangeNotSatisfiable`
+        * 417 - :class:`HTTPExpectationFailed`
+        * 422 - :class:`HTTPUnprocessableEntity`
+        * 423 - :class:`HTTPLocked`
+        * 424 - :class:`HTTPFailedDependency`
+        * 428 - :class:`HTTPPreconditionRequired`
+        * 429 - :class:`HTTPTooManyRequests`
+        * 431 - :class:`HTTPRequestHeaderFieldsTooLarge`
+        * 451 - :class:`HTTPUnavailableForLegalReasons`
       HTTPServerError
-        * 500 - HTTPInternalServerError
-        * 501 - HTTPNotImplemented
-        * 502 - HTTPBadGateway
-        * 503 - HTTPServiceUnavailable
-        * 504 - HTTPGatewayTimeout
-        * 505 - HTTPVersionNotSupported
-        * 511 - HTTPNetworkAuthenticationRequired
+        * 500 - :class:`HTTPInternalServerError`
+        * 501 - :class:`HTTPNotImplemented`
+        * 502 - :class:`HTTPBadGateway`
+        * 503 - :class:`HTTPServiceUnavailable`
+        * 504 - :class:`HTTPGatewayTimeout`
+        * 505 - :class:`HTTPVersionNotSupported`
+        * 511 - :class:`HTTPNetworkAuthenticationRequired`
 
-Subclass usage notes:
----------------------
+Usage notes
+-----------
 
 The HTTPException class is complicated by 4 factors:
 
@@ -608,6 +609,8 @@
     in-error.  This is an expected problem, and thus is not considered
     a bug.  A server-side traceback is not warranted.  Unless specialized,
     this is a '400 Bad Request'
+
+    code: 400, title: Bad Request
     """
     code = 400
     title = 'Bad Request'
@@ -866,7 +869,7 @@
     subclass of :class:`~HTTPClientError`
 
     This indicates that the server is unable to process the contained
-    instructions. Only for WebDAV.
+    instructions.
 
     code: 422, title: Unprocessable Entity
     """
@@ -879,7 +882,7 @@
     """
     subclass of :class:`~HTTPClientError`
 
-    This indicates that the resource is locked. Only for WebDAV
+    This indicates that the resource is locked.
 
     code: 423, title: Locked
     """
@@ -894,7 +897,6 @@
 
     This indicates that the method could not be performed because the
     requested action depended on another action and that action failed.
-    Only for WebDAV.
 
     code: 424, title: Failed Dependency
     """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/webob/request.py 
new/WebOb-1.4.1/webob/request.py
--- old/WebOb-1.4/webob/request.py      2014-05-15 03:16:02.000000000 +0200
+++ new/WebOb-1.4.1/webob/request.py    2015-04-13 22:15:31.000000000 +0200
@@ -785,8 +785,10 @@
             return NoVars('Not an HTML form submission (Content-Type: %s)'
                           % content_type)
         self._check_charset()
-        if self.is_body_seekable:
-            self.body_file_raw.seek(0)
+
+        self.make_body_seekable()
+        self.body_file_raw.seek(0)
+
         fs_environ = env.copy()
         # FieldStorage assumes a missing CONTENT_LENGTH, but a
         # default of 0 is better:
@@ -806,11 +808,6 @@
                 keep_blank_values=True)
             vars = MultiDict.from_fieldstorage(fs)
 
-
-        #ctype = self.content_type or 'application/x-www-form-urlencoded'
-        ctype = self._content_type_raw or 'application/x-www-form-urlencoded'
-        f = FakeCGIBody(vars, ctype)
-        self.body_file = io.BufferedReader(f)
         env['webob._parsed_post_vars'] = (vars, self.body_file_raw)
         return vars
 
@@ -1146,7 +1143,7 @@
         # acquire body before we handle headers so that
         # content-length will be set
         body = None
-        if self.method in ('PUT', 'POST'):
+        if http_method_probably_has_body.get(self.method):
             if skip_body > 1:
                 if len(self.body) > skip_body:
                     body = bytes_('<body skipped (len=%s)>' % len(self.body))
@@ -1248,7 +1245,7 @@
             if hname in r.headers:
                 hval = r.headers[hname] + ', ' + hval
             r.headers[hname] = hval
-        if r.method in ('PUT', 'POST'):
+        if http_method_probably_has_body.get(r.method):
             clen = r.content_length
             if clen is None:
                 body = fp.read()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/WebOb-1.4/webob/util.py new/WebOb-1.4.1/webob/util.py
--- old/WebOb-1.4/webob/util.py 2014-05-15 03:19:24.000000000 +0200
+++ new/WebOb-1.4.1/webob/util.py       2015-04-13 17:44:52.000000000 +0200
@@ -133,10 +133,10 @@
 try:
     # py3.3+ have native comparison support
     from hmac import compare_digest
-except ImportError:
+except ImportError: # pragma: nocover (Python 2.7.7 backported this)
     compare_digest = None
 
-def strings_differ(string1, string2):
+def strings_differ(string1, string2, compare_digest=compare_digest):
     """Check whether two strings differ while avoiding timing attacks.
 
     This function returns True if the given strings differ and False
@@ -146,6 +146,10 @@
 
         http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf
 
+    .. versionchanged:: 1.5
+       Support :func:`hmac.compare_digest` if it is available (Python 2.7.7+
+       and Python 3.3+).
+
     """
     len_eq = len(string1) == len(string2)
     if len_eq:
@@ -156,9 +160,10 @@
         left = string2
     right = string2
 
-    if compare_digest is not None: # pragma: nocover (Python 3.3+ only)
+    if compare_digest is not None:
         invalid_bits += not compare_digest(left, right)
     else:
         for a, b in zip(left, right):
             invalid_bits += a != b
     return invalid_bits != 0
+


Reply via email to