python-oauth2 (1.5.211) maverick; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 13 Dec 2011 17:39:07 +0000

python-oauth2 (1.5.210) maverick; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 09 Dec 2011 01:17:31 +0000

python-oauth2 (1.5.170) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 02 May 2011 23:48:16 +0000

python-oauth2 (1.5.169) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 15 Apr 2011 21:29:41 +0000

python-oauth2 (1.5.168) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 05 Apr 2011 23:13:18 +0000

python-oauth2 (1.5.167) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Thu, 17 Feb 2011 21:56:49 +0000

python-oauth2 (1.5.166) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * fix encoding of non-ascii data into postdata, really fixes #48 this
    time (comes with test)

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 15 Feb 2011 17:23:00 +0000

python-oauth2 (1.5.165) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * get_normalized_parameters() is required to exclude any
    oauth_signature that was already there, and it is required to
    preserve duplicate keys, even with identical values ref #46, fixes
    pull/49, thanks @zyegfryed

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 07 Feb 2011 19:24:56 +0000

python-oauth2 (1.5.164) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * make it actually inspect the request, and fix the test to require
    the right things of the request ref #46, ref pull/49, thanks
    @zyegfryed

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 07 Feb 2011 18:53:56 +0000

python-oauth2 (1.5.163) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * add test of #46; fixes #46

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 04 Feb 2011 18:14:56 +0000

python-oauth2 (1.5.162) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * import parse_qs from cgi if it can't be imported from urlparse, thus
    regaining compatibility with Python 2.5 fixes #47 thanks to @vtsao,
    @subsume, @worksology

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 04 Feb 2011 17:50:56 +0000

python-oauth2 (1.5.161) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * Include all parameters from URL, even ones that begin with "oauth_",
    in signature base. effectively reverts
    https://github.com/simplegeo/python-
    oauth2/commit/50ca9578f598faff5427e58814e2f45d01d3261c fixes #27
    Thanks to @robhudson for the bug report and help debugging.

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Thu, 03 Feb 2011 18:03:59 +0000

python-oauth2 (1.5.160) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * add another unicode test case to the tests just to show to user
    saevarom on github

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Thu, 03 Feb 2011 00:01:55 +0000

python-oauth2 (1.5.159) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Thu, 03 Feb 2011 00:00:04 +0000

