=== 2.0.18 ===
1173[tip]   93c436da2d19   2013-06-14 07:21 -0700   afshar
  Remove unused script.

1172   e692050ec194   2013-06-14 07:20 -0700   afshar
  Updated docs.

1171   159874713088   2013-06-14 07:20 -0700   afshar
  Bumped version.

1170   7b4e3c22e83c   2013-06-07 15:52 +0200   burcud
  Adding missing unit attributes for unit picing elements.

1169   ad8ee900dda5   2013-06-06 19:01 +0200   burcud
  Fixing identifier_exists attribute for product items.

1168   d6ce8dc4970a   2013-06-06 17:53 +0200   burcud
  Fixing multipack attribute.

1167   b87779918c90   2013-06-06 15:10 +0200   burcud
  Adding new product spec attributes.

1166   624d33ad26f2   2013-02-11 12:47 -0800   rkubiak
  Update Sites Python API to allow page creation from a template

1165   ecb1d49b5fbe   2013-01-07 11:29 -0800   dhermes
  Adding an OAuth2Token subclass which can interact with google-api-python-client.

1164   f76c53eaf151   2012-11-20 16:09 +0100   burcud
  Modifying Content API for Shopping client to use schema projection.

1163   a8c25010b8b7   2012-08-27 13:50 -0700   dhermes
  Adding in ability to change Content for Shopping base URI via a kwarg for client constructor. (Fixes 6479060).

1162   c5d57eff0ef4   2012-08-15 08:31 -0700   dhermes
  Adding paid clicks to Content API performance datapoint. (Issue 6443130)

1161   71971b013563   2012-08-06 15:20 -0700   dhermes
  Adding support for adwords_accounts settings element in managedaccounts feed of Content API. (6443092)

1160   cf0208e89433   2012-07-30 09:53 -0700   dhermes
  Changing OAuth2 Authorization Header lead in from OAuth to Bearer (per http://goo.gl/QDiLZ). (issue 6455060)

1159   3b021605570f   2012-07-12 18:14 -0700   dhermes
  Adding missing name XML attribute to gdata.contentforshopping.data.Group.

1158   524fc2b2e821   2012-06-19 08:43 -0700   dhermes
  Renaming classes for inventory feed of Content API. (Issue 6296085)

1157   32c0cb313b2e   2012-06-14 15:36 -0700   dhermes
  Updating offline URI for OAuth2 and explicity specifying approval_prompt as a kw arg. (Issue 6296072)

1156   f7593ae5d035   2012-06-14 15:35 -0700   dhermes
  Added individual get for ManagedAccounts, functionality for paging and changed to correct endpoint. (issue 6304076)

1155   723e577ada7b   2012-06-14 13:53 -0700   dhermes
  Adding support for Local Products feed in Content API. (Issue 6305091)

1154   75ee2830ca74   2012-06-13 12:48 -0700   dhermes
  Adding support for wrong open search version hack on other ContentAPI Feed classes. (Issue 6296071)

1153   f783c64b953f   2012-06-13 10:07 -0700   dhermes
  Adding support for Data Quality Feed of Content API for Shopping. (Issue 6295074)

1152   4cc916619658   2012-06-13 09:07 -0700   dhermes
  Adding back accidentally removed code from commit c92bc870e3a4363bed2732d50d782189407af7ac.

1151   c92bc870e3a4   2012-06-13 09:01 -0700   dhermes
  Adding support for Content API Users Feed. (Issue 6295071)

1150   0dcb1f3aff81   2012-06-12 17:25 -0700   dhermes
  Adding custom id parser for Content API errors. (issue 6306073)

1149   8f11de681f03   2012-06-12 17:21 -0700   dhermes
  Adding support for product status elements in app:control for content for shopping. (Fixes 6299076)

=== 2.0.17 ===
1143   3a0447b78b27   2012-04-20 13:25 -0400   jeffy
  The gdata.youtube.service class now explicitly sets the GData-Version: 1 header, and is updated to use the correct ClientLogin URL.

1142   1e302ccfd1db   2012-04-19 14:09 -0700   dhermes
  Adding support for OAuth2 revoke endpoint.

1141   7dbf78073e2c   2012-04-18 09:51 -0700   alainv
  Make Resource and ResourceFeed "Batch" compatible.

1140   cde9a812ff75   2012-04-02 22:25 -0700   dhermes
  Forgot to add camelcase alias for batch in issue 5970062.

1139   f3db7c388325   2012-04-02 20:37 -0700   dhermes
  Adding support for performance data in Content API for Shopping (fixes Issue 5976061).

1138   f5d8bd1a5d58   2012-04-02 20:30 -0700   dhermes
  Added support for custom attributes in Content API for Shopping (fixes Issue 5970070).

1137   df2263245009   2012-04-02 08:18 -0700   dhermes
  Changed dest attrs in Content API to iterable, added validate_dest and fixed qname on app:control (fixes Issue 5976046).

1136   6fa84c09df8e   2012-04-02 07:46 -0700   dhermes
  Added camel case names to content API client public methods (fixes Issue 5970062).

1135   f5d03167e6de   2012-04-02 07:38 -0700   dhermes
  Added support for Content for API errors on single and batch requests (fixes Issue 5971061).

1134   906bb1d9c899   2012-04-02 07:31 -0700   dhermes
  Added support for start-token in Content API for Shopping (closes Issue 5980044).

1133   f98fff494fb8   2012-03-30 11:36 -0700   alainv
  Change gdata.docs.client.DocsClient.DeleteResource to use the entry instead of the link.

1132   e3594e4ea683   2012-03-30 10:56 -0700   alainv
  Allow for random kwargs in atom.client.AtomClient.request method.

1131   57db9d630ee7   2012-03-29 15:44 -0700   dhermes
  Changing Shipping to list element in Content API for Shopping.

1130   ab61823f2562   2012-03-29 15:34 -0700   dhermes
  Fixing behavior in atom.http_core.Uri._get_query_string for query parameters with no parameter value (closes Issue 5938047).

1129   583a2f25c123   2012-03-27 15:21 -0700   dhermes
  Fixed batch function issues in content api for shopping client.

1128   900e9a0c3b3a   2012-03-03 18:08 -0800   ccherubino
  Updated GetFeed methods in the Email Settings API to return typed feeds

1127   c21438385488   2012-02-29 09:18 -0800   dhermes
  Namespace for channel element (in contentforshopping) was promoted from scp to sc.

1126   5e7914da3fc5   2012-02-13 10:29 -0500   afshar
  Fixed release date year.

1125   78f1044f8338   2012-02-09 16:48 -0800   ccherubino
  Fixing bug in recent change to the Email Settings API client library (rev. 194d0fd21fdd) + some typos

1123   194d0fd21fdd   2012-02-09 11:29 -0800   ccherubino
  Updating the Email Settings API to return instances of the correct classes when retrieving settings

1122:1120   5d90af058646   2012-02-09 17:14 +0530   shraddhag
  Added a sample to create a group and update its settings using the Groups Provisioning and Groups Settings APIs.

1121   632df99f18bb   2012-02-09 14:30 -0500   afshar
  Added docs:description element to docs resources.

1120   b916755be737   2012-02-02 09:49 -0500   afshar
  Fixed error in docs sample.

1119   19b1a2901d7e   2012-02-01 12:20 +0530   gunjansharma
  Added scopes for all Admin APIs in apps tag

1118   0e47dfadd4f6   2012-02-01 12:18 +0530   gunjansharma
  Added a sample for Email Audit API demonstrating CRUD operations on email monitors

1117   ce66eae4ca6f   2012-01-31 17:02 -0800   dhermes
  Fixed small doc errors, made tax a list element

1116   9676d3b1059b   2012-01-30 08:57 -0800   alainv
  Fix issues 590/591: Contact's gender XML element was wrong.

1115   32d0f6e650f5   2012-01-30 15:54 +0530   gunjansharma
  Added a sample marketplace application

1114   3a91fa3c66d1   2012-01-30 14:50 +0530   shraddhag
  Sample to delete obsolete suspended users

1113   1b7323bc42e7   2012-01-30 14:49 +0530   shraddhag
  Sample to retrieve user's profile and contacts using 2LO

1112   3265462309de   2012-01-25 22:42 -0500   vicfryzel
  Fixing issue 587.  Wrong URL used for batch ACL changes.

1111   15e17565f0ed   2012-01-24 12:04 +0530   shraddhag
  Added a sample to list all the members of a group

1108:1106   d762873e72e8   2012-01-06 14:35 -0800   alainv
  Adding access_type=offline to OAuth 2.0 authorize URL.

1107   9941fe8ba765   2012-01-20 19:30 +0000   afshar
  Check document list entries have a content before trying to download them.

1106   090c7ee66c93   2012-01-05 20:43 +0000   afshar
  Added tag 2.0.16 for changeset c67f3c6398ba

1105[2.0.16]   c67f3c6398ba   2012-01-05 20:39 +0000   afshar
  Updated hgignore

1104   e3c66713a107   2012-01-05 20:34 +0000   afshar
  Updated MANIFEST.in

1103   20c9ab58878a   2012-01-05 20:24 +0000   afshar
  Use a generated MANIFEST from MANIFEST.in

1102   b395b9e31ee9   2012-01-05 20:15 +0000   afshar
  Updated release notes.

1101   012305c4dac1   2012-01-05 19:43 +0000   afshar
  Fixed recording test, sometimes outside the US, google.com tries to redirect.

1100   e93eb1a3fe7c   2012-01-05 19:08 +0000   afshar
  Updated pydocs

1099   85cc6c57a719   2012-01-05 19:08 +0000   afshar
  Bumped version string

1098   afd40075d6bd   2012-01-05 18:42 +0000   afshar
  Fixed doc generation script for my environment.

1096   c6b6a36a98be   2012-01-16 22:21 +0530   shraddhag
  Added a sample to search users with a given pattern and and move them to an organization

=== 2.0.16 ===
5 Jan 2012

- Add sample for Docs List API to delete ACL.
- Added support for label deletion in the Email Settings API client library
- Added a sample for Email Settings create label and filters with exponential
  back-off
- Added sample for enabling pop settings using Email Settings API
- Fixed typo in analytics sample.
- Fixed ACL batching URI in Docs.
- Updated RetrieveAllUsers and RetrieveAllAliases to return all pages instead
  of one.
- Removing force=True from some ACL requests in DocsClient
- Added RetrieveGroups method and updated RetrieveAllGroups and
  RetrieveAllMembers method
- Added a quick start sample for user provisioning
- Added a client for organization unit provisioning
- Added client architecture for group provisioning
- Added a new sample for multidonain provisioning. Demonstrates all the
  functions available.
- Added test for RetrieveAllUserAliases and changed OAuth scopes for Apps
- Added client architecture for provisioning api and tests for client
- Added support for batch requests to update spreadsheet cells.
- Added GetAcl alias for get_acl in DocsClient
- Added new ACL and get by ID methods to DocsClient.
- Added some conditional imports for tlslite.
- Updates to category handling for Documents list API
- Added a function to retrieve all the aliases for a given user email.
- Fixed #553


=== 2.0.15 ===
18 Oct 2011

- New Documents List API client
- Added support for MDM Provisioning API
- Added Batch support for Documents List API ACL changes
- Added category handling for Documents List API client
- Added commenter role to Documents List API client
- Added support for gContact:status
- Added subdomain support for Email Settings API
- Added support for Apparel attributes in Content API for Shopping client
- Added Documents List sample
- Added Sample for Provisioning API with OAuth2
- Added Sample for Email Settings API with OAuth2
- Added Sample for Provisioning API with Sites and Profiles API
- Fixed Youtube client to use SSL
- Fixed Sites API sample to use SSL
- Removed Google Base Data API support
- Issues closed:
    #190, #206, #215, #230, #268, #270, #279, #281, #288, #296, #303, #312,
    #346, #363, #399, #424, #435, #483, #492, #494, #498, #508, #512, #516,
    #526, #532, #533, #534, #541, #547

=== 2.0.14 ===
7 Mar 2011

 - Bug Fixes:
  * 491. 302 redirect on some gsessionids
  * 501. Remove support for deprecated Maps Data API.
  * 462. Bug in samples/analytics/data_feed_demo.py (using segments)
  * 482. String exception in service.py
  * 414. http proxy url containing properly formatted user-name and password not accepted
 - Turn on SSL for Codesearch, Photos, Project Hosting, Analytics,
    Contacts, Marketplace Licensing, and Docs.
 - Add batch default URL to the Contacts API and clean the sample code. (issue4000058)
 - Added support for Content API for Shopping
 - Added Calendar V2 API support
 - Add Google Marketplace Licensing API to the Gdata Python Client
 - Added patch from Alexandre Vivien that fixes calendar resource email support that somehow went missing in a previous release.


=== 2.0.13 ===
16 Nov 2010 (revision 902:73f3fbb5ea88)

 - Bug Fixes:
   * Issue 315: Correctly constructs queries based on categories for Blogger APIs.
   * Issue 323: YouTubeUserQuery constructor passes incorrect overridden parameter to base class.
 - Accept proxy username and password in http(s)_proxy environment variables.
 - Adding support for specifying URI to v3 docs client.
 - Adding tests for revisions for arbitrary file types in Documents List API.
 - Google Base, added bucket node to attributes.
 - Adding ContainsSampledData XML Element to Analytics Data Feed and updating samples


=== 2.0.12 ===
17 Sep 2010 (revision 892:e949a7cf9a31)

 - Bug Fixes:
   * Issue 437: PATCH request generates incorrect Content-Type
   * Issue 428: get_blog_name() does not correctly handle blog URLs containing hyphens
   * Issue 443: Packages should contain gdata.apps.audit in setup.py
   * Issue 430: Lots of memory usage when uploading big video files
   * Issue 423: gdata.contacts.client.ContactsClient.get_profiles_feed() broken
  - Turn on SSL be default for the spreadsheet API
  - Added support for new Analytics feeds
  - All V3 code and development has been out of this project and into http://code.google.com/p/google-api-python-client/
  - Added partial support for the YouTube API in v2


=== 2.0.11 ===
Jul 29, 2010 (revision fa49231cc8)

 - Added the following new APIs:
   * Apps Audit APIs from Jay Lee
   * Apps Organization from Alexandre Vivien
   * Added Email Settings API client library v2.0 from Claudio Cherubino
 - Fixes to file permissions for samples.
 - Fixing a broken calendar resource client from r983, removing a superfluous call to MakeResourceFeedUri(), adding regression tests for edit links.
 - Abstracting out AppsProperty so that it's usable by other libs.  Thanks to Claudio Cherubino <ccherubino@google.com> for this change.
 - Added optional change_password parameter to AppsService.CreateUser
 - Fixing minor bugs in analytics samples
 - http://codereview.appspot.com/1677050 Switch default connection type back to non-SSL connections.
 - Switch the repository from subversion to mercurial
 - Added OAuth test cases thanks Samuel Cyprian
 - Many APIs now use SSL, and some require it, so the following APIs now default to using HTTPS:
   * Spreadsheets
   * Sites
   * Calendar Resource

=== 2.0.10 ===
May 12, 2010 (revision 980)

 - Add check for liveness of proxy in live tests. Also add in upload-diffs.py to make using codereview.appspot.com easier. 
 - Patch from Alexandre Vivien adds the ResourceEmail attribute to CalendarResourceEntry
 - Adding new single page methods to apps.groups.service. Thanks Jeremy Selier!
 - Cleanup in service GetWithRetries. Thanks Will Charles!
 - Adding much more test coverage for calendar_resource.client.
 - Fixing Calendar Resource get_resource to use correct feed URI generator.  Thanks to Alexandre Vivien for reporting.
 - Adds support for Blogger Pages. Thanks Wiktor Gworek!

=== 2.0.9 ===
March 5, 2010 (revision 964)

- Fixed URL related bug in gdata.calendar.service. You can now edit and delete
    against https URLs.
- Removed hard coded Python version from gdata.contacts. Resolves issue 347.

=== 2.0.8 ===
February 26, 2010 (revision 960)

- Added support for resumable uploads with a sample that shows it's use
    with Google Docs. Thanks Eric!
- Added the publish element and copy() method to the DocsClient. Thanks Eric!
- Added support for the JSON-C data format recently released for the YouTube
    API.
- Fixed import bug when using cryptomath with Python2.4 and lower.
- Modified gdata.gauth to be usable under Python2.3.
- Fixed errors which affect RetrieveAllEmailLists RetrieveEmailLists
    RetrieveAllRecipients RetrieveAllNicknames RetrieveNicknames
    RetrieveAllUsers in gdata.apps.service. Resolves  issue 340 . Thanks
    Aprotim!
- Fixed issues with contacts client returning a raw get and not a ContactEntry
    and a few auth_tokens are not being passed into the HTTP request. Resolves
    issue 332 . Thanks vinces!
- Fixed issue parsing worksheet feed, entry was the wrong type, corrected to
    WorksheetEntry. Resolves  issue 343. Thanks Igor!
- Fixed typo in gdata.spreadsheets.client (auth_service). Resolves  issue 342.
    Thanks to Igor once again!
- Fixed bug in Google Apps APIs UpdateSSOSettings.
- The gdata.data.LinkFinder now looks in both the link and feed_link members
    for an ACL link. Resolves issue 339.
- Removed client side check on video type in YouTube service. Rely on the
    server to provide an error if the format is not supported. Resolves 
    issue 338.
- Improved documentation for SpreadsheetsService's UpdateRow method to explain
    the use case it addresses and recomment alternatives.
- Changed projecthosting to use the host member with relative URLs.
- Added a get_headers function to be used in Python2.2 and 2.3 since
    httplib.HTTPResponse does not have getheaders in those versions of Python.
    Resolves  issue 335.
- Added a client smoke test to check version and auth related class members
    which all gdata.x.client's should have.
- Updated the docs service_test.py to run as part of run_all_tests.py.

=== 2.0.7 ===
January 26, 2010 (revision 937)

- Added gdata.calendar_resource.client to support the management of calendar
    resources (like conference rooms) for Google Apps domains. Thanks Vic!
- Updated the sites API client to use version 1.1 of the sites API.
- Added support for 2 Legged OAuth to the GDClient and included a sample
    app. Thanks Eric!
- Added a revoke_token method to GDClient to invalidate AuthSub or OAuth
    tokens.
- Added a get_record method to the Spreadsheets client to fetch a single
    record entry.
- Added includeSuspendedUsers parameter to the apps groups API. Thanks Will
    Charles!
- Fixed a client login bug present in the Maps API client. Thanks Roman!
- The client_id property in the YouTube service object is now optional.
- Added optional 'feed' parameter to YouTube service's Query classes.
    Resolves issue 323.
- Updated tlslite's use of sha1 to use hashlib if using python2.5 or higher.
    Resolves  issue 290 . Thanks Jay Lee!
- Added a deadline parameter to gdata.alt.appengine to allow the urlfetch
    timeout to be modified to as high as 10 seconds.
- Added GetGeneratorFromLinkFinder to GDataService which simplifies pagination
    across the entries in a feed. Resolves  issue 325 . Thanks Aprotim!
- Removed the default value for the test domain option.
- Moved auth scopes to gdata.gauth from gdata.service.

=== 2.0.6 ===
December 17, 2009 (revision 914)

- updated the Google Analytics Data Export API to v2. Thanks Nick!
- added support for batch operations on contacts and profiles. Thanks Julian!
- added a DocsQuery class for the Documents List v3 API.
- removed now obsolete ACL classes from gdata.docs.data in favor of using
    classes in gdata.acl.data. Thanks Eric!
- fixed bug in querying group membership by email. Thanks Will Charles!
- removed import which are not present in Python2.2 from gdata.service to
    maintain support for Python2.2.
- added additional debug information to MockHttpClient.

=== 2.0.5 ===
November 24, 2009 (revision 900)

- added new gdata.contacts.client (and data) which uses version 3.0 of the
    contacts API. Thanks Vince!
- added new gdata.docs.client which uses version 3.0 of the Documents List
    API. Thanks Eric!
- added new v2 modules for the Analytics API (gdata.analytics.client).
    Thanks Nick!
- added conditional get using etags on get_entry. Thanks Eric!
- fixed bug in how Calendar redirect headers are handled when using this
    library in an App Engine app.
- added new Calendar XML elements to the gdata.calendar module. Thanks
    Michael Ballbach!
- added v2 data model classes for finance, notebook, webmastertools, ACLs,
    opensearch and youtube.
- fixed issues with contacts.service when editing profiles. Thanks Julian!
- fixed bug in GDClient's get_next method.
- improved usability in Python2.3, though tests do not run the src modules
    should be Python2.3 compatible.

=== 2.0.4 ===
October 15, 2009 (revision 864)

- Added support for the project hosting issue tracker API. Thanks Joe LaPenna!
- Added a get-with-retries method to the v1 service for use with the Google Apps
    API to automatically retry. Thanks Takashi Matsuo!
- Revised Google Sites client to use text input when creating a page. Thanks Eric!
- Changed demo calendar in the Google Calendar API example. Thanks Trevor!

=== 2.0.3 ===
October 9, 2009 (revision 856)

- Added support for Google Sites Data API. Thanks Eric!
- Added support for Google Contacts profiles. Thanks Julian Toledo and Pedro
    Morais!
- Added support for the Spreadsheets v3 API Tables feed and Records feed.
- Added support for the Google Apps Admin Settings API. Thanks Jay Lee!
- New sample which illustrates use of the Blogger v1 API on App Engine using
    OAuth. Thanks Wiktor Gworek!
- Added a new MediaSource for use with v2 data model classes. Thanks Eric!
- The v2 client classes can now force all requests to be made over SSL.
    Thanks Eric!
- Revised the test config system to allow test settings to be specified as
    command line arguments or prompt the user to enter them interactively.
- Fixed UTF encoding issue in unittest on big endian architectures.
- Fixed XML parsing bug in Spreadsheets data class. Thanks ppr.vitaly!
- Fixed bug in webmaster tools service verification method arguments. Thanks
    eyepulp!
- Fixed download URL recognition in Document List Data API.
- Some progress made in re-adding support for Python2.3, not sure yet if
    full Python2.3 support is completely feasible. Python 2.4-2.6 should work.

=== 2.0.2 ===
August 20, 2009 (revision 823)

- Added support for the Google Maps Data API. Thanks Roman!
- Added data model classes for the v3 Spreadsheets API. This API is not
    yet fully supported by the library and the gdata.spreadsheets package
    should be considered experimental until the next release. The v1
    gdata.spreadsheet package is unchanged and should still work.
- Auth token lookups when running in App Engine are now memcached which
    should improve efficiency. Thanks Marc!
- Fixed a bug with the v2 HTTP proxy client. If behind a proxy, the full
    URL is now sent as the request selector. Thanks Dody!
- Removed the gdata.client.GDataClient class which had been deprecated.

=== 2.0.1 ===
July 23, 2009 (revision 805)

- Added support for Secure AuthSub, OAuth with HMAC and with RSA to the
    v2 auth code.
- Added v2 data model classes for all XML elements in the gd namespace.
- Usability improvements in the gdata.docs.service module, thanks Eric!
- Made the dependency on elementtree only required if you are using
    Python 2.4 and lower. Thanks brosner!
- Setting the ssl member in atom.service.AtomService will now override a URL
    which starts with http:. Many thanks to Michael Ballbach for the patch. 
- Added a proxy HTTP client which will use proxy environment variables to
    send all requests through the desired proxy server if present.
- Added user agent string indicating that this is from the gdata python v2
    library.
- Removed unneeded title parameter from the Blogger client's add_comment
    method.
- Added an all_tests_local script which runs all tests except those which
    would make HTTP requests to remote servers.
- Added the birthday element to contacts entry, the reminder element to
    calendar events, and the method attribute to calendar's reminder class.
    All with great thanks to Marc!
- The analytics GetData method no longer requires the dimensions argument.
    Thanks Jim!

=== 2.0.0 ===
June 29, 2009 (revision 777)

- Released support for version 2 of the Google Data APIs protocol. To use the
    new version-aware code, use the gdata.client, atom.data, gdata.data
    modules and classes that derive from them. For example, use 
    gdata.blogger.client.BloggerClient instead of 
    gdata.blogger.service.BloggerService. High level, service specific classes
    are not available yet for other services, so feel free to migrate as they
    become available. The v1 service classes are still included so your
    existing code should be unaffected.
- Included new Blogger samples to illustrate v2 support, a command line demo
    and an app for App Engine.
- Added OAuth sample app which uses App Engine.
- Added the gCal:sequence element to CalendarEventEntry (thanks Anton).
- Added two decorators to diaply warnings when deprecated methods are used.
- Added a login utility for command line samples to share to standardize the
    auth process on in a sample program.
- Fixed a bug in v2 XML parsing which prevented multiversion XML classes from
    correctly parsing and generating v2 code.
- Fixed v1 HTTP Host header settings, not default ports should now be
    included in the Host header.
- Fixed pickle error when an OAuth-RSA token is saved to the App Engine
    datastore.
- Fixed missing data in the Document List API unit tests.
- Improved backwards compatibility of v2 data model classes be adding aliases
    to v1 functions.

=== 1.3.3 ===
June 5, 2009 (revision 724)

- Added support for the Google Finance API. Thanks Swee Heng!
- The Google Data Service classes now support version 1.0a of the OAuth
    protocol (Thanks Eric!).
- Fixed a naming bug in unit tests for atom.service which appeared when using
    Python 2.6.x
- Fixed URL parameter propogation when calling GDataService.Delete. The URL
    parameters are now preserved.
- Fixed incorrect return type for gdata.FeedLinkFromString.
- Added data model classes for the Atom and AtomPub XML elements which support
    version 2 of the Google Data APIs (by means of dynamic AtomPub namespace
    switching). The version 2 XML classes are much more backwards compatible
    with v1 classes than in previous releases.

=== 1.3.2 ===
May 22, 2009 (revision 711)

- Added support for the Google Analytics API. Thanks Sal Uryasev!
- Added support for the Google Book Search API. Thanks James Sams!
- Improved support for 2 legged OAuth and added a sample app. Thanks Eric
    Bidelman!
- Simplified the way an XML response from the server is parsed into the
    desired class for the version 2.0 API client (gdata.client.GDClient).

=== 1.3.1 ===
April 23, 2009 (revision 695)

- Fixed issues with setting the developer key in the YouTubeService
    constructor.
- For the Document List API (thanks Eric!):
  - Added writersCanInvite element
  - Fixed a small errors in Document Entry
  - Added category label when creating different types of docs
  - Fixed DownLoad helpers which shouldn't write a file if server returns
      error. Fixes issue 240.
  - Added DocumentListEntryFromString converter and using DocumentListEntry
      class instead of GDataEntry class to create entries.
- URLs in HTTP requests can now be unicode strings. Resolves issue 233.
- Improvements for the upcoming version 2.0.0 release:
  - The v2 auth code now support AuthSub and has been tested on App Engine.
  - Unit tests for the v2 client code will default to not use the local file
      cache but will make live requests unless cached responses is set to
      True in the test configuration module.
  - Older v1 unit tests can now use the v2 testing framework, migrated 
      contacts API tests as a proof of concept. This will come in handy when
      testing backwards compatibility for the 2.0 release.
  - Improved support for unicode and other character encodings in the v2 XML
      core module.

=== 1.3.0 ===
Mar 20, 2009 (revision 665)

- Added support for the Google Health API. (Thanks Eric Bidelman!)
- Added support for the groups management in the Google Apps Provisioning
    API. (Thanks to Tony Chen and Oskar Casquero!)
- Added the following new features for the Google Documents List API:
    (Thanks again to Eric Bidelman for adding all of these!)
  - Folder create, move docs/folders in and out of other folders. (Thanks
      Nizam Sayeed!)
  - Suppport for modifications to Access Control Lists for documents.
  - Export functionality for documents, spreadsheets, and presentations.
  - Updated the docs_example.py sample app.
  - New new XML elements: resourceID, lastViewed, and lastModifiedBy.
- Added ability to update web clip settings in the Google Apps email settigns
    API. (Thanks Takashi Matsuo.)
- Fixed a bug in calendarExample that would cause execution to fail when an
    event attendee does not have any attendeeStatus data. (Thanks Trevor
    Johns!)
- Fixed AuthSub request URLs which should be https. (Yay Eric!)
- Fixed logic when changing email settings when using the Google Apps API to
    only send properties which have been specified. (Thanks Jay Lee!)
- Includes a new and experimental client class (gdata.client.GDClient) which
    can be used with version two of the Google Data API protocol. This class
    may change in backwards incompatible ways before the 2.0.0 release, so
    use at your own risk. 

=== 1.2.4 ===
Jan 22, 2009 (revision 603)

- Added a new AtomPubClient class (and supporting classes) which begins a
    foundation on which support for version two of the Google Data protocol
    will be built.
- OAuth methods can now specify the desired OAuth server with the default
    being the Google Accounts end point (thanks Dag Brattli!).
- Improved support for unicode strings in XML element class attributes and
    text nodes (thanks again to Dag).
- Fixed constructors for Service classes which inherit from GDataService
    to ensure that all parameters are passed up to the superclass 
    constructor (thanks Guillaume Ryder!).
- Added a 'contact_list' property to ContactsService to simplify API usage
    for shared contacts (thanks Guillaume once again).
- For Google Contacts, added a GetFeedUri method to help users generating
     feed URIs (Guillaume for a hat-trick).
- New unit tests to ensure that the ordering of entry objects within a feed
    is preserved when converting to and from XML.


=== 1.2.3 ===
Dec 3, 2008 (revision 585)

- Added support for OAuth (thanks to Kunal Shah!). Your client can now obtain 
    an authorization token using the OAuth protocol.
- Added support for Secure AuthSub (thanks Eric Bidelman!). Your client can
    digitally sign requests using RSA allowing Google service to verify that
    the request came from your application.
- Added a new module for parsing XML which will be used in future versions to
    support version of the Google Data APIs protocol. This new library handles
    versioning of XML schemas.
- The Google Contacts API sample now pages through results.
- Added phone number rel types using in the Google Contacts API.
- The YouTube service module will use cElementTree if it is available. 
    Improves XML parsing speed.
- Fixed typo in gdata.geo, changed longtitude to longitude but kept an alias
    for backwards compatibility.
- Fixed Blogger's GetBlogId regular expressions to extract the ID from 
    multiple kinds of entries.
- Fixed type check in atom.http to allow unicode URL strings.
- Added webmastertools test to the packaged download which fixed failures 
    when running all data tests.
- Improved compatibility of unit tests with Python2.3.
- Added copies of tlslite and dependencies to support secure AuthSub and
    OAuth.
- Changed the default host for Google Apps API requests to 
    apps-apis.google.com.


=== 1.2.2 ===
Oct 15, 2008 (revision 556)

- Added support for the following APIs:
      Google Apps Email Migration API
      Google Apps Email Settings API
      Google Webmaster Tools Data API
    Some modules for the above are not yet fully tested, so please file an 
    issue if you notice something is not working as expected.
- Restored support for gdata.http_request_handler when using App Engine to
    preserve backwards compatibility.
- Simplified auth token management by adding a current_token member to 
    service classes. Also added settings to control when the token_store
    is updated when using SetXToken() methods. The token_store will only be
    queried if there is no current_token.
- Fixed issue with requests to HTTPS URLs in which an AuthSub token was seen
    as invalid because the request contained the default port number (443).
    The library no longer includes the port in the Host header if it is using
    the default.
- Resolved issues with YouTube token scopes.
- Fixed issue which appeared when the Calendar API issues a redirect to a 
    PUT request. The library now correctly retries with a PUT (instead of
    a POST).
- Added workaround for differences in how the App Engine SDK handles 
    redirects.
- Fixed typo in gdata.EntryLink declaration.
- Fixed invalid host errors seen when using some HTTP proxies.


=== 1.2.1 ===
Sep 15, 2008 (revision 529)

- The gdata.alt.appengine module now replaces a Service object's token_store
    with an AppEngineTokenStore which automatically associates auth tokens 
    with the current user and stores the auth tokens in the datastore.
- Streamlined the gdata.auth module. There are now six recommended functions
    for using Google auth mechanisms. GDataService now uses these six
    functions.
- Added an override_token in Service objects (AtomService, GDataService) 
    which bypasses the token_store. This member is helpful when using a 
    single use AuthSub token which is only valid for one request and so
    would not be reused.
- gdata.alt.appengin.run_on_appengine will now return the modified Service
    object. This allows statements like:
    client = gdata.alt.appengin.run_on_appengine(
        gdata.blogger.service.BloggerService())
- Fixed content length header issue in gdata.alt.appengine which caused
    errors when running on App Engine when HTTP headers are set to 
    non-string values.
- Fixed function naming issue in gdata.alt.appengine, a "private" function
    was not accessible in some import styles.
- Fixed issue in atom.http which surfaces when passing in a string for the
    port number. Ports are now cast to ints. 
- Updated pydocs.


=== 1.2.0 ===
Sep 9, 2008 (revision 522)

- Refactored HTTP request mechanisms and the way that Authorization headers
    are created and applied to requests. These changes make it easier to 
    swap out the HTTP layer to allow the library to be used in different
    environments (like Google App Engine). The changes in Auth token logic
    should make it much easier to add support for secure AuthSub and OAuth.
    For more details on this change, see the following wiki page:
    http://code.google.com/p/gdata-python-client/wiki/HTTPRequestRefactoring
- Fixed issues with token string modification which caused certain AuthSub 
    token values to become invalid.
- Created a new module for parsing and constructing URLs (atom.url).
- Created a module for token storage which will lookup the correct auth token
    to be used for a particular URL.
- Auth tokens are now represented as objects and contain information about the
    scopes (URLs) for which they can be used. The token object is responsible
    for adding the Authorization header to the request.
- Added new functions to gdata.auth for extracting the raw token string from
    a response to an AuthSub token upgrade request.
- Added support for the location query parameter in YouTube queries.
- Added groups functionality to the Contacts API library.
- Batch request support added for Contacts API operations.
- Added default behavior to text_db GetTables: when no worksheet name or ID
    is specified, all tables are retrieved.
- Fixed client login for YouTube.
- Fixed issue in YouTube service when setting the developer key.
- Fixed bug in YouTube service which raised an exception when inserting a
    video using a file-like object.
- Added a method to Feed and Entry classes to find the "previous" link.
- A failure when attempting to upgrade a single use AuthSub token to a session
    token will now raise an exception.
- AppsForYourDomainException now uses Python2.5 style exception construction.
- Moved the logic for using this library on Google App Engine into a new 
    module: gdata.alt.appengine.


=== 1.1.1 ===
June 13, 2008 (revision 421)

- Added support for new feeds available in the Google Contacts API. Adding
    contact groups, querying for contacts in a group, specifying extended
    properties, and setting the contact's photo are now supported.
- The ExtendedProperty class can now contain a blob of XML instead of just
    an attribute value. This is used in the Google Contacts Data API. 
- The YouTube service now has methods for updating playlists and removing a
    video from a playlist.
- Added geo-location to the YouTube service class.
- When using ClientLogin with Blogger, the default account type is now set
    to 'GOOGLE'. This prevents the rare problem of a user having a Google
    Apps account which conflicts with his or her Google Account used for
    Blogger.
- Added support for the in-reply-to element which appears in Blogger 
    comments.


=== 1.1.0 ===
June 6, 2008 (revision 403)

- Added modules for YouTube.
- Added modules for Blogger to simplify using the Blogger API.
- Updated pydocs for all modules.
- New member in service object to allow the ClientLogin server to be changed.
    Required to be able to use ClientLogin with YouTube.
- Iterating over Google Apps Feeds can now be accomplished using a generator.
- New unit tests for the Google Apps Provisioning API.
- Bug fixes to the mock_service module used in unit tests.
- Fixed a bug in Query string generation when using category queries.
- Improved ease of use for Calendar query construction, URL components are
    now escaped automatically by default.
- Bug fix, added timezone element to CalendarEventFeed.
- Improved docstrings to describe token access methods (specifically 
    GetAuthSubToken).
- Moved ExtendedProperty class into gdata module from gdata.calendar since
    it is now also used in the Google Contacts Data API. 


=== 1.0.13 ===
May 8, 2008 (revision 357)

- Added sample code illustrating the use of the Contacts API modules.
- Added a mock_service module which will allow for faster test execution
    by simulating a server and replaying recordings instead of making
    HTTP requests to a remote server.
- Fixed a but in the gdata.auth module which could cause certain characters
    at the start of the token to be removed incorrectly.
- Fixed a bug in the gdata.apps.service module which caused an import to 
    fail when loading ElementTree in some cases.
- Service unit tests should run correctly when using run_service_tests 
    and run_all_tests now that the subtests have been made into packages.


=== 1.0.12.1 ===
April 10, 2008 (revision 341)

- Added new import statements so that xml.etree.ElementTree can be used. 
    Needed for the library to run on Google App Engine.


=== 1.0.12 ===
April 8, 2008 (revision 334)

- Added support for the Google Contacts API.
- Added a gdata.urlfetch module which allows this library to be used in 
    Google App Engine. This module uses urlfetch instead of httplib to 
    perform HTTP requests.
- Refactored atom.service and gdata.service to make it easier to swap out the
    HTTP communication layer.
- Fixed a bug in the Push method of gdata.spreadsheet.text_db.
- Sped up InsertRow method in gdata.spreadsheet.service.
- Improved XML parsing efficiency in gdata.calendar.service.
- Added new attribuges for the Google Apps login element.
- Improved UpdatePhotoBlob in gdata.photo.service.
- Added pydocs for Google Contacts API and updates in other modules.

=== 1.0.11.1 ===
March 13, 2008 (revision 314)

- Added text_db module to gdata.spreadsheet which makes using the Spreadsheets
    API feel more like using a simple database. This module streamlines use
    of the list feed.
- Compatibility fixes for geo and photos modules to run on Python 2.2 and 2.3.
- Added the orderby parameter to gdata.service's Query class.
- Changed the blogger sample to use orderby=updated so that queries on 
    updated min or max will work.
- Fix to string encoding in the atom core when converting text members to XML.


=== 1.0.11 ===
February 11, 2008 (revision 290)

- Modified the gdata.service.GDataService to include a handler member to 
    which all HTTP requests are delegated. This will allow the underlying
    HTTP client to be swapped out and pave the way for use of a mock server
    in unit tests.
- Fixed character encoding problems when parsing non ASCII XML.
- Added pydocs for gdata's geo, exif, and media packages. 


=== 1.0.10.1 ===
December 20, 2007 (revision 265)

- Photos packages for working with the Picasa Web Albums Data API.
- New modules for handling media, geo, and exif XML elements.
- Packages for the Google Code Seach API.
- New PyDoc HTML pages generated from the source code.
- Extracted authentication code into a seperate module which can be used in
    other applications.
- The core XML parser should now fully support UTF-8 strings, there are also
    options to change the default encoding.
- Bugfixes in Atom service's proxy support when authenticating with the proxy.
- Spreadsheets UpdateCell can now take integers for the row and column 
    parameters.
- Added INSTALL.txt to explain the installation process. The content was 
    copied from the getting started article here:
    http://code.google.com/support/bin/answer.py?answer=75582
- You can now create update and delete worksheets within a Google 
    Spreadsheet.
- Added convenience methods to service object to ease the process of 
    iterating through a feed.
- For Document List queries, added the ability to construct schema-qualified
    named folder queries.


=== 1.0.9 === 
October 15, 2007 (revision 213)

- Added support for batch requests for the Google Spreadsheets cells feed,
    Google Calendar's events feed, and Google Base's items feed.
- Authentication requests can now be sent to a different server by modifying 
    a module variable in gdata.service.
- Fixed the birthdaySample mashup.
- User Agent headers now fit the pattern used in other Google data client 
    libraries.
- Made it easier to access custom elements for Google Base items. 


=== 1.0.8 ===
August 31, 2007 (revision 192)

- Major refactoring of the data model classes. Improved XML parsing
    performance.
- Created a script to run all of the tests, one to run the data model tests,
    and one to run all service tests.
- Changes to MediaSource to handle uploading files on Windows.
- All of the sample code should now work in Python 2.2 and higher. I removed
    2.4 dependancies.
- Minor change to the Blogger sample; it now uses entry.GetSelfLink().
- Added fix to prevent socket.sslerror and redirect failures when using a
    proxy.
- Google Calendar event entries can now contain a reference to the original
    event. The original event element is present when describing a recurrance
    exception.
- Added timezone parameter to Google Calendar queries. This allows the client
    to request that event times be expressed in a specific timezone.


=== 1.0.7 ===
August 7, 2007

- Added new test for the Documents List data API's service module.
- Updated setup.py to include the docs package in the installation.


=== 1.0.6 ===
Aug 2, 2007

- Support for Documents List API added along with sample code.

=== 1.0.5 ===
July 31, 2007

- XML parsing can now use cElementTree if it is available, this should speed 
    up XML parsing.
- Redirects now include all params in the original HTTP request.
- Added support for WebContent and QuickAdd features of Google Calendar data 
    API.
- Proxy support added.
- Binary MIME uploads now work for Windows files when performing media uploads.
- New calendar functionality for add/edit/delete calendar and add/edit/delete 
    subscriptions. Also, added new functionality for Calendar Gadgets.


=== 1.0.4 ===
June 23, 2007

- Added data and service modules for Google Apps.
- XML parsing can now be configured in gdata module service calls to avoid 
    multiparsing to convert to the desired type.
- Fixed UTF-8 support in the Atom modules.
- The spreadsheets example now works with UTF-8 column names.
- Fixed a type in the Google Base dry-run sample.
- Calendar's Who element no longer requires a name when converting to XML.


=== 1.0.3 ===
May 30, 2007

- Added a mashup sample using the spreadsheets and calendar services.
- Reduced the number of unnecessary namespace declarations in the XML produced 
    by objects.
- Changed type of custom elements in a spreadsheets list entry.
- Fixed bugs in spreadsheetsExample.py.
- Spreadsheet entries now inherit from GDataEntry and have gdata specific 
    convenience methods. 


=== 1.0.2 ===
May 4, 2007

- Added support for media. Services can now upload images, the tests for this
    service use the Picasa Web Albums data API.
- Added example code illustrating Blogger operations.
- Fixed host name processing for URLs which have -'s in the host name.
- Added a debug setting for service classes.
- Added user agent header.
- Made finding links of a specific type easier when dealing with Atom elements.
    Atom Entries now have GetXLink methods.
- Simplified finding license links in Atom Entries. 


=== 1.0.1 ===
April 20, 2007

- Rearranged package structure, tests are in their own directory and Google
    data API extension classes are nested under the gdata package.
- Simplified accessing extension elements by adding FindExtesions.
- Provided a setup.py file for distutils based installation.
- Added support for the app:draft element.
- Imports ElementTree from XML libraries in Python 2.5
- Fixed _EntryLinkFromElementTree in the calendar data module.
- Fixed various _TakeChildFromElementTree methods in calendar data module.
- Fixed delete and update operations in the spreadsheetExample script.
- Fixed setting sort order and order by in calendar's service module.
- Added HTTP BasicAuth for AtomService.


=== 1.0 ===
March 26, 2007

Initial release