python-oauth2 (1.5.158) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * keep empty params parsed from the URL (fixes #22)

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Wed, 02 Feb 2011 19:34:25 +0000

python-oauth2 (1.5.155) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * use multiple values under the same key from the body (fixes #23)
    Thanks to rogerm, ideasculptor, jiivan, timgraham.

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 01 Feb 2011 23:43:56 +0000

python-oauth2 (1.5.154) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 01 Feb 2011 18:03:58 +0000

python-oauth2 (1.5.153) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * add work-around for bug unicode-handling in urlparse in Python <
    2.7, including tests

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 01 Feb 2011 16:31:56 +0000

python-oauth2 (1.5.152) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * another test for handling of non-ascii, non-utf-8 urls

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 28 Jan 2011 18:14:34 +0000

python-oauth2 (1.5.151) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Thu, 27 Jan 2011 05:31:55 +0000

python-oauth2 (1.5.150) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Wed, 26 Jan 2011 17:15:25 +0000

python-oauth2 (1.5.149) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * add the body-hash header as specified in
    http://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-
    bodyhash.html

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Wed, 26 Jan 2011 17:11:34 +0000

python-oauth2 (1.5.148) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * default body is the empty string rather than None; add the Realm
    header

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Wed, 26 Jan 2011 17:02:34 +0000

python-oauth2 (1.5.147) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * pass the body and the is_form_encoding flag in to the Request object
    (for future use in implementing the hash-of-body extension)

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 25 Jan 2011 17:39:34 +0000

python-oauth2 (1.5.146) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * refactor internals of the way Client.request() decides whether this
    is a x-www-form-urlencoded request or not

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 25 Jan 2011 17:30:38 +0000

python-oauth2 (1.5.145) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * update version number from 1.4 to 1.5

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 22:08:36 +0000

python-oauth2 (1.4.144) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * more thorough unit tests for non-ascii urls, params, and query-args-
    in-url

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 22:02:34 +0000

python-oauth2 (1.4.143) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * use two-part version number -- version is manually modified, build-
    number is automatically modified

  [ Simple Geebus ]

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 20:21:20 +0000

python-oauth2 (1.4.134) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 18:30:58 +0000

python-oauth2 (1.4.133) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * handle unicode objects and utf-8 strings in url and params and
    encode them to utf-8 when serializing

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 18:25:54 +0000

python-oauth2 (1.4.132) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 17:39:52 +0000

python-oauth2 (1.4.131) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 17:32:18 +0000

python-oauth2 (1.4.130) lucid; urgency=low

  * UNRELEASED

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 24 Jan 2011 17:22:46 +0000

python-oauth2 (1.4.129) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * change manually-managed version number from 1.3 to 1.4

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Fri, 21 Jan 2011 19:52:32 +0000

python-oauth2 (1.3.128) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * raise an exception if the URL passed in is not a unicode object nor
    ascii We can't submit a correct URL with arbitrary bytes -- we have
    to submit a utf-8 encoded unicode string. (Otherwise we'll cause
    either a rejection or a signature mismatch in the server, which is
    what has happened at SimpleGeo.) If the caller passes in non-ascii
    things in a str then it would be better for them to change their
    code to decode it to unicode before passing it in than for us to
    decode it, since they have a better chance of knowing what encoding
    it is in -- if we did it we would be guessing.
  * fix flaws pointed out by ieure, plus test failures I'm not entirely
    sure it is appropriate to allow .url and .normalized_url to be non-
    existent in addition to allowing them to be None, but I don't really
    understand the intent of the url setter.
  * Oh, after we've made sure it can be converted to unicode, just leave
    it as a unicode object after that.
  * raise more specific error message if argument to to_unicode() is
    neither unicode nor str
  * a couple of cleanups suggested by ieure in code review

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Mon, 10 Jan 2011 22:42:35 +0000

python-oauth2 (1.3.127) lucid; urgency=low

  [ Zooko Ofsimplegeo ]
  * run tests when building
  * raise exception from a test just to see if hudson is *really*
    running these tests. I don't see the test results.
  * put version number in a file where it can be read and written by
    various things (including hudson)
  * make oauth2.__version__ exist, rename VERSION to OAUTH_VERSION for
    clarity
  * debian/control -- build-dep pyflakes
  * fix pyflakes
  * build-dep requires python-coverage
  * switch from nosetests to the builtin test runner Just because it
    doesn't seem to currently use any feature of nosetest and this way
    we can reduce the dependencies by one. We'll feel free to switch it
    back to using nosetests (and add the dep to debian/control this
    time) if we want to use some extra feature of nose.
  * remove test failure which was inserted just to see if hudson was
    running the tests properly
  * Fix bug inserted by pyflakes inspired cleanup earlier -- it turns
    out that _get_version() wasn't dead code but was having a necessary
    side-effect. Add new method named _check_version() to be clearer
    about what it does compared to _get_version()
  * port tests from mox to mock because they were failing and I don't
    understand mox. now they are working. add mock to the python and
    debian deps. remove apparently left-over line of code that runs
    "sign()" at the end of checking a signature

  [ SimpleGeo Nerds ]

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Tue, 04 Jan 2011 19:39:34 +0000

python-oauth2 (1.2.1) lucid; urgency=low

  [ Joe Stump ]
  * Fixed a minor spelling error, added tests for
    oauth2.Error.__str__(), and added a test for build_xoauth_string().
  * Added a 'make test' command to the Makefile.
  * Added a bunch of new tests. 100% coverage has lapsed a bit. Fixing
    now.

  [ Ian Eure ]
  * Update deb rule in makefile to sign packages and move them to
    dist/deb.

  [ Joe Stump ]
  * Implemented a 'fix' for a bug in certain OAuth providers.
    http://bit.ly/aUrH43

  [ Ian Eure ]
  * Update packaging.
  * Fix version disparity.

  [ coulix ]
  * get normalised parameters should not take into account oauth_ params

  [ Mathias Herberts ]
  * Modified get_normalized_parameters so it does not encode '~' for
    full conformance with RFC 5849 section 3.6

  [ Peter Bengtsson ]
  * made it python 2.4 compatible

  [ Roderic Campbell ]
  * tok != token. con != consumer. May be confusing for people not
    actually reading the code.

  [ Ian Eure ]

 -- Ian Eure <ian@simplegeo.com>  Mon, 28 Jun 2010 12:02:02 -0700

python-oauth2 (1.2.1pre2) unstable; urgency=low

  * Fix version disparity between setup.py & debian/changelog.

 -- Ian Eure <ian@simplegeo.com>  Fri, 11 Jun 2010 16:11:41 -0700

python-oauth2 (1.2.1pre1) unstable; urgency=low

  * Make a native package.
  * Increment version.
  * Make debian/rules executable.
  * Update standards-version, maintainers.
  * Remvoe unneeded python-central build dependency.

 -- Ian Eure <ian@simplegeo.com>  Fri, 11 Jun 2010 16:09:01 -0700

python-oauth2 (1.0.0-1simplegeo01) karmic; urgency=low

  * Initial build for SimpleGeo

 -- SimpleGeo Nerds <nerds@simplegeo.com>  Wed, 21 Oct 2009 23:24:00 -0700
