From 6b9a7b65535de92bae4cd2ff2b53e3b183e2025c Mon Sep 17 00:00:00 2001 From: Asheesh Laroia Date: Fri, 8 Jan 2010 17:50:54 -0500 Subject: [PATCH 001/454] For Python2.5 compatibility, fall back to cgi.parse_qs if urlparse.parse_qs is missing. --- github2/request.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index f0ce242..90d4834 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,7 +1,11 @@ import sys import httplib import simplejson -from urlparse import urlparse, parse_qs, urlunparse +from urlparse import urlparse, urlunparse +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs from urllib import urlencode GITHUB_URL = "http://github.com" From b598395d3663a32bc3f886331347c5f1826146f1 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Tue, 27 Apr 2010 11:47:47 +0200 Subject: [PATCH 002/454] Added Rick Harris to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 8b0084b..84c0f38 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,3 +2,4 @@ Ask Solem Mark Paschal Donald von Stufft Maximillian Dornseif +Rick Harris From dd58c5c0d61ad23b56d703175e2c7f1576dc9442 Mon Sep 17 00:00:00 2001 From: Cody Soyland Date: Tue, 27 Apr 2010 09:21:47 -0500 Subject: [PATCH 003/454] Add MANIFEST.in so sdist produces working build. --- MANIFEST.in | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..277396d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +recursive-include examples * +include README.rst +include AUTHORS From aee2d8b4257b441cd11f1fe4ea5ccf6ce45ba1bf Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Tue, 27 Apr 2010 16:31:03 +0200 Subject: [PATCH 004/454] Added Cody Soyland to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 84c0f38..528c73a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,3 +3,4 @@ Mark Paschal Donald von Stufft Maximillian Dornseif Rick Harris +Cody Soyland From 03afc58f59b0023a0a9c880387b0487b9010ca98 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Tue, 27 Apr 2010 16:31:29 +0200 Subject: [PATCH 005/454] Bumped version to 0.1.2 --- README.rst | 2 +- github2/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index b48a41a..96f86e3 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ python-github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.1.1 +:Version: 0.1.2 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 39f8b86..5f42439 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,4 +1,4 @@ -VERSION = (0, 1, 1) +VERSION = (0, 1, 2) __doc__ = "Github API v2 library for Python" __author__ = "Ask Solem" __contact__ = "askh@opera.com" From d08a92387404f4a4c51c42544e489abb4e894d1e Mon Sep 17 00:00:00 2001 From: Cody Soyland Date: Tue, 27 Apr 2010 09:44:39 -0500 Subject: [PATCH 006/454] Add missing license information (originally specified in README). Correct install instructions. --- LICENSE | 27 +++++++++++++++++++++++++++ MANIFEST.in | 1 + README.rst | 4 ++-- setup.py | 2 ++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..69a5b79 --- /dev/null +++ b/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Ask Solem Hoel and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of python-github2 nor the names of its contributors may be used + to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in index 277396d..919d0d2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ recursive-include examples * include README.rst include AUTHORS +include LICENSE diff --git a/README.rst b/README.rst index 96f86e3..dda6bbd 100644 --- a/README.rst +++ b/README.rst @@ -26,11 +26,11 @@ or from source. To install using ``pip``,:: - $ pip install python-github2 + $ pip install github2 To install using ``easy_install``,:: - $ easy_install python-github2 + $ easy_install github2 If you have downloaded a source tarball you can install it by doing the following,:: diff --git a/setup.py b/setup.py index bd0fd9b..6e7e03f 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ author=github2.__author__, author_email=github2.__contact__, url=github2.__homepage__, + license='BSD', platforms=["any"], packages=find_packages(exclude=['ez_setup']), scripts=['github2/bin/github_manage_collaborators'], @@ -27,6 +28,7 @@ "Development Status :: 3 - Alpha", "Operating System :: OS Independent", "Programming Language :: Python", + "License :: OSI Approved :: BSD License", ], long_description=codecs.open('README.rst', "r", "utf-8").read(), ) From d08e1bc2da1ff73eadc0585649f406b2e74e92f2 Mon Sep 17 00:00:00 2001 From: Fernando Perez Date: Fri, 7 May 2010 01:29:12 -0700 Subject: [PATCH 007/454] Add the ability to comment on issues. --- github2/issues.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index af1f17d..5860323 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -52,3 +52,10 @@ def add_label(self, project, number, label): def remove_label(self, project, number, label): return self.make_request("label/remove", project, label, str(number), filter="labels") + + def comment(self, project, number, comment): + """Comment on an issue.""" + comment_data = {'comment': comment} + return self.make_request("comment", project, str(number), + post_data=comment_data, + filter='comment') From abd24860b9414d4d8c76ba907c507fd6daaf9e9f Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Fri, 7 May 2010 17:30:18 +0200 Subject: [PATCH 008/454] Added Fernando Perez to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 528c73a..a40df6b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -4,3 +4,4 @@ Donald von Stufft Maximillian Dornseif Rick Harris Cody Soyland +Fernando Perez From 5fe8078fee06aed4df4cd727e9159a4058bec827 Mon Sep 17 00:00:00 2001 From: Fernando Perez Date: Sun, 9 May 2010 22:54:06 -0700 Subject: [PATCH 009/454] fix bug where unicode strings were used for kwargs --- github2/core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index def3b1d..7b90d26 100644 --- a/github2/core.py +++ b/github2/core.py @@ -49,7 +49,11 @@ def get_value(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) value = self.make_request(*args, **kwargs) if datatype: - return datatype(**value) + # unicode keys are not accepted as kwargs by python, see: + #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E + # So we make a local dict with the same keys but as strings: + val = dict( (str(k), v) for (k,v) in value.iteritems() ) + return datatype(**val) return value def get_values(self, *args, **kwargs): From 3c671146a7f9b692fdbd16ef0c7123e6af7df460 Mon Sep 17 00:00:00 2001 From: Fernando Perez Date: Thu, 13 May 2010 01:12:27 -0700 Subject: [PATCH 010/454] Fix same unicode-in-keywords bug elsewhere, cleanup for previous fix. --- github2/core.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/github2/core.py b/github2/core.py index 7b90d26..a97d0e4 100644 --- a/github2/core.py +++ b/github2/core.py @@ -52,16 +52,19 @@ def get_value(self, *args, **kwargs): # unicode keys are not accepted as kwargs by python, see: #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E # So we make a local dict with the same keys but as strings: - val = dict( (str(k), v) for (k,v) in value.iteritems() ) - return datatype(**val) + return datatype(**dict((str(k), v) for (k,v) in value.iteritems())) return value def get_values(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) values = self.make_request(*args, **kwargs) if datatype: - return [datatype(**value) for value in values] - return values + # Same as above, unicode keys will blow up in **args, so we need to + # create a new 'values' dict with string keys + return [ datatype(**dict((str(k), v) for (k,v) in value.iteritems())) + for value in values ] + else: + return values def doc_generator(docstring, attributes): From 3897683dea6729efc0b450b97e4b6308496d3fc6 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Mon, 17 May 2010 11:51:48 -0400 Subject: [PATCH 011/454] Connect to the Github API anonymously if username and api_token are None. --- github2/request.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index 3cb6542..0a2b1f3 100644 --- a/github2/request.py +++ b/github2/request.py @@ -37,8 +37,11 @@ def __init__(self, username, api_token, url_prefix=None, debug=False): } def encode_authentication_data(self, extra_post_data): - post_data = {"login": self.username, - "token": self.api_token} + if self.username and self.api_token: + post_data = {"login": self.username, + "token": self.api_token} + else: + post_data = {} post_data.update(extra_post_data) return urlencode(post_data) From 62cd09468aadcdb7eea1c92d32f60bd228d6c2e3 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Mon, 17 May 2010 11:52:25 -0400 Subject: [PATCH 012/454] Default the username and api_token to None for unauthenticated access. --- github2/client.py | 2 +- github2/request.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/client.py b/github2/client.py index 6378604..c3e77cd 100644 --- a/github2/client.py +++ b/github2/client.py @@ -6,7 +6,7 @@ class Github(object): - def __init__(self, username, api_token, debug=False): + def __init__(self, username=None, api_token=None, debug=False): self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, debug=self.debug) diff --git a/github2/request.py b/github2/request.py index 0a2b1f3..233a04f 100644 --- a/github2/request.py +++ b/github2/request.py @@ -24,7 +24,7 @@ class GithubRequest(object): "https": httplib.HTTPSConnection, } - def __init__(self, username, api_token, url_prefix=None, debug=False): + def __init__(self, username=None, api_token=None, url_prefix=None, debug=False): self.username = username self.api_token = api_token self.url_prefix = url_prefix From 04e9e985a14d07231876a4e8c4fcf33593256352 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Mon, 17 May 2010 11:54:51 -0400 Subject: [PATCH 013/454] Document unauthenticated connections in the README. --- README.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.rst b/README.rst index 96f86e3..d41a88e 100644 --- a/README.rst +++ b/README.rst @@ -44,6 +44,10 @@ Creating a request >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") +Or for an unauthenticated connection + + >>> github = Github() + Users ===== From 63aca91aca1bda4bf2270250e6ec5cc7a76fda9d Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Tue, 18 May 2010 15:06:13 +0200 Subject: [PATCH 014/454] Added Evan Broder to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index a40df6b..eee2ea4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -5,3 +5,4 @@ Maximillian Dornseif Rick Harris Cody Soyland Fernando Perez +Evan Broder From ae32298a9d5160fda9bb9e70010f37f3a182d2fe Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Tue, 18 May 2010 15:09:28 +0200 Subject: [PATCH 015/454] Added Asheesh Laroia to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index eee2ea4..4f913e5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,6 +2,7 @@ Ask Solem Mark Paschal Donald von Stufft Maximillian Dornseif +Asheesh Laroia Rick Harris Cody Soyland Fernando Perez From 6f1668334f3b66ead41961a47e9eba5304657c32 Mon Sep 17 00:00:00 2001 From: Evan Broder Date: Sun, 23 May 2010 22:56:57 -0400 Subject: [PATCH 016/454] Use rST header levels consistently in the README. --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index ba86c3f..44cb5d4 100644 --- a/README.rst +++ b/README.rst @@ -14,12 +14,12 @@ available in version 2 of the `Github API`_. .. _`Github API`: http://develop.github.com/ Introduction ------------- +============ You should read the developer documentation for the `Github API`_ first. Installation -============= +------------ You can install ``python-github2`` either via the Python Package Index (PyPI) or from source. @@ -39,7 +39,7 @@ by doing the following,:: # python setup.py install # as root Creating a request -================== +------------------ >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") From 5b2f09d89420aac0d071522b3fbed9b026af6def Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Tue, 25 May 2010 20:45:43 -0700 Subject: [PATCH 017/454] Update simplejson import for Python 2.6 --- github2/request.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 11785db..e276664 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,6 +1,9 @@ import sys import httplib -import simplejson +try: + import json as simplejson # For Python 2.6 +except ImportError: + import simplejson from urlparse import urlparse, urlunparse try: from urlparse import parse_qs From c8e9e708a881dca05b05daaefbdab399611dbaa0 Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Tue, 25 May 2010 22:02:03 -0700 Subject: [PATCH 018/454] wip - repr must be Ascii --- github2/issues.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/issues.py b/github2/issues.py index 5860323..ccf2c45 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -14,7 +14,7 @@ class Issue(BaseData): updated_at = DateAttribute("The date when this issue was last updated.") def __repr__(self): - return "" % self.title + return "" % self.title.encode('utf-8') class Issues(GithubCommand): From 126e853f6e91c168245be8e20dc136b8ee2e10e7 Mon Sep 17 00:00:00 2001 From: Scott Torborg Date: Sat, 12 Jun 2010 13:30:56 -0700 Subject: [PATCH 019/454] Support listing comments on an issue. --- github2/issues.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index 5860323..b32d274 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -17,6 +17,17 @@ def __repr__(self): return "" % self.title +class Comment(BaseData): + created_at = DateAttribute("The date this comment was created.") + updated_at = DateAttribute("The date when this comment was last updated.") + body = Attribute("The full text of this comment.") + id = Attribute("The comment id.") + user = Attribute("The username of the user that created this comment.") + + def __repr__(self): + return "" % self.body + + class Issues(GithubCommand): domain = "issues" @@ -59,3 +70,8 @@ def comment(self, project, number, comment): return self.make_request("comment", project, str(number), post_data=comment_data, filter='comment') + + def comments(self, project, number): + """View comments on an issue.""" + return self.get_values("comments", project, str(number), + filter="comments", datatype=Comment) From 5f8c18be79c777df5ba10c8e03ea674683aff729 Mon Sep 17 00:00:00 2001 From: Scott Torborg Date: Sat, 12 Jun 2010 13:34:25 -0700 Subject: [PATCH 020/454] Add issue comments viewing to examples. --- README.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.rst b/README.rst index 44cb5d4..e760b7e 100644 --- a/README.rst +++ b/README.rst @@ -103,6 +103,12 @@ View an Issue >>> issue.title 'Should not be able to upload same version twice.' +View Comments on an Issue +------------------------- + >>> comments = github.issues.comments("ask/chishop", 5) + >>> comments[0].body + 'Fix merged into /ask branch.' + Open and Close Issues --------------------- From ec62e41850ef6f8d2ba286df60676e700130e191 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Thu, 17 Jun 2010 13:42:44 +0200 Subject: [PATCH 021/454] Added Scott Torborg to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 4f913e5..dcdf661 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,3 +7,4 @@ Rick Harris Cody Soyland Fernando Perez Evan Broder +Scott Torborg From 8b2e3f47667d8e7cb93c794bbb97d2df706eb7e0 Mon Sep 17 00:00:00 2001 From: claudiob Date: Thu, 24 Jun 2010 15:06:58 +0200 Subject: [PATCH 022/454] Add the ability to list the watchers of a repo. --- README.rst | 6 ++++++ github2/repositories.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/README.rst b/README.rst index e760b7e..7b3898f 100644 --- a/README.rst +++ b/README.rst @@ -203,6 +203,12 @@ Collaborators >>> github.repos.remove_collaborator("ask/chishop", "schacon") +Watchers +------------- + + >>> watchers = github.repos.watchers("ask/chishop") + + Network ------- diff --git a/github2/repositories.py b/github2/repositories.py index 5486e31..2116b96 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -91,3 +91,8 @@ def tags(self, project): def branches(self, project): return self.make_request("show", project, "branches", filter="branches") + + def watchers(self, project): + return self.make_request("show", project, "watchers", + filter="watchers") + From ec92271d4268c2662e828f849fc6bf4f9e90c407 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Mon, 28 Jun 2010 10:25:16 +0200 Subject: [PATCH 023/454] Added Claudio B. to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index dcdf661..58a082e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,3 +8,4 @@ Cody Soyland Fernando Perez Evan Broder Scott Torborg +Claudio B. From c2d916f5d139ed86ed962d7c3f0f78dea5429e86 Mon Sep 17 00:00:00 2001 From: chris vale Date: Thu, 8 Jul 2010 09:12:51 -0700 Subject: [PATCH 024/454] use https for requests so private content is queriable. --- github2/request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index 11785db..5fbca5f 100644 --- a/github2/request.py +++ b/github2/request.py @@ -8,9 +8,9 @@ from cgi import parse_qs from urllib import urlencode -GITHUB_URL = "http://github.com" +GITHUB_URL = "https://github.com" -URL_PREFIX = "http://github.com/api/v2/json" +URL_PREFIX = "https://github.com/api/v2/json" class GithubError(Exception): """An error occured when making a request to the Github API.""" From 69766577946e7ae607b953d23dbcb29df9433d3e Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Tue, 25 May 2010 20:45:43 -0700 Subject: [PATCH 025/454] Update simplejson import for Python 2.6 --- github2/request.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 11785db..e276664 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,6 +1,9 @@ import sys import httplib -import simplejson +try: + import json as simplejson # For Python 2.6 +except ImportError: + import simplejson from urlparse import urlparse, urlunparse try: from urlparse import parse_qs From 6bffca2ca34dbc10fe3af828411b371497e9bdb7 Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Fri, 28 May 2010 10:02:15 -0700 Subject: [PATCH 026/454] Start test scripts * Add test that Issue.__repr__ handles unicode. --- runtests.py | 14 ++++++++++++++ tests/__init__.py | 1 + tests/unit.py | 12 ++++++++++++ 3 files changed, 27 insertions(+) create mode 100755 runtests.py create mode 100644 tests/__init__.py create mode 100644 tests/unit.py diff --git a/runtests.py b/runtests.py new file mode 100755 index 0000000..ff247e2 --- /dev/null +++ b/runtests.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python +"""Run all unit tests for this project""" + +import sys +import os + +# Add this to the path so we can "import github2" +sys.path.append(os.path.join(os.path.dirname(__file__), '.')) + +import unittest +from tests import * + +if __name__ == "__main__": + unittest.main() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..def65ae --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +from tests.unit import * diff --git a/tests/unit.py b/tests/unit.py new file mode 100644 index 0000000..f10623c --- /dev/null +++ b/tests/unit.py @@ -0,0 +1,12 @@ +# -*- coding: latin-1 -*- +import unittest + +from github2.issues import Issue + + +class ReprTests(unittest.TestCase): + """__repr__ must return strings, not unicode objects.""" + + def test_issue(self): + i = Issue(title = u'abcdé') + self.assertEqual(str, type(repr(i))) From 6e8ddfaab075f870cc637fbe3a20dae1b179e139 Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Tue, 25 May 2010 22:02:03 -0700 Subject: [PATCH 027/454] Fix: Issue.__repr__ should return str objects. --- github2/issues.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/issues.py b/github2/issues.py index b32d274..73b203c 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -14,7 +14,7 @@ class Issue(BaseData): updated_at = DateAttribute("The date when this issue was last updated.") def __repr__(self): - return "" % self.title + return "" % self.title.encode('utf-8') class Comment(BaseData): From 52533ecf370f914e309cb9f9a13f98f8f6bbb5cc Mon Sep 17 00:00:00 2001 From: Adam Vandenberg Date: Fri, 28 May 2010 10:47:33 -0700 Subject: [PATCH 028/454] Comment for test_issue. --- tests/unit.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit.py b/tests/unit.py index f10623c..9347104 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -8,5 +8,6 @@ class ReprTests(unittest.TestCase): """__repr__ must return strings, not unicode objects.""" def test_issue(self): + """Issues can have non-ASCII characters in the title.""" i = Issue(title = u'abcdé') self.assertEqual(str, type(repr(i))) From 4c852c3b9d05d8dad3325923d6f6885c17b15b91 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Sun, 15 Aug 2010 06:38:48 -0400 Subject: [PATCH 029/454] Support listing watched repositories of given username. --- github2/repositories.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 5486e31..362a32d 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -91,3 +91,10 @@ def tags(self, project): def branches(self, project): return self.make_request("show", project, "branches", filter="branches") + + def watching(self, for_user=None): + """Lists all the repos a user is watching.""" + for_user = for_user or self.request.username + return self.get_values("watched", for_user, filter="repositories", + datatype=Repository) + From 81455aa4a03e786a1a9253320fbee0ee9499a5c7 Mon Sep 17 00:00:00 2001 From: pydanny Date: Tue, 17 Aug 2010 09:43:54 -0500 Subject: [PATCH 030/454] Now supports contributors --- github2/repositories.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 5486e31..708b7a1 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -91,3 +91,8 @@ def tags(self, project): def branches(self, project): return self.make_request("show", project, "branches", filter="branches") + + def list_contributors(self, project): + """Lists all the contributors in a project (user/repro).""" + return self.make_request("show", project, "contributors", + filter="contributors") \ No newline at end of file From a3ec0bc52e1f0c58224d98663070945a89f180d1 Mon Sep 17 00:00:00 2001 From: pydanny Date: Tue, 17 Aug 2010 09:44:43 -0500 Subject: [PATCH 031/454] Now supports contributors --- github2/repositories.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index 708b7a1..e862a6c 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -92,7 +92,7 @@ def branches(self, project): return self.make_request("show", project, "branches", filter="branches") - def list_contributors(self, project): - """Lists all the contributors in a project (user/repro).""" - return self.make_request("show", project, "contributors", - filter="contributors") \ No newline at end of file + def list_contributors(self, project): + """Lists all the contributors in a project (user/repro).""" + return self.make_request("show", project, "contributors", + filter="contributors") \ No newline at end of file From 6653538ee1ea81754138c60083f3b6fe6fb74de7 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Wed, 18 Aug 2010 11:39:25 +0200 Subject: [PATCH 032/454] Added Chris Vale to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 58a082e..1a45dc3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,3 +9,4 @@ Fernando Perez Evan Broder Scott Torborg Claudio B. +Chris Vale From a797eb034a56560d4c160ca22594a851b94c0952 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Wed, 18 Aug 2010 11:41:26 +0200 Subject: [PATCH 033/454] Added Adam Vandenberg to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 1a45dc3..160e691 100644 --- a/AUTHORS +++ b/AUTHORS @@ -10,3 +10,4 @@ Evan Broder Scott Torborg Claudio B. Chris Vale +Adam Vandenberg From 426141a0ed95f008769162e3557bc43f2f52f03b Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Wed, 18 Aug 2010 11:44:05 +0200 Subject: [PATCH 034/454] Added Kenneth Reitz to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 160e691..891c32b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -11,3 +11,4 @@ Scott Torborg Claudio B. Chris Vale Adam Vandenberg +Kenneth Reitz From 88b74a2a4aacb1e4e444df540528f9cf4ebf80e6 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Wed, 18 Aug 2010 11:46:30 +0200 Subject: [PATCH 035/454] Added Daniel Greenfeld to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 891c32b..0f22a80 100644 --- a/AUTHORS +++ b/AUTHORS @@ -12,3 +12,4 @@ Claudio B. Chris Vale Adam Vandenberg Kenneth Reitz +Daniel Greenfeld From 210b2ac7f9368e372d17b7c932e3ad08c23530d4 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Wed, 18 Aug 2010 11:47:16 +0200 Subject: [PATCH 036/454] Bumped version to 0.1.3 --- README.rst | 2 +- github2/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 7b3898f..6de3f1b 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ python-github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.1.2 +:Version: 0.1.3 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 5f42439..210e1d3 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,4 +1,4 @@ -VERSION = (0, 1, 2) +VERSION = (0, 1, 3) __doc__ = "Github API v2 library for Python" __author__ = "Ask Solem" __contact__ = "askh@opera.com" From 61de5025cd0fc81316c66a7e0d197fda0c3eea9b Mon Sep 17 00:00:00 2001 From: Jeremy Dunck Date: Mon, 20 Sep 2010 23:20:04 -0500 Subject: [PATCH 037/454] Add optional rate-limiting by sleeping the thread if too fast. --- AUTHORS | 1 + README.rst | 9 +++++++-- github2/client.py | 23 +++++++++++++++++++++-- github2/request.py | 28 +++++++++++++++++++++++++--- tests/unit.py | 21 +++++++++++++++++++++ 5 files changed, 75 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0f22a80..ce3ac71 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,3 +13,4 @@ Chris Vale Adam Vandenberg Kenneth Reitz Daniel Greenfeld +Jeremy Dunck diff --git a/README.rst b/README.rst index 7b3898f..c8c6fa5 100644 --- a/README.rst +++ b/README.rst @@ -38,16 +38,21 @@ by doing the following,:: $ python setup.py build # python setup.py install # as root -Creating a request +Creating a client ------------------ >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") -Or for an unauthenticated connection +Or for an unauthenticated connection: >>> github = Github() +API calls are limited by github.com to 1 per second by default. To have the Github client enforce this and avoid rate limit errors, pass requests_per_second in: + + >>> from github2.client import Github + >>> github = Github(username="ask", api_token=".......", requests_per_second=1) + Users ===== diff --git a/github2/client.py b/github2/client.py index c3e77cd..79bd446 100644 --- a/github2/client.py +++ b/github2/client.py @@ -6,10 +6,29 @@ class Github(object): - def __init__(self, username=None, api_token=None, debug=False): + def __init__(self, username=None, api_token=None, debug=False, + requests_per_second=None): + """ + An interface to GitHub's API: + http://develop.github.com/ + + Params: + `username` is your own GitHub username. + + `api_token` can be found here (while logged in as that user): + https://github.com/account + + `requests_per_second` is a float indicating the API rate limit + you're operating under (1 per second per GitHub at the moment), + or None to disable delays. + + The default is to disable delays (for backwards compatibility). + """ + self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, - debug=self.debug) + debug=self.debug, + requests_per_second=requests_per_second) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index a13b602..cd8fa08 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,4 +1,4 @@ -import sys +import sys, time, datetime, math import httplib try: import json as simplejson # For Python 2.6 @@ -30,11 +30,20 @@ class GithubRequest(object): "https": httplib.HTTPSConnection, } - def __init__(self, username=None, api_token=None, url_prefix=None, debug=False): + def __init__(self, username=None, api_token=None, url_prefix=None, + debug=False, requests_per_second=None): + """ + Make an API request. + """ self.username = username self.api_token = api_token self.url_prefix = url_prefix self.debug = debug + if requests_per_second is None: + self.delay = 0 + else: + self.delay = 1.0 / requests_per_second + self.last_request = datetime.datetime(1900,1,1) if not self.url_prefix: self.url_prefix = self.url_format % { "github_url": self.github_url, @@ -61,9 +70,22 @@ def post(self, *path_components, **extra_post_data): method="POST") def make_request(self, path, extra_post_data=None, method="GET"): + if self.delay: + since_last = (datetime.datetime.now() - self.last_request + ).total_seconds() + if since_last < self.delay: + duration = self.delay - since_last + if self.debug: + sys.stderr.write("delaying API call %s\n" % duration) + time.sleep(duration) + extra_post_data = extra_post_data or {} url = "/".join([self.url_prefix, path]) - return self.raw_request(url, extra_post_data, method=method) + result = self.raw_request(url, extra_post_data, method=method) + + if self.delay: + self.last_request = datetime.datetime.now() + return result def raw_request(self, url, extra_post_data, method="GET"): resource = urlparse(url) diff --git a/tests/unit.py b/tests/unit.py index 9347104..eff3d8b 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -2,6 +2,7 @@ import unittest from github2.issues import Issue +from github2.client import Github class ReprTests(unittest.TestCase): @@ -11,3 +12,23 @@ def test_issue(self): """Issues can have non-ASCII characters in the title.""" i = Issue(title = u'abcdé') self.assertEqual(str, type(repr(i))) + + +class RateLimits(unittest.TestCase): + """ + How should we handle actual API calls such that tests can run? + Perhaps the library should support a ~/.python_github2.conf from which to get the auth? + """ + def test_delays(self): + import datetime, time + USERNAME='' + API_KEY='' + client = Github(username=USERNAME, api_token=API_KEY, + requests_per_second=.5) + client.users.show('defunkt') + start = datetime.datetime.now() + client.users.show('mojombo') + end = datetime.datetime.now() + self.assertGreaterEqual((end-start).total_seconds(), 2.0, + "Expected .5 reqs per second to require a 2 second delay between calls.") + \ No newline at end of file From 27060a028f43eaabf1e4f0238e97bb3d950f6380 Mon Sep 17 00:00:00 2001 From: Jonas Obrist Date: Wed, 20 Oct 2010 18:37:18 +0200 Subject: [PATCH 038/454] Added more properties to Repository. --- github2/repositories.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/github2/repositories.py b/github2/repositories.py index f13ca5c..5547352 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import BaseData, GithubCommand, Attribute, DateAttribute class Repository(BaseData): @@ -12,6 +12,11 @@ class Repository(BaseData): owner = Attribute("Username of the user owning this repository.") homepage = Attribute("Homepage for this project.") open_issues = Attribute("List of open issues for this repository.") + created_at = DateAttribute("Datetime the repository was created.") + pushed_at = DateAttribute("Datetime of the last push to this repository") + has_downloads = Attribute("If True, this repository has downloads.") + has_wiki = Attribute("If True, this repository has a wiki.") + has_issues = Attribute("If True, this repository has an issue tracker.") def __repr__(self): return "" % (self.owner, self.name) From d7a11275588b469c9dabcf77f8275a93df162e84 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Fri, 29 Oct 2010 12:23:45 +0200 Subject: [PATCH 039/454] Added Jonas Obrist to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index ce3ac71..f02106d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -14,3 +14,4 @@ Adam Vandenberg Kenneth Reitz Daniel Greenfeld Jeremy Dunck +Jonas Obrist From 1444de9f13087a10052b0f5de181b478f0c57783 Mon Sep 17 00:00:00 2001 From: Sameer on mactop Date: Tue, 12 Oct 2010 18:48:26 -0700 Subject: [PATCH 040/454] total_seconds is a 2.7 addition. saving a line does not seem worth forcing an upgrade --- github2/request.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/request.py b/github2/request.py index cd8fa08..e0db264 100644 --- a/github2/request.py +++ b/github2/request.py @@ -71,10 +71,10 @@ def post(self, *path_components, **extra_post_data): def make_request(self, path, extra_post_data=None, method="GET"): if self.delay: - since_last = (datetime.datetime.now() - self.last_request - ).total_seconds() - if since_last < self.delay: - duration = self.delay - since_last + since_last = (datetime.datetime.now() - self.last_request) + since_last_in_seconds = since_last.days * 24 * 60 * 60 + since_last.seconds + if since_last_in_seconds < self.delay: + duration = self.delay - since_last_in_seconds if self.debug: sys.stderr.write("delaying API call %s\n" % duration) time.sleep(duration) From e2b28efcb16c38839b4920ffb76f1f069b31f7d1 Mon Sep 17 00:00:00 2001 From: Sameer Al-Sakran Date: Tue, 12 Oct 2010 10:26:21 -0700 Subject: [PATCH 041/454] add search by email api function --- github2/users.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/github2/users.py b/github2/users.py index 863dc72..6ef8aee 100644 --- a/github2/users.py +++ b/github2/users.py @@ -36,6 +36,9 @@ class Users(GithubCommand): def search(self, query): return self.get_values("search", query, filter="users", datatype=User) + def search_by_email(self, query): + return self.get_value("email", query, filter="user", datatype=User) + def show(self, username): return self.get_value("show", username, filter="user", datatype=User) From 8a358447d280692d10ead9e805c41aa7c138bf72 Mon Sep 17 00:00:00 2001 From: Sameer Al-Sakran Date: Tue, 12 Oct 2010 11:42:25 -0700 Subject: [PATCH 042/454] typo. still some weirdness in iterating --- github2/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index a97d0e4..2adc6d5 100644 --- a/github2/core.py +++ b/github2/core.py @@ -148,7 +148,7 @@ def constructor(self, **kwargs): _contribute_method("__init__", constructor) def to_dict(self): - _meta = self.meta + _meta = self._meta dict_ = vars(self) return dict([(attr_name, _meta[attr_name].from_python(attr_value)) for attr_name, attr_value in dict_.items()]) From c69c67e7ba7d1644430640a69131c93f1a1e8856 Mon Sep 17 00:00:00 2001 From: Sameer on mactop Date: Tue, 12 Oct 2010 19:11:38 -0700 Subject: [PATCH 043/454] add languages api function --- github2/repositories.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 5547352..c24218f 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -90,6 +90,9 @@ def remove_collaborator(self, repo_name, username): def network(self, project): return self.make_request("show", project, "network", filter="network") + def languages(self, project): + return self.make_request("show", project, "languages", filter="languages") + def tags(self, project): return self.make_request("show", project, "tags", filter="tags") From c079bbff5516dff00c4ade5ac0ef8829e696d872 Mon Sep 17 00:00:00 2001 From: Sameer Al-Sakran Date: Wed, 13 Oct 2010 13:10:42 -0700 Subject: [PATCH 044/454] multi word queries need to be encoded properly --- github2/users.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/github2/users.py b/github2/users.py index 6ef8aee..06dd02d 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,5 +1,5 @@ from github2.core import BaseData, GithubCommand, Attribute, DateAttribute - +import urllib class User(BaseData): id = Attribute("The user id") @@ -34,10 +34,10 @@ class Users(GithubCommand): domain = "user" def search(self, query): - return self.get_values("search", query, filter="users", datatype=User) + return self.get_values("search", urllib.quote_plus(query), filter="users", datatype=User) def search_by_email(self, query): - return self.get_value("email", query, filter="user", datatype=User) + return self.get_value("email", urllib.quote_plus(query), filter="user", datatype=User) def show(self, username): return self.get_value("show", username, filter="user", datatype=User) From 18f73d7a5a8a886496eb69a754ef39d45d928c09 Mon Sep 17 00:00:00 2001 From: Sameer Al-Sakran Date: Thu, 14 Oct 2010 10:58:04 -0700 Subject: [PATCH 045/454] ok. wind back email encoding. --- github2/users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/users.py b/github2/users.py index 06dd02d..8ee4199 100644 --- a/github2/users.py +++ b/github2/users.py @@ -37,7 +37,7 @@ def search(self, query): return self.get_values("search", urllib.quote_plus(query), filter="users", datatype=User) def search_by_email(self, query): - return self.get_value("email", urllib.quote_plus(query), filter="user", datatype=User) + return self.get_value("email", query, filter="user", datatype=User) def show(self, username): return self.get_value("show", username, filter="user", datatype=User) From a26bea898365745acf29d989cd7e9a7fccab0bd0 Mon Sep 17 00:00:00 2001 From: Sameer Al-Sakran Date: Thu, 14 Oct 2010 22:32:11 -0700 Subject: [PATCH 046/454] to_dict is broken, back it out. fix iterate (all on BaseDataType) --- github2/core.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/github2/core.py b/github2/core.py index 2adc6d5..30e9421 100644 --- a/github2/core.py +++ b/github2/core.py @@ -152,10 +152,12 @@ def to_dict(self): dict_ = vars(self) return dict([(attr_name, _meta[attr_name].from_python(attr_value)) for attr_name, attr_value in dict_.items()]) - _contribute_method("__dict__", to_dict) + # I don't understand what this is trying to do. + # whatever it was meant to do is broken and is breaking the ability to call "vars" on instantiations, which is breaking all kindsa shit. -AS + #_contribute_method("__dict__", to_dict) def iterate(self): - not_empty = lambda e: e is not None + not_empty = lambda e: e[1] is not None #AS I *think* this is what was intended. return iter(filter(not_empty, vars(self).items())) _contribute_method("__iter__", iterate) From e23d753f56820c6265e00dd0b2ca5a9e9c488381 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Fri, 29 Oct 2010 12:29:23 +0200 Subject: [PATCH 047/454] Added Sameer Al-Sakran to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index f02106d..94349a4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -15,3 +15,4 @@ Kenneth Reitz Daniel Greenfeld Jeremy Dunck Jonas Obrist +Sameer Al-Sakran From 9c573faef38b14603c8bdca39c0b7a0140502da9 Mon Sep 17 00:00:00 2001 From: Ask Solem Date: Fri, 29 Oct 2010 12:30:01 +0200 Subject: [PATCH 048/454] Bumped version to 0.2.0 --- README.rst | 2 +- github2/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 5534412..439de4f 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ python-github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.1.3 +:Version: 0.2.0 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 210e1d3..a8bd714 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,4 +1,4 @@ -VERSION = (0, 1, 3) +VERSION = (0, 2, 0) __doc__ = "Github API v2 library for Python" __author__ = "Ask Solem" __contact__ = "askh@opera.com" From 9765dda1b0da0946562682401812a0f48259c257 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 08:18:36 +0000 Subject: [PATCH 049/454] Don't install the tests package. Without this we get the tests package is installed as a top-level package. May be easier to just specify the github2 package directly. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 6e7e03f..cacd4e2 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ url=github2.__homepage__, license='BSD', platforms=["any"], - packages=find_packages(exclude=['ez_setup']), + packages=find_packages(exclude=['ez_setup', 'tests']), scripts=['github2/bin/github_manage_collaborators'], install_requires=[ ], From 274a53c6be2834dbc1eaf7dac8f3988c0d68cb2e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 12:02:47 +0000 Subject: [PATCH 050/454] Removed unused import. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index e0db264..7af992a 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,4 +1,4 @@ -import sys, time, datetime, math +import sys, time, datetime import httplib try: import json as simplejson # For Python 2.6 From da635cec29fd4944168f5466a4b21b7a182b141a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 20:16:07 +0000 Subject: [PATCH 051/454] Add support for searching issues. --- github2/issues.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index 73b203c..5e23dd9 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -31,6 +31,17 @@ def __repr__(self): class Issues(GithubCommand): domain = "issues" + def search(self, project, term, state="open"): + """Get all issues for project that match term with given state. + + ``project`` is a string with the project owner username and repository + name separated by ``/`` (e.g. ``ask/pygithub2``). + ``term`` is a string to search issues for. + ``state`` can be either ``open`` or ``closed``. + """ + return self.get_values("search", project, state, term, filter="issues", + datatype=Issue) + def list(self, project, state="open"): """Get all issues for project' with state'. From cfc4c9eb7a5766be439cdc9ee8dfb41299083127 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 2 Nov 2010 15:08:19 +0000 Subject: [PATCH 052/454] Add support for reopening issues. --- github2/issues.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index 5e23dd9..c222ea8 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -67,6 +67,10 @@ def close(self, project, number): return self.get_value("close", project, str(number), filter="issue", datatype=Issue) + def reopen(self, project, number): + return self.get_value("reopen", project, str(number), filter="issue", + datatype=Issue) + def add_label(self, project, number, label): return self.make_request("label/add", project, label, str(number), filter="labels") From f99a3dbaf1af80b243dd4d6e655c1f93cf94cc73 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 2 Nov 2010 15:09:29 +0000 Subject: [PATCH 053/454] Add support for editing issues. --- github2/issues.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index c222ea8..6655421 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -71,6 +71,12 @@ def reopen(self, project, number): return self.get_value("reopen", project, str(number), filter="issue", datatype=Issue) + def edit(self, project, number, title, body): + issue_data = {"title": title, "body": body} + return self.get_value("edit", project, str(number), + post_data=issue_data, filter="issue", + datatype=Issue) + def add_label(self, project, number, label): return self.make_request("label/add", project, label, str(number), filter="labels") From 36da36483db797840f4c3cccbf26c2b3b49da57a Mon Sep 17 00:00:00 2001 From: Daniel Greenfeld Date: Thu, 4 Nov 2010 17:17:00 -0700 Subject: [PATCH 054/454] change to HTTPS --- github2/request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index 11785db..5fbca5f 100644 --- a/github2/request.py +++ b/github2/request.py @@ -8,9 +8,9 @@ from cgi import parse_qs from urllib import urlencode -GITHUB_URL = "http://github.com" +GITHUB_URL = "https://github.com" -URL_PREFIX = "http://github.com/api/v2/json" +URL_PREFIX = "https://github.com/api/v2/json" class GithubError(Exception): """An error occured when making a request to the Github API.""" From c595cf6bd02acea9a1e5bac903af9042c6bfd580 Mon Sep 17 00:00:00 2001 From: Jeremy Dunck Date: Fri, 19 Nov 2010 22:57:50 -0600 Subject: [PATCH 055/454] Add project property to Repository, a bit more convenient in client code than owner+'/'+name. --- github2/repositories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index c24218f..8424bef 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -1,6 +1,5 @@ from github2.core import BaseData, GithubCommand, Attribute, DateAttribute - class Repository(BaseData): name = Attribute("Name of repository.") description = Attribute("Repository description.") @@ -18,8 +17,12 @@ class Repository(BaseData): has_wiki = Attribute("If True, this repository has a wiki.") has_issues = Attribute("If True, this repository has an issue tracker.") + def _project(self): + return self.owner + "/" + self.name + project = property(_project) + def __repr__(self): - return "" % (self.owner, self.name) + return "" % (self._project()) class Repositories(GithubCommand): From 4d90571bfdb449cdce5885fec17335a232ba6276 Mon Sep 17 00:00:00 2001 From: Jeremy Dunck Date: Fri, 19 Nov 2010 23:22:37 -0600 Subject: [PATCH 056/454] Include fractions of seconds in api delay. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index e0db264..c029e64 100644 --- a/github2/request.py +++ b/github2/request.py @@ -72,7 +72,7 @@ def post(self, *path_components, **extra_post_data): def make_request(self, path, extra_post_data=None, method="GET"): if self.delay: since_last = (datetime.datetime.now() - self.last_request) - since_last_in_seconds = since_last.days * 24 * 60 * 60 + since_last.seconds + since_last_in_seconds = (since_last.days * 24 * 60 * 60) + since_last.seconds + (since_last.microseconds/1000000.0) if since_last_in_seconds < self.delay: duration = self.delay - since_last_in_seconds if self.debug: From ccded65f0cd22b353c61fe78af0658a126036374 Mon Sep 17 00:00:00 2001 From: Jens Ohlig Date: Fri, 26 Nov 2010 01:03:50 +0100 Subject: [PATCH 057/454] Added github.repos.pushable() as described in the API documentation. --- github2/repositories.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 8424bef..34ff3ef 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -34,6 +34,12 @@ def search(self, query): def show(self, project): return self.get_value("show", project, filter="repository", datatype=Repository) + def pushable(self): + """ + Return a list of repos you can push to that are not your own. + """ + return self.get_values("pushable", filter="repositories", datatype=Repository) + def list(self, for_user=None): """Return a list of all repositories for a user. From 2445800960e1bcaa43955cf6c8299598e160a099 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Mon, 6 Dec 2010 07:18:07 -0800 Subject: [PATCH 058/454] PyFlakes. --- github2/request.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index c029e64..a6661ad 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,4 +1,4 @@ -import sys, time, datetime, math +import sys, time, datetime import httplib try: import json as simplejson # For Python 2.6 @@ -88,7 +88,6 @@ def make_request(self, path, extra_post_data=None, method="GET"): return result def raw_request(self, url, extra_post_data, method="GET"): - resource = urlparse(url) scheme, netloc, path, params, query, fragment = urlparse(url) hostname = netloc.split(':')[0] post_data = None From 988dddede525438520dfbaaef65438e4956eccca Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Mon, 6 Dec 2010 12:47:56 -0800 Subject: [PATCH 059/454] Add support for Github's OAuth authentication URLs. When using OAuth instead of api_token authentication, these URL's don't POST username+api_token, but add a ?access_token= query parameter to the calls. --- github2/client.py | 9 +++++++-- github2/request.py | 7 +++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/github2/client.py b/github2/client.py index 79bd446..f294b45 100644 --- a/github2/client.py +++ b/github2/client.py @@ -7,7 +7,7 @@ class Github(object): def __init__(self, username=None, api_token=None, debug=False, - requests_per_second=None): + requests_per_second=None, access_token=None): """ An interface to GitHub's API: http://develop.github.com/ @@ -17,6 +17,10 @@ def __init__(self, username=None, api_token=None, debug=False, `api_token` can be found here (while logged in as that user): https://github.com/account + + `access_token` can be used when no ``username`` and/or ``api_token`` + is used. The ``access_token`` is the OAuth access token that is + received after successful OAuth authentication. `requests_per_second` is a float indicating the API rate limit you're operating under (1 per second per GitHub at the moment), @@ -28,7 +32,8 @@ def __init__(self, username=None, api_token=None, debug=False, self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, debug=self.debug, - requests_per_second=requests_per_second) + requests_per_second=requests_per_second, + access_token=access_token) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index a6661ad..3e9786a 100644 --- a/github2/request.py +++ b/github2/request.py @@ -31,12 +31,13 @@ class GithubRequest(object): } def __init__(self, username=None, api_token=None, url_prefix=None, - debug=False, requests_per_second=None): + debug=False, requests_per_second=None, access_token=None): """ Make an API request. """ self.username = username self.api_token = api_token + self.access_token = access_token self.url_prefix = url_prefix self.debug = debug if requests_per_second is None: @@ -52,7 +53,9 @@ def __init__(self, username=None, api_token=None, url_prefix=None, } def encode_authentication_data(self, extra_post_data): - if self.username and self.api_token: + if self.access_token: + post_data = {"access_token": self.access_token} + elif self.username and self.api_token: post_data = {"login": self.username, "token": self.api_token} else: From 431bd8d8b70fe3ba212ecd5b2ae2274b03714915 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Mon, 6 Dec 2010 13:02:28 -0800 Subject: [PATCH 060/454] GitHub's API changed the date format tonight. The dates returned are now all UTC formatted and include time zone information. This patch can probably be reduced to even less code, but I wanted it to be "satefy first". --- github2/commits.py | 4 ++-- github2/core.py | 30 +++++++----------------------- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/github2/commits.py b/github2/commits.py index 3d4a700..7b4bffa 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -7,8 +7,8 @@ class Commit(BaseData): url = Attribute("Canonical URL for this commit.") author = Attribute("Author metadata (dict with name/email.)") id = Attribute("Commit ID.") - committed_date = DateAttribute("Date committed.", format="commit") - authored_date = DateAttribute("Date authored.", format="commit") + committed_date = DateAttribute("Date committed.") + authored_date = DateAttribute("Date authored.") tree = Attribute("Tree SHA for this commit.") committer = Attribute("Comitter metadata (dict with name/email.)") diff --git a/github2/core.py b/github2/core.py index 30e9421..a2a07c4 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,29 +1,17 @@ from datetime import datetime GITHUB_TIMEZONE = "-0700" -GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S" -#2009-03-21T18:01:48-07:00 -COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" +API_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" -def ghdate_to_datetime(github_date): - date_without_tz = " ".join(github_date.strip().split()[:2]) - return datetime.strptime(date_without_tz, GITHUB_DATE_FORMAT) - - -def datetime_to_ghdate(datetime_): - date_without_tz = datetime_.strftime(GITHUB_DATE_FORMAT) - return " ".join([date_without_tz, GITHUB_TIMEZONE]) - - -def commitdate_to_datetime(commit_date): +def ghdate_to_datetime(commit_date): date_without_tz = commit_date[:-6] - return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) + return datetime.strptime(date_without_tz, API_DATE_FORMAT) -def datetime_to_commitdate(datetime_): - date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) +def datetime_to_ghdate(datetime_): + date_without_tz = datetime_.strftime(API_DATE_FORMAT) return "".join([date_without_tz, GITHUB_TIMEZONE]) @@ -93,16 +81,12 @@ def to_python(self, value): class DateAttribute(Attribute): - format = "github" + format = "normal" converter_for_format = { - "github": { + "normal": { "to": ghdate_to_datetime, "from": datetime_to_ghdate, }, - "commit": { - "to": commitdate_to_datetime, - "from": datetime_to_commitdate, - }, } def __init__(self, *args, **kwargs): From 75a6278b3e64966aba98f11ac5c1b684afbab747 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Mon, 6 Dec 2010 14:40:52 -0800 Subject: [PATCH 061/454] Document the new access_token arg in GitHub's constructor. --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 439de4f..7968c0b 100644 --- a/README.rst +++ b/README.rst @@ -40,10 +40,15 @@ by doing the following,:: Creating a client ------------------ +There are three ways to authenticate to the GitHub API. If you want to use your username and API token, use: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") +If you authenticated to GitHub using their OAuth service, pass in the OAuth access token: + + >>> github = Github(access_token="........") + Or for an unauthenticated connection: >>> github = Github() From 1a4b5529ad910200940e9c335681a88d9fcefbb9 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Mon, 6 Dec 2010 21:20:29 -0800 Subject: [PATCH 062/454] Revert "GitHub's API changed the date format tonight." This reverts commit 431bd8d8b70fe3ba212ecd5b2ae2274b03714915. The change was an accidental change to GitHub's production service when they pushed out the new organisation API. It has been reverted to the old situation, so this fix isn't necessary anymore. --- github2/commits.py | 4 ++-- github2/core.py | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/github2/commits.py b/github2/commits.py index 7b4bffa..3d4a700 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -7,8 +7,8 @@ class Commit(BaseData): url = Attribute("Canonical URL for this commit.") author = Attribute("Author metadata (dict with name/email.)") id = Attribute("Commit ID.") - committed_date = DateAttribute("Date committed.") - authored_date = DateAttribute("Date authored.") + committed_date = DateAttribute("Date committed.", format="commit") + authored_date = DateAttribute("Date authored.", format="commit") tree = Attribute("Tree SHA for this commit.") committer = Attribute("Comitter metadata (dict with name/email.)") diff --git a/github2/core.py b/github2/core.py index a2a07c4..30e9421 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,17 +1,29 @@ from datetime import datetime GITHUB_TIMEZONE = "-0700" -API_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" +GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S" +#2009-03-21T18:01:48-07:00 +COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" -def ghdate_to_datetime(commit_date): - date_without_tz = commit_date[:-6] - return datetime.strptime(date_without_tz, API_DATE_FORMAT) +def ghdate_to_datetime(github_date): + date_without_tz = " ".join(github_date.strip().split()[:2]) + return datetime.strptime(date_without_tz, GITHUB_DATE_FORMAT) def datetime_to_ghdate(datetime_): - date_without_tz = datetime_.strftime(API_DATE_FORMAT) + date_without_tz = datetime_.strftime(GITHUB_DATE_FORMAT) + return " ".join([date_without_tz, GITHUB_TIMEZONE]) + + +def commitdate_to_datetime(commit_date): + date_without_tz = commit_date[:-6] + return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) + + +def datetime_to_commitdate(datetime_): + date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) return "".join([date_without_tz, GITHUB_TIMEZONE]) @@ -81,12 +93,16 @@ def to_python(self, value): class DateAttribute(Attribute): - format = "normal" + format = "github" converter_for_format = { - "normal": { + "github": { "to": ghdate_to_datetime, "from": datetime_to_ghdate, }, + "commit": { + "to": commitdate_to_datetime, + "from": datetime_to_commitdate, + }, } def __init__(self, *args, **kwargs): From 59cff36b59eb6ba452a56b46856a35c076ab17e9 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Fri, 10 Dec 2010 07:33:54 +0100 Subject: [PATCH 063/454] Added authors. --- AUTHORS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AUTHORS b/AUTHORS index 94349a4..c40424a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -16,3 +16,5 @@ Daniel Greenfeld Jeremy Dunck Jonas Obrist Sameer Al-Sakran +Vincent Driessen +James Rowe From 4c843fdf1d42e630f81c7cc41e18b7e7c28b7d68 Mon Sep 17 00:00:00 2001 From: Vincent Driessen Date: Fri, 10 Dec 2010 07:55:52 +0100 Subject: [PATCH 064/454] Document the pushables() call. --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 7968c0b..2afb9c1 100644 --- a/README.rst +++ b/README.rst @@ -204,6 +204,11 @@ Repository Visibility >>> github.repos.set_public("ask/chishop") +Pushable repositories +--------------------- + + >>> pushables = github.repos.pushable() + Collaborators ------------- From 04eaca4576992cfb55d66936074965f3ade172d3 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Dec 2010 06:58:19 +0000 Subject: [PATCH 065/454] Encode search terms for issues. This was already added users.search(see c079bbff), so I shouldn't have missed this. --- github2/issues.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/github2/issues.py b/github2/issues.py index 6655421..204cb33 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,3 +1,5 @@ +import urllib + from github2.core import GithubCommand, BaseData, Attribute, DateAttribute class Issue(BaseData): @@ -39,7 +41,8 @@ def search(self, project, term, state="open"): ``term`` is a string to search issues for. ``state`` can be either ``open`` or ``closed``. """ - return self.get_values("search", project, state, term, filter="issues", + return self.get_values("search", project, state, + urllib.quote_plus(term), filter="issues", datatype=Issue) def list(self, project, state="open"): From d3876f0f445b14bfad5b4aabc931c20b7e473f30 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Dec 2010 07:00:15 +0000 Subject: [PATCH 066/454] Added issue searching example. --- README.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.rst b/README.rst index 2afb9c1..61c8a3b 100644 --- a/README.rst +++ b/README.rst @@ -106,6 +106,16 @@ List a Projects Issues >>> github.issues.list("ask/chishop", state="open") >>> github.issues.list("ask/chishop", state="closed") +Search a Projects Issues +------------------------ + + >>> issues = github.issues.search("ask/chishop", "version twice") + >>> issues[0].title + 'Upload hangs on attempted second file.' + + >>> github.issues.search("ask/chishop", term="authorization", + ... state="closed") + View an Issue ------------- From e0c8574846d3e17602a8596bda4d9d5d7ee2b571 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Dec 2010 07:00:49 +0000 Subject: [PATCH 067/454] Added issue reopening example. --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 61c8a3b..bbeac41 100644 --- a/README.rst +++ b/README.rst @@ -138,7 +138,7 @@ Open and Close Issues 2 >>> github.issues.close("ask/chishop", new_issue.number) - + >>> github.issues.reopen("ask/chishop", new_issue.number) Add and Remove Labels --------------------- From 78fe855ac8d61920f5711cfd6d14a93af04bb0e1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Dec 2010 07:00:58 +0000 Subject: [PATCH 068/454] Added issue editing example. --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index bbeac41..93cdf19 100644 --- a/README.rst +++ b/README.rst @@ -147,6 +147,11 @@ Add and Remove Labels >>> github.issues.remove_label("ask/chishop", 2, "important") +Edit an Issue +------------- + + >>> github.issues.edit("ask/chishop", 3, title="New title", + ... body="New body") Network ======= From ff9132f9054bcc3827c94fd927c30cf257d84954 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Dec 2010 07:02:23 +0000 Subject: [PATCH 069/454] Small formatting fixes for README. --- README.rst | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 93cdf19..cbe7ac5 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,6 @@ -================================================================================== +================================================================================ python-github2 - Github API v2 library for Python. -================================================================================== +================================================================================ :Authors: Ask Solem (askh@opera.com) @@ -9,7 +9,8 @@ python-github2 - Github API v2 library for Python. This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. -*Note* This software is not finished. And is likely to change in the near future. +*Note* This software is not finished. And is likely to change in the near +future. .. _`Github API`: http://develop.github.com/ @@ -40,12 +41,15 @@ by doing the following,:: Creating a client ------------------ -There are three ways to authenticate to the GitHub API. If you want to use your username and API token, use: + +There are three ways to authenticate to the GitHub API. If you want to use your +username and API token, use: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") -If you authenticated to GitHub using their OAuth service, pass in the OAuth access token: +If you authenticated to GitHub using their OAuth service, pass in the OAuth +access token: >>> github = Github(access_token="........") @@ -53,10 +57,13 @@ Or for an unauthenticated connection: >>> github = Github() -API calls are limited by github.com to 1 per second by default. To have the Github client enforce this and avoid rate limit errors, pass requests_per_second in: +API calls are limited by github.com to 1 per second by default. To have the +Github client enforce this and avoid rate limit errors, pass requests_per_second +in: - >>> from github2.client import Github - >>> github = Github(username="ask", api_token=".......", requests_per_second=1) + >>> from github2.client import Github + >>> github = Github(username="ask", api_token=".......", + ... requests_per_second=1) Users ===== From 675ba1c4fa8255989ccc60c1d4ed11f770e15983 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 20:02:23 +0800 Subject: [PATCH 070/454] Minor PEP 8 compliance changes. --- github2/__init__.py | 4 ++-- github2/bin/github_manage_collaborators | 20 +++++++++++--------- github2/client.py | 7 ++++--- github2/commits.py | 2 -- github2/core.py | 10 +++++----- github2/issues.py | 1 + github2/repositories.py | 9 +++++---- github2/request.py | 16 ++++++++++------ github2/users.py | 6 ++++-- tests/unit.py | 19 ++++++++++--------- 10 files changed, 52 insertions(+), 42 deletions(-) diff --git a/github2/__init__.py b/github2/__init__.py index a8bd714..3f95739 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,7 +1,7 @@ +"Github API v2 library for Python" VERSION = (0, 2, 0) -__doc__ = "Github API v2 library for Python" + __author__ = "Ask Solem" __contact__ = "askh@opera.com" __homepage__ = "http://github.com/ask/python-github2" __version__ = ".".join(map(str, VERSION)) - diff --git a/github2/bin/github_manage_collaborators b/github2/bin/github_manage_collaborators index 6079446..df41cac 100644 --- a/github2/bin/github_manage_collaborators +++ b/github2/bin/github_manage_collaborators @@ -22,16 +22,18 @@ def parse_commandline(): parser = OptionParser() parser.description = __doc__ - parser.set_usage('usage: %prog [options] (list|add|remove) [collaborator]. Try %prog --help for details.') + parser.set_usage('usage: %prog [options] (list|add|remove) [collaborator].' + 'Try %prog --help for details.') parser.add_option('-d', '--debug', action='store_true', help='Enables debugging mode') parser.add_option('-l', '--login', help='Username to login with') parser.add_option('-a', '--account', - help='User owning the repositories to be changed [default: same as --login]') + help='User owning the repositories to be changed ' \ + '[default: same as --login]') parser.add_option('-t', '--apitoken', - help='API Token - can be found on the lower right of https://github.com/account') - + help='API Token - can be found on the lower right of ' \ + 'https://github.com/account') options, args = parser.parse_args() if len(args) not in [1, 2]: @@ -50,19 +52,19 @@ def parse_commandline(): def main(options, args): """This implements the actual program functionality""" - + if not options.account: options.account = options.login - + github = github2.client.Github(username=options.login, api_token=options.apitoken, debug=options.debug) - + if len(args) == 1: for repos in github.repos.list(options.account): fullreposname = github.project_for_user_repo(options.account, repos.name) print "%s: %s" % (repos.name, ' '.join(github.repos.list_collaborators(fullreposname))) - time.sleep(0.5) # to keep github from overloading + time.sleep(0.5) # to keep github from overloading elif len(args) == 2: command, collaborator = args for repos in github.repos.list(options.account): @@ -75,7 +77,7 @@ def main(options, args): if command == 'add': github.repos.add_collaborator(repos.name, collaborator) print "added %r to %r" % (collaborator, repos.name) - time.sleep(0.5) # to keep github from overloading + time.sleep(0.5) # to keep github from overloading if __name__ == '__main__': diff --git a/github2/client.py b/github2/client.py index f294b45..92008c5 100644 --- a/github2/client.py +++ b/github2/client.py @@ -4,6 +4,7 @@ from github2.users import Users from github2.commits import Commits + class Github(object): def __init__(self, username=None, api_token=None, debug=False, @@ -24,14 +25,14 @@ def __init__(self, username=None, api_token=None, debug=False, `requests_per_second` is a float indicating the API rate limit you're operating under (1 per second per GitHub at the moment), - or None to disable delays. + or None to disable delays. The default is to disable delays (for backwards compatibility). """ self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, - debug=self.debug, + debug=self.debug, requests_per_second=requests_per_second, access_token=access_token) self.issues = Issues(self.request) @@ -53,7 +54,7 @@ def get_tree(self, project, tree_sha): def get_network_meta(self, project): return self.request.raw_request("/".join([self.request.github_url, project, - "network_meta"] ), {}) + "network_meta"]), {}) def get_network_data(self, project, nethash, start=None, end=None): return self.request.raw_request("/".join([self.request.github_url, diff --git a/github2/commits.py b/github2/commits.py index 3d4a700..f584c0a 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -33,5 +33,3 @@ def list(self, project, branch="master", file=None): def show(self, project, sha): return self.get_value("show", project, sha, filter="commit", datatype=Commit) - - diff --git a/github2/core.py b/github2/core.py index 30e9421..b7c0a1e 100644 --- a/github2/core.py +++ b/github2/core.py @@ -6,7 +6,6 @@ COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" - def ghdate_to_datetime(github_date): date_without_tz = " ".join(github_date.strip().split()[:2]) return datetime.strptime(date_without_tz, GITHUB_DATE_FORMAT) @@ -52,7 +51,7 @@ def get_value(self, *args, **kwargs): # unicode keys are not accepted as kwargs by python, see: #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E # So we make a local dict with the same keys but as strings: - return datatype(**dict((str(k), v) for (k,v) in value.iteritems())) + return datatype(**dict((str(k), v) for (k, v) in value.iteritems())) return value def get_values(self, *args, **kwargs): @@ -61,14 +60,15 @@ def get_values(self, *args, **kwargs): if datatype: # Same as above, unicode keys will blow up in **args, so we need to # create a new 'values' dict with string keys - return [ datatype(**dict((str(k), v) for (k,v) in value.iteritems())) - for value in values ] + return [datatype(**dict((str(k), v) for (k, v) in value.iteritems())) + for value in values] else: return values def doc_generator(docstring, attributes): docstring = docstring or "" + def section(title): return "\n".join([title, "-" * len(title)]) @@ -157,7 +157,7 @@ def to_dict(self): #_contribute_method("__dict__", to_dict) def iterate(self): - not_empty = lambda e: e[1] is not None #AS I *think* this is what was intended. + not_empty = lambda e: e[1] is not None # AS I *think* this is what was intended. return iter(filter(not_empty, vars(self).items())) _contribute_method("__iter__", iterate) diff --git a/github2/issues.py b/github2/issues.py index 204cb33..f296dc7 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -2,6 +2,7 @@ from github2.core import GithubCommand, BaseData, Attribute, DateAttribute + class Issue(BaseData): position = Attribute("The position of this issue in a list.") number = Attribute("The issue number (unique for project).") diff --git a/github2/repositories.py b/github2/repositories.py index 34ff3ef..720e97a 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -100,8 +100,9 @@ def network(self, project): return self.make_request("show", project, "network", filter="network") def languages(self, project): - return self.make_request("show", project, "languages", filter="languages") - + return self.make_request("show", project, "languages", + filter="languages") + def tags(self, project): return self.make_request("show", project, "tags", filter="tags") @@ -110,8 +111,8 @@ def branches(self, project): filter="branches") def watchers(self, project): - return self.make_request("show", project, "watchers", - filter="watchers") + return self.make_request("show", project, "watchers", + filter="watchers") def watching(self, for_user=None): """Lists all the repos a user is watching.""" diff --git a/github2/request.py b/github2/request.py index 3e9786a..e8c2188 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,7 +1,9 @@ -import sys, time, datetime +import datetime +import sys +import time import httplib try: - import json as simplejson # For Python 2.6 + import json as simplejson # For Python 2.6 except ImportError: import simplejson from urlparse import urlparse, urlunparse @@ -15,9 +17,11 @@ URL_PREFIX = "https://github.com/api/v2/json" + class GithubError(Exception): """An error occured when making a request to the Github API.""" + class GithubRequest(object): github_url = GITHUB_URL url_format = "%(github_url)s/api/%(api_version)s/%(api_format)s" @@ -30,7 +34,7 @@ class GithubRequest(object): "https": httplib.HTTPSConnection, } - def __init__(self, username=None, api_token=None, url_prefix=None, + def __init__(self, username=None, api_token=None, url_prefix=None, debug=False, requests_per_second=None, access_token=None): """ Make an API request. @@ -44,7 +48,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, self.delay = 0 else: self.delay = 1.0 / requests_per_second - self.last_request = datetime.datetime(1900,1,1) + self.last_request = datetime.datetime(1900, 1, 1) if not self.url_prefix: self.url_prefix = self.url_format % { "github_url": self.github_url, @@ -60,7 +64,7 @@ def encode_authentication_data(self, extra_post_data): "token": self.api_token} else: post_data = {} - post_data.update(extra_post_data) + post_data.update(extra_post_data) return urlencode(post_data) def get(self, *path_components): @@ -81,7 +85,7 @@ def make_request(self, path, extra_post_data=None, method="GET"): if self.debug: sys.stderr.write("delaying API call %s\n" % duration) time.sleep(duration) - + extra_post_data = extra_post_data or {} url = "/".join([self.url_prefix, path]) result = self.raw_request(url, extra_post_data, method=method) diff --git a/github2/users.py b/github2/users.py index 8ee4199..4bf14de 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,6 +1,7 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import BaseData, GithubCommand, Attribute import urllib + class User(BaseData): id = Attribute("The user id") login = Attribute("The login username") @@ -34,7 +35,8 @@ class Users(GithubCommand): domain = "user" def search(self, query): - return self.get_values("search", urllib.quote_plus(query), filter="users", datatype=User) + return self.get_values("search", urllib.quote_plus(query), + filter="users", datatype=User) def search_by_email(self, query): return self.get_value("email", query, filter="user", datatype=User) diff --git a/tests/unit.py b/tests/unit.py index eff3d8b..88c7448 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -10,25 +10,26 @@ class ReprTests(unittest.TestCase): def test_issue(self): """Issues can have non-ASCII characters in the title.""" - i = Issue(title = u'abcdé') + i = Issue(title=u'abcdé') self.assertEqual(str, type(repr(i))) class RateLimits(unittest.TestCase): """ How should we handle actual API calls such that tests can run? - Perhaps the library should support a ~/.python_github2.conf from which to get the auth? + Perhaps the library should support a ~/.python_github2.conf from which to + get the auth? """ def test_delays(self): - import datetime, time - USERNAME='' - API_KEY='' - client = Github(username=USERNAME, api_token=API_KEY, + import datetime + USERNAME = '' + API_KEY = '' + client = Github(username=USERNAME, api_token=API_KEY, requests_per_second=.5) client.users.show('defunkt') start = datetime.datetime.now() client.users.show('mojombo') end = datetime.datetime.now() - self.assertGreaterEqual((end-start).total_seconds(), 2.0, - "Expected .5 reqs per second to require a 2 second delay between calls.") - \ No newline at end of file + self.assertGreaterEqual((end - start).total_seconds(), 2.0, + "Expected .5 reqs per second to require a 2 second delay between " + "calls.") From 16dbc08990ce84970592fdf21ad2ad6960c7d877 Mon Sep 17 00:00:00 2001 From: Josh Weinberg Date: Tue, 21 Dec 2010 14:34:27 -0600 Subject: [PATCH 071/454] URL escaping the path portion of the request to allow for better label naming --- github2/request.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index e8c2188..a19f4aa 100644 --- a/github2/request.py +++ b/github2/request.py @@ -11,7 +11,7 @@ from urlparse import parse_qs except ImportError: from cgi import parse_qs -from urllib import urlencode +from urllib import urlencode, quote GITHUB_URL = "https://github.com" @@ -87,7 +87,7 @@ def make_request(self, path, extra_post_data=None, method="GET"): time.sleep(duration) extra_post_data = extra_post_data or {} - url = "/".join([self.url_prefix, path]) + url = "/".join([self.url_prefix, quote(path)]) result = self.raw_request(url, extra_post_data, method=method) if self.delay: From 9d5ebc3478689324f596bfc731f073d841c1c40e Mon Sep 17 00:00:00 2001 From: Christopher MacGown Date: Thu, 30 Dec 2010 19:19:45 +0100 Subject: [PATCH 072/454] Adds support for Github API pull requests --- github2/client.py | 2 ++ github2/pull_requests.py | 49 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 github2/pull_requests.py diff --git a/github2/client.py b/github2/client.py index f294b45..568aa9e 100644 --- a/github2/client.py +++ b/github2/client.py @@ -3,6 +3,7 @@ from github2.repositories import Repositories from github2.users import Users from github2.commits import Commits +from github2.pull_requests import PullRequests class Github(object): @@ -38,6 +39,7 @@ def __init__(self, username=None, api_token=None, debug=False, self.users = Users(self.request) self.repos = Repositories(self.request) self.commits = Commits(self.request) + self.pull_requests = PullRequests(self.request) def project_for_user_repo(self, user, repo): return "/".join([user, repo]) diff --git a/github2/pull_requests.py b/github2/pull_requests.py new file mode 100644 index 0000000..fd8e49c --- /dev/null +++ b/github2/pull_requests.py @@ -0,0 +1,49 @@ +from github2.core import BaseData, GithubCommand, Attribute, DateAttribute + +class PullRequest(BaseData): + state = Attribute("The pull request state") + base = Attribute("The base repo") + head = Attribute("The head of the pull request") + issue_user = Attribute("The user who created the pull request.") + user = Attribute("The owner of the repo.") + title = Attribute("The text of the pull request title.") + body = Attribute("The text of the body.") + position = Attribute("Floating point position of the pull request.") + number = Attribute("Number of this request.") + votes = Attribute("Number of votes for this request.") + comments = Attribute("Any comments made on this request.") + diff_url = Attribute("The URL to the unified diff.") + patch_url = Attribute("The URL to the downloadable patch.") + labels = Attribute("A list of labels attached to the pull request.") + html_url = Attribute("The URL to the pull request.") + issue_created_at = DateAttribute("The date the issue for this pull request was opened.") + issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.") + created_at = DateAttribute("The date when this pull request was created.") + updated_at = DateAttribute("The date when this pull request was last updated.") + + def __repr__(self): + return "" % self.html_url + + +class PullRequests(GithubCommand): + domain = "pulls" + + def new(self, repo, base, head, title=None, body=None, issue=None): + """ Create a new pull request """ + post_data = {"base": base, "head": head} + if issue: + post_data["issue"] = issue + elif title and body: + post_data["title"] = title + post_data["body"] = body + pull_request_data = [("pull[%s]" % k, v) for k, v in post_data.items()] + return self.get_value(repo, post_data=dict(pull_request_data), + filter="pull", datatype=PullRequest) + + def show(self, repo, number): + """ Show a single pull request """ + return self.get_value(repo, str(number), filter="pull", datatype=PullRequest) + + def list(self, repo, state=None): + """ List all pull requests for a repo """ + return self.get_values(repo, state, filter="pulls", datatype=PullRequest) From d00d0794923d5fdcc71353e5a2b3566df76e38de Mon Sep 17 00:00:00 2001 From: Christopher MacGown Date: Thu, 30 Dec 2010 19:44:05 +0100 Subject: [PATCH 073/454] Fixed the datetime format for the DateAttributes --- github2/pull_requests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index fd8e49c..5ba7468 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -16,10 +16,10 @@ class PullRequest(BaseData): patch_url = Attribute("The URL to the downloadable patch.") labels = Attribute("A list of labels attached to the pull request.") html_url = Attribute("The URL to the pull request.") - issue_created_at = DateAttribute("The date the issue for this pull request was opened.") - issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.") - created_at = DateAttribute("The date when this pull request was created.") - updated_at = DateAttribute("The date when this pull request was last updated.") + issue_created_at = DateAttribute("The date the issue for this pull request was opened.", format='commit') + issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.", format='commit') + created_at = DateAttribute("The date when this pull request was created.", format='commit') + updated_at = DateAttribute("The date when this pull request was last updated.", format='commit') def __repr__(self): return "" % self.html_url From 11972f4c835a60abc53a546871ffe949f10a065f Mon Sep 17 00:00:00 2001 From: Barthelemy Dagenais Date: Sat, 19 Feb 2011 10:16:11 -0500 Subject: [PATCH 074/454] added operations to list labels and to search issues by label --- github2/issues.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index f296dc7..2988481 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -56,6 +56,24 @@ def list(self, project, state="open"): return self.get_values("list", project, state, filter="issues", datatype=Issue) + def list_by_label(self, project, label): + """Get all issues for project' with label'. + + ``project`` is a string with the project owner username and repository + name separated by ``/`` (e.g. ``ask/pygithub2``). + ``label`` is a string representing a label (e.g., ``bug``). + """ + return self.get_values("list", project, "label", label, filter="issues", + datatype=Issue) + + def list_labels(self, project): + """Get all labels for project'. + + ``project`` is a string with the project owner username and repository + name separated by ``/`` (e.g. ``ask/pygithub2``). + """ + return self.get_values("labels", project, filter="labels") + def show(self, project, number): """Get all the data for issue by issue-number.""" return self.get_value("show", project, str(number), From de7638f8e69d78bbec004cd1e22696d3d32aabc1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 Feb 2011 14:33:29 +0000 Subject: [PATCH 075/454] Fix issue label addition/removal. Now need to force POST, really should have been doing it from the outset. --- github2/issues.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index f296dc7..5642de5 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -83,11 +83,11 @@ def edit(self, project, number, title, body): def add_label(self, project, number, label): return self.make_request("label/add", project, label, str(number), - filter="labels") + filter="labels", method="POST") def remove_label(self, project, number, label): return self.make_request("label/remove", project, label, str(number), - filter="labels") + filter="labels", method="POST") def comment(self, project, number, comment): """Comment on an issue.""" From ba063e033550556b99452b7fea2119ec7c19fccd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 22 Feb 2011 21:19:02 +0000 Subject: [PATCH 076/454] Need to force POST on issues.{close,reopen} too. --- github2/issues.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index 5642de5..1ae94a4 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -69,11 +69,11 @@ def open(self, project, title, body): def close(self, project, number): return self.get_value("close", project, str(number), filter="issue", - datatype=Issue) + datatype=Issue, method="POST") def reopen(self, project, number): return self.get_value("reopen", project, str(number), filter="issue", - datatype=Issue) + datatype=Issue, method="POST") def edit(self, project, number, title, body): issue_data = {"title": title, "body": body} From 589b2f21f2e1310c1083b137e4981bdee8c5548c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 8 Apr 2011 10:38:06 +0100 Subject: [PATCH 077/454] Document pull request attributes of issue objects. --- github2/issues.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/github2/issues.py b/github2/issues.py index 1ae94a4..0578341 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -15,6 +15,9 @@ class Issue(BaseData): created_at = DateAttribute("The date this issue was created.") closed_at = DateAttribute("The date this issue was closed.") updated_at = DateAttribute("The date when this issue was last updated.") + diff_url = Attribute("URL for diff output associated with this issue.") + patch_url = Attribute("URL for format-patch associated with this issue.") + pull_request_url = Attribute("URL for the issue's related pull request.") def __repr__(self): return "" % self.title.encode('utf-8') From 36c43b46ebdd28e05b63ea6940fbb8d21b0af7d2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 9 Apr 2011 18:05:58 +0100 Subject: [PATCH 078/454] Added example for listing by label. --- README.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.rst b/README.rst index cbe7ac5..984f16f 100644 --- a/README.rst +++ b/README.rst @@ -147,6 +147,14 @@ Open and Close Issues >>> github.issues.close("ask/chishop", new_issue.number) >>> github.issues.reopen("ask/chishop", new_issue.number) +List Labels +----------- + + >>> github.issues.list_labels("ask/chisop") + [u'TODO', u'ask'] + >>> github.issues.list_by_label("ask/chishop", "TODO") + [] + Add and Remove Labels --------------------- From 037ada830e243f66a626301044ca13225afef976 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 9 Apr 2011 18:07:30 +0100 Subject: [PATCH 079/454] Updated AUTHORS. --- AUTHORS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AUTHORS b/AUTHORS index c40424a..94a07d5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -18,3 +18,5 @@ Jonas Obrist Sameer Al-Sakran Vincent Driessen James Rowe +Josh Weinberg +Barthelemy Dagenais From 944c63a408a21dfb852aa05aa11ad660db3fefdc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 11:22:29 +0000 Subject: [PATCH 080/454] Use httplib2 for handling requests. Signed-off-by: James Rowe --- github2/request.py | 31 ++++++------------------------- setup.py | 1 + 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/github2/request.py b/github2/request.py index a19f4aa..096dbbe 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,16 +1,11 @@ import datetime import sys import time -import httplib +import httplib2 try: import json as simplejson # For Python 2.6 except ImportError: import simplejson -from urlparse import urlparse, urlunparse -try: - from urlparse import parse_qs -except ImportError: - from cgi import parse_qs from urllib import urlencode, quote GITHUB_URL = "https://github.com" @@ -29,11 +24,6 @@ class GithubRequest(object): api_format = "json" GithubError = GithubError - connector_for_scheme = { - "http": httplib.HTTPConnection, - "https": httplib.HTTPSConnection, - } - def __init__(self, username=None, api_token=None, url_prefix=None, debug=False, requests_per_second=None, access_token=None): """ @@ -55,6 +45,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } + self._http = httplib2.Http() def encode_authentication_data(self, extra_post_data): if self.access_token: @@ -95,8 +86,6 @@ def make_request(self, path, extra_post_data=None, method="GET"): return result def raw_request(self, url, extra_post_data, method="GET"): - scheme, netloc, path, params, query, fragment = urlparse(url) - hostname = netloc.split(':')[0] post_data = None headers = self.http_headers headers["Accept"] = "text/html" @@ -104,22 +93,14 @@ def raw_request(self, url, extra_post_data, method="GET"): if extra_post_data or method == "POST": post_data = self.encode_authentication_data(extra_post_data) headers["Content-Length"] = str(len(post_data)) - else: - path = urlunparse((scheme, netloc, path, params, - self.encode_authentication_data(parse_qs(query)), - fragment)) - connector = self.connector_for_scheme[scheme] - connection = connector(hostname) - connection.request(method, path, post_data, headers) - response = connection.getresponse() - response_text = response.read() + response, content = self._http.request(url, method, post_data, headers) if self.debug: sys.stderr.write("URL:[%s] POST_DATA:%s RESPONSE_TEXT: [%s]\n" % ( - path, post_data, response_text)) + url, post_data, content)) if response.status >= 400: raise RuntimeError("unexpected response from github.com %d: %r" % ( - response.status, response_text)) - json = simplejson.loads(response_text) + response.status, content)) + json = simplejson.loads(content) if json.get("error"): raise self.GithubError(json["error"][0]["error"]) diff --git a/setup.py b/setup.py index cacd4e2..9262083 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,7 @@ packages=find_packages(exclude=['ez_setup', 'tests']), scripts=['github2/bin/github_manage_collaborators'], install_requires=[ + "httplib2", ], classifiers=[ "Development Status :: 3 - Alpha", From b1efae999b00dfc3601f0008bb74ba96965bd82d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 31 Oct 2010 11:30:42 +0000 Subject: [PATCH 081/454] Added support for httplib2 cache usage. Signed-off-by: James Rowe --- github2/client.py | 6 ++++-- github2/request.py | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/github2/client.py b/github2/client.py index 92008c5..6588394 100644 --- a/github2/client.py +++ b/github2/client.py @@ -8,7 +8,7 @@ class Github(object): def __init__(self, username=None, api_token=None, debug=False, - requests_per_second=None, access_token=None): + requests_per_second=None, access_token=None, cache=None): """ An interface to GitHub's API: http://develop.github.com/ @@ -28,13 +28,15 @@ def __init__(self, username=None, api_token=None, debug=False, or None to disable delays. The default is to disable delays (for backwards compatibility). + + `cache` is a directory for caching GitHub responses. """ self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, debug=self.debug, requests_per_second=requests_per_second, - access_token=access_token) + access_token=access_token, cache=cache) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index 096dbbe..f8592a1 100644 --- a/github2/request.py +++ b/github2/request.py @@ -25,7 +25,8 @@ class GithubRequest(object): GithubError = GithubError def __init__(self, username=None, api_token=None, url_prefix=None, - debug=False, requests_per_second=None, access_token=None): + debug=False, requests_per_second=None, access_token=None, + cache=None): """ Make an API request. """ @@ -45,7 +46,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } - self._http = httplib2.Http() + self._http = httplib2.Http(cache=cache) def encode_authentication_data(self, extra_post_data): if self.access_token: From 37f37ef5e168056690ef833caf64949f29ce6264 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 9 Apr 2011 18:17:46 +0100 Subject: [PATCH 082/454] Added example of setting up httplib2 cache. --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 984f16f..e6aceb5 100644 --- a/README.rst +++ b/README.rst @@ -57,6 +57,11 @@ Or for an unauthenticated connection: >>> github = Github() +The package supports caching of GitHub responses by adding a ``cache`` keyword +during setup:: + + >>> github = Github(username="ask", api_token=".......", cache="cache_dir") + API calls are limited by github.com to 1 per second by default. To have the Github client enforce this and avoid rate limit errors, pass requests_per_second in: From 34da011f5a441265f9cb00151652f5cd8e343a57 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 9 Apr 2011 18:20:05 +0100 Subject: [PATCH 083/454] Small reST formatting fixes. --- README.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index 984f16f..ff6abcf 100644 --- a/README.rst +++ b/README.rst @@ -25,16 +25,16 @@ Installation You can install ``python-github2`` either via the Python Package Index (PyPI) or from source. -To install using ``pip``,:: +To install using ``pip``:: $ pip install github2 -To install using ``easy_install``,:: +To install using ``easy_install``:: $ easy_install github2 If you have downloaded a source tarball you can install it -by doing the following,:: +by doing the following:: $ python setup.py build # python setup.py install # as root @@ -43,23 +43,23 @@ Creating a client ------------------ There are three ways to authenticate to the GitHub API. If you want to use your -username and API token, use: +username and API token, use:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") If you authenticated to GitHub using their OAuth service, pass in the OAuth -access token: +access token:: >>> github = Github(access_token="........") -Or for an unauthenticated connection: +Or for an unauthenticated connection:: >>> github = Github() API calls are limited by github.com to 1 per second by default. To have the Github client enforce this and avoid rate limit errors, pass requests_per_second -in: +in:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......", @@ -245,7 +245,7 @@ Collaborators >>> collabs = github.repos.list_collaborators("ask/chishop") >>> github.repos.add_collaborator("ask/chishop", "schacon") - + >>> github.repos.remove_collaborator("ask/chishop", "schacon") Watchers @@ -268,7 +268,7 @@ Repository Refs Get a list of remote branches - >>> branches = github.repos.branches("ask/chishop") + >>> branches = github.repos.branches("ask/chishop") Commit @@ -291,7 +291,7 @@ Showing a Specific Commit >>> commit = github.commits.show("mojombo/grit", ... sha="5071bf9fbfb81778c456d62e111440fdc776f76c") - + Object ====== From 8da5fe812bff7b5b0fa53d55bf490d71a422a48d Mon Sep 17 00:00:00 2001 From: Surajram Kumaravel Date: Mon, 11 Apr 2011 06:15:49 +0530 Subject: [PATCH 084/454] Added get_all_blobs to client --- github2/client.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/github2/client.py b/github2/client.py index 92008c5..fc77a3c 100644 --- a/github2/client.py +++ b/github2/client.py @@ -42,6 +42,10 @@ def __init__(self, username=None, api_token=None, debug=False, def project_for_user_repo(self, user, repo): return "/".join([user, repo]) + + def get_all_blobs(self, project, tree_sha): + blobs = self.request.get("blob/all", project, tree_sha) + return blobs.get("blobs") def get_blob_info(self, project, tree_sha, path): blob = self.request.get("blob/show", project, tree_sha, path) From 9337585b3a6b992a75f355308a29e44d521522e1 Mon Sep 17 00:00:00 2001 From: Surajram Kumaravel Date: Mon, 11 Apr 2011 06:26:20 +0530 Subject: [PATCH 085/454] Added Examples fot get_all_blobs --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index ff6abcf..413ec59 100644 --- a/README.rst +++ b/README.rst @@ -306,6 +306,11 @@ Blobs >>> blob = github.get_blob_info(project, tree_sha, path) +All Blobs +----- + + >>> blobs = github.get_all_blobs(project, tree_sha) + License ======= From c01c263e7b221412dc29470753b34d2a830ae078 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 10:21:32 +0100 Subject: [PATCH 086/454] Updated ignore list. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5aba821..0c03957 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ .DS_Store +.noseids +.ropeproject/ *.pyc *~ *.sqlite From 320ee3c5f7b109e86e01efed3d918c8f21eeaa49 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 14:46:21 +0100 Subject: [PATCH 087/454] API rate-limiting is handled, no need to manually do it. github_manage_collaborators feel like a usage example to me, so use the available features. --- github2/bin/github_manage_collaborators | 3 --- 1 file changed, 3 deletions(-) diff --git a/github2/bin/github_manage_collaborators b/github2/bin/github_manage_collaborators index df41cac..acce605 100644 --- a/github2/bin/github_manage_collaborators +++ b/github2/bin/github_manage_collaborators @@ -13,7 +13,6 @@ R/W access to all private repositories of the company account. from optparse import OptionParser import github2.client -import time def parse_commandline(): @@ -64,7 +63,6 @@ def main(options, args): for repos in github.repos.list(options.account): fullreposname = github.project_for_user_repo(options.account, repos.name) print "%s: %s" % (repos.name, ' '.join(github.repos.list_collaborators(fullreposname))) - time.sleep(0.5) # to keep github from overloading elif len(args) == 2: command, collaborator = args for repos in github.repos.list(options.account): @@ -77,7 +75,6 @@ def main(options, args): if command == 'add': github.repos.add_collaborator(repos.name, collaborator) print "added %r to %r" % (collaborator, repos.name) - time.sleep(0.5) # to keep github from overloading if __name__ == '__main__': From 6544e4cf5efa4a3d0eb936c04c6d37cb80e1da9a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 14:47:49 +0100 Subject: [PATCH 088/454] Depend on simplejson for Python <2.6. --- setup.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 9262083..d978e8c 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- import codecs +import sys try: from setuptools import setup, find_packages @@ -11,6 +12,13 @@ import github2 + +install_requires = ['httplib2', ] +# simplejson is included in the standard library since Python 2.6 as json. +if sys.version_info[:2] < (2, 6): + install_requires.append('simplejson >= 2.0.9') + + setup( name='github2', version=github2.__version__, @@ -22,9 +30,7 @@ platforms=["any"], packages=find_packages(exclude=['ez_setup', 'tests']), scripts=['github2/bin/github_manage_collaborators'], - install_requires=[ - "httplib2", - ], + install_requires=install_requires, classifiers=[ "Development Status :: 3 - Alpha", "Operating System :: OS Independent", From 7366bf1b481de94e49437a74eca8960df4a8bf31 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 14:52:58 +0100 Subject: [PATCH 089/454] Updated PyPI classifiers. --- setup.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d978e8c..8acbede 100644 --- a/setup.py +++ b/setup.py @@ -33,9 +33,17 @@ install_requires=install_requires, classifiers=[ "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", - "License :: OSI Approved :: BSD License", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.4", + "Programming Language :: Python :: 2.5", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Topic :: Software Development", + "Topic :: Software Development :: Libraries", ], long_description=codecs.open('README.rst', "r", "utf-8").read(), ) From fb213097e838ddfa40d9f71f1705d7af661cfbdf Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 15:30:23 +0100 Subject: [PATCH 090/454] Allow tests to be run with Python <2.6. --- tests/unit.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/unit.py b/tests/unit.py index 88c7448..4573c24 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -30,6 +30,10 @@ def test_delays(self): start = datetime.datetime.now() client.users.show('mojombo') end = datetime.datetime.now() - self.assertGreaterEqual((end - start).total_seconds(), 2.0, + + delta = end - start + delta_seconds = delta.days * 24 * 60 * 60 + delta.seconds + + self.assertTrue(delta_seconds >= 2, "Expected .5 reqs per second to require a 2 second delay between " "calls.") From f4731307b5e700c94ff188514fb171c666d933e7 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 15:50:37 +0100 Subject: [PATCH 091/454] Added httplib2.Http mock for use in tests. --- tests/unit.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/unit.py b/tests/unit.py index 4573c24..6aee24c 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -1,10 +1,40 @@ # -*- coding: latin-1 -*- +import os import unittest +from email import message_from_file + +import httplib2 + from github2.issues import Issue from github2.client import Github +HTTP_DATA_DIR = "tests/data/" + + +class HttpMock(object): + """Simple Http mock that returns saved entries + + Implementation tests should never span network boundaries + """ + + def __init__(self, cache=None, timeout=None, proxy_info=None): + pass + + def request(self, uri, method='GET', body=None, headers=None, + redirections=5, connection_type=None): + file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) + print file + if os.path.exists(file): + response = message_from_file(open(file)) + body = response.get_payload() + headers = httplib2.Response(response) + return (headers, body) + else: + return (httplib2.Response({"status": "404"}), "") + + class ReprTests(unittest.TestCase): """__repr__ must return strings, not unicode objects.""" From ad8e985833fbe530cfc46c17658e0bd28b8f344d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 15:51:11 +0100 Subject: [PATCH 092/454] Updated rate-limit test to use saved data. --- ...r,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c | 14 ++++++++++++++ ...r,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 | 14 ++++++++++++++ tests/unit.py | 14 +++++++++----- 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c create mode 100644 tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c new file mode 100644 index 0000000..77b8df0 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/user/show/defunkt +x-runtime: 233ms +content-length: 390 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "53961f440447e2770b1386199b7a6ef3" +cache-control: private, max-age=0, must-revalidate +date: Mon, 11 Apr 2011 14:45:49 GMT +content-type: application/json; charset=utf-8 + +{"user":{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco, CA","public_repo_count":92,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":2244,"login":"defunkt","email":"chris@wanstrath.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 b/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 new file mode 100644 index 0000000..c3838b2 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/user/show/mojombo +x-runtime: 23ms +content-length: 391 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "45a6fa1730ba70b40ccd595130b2390e" +cache-control: private, max-age=0, must-revalidate +date: Mon, 11 Apr 2011 14:46:22 GMT +content-type: application/json; charset=utf-8 + +{"user":{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":49,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":1454,"login":"mojombo","email":"tom@github.com"}} \ No newline at end of file diff --git a/tests/unit.py b/tests/unit.py index 6aee24c..6cdeb36 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -45,12 +45,16 @@ def test_issue(self): class RateLimits(unittest.TestCase): - """ - How should we handle actual API calls such that tests can run? - Perhaps the library should support a ~/.python_github2.conf from which to - get the auth? - """ + """Test API rate-limitting""" + def setUp(self): + self.old_httplib2 = httplib2.Http + httplib2.Http = HttpMock + + def tearDown(self): + httplib2.Http = self.old_httplib2 + def test_delays(self): + """Test call delay is at least one second""" import datetime USERNAME = '' API_KEY = '' From 2cab41fb98c6d2c48481af0dedf43d02b6ffade5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:17:08 +0100 Subject: [PATCH 093/454] Added Sphinx template from sphinx-quickstart. --- doc/Makefile | 130 ++++++++++++++++++++++++++++++ doc/conf.py | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 20 +++++ 3 files changed, 366 insertions(+) create mode 100644 doc/Makefile create mode 100644 doc/conf.py create mode 100644 doc/index.rst diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..a7a577c --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,130 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = .build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/python-github2.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/python-github2.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/python-github2" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/python-github2" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + make -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 0000000..789c8d8 --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,216 @@ +# -*- coding: utf-8 -*- +# +# python-github2 documentation build configuration file, created by +# sphinx-quickstart on Mon Apr 11 16:16:25 2011. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['.templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'python-github2' +copyright = u'2011, Ask Solem' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0.2' +# The full version, including alpha/beta/rc tags. +release = '0.2.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['.build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['.static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'python-github2doc' + + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ + ('index', 'python-github2.tex', u'python-github2 Documentation', + u'Ask Solem', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'python-github2', u'python-github2 Documentation', + [u'Ask Solem'], 1) +] diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 0000000..f413657 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,20 @@ +.. python-github2 documentation master file, created by + sphinx-quickstart on Mon Apr 11 16:16:25 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to python-github2's documentation! +========================================== + +Contents: + +.. toctree:: + :maxdepth: 2 + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + From e10d3e515f669a393807c39f02dad16798e0169d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:20:41 +0100 Subject: [PATCH 094/454] Imported README.txt docs to Sphinx tree. --- doc/api/client.rst | 30 ++++++++++++++++ doc/api/commit.rst | 20 +++++++++++ doc/api/index.rst | 13 +++++++ doc/api/issues.rst | 63 +++++++++++++++++++++++++++++++++ doc/api/network.rst | 13 +++++++ doc/api/object.rst | 17 +++++++++ doc/api/repos.rst | 86 +++++++++++++++++++++++++++++++++++++++++++++ doc/api/users.rst | 38 ++++++++++++++++++++ doc/index.rst | 21 +++++++++-- doc/install.rst | 19 ++++++++++ doc/license.rst | 6 ++++ 11 files changed, 323 insertions(+), 3 deletions(-) create mode 100644 doc/api/client.rst create mode 100644 doc/api/commit.rst create mode 100644 doc/api/index.rst create mode 100644 doc/api/issues.rst create mode 100644 doc/api/network.rst create mode 100644 doc/api/object.rst create mode 100644 doc/api/repos.rst create mode 100644 doc/api/users.rst create mode 100644 doc/install.rst create mode 100644 doc/license.rst diff --git a/doc/api/client.rst b/doc/api/client.rst new file mode 100644 index 0000000..6d36915 --- /dev/null +++ b/doc/api/client.rst @@ -0,0 +1,30 @@ +Creating a client +================= + +There are three ways to authenticate to the GitHub API. If you want to use your +username and API token, use:: + + >>> from github2.client import Github + >>> github = Github(username="ask", api_token=".......") + +If you authenticated to GitHub using their OAuth service, pass in the OAuth +access token:: + + >>> github = Github(access_token="........") + +Or for an unauthenticated connection:: + + >>> github = Github() + +The package supports caching of GitHub responses by adding a ``cache`` keyword +during setup:: + + >>> github = Github(username="ask", api_token=".......", cache="cache_dir") + +API calls are limited by github.com to 1 per second by default. To have the +Github client enforce this and avoid rate limit errors, pass requests_per_second +in:: + + >>> from github2.client import Github + >>> github = Github(username="ask", api_token=".......", + ... requests_per_second=1) diff --git a/doc/api/commit.rst b/doc/api/commit.rst new file mode 100644 index 0000000..fed7303 --- /dev/null +++ b/doc/api/commit.rst @@ -0,0 +1,20 @@ +Commit +====== + +Listing Commits on a Branch +---------------------------- + + >>> commits = github.commits.list("mojombo/grit", "master") + + +Listing Commits for a File +-------------------------- + + >>> commits = github.commits.list("mojombo/grit", "master", + ... file="grit.gemspec") + +Showing a Specific Commit +------------------------- + + >>> commit = github.commits.show("mojombo/grit", + ... sha="5071bf9fbfb81778c456d62e111440fdc776f76c") diff --git a/doc/api/index.rst b/doc/api/index.rst new file mode 100644 index 0000000..799553d --- /dev/null +++ b/doc/api/index.rst @@ -0,0 +1,13 @@ +API documentation +================= + +.. toctree:: + :maxdepth: 2 + + client + users + issues + network + repos + commit + object diff --git a/doc/api/issues.rst b/doc/api/issues.rst new file mode 100644 index 0000000..13a3e57 --- /dev/null +++ b/doc/api/issues.rst @@ -0,0 +1,63 @@ +Issues +====== + +List a Projects Issues +---------------------- + + >>> github.issues.list("ask/chishop", state="open") + >>> github.issues.list("ask/chishop", state="closed") + +Search a Projects Issues +------------------------ + + >>> issues = github.issues.search("ask/chishop", "version twice") + >>> issues[0].title + 'Upload hangs on attempted second file.' + + >>> github.issues.search("ask/chishop", term="authorization", + ... state="closed") + +View an Issue +------------- + + >>> issue = github.issues.show("ask/chishop", 1) + >>> issue.title + 'Should not be able to upload same version twice.' + +View Comments on an Issue +------------------------- + >>> comments = github.issues.comments("ask/chishop", 5) + >>> comments[0].body + 'Fix merged into /ask branch.' + +Open and Close Issues +--------------------- + + >>> new_issue = github.issues.open("ask/chishop", title="New bug", + ... body="This is a test bug") + >>> new_issue.number + 2 + + >>> github.issues.close("ask/chishop", new_issue.number) + >>> github.issues.reopen("ask/chishop", new_issue.number) + +List Labels +----------- + + >>> github.issues.list_labels("ask/chisop") + [u'TODO', u'ask'] + >>> github.issues.list_by_label("ask/chishop", "TODO") + [] + +Add and Remove Labels +--------------------- + + >>> github.issues.add_label("ask/chishop", 2, "important") + + >>> github.issues.remove_label("ask/chishop", 2, "important") + +Edit an Issue +------------- + + >>> github.issues.edit("ask/chishop", 3, title="New title", + ... body="New body") diff --git a/doc/api/network.rst b/doc/api/network.rst new file mode 100644 index 0000000..c7627e6 --- /dev/null +++ b/doc/api/network.rst @@ -0,0 +1,13 @@ +Network +======= + +Network Meta +------------- + + >>> github.get_network_meta("ask/chishop") + +Network Data +------------ + + >>> github.get_network_data("schacon/simplegit", + ... nethash="fa8fe264b926cdebaab36420b6501bd74402a6ff") diff --git a/doc/api/object.rst b/doc/api/object.rst new file mode 100644 index 0000000..43ffb65 --- /dev/null +++ b/doc/api/object.rst @@ -0,0 +1,17 @@ +Object +====== + +Trees +----- + + >>> tree = github.get_tree(project, tree_sha) + +Blobs +----- + + >>> blob = github.get_blob_info(project, tree_sha, path) + +All Blobs +--------- + + >>> blobs = github.get_all_blobs(project, tree_sha) diff --git a/doc/api/repos.rst b/doc/api/repos.rst new file mode 100644 index 0000000..de184d3 --- /dev/null +++ b/doc/api/repos.rst @@ -0,0 +1,86 @@ +Repository +========== + +Searching Repositories +---------------------- + + >>> repositories = github.repos.search("django") + + +Show Repo Info +-------------- + + >>> repo = github.repos.show("schacon/grit") + >>> repo.homepage + "http://grit.rubyforge.org/" + +List All Repositories +--------------------- + + # By default lists all repos for the current user. + >>> repos = github.repos.list() + + >>> repos = github.repos.list("schacon") + +Watching Repositories +--------------------- + + >>> github.repos.watch("schacon/grit") + + >>> github.repos.unwatch("schacon/grit") + +Forking Repositories +-------------------- + + >>> fork = github.repos.fork("schacon/grit") + +Creating and Deleting Repositories +---------------------------------- + + >>> new_repo = github.repos.create(name, description, homepage, + ... public=True) + + >>> github.repos.delete(name) + +Repository Visibility +--------------------- + + >>> github.repos.set_private("ask/chishop") + + >>> github.repos.set_public("ask/chishop") + +Pushable repositories +--------------------- + + >>> pushables = github.repos.pushable() + +Collaborators +------------- + + >>> collabs = github.repos.list_collaborators("ask/chishop") + + >>> github.repos.add_collaborator("ask/chishop", "schacon") + + >>> github.repos.remove_collaborator("ask/chishop", "schacon") + +Watchers +------------- + + >>> watchers = github.repos.watchers("ask/chishop") + + +Network +------- + + >>> github.repos.network("ask/chishop") + +Repository Refs +--------------- + + Get a list of tags + + >>> tags = github.repos.tags("ask/chishop") + + Get a list of remote branches + + >>> branches = github.repos.branches("ask/chishop") diff --git a/doc/api/users.rst b/doc/api/users.rst new file mode 100644 index 0000000..de1d16e --- /dev/null +++ b/doc/api/users.rst @@ -0,0 +1,38 @@ +Users +===== + +Searching +--------- + + >>> results = github.users.search("foo") + +Getting User Information +------------------------ + + >>> user = github.users.show("ask") + >>> user.name + "Ask Solem" + +Getting User Network +--------------------- + + >>> github.users.followers("ask") + ['greut', 'howiworkdaily', 'emanchado', 'webiest'] + + >>> github.users.following("ask") + ['sverrejoh', + 'greut', + 'jezdez', + 'bradleywright', + 'ericflo', + 'howiworkdaily', + 'emanchado', + 'traviscline', + 'russell'] + +Following Network +------------------ + + >>> github.users.follow("jezdez") + + >>> github.users.unfollow("jezdez") diff --git a/doc/index.rst b/doc/index.rst index f413657..4373eae 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,14 +3,29 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to python-github2's documentation! -========================================== +:mod:`python-github2` - Github API v2 library for Python +======================================================== -Contents: +This is an experimental python library implementing all of the features +available in version 2 of the `Github API`_. + +You should read the developer documentation for the `Github API`_ first. + +.. Note:: + This software is not finished. And is likely to change in the near future. + +.. _Github API: http://develop.github.com/ + +Contents +-------- .. toctree:: :maxdepth: 2 + install + api/index + license + Indices and tables ================== diff --git a/doc/install.rst b/doc/install.rst new file mode 100644 index 0000000..66f9a6b --- /dev/null +++ b/doc/install.rst @@ -0,0 +1,19 @@ +Installation +------------ + +You can install ``python-github2`` either via the Python Package Index (PyPI) or +from source. + +To install using ``pip``:: + + $ pip install github2 + +To install using ``easy_install``:: + + $ easy_install github2 + +If you have downloaded a source tarball you can install it by doing the +following:: + + $ python setup.py build + # python setup.py install # as root diff --git a/doc/license.rst b/doc/license.rst new file mode 100644 index 0000000..ce15689 --- /dev/null +++ b/doc/license.rst @@ -0,0 +1,6 @@ +License +======= + +This software is licensed under the ``New BSD License``. See the +:file:`LICENSE` file in the top distribution directory for the full license +text. From 2177f725d156ed461d50d2974c8d962d94816b5a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:24:33 +0100 Subject: [PATCH 095/454] Use version info from package. --- doc/conf.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 789c8d8..d210c25 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -16,7 +16,7 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.abspath('..')) # -- General configuration ----------------------------------------------------- @@ -47,10 +47,11 @@ # |version| and |release|, also used in various other places throughout the # built documents. # +import github2 # The short X.Y version. -version = '0.2' +version = ".".join(map(str, github2.VERSION[:2])) # The full version, including alpha/beta/rc tags. -release = '0.2.0' +release = github2.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. From 436d74f6d502daf0e8c1943d8e43c4bfcd608e58 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 21:02:32 +0100 Subject: [PATCH 096/454] Make start/end truly optional in get_network_data(). --- github2/client.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/github2/client.py b/github2/client.py index 4060dac..f44754f 100644 --- a/github2/client.py +++ b/github2/client.py @@ -63,9 +63,13 @@ def get_network_meta(self, project): "network_meta"]), {}) def get_network_data(self, project, nethash, start=None, end=None): + data = {"nethash": nethash} + if start: + data["start"] = start + if end: + data["end"] = end + return self.request.raw_request("/".join([self.request.github_url, project, "network_data_chunk"]), - {"nethash": nethash, - "start": start, - "end": end}) + data) From 0a8099ae00d3293761a8db28c5287cb01cd04ea9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 21:05:32 +0100 Subject: [PATCH 097/454] Removed unused URL_PREFIX. --- github2/request.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index f8592a1..2a2a6a2 100644 --- a/github2/request.py +++ b/github2/request.py @@ -10,8 +10,6 @@ GITHUB_URL = "https://github.com" -URL_PREFIX = "https://github.com/api/v2/json" - class GithubError(Exception): """An error occured when making a request to the Github API.""" From 767157dfd3d1df852e97797c69b85b9094cb2982 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:25:35 +0100 Subject: [PATCH 098/454] Added dependency information. --- doc/install.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/install.rst b/doc/install.rst index 66f9a6b..73d1dba 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -17,3 +17,11 @@ following:: $ python setup.py build # python setup.py install # as root + +``python-github2`` depends on httplib2_, an excellent package by Joe Gregorio +for handling HTTP sessions. simplejson_ is also required when using +``python-github2`` with Python 2.4 or 2.5. If you install via ``pip`` or +``easy_install`` the dependencies should be installed automatically for you. + +.. _httplib2: http://code.google.com/p/httplib2/ +.. _simplejson: http://pypi.python.org/pypi/simplejson/ From c463aa3f6e624ee5ac13d8c9b771e12dd1ddfc7c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:32:21 +0100 Subject: [PATCH 099/454] Reformat client.Github docstring for use in Sphinx. --- doc/api/client.rst | 6 ++++++ doc/conf.py | 2 ++ github2/client.py | 30 ++++++++++++------------------ 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 6d36915..361b3d8 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -1,6 +1,12 @@ Creating a client ================= +.. autoclass:: github2.client.Github + :members: + +Examples +-------- + There are three ways to authenticate to the GitHub API. If you want to use your username and API token, use:: diff --git a/doc/conf.py b/doc/conf.py index d210c25..7af07ba 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -215,3 +215,5 @@ ('index', 'python-github2', u'python-github2 Documentation', [u'Ask Solem'], 1) ] + +autoclass_content = "init" diff --git a/github2/client.py b/github2/client.py index 4060dac..6c31efe 100644 --- a/github2/client.py +++ b/github2/client.py @@ -12,26 +12,20 @@ def __init__(self, username=None, api_token=None, debug=False, """ An interface to GitHub's API: http://develop.github.com/ - - Params: - `username` is your own GitHub username. - - `api_token` can be found here (while logged in as that user): - https://github.com/account - - `access_token` can be used when no ``username`` and/or ``api_token`` - is used. The ``access_token`` is the OAuth access token that is - received after successful OAuth authentication. - - `requests_per_second` is a float indicating the API rate limit - you're operating under (1 per second per GitHub at the moment), - or None to disable delays. - The default is to disable delays (for backwards compatibility). - - `cache` is a directory for caching GitHub responses. + :param str username: your own GitHub username. + :param str api_token: can be found at https://github.com/account + (while logged in as that user): + :param str access_token: can be used when no ``username`` and/or + ``api_token`` is used. The ``access_token`` is the OAuth access + token that is received after successful OAuth authentication. + :param float requests_per_second: indicate the API rate limit you're + operating under (1 per second per GitHub at the moment), + or None to disable delays. The default is to disable delays (for + backwards compatibility). + :param str cache: a directory for caching GitHub responses. """ - + self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, debug=self.debug, From e684b78728999d6f2d818d02fa57302754449f5e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 16:55:14 +0100 Subject: [PATCH 100/454] Documented Github class' methods. --- github2/client.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/github2/client.py b/github2/client.py index 6c31efe..53ce37e 100644 --- a/github2/client.py +++ b/github2/client.py @@ -37,26 +37,58 @@ def __init__(self, username=None, api_token=None, debug=False, self.commits = Commits(self.request) def project_for_user_repo(self, user, repo): + """Return Github identifier for a user's repository + + :param str user: repository owner + :param str repo: repository name + """ return "/".join([user, repo]) - + def get_all_blobs(self, project, tree_sha): + """Get a list of all blobs for a specific tree + + :param str project: GitHub project + :param str tree_sha: object ID of tree + """ blobs = self.request.get("blob/all", project, tree_sha) return blobs.get("blobs") def get_blob_info(self, project, tree_sha, path): + """Get the blob for a file within a specific tree + + :param str project: GitHub project + :param str tree_sha: object ID of tree + :param str path: path within tree to fetch blob for + """ blob = self.request.get("blob/show", project, tree_sha, path) return blob.get("blob") def get_tree(self, project, tree_sha): + """Get tree information for a specifc tree + + :param str project: GitHub project + :param str tree_sha: object ID of tree + """ tree = self.request.get("tree/show", project, tree_sha) return tree.get("tree", []) def get_network_meta(self, project): + """Get Github metadata associated with a project + + :param str project: GitHub project + """ return self.request.raw_request("/".join([self.request.github_url, project, "network_meta"]), {}) def get_network_data(self, project, nethash, start=None, end=None): + """Get chunk of Github network data + + :param str project: GitHub project + :param str nethash: identifier provided by ``get_network_meta`` + :param int start: optional start point for data + :param int stop: optional end point for data + """ return self.request.raw_request("/".join([self.request.github_url, project, "network_data_chunk"]), From 6c5d6f9410e1b3125afdc506e08eeeebed8d297c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:32:48 +0100 Subject: [PATCH 101/454] Documented Commits class' methods. --- github2/commits.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/github2/commits.py b/github2/commits.py index f584c0a..97ec231 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -27,9 +27,20 @@ class Commits(GithubCommand): domain = "commits" def list(self, project, branch="master", file=None): + """List commits on a project + + :param str project: project name + :param str branch: branch name + :param str file: optional file filter + """ return self.get_values("list", project, branch, file, filter="commits", datatype=Commit) def show(self, project, sha): + """Get a specific commit + + :param str project: project name + :param str sha: commit id + """ return self.get_value("show", project, sha, filter="commit", datatype=Commit) From e9c0e9a99e8f1523933fa66e4f4b9aab36d60aae Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:35:26 +0100 Subject: [PATCH 102/454] Documented core.py functions. --- github2/core.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/github2/core.py b/github2/core.py index b7c0a1e..feb9747 100644 --- a/github2/core.py +++ b/github2/core.py @@ -7,21 +7,37 @@ def ghdate_to_datetime(github_date): + """Convert Github date string to Python datetime + + :param str github_date: date string to parse + """ date_without_tz = " ".join(github_date.strip().split()[:2]) return datetime.strptime(date_without_tz, GITHUB_DATE_FORMAT) def datetime_to_ghdate(datetime_): + """Convert Python datetime to Github date string + + :param str datetime_: datetime object to convert + """ date_without_tz = datetime_.strftime(GITHUB_DATE_FORMAT) return " ".join([date_without_tz, GITHUB_TIMEZONE]) def commitdate_to_datetime(commit_date): + """Convert commit date string to Python datetime + + :param str github_date: date string to parse + """ date_without_tz = commit_date[:-6] return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) def datetime_to_commitdate(datetime_): + """Convert Python datetime to Github date string + + :param str datetime_: datetime object to convert + """ date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) return "".join([date_without_tz, GITHUB_TIMEZONE]) @@ -67,6 +83,11 @@ def get_values(self, *args, **kwargs): def doc_generator(docstring, attributes): + """Utility function to augment BaseDataType docstring + + :param str docstring: docstring to augment + :param dict attributes: attributes to add to docstring + """ docstring = docstring or "" def section(title): From 06bb27d5057fdfcd97a1c52f923f39deabfbc8b8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:44:14 +0100 Subject: [PATCH 103/454] More documentation for Issues class' methods. --- github2/issues.py | 81 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index 538159d..bac5a19 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -40,84 +40,127 @@ class Issues(GithubCommand): def search(self, project, term, state="open"): """Get all issues for project that match term with given state. - ``project`` is a string with the project owner username and repository - name separated by ``/`` (e.g. ``ask/pygithub2``). - ``term`` is a string to search issues for. - ``state`` can be either ``open`` or ``closed``. + :param str project: GitHub project + :param str term: term to search issues for + :param str state: can be either ``open`` or ``closed``. """ return self.get_values("search", project, state, urllib.quote_plus(term), filter="issues", datatype=Issue) def list(self, project, state="open"): - """Get all issues for project' with state'. + """Get all issues for project with given state. - ``project`` is a string with the project owner username and repository - name separated by ``/`` (e.g. ``ask/pygithub2``). - ``state`` can be either ``open`` or ``closed``. + :param str project: GitHub project + :param str state: can be either ``open`` or ``closed``. """ return self.get_values("list", project, state, filter="issues", datatype=Issue) def list_by_label(self, project, label): - """Get all issues for project' with label'. + """Get all issues for project with label. - ``project`` is a string with the project owner username and repository - name separated by ``/`` (e.g. ``ask/pygithub2``). - ``label`` is a string representing a label (e.g., ``bug``). + :param str project: GitHub project + :param str label: a string representing a label (e.g., ``bug``). """ return self.get_values("list", project, "label", label, filter="issues", datatype=Issue) def list_labels(self, project): - """Get all labels for project'. + """Get all labels for project. - ``project`` is a string with the project owner username and repository - name separated by ``/`` (e.g. ``ask/pygithub2``). + :param str project: GitHub project """ return self.get_values("labels", project, filter="labels") def show(self, project, number): - """Get all the data for issue by issue-number.""" + """Get all the data for issue by issue-number. + + :param str project: GitHub project + :param int number: issue number in the Github database + """ return self.get_value("show", project, str(number), filter="issue", datatype=Issue) def open(self, project, title, body): - """Open up a new issue.""" + """Open up a new issue. + + :param str project: GitHub project + :param str title: title for issue + :param str body: body for issue + """ issue_data = {"title": title, "body": body} return self.get_value("open", project, post_data=issue_data, filter="issue", datatype=Issue) def close(self, project, number): + """Close an issue + + :param str project: GitHub project + :param int number: issue number in the Github database + """ return self.get_value("close", project, str(number), filter="issue", datatype=Issue, method="POST") def reopen(self, project, number): + """Reopen a closed issue + + :param str project: GitHub project + :param int number: issue number in the Github database + """ return self.get_value("reopen", project, str(number), filter="issue", datatype=Issue, method="POST") def edit(self, project, number, title, body): + """Edit an existing issue + + :param str project: GitHub project + :param int number: issue number in the Github database + :param str title: title for issue + :param str body: body for issue + """ issue_data = {"title": title, "body": body} return self.get_value("edit", project, str(number), post_data=issue_data, filter="issue", datatype=Issue) def add_label(self, project, number, label): + """Add a label to an issue + + :param str project: GitHub project + :param int number: issue number in the Github database + :param str label: label to attach to issue + """ return self.make_request("label/add", project, label, str(number), filter="labels", method="POST") def remove_label(self, project, number, label): + """Remove an existing label from an issue + + :param str project: GitHub project + :param int number: issue number in the Github database + :param str label: label to remove from issue + """ return self.make_request("label/remove", project, label, str(number), filter="labels", method="POST") def comment(self, project, number, comment): - """Comment on an issue.""" + """Comment on an issue. + + :param str project: GitHub project + :param int number: issue number in the Github database + :param str comment: comment to attach to issue + """ comment_data = {'comment': comment} return self.make_request("comment", project, str(number), post_data=comment_data, filter='comment') def comments(self, project, number): - """View comments on an issue.""" + """View comments on an issue. + + :param str project: GitHub project + :param int number: issue number in the Github database + """ return self.get_values("comments", project, str(number), filter="comments", datatype=Comment) From f8c454b6d8bb4312d5a5eddf5a05e7f77ea0f468 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:52:07 +0100 Subject: [PATCH 104/454] More documentation for Repositories class' methods. --- github2/repositories.py | 100 +++++++++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 12 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index 720e97a..6cc0a60 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -29,15 +29,21 @@ class Repositories(GithubCommand): domain = "repos" def search(self, query): + """Get all repositories that match term. + + :param str query: term to search issues for + """ return self.make_request("search", query, filter="repositories") def show(self, project): + """Get repository object for project. + + :param str project: GitHub project + """ return self.get_value("show", project, filter="repository", datatype=Repository) def pushable(self): - """ - Return a list of repos you can push to that are not your own. - """ + """Return a list of repos you can push to that are not your own.""" return self.get_values("pushable", filter="repositories", datatype=Repository) @@ -46,81 +52,151 @@ def list(self, for_user=None): If no user is given, repositoris for the currently logged in user are returned. + + :param str for_user: optional Github user name to list repositories for """ for_user = for_user or self.request.username return self.get_values("show", for_user, filter="repositories", datatype=Repository) def watch(self, project): + """Watch a project + + :param str project: GitHub project + """ return self.make_request("watch", project) def unwatch(self, project): + """Unwatch a project + + :param str project: GitHub project + """ return self.make_request("unwatch", project) def fork(self, project): + """Fork a project + + :param str project: GitHub project + """ return self.get_value("fork", project, filter="repository", datatype=Repository) def create(self, name, description=None, homepage=None, public=True): + """Create a repository + + :param str name: new project name + :param str description: optional project description + :param str homepage: optional project homepage + :param bool public: whether to make a public project + """ repo_data = {"name": name, "description": description, "homepage": homepage, "public": str(int(public))} return self.get_value("create", post_data=repo_data, filter="repository", datatype=Repository) def delete(self, name): + """Delete a repository + + :param str name: repository name to delete + """ return self.make_request("delete", name) def set_private(self, repo_name): + """Mark repository as private + + :param str repo_name: repository name to set as private + """ return self.make_request("set/private", repo_name) def set_public(self, repo_name): + """Mark repository as public + + :param str repo_name: repository name to set as public + """ return self.make_request("set/public", repo_name) def list_collaborators(self, project): - """Lists all the collaborators in a project (user/repro).""" + """Lists all the collaborators in a project + + :param str project: GitHub project + """ return self.make_request("show", project, "collaborators", filter="collaborators") def add_collaborator(self, repo_name, username): - """Adds an add_collaborator to a repro. + """Adds an add_collaborator to a repo + + Do not prefix repo_name with the user owning the repo like you do in + list_collaborators() - Do not prefix repro_name with the user owning the repro like you - do in list_collaborators()""" + :param str repo_name: repository name + :param str username: Github user to add as collaborator + """ return self.make_request("collaborators", repo_name, "add", username) def remove_collaborator(self, repo_name, username): - """Removes an add_collaborator from a repro. + """Removes an add_collaborator from a repo + + Do not prefix repo_name with the user owning the repo like you do in + list_collaborators() - Do not prefix repro_name with the user owning the repro like you - do in list_collaborators()""" + :param str repo_name: repository name + :param str username: Github user to add as collaborator + """ return self.make_request("collaborators", repo_name, "remove", username, method="POST") def network(self, project): + """Get network data for project + + :param str project: project name + """ return self.make_request("show", project, "network", filter="network") def languages(self, project): + """Get programming language data for project + + :param str project: project name + """ return self.make_request("show", project, "languages", filter="languages") def tags(self, project): + """Get tags for project + + :param str project: project name + """ return self.make_request("show", project, "tags", filter="tags") def branches(self, project): + """Get branch names for project + + :param str project: project name + """ return self.make_request("show", project, "branches", filter="branches") def watchers(self, project): + """Get list of watchers for project + + :param str project: project name + """ return self.make_request("show", project, "watchers", filter="watchers") def watching(self, for_user=None): - """Lists all the repos a user is watching.""" + """Lists all the repos a user is watching + + :param str for_user: optional Github user name to list repositories for + """ for_user = for_user or self.request.username return self.get_values("watched", for_user, filter="repositories", datatype=Repository) def list_contributors(self, project): - """Lists all the contributors in a project (user/repo).""" + """Lists all the contributors in a project + + :param str project: project name + """ return self.make_request("show", project, "contributors", filter="contributors") From ef6d850592e69a0bd10cde1ba94c515fa0b0b4b3 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:52:58 +0100 Subject: [PATCH 105/454] More documentation for requests module. --- github2/request.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index f8592a1..4a7afcc 100644 --- a/github2/request.py +++ b/github2/request.py @@ -8,6 +8,8 @@ import simplejson from urllib import urlencode, quote + +#: Hostname for API access GITHUB_URL = "https://github.com" URL_PREFIX = "https://github.com/api/v2/json" @@ -27,8 +29,9 @@ class GithubRequest(object): def __init__(self, username=None, api_token=None, url_prefix=None, debug=False, requests_per_second=None, access_token=None, cache=None): - """ - Make an API request. + """Make an API request. + + :see: :py:class:`github2.client.Github` """ self.username = username self.api_token = api_token From 8127b74df132ec30e93cdfb63116a9b77841da3f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:56:15 +0100 Subject: [PATCH 106/454] Documentation for Users class' methods. --- github2/users.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/github2/users.py b/github2/users.py index 4bf14de..4251cb3 100644 --- a/github2/users.py +++ b/github2/users.py @@ -25,6 +25,9 @@ class User(BaseData): plan = Attribute("Current active github plan") def is_authenticated(self): + """Test for user auththenication + + :return bool: ``True`` if user is authenticated""" return self.plan is not None def __repr__(self): @@ -35,23 +38,51 @@ class Users(GithubCommand): domain = "user" def search(self, query): + """Search for users + + :param str query: term to search for + """ return self.get_values("search", urllib.quote_plus(query), filter="users", datatype=User) def search_by_email(self, query): + """Search for users by email address + + :param str query: email to search for + """ return self.get_value("email", query, filter="user", datatype=User) def show(self, username): + """Get information on Github user + + :param str username: Github user name + """ return self.get_value("show", username, filter="user", datatype=User) def followers(self, username): + """Get list of Github user's followers + + :param str username: Github user name + """ return self.make_request("show", username, "followers", filter="users") def following(self, username): + """Get list of users a Github user is following + + :param str username: Github user name + """ return self.make_request("show", username, "following", filter="users") def follow(self, other_user): + """Follow a Github user + + :param str other_user: Github user name + """ return self.make_request("follow", other_user) def unfollow(self, other_user): + """Unfollow a Github user + + :param str other_user: Github user name + """ return self.make_request("unfollow", other_user) From f741be6531d26cafbfd81539ecf9be7b5eaf58cf Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Apr 2011 20:58:46 +0100 Subject: [PATCH 107/454] Converted doc_generator to create Sphinx-compatible attribute documentation. --- github2/core.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/github2/core.py b/github2/core.py index feb9747..caf20a9 100644 --- a/github2/core.py +++ b/github2/core.py @@ -90,16 +90,12 @@ def doc_generator(docstring, attributes): """ docstring = docstring or "" - def section(title): - return "\n".join([title, "-" * len(title)]) - def bullet(title, text): - return """ *``%s``*\n %s\n""" % (title, text) + return """.. py:attribute:: %s\n\n %s\n""" % (title, text) - a = section("Attributes") b = "\n".join([bullet(attr_name, attr.help) - for attr_name, attr in attributes.items()]) - return "\n".join([docstring, a, b]) + for attr_name, attr in attributes.items()]) + return "\n\n".join([docstring, b]) class Attribute(object): From a5a3be37f529a6d3a6f1c0e07ff0666b88a16dd0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 10:57:43 +0100 Subject: [PATCH 108/454] Show object related methods in object.rst. --- doc/api/client.rst | 1 + doc/api/object.rst | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 361b3d8..6b27cc3 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -3,6 +3,7 @@ Creating a client .. autoclass:: github2.client.Github :members: + :exclude-members: get_all_blobs, get_blob_info, get_tree Examples -------- diff --git a/doc/api/object.rst b/doc/api/object.rst index 43ffb65..326c78a 100644 --- a/doc/api/object.rst +++ b/doc/api/object.rst @@ -1,17 +1,28 @@ Object ====== +.. py:currentmodule:: github2.client + +.. automethod:: Github.get_all_blobs + +.. automethod:: Github.get_blob_info + +.. automethod:: Github.get_tree + +Examples +-------- + Trees ------ +''''' >>> tree = github.get_tree(project, tree_sha) Blobs ------ +''''' >>> blob = github.get_blob_info(project, tree_sha, path) All Blobs ---------- +''''''''' >>> blobs = github.get_all_blobs(project, tree_sha) From 8d0812f44f8a7e05bb3a7cabbedb657a16e0f976 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 10:58:07 +0100 Subject: [PATCH 109/454] Show network data related methods in network.rst. --- doc/api/client.rst | 3 ++- doc/api/network.rst | 13 +++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 6b27cc3..4dcf040 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -3,7 +3,8 @@ Creating a client .. autoclass:: github2.client.Github :members: - :exclude-members: get_all_blobs, get_blob_info, get_tree + :exclude-members: + get_network_meta, get_network_data, get_all_blobs, get_blob_info, get_tree Examples -------- diff --git a/doc/api/network.rst b/doc/api/network.rst index c7627e6..8ba715c 100644 --- a/doc/api/network.rst +++ b/doc/api/network.rst @@ -1,13 +1,22 @@ Network ======= +.. py:currentmodule:: github2.client + +.. automethod:: Github.get_network_meta + +.. automethod:: Github.get_network_data + +Examples +-------- + Network Meta -------------- +'''''''''''' >>> github.get_network_meta("ask/chishop") Network Data ------------- +'''''''''''' >>> github.get_network_data("schacon/simplegit", ... nethash="fa8fe264b926cdebaab36420b6501bd74402a6ff") From 6b2a04ef33f9da800946c3763ba0eabcba74ba71 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:01:17 +0100 Subject: [PATCH 110/454] Include Sphinx autodoc output in docs. --- doc/api/commit.rst | 17 ++++++++++++++--- doc/api/issues.rst | 31 +++++++++++++++++++++++-------- doc/api/repos.rst | 35 +++++++++++++++++++++++------------ doc/api/users.rst | 19 +++++++++++++++---- 4 files changed, 75 insertions(+), 27 deletions(-) diff --git a/doc/api/commit.rst b/doc/api/commit.rst index fed7303..cf10a36 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -1,20 +1,31 @@ Commit ====== +.. py:currentmodule:: github2.commits + +.. autoclass:: Commit(type) + :members: + +.. autoclass:: Commits(type) + :members: + +Examples +-------- + Listing Commits on a Branch ----------------------------- +''''''''''''''''''''''''''' >>> commits = github.commits.list("mojombo/grit", "master") Listing Commits for a File --------------------------- +'''''''''''''''''''''''''' >>> commits = github.commits.list("mojombo/grit", "master", ... file="grit.gemspec") Showing a Specific Commit -------------------------- +''''''''''''''''''''''''' >>> commit = github.commits.show("mojombo/grit", ... sha="5071bf9fbfb81778c456d62e111440fdc776f76c") diff --git a/doc/api/issues.rst b/doc/api/issues.rst index 13a3e57..e1b1819 100644 --- a/doc/api/issues.rst +++ b/doc/api/issues.rst @@ -1,14 +1,28 @@ Issues ====== +.. py:currentmodule:: github2.issues + +.. autoclass:: Issue(type) + :members: + +.. autoclass:: Comment(type) + :members: + +.. autoclass:: Issues(type) + :members: + +Examples +-------- + List a Projects Issues ----------------------- +'''''''''''''''''''''' >>> github.issues.list("ask/chishop", state="open") >>> github.issues.list("ask/chishop", state="closed") Search a Projects Issues ------------------------- +'''''''''''''''''''''''' >>> issues = github.issues.search("ask/chishop", "version twice") >>> issues[0].title @@ -18,20 +32,21 @@ Search a Projects Issues ... state="closed") View an Issue -------------- +''''''''''''' >>> issue = github.issues.show("ask/chishop", 1) >>> issue.title 'Should not be able to upload same version twice.' View Comments on an Issue -------------------------- +''''''''''''''''''''''''' + >>> comments = github.issues.comments("ask/chishop", 5) >>> comments[0].body 'Fix merged into /ask branch.' Open and Close Issues ---------------------- +''''''''''''''''''''' >>> new_issue = github.issues.open("ask/chishop", title="New bug", ... body="This is a test bug") @@ -42,7 +57,7 @@ Open and Close Issues >>> github.issues.reopen("ask/chishop", new_issue.number) List Labels ------------ +''''''''''' >>> github.issues.list_labels("ask/chisop") [u'TODO', u'ask'] @@ -50,14 +65,14 @@ List Labels [] Add and Remove Labels ---------------------- +''''''''''''''''''''' >>> github.issues.add_label("ask/chishop", 2, "important") >>> github.issues.remove_label("ask/chishop", 2, "important") Edit an Issue -------------- +''''''''''''' >>> github.issues.edit("ask/chishop", 3, title="New title", ... body="New body") diff --git a/doc/api/repos.rst b/doc/api/repos.rst index de184d3..58874d0 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -1,21 +1,32 @@ Repository ========== +.. py:currentmodule:: github2.repositories + +.. autoclass:: Repository(type) + :members: + +.. autoclass:: Repositories(type) + :members: + +Examples +-------- + Searching Repositories ----------------------- +'''''''''''''''''''''' >>> repositories = github.repos.search("django") Show Repo Info --------------- +'''''''''''''' >>> repo = github.repos.show("schacon/grit") >>> repo.homepage "http://grit.rubyforge.org/" List All Repositories ---------------------- +''''''''''''''''''''' # By default lists all repos for the current user. >>> repos = github.repos.list() @@ -23,19 +34,19 @@ List All Repositories >>> repos = github.repos.list("schacon") Watching Repositories ---------------------- +''''''''''''''''''''' >>> github.repos.watch("schacon/grit") >>> github.repos.unwatch("schacon/grit") Forking Repositories --------------------- +'''''''''''''''''''' >>> fork = github.repos.fork("schacon/grit") Creating and Deleting Repositories ----------------------------------- +'''''''''''''''''''''''''''''''''' >>> new_repo = github.repos.create(name, description, homepage, ... public=True) @@ -43,19 +54,19 @@ Creating and Deleting Repositories >>> github.repos.delete(name) Repository Visibility ---------------------- +''''''''''''''''''''' >>> github.repos.set_private("ask/chishop") >>> github.repos.set_public("ask/chishop") Pushable repositories ---------------------- +''''''''''''''''''''' >>> pushables = github.repos.pushable() Collaborators -------------- +''''''''''''' >>> collabs = github.repos.list_collaborators("ask/chishop") @@ -64,18 +75,18 @@ Collaborators >>> github.repos.remove_collaborator("ask/chishop", "schacon") Watchers -------------- +'''''''' >>> watchers = github.repos.watchers("ask/chishop") Network -------- +''''''' >>> github.repos.network("ask/chishop") Repository Refs ---------------- +''''''''''''''' Get a list of tags diff --git a/doc/api/users.rst b/doc/api/users.rst index de1d16e..182864c 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -1,20 +1,31 @@ Users ===== +.. py:currentmodule:: github2.users + +.. autoclass:: User(type) + :members: + +.. autoclass:: Users(type) + :members: + +Examples +-------- + Searching ---------- +''''''''' >>> results = github.users.search("foo") Getting User Information ------------------------- +'''''''''''''''''''''''' >>> user = github.users.show("ask") >>> user.name "Ask Solem" Getting User Network ---------------------- +'''''''''''''''''''' >>> github.users.followers("ask") ['greut', 'howiworkdaily', 'emanchado', 'webiest'] @@ -31,7 +42,7 @@ Getting User Network 'russell'] Following Network ------------------- +''''''''''''''''' >>> github.users.follow("jezdez") From 1d80daf8a478ef1adc5de16f6f141e3514a96f42 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:01:36 +0100 Subject: [PATCH 111/454] Fixed reST formatting in repos.rst. --- doc/api/repos.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 58874d0..8fe85ee 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -88,10 +88,10 @@ Network Repository Refs ''''''''''''''' - Get a list of tags +Get a list of tags >>> tags = github.repos.tags("ask/chishop") - Get a list of remote branches +Get a list of remote branches >>> branches = github.repos.branches("ask/chishop") From 0935fe391299a51d8be081f98e4883245d682b97 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:02:12 +0100 Subject: [PATCH 112/454] Added user-only install example. --- doc/install.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/install.rst b/doc/install.rst index 73d1dba..cc7f10a 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -16,7 +16,8 @@ If you have downloaded a source tarball you can install it by doing the following:: $ python setup.py build - # python setup.py install # as root + $ python setup.py install --user # to install for a single user + # python setup.py install # to install in Python's site-packages ``python-github2`` depends on httplib2_, an excellent package by Joe Gregorio for handling HTTP sessions. simplejson_ is also required when using From 64c1108a3501fbe2b1f9396b47ffd0469c5d672d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:02:32 +0100 Subject: [PATCH 113/454] Include license text in license.rst. --- doc/license.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/license.rst b/doc/license.rst index ce15689..7e1c1b4 100644 --- a/doc/license.rst +++ b/doc/license.rst @@ -1,6 +1,7 @@ License ======= -This software is licensed under the ``New BSD License``. See the -:file:`LICENSE` file in the top distribution directory for the full license -text. +This software is licensed under the ``New BSD License``. The full license text +follows: + +.. literalinclude:: ../LICENSE From f62f6192e0185bb64db600378918f85b024c785e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:03:30 +0100 Subject: [PATCH 114/454] Document autodoc members by default. --- doc/api/client.rst | 1 - doc/api/commit.rst | 2 -- doc/api/issues.rst | 3 --- doc/api/repos.rst | 2 -- doc/api/users.rst | 2 -- doc/conf.py | 1 + 6 files changed, 1 insertion(+), 10 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 4dcf040..75ff17e 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -2,7 +2,6 @@ Creating a client ================= .. autoclass:: github2.client.Github - :members: :exclude-members: get_network_meta, get_network_data, get_all_blobs, get_blob_info, get_tree diff --git a/doc/api/commit.rst b/doc/api/commit.rst index cf10a36..f9730eb 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -4,10 +4,8 @@ Commit .. py:currentmodule:: github2.commits .. autoclass:: Commit(type) - :members: .. autoclass:: Commits(type) - :members: Examples -------- diff --git a/doc/api/issues.rst b/doc/api/issues.rst index e1b1819..b31544b 100644 --- a/doc/api/issues.rst +++ b/doc/api/issues.rst @@ -4,13 +4,10 @@ Issues .. py:currentmodule:: github2.issues .. autoclass:: Issue(type) - :members: .. autoclass:: Comment(type) - :members: .. autoclass:: Issues(type) - :members: Examples -------- diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 8fe85ee..4a58b2b 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -4,10 +4,8 @@ Repository .. py:currentmodule:: github2.repositories .. autoclass:: Repository(type) - :members: .. autoclass:: Repositories(type) - :members: Examples -------- diff --git a/doc/api/users.rst b/doc/api/users.rst index 182864c..b24c334 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -4,10 +4,8 @@ Users .. py:currentmodule:: github2.users .. autoclass:: User(type) - :members: .. autoclass:: Users(type) - :members: Examples -------- diff --git a/doc/conf.py b/doc/conf.py index 7af07ba..5df798c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -217,3 +217,4 @@ ] autoclass_content = "init" +autodoc_default_flags = ['members', ] From 63e69c707fef87189988138c9e1a06612e86d0fc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:06:31 +0100 Subject: [PATCH 115/454] Added 'internal' docs for core/request modules. --- doc/api/core.rst | 25 +++++++++++++++++++++++++ doc/api/index.rst | 9 +++++++++ doc/api/request.rst | 16 ++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 doc/api/core.rst create mode 100644 doc/api/request.rst diff --git a/doc/api/core.rst b/doc/api/core.rst new file mode 100644 index 0000000..d9ce114 --- /dev/null +++ b/doc/api/core.rst @@ -0,0 +1,25 @@ +Core +==== + +.. py:currentmodule:: github2.core + +.. note:: + This module contains functionality that isn't useful to general users + of the ``python-github2`` package, but it is documented to aid contributors + to the package. + +.. autofunction:: ghdate_to_datetime +.. autofunction:: datetime_to_ghdate + +.. autofunction:: commitdate_to_datetime +.. autofunction:: datetime_to_commitdate + +.. autofunction:: doc_generator + +.. autoclass:: GithubCommand + +.. autoclass:: Attribute + +.. autoclass:: DateAttribute + +.. autoclass:: BaseDataType diff --git a/doc/api/index.rst b/doc/api/index.rst index 799553d..b83d09a 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -11,3 +11,12 @@ API documentation repos commit object + +Additionally the following documentation may be useful to ``python-github2`` +contributors: + +.. toctree:: + :maxdepth: 2 + + core + request diff --git a/doc/api/request.rst b/doc/api/request.rst new file mode 100644 index 0000000..37d3c46 --- /dev/null +++ b/doc/api/request.rst @@ -0,0 +1,16 @@ +Requests +======== + +.. py:currentmodule:: github2.request + +.. note:: + This module contains functionality that isn't useful to general users + of the ``python-github2`` package, but it is documented to aid contributors + to the package. + +.. autodata:: GITHUB_URL + +.. autoexception:: GithubError + +.. autoclass:: GithubRequest + :exclude-members: GithubError From 9507cdaf1662ddeb7369d8fd0cba969d89d1e0d2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:17:33 +0100 Subject: [PATCH 116/454] Added simple quickstart document. --- doc/conf.py | 4 +++- doc/index.rst | 2 +- doc/quickstart.rst | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 doc/quickstart.rst diff --git a/doc/conf.py b/doc/conf.py index 5df798c..8ccf588 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,7 +25,7 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.intersphinx'] # Add any paths that contain templates here, relative to this directory. templates_path = ['.templates'] @@ -218,3 +218,5 @@ autoclass_content = "init" autodoc_default_flags = ['members', ] + +intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/doc/index.rst b/doc/index.rst index 4373eae..ce85b08 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -23,6 +23,7 @@ Contents :maxdepth: 2 install + quickstart api/index license @@ -32,4 +33,3 @@ Indices and tables * :ref:`genindex` * :ref:`modindex` * :ref:`search` - diff --git a/doc/quickstart.rst b/doc/quickstart.rst new file mode 100644 index 0000000..d1a8253 --- /dev/null +++ b/doc/quickstart.rst @@ -0,0 +1,34 @@ +Quickstart +========== + +Once ``python-github2`` is installed we can open an interactive Python session, +and perform some basic tasks to familiarise ourselves with the package. + +Create an unauthenticated client object:: + + >>> github = Github() + +.. note:: + Creating an unauthenticated client object means we can play with the API + without fear of creating or deleting data on our account. + +See how many followers the ``python-github2`` project has:: + + >>> len(github.repos.watchers("ask/python-github2")) + 129 + +Read the description of the ``python-github2`` project:: + + >>> repo = github.repos.show("ask/python-github2") + >>> repo.description + +We can take advantage of Python's :py:func:`dir` to explore the package a +little more:: + + >>> filter(lambda s: not s.startswith("_"), dir(github.users)) + ['domain', 'follow', 'followers', 'following', 'get_value', 'get_values', + 'make_request', 'request', 'search', 'search_by_email', 'show', + 'unfollow'] + +For more information on specific functionality see the :doc:`api/index`, and the +copious examples contained within. From 0e0cfd71728cb1645e2b1cd3fc8ba5a9a02ab39a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:19:03 +0100 Subject: [PATCH 117/454] Nicer, imo, Sphinx default theme layout. --- doc/conf.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 8ccf588..c281ea1 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -97,7 +97,11 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +html_theme_options = { + "rightsidebar": True, + "stickysidebar": True, + "externalrefs": True, +} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] From 114f2e26198b449e564a5cdc0f9872d6af26f3f1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:26:55 +0100 Subject: [PATCH 118/454] Ignore Sphinx build directory. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0c03957..2c627c6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ local_settings.py .*.sw[po] dist/ *.egg-info -doc/__build/* +doc/.build/ build/ locale/ pip-log.txt From c2104b52784e244c09f98aa7ade301209b879dfd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:31:06 +0100 Subject: [PATCH 119/454] Link to usage docs in README, and remove duplicated content. --- README.rst | 305 +---------------------------------------------------- 1 file changed, 2 insertions(+), 303 deletions(-) diff --git a/README.rst b/README.rst index 17030d1..247a336 100644 --- a/README.rst +++ b/README.rst @@ -12,310 +12,9 @@ available in version 2 of the `Github API`_. *Note* This software is not finished. And is likely to change in the near future. -.. _`Github API`: http://develop.github.com/ - -Introduction -============ - -You should read the developer documentation for the `Github API`_ first. - -Installation ------------- - -You can install ``python-github2`` either via the Python Package Index (PyPI) -or from source. - -To install using ``pip``:: - - $ pip install github2 - -To install using ``easy_install``:: - - $ easy_install github2 - -If you have downloaded a source tarball you can install it -by doing the following:: - - $ python setup.py build - # python setup.py install # as root - -Creating a client ------------------- - -There are three ways to authenticate to the GitHub API. If you want to use your -username and API token, use:: - - >>> from github2.client import Github - >>> github = Github(username="ask", api_token=".......") - -If you authenticated to GitHub using their OAuth service, pass in the OAuth -access token:: - - >>> github = Github(access_token="........") - -Or for an unauthenticated connection:: - - >>> github = Github() - -The package supports caching of GitHub responses by adding a ``cache`` keyword -during setup:: - - >>> github = Github(username="ask", api_token=".......", cache="cache_dir") - -API calls are limited by github.com to 1 per second by default. To have the -Github client enforce this and avoid rate limit errors, pass requests_per_second -in:: - - >>> from github2.client import Github - >>> github = Github(username="ask", api_token=".......", - ... requests_per_second=1) - -Users -===== - -Searching ---------- - - >>> results = github.users.search("foo") - -Getting User Information ------------------------- - - >>> user = github.users.show("ask") - >>> user.name - "Ask Solem" - -Getting User Network ---------------------- - - >>> github.users.followers("ask") - ['greut', 'howiworkdaily', 'emanchado', 'webiest'] - - >>> github.users.following("ask") - ['sverrejoh', - 'greut', - 'jezdez', - 'bradleywright', - 'ericflo', - 'howiworkdaily', - 'emanchado', - 'traviscline', - 'russell'] - -Following Network ------------------- - - >>> github.users.follow("jezdez") - - >>> github.users.unfollow("jezdez") - -Issues -====== - -List a Projects Issues ----------------------- - - >>> github.issues.list("ask/chishop", state="open") - >>> github.issues.list("ask/chishop", state="closed") - -Search a Projects Issues ------------------------- - - >>> issues = github.issues.search("ask/chishop", "version twice") - >>> issues[0].title - 'Upload hangs on attempted second file.' - - >>> github.issues.search("ask/chishop", term="authorization", - ... state="closed") - -View an Issue -------------- - - >>> issue = github.issues.show("ask/chishop", 1) - >>> issue.title - 'Should not be able to upload same version twice.' - -View Comments on an Issue -------------------------- - >>> comments = github.issues.comments("ask/chishop", 5) - >>> comments[0].body - 'Fix merged into /ask branch.' - -Open and Close Issues ---------------------- - - >>> new_issue = github.issues.open("ask/chishop", title="New bug", - ... body="This is a test bug") - >>> new_issue.number - 2 - - >>> github.issues.close("ask/chishop", new_issue.number) - >>> github.issues.reopen("ask/chishop", new_issue.number) - -List Labels ------------ - - >>> github.issues.list_labels("ask/chisop") - [u'TODO', u'ask'] - >>> github.issues.list_by_label("ask/chishop", "TODO") - [] - -Add and Remove Labels ---------------------- - - >>> github.issues.add_label("ask/chishop", 2, "important") - - >>> github.issues.remove_label("ask/chishop", 2, "important") - -Edit an Issue -------------- - - >>> github.issues.edit("ask/chishop", 3, title="New title", - ... body="New body") - -Network -======= - -Network Meta -------------- - - >>> github.get_network_meta("ask/chishop") - -Network Data ------------- - - >>> github.get_network_data("schacon/simplegit", - ... nethash="fa8fe264b926cdebaab36420b6501bd74402a6ff") - - -Repository -========== - -Searching Repositories ----------------------- - - >>> repositories = github.repos.search("django") - - -Show Repo Info --------------- - - >>> repo = github.repos.show("schacon/grit") - >>> repo.homepage - "http://grit.rubyforge.org/" - -List All Repositories ---------------------- - - # By default lists all repos for the current user. - >>> repos = github.repos.list() - - >>> repos = github.repos.list("schacon") - -Watching Repositories ---------------------- - - >>> github.repos.watch("schacon/grit") - - >>> github.repos.unwatch("schacon/grit") - -Forking Repositories --------------------- - - >>> fork = github.repos.fork("schacon/grit") - -Creating and Deleting Repositories ----------------------------------- - - >>> new_repo = github.repos.create(name, description, homepage, - ... public=True) - - >>> github.repos.delete(name) - -Repository Visibility ---------------------- - - >>> github.repos.set_private("ask/chishop") - - >>> github.repos.set_public("ask/chishop") - -Pushable repositories ---------------------- - - >>> pushables = github.repos.pushable() - -Collaborators -------------- - - >>> collabs = github.repos.list_collaborators("ask/chishop") - - >>> github.repos.add_collaborator("ask/chishop", "schacon") - - >>> github.repos.remove_collaborator("ask/chishop", "schacon") - -Watchers -------------- - - >>> watchers = github.repos.watchers("ask/chishop") - - -Network -------- - - >>> github.repos.network("ask/chishop") - -Repository Refs ---------------- - - Get a list of tags - - >>> tags = github.repos.tags("ask/chishop") - - Get a list of remote branches - - >>> branches = github.repos.branches("ask/chishop") - - -Commit -====== - -Listing Commits on a Branch ----------------------------- - - >>> commits = github.commits.list("mojombo/grit", "master") - - -Listing Commits for a File --------------------------- - - >>> commits = github.commits.list("mojombo/grit", "master", - ... file="grit.gemspec") - -Showing a Specific Commit -------------------------- - - >>> commit = github.commits.show("mojombo/grit", - ... sha="5071bf9fbfb81778c456d62e111440fdc776f76c") - - -Object -====== - -Trees ------ - - >>> tree = github.get_tree(project, tree_sha) - -Blobs ------ - - >>> blob = github.get_blob_info(project, tree_sha, path) - -All Blobs ---------- - - >>> blobs = github.get_all_blobs(project, tree_sha) +See the ``doc/`` directory for installation instructions and usage information. +.. _Github API: http://develop.github.com/ License ======= From d7e25228f9cda1fb8751b679508a7b4214711a7a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Apr 2011 11:35:08 +0100 Subject: [PATCH 120/454] Fix pre element rendering on narrow screens. --- doc/.templates/layout.html | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 doc/.templates/layout.html diff --git a/doc/.templates/layout.html b/doc/.templates/layout.html new file mode 100644 index 0000000..3560b06 --- /dev/null +++ b/doc/.templates/layout.html @@ -0,0 +1,11 @@ +{% extends "!layout.html" %} + +{% block extrahead %} + +{% endblock %} From 52177e325c9958c6240b85700db62b7f4d6f27cb Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 19:57:49 +0100 Subject: [PATCH 121/454] Fixed repository deletion. Thanks to Sam Alexander for reporting. Fixes #30. --- github2/repositories.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/github2/repositories.py b/github2/repositories.py index 720e97a..24e9651 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -68,7 +68,10 @@ def create(self, name, description=None, homepage=None, public=True): filter="repository", datatype=Repository) def delete(self, name): - return self.make_request("delete", name) + # Two-step delete mechanism. We must echo the delete_token value back + # to GitHub to actually delete a repository + result = self.make_request("delete", name, method="POST") + self.make_request("delete", name, post_data=result) def set_private(self, repo_name): return self.make_request("set/private", repo_name) From 5eed63a476796bc4edbdb76b2b2a03040ddc46dd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 20:05:00 +0100 Subject: [PATCH 122/454] Use project, ie user/repo, as arg for Repository methods. Official API docs list the old name only repo methods as deprecated, this cosmetic change just makes introspection yield better results. --- github2/repositories.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index 720e97a..55504d5 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -61,39 +61,33 @@ def fork(self, project): return self.get_value("fork", project, filter="repository", datatype=Repository) - def create(self, name, description=None, homepage=None, public=True): - repo_data = {"name": name, "description": description, + def create(self, project, description=None, homepage=None, public=True): + repo_data = {"name": project, "description": description, "homepage": homepage, "public": str(int(public))} return self.get_value("create", post_data=repo_data, filter="repository", datatype=Repository) - def delete(self, name): - return self.make_request("delete", name) + def delete(self, project): + return self.make_request("delete", project) - def set_private(self, repo_name): - return self.make_request("set/private", repo_name) + def set_private(self, project): + return self.make_request("set/private", project) - def set_public(self, repo_name): - return self.make_request("set/public", repo_name) + def set_public(self, project): + return self.make_request("set/public", project) def list_collaborators(self, project): """Lists all the collaborators in a project (user/repro).""" return self.make_request("show", project, "collaborators", filter="collaborators") - def add_collaborator(self, repo_name, username): - """Adds an add_collaborator to a repro. + def add_collaborator(self, project, username): + """Adds an add_collaborator to a repo.""" + return self.make_request("collaborators", project, "add", username) - Do not prefix repro_name with the user owning the repro like you - do in list_collaborators()""" - return self.make_request("collaborators", repo_name, "add", username) - - def remove_collaborator(self, repo_name, username): - """Removes an add_collaborator from a repro. - - Do not prefix repro_name with the user owning the repro like you - do in list_collaborators()""" - return self.make_request("collaborators", repo_name, "remove", + def remove_collaborator(self, project, username): + """Removes an add_collaborator from a repo.""" + return self.make_request("collaborators", project, "remove", username, method="POST") def network(self, project): From 7c7ac06fe7d31c153b6081bc31ea8a1dc840c48f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 20:19:28 +0100 Subject: [PATCH 123/454] Added tox config. --- .gitignore | 1 + tox.ini | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 tox.ini diff --git a/.gitignore b/.gitignore index 0c03957..d1f14ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store .noseids .ropeproject/ +.tox/ *.pyc *~ *.sqlite diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..ede2ec2 --- /dev/null +++ b/tox.ini @@ -0,0 +1,14 @@ +[tox] +envlist = py24, py25, py26, py27, rst + +[testenv] +deps = + nose +commands = + nosetests tests +[testenv:rst] +deps = + docutils +commands = + mkdir -p {envtmpdir} + rst2html.py --strict README.rst {envtmpdir}/README.html From 82b46d61c33a964ec5dd444d9fe7cc5b5fc65dc0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 20:29:31 +0100 Subject: [PATCH 124/454] Test Sphinx generation in tox runs. Signed-off-by: James Rowe --- tox.ini | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index ede2ec2..318809a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py24, py25, py26, py27, rst +envlist = py24, py25, py26, py27, rst, sphinx [testenv] deps = @@ -12,3 +12,9 @@ deps = commands = mkdir -p {envtmpdir} rst2html.py --strict README.rst {envtmpdir}/README.html +[testenv:sphinx] +deps = + sphinx +commands = + # Test HTML output + sphinx-build -W -b html -d {envtmpdir}/doctrees doc {envtmpdir}/html From d1d7f5aa502f1c34178d2b8bddfd273735db65d1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 20:45:30 +0100 Subject: [PATCH 125/454] Include docs in sdist. --- MANIFEST.in | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 919d0d2..fd4aca1 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -2,3 +2,9 @@ recursive-include examples * include README.rst include AUTHORS include LICENSE + +recursive-include doc *.rst +include doc/conf.py +include doc/Makefile +include doc/.templates/layout.html +prune doc/.build/ From 573da9892ddbe85272b7367bf2936d1a3d5d3868 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 20:56:18 +0100 Subject: [PATCH 126/454] Bumped version to 0.3.0. --- MANIFEST.in | 1 + NEWS.rst | 26 ++++++++++++++++++++++++++ README.rst | 2 +- github2/__init__.py | 2 +- tox.ini | 1 + 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 NEWS.rst diff --git a/MANIFEST.in b/MANIFEST.in index fd4aca1..77d8418 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,5 @@ recursive-include examples * +include NEWS.rst include README.rst include AUTHORS include LICENSE diff --git a/NEWS.rst b/NEWS.rst new file mode 100644 index 0000000..12b4aaf --- /dev/null +++ b/NEWS.rst @@ -0,0 +1,26 @@ +User-visible changes +==================== + +.. contents:: + +0.3.0 - 2011-04-13 +------------------ + +* Caching support, see the ``cache`` keyword of ``github.client.Github`` +* OAuth2_ authentication support +* Additional ``issues`` support: + + + Searching issues with ``issues.search`` + + List issues by label with ``issues.list_by_label`` + + List all project labels with ``issues.list_labels`` + + Edit an existing issue with ``issues.edit`` + + Reopen closed issues with ``issues.reopen`` + +* Additional ``repos`` support + + + List non-owned projects that you have push rights to with ``repos.pushable`` + +* Requires httplib2_ + +.. _OAuth2: http://develop.github.com/p/oauth.html +.. _httplib2: http://code.google.com/p/httplib2/ diff --git a/README.rst b/README.rst index 247a336..c5adbf6 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ python-github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.2.0 +:Version: 0.3.0 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 3f95739..7160709 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 2, 0) +VERSION = (0, 3, 0) __author__ = "Ask Solem" __contact__ = "askh@opera.com" diff --git a/tox.ini b/tox.ini index 318809a..e4330a3 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ deps = docutils commands = mkdir -p {envtmpdir} + rst2html.py --strict NEWS.rst {envtmpdir}/NEWS.html rst2html.py --strict README.rst {envtmpdir}/README.html [testenv:sphinx] deps = From b5aea338ae1569aa4ae43e23cd20b515a113c49f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 13 Apr 2011 21:47:50 +0100 Subject: [PATCH 127/454] Added {master,intergration}_branch attributes to Repository. See http://support.github.com/discussions/api/127-no-way-to-see-default-branch-in-reposshow-api --- github2/repositories.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 8335257..6fc463f 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -10,6 +10,8 @@ class Repository(BaseData): fork = Attribute("If True, this is a fork of another repository.") owner = Attribute("Username of the user owning this repository.") homepage = Attribute("Homepage for this project.") + master_branch = Attribute("Default branch, if set.") + integration_branch = Attribute("Integration branch, if set.") open_issues = Attribute("List of open issues for this repository.") created_at = DateAttribute("Datetime the repository was created.") pushed_at = DateAttribute("Datetime of the last push to this repository") From 9a42a9ff2f6324d37a4500681dd3bc8fd0db1357 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 14 Apr 2011 11:10:26 +0100 Subject: [PATCH 128/454] Include test data in tarballs. Thanks to Matt Leighy for reporting. --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index 77d8418..b55f534 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -9,3 +9,5 @@ include doc/conf.py include doc/Makefile include doc/.templates/layout.html prune doc/.build/ + +recursive-include tests/data * From d81c158a4e4297a4cfd1a3185d00082a24297490 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 15 Apr 2011 13:33:46 +0100 Subject: [PATCH 129/454] Removed redundant note from {add,remove}_collaborator. See 5eed63a476796bc4edbdb76b2b2a03040ddc46dd. --- github2/repositories.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index 6fc463f..476fdab 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -131,9 +131,6 @@ def list_collaborators(self, project): def add_collaborator(self, project, username): """Adds an add_collaborator to a repo - Do not prefix repo_name with the user owning the repo like you do in - list_collaborators() - :param str project: Github project :param str username: Github user to add as collaborator """ @@ -142,9 +139,6 @@ def add_collaborator(self, project, username): def remove_collaborator(self, project, username): """Removes an add_collaborator from a repo - Do not prefix repo_name with the user owning the repo like you do in - list_collaborators() - :param str project: Github project :param str username: Github user to add as collaborator """ From 82ff5d5b26fe7331f500a62b3a39bbb79b25331e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 18 Apr 2011 00:25:50 +0100 Subject: [PATCH 130/454] Include authentication data with non-POST methods. This fixes a regression in 944c63a408a21dfb852aa05aa11ad660db3fefdc. --- github2/request.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/github2/request.py b/github2/request.py index f19761a..557e8fd 100644 --- a/github2/request.py +++ b/github2/request.py @@ -6,6 +6,11 @@ import json as simplejson # For Python 2.6 except ImportError: import simplejson +from urlparse import (urlsplit, urlunsplit) +try: + from urlparse import parse_qs +except ImportError: + from cgi import parse_qs from urllib import urlencode, quote @@ -88,6 +93,7 @@ def make_request(self, path, extra_post_data=None, method="GET"): return result def raw_request(self, url, extra_post_data, method="GET"): + scheme, netloc, path, query, fragment = urlsplit(url) post_data = None headers = self.http_headers headers["Accept"] = "text/html" @@ -95,6 +101,9 @@ def raw_request(self, url, extra_post_data, method="GET"): if extra_post_data or method == "POST": post_data = self.encode_authentication_data(extra_post_data) headers["Content-Length"] = str(len(post_data)) + else: + query = self.encode_authentication_data(parse_qs(query)) + url = urlunsplit((scheme, netloc, path, query, fragment)) response, content = self._http.request(url, method, post_data, headers) if self.debug: sys.stderr.write("URL:[%s] POST_DATA:%s RESPONSE_TEXT: [%s]\n" % ( From c2b21a9764cbf035a31db78568e646293db4b0e6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 18 Apr 2011 14:12:26 +0100 Subject: [PATCH 131/454] Include test scripts in sdist tarball. --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index b55f534..b4a520c 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -10,4 +10,5 @@ include doc/Makefile include doc/.templates/layout.html prune doc/.build/ +include tests/*.py recursive-include tests/data * From f4c0a1f94770dd087fe636ed98f3443db317ab8c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 18 Apr 2011 14:13:03 +0100 Subject: [PATCH 132/454] Bumped version to 0.3.1. --- README.rst | 2 +- github2/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index c5adbf6..578225a 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ python-github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.3.0 +:Version: 0.3.1 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 7160709..15f242c 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 3, 0) +VERSION = (0, 3, 1) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From f60249ba4c136f28889d4ec26e331925ecdff0dc Mon Sep 17 00:00:00 2001 From: broderboy Date: Fri, 22 Apr 2011 15:19:43 -0400 Subject: [PATCH 133/454] Don't use trailing slashes in MANIFEST.in. Breaks on Windows, see http://docs.python.org/distutils/apiref.html#distutils.util.convert_path --- AUTHORS | 1 + MANIFEST.in | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index b883fd2..3a42a3f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -21,3 +21,4 @@ James Rowe Josh Weinberg Barthelemy Dagenais Surajram Kumarave +broderboy diff --git a/MANIFEST.in b/MANIFEST.in index b4a520c..f8d1bd9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -8,7 +8,7 @@ recursive-include doc *.rst include doc/conf.py include doc/Makefile include doc/.templates/layout.html -prune doc/.build/ +prune doc/.build include tests/*.py recursive-include tests/data * From ac9b46559ae898d49d7871b083f3c333dd029848 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 25 Apr 2011 16:49:23 +0100 Subject: [PATCH 134/454] Added initial bug reporting document. --- doc/bugs.rst | 34 ++++++++++++++++++++++++++++++++++ doc/index.rst | 1 + 2 files changed, 35 insertions(+) create mode 100644 doc/bugs.rst diff --git a/doc/bugs.rst b/doc/bugs.rst new file mode 100644 index 0000000..4f45e48 --- /dev/null +++ b/doc/bugs.rst @@ -0,0 +1,34 @@ +Reporting bugs +============== + +If you think you've found a bug, or inconsistency, in ``python-github`` please +`report an issue`_. + +.. note:: + Please don't report bugs via email, this limits who can work on a bug or + suggest solutions to a bug. It also makes it impossible for other users to + search the database of known bugs, which can often lead to duplicated + effort. + +We also use the issue tracker to track feature requests and ideas. Having all +this information in a single place makes it easier for new contributors to jump +in. + +Anatomy of a good bug report +---------------------------- + +Filing a good report makes it easier to fix bugs, and making it easier to work +on your bug means it is likely to be fixed much faster! + +A good bug report will have the following: + +* A descriptive title +* A full Python traceback of the error, if there is one +* A minimal test-case to reproduce the error +* A list of solutions you've already tried + +Simon Tatham has an excellent essay titled `How to Report Bugs Effectively`_, +with some excellent tips on filing good bug reports. + +.. _report an issue: https://github.com/ask/python-github2/issues/ +.. _How to Report Bugs Effectively: http://www.chiark.greenend.org.uk/~sgtatham/bugs.html diff --git a/doc/index.rst b/doc/index.rst index ce85b08..559fbdc 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -25,6 +25,7 @@ Contents install quickstart api/index + bugs license Indices and tables From bc1774f14af7f00052d49de273644e98858b7980 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 25 Apr 2011 17:22:31 +0100 Subject: [PATCH 135/454] Added initial contributing document. --- doc/contributing.rst | 54 ++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 1 + 2 files changed, 55 insertions(+) create mode 100644 doc/contributing.rst diff --git a/doc/contributing.rst b/doc/contributing.rst new file mode 100644 index 0000000..744628d --- /dev/null +++ b/doc/contributing.rst @@ -0,0 +1,54 @@ +Contributing +============ + +Patches for ``python-github2`` are most welcome! + +Forks on GitHub_ and patches attached to issues are both great ways to +contribute. If you're comfortable with ``git`` using a fork hosted on GitHub is +probably the simpler solution, both for the package maintainers and you as a +contributor. + +Following the simple guidelines below makes it easier to review and integrate +your changes: + +* `PEP 8`_, the Python style guide, should be followed where possible +* Adding documentation for new methods and classes is very important +* Testing your changes with multiple Python versions is fantastically useful, it + is all too easy to use functionality that exists in only specific Python + versions + +The documentation format used in the code's docstrings is Sphinx_ +autodoc_-compatible. If you're not comfortable with the format, a close +approximation is good enough. It is often easier to fix broken formatting than +write documentation from scratch. + +Documentation patches and the addition of new examples are as equally +appreciated as patches to code. + +Tests +----- + +.. note:: + Unfortunately there aren't many tests for ``python-github`` at the moment, + any patches to increase test coverage are greatly appreciated + +The preferred way to run the package's tests is with nose_. ``nosetests`` +provides excellent reporting options and its additional features make it +invaluable, see the nose_ documentation for usage information. + +There is a tox_ configuration file included in the repository, you can use it to +run the tests against multiple Python versions with a single command. The +configuration file also includes targets for testing the documentation. The +tox_ documentation includes a fantastic number of examples on how to use it, or +add new testing targets. + +.. todo:: + Add topic branches and pull request usage examples, but most git users are + likely to be comfortable with these already + +.. _GitHub: https://github.com/ask/python-github2/ +.. _PEP 8: http://www.python.org/dev/peps/pep-0008/ +.. _Sphinx: http://sphinx.pocoo.org/ +.. _autodoc: http://sphinx.pocoo.org/ext/autodoc.html#module-sphinx.ext.autodoc +.. _nose: http://somethingaboutorange.com/mrl/projects/nose/ +.. _tox: http://pypi.python.org/pypi/tox/ diff --git a/doc/index.rst b/doc/index.rst index 559fbdc..2e163e3 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -26,6 +26,7 @@ Contents quickstart api/index bugs + contributing license Indices and tables From def64ba29fc10666c98e0ee5f30bd54e51cc45ad Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 15 Apr 2011 19:04:16 +0100 Subject: [PATCH 136/454] Removed leftover debugging statement. --- tests/unit.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit.py b/tests/unit.py index 6cdeb36..ef207fc 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -25,7 +25,6 @@ def __init__(self, cache=None, timeout=None, proxy_info=None): def request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None): file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) - print file if os.path.exists(file): response = message_from_file(open(file)) body = response.get_payload() From 966f891b4c243f2e65d416226f5d3505b2c04f6f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 01:20:37 +0100 Subject: [PATCH 137/454] Include NEWS.rst in setuptools' long description. --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8acbede..644da05 100644 --- a/setup.py +++ b/setup.py @@ -18,11 +18,14 @@ if sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') +long_description = (codecs.open('README.rst', "r", "utf-8").read() + + "\n" + codecs.open('NEWS.rst', "r", "utf-8").read()) setup( name='github2', version=github2.__version__, description=github2.__doc__, + long_description=long_description, author=github2.__author__, author_email=github2.__contact__, url=github2.__homepage__, @@ -45,5 +48,4 @@ "Topic :: Software Development", "Topic :: Software Development :: Libraries", ], - long_description=codecs.open('README.rst', "r", "utf-8").read(), ) From d047a51d59c3c56ece4934dcf166020f4df817ab Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 01:23:31 +0100 Subject: [PATCH 138/454] USe setuptools for running unittests. --- runtests.py | 14 -------------- setup.py | 1 + 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100755 runtests.py diff --git a/runtests.py b/runtests.py deleted file mode 100755 index ff247e2..0000000 --- a/runtests.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -"""Run all unit tests for this project""" - -import sys -import os - -# Add this to the path so we can "import github2" -sys.path.append(os.path.join(os.path.dirname(__file__), '.')) - -import unittest -from tests import * - -if __name__ == "__main__": - unittest.main() diff --git a/setup.py b/setup.py index 644da05..88e7004 100644 --- a/setup.py +++ b/setup.py @@ -34,6 +34,7 @@ packages=find_packages(exclude=['ez_setup', 'tests']), scripts=['github2/bin/github_manage_collaborators'], install_requires=install_requires, + test_suite="tests", classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", From 8a25023f841fdedf6608f13b795622be15e86945 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 01:24:23 +0100 Subject: [PATCH 139/454] Set package keywords for PyPI use. --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 88e7004..3379a41 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ author_email=github2.__contact__, url=github2.__homepage__, license='BSD', + keywords="git github api", platforms=["any"], packages=find_packages(exclude=['ez_setup', 'tests']), scripts=['github2/bin/github_manage_collaborators'], From 0125340df55c5b1a882c73a5f0fd6f46c8728a41 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 01:27:54 +0100 Subject: [PATCH 140/454] Remove ez_setup fallback for users without setuptools. The ezsetup setuptools installer hasn't been shipped in any released version, so people can't be relying on it. If it needs to come back at some point use `distribute_setup` in its place. --- setup.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 3379a41..f19c461 100644 --- a/setup.py +++ b/setup.py @@ -3,12 +3,7 @@ import codecs import sys -try: - from setuptools import setup, find_packages -except ImportError: - from ez_setup import use_setuptools - use_setuptools() - from setuptools import setup, find_packages +from setuptools import setup, find_packages import github2 @@ -32,7 +27,7 @@ license='BSD', keywords="git github api", platforms=["any"], - packages=find_packages(exclude=['ez_setup', 'tests']), + packages=find_packages(exclude=['tests']), scripts=['github2/bin/github_manage_collaborators'], install_requires=install_requires, test_suite="tests", From 1101171a93e036a3e80a76dfe0982e6846860ca9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 01:28:48 +0100 Subject: [PATCH 141/454] Ignore coverage data file. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9202579..de35dbe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +.coverage .noseids .ropeproject/ .tox/ From fa0380e06cdea71ddf4059de6817faec70e06221 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 19:23:01 +0100 Subject: [PATCH 142/454] Added versionadded Sphinx directives where possible. Some functions have received enough churn that it is too much work to track down their initial supported version unfortunately. --- github2/client.py | 7 +++++++ github2/issues.py | 10 ++++++++++ github2/repositories.py | 6 +++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/github2/client.py b/github2/client.py index 3de3091..8f97f5f 100644 --- a/github2/client.py +++ b/github2/client.py @@ -13,6 +13,11 @@ def __init__(self, username=None, api_token=None, debug=False, An interface to GitHub's API: http://develop.github.com/ + .. versionadded:: 0.2.0 + The ``requests_per_second`` parameter + .. versionadded:: 0.3.0 + The ``cache`` and ``access_token`` parameters + :param str username: your own GitHub username. :param str api_token: can be found at https://github.com/account (while logged in as that user): @@ -47,6 +52,8 @@ def project_for_user_repo(self, user, repo): def get_all_blobs(self, project, tree_sha): """Get a list of all blobs for a specific tree + .. versionadded:: 0.3.0 + :param str project: GitHub project :param str tree_sha: object ID of tree """ diff --git a/github2/issues.py b/github2/issues.py index bac5a19..f58bf83 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -40,6 +40,8 @@ class Issues(GithubCommand): def search(self, project, term, state="open"): """Get all issues for project that match term with given state. + .. versionadded:: 0.3.0 + :param str project: GitHub project :param str term: term to search issues for :param str state: can be either ``open`` or ``closed``. @@ -60,6 +62,8 @@ def list(self, project, state="open"): def list_by_label(self, project, label): """Get all issues for project with label. + .. versionadded:: 0.3.0 + :param str project: GitHub project :param str label: a string representing a label (e.g., ``bug``). """ @@ -69,6 +73,8 @@ def list_by_label(self, project, label): def list_labels(self, project): """Get all labels for project. + .. versionadded:: 0.3.0 + :param str project: GitHub project """ return self.get_values("labels", project, filter="labels") @@ -105,6 +111,8 @@ def close(self, project, number): def reopen(self, project, number): """Reopen a closed issue + .. versionadded:: 0.3.0 + :param str project: GitHub project :param int number: issue number in the Github database """ @@ -114,6 +122,8 @@ def reopen(self, project, number): def edit(self, project, number, title, body): """Edit an existing issue + .. versionadded:: 0.3.0 + :param str project: GitHub project :param int number: issue number in the Github database :param str title: title for issue diff --git a/github2/repositories.py b/github2/repositories.py index 476fdab..1d73199 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -44,8 +44,12 @@ def show(self, project): """ return self.get_value("show", project, filter="repository", datatype=Repository) + def pushable(self): - """Return a list of repos you can push to that are not your own.""" + """Return a list of repos you can push to that are not your own. + + .. versionadded:: 0.3.0 + """ return self.get_values("pushable", filter="repositories", datatype=Repository) From 985c01d749fd4d966cd9b5dc2d67c6b40474b1ff Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 19:23:54 +0100 Subject: [PATCH 143/454] This package is zip safe. Doesn't make it a good enough reason to use eggs though ;) --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index f19c461..a037a64 100644 --- a/setup.py +++ b/setup.py @@ -30,6 +30,7 @@ packages=find_packages(exclude=['tests']), scripts=['github2/bin/github_manage_collaborators'], install_requires=install_requires, + zip_safe=True, test_suite="tests", classifiers=[ "Development Status :: 3 - Alpha", From 7a33a64ce76f6e381e0fc54cd5bbec65e201dd07 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 28 Apr 2011 19:25:30 +0100 Subject: [PATCH 144/454] Added setuptools upload_docs config setting. --- setup.cfg | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..5821ecd --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[upload_docs] +upload-dir = docs/.build/html From b5b042064d64fd336b9ec90a83375b23d6ddc14e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 05:54:52 +0100 Subject: [PATCH 145/454] Added custom settings for nose. --- setup.cfg | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup.cfg b/setup.cfg index 5821ecd..69d978c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,7 @@ [upload_docs] upload-dir = docs/.build/html +[nosetests] +cover-package = github2 +detailed-errors = 1 +with-coverage = 1 +with-id = 1 From 94ac353b3513b226aeabc539badbcf07227bf5cd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:38:10 +0100 Subject: [PATCH 146/454] Added simple ISO-8601 parsing for pull request usage. --- github2/core.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/github2/core.py b/github2/core.py index caf20a9..7fbc65f 100644 --- a/github2/core.py +++ b/github2/core.py @@ -42,6 +42,23 @@ def datetime_to_commitdate(datetime_): return "".join([date_without_tz, GITHUB_TIMEZONE]) +def isodate_to_datetime(iso_date): + """Convert commit date string to Python datetime + + :param str github_date: date string to parse + """ + date_without_tz = iso_date[:-1] + return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) + + +def datetime_to_isodate(datetime_): + """Convert Python datetime to Github date string + + :param str datetime_: datetime object to convert + """ + return "%s%z" % datetime_.isoformat() + + class GithubCommand(object): def __init__(self, request): @@ -120,6 +137,10 @@ class DateAttribute(Attribute): "to": commitdate_to_datetime, "from": datetime_to_commitdate, }, + "iso": { + "to": isodate_to_datetime, + "from": datetime_to_isodate, + } } def __init__(self, *args, **kwargs): From 1ec8e4731f03b67713a079b24ea0609156e70fbe Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:39:08 +0100 Subject: [PATCH 147/454] Updated pull request date handling. --- github2/pull_requests.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 5ba7468..6889d1a 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -16,10 +16,16 @@ class PullRequest(BaseData): patch_url = Attribute("The URL to the downloadable patch.") labels = Attribute("A list of labels attached to the pull request.") html_url = Attribute("The URL to the pull request.") - issue_created_at = DateAttribute("The date the issue for this pull request was opened.", format='commit') - issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.", format='commit') - created_at = DateAttribute("The date when this pull request was created.", format='commit') - updated_at = DateAttribute("The date when this pull request was last updated.", format='commit') + issue_created_at = DateAttribute("The date the issue for this pull request was opened.", + format='iso') + issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.", + format='iso') + created_at = DateAttribute("The date when this pull request was created.", + format='iso') + updated_at = DateAttribute("The date when this pull request was last updated.", + format='iso') + closed_at = DateAttribute("The date when this pull request was closed", + format='iso') def __repr__(self): return "" % self.html_url From 7ee2c71804828cb3b30d8dae559c4c68930593d1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:39:52 +0100 Subject: [PATCH 148/454] Fixed discussion/comments handling for pull requests. --- github2/pull_requests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 6889d1a..78792d5 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -11,7 +11,7 @@ class PullRequest(BaseData): position = Attribute("Floating point position of the pull request.") number = Attribute("Number of this request.") votes = Attribute("Number of votes for this request.") - comments = Attribute("Any comments made on this request.") + comments = Attribute("Number of comments made on this request.") diff_url = Attribute("The URL to the unified diff.") patch_url = Attribute("The URL to the downloadable patch.") labels = Attribute("A list of labels attached to the pull request.") @@ -26,6 +26,7 @@ class PullRequest(BaseData): format='iso') closed_at = DateAttribute("The date when this pull request was closed", format='iso') + discussion = Attribute("Discussion thread for the pull request.") def __repr__(self): return "" % self.html_url From 5ec9bc241a0c1a227771e7bc336dabc1c6f07b6e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:43:31 +0100 Subject: [PATCH 149/454] Use project as parameter name to match rest of package. --- github2/pull_requests.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 78792d5..a0e344c 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -35,7 +35,7 @@ def __repr__(self): class PullRequests(GithubCommand): domain = "pulls" - def new(self, repo, base, head, title=None, body=None, issue=None): + def new(self, project, base, head, title=None, body=None, issue=None): """ Create a new pull request """ post_data = {"base": base, "head": head} if issue: @@ -44,13 +44,16 @@ def new(self, repo, base, head, title=None, body=None, issue=None): post_data["title"] = title post_data["body"] = body pull_request_data = [("pull[%s]" % k, v) for k, v in post_data.items()] - return self.get_value(repo, post_data=dict(pull_request_data), + return self.get_value(project, post_data=dict(pull_request_data), filter="pull", datatype=PullRequest) - def show(self, repo, number): + def show(self, project, number): """ Show a single pull request """ - return self.get_value(repo, str(number), filter="pull", datatype=PullRequest) + return self.get_value(project, str(number), filter="pull", + datatype=PullRequest) - def list(self, repo, state=None): - """ List all pull requests for a repo """ - return self.get_values(repo, state, filter="pulls", datatype=PullRequest) + def list(self, project, state="open"): + """ List all pull requests for a project """ + + return self.get_values(project, state, filter="pulls", + datatype=PullRequest) From 8bf92e69879f41a5a0a1dbbaf526502b75a0eb7b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:44:23 +0100 Subject: [PATCH 150/454] body is optional parameter for opening pull request. Doesn't mean you shouldn't use a good description when opening a request ;) --- github2/pull_requests.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index a0e344c..7e459fb 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -40,9 +40,10 @@ def new(self, project, base, head, title=None, body=None, issue=None): post_data = {"base": base, "head": head} if issue: post_data["issue"] = issue - elif title and body: + elif title: post_data["title"] = title - post_data["body"] = body + if body: + post_data["body"] = body pull_request_data = [("pull[%s]" % k, v) for k, v in post_data.items()] return self.get_value(project, post_data=dict(pull_request_data), filter="pull", datatype=PullRequest) From 173cb9ceb62f1acd18b154eb4a7c8e27fb55e8d7 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:44:53 +0100 Subject: [PATCH 151/454] Added mergeable pull request attribute. --- github2/pull_requests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 7e459fb..9852a71 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -27,6 +27,7 @@ class PullRequest(BaseData): closed_at = DateAttribute("The date when this pull request was closed", format='iso') discussion = Attribute("Discussion thread for the pull request.") + mergeable = Attribute("Whether the pull request can be merge cleanly") def __repr__(self): return "" % self.html_url From 374787e4160138c42adb4e7a444e2f5d276b0280 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:48:23 +0100 Subject: [PATCH 152/454] Document PullRequests methods. Renames new to create to match other methods. --- github2/pull_requests.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 9852a71..226b933 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -36,8 +36,22 @@ def __repr__(self): class PullRequests(GithubCommand): domain = "pulls" - def new(self, project, base, head, title=None, body=None, issue=None): - """ Create a new pull request """ + def create(self, project, base, head, title=None, body=None, issue=None): + """Create a new pull request + + Pull requests can be created from scratch, or attached to an existing + issue. If an ``issue`` parameter is supplied the pull request is + attached to that issue, else a new pull request is created. + + .. versionadded:: 0.4.0 + + :param str project: Github project + :param str base: branch changes should be pulled into + :param str head: branch of the changes to be pulled + :param str title: title for pull request + :param str body: optional body for pull request + :param str issue: existing issue to attach pull request to + """ post_data = {"base": base, "head": head} if issue: post_data["issue"] = issue @@ -50,12 +64,19 @@ def new(self, project, base, head, title=None, body=None, issue=None): filter="pull", datatype=PullRequest) def show(self, project, number): - """ Show a single pull request """ + """Show a single pull request + + :param str project: Github project + :param int number: pull request number in the Github database + """ return self.get_value(project, str(number), filter="pull", datatype=PullRequest) def list(self, project, state="open"): - """ List all pull requests for a project """ + """List all pull requests for a project + :param str project: Github project + :param str state: can be either ``open`` or ``closed`` + """ return self.get_values(project, state, filter="pulls", datatype=PullRequest) From f62955af764ceb1ac60ee011b7be338099640b45 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:49:03 +0100 Subject: [PATCH 153/454] Minor PEP-8 fix. --- github2/pull_requests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 226b933..f0b9848 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -1,5 +1,6 @@ from github2.core import BaseData, GithubCommand, Attribute, DateAttribute + class PullRequest(BaseData): state = Attribute("The pull request state") base = Attribute("The base repo") From a6fe7c34c118d56c743851e45503bcc3cc4985e3 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 06:49:34 +0100 Subject: [PATCH 154/454] Use pull request title for repr string. This matches the issues usage, but is definitely debatable. --- github2/pull_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index f0b9848..abcb5cc 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -31,7 +31,7 @@ class PullRequest(BaseData): mergeable = Attribute("Whether the pull request can be merge cleanly") def __repr__(self): - return "" % self.html_url + return "" % self.title.encode('utf-8') class PullRequests(GithubCommand): From 1287d7566d3ee40a4d3610144822d24a1b69f690 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 07:02:28 +0100 Subject: [PATCH 155/454] Updated authors. --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 3a42a3f..356d9b4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -22,3 +22,4 @@ Josh Weinberg Barthelemy Dagenais Surajram Kumarave broderboy +Christopher MacGown From a2e6d9e6ee48efa8d6a9edb95b27685c5e017795 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 08:04:48 +0100 Subject: [PATCH 156/454] Added pull request examples. --- doc/api/index.rst | 1 + doc/api/pull_requests.rst | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 doc/api/pull_requests.rst diff --git a/doc/api/index.rst b/doc/api/index.rst index b83d09a..ddaa821 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -7,6 +7,7 @@ API documentation client users issues + pull_requests network repos commit diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst new file mode 100644 index 0000000..02c26b5 --- /dev/null +++ b/doc/api/pull_requests.rst @@ -0,0 +1,40 @@ +Pull requests +============= + +.. py:currentmodule:: github2.pull_requests + +.. autoclass:: PullRequest(type) + +.. autoclass:: PullRequests(type) + +Examples +-------- + +Listing pull requests +''''''''''''''''''''' + + >>> results = github.pull_requests.list("ask/python-github2") + +View a pull request +''''''''''''''''''' + + >>> request = github.pull_requests.show("ask/python-github2", 28) + >>> pull.body + 'This implements the github API pull requests functionality. ' + +Open pull request +''''''''''''''''' + +To open a new pull request:: + + >>> pull = github.pull_requests.create("ask/python-github2", "master", + ... "JNRowe:my_new_branch", + ... title="Fancy features") + >>> pull.number + 4 + +To attach code to an existing issue:: + + >>> pull = github.pull_requests.create("ask/python-github2", "master", + ... "JNRowe:my_new_branch", + ... issue=4) From da906c1e87dcaf374ff70385a06dae3de5eadedd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 08:05:06 +0100 Subject: [PATCH 157/454] Moved versionadded directive to pull request class. --- github2/pull_requests.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index abcb5cc..a863a26 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -2,6 +2,10 @@ class PullRequest(BaseData): + """Pull request encapsulation + + .. versionadded:: 0.4.0 + """ state = Attribute("The pull request state") base = Attribute("The base repo") head = Attribute("The head of the pull request") @@ -35,6 +39,10 @@ def __repr__(self): class PullRequests(GithubCommand): + """Operations on pull requests + + .. versionadded:: 0.4.0 + """ domain = "pulls" def create(self, project, base, head, title=None, body=None, issue=None): @@ -44,8 +52,6 @@ def create(self, project, base, head, title=None, body=None, issue=None): issue. If an ``issue`` parameter is supplied the pull request is attached to that issue, else a new pull request is created. - .. versionadded:: 0.4.0 - :param str project: Github project :param str base: branch changes should be pulled into :param str head: branch of the changes to be pulled From 9fab3cc0a34992650b34696d3abf316171022b32 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 09:49:01 +0100 Subject: [PATCH 158/454] coverage is required for default testenv. --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index e4330a3..5e813fa 100644 --- a/tox.ini +++ b/tox.ini @@ -4,6 +4,7 @@ envlist = py24, py25, py26, py27, rst, sphinx [testenv] deps = nose + coverage commands = nosetests tests [testenv:rst] From 86e2d06abdb320f9d0b19bf4528f4611bf619f6a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 09:49:52 +0100 Subject: [PATCH 159/454] Use sphinxcontrib-cheeseshop for package links. --- doc/conf.py | 3 ++- doc/index.rst | 4 ++++ doc/install.rst | 9 +++------ setup.py | 1 + tox.ini | 1 + 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index c281ea1..0dafa9c 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,7 +25,8 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.intersphinx'] +extensions = ["sphinx.ext.%s" % ext for ext in ["autodoc", "todo", "intersphinx"]] + \ + ["sphinxcontrib.%s" % ext for ext in ["cheeseshop", ]] # Add any paths that contain templates here, relative to this directory. templates_path = ['.templates'] diff --git a/doc/index.rst b/doc/index.rst index 2e163e3..d8dac1f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -6,6 +6,10 @@ :mod:`python-github2` - Github API v2 library for Python ======================================================== +.. pypi-release:: github2 + :prefix: Download + :class: sidebar + This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/doc/install.rst b/doc/install.rst index cc7f10a..fb2ff6e 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -19,10 +19,7 @@ following:: $ python setup.py install --user # to install for a single user # python setup.py install # to install in Python's site-packages -``python-github2`` depends on httplib2_, an excellent package by Joe Gregorio -for handling HTTP sessions. simplejson_ is also required when using -``python-github2`` with Python 2.4 or 2.5. If you install via ``pip`` or +``python-github2`` depends on :pypi:`httplib2`, an excellent package by Joe +Gregorio for handling HTTP sessions. :pypi:`simplejson` is also required when +using ``python-github2`` with Python 2.4 or 2.5. If you install via ``pip`` or ``easy_install`` the dependencies should be installed automatically for you. - -.. _httplib2: http://code.google.com/p/httplib2/ -.. _simplejson: http://pypi.python.org/pypi/simplejson/ diff --git a/setup.py b/setup.py index a037a64..e08fe80 100644 --- a/setup.py +++ b/setup.py @@ -29,6 +29,7 @@ platforms=["any"], packages=find_packages(exclude=['tests']), scripts=['github2/bin/github_manage_collaborators'], + setup_requires=["sphinxcontrib-cheeseshop"], install_requires=install_requires, zip_safe=True, test_suite="tests", diff --git a/tox.ini b/tox.ini index 5e813fa..d63158a 100644 --- a/tox.ini +++ b/tox.ini @@ -17,6 +17,7 @@ commands = [testenv:sphinx] deps = sphinx + sphinxcontrib-cheeseshop commands = # Test HTML output sphinx-build -W -b html -d {envtmpdir}/doctrees doc {envtmpdir}/html From 171f71cb5a18cd0f86bc70f57f181fcc6e2afcc4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 10:11:35 +0100 Subject: [PATCH 160/454] Refer to package as github2 throughout. It is apparently quite confusing to read the docs with python-github2/github2 used in various places. --- README.rst | 2 +- doc/api/client.rst | 2 ++ doc/api/commit.rst | 4 ++-- doc/api/core.rst | 6 +++--- doc/api/index.rst | 2 +- doc/api/issues.rst | 4 ++-- doc/api/repos.rst | 4 ++-- doc/api/request.rst | 6 +++--- doc/api/users.rst | 4 ++-- doc/bugs.rst | 2 +- doc/conf.py | 8 ++++---- doc/contributing.rst | 2 +- doc/index.rst | 7 +++++-- doc/install.rst | 6 +++--- doc/quickstart.rst | 6 +++--- 15 files changed, 35 insertions(+), 30 deletions(-) diff --git a/README.rst b/README.rst index 578225a..46b7119 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ ================================================================================ -python-github2 - Github API v2 library for Python. +github2 - Github API v2 library for Python. ================================================================================ :Authors: diff --git a/doc/api/client.rst b/doc/api/client.rst index 75ff17e..c1a3048 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -1,3 +1,5 @@ +.. module:: github2.client + Creating a client ================= diff --git a/doc/api/commit.rst b/doc/api/commit.rst index f9730eb..5d4d100 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -1,8 +1,8 @@ +.. module:: github2.commits + Commit ====== -.. py:currentmodule:: github2.commits - .. autoclass:: Commit(type) .. autoclass:: Commits(type) diff --git a/doc/api/core.rst b/doc/api/core.rst index d9ce114..e4feed5 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -1,11 +1,11 @@ +.. module:: github2.core + Core ==== -.. py:currentmodule:: github2.core - .. note:: This module contains functionality that isn't useful to general users - of the ``python-github2`` package, but it is documented to aid contributors + of the :mod:`github2` package, but it is documented to aid contributors to the package. .. autofunction:: ghdate_to_datetime diff --git a/doc/api/index.rst b/doc/api/index.rst index b83d09a..c9d2681 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -12,7 +12,7 @@ API documentation commit object -Additionally the following documentation may be useful to ``python-github2`` +Additionally the following documentation may be useful to :mod:`github2` contributors: .. toctree:: diff --git a/doc/api/issues.rst b/doc/api/issues.rst index b31544b..f6635a7 100644 --- a/doc/api/issues.rst +++ b/doc/api/issues.rst @@ -1,8 +1,8 @@ +.. module:: github2.issues + Issues ====== -.. py:currentmodule:: github2.issues - .. autoclass:: Issue(type) .. autoclass:: Comment(type) diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 4a58b2b..161b9b7 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -1,8 +1,8 @@ +.. module:: github2.repositories + Repository ========== -.. py:currentmodule:: github2.repositories - .. autoclass:: Repository(type) .. autoclass:: Repositories(type) diff --git a/doc/api/request.rst b/doc/api/request.rst index 37d3c46..395f39f 100644 --- a/doc/api/request.rst +++ b/doc/api/request.rst @@ -1,11 +1,11 @@ +.. module:: github2.request + Requests ======== -.. py:currentmodule:: github2.request - .. note:: This module contains functionality that isn't useful to general users - of the ``python-github2`` package, but it is documented to aid contributors + of the :mod:`github2` package, but it is documented to aid contributors to the package. .. autodata:: GITHUB_URL diff --git a/doc/api/users.rst b/doc/api/users.rst index b24c334..842b06d 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -1,8 +1,8 @@ +.. module:: github2.users + Users ===== -.. py:currentmodule:: github2.users - .. autoclass:: User(type) .. autoclass:: Users(type) diff --git a/doc/bugs.rst b/doc/bugs.rst index 4f45e48..05e5086 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -1,7 +1,7 @@ Reporting bugs ============== -If you think you've found a bug, or inconsistency, in ``python-github`` please +If you think you've found a bug, or inconsistency, in :mod:`github2` please `report an issue`_. .. note:: diff --git a/doc/conf.py b/doc/conf.py index 0dafa9c..8f22797 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -41,7 +41,7 @@ master_doc = 'index' # General information about the project. -project = u'python-github2' +project = u'github2' copyright = u'2011, Ask Solem' # The version info for the project you're documenting, acts as replacement for @@ -170,7 +170,7 @@ #html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'python-github2doc' +htmlhelp_basename = 'github2doc' # -- Options for LaTeX output -------------------------------------------------- @@ -184,7 +184,7 @@ # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ - ('index', 'python-github2.tex', u'python-github2 Documentation', + ('index', 'github2.tex', u'github2 Documentation', u'Ask Solem', 'manual'), ] @@ -217,7 +217,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'python-github2', u'python-github2 Documentation', + ('index', 'github2', u'github2 Documentation', [u'Ask Solem'], 1) ] diff --git a/doc/contributing.rst b/doc/contributing.rst index 744628d..bd27496 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -1,7 +1,7 @@ Contributing ============ -Patches for ``python-github2`` are most welcome! +Patches for :mod:`github2` are most welcome! Forks on GitHub_ and patches attached to issues are both great ways to contribute. If you're comfortable with ``git`` using a fork hosted on GitHub is diff --git a/doc/index.rst b/doc/index.rst index d8dac1f..93a112f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,8 +3,11 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -:mod:`python-github2` - Github API v2 library for Python -======================================================== +.. module:: github2 + :synopsis: GitHub API v2 library for Python + +``github2`` - Github API v2 library for Python +============================================== .. pypi-release:: github2 :prefix: Download diff --git a/doc/install.rst b/doc/install.rst index fb2ff6e..79341a2 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -1,7 +1,7 @@ Installation ------------ -You can install ``python-github2`` either via the Python Package Index (PyPI) or +You can install :mod:`github2` either via the Python Package Index (PyPI) or from source. To install using ``pip``:: @@ -19,7 +19,7 @@ following:: $ python setup.py install --user # to install for a single user # python setup.py install # to install in Python's site-packages -``python-github2`` depends on :pypi:`httplib2`, an excellent package by Joe +:mod:`github2` depends on :pypi:`httplib2`, an excellent package by Joe Gregorio for handling HTTP sessions. :pypi:`simplejson` is also required when -using ``python-github2`` with Python 2.4 or 2.5. If you install via ``pip`` or +using :mod:`github2` with Python 2.4 or 2.5. If you install via ``pip`` or ``easy_install`` the dependencies should be installed automatically for you. diff --git a/doc/quickstart.rst b/doc/quickstart.rst index d1a8253..b0c4238 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -1,8 +1,8 @@ Quickstart ========== -Once ``python-github2`` is installed we can open an interactive Python session, -and perform some basic tasks to familiarise ourselves with the package. +Once :mod:`github2` is installed we can open an interactive Python session, and +perform some basic tasks to familiarise ourselves with the package. Create an unauthenticated client object:: @@ -12,7 +12,7 @@ Create an unauthenticated client object:: Creating an unauthenticated client object means we can play with the API without fear of creating or deleting data on our account. -See how many followers the ``python-github2`` project has:: +See how many followers the :mod:`github2` project has:: >>> len(github.repos.watchers("ask/python-github2")) 129 From 12307d8d41c0c56b521fb152266588926f99d9f2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 10:13:06 +0100 Subject: [PATCH 161/454] Link to the install document in quickstart. --- doc/quickstart.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index b0c4238..e1ab25e 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -1,8 +1,9 @@ Quickstart ========== -Once :mod:`github2` is installed we can open an interactive Python session, and -perform some basic tasks to familiarise ourselves with the package. +Once :mod:`github2` is :doc:`installed ` we can open an interactive +Python session, and perform some basic tasks to familiarise ourselves with the +package. Create an unauthenticated client object:: From 6738adaf013cef84fb58d2aa755557e5358d122b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 10:15:00 +0100 Subject: [PATCH 162/454] Keep Sphinx .static dir to silence warning. --- doc/.static/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/.static/.keep diff --git a/doc/.static/.keep b/doc/.static/.keep new file mode 100644 index 0000000..e69de29 From 58c28aebf8edd5b605b281860a6a3afa8ccb9e63 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:40:15 +0100 Subject: [PATCH 163/454] Give a descriptive error when HttpMock returns 404. --- tests/unit.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit.py b/tests/unit.py index ef207fc..0320ebb 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -31,7 +31,8 @@ def request(self, uri, method='GET', body=None, headers=None, headers = httplib2.Response(response) return (headers, body) else: - return (httplib2.Response({"status": "404"}), "") + return (httplib2.Response({"status": "404"}), + "Resource unavailable from test data store") class ReprTests(unittest.TestCase): From 3407386d43ef1accf80ccaa1aaef3aa564e7c825 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:41:25 +0100 Subject: [PATCH 164/454] Renamed unit.py so nose collects the tests by default. --- tests/{unit.py => test_unit.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{unit.py => test_unit.py} (100%) diff --git a/tests/unit.py b/tests/test_unit.py similarity index 100% rename from tests/unit.py rename to tests/test_unit.py From 61d4a2582266624473609738487858c697da5887 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:42:26 +0100 Subject: [PATCH 165/454] Use nose.collector with setuptools test. This makes the behaviour very similar to the preferred nosetests commands. --- setup.py | 3 ++- tests/__init__.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 tests/__init__.py diff --git a/setup.py b/setup.py index e08fe80..d3e8865 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,8 @@ setup_requires=["sphinxcontrib-cheeseshop"], install_requires=install_requires, zip_safe=True, - test_suite="tests", + test_suite="nose.collector", + tests_require=['nose'], classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index def65ae..0000000 --- a/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from tests.unit import * From c1cf8fe6da5b8469e5362af33446db57593f8975 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:43:53 +0100 Subject: [PATCH 166/454] Include user install option in pip example. --- doc/install.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/install.rst b/doc/install.rst index 79341a2..a7676ec 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -6,7 +6,8 @@ from source. To install using ``pip``:: - $ pip install github2 + $ pip install github2 # to install in Python's site-packages + $ pip install --install-option="--user" github2 # to install for a single user To install using ``easy_install``:: @@ -16,8 +17,8 @@ If you have downloaded a source tarball you can install it by doing the following:: $ python setup.py build - $ python setup.py install --user # to install for a single user # python setup.py install # to install in Python's site-packages + $ python setup.py install --user # to install for a single user :mod:`github2` depends on :pypi:`httplib2`, an excellent package by Joe Gregorio for handling HTTP sessions. :pypi:`simplejson` is also required when From d3d156bb1e9822f87109ef4e2f37fbd21b84f6e8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:53:28 +0100 Subject: [PATCH 167/454] Enabled support for build_sphinx command. --- setup.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.cfg b/setup.cfg index 69d978c..ed6924a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,3 +5,6 @@ cover-package = github2 detailed-errors = 1 with-coverage = 1 with-id = 1 +[build_sphinx] +source-dir = doc +build-dir = doc/.build From c4a00a4e35c74391d728941d3f4931dc9e8495ab Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 05:59:41 +0100 Subject: [PATCH 168/454] Build all standard archive formats with build_dist command. --- setup.cfg | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup.cfg b/setup.cfg index ed6924a..2a8085f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,5 @@ +[aliases] +build_dist = sdist --formats=gztar,bztar,zip [upload_docs] upload-dir = docs/.build/html [nosetests] From 7b9b49b0c84a9184a4968a512f71489b8a2a05a1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 06:00:21 +0100 Subject: [PATCH 169/454] Always write all files in build_sphinx. This is important because autodoc doesn't force a rebuild if source changes. --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index 2a8085f..0894cc6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,3 +10,4 @@ with-id = 1 [build_sphinx] source-dir = doc build-dir = doc/.build +all-files = 1 From 27beaa4d2fadd1e23a60fe82669604435533221e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 06:06:21 +0100 Subject: [PATCH 170/454] Added requires_auth decorator for marking API calls. --- doc/api/core.rst | 2 ++ github2/core.py | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/doc/api/core.rst b/doc/api/core.rst index e4feed5..f5d7ccb 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -14,6 +14,8 @@ Core .. autofunction:: commitdate_to_datetime .. autofunction:: datetime_to_commitdate +.. autofunction:: requires_auth + .. autofunction:: doc_generator .. autoclass:: GithubCommand diff --git a/github2/core.py b/github2/core.py index caf20a9..720ebba 100644 --- a/github2/core.py +++ b/github2/core.py @@ -42,6 +42,32 @@ def datetime_to_commitdate(datetime_): return "".join([date_without_tz, GITHUB_TIMEZONE]) +class AuthError(Exception): + """Requires authentication""" + + +def requires_auth(f): + """Decorate to check a function call for authentication + + Sets a ``requires_auth`` attribute on functions, for use in introspection. + + :param func f: Function to wrap + :raises AuthError: If function called without an authenticated session + """ + # When Python 2.4 support is dropped move straight to functools.wraps, don't + # pass go and don't collect $200. + def wrapper(self, *args, **kwargs): + if not self.request.access_token and not self.request.api_token: + raise AuthError("%r requires an authenticated session" + % f.__name__) + return f(self, *args, **kwargs) + wrapped = wrapper + wrapped.__name__ = f.__name__ + wrapped.__doc__ = f.__doc__ + """\n.. warning:: Requires authentication""" + wrapped.requires_auth = True + return wrapped + + class GithubCommand(object): def __init__(self, request): From 6ee0543c481ec43b74c964a2895712af035f89e5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 06:08:03 +0100 Subject: [PATCH 171/454] Decorated appropriate API calls with @requires_auth. --- github2/issues.py | 10 +++++++++- github2/repositories.py | 13 ++++++++++++- github2/users.py | 4 +++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index f58bf83..6c58661 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,6 +1,7 @@ import urllib -from github2.core import GithubCommand, BaseData, Attribute, DateAttribute +from github2.core import (GithubCommand, BaseData, Attribute, DateAttribute, + requires_auth) class Issue(BaseData): @@ -88,6 +89,7 @@ def show(self, project, number): return self.get_value("show", project, str(number), filter="issue", datatype=Issue) + @requires_auth def open(self, project, title, body): """Open up a new issue. @@ -99,6 +101,7 @@ def open(self, project, title, body): return self.get_value("open", project, post_data=issue_data, filter="issue", datatype=Issue) + @requires_auth def close(self, project, number): """Close an issue @@ -108,6 +111,7 @@ def close(self, project, number): return self.get_value("close", project, str(number), filter="issue", datatype=Issue, method="POST") + @requires_auth def reopen(self, project, number): """Reopen a closed issue @@ -119,6 +123,7 @@ def reopen(self, project, number): return self.get_value("reopen", project, str(number), filter="issue", datatype=Issue, method="POST") + @requires_auth def edit(self, project, number, title, body): """Edit an existing issue @@ -134,6 +139,7 @@ def edit(self, project, number, title, body): post_data=issue_data, filter="issue", datatype=Issue) + @requires_auth def add_label(self, project, number, label): """Add a label to an issue @@ -144,6 +150,7 @@ def add_label(self, project, number, label): return self.make_request("label/add", project, label, str(number), filter="labels", method="POST") + @requires_auth def remove_label(self, project, number, label): """Remove an existing label from an issue @@ -154,6 +161,7 @@ def remove_label(self, project, number, label): return self.make_request("label/remove", project, label, str(number), filter="labels", method="POST") + @requires_auth def comment(self, project, number, comment): """Comment on an issue. diff --git a/github2/repositories.py b/github2/repositories.py index 1d73199..a9fabc0 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -1,4 +1,5 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, + requires_auth) class Repository(BaseData): name = Attribute("Name of repository.") @@ -45,6 +46,7 @@ def show(self, project): return self.get_value("show", project, filter="repository", datatype=Repository) + @requires_auth def pushable(self): """Return a list of repos you can push to that are not your own. @@ -65,6 +67,7 @@ def list(self, for_user=None): return self.get_values("show", for_user, filter="repositories", datatype=Repository) + @requires_auth def watch(self, project): """Watch a project @@ -72,6 +75,7 @@ def watch(self, project): """ return self.make_request("watch", project) + @requires_auth def unwatch(self, project): """Unwatch a project @@ -79,6 +83,7 @@ def unwatch(self, project): """ return self.make_request("unwatch", project) + @requires_auth def fork(self, project): """Fork a project @@ -87,6 +92,7 @@ def fork(self, project): return self.get_value("fork", project, filter="repository", datatype=Repository) + @requires_auth def create(self, project, description=None, homepage=None, public=True): """Create a repository @@ -100,6 +106,7 @@ def create(self, project, description=None, homepage=None, public=True): return self.get_value("create", post_data=repo_data, filter="repository", datatype=Repository) + @requires_auth def delete(self, project): """Delete a repository @@ -110,6 +117,7 @@ def delete(self, project): result = self.make_request("delete", project, method="POST") self.make_request("delete", project, post_data=result) + @requires_auth def set_private(self, project): """Mark repository as private @@ -117,6 +125,7 @@ def set_private(self, project): """ return self.make_request("set/private", project) + @requires_auth def set_public(self, project): """Mark repository as public @@ -132,6 +141,7 @@ def list_collaborators(self, project): return self.make_request("show", project, "collaborators", filter="collaborators") + @requires_auth def add_collaborator(self, project, username): """Adds an add_collaborator to a repo @@ -140,6 +150,7 @@ def add_collaborator(self, project, username): """ return self.make_request("collaborators", project, "add", username) + @requires_auth def remove_collaborator(self, project, username): """Removes an add_collaborator from a repo diff --git a/github2/users.py b/github2/users.py index 4251cb3..4e6d337 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import (BaseData, GithubCommand, Attribute, requires_auth) import urllib @@ -73,6 +73,7 @@ def following(self, username): """ return self.make_request("show", username, "following", filter="users") + @requires_auth def follow(self, other_user): """Follow a Github user @@ -80,6 +81,7 @@ def follow(self, other_user): """ return self.make_request("follow", other_user) + @requires_auth def unfollow(self, other_user): """Unfollow a Github user From 1cc735c3f9e485fdacc7045b45c76d64b272e286 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 06:08:32 +0100 Subject: [PATCH 172/454] Added decorator for calls that change when authenticated. --- doc/api/core.rst | 1 + github2/core.py | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/doc/api/core.rst b/doc/api/core.rst index f5d7ccb..3f8f7fd 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -15,6 +15,7 @@ Core .. autofunction:: datetime_to_commitdate .. autofunction:: requires_auth +.. autofunction:: enhanced_by_auth .. autofunction:: doc_generator diff --git a/github2/core.py b/github2/core.py index 720ebba..0212f0f 100644 --- a/github2/core.py +++ b/github2/core.py @@ -68,6 +68,19 @@ def wrapper(self, *args, **kwargs): return wrapped +def enhanced_by_auth(f): + """Decorator to mark a function as enhanced by authentication + + Sets a ``enhanced_by_auth`` attribute on functions, for use in + introspection. + + :param func f: Function to wrap + """ + f.enhanced_by_auth = True + f.__doc__ += """\n.. note:: This call is enhanced with authentication""" + return f + + class GithubCommand(object): def __init__(self, request): From 83f65ececfd70f6c0f4ed24609804940bcd98e6b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 5 May 2011 06:09:38 +0100 Subject: [PATCH 173/454] Added enhanced_by_auth to users.show. There are probably a number of other calls where this should be added. --- github2/users.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/github2/users.py b/github2/users.py index 4e6d337..d936a35 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,4 +1,5 @@ -from github2.core import (BaseData, GithubCommand, Attribute, requires_auth) +from github2.core import (BaseData, GithubCommand, Attribute, enhanced_by_auth, + requires_auth) import urllib @@ -52,6 +53,7 @@ def search_by_email(self, query): """ return self.get_value("email", query, filter="user", datatype=User) + @enhanced_by_auth def show(self, username): """Get information on Github user From 67696c10422628a32a0a581fc98279e94ecc607d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 08:04:22 +0100 Subject: [PATCH 174/454] Added a link to the PyPI hosted documentation. --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index 46b7119..5b2915d 100644 --- a/README.rst +++ b/README.rst @@ -13,8 +13,10 @@ available in version 2 of the `Github API`_. future. See the ``doc/`` directory for installation instructions and usage information. +If you prefer you can also read the `documentation online`_. .. _Github API: http://develop.github.com/ +.. _documentation online: http://packages.python.org/github2 License ======= From cf62d16bbb55dd9a971b52ad71bd305fb7517cdf Mon Sep 17 00:00:00 2001 From: Patryk Zawadzki Date: Fri, 18 Feb 2011 22:17:45 +0100 Subject: [PATCH 175/454] Preliminary support for organizations --- github2/client.py | 4 +++ github2/core.py | 8 +++++- github2/organizations.py | 60 ++++++++++++++++++++++++++++++++++++++++ github2/request.py | 10 +++++++ github2/teams.py | 43 ++++++++++++++++++++++++++++ 5 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 github2/organizations.py create mode 100644 github2/teams.py diff --git a/github2/client.py b/github2/client.py index 8f97f5f..80eb39a 100644 --- a/github2/client.py +++ b/github2/client.py @@ -3,6 +3,8 @@ from github2.repositories import Repositories from github2.users import Users from github2.commits import Commits +from github2.organizations import Organizations +from github2.teams import Teams class Github(object): @@ -40,6 +42,8 @@ def __init__(self, username=None, api_token=None, debug=False, self.users = Users(self.request) self.repos = Repositories(self.request) self.commits = Commits(self.request) + self.organizations = Organizations(self.request) + self.teams = Teams(self.request) def project_for_user_repo(self, user, repo): """Return Github identifier for a user's repository diff --git a/github2/core.py b/github2/core.py index caf20a9..50c7bc6 100644 --- a/github2/core.py +++ b/github2/core.py @@ -51,9 +51,15 @@ def make_request(self, command, *args, **kwargs): filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} method = kwargs.get("method", "GET") - if post_data or method.upper() == "POST": + if method.upper() == "POST" or method.upper() == "GET" and post_data: response = self.request.post(self.domain, command, *args, **post_data) + elif method.upper() == "PUT": + response = self.request.put(self.domain, command, *args, + **post_data) + elif method.upper() == "DELETE": + response = self.request.delete(self.domain, command, *args, + **post_data) else: response = self.request.get(self.domain, command, *args) if filter: diff --git a/github2/organizations.py b/github2/organizations.py new file mode 100644 index 0000000..2cf3350 --- /dev/null +++ b/github2/organizations.py @@ -0,0 +1,60 @@ +from github2.core import BaseData, GithubCommand, Attribute +from github2.repositories import Repository +from github2.teams import Team +from github2.users import User +import urllib + + +class Organization(BaseData): + id = Attribute("The team id") + name = Attribute("The full name of the organization") + blog = Attribute("The users blog") + location = Attribute("Location of the user") + gravatar_id = Attribute("Gravatar ID") + login = Attribute("The login username") + email = Attribute("The users e-mail address") + + def is_authenticated(self): + return self.plan is not None + + def __repr__(self): + return "" % (self.login) + + +class Organizations(GithubCommand): + domain = "organizations" + + def show(self, organization): + return self.get_value(organization, filter="organization", + datatype=Organization) + + def list(self): + """Return a list of all of your organizations. + """ + return self.get_values('', filter="organizations", + datatype=Organization) + + def repositories(self): + """Return a list of all repositories in organizations you are + a member of. + """ + return self.get_values('repositories', filter="repositories", + datatype=Repository) + + def public_repositories(self, organization): + """Return a list of public repositories in an organization. + """ + return self.get_values(organization, 'public_repositories', + filter="repositories", datatype=Repository) + + def public_members(self, organization): + """Return a list of public members in an organization. + """ + return self.get_values(organization, 'public_members', + filter="users", datatype=User) + + def teams(self, organization): + """Return a list of teams in an organization. + """ + return self.get_values(organization, 'teams', + filter="teams", datatype=Team) diff --git a/github2/request.py b/github2/request.py index 557e8fd..dae1514 100644 --- a/github2/request.py +++ b/github2/request.py @@ -74,6 +74,16 @@ def post(self, *path_components, **extra_post_data): return self.make_request("/".join(path_components), extra_post_data, method="POST") + def put(self, *path_components, **extra_post_data): + path_components = filter(None, path_components) + return self.make_request("/".join(path_components), extra_post_data, + method="PUT") + + def delete(self, *path_components, **extra_post_data): + path_components = filter(None, path_components) + return self.make_request("/".join(path_components), extra_post_data, + method="DELETE") + def make_request(self, path, extra_post_data=None, method="GET"): if self.delay: since_last = (datetime.datetime.now() - self.last_request) diff --git a/github2/teams.py b/github2/teams.py new file mode 100644 index 0000000..748d312 --- /dev/null +++ b/github2/teams.py @@ -0,0 +1,43 @@ +from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.repositories import Repository +from github2.users import User + +class Team(BaseData): + id = Attribute("The team id") + name = Attribute("Name of the team") + permission = Attribute("Permissions of the team") + + def __repr__(self): + return "" % self.name + +class Teams(GithubCommand): + domain = "teams" + + def show(self, team_id): + return self.get_value(team_id, filter="team", datatype=Team) + + def members(self, team_id): + """Return a list of all team members. + """ + return self.get_values(team_id, "members", filter="users", + datatype=User) + + def repositories(self, team_id): + """Return a list of all team members. + """ + return self.get_values(team_id, "repositories", filter="repositories", + datatype=Repository) + + def add_repository(self, team_id, repository): + if isinstance(repository, Repository): + repository = repository.project + return self.make_request(team_id, "repositories", method="POST", + post_data={'name': repository}, + filter="repositories", datatype=Repository) + + def remove_repository(self, team_id, repository): + if isinstance(repository, Repository): + repository = repository.project + return self.make_request(team_id, "repositories", method="DELETE", + post_data={'name': repository}, + filter="repositories", datatype=Repository) From 688f35c11519ab7aeec6e7f1944b1e7a40d53941 Mon Sep 17 00:00:00 2001 From: Patryk Zawadzki Date: Fri, 18 Feb 2011 23:13:26 +0100 Subject: [PATCH 176/454] Accept ints --- github2/teams.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/github2/teams.py b/github2/teams.py index 748d312..078b19e 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -14,30 +14,30 @@ class Teams(GithubCommand): domain = "teams" def show(self, team_id): - return self.get_value(team_id, filter="team", datatype=Team) + return self.get_value(str(team_id), filter="team", datatype=Team) def members(self, team_id): """Return a list of all team members. """ - return self.get_values(team_id, "members", filter="users", + return self.get_values(str(team_id), "members", filter="users", datatype=User) def repositories(self, team_id): """Return a list of all team members. """ - return self.get_values(team_id, "repositories", filter="repositories", - datatype=Repository) + return self.get_values(str(team_id), "repositories", + filter="repositories", datatype=Repository) def add_repository(self, team_id, repository): if isinstance(repository, Repository): repository = repository.project - return self.make_request(team_id, "repositories", method="POST", + return self.make_request(str(team_id), "repositories", method="POST", post_data={'name': repository}, filter="repositories", datatype=Repository) def remove_repository(self, team_id, repository): if isinstance(repository, Repository): repository = repository.project - return self.make_request(team_id, "repositories", method="DELETE", + return self.make_request(str(team_id), "repositories", method="DELETE", post_data={'name': repository}, filter="repositories", datatype=Repository) From ff1b9d90e86a4bc592e8b6f6e019a9e9b7c304f5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:40:38 +0100 Subject: [PATCH 177/454] Added missing organisation attributes. --- github2/organizations.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/github2/organizations.py b/github2/organizations.py index 2cf3350..f6585f9 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import BaseData, GithubCommand, Attribute, DateAttribute from github2.repositories import Repository from github2.teams import Team from github2.users import User @@ -6,13 +6,21 @@ class Organization(BaseData): - id = Attribute("The team id") - name = Attribute("The full name of the organization") - blog = Attribute("The users blog") - location = Attribute("Location of the user") - gravatar_id = Attribute("Gravatar ID") - login = Attribute("The login username") - email = Attribute("The users e-mail address") + id = Attribute("The organization id.") + name = Attribute("The full name of the organization.") + blog = Attribute("The organization's blog.") + location = Attribute("Location of the organization.") + gravatar_id = Attribute("Gravatar ID.") + login = Attribute("The login username.") + email = Attribute("The organization's e-mail address.") + company = Attribute("The organization's company name.") + created_at = DateAttribute("The date the organization was created.", + format="commit") + following_count = Attribute("Number of users the organization is following.") + followers_count = Attribute("Number of users following this organization.") + public_gist_count = Attribute("Organization's number of active public gists.") + public_repo_count = Attribute("Organization's number of active repositories.") + permission = Attribute("Permissions within this organization.") def is_authenticated(self): return self.plan is not None From b92761a32fddc693c34bde4d59c0ea9a9722d98e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:42:44 +0100 Subject: [PATCH 178/454] Documented orgs/teams for use in Sphinx. --- github2/organizations.py | 23 +++++++++++++++-------- github2/teams.py | 22 ++++++++++++++++++++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/github2/organizations.py b/github2/organizations.py index f6585f9..26865e9 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -33,36 +33,43 @@ class Organizations(GithubCommand): domain = "organizations" def show(self, organization): + """Get information on organization + + :param str organization: organization to show + """ return self.get_value(organization, filter="organization", datatype=Organization) def list(self): - """Return a list of all of your organizations. - """ + """Get list of all of your organizations""" return self.get_values('', filter="organizations", datatype=Organization) def repositories(self): - """Return a list of all repositories in organizations you are - a member of. - """ + """Get list of all repositories in organizations you are member of""" return self.get_values('repositories', filter="repositories", datatype=Repository) def public_repositories(self, organization): - """Return a list of public repositories in an organization. + """Get list of public repositories in an organization + + :param str organization: organization to list repositories for """ return self.get_values(organization, 'public_repositories', filter="repositories", datatype=Repository) def public_members(self, organization): - """Return a list of public members in an organization. + """Get list of public members in an organization + + :param str organization: organization to list members for """ return self.get_values(organization, 'public_members', filter="users", datatype=User) def teams(self, organization): - """Return a list of teams in an organization. + """Get list of teams in an organization + + :param str organization: organization to list teams for """ return self.get_values(organization, 'teams', filter="teams", datatype=Team) diff --git a/github2/teams.py b/github2/teams.py index 078b19e..5fd67da 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -14,21 +14,34 @@ class Teams(GithubCommand): domain = "teams" def show(self, team_id): + """Get information on team_id + + :param int team_id: team to get information for + """ return self.get_value(str(team_id), filter="team", datatype=Team) def members(self, team_id): - """Return a list of all team members. + """Get list of all team members + + :param int team_id: team to get information for """ return self.get_values(str(team_id), "members", filter="users", datatype=User) def repositories(self, team_id): - """Return a list of all team members. + """Get list of all team members + + :param int team_id: team to get information for """ return self.get_values(str(team_id), "repositories", filter="repositories", datatype=Repository) def add_repository(self, team_id, repository): + """Add a repository to a team + + :param int team_id: team to add repository to + :param str repository: GitHub project + """ if isinstance(repository, Repository): repository = repository.project return self.make_request(str(team_id), "repositories", method="POST", @@ -36,6 +49,11 @@ def add_repository(self, team_id, repository): filter="repositories", datatype=Repository) def remove_repository(self, team_id, repository): + """Remove a repository to a team + + :param int team_id: team to remove project from + :param str repository: GitHub project + """ if isinstance(repository, Repository): repository = repository.project return self.make_request(str(team_id), "repositories", method="DELETE", From d0cc7d970f2ccba1c8d192ee256e4afe99588537 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:45:28 +0100 Subject: [PATCH 179/454] Use project for Teams.{add,remove}_repository. For consistency with the rest of the project. --- github2/teams.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/github2/teams.py b/github2/teams.py index 5fd67da..5ad5a9c 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -36,26 +36,26 @@ def repositories(self, team_id): return self.get_values(str(team_id), "repositories", filter="repositories", datatype=Repository) - def add_repository(self, team_id, repository): - """Add a repository to a team + def add_project(self, team_id, project): + """Add a project to a team :param int team_id: team to add repository to - :param str repository: GitHub project + :param str project: GitHub project """ - if isinstance(repository, Repository): - repository = repository.project + if isinstance(project, Repository): + project = project.project return self.make_request(str(team_id), "repositories", method="POST", - post_data={'name': repository}, + post_data={'name': project}, filter="repositories", datatype=Repository) - def remove_repository(self, team_id, repository): - """Remove a repository to a team + def remove_project(self, team_id, project): + """Remove a project to a team :param int team_id: team to remove project from - :param str repository: GitHub project + :param str project: GitHub project """ - if isinstance(repository, Repository): - repository = repository.project + if isinstance(project, Repository): + project = project.project return self.make_request(str(team_id), "repositories", method="DELETE", - post_data={'name': repository}, + post_data={'name': project}, filter="repositories", datatype=Repository) From 6feaabb94add6e8b002459bace9bc24f428ed0dc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:46:04 +0100 Subject: [PATCH 180/454] Minor PEP-8 fixes. --- github2/core.py | 2 +- github2/organizations.py | 9 ++++----- github2/teams.py | 4 +++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/github2/core.py b/github2/core.py index 50c7bc6..68ceca4 100644 --- a/github2/core.py +++ b/github2/core.py @@ -51,7 +51,7 @@ def make_request(self, command, *args, **kwargs): filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} method = kwargs.get("method", "GET") - if method.upper() == "POST" or method.upper() == "GET" and post_data: + if method.upper() in ("POST", "GET") and post_data: response = self.request.post(self.domain, command, *args, **post_data) elif method.upper() == "PUT": diff --git a/github2/organizations.py b/github2/organizations.py index 26865e9..1d735aa 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -2,7 +2,6 @@ from github2.repositories import Repository from github2.teams import Team from github2.users import User -import urllib class Organization(BaseData): @@ -63,13 +62,13 @@ def public_members(self, organization): :param str organization: organization to list members for """ - return self.get_values(organization, 'public_members', - filter="users", datatype=User) + return self.get_values(organization, 'public_members', filter="users", + datatype=User) def teams(self, organization): """Get list of teams in an organization :param str organization: organization to list teams for """ - return self.get_values(organization, 'teams', - filter="teams", datatype=Team) + return self.get_values(organization, 'teams', filter="teams", + datatype=Team) diff --git a/github2/teams.py b/github2/teams.py index 5ad5a9c..5713c5f 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -1,7 +1,8 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import BaseData, GithubCommand, Attribute from github2.repositories import Repository from github2.users import User + class Team(BaseData): id = Attribute("The team id") name = Attribute("Name of the team") @@ -10,6 +11,7 @@ class Team(BaseData): def __repr__(self): return "" % self.name + class Teams(GithubCommand): domain = "teams" From f5cb5aab8261d7747cba9859804c4d67e490a54c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:46:29 +0100 Subject: [PATCH 181/454] Initial teams/organisations documentation. Needs examples. --- doc/api/index.rst | 2 ++ doc/api/organizations.rst | 11 +++++++++++ doc/api/teams.rst | 11 +++++++++++ 3 files changed, 24 insertions(+) create mode 100644 doc/api/organizations.rst create mode 100644 doc/api/teams.rst diff --git a/doc/api/index.rst b/doc/api/index.rst index c9d2681..a12a5c0 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -6,6 +6,8 @@ API documentation client users + organizations + teams issues network repos diff --git a/doc/api/organizations.rst b/doc/api/organizations.rst new file mode 100644 index 0000000..fd48523 --- /dev/null +++ b/doc/api/organizations.rst @@ -0,0 +1,11 @@ +Organizations +============= + +.. py:currentmodule:: github2.organizations + +.. autoclass:: Organization(type) + +.. autoclass:: Organizations(type) + +Examples +-------- diff --git a/doc/api/teams.rst b/doc/api/teams.rst new file mode 100644 index 0000000..40deeea --- /dev/null +++ b/doc/api/teams.rst @@ -0,0 +1,11 @@ +Teams +===== + +.. py:currentmodule:: github2.teams + +.. autoclass:: Team(type) + +.. autoclass:: Teams(type) + +Examples +-------- From f7ecb543b2bf9d67da4e18674d461fd229a38590 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 13:57:01 +0100 Subject: [PATCH 182/454] Removed unusable Organization.is_authenticated method. --- github2/organizations.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/github2/organizations.py b/github2/organizations.py index 1d735aa..a8ab6b5 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -21,9 +21,6 @@ class Organization(BaseData): public_repo_count = Attribute("Organization's number of active repositories.") permission = Attribute("Permissions within this organization.") - def is_authenticated(self): - return self.plan is not None - def __repr__(self): return "" % (self.login) From d10c575d215ee3f2f6cbfdc353750c147d31f82e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 29 Apr 2011 09:07:13 +0100 Subject: [PATCH 183/454] Document github.users.show('') usage. This also marks the github.repos.list(None) usage as deprecated, it only worked for username/api_token authentication anyway. --- doc/api/client.rst | 4 ++++ github2/repositories.py | 14 ++++++++------ github2/users.py | 3 +++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index c1a3048..d605c5f 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -21,6 +21,10 @@ access token:: >>> github = Github(access_token="........") +.. note:: + You can retrieve the user data for an OAuth authenticated user with + ``github.users.show("")``. + Or for an unauthenticated connection:: >>> github = Github() diff --git a/github2/repositories.py b/github2/repositories.py index 1d73199..ff25481 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -53,16 +53,18 @@ def pushable(self): return self.get_values("pushable", filter="repositories", datatype=Repository) - def list(self, for_user=None): + def list(self, user=None): """Return a list of all repositories for a user. - If no user is given, repositoris for the currently logged in user are - returned. + .. deprecated: 0.4.0 + Previous releases would attempt to display repositories for the + logged-in user when ``user`` wasn't supplied. This functionality is + brittle and will be removed in a future release! - :param str for_user: optional Github user name to list repositories for + :param str user: Github user name to list repositories for """ - for_user = for_user or self.request.username - return self.get_values("show", for_user, filter="repositories", + user = user or self.request.username + return self.get_values("show", user, filter="repositories", datatype=Repository) def watch(self, project): diff --git a/github2/users.py b/github2/users.py index 4251cb3..f2f2d10 100644 --- a/github2/users.py +++ b/github2/users.py @@ -55,6 +55,9 @@ def search_by_email(self, query): def show(self, username): """Get information on Github user + if ``username`` is ``None`` or an empty string information for the + currently authenticated user is returned. + :param str username: Github user name """ return self.get_value("show", username, filter="user", datatype=User) From 98f23dda30c0597707cb047a12ebfc769feb4f64 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 19:43:47 +0100 Subject: [PATCH 184/454] Revert "Removed unusable Organization.is_authenticated method." This reverts commit f7ecb543b2bf9d67da4e18674d461fd229a38590. It absolutely does work, I just failed miserably at testing it correctly earlier :/ --- github2/organizations.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/github2/organizations.py b/github2/organizations.py index a8ab6b5..1d735aa 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -21,6 +21,9 @@ class Organization(BaseData): public_repo_count = Attribute("Organization's number of active repositories.") permission = Attribute("Permissions within this organization.") + def is_authenticated(self): + return self.plan is not None + def __repr__(self): return "" % (self.login) From a28585b627cf22a4c15a9ee9104c62f5aa2d603a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 19:49:48 +0100 Subject: [PATCH 185/454] Document the Organization.plan attribute. --- github2/organizations.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/organizations.py b/github2/organizations.py index 1d735aa..5a2fd45 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -20,6 +20,7 @@ class Organization(BaseData): public_gist_count = Attribute("Organization's number of active public gists.") public_repo_count = Attribute("Organization's number of active repositories.") permission = Attribute("Permissions within this organization.") + plan = Attribute("GitHub plan for this organization.") def is_authenticated(self): return self.plan is not None From ad2165b6f1bd1d4e7e399d536fec223e370b1113 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 20:17:07 +0100 Subject: [PATCH 186/454] Don't require sphinxcontrib-cheeseshop for running setup. It is considerably more likely a user will just want to install the package and not also build the documentation, unfortunately there isn't a depend string purely for the build_sphinx command. --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index d3e8865..c86835a 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,6 @@ platforms=["any"], packages=find_packages(exclude=['tests']), scripts=['github2/bin/github_manage_collaborators'], - setup_requires=["sphinxcontrib-cheeseshop"], install_requires=install_requires, zip_safe=True, test_suite="nose.collector", From e298676e144ebd40209438e23c0147fcb463451d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 21:18:51 +0100 Subject: [PATCH 187/454] Fixed formatting of github_manage_collaborators usage text. --- github2/bin/github_manage_collaborators | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/bin/github_manage_collaborators b/github2/bin/github_manage_collaborators index acce605..796b510 100644 --- a/github2/bin/github_manage_collaborators +++ b/github2/bin/github_manage_collaborators @@ -22,7 +22,7 @@ def parse_commandline(): parser.description = __doc__ parser.set_usage('usage: %prog [options] (list|add|remove) [collaborator].' - 'Try %prog --help for details.') + '\nTry %prog --help for details.') parser.add_option('-d', '--debug', action='store_true', help='Enables debugging mode') parser.add_option('-l', '--login', From 9b266594ffb243af6c01f8a3c705f180a50fbcb1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 21:50:26 +0100 Subject: [PATCH 188/454] Use 2to3 when running setup with Python 3. --- setup.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/setup.py b/setup.py index c86835a..c2c96ee 100644 --- a/setup.py +++ b/setup.py @@ -13,6 +13,10 @@ if sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') +extra = {} +if sys.version_info >= (3,): + extra['use_2to3'] = True + long_description = (codecs.open('README.rst', "r", "utf-8").read() + "\n" + codecs.open('NEWS.rst', "r", "utf-8").read()) @@ -44,7 +48,11 @@ "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.1", + "Programming Language :: Python :: 3.2", "Topic :: Software Development", "Topic :: Software Development :: Libraries", ], + **extra ) From 5af2ae28de66bdca156cb533f3027b6ac1bd5659 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 21:54:47 +0100 Subject: [PATCH 189/454] Switched to using entry points for github_manage_collaborators. --- github2/bin/__init__.py | 1 + ...{github_manage_collaborators => manage_collaborators.py} | 6 ++++-- setup.py | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 github2/bin/__init__.py rename github2/bin/{github_manage_collaborators => manage_collaborators.py} (98%) diff --git a/github2/bin/__init__.py b/github2/bin/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/github2/bin/__init__.py @@ -0,0 +1 @@ +# diff --git a/github2/bin/github_manage_collaborators b/github2/bin/manage_collaborators.py similarity index 98% rename from github2/bin/github_manage_collaborators rename to github2/bin/manage_collaborators.py index acce605..058267e 100644 --- a/github2/bin/github_manage_collaborators +++ b/github2/bin/manage_collaborators.py @@ -49,9 +49,11 @@ def parse_commandline(): return options, args -def main(options, args): +def main(): """This implements the actual program functionality""" + options, args = parse_commandline() + if not options.account: options.account = options.login @@ -78,4 +80,4 @@ def main(options, args): if __name__ == '__main__': - main(*parse_commandline()) + main() diff --git a/setup.py b/setup.py index c2c96ee..efaacc8 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,9 @@ keywords="git github api", platforms=["any"], packages=find_packages(exclude=['tests']), - scripts=['github2/bin/github_manage_collaborators'], + entry_points={ + 'console_scripts': ['github_manage_collaborators = github2.bin.manage_collaborators:main', ] + }, install_requires=install_requires, zip_safe=True, test_suite="nose.collector", From 3e113c3fd91c132fb36915fa2350ba6e60d39b8b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 10 May 2011 21:56:44 +0100 Subject: [PATCH 190/454] Decode HTTP response using Content-Type header's value. --- github2/request.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index dae1514..45c62cb 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,4 +1,5 @@ import datetime +import re import sys import time import httplib2 @@ -18,6 +19,20 @@ GITHUB_URL = "https://github.com" +def charset_from_headers(headers): + """Parse charset from headers + + :param httplib2.Response headers: Request headers + :return: Defined encoding, or default to ASCII + """ + match = re.search("charset=([^ ;]+)", headers.get('content-type', "")) + if match: + charset = match.groups()[0] + else: + charset = "ascii" + return charset + + class GithubError(Exception): """An error occured when making a request to the Github API.""" @@ -121,7 +136,7 @@ def raw_request(self, url, extra_post_data, method="GET"): if response.status >= 400: raise RuntimeError("unexpected response from github.com %d: %r" % ( response.status, content)) - json = simplejson.loads(content) + json = simplejson.loads(content.decode(charset_from_headers(response))) if json.get("error"): raise self.GithubError(json["error"][0]["error"]) From 46677d4575cf9c3dafee2d321937a85750c6b1a3 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 12 May 2011 16:27:35 +0100 Subject: [PATCH 191/454] Added examples for organisations support. --- doc/api/organizations.rst | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/doc/api/organizations.rst b/doc/api/organizations.rst index fd48523..56dac9c 100644 --- a/doc/api/organizations.rst +++ b/doc/api/organizations.rst @@ -9,3 +9,24 @@ Organizations Examples -------- + +Fetch Organizations Info +'''''''''''''''''''''''' + + >>> org = github.organizations.show("JNRowe-test-only") + >>> org.created_at + datetime.datetime(2011, 5, 10, 11, 37, 27) + + >>> repos = github.organizations.public_repositories(org.login) + + >>> users = github.organizations.public_members(org.login) + + >>> teams = github2.organizations.teams(org.login) + + +Fetch Authenticated User's Organizations Data +''''''''''''''''''''''''''''''''''''''''''''' + + >>> orgs = github.organizations.list() + + >>> repos = github.organizations.repositories() From 11599a443fc3f6a508583b41f7ddc03f68f1c40c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 12 May 2011 16:31:07 +0100 Subject: [PATCH 192/454] Added examples for teams support. --- doc/api/teams.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/api/teams.rst b/doc/api/teams.rst index 40deeea..ceef6d5 100644 --- a/doc/api/teams.rst +++ b/doc/api/teams.rst @@ -9,3 +9,17 @@ Teams Examples -------- + +Fetch Teams Info +'''''''''''''''' + + >>> team = github.teams.show(56855) + >>> team[0].name + u'Owners' + + >>> github.teams.members(56855) + [] + + >>> repos = github.teams.repositories(56855) + >>> repos[0].name + u'org_repo_test' From a20672ba5f4d716dd49e0d5da79eee6eba9170ff Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 15:27:33 +0100 Subject: [PATCH 193/454] Added missing versionadded directives to organisations support. --- github2/organizations.py | 2 ++ github2/teams.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/github2/organizations.py b/github2/organizations.py index 5a2fd45..87be125 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -5,6 +5,7 @@ class Organization(BaseData): + """.. versionadded:: 0.4.0""" id = Attribute("The organization id.") name = Attribute("The full name of the organization.") blog = Attribute("The organization's blog.") @@ -30,6 +31,7 @@ def __repr__(self): class Organizations(GithubCommand): + """.. versionadded:: 0.4.0""" domain = "organizations" def show(self, organization): diff --git a/github2/teams.py b/github2/teams.py index 5713c5f..9332b67 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -4,6 +4,7 @@ class Team(BaseData): + """.. versionadded:: 0.4.0""" id = Attribute("The team id") name = Attribute("Name of the team") permission = Attribute("Permissions of the team") @@ -13,6 +14,7 @@ def __repr__(self): class Teams(GithubCommand): + """.. versionadded:: 0.4.0""" domain = "teams" def show(self, team_id): From 8c98de68657e1f3633fad0a79082de7156a48edb Mon Sep 17 00:00:00 2001 From: hub-cap Date: Wed, 18 May 2011 10:28:33 -0500 Subject: [PATCH 194/454] Adding HTTP proxy settings support to the client. As well as to the request to allow github2 to be used behind a HTTP proxy --- github2/client.py | 9 +++++++-- github2/request.py | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/github2/client.py b/github2/client.py index 80eb39a..4d0b756 100644 --- a/github2/client.py +++ b/github2/client.py @@ -10,7 +10,8 @@ class Github(object): def __init__(self, username=None, api_token=None, debug=False, - requests_per_second=None, access_token=None, cache=None): + requests_per_second=None, access_token=None, cache=None, + proxy_host=None, proxy_port=8080): """ An interface to GitHub's API: http://develop.github.com/ @@ -31,13 +32,17 @@ def __init__(self, username=None, api_token=None, debug=False, or None to disable delays. The default is to disable delays (for backwards compatibility). :param str cache: a directory for caching GitHub responses. + :param str proxy_host: the hostname for the HTTP proxy, if needed. + :param str proxy_port: the hostname for the HTTP proxy, if needed (will + default to 8080 if a proxy_host is set and no port is set. """ self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, debug=self.debug, requests_per_second=requests_per_second, - access_token=access_token, cache=cache) + access_token=access_token, cache=cache, + proxy_host=proxy_host, proxy_port=proxy_port) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index dae1514..507b21e 100644 --- a/github2/request.py +++ b/github2/request.py @@ -2,6 +2,7 @@ import sys import time import httplib2 +import socks try: import json as simplejson # For Python 2.6 except ImportError: @@ -31,7 +32,7 @@ class GithubRequest(object): def __init__(self, username=None, api_token=None, url_prefix=None, debug=False, requests_per_second=None, access_token=None, - cache=None): + cache=None, proxy_host=None, proxy_port=None): """Make an API request. :see: :py:class:`github2.client.Github` @@ -52,7 +53,12 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } - self._http = httplib2.Http(cache=cache) + if proxy_host is None: + self._http = httplib2.Http(cache=cache) + else: + self._http = httplib2.Http(proxy_info=httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, + proxy_host, proxy_port), + cache=cache) def encode_authentication_data(self, extra_post_data): if self.access_token: From 16f51ce89e748d8a88f78f47c89b1e3ee9d886a5 Mon Sep 17 00:00:00 2001 From: hub-cap Date: Wed, 18 May 2011 20:37:37 -0500 Subject: [PATCH 195/454] Making socks support optional. Throws a nice error if its requested but not installed. Added extras_require to the requires libs in setup.py --- github2/request.py | 7 ++++++- setup.py | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 507b21e..4cc69f2 100644 --- a/github2/request.py +++ b/github2/request.py @@ -2,11 +2,14 @@ import sys import time import httplib2 -import socks try: import json as simplejson # For Python 2.6 except ImportError: import simplejson +try: + import socks # SOCKS support may not be installed +except ImportError: + socks = None from urlparse import (urlsplit, urlunsplit) try: from urlparse import parse_qs @@ -55,6 +58,8 @@ def __init__(self, username=None, api_token=None, url_prefix=None, } if proxy_host is None: self._http = httplib2.Http(cache=cache) + elif proxy_host and socks is None: + raise GithubError('Proxy support missing. Install a python SOCKS library.') else: self._http = httplib2.Http(proxy_info=httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, proxy_host, proxy_port), diff --git a/setup.py b/setup.py index c86835a..8af3409 100644 --- a/setup.py +++ b/setup.py @@ -33,6 +33,9 @@ zip_safe=True, test_suite="nose.collector", tests_require=['nose'], + extras_require={ + 'SOCKS': ['SocksiPy-branch==1.01'], + }, classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", From fb9558779a96c6edd9df7659462c4e2a32634741 Mon Sep 17 00:00:00 2001 From: hub-cap Date: Wed, 18 May 2011 21:21:57 -0500 Subject: [PATCH 196/454] Adding SocksiPy-branch to install.rst. --- doc/install.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/install.rst b/doc/install.rst index a7676ec..2b03428 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -24,3 +24,4 @@ following:: Gregorio for handling HTTP sessions. :pypi:`simplejson` is also required when using :mod:`github2` with Python 2.4 or 2.5. If you install via ``pip`` or ``easy_install`` the dependencies should be installed automatically for you. +:pypi:`SocksiPy-branch` is an optional dependency if proxy support is needed. From a0718f7e83d5a838166720798e108c7c7ffa7ecc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:26:01 +0100 Subject: [PATCH 197/454] Force build/lib in to sys.path for running tests. This allows us to test the 2to3 generated sources. --- tests/test_unit.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 0320ebb..ebcb2fc 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -1,7 +1,12 @@ # -*- coding: latin-1 -*- import os +import sys import unittest +# Forcibly insert path for `setup.py build` output, so that we import from the +# ``2to3`` converted sources +sys.path.insert(0, 'build/lib') + from email import message_from_file import httplib2 From 96b8076ef7da820765c7a031f5a8fea82ad825d6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:26:52 +0100 Subject: [PATCH 198/454] Added py3{1,2} to default tox environment list. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index d63158a..d7deb21 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py24, py25, py26, py27, rst, sphinx +envlist = py24, py25, py26, py27, py31, py32, rst, sphinx [testenv] deps = From 774ead8203139cc660a0e23c2c162dcd8e9c0fab Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:27:28 +0100 Subject: [PATCH 199/454] Updated tests to work correctly with Python 2 or 3. --- tests/test_unit.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index ebcb2fc..9cdc4ff 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -13,6 +13,7 @@ from github2.issues import Issue from github2.client import Github +from github2.request import charset_from_headers HTTP_DATA_DIR = "tests/data/" @@ -32,8 +33,8 @@ def request(self, uri, method='GET', body=None, headers=None, file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) if os.path.exists(file): response = message_from_file(open(file)) - body = response.get_payload() headers = httplib2.Response(response) + body = response.get_payload().encode(charset_from_headers(headers)) return (headers, body) else: return (httplib2.Response({"status": "404"}), @@ -45,7 +46,10 @@ class ReprTests(unittest.TestCase): def test_issue(self): """Issues can have non-ASCII characters in the title.""" - i = Issue(title=u'abcdé') + title = 'abcdé' + if sys.version_info[0] == 2: + title = title.decode("utf-8") + i = Issue(title=title) self.assertEqual(str, type(repr(i))) From 3e19ca4f5ab7941319a39f07c7ffedeb45da496b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:28:56 +0100 Subject: [PATCH 200/454] Don't use nose's with-id plugin anymore. Identifier dumps from Python 3 can't be loaded in Python 2. It can be used on individual basis when needed. --- setup.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 0894cc6..e246375 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,7 +6,6 @@ upload-dir = docs/.build/html cover-package = github2 detailed-errors = 1 with-coverage = 1 -with-id = 1 [build_sphinx] source-dir = doc build-dir = doc/.build From 20739528765986dd51ff12dde343b5914f625184 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:31:03 +0100 Subject: [PATCH 201/454] Always re-create the build dir between nose runs. --- tox.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tox.ini b/tox.ini index d7deb21..66b3e7f 100644 --- a/tox.ini +++ b/tox.ini @@ -6,6 +6,8 @@ deps = nose coverage commands = + rm -rf build + {envpython} setup.py build nosetests tests [testenv:rst] deps = From ac7378575a8225506049ad34722ffb09eca6f27f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 18:35:08 +0100 Subject: [PATCH 202/454] Added basic tests for charset_from_headers(). --- tests/test_charset_header.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/test_charset_header.py diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py new file mode 100644 index 0000000..3f55689 --- /dev/null +++ b/tests/test_charset_header.py @@ -0,0 +1,18 @@ +import sys + +from nose.tools import assert_equals + +# Forcibly insert path for `setup.py build` output, so that we import from the +# ``2to3`` converted sources +sys.path.insert(0, 'build/lib') + +from github2.request import charset_from_headers + + +def no_match_test(): + d = {} + assert_equals("ascii", charset_from_headers(d)) + +def utf_test(): + d = {'content-type': 'application/json; charset=utf-8'} + assert_equals("utf-8", charset_from_headers(d)) From a8eaab95de6076f9256e7af3568145d80e6f5243 Mon Sep 17 00:00:00 2001 From: hub-cap Date: Thu, 19 May 2011 10:37:30 -0500 Subject: [PATCH 203/454] Adding doc for proxy support. --- AUTHORS | 2 +- doc/api/client.rst | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index fd6663d..e2c50c8 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,4 +23,4 @@ Barthelemy Dagenais Surajram Kumarave broderboy Patryk Zawadzki -hub-cap +Michael Basnight diff --git a/doc/api/client.rst b/doc/api/client.rst index d605c5f..86c8122 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -41,3 +41,13 @@ in:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......", ... requests_per_second=1) + +If you wish to use the library with a HTTP proxy, you will require a Python +SOCKS module installed. :pypi:`SocksiPy-branch` is the module we test with, but +various forks are available. Pass in the ``proxy_host`` and optionally +``proxy_port`` settings to enable it. The default for ``proxy_port``, if not +given, is 8080:: + + >>> from github2.client import Github + >>> github = Github(username="ask", api_token=".......", + ... proxy_host="my.proxy.com", proxy_port=9000) From 0b22cb08e632def238e7764215f0c3d64b59eb5d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 23:10:01 +0100 Subject: [PATCH 204/454] Minor PEP-8 fixes. --- github2/client.py | 3 ++- github2/request.py | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/github2/client.py b/github2/client.py index 4d0b756..cf331fe 100644 --- a/github2/client.py +++ b/github2/client.py @@ -42,7 +42,8 @@ def __init__(self, username=None, api_token=None, debug=False, debug=self.debug, requests_per_second=requests_per_second, access_token=access_token, cache=cache, - proxy_host=proxy_host, proxy_port=proxy_port) + proxy_host=proxy_host, + proxy_port=proxy_port) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index 4cc69f2..bfc099d 100644 --- a/github2/request.py +++ b/github2/request.py @@ -7,7 +7,7 @@ except ImportError: import simplejson try: - import socks # SOCKS support may not be installed + import socks # SOCKS support may not be installed except ImportError: socks = None from urlparse import (urlsplit, urlunsplit) @@ -59,11 +59,12 @@ def __init__(self, username=None, api_token=None, url_prefix=None, if proxy_host is None: self._http = httplib2.Http(cache=cache) elif proxy_host and socks is None: - raise GithubError('Proxy support missing. Install a python SOCKS library.') + raise GithubError('Proxy support missing. ' + 'Install a Python SOCKS library.') else: - self._http = httplib2.Http(proxy_info=httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, - proxy_host, proxy_port), - cache=cache) + proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, + proxy_host, proxy_port), + self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) def encode_authentication_data(self, extra_post_data): if self.access_token: From 4fb544c7d73b7e12ee90e3af338595035c7754d1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 23:10:42 +0100 Subject: [PATCH 205/454] Mark proxy support as supported from 0.4.0. --- github2/client.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/github2/client.py b/github2/client.py index cf331fe..3ac1dd8 100644 --- a/github2/client.py +++ b/github2/client.py @@ -20,6 +20,8 @@ def __init__(self, username=None, api_token=None, debug=False, The ``requests_per_second`` parameter .. versionadded:: 0.3.0 The ``cache`` and ``access_token`` parameters + .. versionadded:: 0.4.0 + The ``proxy_host`` and ``proxy_port`` parameters :param str username: your own GitHub username. :param str api_token: can be found at https://github.com/account @@ -34,7 +36,7 @@ def __init__(self, username=None, api_token=None, debug=False, :param str cache: a directory for caching GitHub responses. :param str proxy_host: the hostname for the HTTP proxy, if needed. :param str proxy_port: the hostname for the HTTP proxy, if needed (will - default to 8080 if a proxy_host is set and no port is set. + default to 8080 if a proxy_host is set and no port is set). """ self.debug = debug From d1a15ec4169ebbf02ac046fb00786ce1104be9b1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 19 May 2011 23:34:25 +0100 Subject: [PATCH 206/454] Updated NEWS entries to 7fa54cb3. --- NEWS.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 12b4aaf..b14f797 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,6 +3,19 @@ User-visible changes .. contents:: +``master`` branch +----------------- + +* Python 3 compatibility +* The ``github_manage_collaborators`` script will be installed using + ``entry_points``, which means there is now a run-time dependency on + distribute_ +* Support for managing `teams and organisations`_ +* HTTP proxy support + +.. _teams and organisations: http://develop.github.com/p/orgs.html +.. _distribute: http://pypi.python.org/pypi/distribute + 0.3.0 - 2011-04-13 ------------------ From 45319411dbacc4a5ac4c7ebb142200c61b07a4f6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:46:20 +0100 Subject: [PATCH 207/454] Minor grammar fix to contributing doc. --- doc/contributing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index bd27496..56e54f3 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -39,8 +39,8 @@ invaluable, see the nose_ documentation for usage information. There is a tox_ configuration file included in the repository, you can use it to run the tests against multiple Python versions with a single command. The configuration file also includes targets for testing the documentation. The -tox_ documentation includes a fantastic number of examples on how to use it, or -add new testing targets. +tox_ documentation includes a fantastic number of examples on how to use it, and +advice on adding new testing targets. .. todo:: Add topic branches and pull request usage examples, but most git users are From 277fff662b76312e3467b598e44eb912091af519 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:49:13 +0100 Subject: [PATCH 208/454] Added a reference to the pre-built documentation in index.rst. Should make it easier to find for those opening the text in an editor. --- doc/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/index.rst b/doc/index.rst index 93a112f..6d94a9f 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -3,6 +3,10 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. +.. + If you prefer you can also read the pre-built documentation at + http://packages.python.org/github2 + .. module:: github2 :synopsis: GitHub API v2 library for Python From a19b25484933e04431ff29584ba9b9f6c341e4d4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:51:05 +0100 Subject: [PATCH 209/454] Added quick navigation links to doc front page. --- doc/index.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/index.rst b/doc/index.rst index 6d94a9f..6a7e40c 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -25,6 +25,10 @@ You should read the developer documentation for the `Github API`_ first. .. Note:: This software is not finished. And is likely to change in the near future. +:Git repository: https://github.com/ask/python-github2/ +:Issue tracker: https://github.com/ask/python-github2/issues/ +:Contributors: https://github.com/ask/python-github2/contributors/ + .. _Github API: http://develop.github.com/ Contents From f0bbe57077421c273fa59cf9487f66d466f2a395 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:52:18 +0100 Subject: [PATCH 210/454] Don't duplicate sys path mangling in tests. --- tests/_setup.py | 6 ++++++ tests/test_charset_header.py | 6 +----- tests/test_unit.py | 4 +--- 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 tests/_setup.py diff --git a/tests/_setup.py b/tests/_setup.py new file mode 100644 index 0000000..c410274 --- /dev/null +++ b/tests/_setup.py @@ -0,0 +1,6 @@ +import sys + +# Forcibly insert path for `setup.py build` output, so that we import from the +# ``2to3`` converted sources. This is an ugly hack, but it saves an enormous +# amount of grief in handling Python 2 and 3. +sys.path.insert(0, 'build/lib') diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py index 3f55689..073e10c 100644 --- a/tests/test_charset_header.py +++ b/tests/test_charset_header.py @@ -1,11 +1,7 @@ -import sys +import _setup from nose.tools import assert_equals -# Forcibly insert path for `setup.py build` output, so that we import from the -# ``2to3`` converted sources -sys.path.insert(0, 'build/lib') - from github2.request import charset_from_headers diff --git a/tests/test_unit.py b/tests/test_unit.py index 9cdc4ff..0a4b794 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -3,9 +3,7 @@ import sys import unittest -# Forcibly insert path for `setup.py build` output, so that we import from the -# ``2to3`` converted sources -sys.path.insert(0, 'build/lib') +import _setup from email import message_from_file From 9358f8b8404cb6e0ed09a140779b06ffaab06578 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:53:23 +0100 Subject: [PATCH 211/454] Break HttpMock out of test_unit for use elsewhere. --- tests/test_unit.py | 39 +++++---------------------------------- tests/utils.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 tests/utils.py diff --git a/tests/test_unit.py b/tests/test_unit.py index 0a4b794..ce699ca 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -1,42 +1,14 @@ # -*- coding: latin-1 -*- -import os -import sys -import unittest import _setup -from email import message_from_file - -import httplib2 +import sys +import unittest from github2.issues import Issue from github2.client import Github -from github2.request import charset_from_headers - - -HTTP_DATA_DIR = "tests/data/" - - -class HttpMock(object): - """Simple Http mock that returns saved entries - - Implementation tests should never span network boundaries - """ - - def __init__(self, cache=None, timeout=None, proxy_info=None): - pass - def request(self, uri, method='GET', body=None, headers=None, - redirections=5, connection_type=None): - file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) - if os.path.exists(file): - response = message_from_file(open(file)) - headers = httplib2.Response(response) - body = response.get_payload().encode(charset_from_headers(headers)) - return (headers, body) - else: - return (httplib2.Response({"status": "404"}), - "Resource unavailable from test data store") +import utils class ReprTests(unittest.TestCase): @@ -54,11 +26,10 @@ def test_issue(self): class RateLimits(unittest.TestCase): """Test API rate-limitting""" def setUp(self): - self.old_httplib2 = httplib2.Http - httplib2.Http = HttpMock + utils.set_http_mock() def tearDown(self): - httplib2.Http = self.old_httplib2 + utils.unset_http_mock() def test_delays(self): """Test call delay is at least one second""" diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..0d804c9 --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,44 @@ +import _setup + +import os + +from email import message_from_file + +import httplib2 + +from github2.request import charset_from_headers + + +HTTP_DATA_DIR = "tests/data/" + +ORIG_HTTP_OBJECT = httplib2.Http + + +class HttpMock(object): + """Simple Http mock that returns saved entries + + Implementation tests should never span network boundaries + """ + + def __init__(self, cache=None, timeout=None, proxy_info=None): + pass + + def request(self, uri, method='GET', body=None, headers=None, + redirections=5, connection_type=None): + file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) + if os.path.exists(file): + response = message_from_file(open(file)) + headers = httplib2.Response(response) + body = response.get_payload().encode(charset_from_headers(headers)) + return (headers, body) + else: + return (httplib2.Response({"status": "404"}), + "Resource %r unavailable from test data store" % file) + + +def set_http_mock(): + httplib2.Http = HttpMock + + +def unset_http_mock(): + httplib2.Http = ORIG_HTTP_OBJECT From f2f0cdfc60d5eec33d54fa5ff02324aedebcfffc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 06:55:01 +0100 Subject: [PATCH 212/454] Added simple Github.project_for_user_repo test. --- tests/test_unit.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index ce699ca..31e1300 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -5,6 +5,8 @@ import sys import unittest +from nose.tools import assert_equals + from github2.issues import Issue from github2.client import Github @@ -49,3 +51,9 @@ def test_delays(self): self.assertTrue(delta_seconds >= 2, "Expected .5 reqs per second to require a 2 second delay between " "calls.") + + +def test_project_for_user_repo(): + client = Github() + assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), + 'JNRowe/misc-overlay') From 41de1bbb42e3fb11f5c86f853fea9186fb304139 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:21:53 +0100 Subject: [PATCH 213/454] Use pypi role to refer to packages in docs. --- doc/contributing.rst | 12 ++++++------ doc/install.rst | 15 ++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index 56e54f3..6a4c618 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -32,13 +32,13 @@ Tests Unfortunately there aren't many tests for ``python-github`` at the moment, any patches to increase test coverage are greatly appreciated -The preferred way to run the package's tests is with nose_. ``nosetests`` -provides excellent reporting options and its additional features make it -invaluable, see the nose_ documentation for usage information. +The preferred way to run the package's tests is with :pypi:`nose`. +``nosetests`` provides excellent reporting options and its additional features +make it invaluable, see the nose_ documentation for usage information. -There is a tox_ configuration file included in the repository, you can use it to -run the tests against multiple Python versions with a single command. The -configuration file also includes targets for testing the documentation. The +There is a :pypi:`tox` configuration file included in the repository, you can +use it to run the tests against multiple Python versions with a single command. +The configuration file also includes targets for testing the documentation. The tox_ documentation includes a fantastic number of examples on how to use it, and advice on adding new testing targets. diff --git a/doc/install.rst b/doc/install.rst index 2b03428..9625a42 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -4,12 +4,12 @@ Installation You can install :mod:`github2` either via the Python Package Index (PyPI) or from source. -To install using ``pip``:: +To install using :pypi:`pip`:: $ pip install github2 # to install in Python's site-packages $ pip install --install-option="--user" github2 # to install for a single user -To install using ``easy_install``:: +To install using :pypi:`easy_install `:: $ easy_install github2 @@ -20,8 +20,9 @@ following:: # python setup.py install # to install in Python's site-packages $ python setup.py install --user # to install for a single user -:mod:`github2` depends on :pypi:`httplib2`, an excellent package by Joe -Gregorio for handling HTTP sessions. :pypi:`simplejson` is also required when -using :mod:`github2` with Python 2.4 or 2.5. If you install via ``pip`` or -``easy_install`` the dependencies should be installed automatically for you. -:pypi:`SocksiPy-branch` is an optional dependency if proxy support is needed. +:mod:`github2` depends on :pypi:`httplib2`, an excellent package by Joe Gregorio +for handling HTTP sessions. :pypi:`simplejson` is also required when using +:mod:`github2` with Python 2.4 or 2.5. If you install via :pypi:`pip` or +:pypi:`easy_install ` the dependencies should be installed +automatically for you. :pypi:`SocksiPy-branch` is an optional dependency if +proxy support is needed. From 4de5910e9d51a91f9d996a16437cd1521617460e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:22:55 +0100 Subject: [PATCH 214/454] Removed remaining python-github2 reference in contributing doc. --- doc/contributing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index 6a4c618..b355750 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -29,8 +29,8 @@ Tests ----- .. note:: - Unfortunately there aren't many tests for ``python-github`` at the moment, - any patches to increase test coverage are greatly appreciated + Unfortunately there aren't many tests for ``github2`` at the moment, any + patches to increase test coverage are greatly appreciated The preferred way to run the package's tests is with :pypi:`nose`. ``nosetests`` provides excellent reporting options and its additional features From 0c4e0be3f05c7f8144897beafb42323bd9c07890 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:25:59 +0100 Subject: [PATCH 215/454] Added notes on Python compatiblity to contributing doc. --- doc/contributing.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/doc/contributing.rst b/doc/contributing.rst index b355750..a0e303f 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -42,6 +42,21 @@ The configuration file also includes targets for testing the documentation. The tox_ documentation includes a fantastic number of examples on how to use it, and advice on adding new testing targets. +Notes +----- + +:mod:`github2` supports Python 2.4-3.2, so some attention to compatibility +between Python releases needs to be made when writing code. + +The official Python docs provide a fantastically useful `index of changes`_ +between versions. + +.. note:: + If you don't have access to multiple releases of Python it is still possible + to contribute. However, it may take a little longer to merge your pull + request if additional work needs to be done to make the code compatible with + all the supported Python releases. + .. todo:: Add topic branches and pull request usage examples, but most git users are likely to be comfortable with these already @@ -52,3 +67,4 @@ advice on adding new testing targets. .. _autodoc: http://sphinx.pocoo.org/ext/autodoc.html#module-sphinx.ext.autodoc .. _nose: http://somethingaboutorange.com/mrl/projects/nose/ .. _tox: http://pypi.python.org/pypi/tox/ +.. _index of changes: http://docs.python.org/whatsnew/index.html From 09e20199240b4de46d9e2488859a4d8769d11484 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:30:31 +0100 Subject: [PATCH 216/454] Use nose assertion wrappers. This is entirely aesthetic. --- tests/test_unit.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index 31e1300..d0e0d45 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -5,7 +5,7 @@ import sys import unittest -from nose.tools import assert_equals +from nose.tools import (assert_equals, assert_true) from github2.issues import Issue from github2.client import Github @@ -22,7 +22,7 @@ def test_issue(self): if sys.version_info[0] == 2: title = title.decode("utf-8") i = Issue(title=title) - self.assertEqual(str, type(repr(i))) + assert_equals(str, type(repr(i))) class RateLimits(unittest.TestCase): @@ -48,9 +48,9 @@ def test_delays(self): delta = end - start delta_seconds = delta.days * 24 * 60 * 60 + delta.seconds - self.assertTrue(delta_seconds >= 2, - "Expected .5 reqs per second to require a 2 second delay between " - "calls.") + assert_true(delta_seconds >= 2, + "Expected .5 reqs per second to require a 2 second delay " + "between calls.") def test_project_for_user_repo(): From 75281c37918cf2cee722772710907f321367600d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:31:10 +0100 Subject: [PATCH 217/454] Removed redundant username/api_token handling in test_delays. --- tests/test_unit.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index d0e0d45..3c1d060 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -2,6 +2,7 @@ import _setup +import datetime import sys import unittest @@ -35,11 +36,7 @@ def tearDown(self): def test_delays(self): """Test call delay is at least one second""" - import datetime - USERNAME = '' - API_KEY = '' - client = Github(username=USERNAME, api_token=API_KEY, - requests_per_second=.5) + client = Github(requests_per_second=.5) client.users.show('defunkt') start = datetime.datetime.now() client.users.show('mojombo') From f5d63f298aa0897e0f358b7801147bfc5d23ec64 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:32:58 +0100 Subject: [PATCH 218/454] Added tests for GithubRequest.encode_authentication_data(). --- tests/test_request.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/test_request.py diff --git a/tests/test_request.py b/tests/test_request.py new file mode 100644 index 0000000..a36086f --- /dev/null +++ b/tests/test_request.py @@ -0,0 +1,33 @@ +import _setup + +import unittest + +from nose.tools import (assert_equals, assert_true) + +from github2 import request + + +class TestAuthEncode(unittest.TestCase): + """Test processing of authentication data""" + def setUp(self): + self.r = request.GithubRequest() + + def test_unauthenticated(self): + assert_equals('', self.r.encode_authentication_data({})) + + def test_access_token(self): + self.r.access_token = 'hex string' + assert_equals('access_token=hex+string', + self.r.encode_authentication_data({})) + assert_true('access_token=hex+string' in + self.r.encode_authentication_data({'key': 'value'})) + self.r.access_token = None + + def test_user_token(self): + self.r.username = 'user' + self.r.api_token = 'hex string' + assert_equals('login=user&token=hex+string', + self.r.encode_authentication_data({})) + assert_true('login=user&token=hex+string' in + self.r.encode_authentication_data({'key': 'value'})) + self.r.username = self.r.api_token = None From a1aa63a9ff1887244da3c8bc8220cc5dcbd5993e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:34:50 +0100 Subject: [PATCH 219/454] Added test specific Python compatibility notes. --- doc/contributing.rst | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/doc/contributing.rst b/doc/contributing.rst index a0e303f..b94e672 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -57,6 +57,23 @@ between versions. request if additional work needs to be done to make the code compatible with all the supported Python releases. +Test specific concerns +'''''''''''''''''''''' + +The :mod:`unittest` module received a massive upgrade in Python 2.7, including +some very useful new functionality. However, retaining compatibility with older +Python versions is very important, so this new functionality can't be used. +Some specific issues to bear in mind are listed below. + +Many assertions, such as :meth:`~unittest.TestCase.assertIn` and +:meth:`~unittest.TestCase.assertGreater`, only exist from 2.7, and can't be used. +The simple workaround is to evaluate an expression to test with +:meth:`~unittest.TestCase.assertTrue` + +The incredibly functions for skipping tests(:func:`~unittest.skip`) and marking +expected failures(:func:`~unittest.expectedFailure`) were only added in 2.7, and +unfortunately can't be used. + .. todo:: Add topic branches and pull request usage examples, but most git users are likely to be comfortable with these already From 32917bb599afed796f4b72c05f6da66fe1fcc81f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:38:23 +0100 Subject: [PATCH 220/454] Added simple user data tests. --- ...w,defunkt,379cb3d60bbce3d9b30e6e6aae66840c | 16 ++++---- tests/test_user.py | 41 +++++++++++++++++++ 2 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 tests/test_user.py diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c index 77b8df0..3a94ea7 100644 --- a/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c @@ -1,14 +1,14 @@ -status: 200 -x-ratelimit-remaining: 59 +status: 304 +x-ratelimit-remaining: 56 content-location: https://github.com/api/v2/json/user/show/defunkt -x-runtime: 233ms -content-length: 390 -server: nginx/0.7.67 connection: keep-alive +content-length: 386 +server: nginx/0.7.67 +x-runtime: 16ms x-ratelimit-limit: 60 -etag: "53961f440447e2770b1386199b7a6ef3" +etag: "144f668d7265bcd9d61bc1fb91e9caeb" cache-control: private, max-age=0, must-revalidate -date: Mon, 11 Apr 2011 14:45:49 GMT +date: Sun, 22 May 2011 04:32:12 GMT content-type: application/json; charset=utf-8 -{"user":{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco, CA","public_repo_count":92,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":2244,"login":"defunkt","email":"chris@wanstrath.com"}} \ No newline at end of file +{"user":{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":90,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":2593,"login":"defunkt","email":"chris@wanstrath.com"}} \ No newline at end of file diff --git a/tests/test_user.py b/tests/test_user.py new file mode 100644 index 0000000..bf36abb --- /dev/null +++ b/tests/test_user.py @@ -0,0 +1,41 @@ +import _setup + +import unittest + +from nose.tools import assert_equals + +import utils + +from github2.client import Github + + +class UserProperties(unittest.TestCase): + """Test user property handling""" + def setUp(self): + utils.set_http_mock() + self.client = Github() + + def tearDown(self): + utils.unset_http_mock() + + def test_user(self): + user = self.client.users.show('defunkt') + assert_equals(user.blog, 'http://chriswanstrath.com/') + assert_equals(user.company, 'GitHub') + assert_equals(user.email, 'chris@wanstrath.com') + assert_equals(user.location, 'San Francisco') + assert_equals(user.login, 'defunkt') + assert_equals(user.name, 'Chris Wanstrath') + + def test_meta(self): + user = self.client.users.show('defunkt') + # Difficult to handle created_at attribute as its content varies + # depending on API path. + #assert_equals(user.created_at, + # datetime.datetime(2007, 10, 19, 22, 24, 19)) + assert_equals(user.followers_count, 2593) + assert_equals(user.following_count, 212) + assert_equals(user.gravatar_id, 'b8dbb1987e8e5318584865f880036796') + assert_equals(user.id, 2) + assert_equals(user.public_gist_count, 277) + assert_equals(user.public_repo_count, 90) From e037092afea907bb8cf13f9bf5349ca87033a20d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:42:13 +0100 Subject: [PATCH 221/454] Added user followers/following tests. --- ...unkt,followers,aba15090598242283ff9d4a8b5969f52 | 14 ++++++++++++++ ...unkt,following,dc4e4027f60d0737177e4d793ff8a5de | 14 ++++++++++++++ tests/test_user.py | 8 +++++++- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 create mode 100644 tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 b/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 new file mode 100644 index 0000000..9370134 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/user/show/defunkt/followers +connection: keep-alive +content-length: 29004 +server: nginx/0.7.67 +x-runtime: 214ms +x-ratelimit-limit: 60 +etag: "e5fafda9776b6ebe037bc5cea456ca6a" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 04:32:08 GMT +content-type: application/json; charset=utf-8 + +{"users":["jnewland","pjhyett","cnix","dustym","choonkeat","nakajima","mtodd","bumi","takeo","bmizerany","zachinglis","evilchelu","manalang","mmmurf","hornbeck","mindy","therealadam","vanpelt","alexcharlie","seaofclouds","luke0x","rphillips","Caged","kamal","eventualbuddha","bigfleet","jacques","tim","KirinDave","ddemaree","benschwarz","cpjolicoeur","mmcgrana","mdarby","anildigital","ryanahamilton","entangledstate","coty","broughcut","atduskgreg","liz","brianleroux","kballard","haraldmartin","walf443","ss","elliottcable","joshuabates","eastmedia","mattman","imajes","saimonmoore","hoverbird","Fil","nesquena","membogg","ayn","jbritten","peterba","nick","willcodeforfoo","mojombo","rsl","caffo","khigia","BrianTheCoder","tkofol","dstrelau","sant0sk1","joshuaclayton","cee-dub","tooeasy","quirkey","eduardo","raja","timshadel","rsanheim","tokumine","statik","mattly","xilo32","yaroslav","sr","hchoroomi","lgn21st","purzelrakete","seven1m","douglasjarquin","ihower","freels","adamstac","fauxparse","duncanbeevers","jasonwatkinspdx","spohlenz","joaovitor","mikedamage","alainravet","whomwah","ooodigi","nerdrocket","zmack","mulder","kivanio","vlandham","yizzreel","ryanb","cho45","sandro","ratchetcat","jgross","jasherai","jw-00000","zubin","loe","fred","stuartsaunders","skippy","dgiunta","monde","charlenopires","devn","softprops","madx","lukebayes","blech75","newtonapple","edbond","ncr","boboroshi","holtonma","jhubert","libin","bastos","nullobject","croaky","trevorturk","fabioespindula","nick-b","sikachu","schacon","harper","envoked","guitsaru","brianmario","subwindow","Arthur","sob","tiagowhite","jasontorres","lawrencecurtis","bterlson","mattsears","patrickdet","academician","markpuck","mokolabs","baron","arikan","ryanking","willemderu","entombedvirus","cyx","galfert","heycarsten","shallwelin","sbfaulkner","jaehess","jonathannelson","helo","schwabsauce","gusgollings","adzap","joefiorini","trestrantham","hairballopolis","daveliu","thetacom","genki","guillermo","tekin","nextmat","hans","colin","Roman2K","kakutani","qrush","hpoydar","goodtouch","LimeHat","grobie","tosh","epitron","inkdeep","voitto","kvnsmth","darrenhinderer","njonsson","bianster","shanesveller","technicalpickles","erikj","lancecarlson","briandoll","digitalextremist","KevBurnsJr","slim","clarkware","jasoncarter","Krishna","kirk","tinogomes","wfarr","intabulas","hardbap","aziz","atmos","robbyrussell","codeslinger","evandrodutra","martinisoft","smtlaissezfaire","larrywright","joshknowles","evanwalsh","jchris","jqr","jbarnette","rafaelss","dsboulder","res0nat0r","sunfmin","topfunky","NigelThorne","supaspoida","yipstar","davidwparker","jinzhu","johnpaulashenfelter","joshua","agile","cored","visnup","calendaraboutnothing","eoin","deepak","dsparling","oleganza","pengwynn","christophermoura","jgagne33","mhutchin","matsuda","zak","railssummit","taylorrf","peleteiro","greatseth","blackwinter","rberger","elim","eric","collin","henryhamon","shinzui","tongueroo","vanntastic","swdyh","peterpunk","kabnot","ozeias","mwilliams","kamipo","bezugen","arthurgeek","fairos","webmat","bonachela","foysavas","mojodna","dwabnitz","fuzzytone","anthonybarone","mkhl","botanicus","kavu","jhsu","delameko","uhhuhyeah","jcf","nrk","brycethornton","maxdevel","ashleyw","zegomesjf","rjspotter","tjweir","slawcup","pjdavis","ngerakines","rwc9u","aka47","Bregor","oristian","JackDanger","amatsuda","josespinal","sleistner","jdp","mkrisher","rbarazi","mattmatt","luisbebop","rcrowley","anotherjesse","semikolon","albertoperdomo","kaikuehne","marcric","pardel","rads","altamic","badcarl","Marat","rfwatson","jesseclark","iamwilhelm","rtyler","kovacs","alexvollmer","rkh","joelparkerhenderson","shayfrendt","pcalcado","marcelinollano","jngo","robertpfeiffer","ukd1","jpablobr","alfredwesterveld","matthewford","haws","visionmedia","ekinci","hellekin","paulgrunt","seouri","pauldix","CodeOfficer","manuelmeurer","kristopher","mattyoho","neilmock","igorgue","miyagawa","akm","ieure","mwunsch","kairichard","leah","Siansor","kiko","breily","elmer","vshih","samsoffes","graysky","leandrosilva","blinton","ashchristopher","bensie","yura","adamaig","erotte","fernholz","jamesrose","michaeldv","raganw","sstephenson","capotej","BeamerCola","damon","amiel","iamstillalive","rduarte","jney","rymai","jtadeulopes","caironoleto","talboito","alexmchale","davglass","lian","rondevera","shashi","dira","GreenDragon","yonkeltron","jeanmartin","shelling","tehcurtis","gnlnx","joshng","bartuer","bruce","adamv","yasu","cjmartin","jarodl","jonatas","ronnieliew","polly","nonsequitur","marclove","arya","splattael","mcfearsome","skorecky","jaygooby","iande","brosner","brett","jivko","cmelbye","edwingo","hunab","zipme","mnaberez","nimo","justinlilly","howiworkdaily","johnbender","jezdez","petercoulton","juliend2","dhou","enricob","gigamo","markstephenson","gregnewman","rubify","spagalloco","Xac","attack","esycat","webiest","ogijun","travisjeffery","moongtook","meritt","stephencelis","doowttam","mrchrisadams","riethmayer","utahcreative","bkrsta","program247365","montylounge","renatocarvalho","NYiPhoneDeveloper","novas0x2a","rblackwe","basiszwo","deminew","stan","sgarza","epocRepo","georgi","radamant","munjal","jgchristopher","macro","Gig23","diogenesis","poshboytl","pablete","mpreath","ujihisa","Sixeight","andrewhavck","alexch","skateinmars","darwin","EvanBurchard","cytobank-matthew","kidpollo","kjwierenga","psyche","antrover","andrehjr","iamsolarpowered","horaci","rishav","joshbuddy","rlr","wnetoa","simplabs","alex","dustinwhittle","samvincent","memiux","ktlacaelel","rubysolo","chillicoder","teepark","tonyl","hal0thane","james-baker","stuffmc","sepposade","jastix","vianaweb","FDj","auser","sacrosby","ascarter","tdmackey","julienXX","adurity","carlp","asenchi","mazebuhu","caseyhelbling","mikereedell","verbal","satynos","cloudhead","packagethief","bsy","robhurring","davidx","foxscan","detrain","jawspeak","jschoolcraft","lokeshk","yashh","jrsims","moorage","thisgirlangie","jdamick","dsully","gregf","sjain","hughdbrown","webandy","fairchild","wesbillman","mvj3","scrogson","gtcaz","rcarver","superfeedr","didenko","JonRohan","miamiruby","nelix","rvwoens","coiscir","javan","haru01","dastels","artificemm","docgecko","electricgraffitti","detansinn","chunzi","m3talsmith","priteau","jptoto","amerine","jyr","zodman","chipski","christhomson","dayne","mmalone","ccsmail","jeffp","natebunnyfield","f1vlad","joshbutner","sferik","johan--","joahking","aaandre","dennyhalim","gregcopenhaver","teknopartz","CodeMonkeyKevin","zgchurch","vangberg","benaldred","kaichen","ap0ught","jnbn","holywarez","dambalah","juarlex","nevilleburnell","symlink","mdwrigh2","agibralter","kognate","sroegner","daksis","philipefarias","ajsharp","mwhooker","maca","kalkov","synaptic","wolverian","rnaveiras","jjcall","matthewfl","mathieuravaux","temojin","graphicsop","m7d","bbuckley","gabrielfalcao","mamuso","deepthawtz","marksands","tarellel","josh","KieranP","mrkn","raul","sd-fritze","dapi","jaryl","kylebrowning","jimpick","nikolay","joshnesbitt","maggit","xinuc","marciotrindade","bradchoate","bs","peterz","wvl","csamuel","jamesarosen","joshourisman","kacy","martinciu","osde8info","aliem","gabrielg","jaknowlden","evanfarrar","mivaul","shock","nicksergeant","lucian","Asciant","thoas","bicherele","Csele","uamuamuam","i0n","benhaan","jodosha","JonGretar","evolve2k","jondruse","polera","lr","badboy","mikelim","irfn","tangtao","st3f","thegeekbird","tweak","hackedunit","christophsturm","tobi","fvonx","marcoow","pcreux","vapidbabble","reidmix","jherdman","chrisdrackett","overture8","jits","daz","lazzarello","asoltys","Hates","mgomes","tlrobinson","bluehavana","janl","sah","gussan","brynary","adolfosousa","cypher","wintermi","bemurphy","neduma","nowells","hojberg","muddana","juvenn","jobscry","Sutto","arjunghosh","rorrego","jwilkins","nrolland","marcinbunsch","neophiliac","ranza","dusty","hoggarth","sriprasanna","davidhalldor","josephsofaer","rbriank","andreisavu","dennmart","jrmehle","whistlerbrk","shaper","jrivero","gloubidou","denzuko","dmillar","mexpolk","mkuklis","christianhellsten","johndagostino","jots","apillet","qdonce","javisantana","mikeauclair","digx","coreyhaines","rudionrails","jpbougie","brixtonasias","onesunone","bry4n","rhymes","liangzan","kvbik","professionalnerd","visola","suresh","bastih","andrem","r38y","mynyml","bitflut","danielbru","3rdman","cypriss","esdras","benpickles","ducky427","knobe","elkinsware","tpitale","foca","simonw","mrduncan","Xenome","markisisme","al3x","futoase","tomaski","meddah","shakhan","nailor","adamcooke","Hoodow","klacointe","erikvold","rtomayko","kolber","cashyboy21","luddep","closer","riggasconi","aroscoe","sven-q","kurotoshiro","angusb","binarydud","chrisb","gvarela","sukhchander","gnufied","Cutpastecreate","elg0nz","ijayasin","christianchristensen","strange","leandro","dirs","zevarito","jpf","mendelbenjamin","brianherbert","yuritomanek","latrommi","tokuhirom","qhoxie","rust","ericholscher","lxneng","lorchaos","rchk","ches","frnz","filipealvesferreira","lucasefe","paulwalker","httpdss","gdrage","jakalada","claudine","joshamos","fgrehm","rdamen","yaroot","jugyo","messa","digitaltoad","orph","galex","boriscy","rafidude","darashi","angrytuna","AdamN","paydro","rimenes","jacqui","sfkaos","dgalarza","imakado","moomerman","Ashernor","pedrodelgallego","BenWard","bashwork","axelator","zeroLaming","toothrot","pake007","sevas","btoone","dallas","danielrmz","kret","nouse","mdaisuke","fmborghino","ibolmo","zetafish","drewlesueur","dacoz","ciju","noise","salax","jotto","toastdriven","mcroydon","tfreitas","ccheever","sxlee87","jmcantrell","acts-human","bastienlabelle","terrbear","mikhailov","joshdavey","hecticjeff","garru","TBD","vancaem","jasonmc","ariekeren","shreekavi","chrisco","michaeltsmith","hmarr","binq","jakedahn","stonegao","jperras","finn","kerberoS","firman","leeky","gamesthatgive","jchaney","timonk","philippWassibauer","danblick","itspriddle","threedaymonk","michelson","tilgovi","jmchambers","jhindle","mtoledo","nhocki","mrtazz","the-architect","schallis","kneath","gustaf","ejdraper","logicaltext","levycarneiro","ktheory","robb-broome","matflores","SleepTillSeven","bencochran","tmm1","infixfilip","jemerick","edouard","ethangunderson","beanieboi","jwelshiv","MBO","gitmate","rok","santosh79","yaychris","BenHall","sirprize","abraham","heatxsink","joshwalsh","grimen","adamramadhan","mzlittle","demet8","jrpz","jeanpaulcozzatti","mtarbit","jstorimer","cacciaresi","r3trofitted","bennyfreshness","sinetris","jrun","unspace","rgarver","gabrielmansour","jnstq","hgillane","cherring","dceballos","kstewart","donnykurnia","plukevdh","diogenes","joshbrown","yolk","bitfyre","raphaelcosta","esneko","yuriyvolkov","unthinkingly","chad","quinn","wmerydith","donspaulding","notthinking","ikarius","jbr","yoshimax","silverfox","jmwinn21","extraordinaire","hartym","mattonrails","vertis","tommg","weilawei","denniscollective","72616b657368","sork","JamesHayton","kennethreitz","kurko","potomak","mmatuson","amiri","dandean","syntaxritual","holman","alimills","hammer","jnunemaker","risico","fritzek","theflow","dnozay","steshaw","bobanj","webtechnologist","PatrickTulskie","kares","miksago","fuJiin","tommychen","simonreed","foremire","LFabien","bagwanpankaj","bummytime","devinus","rays","krisb","Lymskos","zonble","aantix","vorn-coza","techfolio","albybisy","tcol","jufemaiz","pvdb","pcdavid","danopia","chrislerum","peterto","laberge","smokyonion","guinascimento","longhorny","gabe","kbuckler","durran","tricomsol","bananastalktome","jordanbreeding","c9s","alvin2ye","NV","jwachter","pulni","jjungnickel","f440","ratzefummel","krmdrms","mauriziodemagnis","inffcs00","bobthecow","bengold","gciampa","akshayrawat","said","hawx","samuel","michael","ruyrocha","fmmfonseca","chiragrules","raid5","kamui","hsbt","svenfuchs","l15n","steves","lunestae","pjaspers","chinmaygarde","scotttam","jeekl","kfinlayson","admc","kadel","bilco105","t9md","meskyanichi","timocratic","timhaines","Marak","openface","tlossen","tekacs","jasonpa","nightsailer","technoweenie","chrismear","benatkin","lloydpick","ryanmoran","Tomohiro","aslam","mineiro","gdagley","rociiu","AieshaDot","kijun","robertjwhitney","macek","willrax","VinylFox","rupa","smallacts","truemilk","alanhaggai","mitchellhislop","cobracmder","xoebus","gretch","juretta","mgsnova","invadersmustdie","tedb","jedschneider","maikelgonzalez","bdigital","raycmorgan","zenmatt","thrashr888","dug","avdi","chaifeng","bblimke","vivienschilis","fd","luckiestmonkey","Locke23rus","berlin-ab","myfreeweb","windmill","briankeairns","ricardojsanchez","angelov","cbmeeks","maetl","thepug","gluckspilz","jamin4jc","netzkontrast","mager","jarquesp","phmongeau","jdennes","danishkhan","bensonk","nano","kjbekkelund","flyerhzm","kanashii","mairon","sekimura","joericioppo","bertzhu","mislav","jroes","jenishkottaram","peterwald","alterisian","artisonian","bcherry","jbw","haifeng","stockhausen","bvandenbos","mlbright","consti","simonoff","suzukimilanpaak","ctrochalakis","acrookston","gnomet","dexterdeng","aderyabin","hwijaya","catman","vesan","frederico","zacharyscott","IsraelAgNouhYattara","mikecampo","dsueiro","reeze","stevemckenzie","avelino","stinie","thbishop","sotakone","srobbin","krongk","yaotti","tobym","robhudson","ryanbriones","jcpbacon","zhengjia","awilliford","moubry","rm","cyclades","mikethomas","dkeskar","brianlee","panggi","durbin","fmela","Shekar73","infynyxx","sorenmacbeth","unindented","kevinpanaglima","krachot","dvyjones","joshOiknine","arkx","rrichards","error400","lagsalot","JSilva","twitoaster","rbrant","shaiguitar","jmorganson","electronicbites","fredwu","jlertle","DHoffm","Tyrant505","CodeBlock","jgrevich","fpauser","lastk","scifisamurai","runawayjim","ryana","amanelis","ponzao","michelmelo","edsinclair","reustle","vshvedov","marchdoe","devi","allanberger","alup","tventura","cobra90nj","berkerpeksag","neviim","westoque","Rud5G","cjwoodward","fyskij","1ed","Axispower","icaruswings","DasIch","fredpalmer","al3d","codylindley","Bushjumper","phoenix24","pcora","welterde","VijayM","sr3d","hotoo","nwjsmith","brianjlandau","hemanth","johnknott","MatthewCampbell","mwmitchell","asymmetric","glitterfang","ptn","kraih","ono","myuhe","jque","GVRV","d-r","danthompson","zerd","selman","elsewares","unes","Debadatta","monoceroi","gchandrasa","darknighte","jreading","kron4eg","minad","cdmwebs","inuki","nabeelmukhtar","hornairs","goyox86","gosuri","revans","michaeldwan","helianthuswing","christiansmith","kidrane","melborne","darkhelmet","ikbear","blowmage","maxjustus","sebleier","mattb","GeoffTidey","warehouselabs","german","itsmeduncan","dneighbors","fireflyman","mattheath","madwork","marcosvm","rafmagana","rafaelgaspar","arden","flyfireman","saggim","mnelson","etehtsea","xantus","byrongibson","mopemope","gillesfabio","ZeuQma","tkaemming","jackhq","connrs","jpang","amorton","rubyorchard","ghg","remiprev","michaelparenteau","harikrishnan83","eddieringle","krekoten","andmej","mak1e","seungjin","christofd","gfx","mechanicles","drak","olkarls","gregory80","thheller","devreq","nanek","laripk","jefflab","rick","tapajos","denmark","richardiux","dfbrule","yrosen","ebruning","bts","AzizLight","audy","ballantyne","huerlisi","codepuzzle","khasan","nikochan","pmh","jexchan","designrelated","codykrieger","edorcutt","iamacourser","rowedev","lardissone","wxmcan","threez","cjkoch","gigq","marugoshi","tianyicui","earcar","fadhlirahim","ccollins","adanmayer","tpeden","jsocol","TaurusOlson","jaksys","leandrocg","rube","richard6363","emddudley","JensNockert","he9lin","tmilewski","rishikulkarni","wescleymatos","mootoh","ganesan","rodrigosdo","tonktonk","skaufman","jurajpelikan","fcurella","vic","eston","hiteshmanchanda","tsigo","plang","avsej","kanzure","johnturek","percyperez","vorushin","jakemcgraw","fushang318","juniorbl","alanandrade","kenn","mitchj","webdestroya","supairish","seanhellwig","guilhermechapiewski","rainerborene","zonovo","vertocardoso","vinioliveira","hotchpotch","pch","jeffself","markmhx","Archonyx","indrode","mmaheu","sigardner","kulesa","phsr","ericflo","andyferra","shurizzle","renatoelias","klandergren","fabiomcosta","johngrimes","gleuch","ecksor","lucapette","achiu","benbjohnson","selvan","ey0t","bray","komagata","longda","pixelballistics","a2ikm","hoffmann","Rich-McGrath","abelperez","galvez","mkempe","amiridis","sfgirl","makeusabrew","dragoscrintea","grzegorzkazulak","jcmuller","JustinCampbell","dpree","jquattrocchi","sri","neonsunburst","danielemilan","poseid","chancegarcia","Prog4rammer","HTApplications","cassiomarques","andrerocker","SixArm","andrewsmedina","gaubert","parabuzzle","diogosantos","seanmccann","particlebanana","CloudMarc","majtom2grndctrl","javichito","jk","arunagw","esfand","plentz","caueguerra","albertoleal","adrianoalmeida7","guilleiguaran","donaldw","TaopaiC","stephenbreen","dissolved","ikaros","andrefaria","aporia","benlambert","coolgeng","kitop","mitukiii","kayaman","sLLiK","vmseba","nkchenz","vs","jtsay","arlolra","adaoraul","Demeter","jpadvo","joshaber","ebeigarts","allenwei","nervetattoo","bostonbasso","saki","ajbolanos","seppuku","sonicgao","ainvyu","cbrammer","hostsamurai","vatrai","acadavid","danengle","paddydub","noqqe","zporter","namley","aaronky","rdegges","weatherpoof","tomxander","skyfive","dieinzige","Becojo","saysjonathan","awayken","nataliepo","notrael","mrigor","blatyo","cwaring","sshirokov","kam","joshfng","martintel","skorks","vamsee","Lispython","hansef","seenmyfate","kitt","Markitox","Antti","Kerestey","albertz","samverekar","fredrikmollerstrand","thesp0nge","kdepp","ptzn","wusher","phongvh","sayz","qbyt","mkomitee","mlen","jmanon","duk42111","Naoya-Horiguchi","brianlovesdata","dreamcat4","pxr","neiltron","tauil","jondot","phonx","mininaim","6","Mattia","blambeau","DougTabuchi","idorosen","rachelmyers","capthy","liwh","brunoarueira","DrPheltRight","csanz","scott-stewart","jacobrelkin","shaliko","AAinslie","jamierumbelow","abukhait","scottlabs","tjhanley","mmonis","mrkamel","christiancurland","clyfe","thecocktail","taicki","stephenallred","zires","acadopia","MateuszWijas","zentrification","touchinspiration","reddyonrails","mportiz08","krizzna","nmelo","andrewsardone","kotp","rossta","anups","jeffcarroll","efritz","jpogran","jdp-global","hyperbolist","bf4","lenzcom","ardwalker","L42y","sosedoff","Ajmal","abhishekmunie","kbaldyga","kamzilla","delonnewman","peter-murach","sputnikus","benwr","wijet","marlonglopes","TheFox","kblake","senny","azer","Smarty","milann","ipavelek","elitau","zyan","farnhizzle","hamzakc","Waterfox","arunjitsingh","azizur","kitenge","eatcpcks","lusis","gvt","jasonmelgoza","jichen","Zeelot","albertobarrila","procyon","Wackybob","curbina","goosetav","ghindle","vicmiclovich","wearestac","klebervirgilio","offby1","kaaliputra","Silanus","scopevale","netzflechter","poutyface","raulmangolin","dmshann0n","cricketgeek","VikramRao","mungomash","bradheitmann","kainosnoema","iromli","jwelty","sayem","tobsch","rubynerd","travisanderson","lightyrs","muellmat","cameronmcefee","hector","kjetilod","kinabalu","jglee1027","andrew","metiny","dnurzynski","redpanda","necroua","karmi","lgaches","mabonyi","vyatri","korczis","67ideas","pcunnane","dpbus","ashneo76","joshmattvander","liangcw","vineetbnagaraj","jmatraszek","mkitt","pmandia","yassersouri","yudmiy","arthurix","osebboy","baant","programaker","busticated","emilpetkov","sebacruz","mrdg","DamianZaremba","malikbakt","georgecalm","danielribeiro","Dirklectisch","sup3rcod3r","raeffu","Anthony-Geranio","jitterizer","hectcastro","rudolfochrist","excid3","lampr","voidnothings","tsenart","nt","Amokrane","levicook","qnm","technolize","aodag","sansumbrella","MindTooth","scott2449","X4","mrcaron","randomor","liuzhoou","marciogm","ardiyu07","dannymcc","nfedyashev","batuhanicoz","cognominal","sax","vybs","richardrasu","xcoderzach","lucamaraschi","mohnish","pcardune","madari","TimothyKlim","nbucciarelli","jwoertink","freakyfractal","enc","lite","aanoaa","tomvleonard","mikaa123","jeanregisser","scheibo","Psli","einux","konputer","dzello","Nilloc","cmeiklejohn","georgemandis","tembamazingi","mblair","mconnor","nerdmom","ndegruchy","spearse","larsburgess","burnto","franciscoj","sleparc","rafaelcaricio","ajray","chacha","hasanyavas","pedrolopez","mponizil","timknight","jacksinn","huacnlee","justinbaker","aswadrangnekar","Captainkrtek","DrewFitz","sleepdev","tharkoos","youwannaknow","doud","tmcgilchrist","chlayverts","thomvil","digitalpardoe","sposborne","parkerl","carlosdelfino","omgitsads","tuhin","RLovelett","eregon","sanxac","ezuelectrock","tshauck","mtsoerin","hiromitz","araee","bogdanmuresan","kloderowski","msarvar","drydevelopment","1anre","icco","joestraitiff","jmileham","Refreshe","tansu-uslu","hoverlover","handyjq","xlarsx","bojovs","ajmi","fuzzyfox","lexxx233","diversen","fabianoalmeida","martinlindelof","srih4ri","ianphilpot","pitr","ffontouras","Kjata1013","thasc","newtriks","ashbaker","Ameero","zahir","sunpech","EdlinOrg","snstoyou","nope","elemel","smly","prathe","P6rguVyrst","srisnsris","s3w47m88","semicarry","hidde-jan","rowoot","TBush","AXJ","stevedeneb","adarshp","RootSpeaking","kevasdf","mdesrosiers","Purandhar","hyesushin","DenDen1337","JBean","amhnews","aseba","diegopacheco","macluq","tonycasanova","shaoyang","rmdort","morganwatch","alexandersanz","LinGmnZ","sjh","dalpo","brentsmith","Zolomon","liveink","diulama","tanelpuhu","rcarrieche","dte","RyomaKawajiri","punytan","yoquankara","haoqili","knowncitizen","dinhkhanh","psalami","krishnanagaraj","cespujunk66","lalasusu999","pcurry","wyattdanger","shingonoide","ngoatvm","eriknrd","philfreo","luckydev","Rahulitsmca","gohavefun2","bertjwregeer","nmumen","aumgn","dobcey","davidohalloran","jowido","marksteve","dabio","rmicoy","madewulf","bosism","Tipertuba","PushinPixels","tgdn","shariefsk","m0nkey","henryleacock","CrawfordWynnes","anagri","mlareo","neil477","kdonovan","yamunamathew","berlinbrown","antawara","Cotizado25","gjorquera","Dushyanthkinjarapu","laCour","oooo723","roblecca","pmaingi","gcampbell","robeastham","jgdreyes","Caustic","morgankeys","chesleybrown","zzazang","adanoria","millr","MikeBott","keitsi","zlangley","avalanche123","ilot3k","bendiken","jeheald","ashsmithco","mycroft","lachezar","borahMoloy","cliffsull","goldenandroid","KuraFire","ngpestelos","troessner","Arnab1401","ujjwalkhanal","qadir0108","ihd2911","Firsh3k","lifeisrisky","nevans","munro9","fagiani","lojikbomb","chrisledet","ariel","marcosanson","rem","shivakantmanch","MMLK","skattyadz","mhaidarh","joedynamite","dimasaryo","trico","shaunmichael","vs4vijay","afj176","stevennathaniel","gujiao","olamedia","giupo","whatrocks","stakisko","mhockelberg","shalo","devaraj","attomos","xeneizeyorugua","ryanlecompte","jrk","deryldoucette","jacknagel","togetherville","zypher","kyledoherty","yakomoca","sastha","KMASubhani","tejasc","ErikRHanson","ghais","dontcare4free","streeter","ambreenhussain","mischa","JelenaSparic","logeshpaul","victusfate","Avaruz","hendrolaksono","jeffgw","geeksourcer","wizardwerdna","elliottgoodwin","speric","alextucker","chawei","danieltreacy","blackdoc","mgp","martinemde","tsolomko","six","jayeshinho","jakeguza","bleikamp","ryanpao","ddacunha","mrb","mamdohreda","colinvivy","piyushchauhan2011","correcto","mawaldne","swishstache","Rafe","neelvad","seriouscomedy","trendsetter","beenhero","Amper","ryanKelleher","muehlburger","marktraub","rugers285","ArtemMyagkov","oscardelben","yvesvanbroekhoven","citrus","dennismdel","SupplyBoys","italiano40","darokel","Orton","lobr","sdrkyj","ggppwx","AngeloR","zergmk2","premjg","afaolek","tobrien","fash","susanmccormick","maoer","dtrebbien","tahhan","mzahir","matthewborn","patriciomacadden","nawaidshamim","JudePea","mehrzad","ericchen0121","dominiclovell","antonr","Fir2011","mhenke","bloudermilk","PrashanthRaghu","thecoffman","hozumi","jed","baguo","grumpycola","rht","timerider","thiagocaiubi","carlop","mibbo","Imados","frankwiles","efeerdogru","realpeterz","jordanndaviss","bytecollective","brianritchie","cndv","dfd","panckreous","mike762011","MalsR","case27","mono0x","jonassm","asaaki","jhnmn","huhong","TRAVEL4FREE","marcelomilo","nmudgal","coldFox","tonisan","ctubau","danlister","apurvrdx","armandogalindo","jeremysolarz","mustardhamsters","bfirsh","dmmalam","a4extra","ezkl","michaelowen","sujayhuilgol","chadlomax","dazagrohovaz","DeveloperAlex","c1c2ai","trey","joekhoobyar","jianinz","ugtkbtk","paparts","netoxico","TeacherPond","becked","tuyennguyencanada","motord","eklipse2k8","ZoomZhao","samqiu","makiman","purban","cyberorca","imonyse","jeemar","gazay","davejacobs","bwvoss","Bensign","dann","nickaoscarter","gane5h","glowindark","arielo","joannecheng","hughhefner8","broccolini","bherrup","starmbl09","tothebeat","sabram","qianthinking","iowish","lalitnama","ejr3gan","denis-bykov","cbmd","cleercode","batasrki","dstanek","markmarch","suprsankr","rcroxyosox","treeder","baddogai","froots","haoshubin","uirusan","dzhulk","aaudu","lekkerduidelijk","mcchang","pgebhard","scottgrey","dbergey","carlitosway0","cdadia","lepture","b1naryth1ef","janjohannesson","AndreyChernyh","dynjo","maxstepanov","JonRowe","attymannyluna","cooper1388","vjkaruna","fdd","GoranHalvarsson","Rajesh1213","Triopticon","ramazanayvaz","datl","jeo4long","zeroonnet","cdog","abstractj","anirudh24seven","danielwrobert","laparicio83","balupton","austymenko","avdezine","danieldyzma","jasonbuck","amasad","sideshowbandana","BrianStorti","supercleanse","TheThumbsupguy","alexcsandru","Stdubic","betawaffle","minamipj9","kylpo","ricardovaleriano","adrijlee","hlh59","chazlever","krmboya","vanm","MIchaelChua","benbarclay","mdjohnson1","JeffBrown711","rishabhsrao","dustMason","theLearningChan","malandrew","sac2171","Omerooo95","rnpinc","ivandro","syncopated","arnklint","jayeola","JJMoy","rahman86","josephmisiti","jfilipe","cjcnance","KingsgateRas1","chambaz","sjamayee","aelam","imanzarrabian","gaochunzy","orangix","goopi","michaelkrisper","deonomo","codejoust","aroc","cavalle","johnnyhuman","alexbg","jshr","ssnau","caryhaynie","timmolter","spadin","mlong168","gurmeetkalra","new-top","trondga","maikeru","jamster","jsy","tommyhendr","Hasgaroth","ZephyrSL","rjyo","zephyrpellerin","neilparikh","beata","makestory","haneez","mdhabib","PaulKinlan","cheche","tyshen","bhxtl","osujikenneth","ketiko","frknlgn","katRHS","igrigorik","marianay","detroitexposure","Surgo","mindgap","hiroyukim","DilipSabat","espengra","soubhiks","jaybrent00","tikva","jessestuart","mtanas","redserpent","shukydvir","leoy","stylecoder","coryfoo","prashanthbr","robots2020","sidna","cmes","johndel","diogobaracho","markiBOY","tvkonline","shiawuen","dipak8959","rfosta","nickgoodfate","RiverBridge","fay","benza","karichel","psychicin","gag0q","kl365","nmccarthy","julien51","amylv","abinav","bramsdenteuling","AnonymousCow","ioncache","iesta","cemsisman","Ade147","seamusabshere","doublethink","claudio-alvarez","bird5230","anilanar","debugging","rupakg","ShaneIsley","wicz","roastgoat","dilhamsoft","sh4dy08","roboteti","pubnub","TRMW","rahulsingal14","sanjayts","nhunzaker","baldrailers","Korrawit","frode","thorsteinsson","iveney","endel","jose152","ZhengYang","Keeguon","rahul2011","iainp999","maveonair","SirCodington","sclm","snapette","dshefchik","manderson2080","djohnston08","pirateking","giftedsam","iyerlabz","alejandrolechuga","janela","BxCx","mifan","enestanriover","kernelfail","prinxezzlja","macknight","Girllovers","AquaGeek","charleskline","Foggybtmgirl","ryanatwork","plainspace","stw","naiquevin","huangjunwen","valeh","carhartl","roycefu","tmlee","williamrh","ZachWick","zhuangbiaowei","Baker1904","Skrizy","NageshJatagond","vrillusions","geekrohit","satlavida","cleichner","jhenke","beingnessa","mcgoooo","Bloophub","punklibrarian","abelmartin","take-cheeze","petersonferreira","maxwell","OsvaldoArmando","rclosner","jccorrea","koyonote","denniscking","chanduch","sd2438892","geekard","e3matheus","mbialon","yarvin","rvhani","Predoff","darkness","savethewaves","sdoering","vaporrumors","nevayeshirazi","andysamona","rkwofford","messi1988","anibe","yesimroy","tpiranav","plopezbarbosa","peterkinmond","unitysoe","mjw56","johannchiang","chrismatthieu","yasirmturk","zer09","mparrenovilla","nataliav","lucasdavila","volomike","echannel-leon","rufoni2003","ramonatravels","cpkennedy","NKjoep","witalewski","lonre","stecb","josal","Zul83","Niflheim","ChanCoolKat","umesh991987","marvin","altnerd","insparbo","kmcd","marcofranssen","defiantredpill","BarcelonaRecords1","hbtvieira","kmarcini","lea22","orbotix","sdasinglesclub","buffer","shauncr","ejenkins","yahyaman","burakdd","fjordan","cwholt","yudi-rusmawan","eldios","vascoconde","niky81","mcdave","mcobery","ramen","thePapacy","alexandresaiz","sleighter","riyalein","johmas","chriskelly","andref5","AppSlap","celikmus","bitlag","kareem-abdelsalam","joshuamckenty","jn123456789","egonSchiele","stylepraise","shaw1337","gordonmzhu","erikkallen","ermustaqbal","denisjacquemin","msgehard","robertodecurnex","dcrall","ahto","charleseff","thejspr","twilson63","franciscosouza","sam7wx","jwbecher","eklitzke","serho","vbonillo","jackdracon","brahmasta","giulianoxt","rayelward","jeffw516","jewelrydeveloper","pengper","fyamnky"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de b/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de new file mode 100644 index 0000000..c3f9748 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/user/show/defunkt/following +connection: keep-alive +content-length: 2286 +server: nginx/0.7.67 +x-runtime: 26ms +x-ratelimit-limit: 60 +etag: "f2fb743e37fd58a65bd0b1eb2f4125ab" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 04:32:09 GMT +content-type: application/json; charset=utf-8 + +{"users":["pjhyett","mojombo","francois","topfunky","alexcharlie","atmos","automatthew","jnunemaker","sco","jimweirich","parabuzzle","choonkeat","technoweenie","timburks","guitsaru","jeresig","pieter","3n","ryanking","boboroshi","eventualbuddha","freels","mattly","kballard","seaofclouds","nakajima","dustym","therealadam","hoverbird","monde","cnix","ryanb","josh","willcodeforfoo","rsanheim","jnewland","bmizerany","KirinDave","hornbeck","Caged","takeo","vanpelt","drnic","gpbmike","JackDanger","kvnsmth","rubyist","eschulte","jbarnette","smtlaissezfaire","foca","tekkub","jacobian","thwarted","leah","joestump","kastner","marcel","bs","m","BenWard","sstephenson","ericflo","digg","binarylogic","CodeOfficer","mtodd","karnowski","atebits","tmm1","mmalone","stephencelis","mschrag","verbal","qrush","jmhodges","tomaw","maddox","cliffmoon","jonforums","besquared","antirez","miyagawa","jquery","facebook","brianmario","simonw","rtomayko","kneath","jamis","brosner","chrisdrackett","jchris","jezdez","alex","gregnewman","mdirolf","tuaw","harperreed","threedaymonk","technomancy","rackspace","37signals","Sutto","brianjlandau","slact","pauldix","brynary","joshknowles","sd","trotter","fhwang","robhudson","ericholscher","idangazit","justinlilly","quirkey","rcrowley","bitprophet","mitsuhiko","malcolmt","djangrrl","markpasc","adamwiggins","peterc","al3x","mnot","adoy","fredreichbier","juvenn","jtauber","stevedekorte","davglass","trustthevote","ice799","DrewDouglass","andreasronge","dbr","bry4n","ushahidi","jpf","trek","jrk","mcarter","toastdriven","eric","palewire","thedaniel","ry","jessegrosjean","ultrasaurus","sarahmei","palm","notahat","tinymce","schacon","blackwinter","merlinmann","joehewitt","CaptainSqually","Jaymon","square","techcrunch","yahoo","sixapart","LukasRos","adamstac","pengwynn","brandonaaron","holman","evaryont","Tim-Smart","mkhl","mustache","chneukirchen","sr","leafychat","penny-arcade","adamsanderson","joericioppo","rupa","kennethreitz","raycmorgan","jed","consti","ericdwhite","ianb","eston","rojotek","eddit","tapajos","funkatron","joshaber","rentzsch","adamv","nedap","bryanveloso","rodjek","peff","luckiestmonkey","amiridis","frogandcode","karmi","jashkenas","igrigorik","bokowski","marijnh","judofyr","zbrock","quentinberder","kevinsawicki","bleikamp"]} \ No newline at end of file diff --git a/tests/test_user.py b/tests/test_user.py index bf36abb..5a5037c 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -2,7 +2,7 @@ import unittest -from nose.tools import assert_equals +from nose.tools import (assert_equals, assert_true) import utils @@ -39,3 +39,9 @@ def test_meta(self): assert_equals(user.id, 2) assert_equals(user.public_gist_count, 277) assert_equals(user.public_repo_count, 90) + + def test_followers(self): + assert_equals(len(self.client.users.followers('defunkt')), 2593) + + def test_following(self): + assert_equals(len(self.client.users.following('defunkt')), 212) From 2debd719149390a5206fb669a47a408ac37edbe2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:43:52 +0100 Subject: [PATCH 222/454] Added user querying tests. --- ...0gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 | 14 ++++++++++++++ ...mes%2BRowe,95221a552352bf0535e2445659dc9ed5 | 14 ++++++++++++++ tests/test_user.py | 18 ++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 create mode 100644 tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 diff --git a/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 b/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 new file mode 100644 index 0000000..d6277ad --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/user/email/jnrowe%40gmail.com +connection: keep-alive +content-length: 370 +server: nginx/0.7.67 +x-runtime: 11ms +x-ratelimit-limit: 60 +etag: "56cf9af8aa57da3ccc78fc91d6df4565" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 04:42:13 GMT +content-type: application/json; charset=utf-8 + +{"user":{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","company":null,"name":"James Rowe","created_at":"2009/03/08 14:53:38 -0700","location":"Cambridge, UK","public_repo_count":38,"public_gist_count":64,"blog":"http://jnrowe.github.com/","following_count":5,"id":61381,"type":"User","permission":null,"followers_count":6,"login":"JNRowe","email":"jnrowe@gmail.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 b/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 new file mode 100644 index 0000000..45dc2b0 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/user/search/James%2BRowe +content-length: 847 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "f4b69010d01df911cd62a2c2eef3d71f" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 04:42:12 GMT +content-type: application/json; charset=utf-8 +x-runtime: 10ms + +{"users":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","name":"James Rowe","created_at":"2009-03-08T21:53:38Z","location":"Cambridge, UK","public_repo_count":38,"followers":6,"fullname":"James Rowe","username":"JNRowe","language":"Python","id":"user-61381","repos":38,"type":"user","followers_count":6,"pushed":"2011-05-21T06:15:08.703Z","login":"JNRowe","score":4.247995,"record":null,"created":"2009-03-08T21:53:38Z"},{"gravatar_id":"e70f90f2a6985553d18fa39b90d9db6f","name":"James Rowe","created_at":"2008-11-18T10:39:10Z","location":"Guernsey, Channel Islands","public_repo_count":2,"followers":1,"fullname":"James Rowe","language":"Ruby","username":"wooki","id":"user-35166","repos":2,"type":"user","followers_count":1,"pushed":"2011-05-13T19:15:09.524Z","login":"wooki","score":4.247995,"record":null,"created":"2008-11-18T10:39:10Z"}]} \ No newline at end of file diff --git a/tests/test_user.py b/tests/test_user.py index 5a5037c..024d1e8 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -45,3 +45,21 @@ def test_followers(self): def test_following(self): assert_equals(len(self.client.users.following('defunkt')), 212) + + +class UserQueries(unittest.TestCase): + """Test user querying """ + def setUp(self): + utils.set_http_mock() + self.client = Github() + + def tearDown(self): + utils.unset_http_mock() + + def test_search(self): + assert_equals(repr(self.client.users.search('James Rowe')), + '[, ]') + + def test_search_by_email(self): + user = self.client.users.search_by_email('jnrowe@gmail.com') + assert_equals(repr(user), '') From 0b45f84c9e981c546ef36861f69ad4eaccb4c25d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:44:53 +0100 Subject: [PATCH 223/454] Added User.is_authenticated() tests. --- ...rowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 | 14 ++++++++++++++ tests/test_user.py | 6 ++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 diff --git a/tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 b/tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 new file mode 100644 index 0000000..1add068 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/user/show +connection: keep-alive +content-length: 562 +server: nginx/0.7.67 +x-runtime: 20ms +x-ratelimit-limit: 60 +etag: "bc1db0d34b32ae674a174f231a42148a" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 05:05:13 GMT +content-type: application/json; charset=utf-8 + +{"user":{"plan":{"name":"free","collaborators":0,"space":307200,"private_repos":0},"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","company":null,"name":"James Rowe","created_at":"2009/03/08 14:53:38 -0700","location":"Cambridge, UK","disk_usage":66069,"collaborators":0,"public_repo_count":38,"public_gist_count":64,"blog":"http://jnrowe.github.com/","following_count":5,"id":61381,"owned_private_repo_count":0,"private_gist_count":7,"type":"User","permission":null,"total_private_repo_count":0,"followers_count":6,"login":"JNRowe","email":"jnrowe@gmail.com"}} \ No newline at end of file diff --git a/tests/test_user.py b/tests/test_user.py index 024d1e8..ce20c6a 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -46,6 +46,12 @@ def test_followers(self): def test_following(self): assert_equals(len(self.client.users.following('defunkt')), 212) + def test_is_authenticated(self): + user = self.client.users.show('defunkt') + assert_true(user.is_authenticated() is False) + user = self.client.users.show('fake_jnrowe_with_auth') + assert_true(user.is_authenticated() is True) + class UserQueries(unittest.TestCase): """Test user querying """ From 6973ee471c1acfa1e07984c09ebc9d18f5b3a376 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:45:45 +0100 Subject: [PATCH 224/454] Added user {,un}follow tests. --- ...w,defunkt,eb59ee564b4598ac4a39c71474b539fc | 14 ++++++++++++++ ...w,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 | 14 ++++++++++++++ tests/test_user.py | 19 ++++++++++++++++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc create mode 100644 tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 diff --git a/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc b/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc new file mode 100644 index 0000000..4b6edda --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/user/show/mojombo +x-runtime: 23ms +content-length: 63 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "45a6fa1730ba70b40ccd595130b2390e" +cache-control: private, max-age=0, must-revalidate +date: Mon, 11 Apr 2011 14:46:22 GMT +content-type: application/json; charset=utf-8 + +{"users":["c9s","mitsuhiko","seemant","ask","tpope","defunkt"]} diff --git a/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 new file mode 100644 index 0000000..bc3e9a8 --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: http://github.com/api/v2/json/user/unfollow/defunkt +x-runtime: 23ms +content-length: 53 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "45a6fa1730ba70b40ccd595130b2390e" +cache-control: private, max-age=0, must-revalidate +date: Mon, 11 Apr 2011 14:46:22 GMT +content-type: application/json; charset=utf-8 + +{"users":["c9s","mitsuhiko","seemant","ask","tpope"]} diff --git a/tests/test_user.py b/tests/test_user.py index ce20c6a..bc944cc 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -2,7 +2,7 @@ import unittest -from nose.tools import (assert_equals, assert_true) +from nose.tools import (assert_equals, assert_false, assert_true) import utils @@ -69,3 +69,20 @@ def test_search(self): def test_search_by_email(self): user = self.client.users.search_by_email('jnrowe@gmail.com') assert_equals(repr(user), '') + + +class UserMethods(unittest.TestCase): + def setUp(self): + utils.set_http_mock() + self.client = Github() + + def tearDown(self): + utils.unset_http_mock() + + def test_follow(self): + result = self.client.users.follow('defunkt') + assert_true('defunkt' in result['users']) + + def test_unfollow(self): + result = self.client.users.unfollow('defunkt') + assert_false('defunkt' in result['users']) From c544c22a417605d2ca931ae0b97f5b697e9b9151 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 07:48:47 +0100 Subject: [PATCH 225/454] Added note on finding upstream bugs in API. --- doc/bugs.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/doc/bugs.rst b/doc/bugs.rst index 05e5086..34ce7f0 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -14,6 +14,22 @@ We also use the issue tracker to track feature requests and ideas. Having all this information in a single place makes it easier for new contributors to jump in. +When is a bug not a bug +----------------------- + +With packages, such as :mod:`github2`, that wrap external resources it can be +hard to track down the actual cause of a bug. The first step when you've found +a bug should be to test it directly, to rule out a temporary problem with GitHub +or a deficiency in the API. + +The official `GitHub API`_ documentation contains many examples on how to access +the API directly with curl_. + +If the bug you've found is outside the reach of this project an issue should be +opened in GitHub's `API support forum`_. It doesn't hurt to `report an issue`_ +in this project's issue tracker, and you may find someone knows a workaround for +the problem until GitHub's crack team of developers can fix the problem. + Anatomy of a good bug report ---------------------------- @@ -31,4 +47,7 @@ Simon Tatham has an excellent essay titled `How to Report Bugs Effectively`_, with some excellent tips on filing good bug reports. .. _report an issue: https://github.com/ask/python-github2/issues/ +.. _GitHub API: http://develop.github.com/ +.. _curl: http://curl.haxx.se/ +.. _API support forum: http://support.github.com/discussions/api .. _How to Report Bugs Effectively: http://www.chiark.greenend.org.uk/~sgtatham/bugs.html From 6a79f43f174acd3953ced69263c06d311a6bda56 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 08:06:04 +0100 Subject: [PATCH 226/454] Refactored test-case setup to remove some duplication. --- tests/test_unit.py | 8 +------- tests/test_user.py | 31 +++---------------------------- tests/utils.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index 3c1d060..0bedcab 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -26,14 +26,8 @@ def test_issue(self): assert_equals(str, type(repr(i))) -class RateLimits(unittest.TestCase): +class RateLimits(utils.HttpMockTestCase): """Test API rate-limitting""" - def setUp(self): - utils.set_http_mock() - - def tearDown(self): - utils.unset_http_mock() - def test_delays(self): """Test call delay is at least one second""" client = Github(requests_per_second=.5) diff --git a/tests/test_user.py b/tests/test_user.py index bc944cc..9073546 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,23 +1,12 @@ import _setup -import unittest - from nose.tools import (assert_equals, assert_false, assert_true) import utils -from github2.client import Github - -class UserProperties(unittest.TestCase): +class UserProperties(utils.HttpMockTestCase): """Test user property handling""" - def setUp(self): - utils.set_http_mock() - self.client = Github() - - def tearDown(self): - utils.unset_http_mock() - def test_user(self): user = self.client.users.show('defunkt') assert_equals(user.blog, 'http://chriswanstrath.com/') @@ -53,15 +42,8 @@ def test_is_authenticated(self): assert_true(user.is_authenticated() is True) -class UserQueries(unittest.TestCase): +class UserQueries(utils.HttpMockTestCase): """Test user querying """ - def setUp(self): - utils.set_http_mock() - self.client = Github() - - def tearDown(self): - utils.unset_http_mock() - def test_search(self): assert_equals(repr(self.client.users.search('James Rowe')), '[, ]') @@ -71,14 +53,7 @@ def test_search_by_email(self): assert_equals(repr(user), '') -class UserMethods(unittest.TestCase): - def setUp(self): - utils.set_http_mock() - self.client = Github() - - def tearDown(self): - utils.unset_http_mock() - +class UserMethods(utils.HttpMockTestCase): def test_follow(self): result = self.client.users.follow('defunkt') assert_true('defunkt' in result['users']) diff --git a/tests/utils.py b/tests/utils.py index 0d804c9..8dedf71 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,11 +1,13 @@ import _setup import os +import unittest from email import message_from_file import httplib2 +from github2.client import Github from github2.request import charset_from_headers @@ -36,9 +38,38 @@ def request(self, uri, method='GET', body=None, headers=None, "Resource %r unavailable from test data store" % file) +class HttpMockTestCase(unittest.TestCase): + def setUp(self): + """Prepare test fixtures + + `httplib2.Http` is patched to return cached entries via + :class:`HttpMock`. + + :attr:`client` is an unauthenticated :obj:`Github` object for easy use + in tests. + """ + httplib2.Http = HttpMock + self.client = Github() + + def tearDown(self): + """Remove test fixtures + + `httplib2.Http` is returned to its original state. + """ + httplib2.Http = ORIG_HTTP_OBJECT + + def set_http_mock(): + """Function to enable ``Http`` mock + + This is useful in simple `nose`-compliant test functions + """ httplib2.Http = HttpMock def unset_http_mock(): + """Function to disable ``Http`` mock + + :see: :func:`set_http_mock` + """ httplib2.Http = ORIG_HTTP_OBJECT From b6c06ecf657fb37dd3ad627bfa9425e938ae76ca Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 08:58:23 +0100 Subject: [PATCH 227/454] Added repository data tests. --- ...c-overlay,0d310ea1b3942e443c6e5cae4f3db39f | 14 +++++++ tests/test_repositories.py | 40 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f create mode 100644 tests/test_repositories.py diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f new file mode 100644 index 0000000..3ff7cf5 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/repos/show/JNRowe/misc-overlay +x-runtime: 11ms +content-length: 447 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "977c6513db34b26e6084b833b45c7754" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 07:50:08 GMT +content-type: application/json; charset=utf-8 + +{"repository":{"homepage":"http://jnrowe.github.com/misc-overlay/","forks":0,"pushed_at":"2011/05/22 00:24:15 -0700","url":"https://github.com/JNRowe/misc-overlay","has_wiki":true,"watchers":5,"open_issues":6,"fork":false,"created_at":"2009/05/02 07:32:50 -0700","has_issues":true,"description":"Gentoo overlay -- miscellaneous packages","size":8449,"private":false,"name":"misc-overlay","owner":"JNRowe","language":"Python","has_downloads":true}} \ No newline at end of file diff --git a/tests/test_repositories.py b/tests/test_repositories.py new file mode 100644 index 0000000..8076202 --- /dev/null +++ b/tests/test_repositories.py @@ -0,0 +1,40 @@ +import _setup + +import datetime + +from nose.tools import (assert_equals, assert_false, assert_true) + +import utils + + +class RepoProperties(utils.HttpMockTestCase): + """Test repository property handling""" + def test_repo(self): + repo = self.client.repos.show('JNRowe/misc-overlay') + + assert_equals(repo.name, 'misc-overlay') + assert_equals(repo.description, + 'Gentoo overlay -- miscellaneous packages') + assert_equals(repo.url, 'https://github.com/JNRowe/misc-overlay') + assert_equals(repo.owner, 'JNRowe') + assert_equals(repo.homepage, 'http://jnrowe.github.com/misc-overlay/') + + assert_equals(repo.project, 'JNRowe/misc-overlay') + + def test_meta(self): + repo = self.client.repos.show('JNRowe/misc-overlay') + assert_equals(repo.forks, 0) + assert_equals(repo.watchers, 5) + assert_equals(repo.private, False) + assert_equals(repo.fork, False) + assert_equals(repo.master_branch, None) + assert_equals(repo.integration_branch, None) + assert_equals(repo.open_issues, 6) + assert_equals(repo.created_at, + datetime.datetime(2009, 5, 2, 7, 32, 50)) + assert_equals(repo.pushed_at, + datetime.datetime(2011, 5, 22, 0, 24, 15)) + assert_equals(repo.has_downloads, True) + assert_equals(repo.has_wiki, True) + assert_equals(repo.has_issues, True) + assert_equals(repo.language, 'Python') From 8354ecc5f5b4e2ed7f09a3b98564f197588c34d6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 08:59:14 +0100 Subject: [PATCH 228/454] Added missing language attribute for repositories. --- github2/repositories.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/repositories.py b/github2/repositories.py index ff25481..fd09cf4 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -18,6 +18,7 @@ class Repository(BaseData): has_downloads = Attribute("If True, this repository has downloads.") has_wiki = Attribute("If True, this repository has a wiki.") has_issues = Attribute("If True, this repository has an issue tracker.") + language = Attribute("Primary language for the repository.") def _project(self): return self.owner + "/" + self.name From b84df095f914b4f35a30b3fa03455deb874cdee8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:01:43 +0100 Subject: [PATCH 229/454] Added tests for GitHub datetime handling. --- tests/test_date_handling.py | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 tests/test_date_handling.py diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py new file mode 100644 index 0000000..94679c4 --- /dev/null +++ b/tests/test_date_handling.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- + +import _setup + +from datetime import datetime as dt + +from nose.tools import assert_equals + +from github2.core import (ghdate_to_datetime, datetime_to_ghdate) + + +# Commented test cases are in PST, and aren't correctly handled with the +# naïve datetime objects used in the current code base + +def test_ghdate_to_datetime(): + assert_equals(ghdate_to_datetime('2011/05/22 00:24:15 -0700'), + dt(2011, 5, 22, 0, 24, 15)) + + assert_equals(ghdate_to_datetime('2009/04/18 13:04:09 -0700'), + dt(2009, 4, 18, 13, 4, 9)) + #assert_equals(ghdate_to_datetime('2009/11/12 21:15:17 -0800'), + # dt(2009, 11, 12, 21, 15, 17)) + #assert_equals(ghdate_to_datetime('2009/11/12 21:16:20 -0800'), + # dt(2009, 11, 12, 21, 16, 20)) + assert_equals(ghdate_to_datetime('2010/04/17 17:24:29 -0700'), + dt(2010, 4, 17, 17, 24, 29)) + assert_equals(ghdate_to_datetime('2010/05/18 06:10:36 -0700'), + dt(2010, 5, 18, 6, 10, 36)) + assert_equals(ghdate_to_datetime('2010/05/25 21:59:37 -0700'), + dt(2010, 5, 25, 21, 59, 37)) + assert_equals(ghdate_to_datetime('2010/05/26 17:08:41 -0700'), + dt(2010, 5, 26, 17, 8, 41)) + assert_equals(ghdate_to_datetime('2010/06/20 06:13:37 -0700'), + dt(2010, 6, 20, 6, 13, 37)) + assert_equals(ghdate_to_datetime('2010/07/28 12:56:51 -0700'), + dt(2010, 7, 28, 12, 56, 51)) + assert_equals(ghdate_to_datetime('2010/09/20 21:32:49 -0700'), + dt(2010, 9, 20, 21, 32, 49)) + + +def test_datetime_to_ghdate(): + assert_equals(datetime_to_ghdate(dt(2011, 5, 22, 0, 24, 15)), + '2011/05/22 00:24:15 -0700') + + assert_equals(datetime_to_ghdate(dt(2009, 4, 18, 20, 4, 9)), + '2009/04/18 20:04:09 -0700') + #assert_equals(datetime_to_ghdate(dt(2009, 11, 13, 4, 15, 17)), + # '2009/11/13 04:15:17 -0800') + #assert_equals(datetime_to_ghdate(dt(2009, 11, 13, 4, 16, 20)), + # '2009/11/13 04:16:20 -0800') + assert_equals(datetime_to_ghdate(dt(2010, 4, 18, 0, 24, 29)), + '2010/04/18 00:24:29 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 5, 18, 13, 10, 36)), + '2010/05/18 13:10:36 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 5, 26, 5, 59, 37)), + '2010/05/26 05:59:37 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 5, 27, 0, 8, 41)), + '2010/05/27 00:08:41 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 6, 20, 13, 13, 37)), + '2010/06/20 13:13:37 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 7, 28, 19, 56, 51)), + '2010/07/28 19:56:51 -0700') + assert_equals(datetime_to_ghdate(dt(2010, 9, 21, 4, 32, 49)), + '2010/09/21 04:32:49 -0700') From 47364e20d730c04efc513f9a65e93db1010c1c8b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:03:07 +0100 Subject: [PATCH 230/454] Added tests for commit datetime handling. --- tests/test_date_handling.py | 55 ++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index 94679c4..27702f2 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -6,7 +6,8 @@ from nose.tools import assert_equals -from github2.core import (ghdate_to_datetime, datetime_to_ghdate) +from github2.core import (ghdate_to_datetime, datetime_to_ghdate, + commitdate_to_datetime, datetime_to_commitdate) # Commented test cases are in PST, and aren't correctly handled with the @@ -62,3 +63,55 @@ def test_datetime_to_ghdate(): '2010/07/28 19:56:51 -0700') assert_equals(datetime_to_ghdate(dt(2010, 9, 21, 4, 32, 49)), '2010/09/21 04:32:49 -0700') + + +def test_commitdate_to_datetime(): + assert_equals(commitdate_to_datetime('2011-05-22T00:24:15-07:00'), + dt(2011, 5, 22, 0, 24, 15)) + + assert_equals(commitdate_to_datetime('2011-04-09T10:07:30-07:00'), + dt(2011, 4, 9, 10, 7, 30)) + #assert_equals(commitdate_to_datetime('2011-02-19T07:16:11-08:00'), + # dt(2011, 2, 19, 7, 16, 11)) + #assert_equals(commitdate_to_datetime('2010-12-21T12:34:27-08:00'), + # dt(2010, 12, 21, 12, 34, 27)) + assert_equals(commitdate_to_datetime('2011-04-09T10:20:05-07:00'), + dt(2011, 4, 9, 10, 20, 5)) + assert_equals(commitdate_to_datetime('2011-04-09T10:05:58-07:00'), + dt(2011, 4, 9, 10, 5, 58)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) + assert_equals(commitdate_to_datetime('2011-04-09T10:00:21-07:00'), + dt(2011, 4, 9, 10, 0, 21)) + #assert_equals(commitdate_to_datetime('2010-12-16T15:10:59-08:00'), + # dt(2010, 12, 16, 15, 10, 59)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) + + +def test_datetime_to_commitdate(): + assert_equals(datetime_to_commitdate(dt(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15-07:00') + + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 7, 30)), + '2011-04-09T10:07:30-07:00') + #assert_equals(datetime_to_commitdate(dt(2011, 2, 19, 7, 16, 11)), + # '2011-02-19T07:16:11-08:00') + #assert_equals(datetime_to_commitdate(dt(2010, 12, 21, 12, 34, 27)), + # '2010-12-21T12:34:27-08:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 20, 5)), + '2011-04-09T10:20:05-07:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 5, 58)), + '2011-04-09T10:05:58-07:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 0, 21)), + '2011-04-09T10:00:21-07:00') + #assert_equals(datetime_to_commitdate(dt(2010, 12, 16, 15, 10, 59)), + # '2010-12-16T15:10:59-08:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') + assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') From 448c3524aefa5121f620b3b78c1b3f021c5cd7cf Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:05:30 +0100 Subject: [PATCH 231/454] Fixed date handling for Python 2.4. --- doc/api/core.rst | 2 ++ github2/core.py | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index e4feed5..e1ca301 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -8,6 +8,8 @@ Core of the :mod:`github2` package, but it is documented to aid contributors to the package. +.. autofunction:: strptime + .. autofunction:: ghdate_to_datetime .. autofunction:: datetime_to_ghdate diff --git a/github2/core.py b/github2/core.py index 68ceca4..d4d464e 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,3 +1,5 @@ +import time + from datetime import datetime GITHUB_TIMEZONE = "-0700" @@ -6,13 +8,27 @@ COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" +def strptime(string, format): + """Parse date strings according to specified format + + We have to create our :obj:`~datetime.datetime` objects indirectly to remain + compatible with Python 2.4, where the :class:`~datetime.datetime` class has + no :meth:`~datetime.datetime.strptime` method. + + :param str string: String to parse + :param str format: Datetime format + :return datetime: Parsed datetime + """ + return datetime(*(time.strptime(string, format)[:6])) + + def ghdate_to_datetime(github_date): """Convert Github date string to Python datetime :param str github_date: date string to parse """ date_without_tz = " ".join(github_date.strip().split()[:2]) - return datetime.strptime(date_without_tz, GITHUB_DATE_FORMAT) + return strptime(date_without_tz, GITHUB_DATE_FORMAT) def datetime_to_ghdate(datetime_): @@ -30,7 +46,7 @@ def commitdate_to_datetime(commit_date): :param str github_date: date string to parse """ date_without_tz = commit_date[:-6] - return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) + return strptime(date_without_tz, COMMIT_DATE_FORMAT) def datetime_to_commitdate(datetime_): From 0173a4992315eac51ccf9ee4d88ec29ca29d2a59 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:06:08 +0100 Subject: [PATCH 232/454] Fixed datetime to commit date formatting. Dates can now roundtrip. --- github2/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index d4d464e..cd103b6 100644 --- a/github2/core.py +++ b/github2/core.py @@ -6,6 +6,7 @@ GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S" #2009-03-21T18:01:48-07:00 COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" +COMMIT_TIMEZONE = "-07:00" def strptime(string, format): @@ -55,7 +56,7 @@ def datetime_to_commitdate(datetime_): :param str datetime_: datetime object to convert """ date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) - return "".join([date_without_tz, GITHUB_TIMEZONE]) + return "".join([date_without_tz, COMMIT_TIMEZONE]) class GithubCommand(object): From 99074a9e82b4610db9da92192cf0733a2c91f355 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:18:45 +0100 Subject: [PATCH 233/454] Handle User.created_at attributes as datetime objects. --- doc/api/core.rst | 2 ++ github2/core.py | 19 +++++++++++++++++++ github2/users.py | 4 +++- tests/test_user.py | 8 ++++---- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index e1ca301..ad5bbdd 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -16,6 +16,8 @@ Core .. autofunction:: commitdate_to_datetime .. autofunction:: datetime_to_commitdate +.. autofunction:: userdate_to_datetime + .. autofunction:: doc_generator .. autoclass:: GithubCommand diff --git a/github2/core.py b/github2/core.py index cd103b6..129d80d 100644 --- a/github2/core.py +++ b/github2/core.py @@ -59,6 +59,21 @@ def datetime_to_commitdate(datetime_): return "".join([date_without_tz, COMMIT_TIMEZONE]) +def userdate_to_datetime(user_date): + """Convert user date string to Python datetime + + Unfortunately this needs a special case because :meth:`~Github.users.show` + and :meth:`~Github.users.search` return a different formats for the + `created_at` attributes. + + :param str user_date: date string to parse + """ + try: + return ghdate_to_datetime(user_date) + except ValueError: + return strptime(user_date, '%Y-%m-%dT%H:%M:%SZ') + + class GithubCommand(object): def __init__(self, request): @@ -143,6 +158,10 @@ class DateAttribute(Attribute): "to": commitdate_to_datetime, "from": datetime_to_commitdate, }, + "user": { + "to" : userdate_to_datetime, + "from": datetime_to_ghdate, + } } def __init__(self, *args, **kwargs): diff --git a/github2/users.py b/github2/users.py index f2f2d10..4392592 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import BaseData, GithubCommand, DateAttribute, Attribute import urllib @@ -23,6 +23,8 @@ class User(BaseData): private_gist_count = Attribute( "Number of private gists owned by the user") plan = Attribute("Current active github plan") + created_at = DateAttribute("The date this user was registered", + format="user") def is_authenticated(self): """Test for user auththenication diff --git a/tests/test_user.py b/tests/test_user.py index 9073546..ac24490 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,5 +1,7 @@ import _setup +import datetime + from nose.tools import (assert_equals, assert_false, assert_true) import utils @@ -18,10 +20,8 @@ def test_user(self): def test_meta(self): user = self.client.users.show('defunkt') - # Difficult to handle created_at attribute as its content varies - # depending on API path. - #assert_equals(user.created_at, - # datetime.datetime(2007, 10, 19, 22, 24, 19)) + assert_equals(user.created_at, + datetime.datetime(2007, 10, 19, 22, 24, 19)) assert_equals(user.followers_count, 2593) assert_equals(user.following_count, 212) assert_equals(user.gravatar_id, 'b8dbb1987e8e5318584865f880036796') From 5469bc70e1f765284952949eee994a08e0a25654 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:20:29 +0100 Subject: [PATCH 234/454] Fixed incorrect datetime_ parameter docs. --- github2/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/core.py b/github2/core.py index 129d80d..28f5045 100644 --- a/github2/core.py +++ b/github2/core.py @@ -35,7 +35,7 @@ def ghdate_to_datetime(github_date): def datetime_to_ghdate(datetime_): """Convert Python datetime to Github date string - :param str datetime_: datetime object to convert + :param datetime datetime_: datetime object to convert """ date_without_tz = datetime_.strftime(GITHUB_DATE_FORMAT) return " ".join([date_without_tz, GITHUB_TIMEZONE]) @@ -53,7 +53,7 @@ def commitdate_to_datetime(commit_date): def datetime_to_commitdate(datetime_): """Convert Python datetime to Github date string - :param str datetime_: datetime object to convert + :param datetime datetime_: datetime object to convert """ date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) return "".join([date_without_tz, COMMIT_TIMEZONE]) From f1f0dff9988c626e6a5c1d374f4c82f483d458ce Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:38:32 +0100 Subject: [PATCH 235/454] Added extra link to OAuth documentation in client doc. --- doc/api/client.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 86c8122..a163c92 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -16,7 +16,7 @@ username and API token, use:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......") -If you authenticated to GitHub using their OAuth service, pass in the OAuth +If you authenticated to GitHub using their `OAuth service`_, pass in the OAuth access token:: >>> github = Github(access_token="........") @@ -51,3 +51,5 @@ given, is 8080:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......", ... proxy_host="my.proxy.com", proxy_port=9000) + +.. _OAuth service: http://develop.github.com/p/oauth.html From 2b3caa1977f5bc017abf94787960d269f80cf298 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:39:11 +0100 Subject: [PATCH 236/454] Minor typo and grammar fixes. --- doc/api/client.rst | 4 ++-- doc/contributing.rst | 8 ++++---- doc/index.rst | 2 +- doc/quickstart.rst | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index a163c92..18cc115 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -35,8 +35,8 @@ during setup:: >>> github = Github(username="ask", api_token=".......", cache="cache_dir") API calls are limited by github.com to 1 per second by default. To have the -Github client enforce this and avoid rate limit errors, pass requests_per_second -in:: +``Github`` client enforce this and avoid rate limit errors, pass +``requests_per_second`` in:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......", diff --git a/doc/contributing.rst b/doc/contributing.rst index b94e672..dfca408 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -11,7 +11,7 @@ contributor. Following the simple guidelines below makes it easier to review and integrate your changes: -* `PEP 8`_, the Python style guide, should be followed where possible +* :pep:`8`, the Python style guide, should be followed where possible * Adding documentation for new methods and classes is very important * Testing your changes with multiple Python versions is fantastically useful, it is all too easy to use functionality that exists in only specific Python @@ -33,8 +33,9 @@ Tests patches to increase test coverage are greatly appreciated The preferred way to run the package's tests is with :pypi:`nose`. -``nosetests`` provides excellent reporting options and its additional features -make it invaluable, see the nose_ documentation for usage information. +``nosetests``, nose's command-line test runner, provides excellent reporting +options and its additional features make it invaluable, see the nose_ +documentation for usage information. There is a :pypi:`tox` configuration file included in the repository, you can use it to run the tests against multiple Python versions with a single command. @@ -79,7 +80,6 @@ unfortunately can't be used. likely to be comfortable with these already .. _GitHub: https://github.com/ask/python-github2/ -.. _PEP 8: http://www.python.org/dev/peps/pep-0008/ .. _Sphinx: http://sphinx.pocoo.org/ .. _autodoc: http://sphinx.pocoo.org/ext/autodoc.html#module-sphinx.ext.autodoc .. _nose: http://somethingaboutorange.com/mrl/projects/nose/ diff --git a/doc/index.rst b/doc/index.rst index 6a7e40c..e13f974 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -17,7 +17,7 @@ :prefix: Download :class: sidebar -This is an experimental python library implementing all of the features +This is an experimental Python library implementing all of the features available in version 2 of the `Github API`_. You should read the developer documentation for the `Github API`_ first. diff --git a/doc/quickstart.rst b/doc/quickstart.rst index e1ab25e..fe314e2 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -2,7 +2,7 @@ Quickstart ========== Once :mod:`github2` is :doc:`installed ` we can open an interactive -Python session, and perform some basic tasks to familiarise ourselves with the +Python session and perform some basic tasks to familiarise ourselves with the package. Create an unauthenticated client object:: From 46cf89c3f3195c0712ee9d31bbb2c53340eac758 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:39:41 +0100 Subject: [PATCH 237/454] Mark core classes as 'class(type)' in docs. --- doc/api/core.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index ad5bbdd..fa6c773 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -20,10 +20,10 @@ Core .. autofunction:: doc_generator -.. autoclass:: GithubCommand +.. autoclass:: GithubCommand(type) -.. autoclass:: Attribute +.. autoclass:: Attribute(type) -.. autoclass:: DateAttribute +.. autoclass:: DateAttribute(type) -.. autoclass:: BaseDataType +.. autoclass:: BaseDataType(type) From 29fde00b98b2c1a0b8669efe5b947f06b762f8be Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:40:05 +0100 Subject: [PATCH 238/454] No need to specify py Sphinx domain, it is default. --- doc/api/network.rst | 2 +- doc/api/object.rst | 2 +- doc/api/organizations.rst | 2 +- doc/api/teams.rst | 2 +- doc/quickstart.rst | 2 +- github2/core.py | 2 +- github2/request.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/api/network.rst b/doc/api/network.rst index 8ba715c..2825cff 100644 --- a/doc/api/network.rst +++ b/doc/api/network.rst @@ -1,7 +1,7 @@ Network ======= -.. py:currentmodule:: github2.client +.. currentmodule:: github2.client .. automethod:: Github.get_network_meta diff --git a/doc/api/object.rst b/doc/api/object.rst index 326c78a..29227a3 100644 --- a/doc/api/object.rst +++ b/doc/api/object.rst @@ -1,7 +1,7 @@ Object ====== -.. py:currentmodule:: github2.client +.. currentmodule:: github2.client .. automethod:: Github.get_all_blobs diff --git a/doc/api/organizations.rst b/doc/api/organizations.rst index 56dac9c..a75bc65 100644 --- a/doc/api/organizations.rst +++ b/doc/api/organizations.rst @@ -1,7 +1,7 @@ Organizations ============= -.. py:currentmodule:: github2.organizations +.. currentmodule:: github2.organizations .. autoclass:: Organization(type) diff --git a/doc/api/teams.rst b/doc/api/teams.rst index ceef6d5..8a67cf8 100644 --- a/doc/api/teams.rst +++ b/doc/api/teams.rst @@ -1,7 +1,7 @@ Teams ===== -.. py:currentmodule:: github2.teams +.. currentmodule:: github2.teams .. autoclass:: Team(type) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index fe314e2..bb41f5e 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -23,7 +23,7 @@ Read the description of the ``python-github2`` project:: >>> repo = github.repos.show("ask/python-github2") >>> repo.description -We can take advantage of Python's :py:func:`dir` to explore the package a +We can take advantage of Python's :func:`dir` to explore the package a little more:: >>> filter(lambda s: not s.startswith("_"), dir(github.users)) diff --git a/github2/core.py b/github2/core.py index 28f5045..968021a 100644 --- a/github2/core.py +++ b/github2/core.py @@ -129,7 +129,7 @@ def doc_generator(docstring, attributes): docstring = docstring or "" def bullet(title, text): - return """.. py:attribute:: %s\n\n %s\n""" % (title, text) + return """.. attribute:: %s\n\n %s\n""" % (title, text) b = "\n".join([bullet(attr_name, attr.help) for attr_name, attr in attributes.items()]) diff --git a/github2/request.py b/github2/request.py index b9bd3db..1e1e4d2 100644 --- a/github2/request.py +++ b/github2/request.py @@ -53,7 +53,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, cache=None, proxy_host=None, proxy_port=None): """Make an API request. - :see: :py:class:`github2.client.Github` + :see: :class:`github2.client.Github` """ self.username = username self.api_token = api_token From 0e784dd4f0b7b920ecc3c4a7e3c2175a2ef93dee Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:40:29 +0100 Subject: [PATCH 239/454] Show branch coverage results by default. --- .coveragerc | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..398ff08 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,2 @@ +[run] +branch = True From 115dd2dc2b47c3f8e04d81793b3338c2eec40089 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 10:42:06 +0100 Subject: [PATCH 240/454] Don't make test coverage seem so dismal ;) --- doc/contributing.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index dfca408..ad3f31c 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -29,8 +29,8 @@ Tests ----- .. note:: - Unfortunately there aren't many tests for ``github2`` at the moment, any - patches to increase test coverage are greatly appreciated + Unfortunately test coverage isn't as high as one would hope, patches to + increase test coverage are greatly appreciated! The preferred way to run the package's tests is with :pypi:`nose`. ``nosetests``, nose's command-line test runner, provides excellent reporting From 997187d78af315c8bc3bf6917cfe61e623965d51 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 22:08:40 +0100 Subject: [PATCH 241/454] Added quick commit listing tests. --- ...,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 | 14 ++++++++ ...thon.html,8622bc5e052f03439528cc9b7bf3fea2 | 14 ++++++++ ...,Makefile,75d9a1e41e76c3b924420d48b56dc756 | 14 ++++++++ ...ay,master,bfb4f990e48c87dab73d988a81318d69 | 14 ++++++++ tests/test_commits.py | 36 +++++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 create mode 100644 tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 create mode 100644 tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 create mode 100644 tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 create mode 100644 tests/test_commits.py diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 new file mode 100644 index 0000000..7d9f455 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 @@ -0,0 +1,14 @@ +status: 200 +content-length: 19508 +content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages +set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +x-runtime: 74ms +server: nginx/0.7.67 +connection: keep-alive +etag: "f853c8c431fcb88f7d265f942abcb2a1" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 20:51:32 GMT +content-type: application/json; charset=utf-8 + +{"commits":[{"parents":[{"id":"dc510f30d64636acec23adb685f75216b2a5c536"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/482f657443df4b701137a3025ae08476cddd2b7d","id":"482f657443df4b701137a3025ae08476cddd2b7d","committed_date":"2011-05-22T00:24:02-07:00","authored_date":"2011-05-22T00:24:02-07:00","message":"Regenerated to master@37233b357d1a3648434ffda8f569ce96b3bcbf53.","tree":"1001c361f15bd70b4cb1d8675d46cbe2f869d922","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c900486c92de886e204de0de9ab7ebb025300796"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc510f30d64636acec23adb685f75216b2a5c536","id":"dc510f30d64636acec23adb685f75216b2a5c536","committed_date":"2011-05-20T11:24:57-07:00","authored_date":"2011-05-20T11:24:57-07:00","message":"Regenerated to master@77174d5106157dd497a38152ff694616a6569e67.","tree":"120a08b10c9c39457c89a489e3c61cdf6150eb73","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"42f6555b92064d9517c4c01786dd2d1a726267ba"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c900486c92de886e204de0de9ab7ebb025300796","id":"c900486c92de886e204de0de9ab7ebb025300796","committed_date":"2011-05-18T06:19:40-07:00","authored_date":"2011-05-18T06:19:40-07:00","message":"Regenerated to master@ddcad38eea125d5e0748b5c9a3c39d05269bd584.","tree":"7176d813fcd92e06e7cf63bbc4a489da0f0d6a96","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42f6555b92064d9517c4c01786dd2d1a726267ba","id":"42f6555b92064d9517c4c01786dd2d1a726267ba","committed_date":"2011-05-18T06:19:33-07:00","authored_date":"2011-05-18T06:19:33-07:00","message":"Regenerated to master@6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2.","tree":"a764431dd319a830a6ebcfae3899b914f9f27a3a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"22d7a0ea8bd62a4ed6740568e401be59a024e909"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","committed_date":"2011-05-18T06:19:26-07:00","authored_date":"2011-05-18T06:19:26-07:00","message":"Regenerated to master@07bfd80949820c9215e48ebb5e11d2fd48923e5a.","tree":"471163e95ce3c23d2b732bd001d56bca759c2420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"883e534ed48b3f672d6377d7804d55bb6dd8619b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22d7a0ea8bd62a4ed6740568e401be59a024e909","id":"22d7a0ea8bd62a4ed6740568e401be59a024e909","committed_date":"2011-05-18T06:19:19-07:00","authored_date":"2011-05-18T06:19:19-07:00","message":"Regenerated to master@944386cde5c100e699d0c2cb0ce403bf7e9cb8e7.","tree":"17dc717577ffc2c6f021efd65ec08ff3042b3e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f1416b80d2d8b1400561c62caa3a8c419d565c8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/883e534ed48b3f672d6377d7804d55bb6dd8619b","id":"883e534ed48b3f672d6377d7804d55bb6dd8619b","committed_date":"2011-05-18T06:19:12-07:00","authored_date":"2011-05-18T06:19:12-07:00","message":"Regenerated to master@dc40235add8b9cecd18b8d62a932ead301351075.","tree":"a070f9ccff562fd99bfdc30dcab3636e5787c493","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"bc629a169cf2c39391f07d4a8280d72926a5cf37"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8f1416b80d2d8b1400561c62caa3a8c419d565c8","id":"8f1416b80d2d8b1400561c62caa3a8c419d565c8","committed_date":"2011-05-18T06:19:03-07:00","authored_date":"2011-05-18T06:19:03-07:00","message":"Regenerated to master@472da1f32f55d219286b106c97fa25dab1c33758.","tree":"4634dd6b341f04f5f030ab7a6f8ec04780b03ddc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/bc629a169cf2c39391f07d4a8280d72926a5cf37","id":"bc629a169cf2c39391f07d4a8280d72926a5cf37","committed_date":"2011-05-18T06:18:55-07:00","authored_date":"2011-05-18T06:18:55-07:00","message":"Regenerated to master@79c0fb209d27eded8947eb4ffa5c74db4379abfe.","tree":"94957a98dc1f3898806ad9a6639dc2f634372120","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/663d32bc6d0644762cc5c80b29ee407efaeaaa14","id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14","committed_date":"2011-05-18T06:18:48-07:00","authored_date":"2011-05-18T06:18:48-07:00","message":"Regenerated to master@0dac8c2a2410325d5095cf5c290fae441843eec6.","tree":"c722d5bc095b3c6db4ebdcb8411d23ae0aa8c753","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","committed_date":"2011-05-18T06:18:41-07:00","authored_date":"2011-05-18T06:18:41-07:00","message":"Regenerated to master@de547eab8229243de4906826a622b9305c5b972d.","tree":"553e39c28587b664b0ee28b7426cfa82f3800d17","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","committed_date":"2011-05-18T06:18:34-07:00","authored_date":"2011-05-18T06:18:34-07:00","message":"Regenerated to master@c5a0736ee365ff994ba415a42622c26016e98201.","tree":"d8d7fc2e2da5cdb910e1c501c872656f25368012","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","committed_date":"2011-05-18T06:17:38-07:00","authored_date":"2011-05-18T06:17:38-07:00","message":"Regenerated to master@01b36090e191bfa74da5199d322c6028b15f0c86.","tree":"919c8aad024b7877ef1165026372be223d31f40d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f0b4cf728581a2810191e04f95969460dce9846c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/481f71c738fbf5e85d0f91a6641af5fe2be58b51","id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51","committed_date":"2011-05-18T05:49:29-07:00","authored_date":"2011-05-18T05:49:29-07:00","message":"Regenerated to master@9bd07338404171f18dcbb99b6bf351fbb6c3a8f1.","tree":"719716dfa3d81d214ce3b968c6a8f8b67511b7f8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"30a0291143512c66f3ad2811c008262e3f9c14c5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f0b4cf728581a2810191e04f95969460dce9846c","id":"f0b4cf728581a2810191e04f95969460dce9846c","committed_date":"2011-05-18T05:49:21-07:00","authored_date":"2011-05-18T05:49:21-07:00","message":"Regenerated to master@4654ab67b1767f066e38cfb55910095bbd797b2e.","tree":"671d07f1dcd6f4cb9b3ed7ec0c0a64c15cff924f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"901eae55af985825b5052e52892170f895f35d26"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/30a0291143512c66f3ad2811c008262e3f9c14c5","id":"30a0291143512c66f3ad2811c008262e3f9c14c5","committed_date":"2011-05-18T05:49:09-07:00","authored_date":"2011-05-18T05:49:09-07:00","message":"Regenerated to master@7fb4cf687ade6bfaffd22fc5fc06a77c2b706719.","tree":"3bc5da3e1815beaf6aaa0eee080b0f31c3464282","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5afc160a71e9f2197de1665a0a50d72395f97c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/901eae55af985825b5052e52892170f895f35d26","id":"901eae55af985825b5052e52892170f895f35d26","committed_date":"2011-05-18T05:48:23-07:00","authored_date":"2011-05-18T05:48:23-07:00","message":"Regenerated to master@6a328b3b4b1171de211dd2db765b1b403dea8e3a.","tree":"d6e0d83186ae524b7a3f6192601b726537adbb12","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5afc160a71e9f2197de1665a0a50d72395f97c1","id":"f5afc160a71e9f2197de1665a0a50d72395f97c1","committed_date":"2011-05-18T05:48:11-07:00","authored_date":"2011-05-18T05:48:11-07:00","message":"Regenerated to master@af39c23bbd4abab5b663c66d2cd1a81f3128c4f0.","tree":"d17e07f72894905ac6dd27052222cbeeb2c0b89d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8763c79257d40461b24427ba90cc9f49c353bce7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3e0c3a8997a3943db26f9b29551a07ac2dd273e7","id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7","committed_date":"2011-05-18T05:47:59-07:00","authored_date":"2011-05-18T05:47:59-07:00","message":"Regenerated to master@3fe9cb3de79b132e461c397176138abff39c6a28.","tree":"a440bb9b08d4cd7eb6a4a8b6c61cfb7311e8478d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f5e47c236cd5846a8b466b64fbc495946297e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8763c79257d40461b24427ba90cc9f49c353bce7","id":"8763c79257d40461b24427ba90cc9f49c353bce7","committed_date":"2011-05-18T05:47:12-07:00","authored_date":"2011-05-18T05:47:12-07:00","message":"Regenerated to master@6c8484ef6186c06093553f44c830597eff01b59e.","tree":"16361af013b2f41803fdcd20907c479c9052df30","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"38a34ed6c0f72157438e576a2cabd855dba2f98f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5f5e47c236cd5846a8b466b64fbc495946297e4","id":"f5f5e47c236cd5846a8b466b64fbc495946297e4","committed_date":"2011-05-17T15:05:40-07:00","authored_date":"2011-05-17T15:05:40-07:00","message":"Regenerated to master@2db3879ca018193235c8967562ce9f4853202943.","tree":"89666ab4f20f6bdd272025aa5dc10d2432bd29a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"29d1172e655664ebd8f8df783f39972bb78a5740"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/38a34ed6c0f72157438e576a2cabd855dba2f98f","id":"38a34ed6c0f72157438e576a2cabd855dba2f98f","committed_date":"2011-05-17T15:04:22-07:00","authored_date":"2011-05-17T15:04:22-07:00","message":"Regenerated to master@6b86595f9a5f049b52d359b3c9c56895851ef021.","tree":"020f7ad66cb5a84900f89ee2dff620c83f022c76","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e982c08b1c4d96cd9b734c677f1f023dd4380685"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/29d1172e655664ebd8f8df783f39972bb78a5740","id":"29d1172e655664ebd8f8df783f39972bb78a5740","committed_date":"2011-05-17T15:04:14-07:00","authored_date":"2011-05-17T15:04:14-07:00","message":"Regenerated to master@abb405c5b3cec29acf471cc5170f03b834106a6d.","tree":"a117c14f4a64eccf95c7d310e6059d3dd0b11bcb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7319a81f15c5a99203c01f7438959ca021334179"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e982c08b1c4d96cd9b734c677f1f023dd4380685","id":"e982c08b1c4d96cd9b734c677f1f023dd4380685","committed_date":"2011-05-17T06:11:23-07:00","authored_date":"2011-05-17T06:11:23-07:00","message":"Regenerated to master@f72c51b7f65ada1bd377298c0e462fed499afcee.","tree":"a0139a1fd72f0062fafe128784a352e633df8f56","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9691bcc215a8fe204661044c625d97c55f1f8653"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7319a81f15c5a99203c01f7438959ca021334179","id":"7319a81f15c5a99203c01f7438959ca021334179","committed_date":"2011-05-17T06:11:16-07:00","authored_date":"2011-05-17T06:11:16-07:00","message":"Regenerated to master@48b55622c5c478bb5e6ffa0426c37f16029e6637.","tree":"8950bf04f5a650e1b354c234e8bab6529efbb683","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e5b1a93b37350421766cda46b90cabdd2171d197"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9691bcc215a8fe204661044c625d97c55f1f8653","id":"9691bcc215a8fe204661044c625d97c55f1f8653","committed_date":"2011-05-17T06:11:06-07:00","authored_date":"2011-05-17T06:11:06-07:00","message":"Regenerated to master@0e5d390672e7713ce9d6882820477fa26a2403a8.","tree":"1fc1562e7607848761d3af82fdf8cc3f25664c09","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"373157918971c6f5e313491ef6006c67fd50d497"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e5b1a93b37350421766cda46b90cabdd2171d197","id":"e5b1a93b37350421766cda46b90cabdd2171d197","committed_date":"2011-05-17T06:10:59-07:00","authored_date":"2011-05-17T06:10:59-07:00","message":"Regenerated to master@aadb8c461bcff5f98d2629791a6526319ebedebf.","tree":"990626dece365eaa5894e07972eb72ee584133ff","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac185a94dd7f5190ac317ee16042244ff0e24783"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/373157918971c6f5e313491ef6006c67fd50d497","id":"373157918971c6f5e313491ef6006c67fd50d497","committed_date":"2011-05-17T06:10:47-07:00","authored_date":"2011-05-17T06:10:47-07:00","message":"Regenerated to master@938698435b6feaeb5798b0b8265dec3c86a79f21.","tree":"0f91836cab86969d1e17ff2c4d1756788bac1bdf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac185a94dd7f5190ac317ee16042244ff0e24783","id":"ac185a94dd7f5190ac317ee16042244ff0e24783","committed_date":"2011-05-17T06:10:38-07:00","authored_date":"2011-05-17T06:10:38-07:00","message":"Regenerated to master@1a81af79e9448cc17cb962e6e554d2f95627e48a.","tree":"170fa4eb3372c8fae99c757c9e881b16d9f42b4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cb4e460851da323c1821b83b3ee9431e7961bb90"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/39dfbb9ff704c4d0c86b48deccdf35c013b45871","id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871","committed_date":"2011-05-17T06:10:23-07:00","authored_date":"2011-05-17T06:10:23-07:00","message":"Regenerated to master@a42f9cc6206d3ab898d7e3f128d9435bccec36f3.","tree":"27d6c775e3514cb0047bdf37e1e0d4d62a49b86e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb4e460851da323c1821b83b3ee9431e7961bb90","id":"cb4e460851da323c1821b83b3ee9431e7961bb90","committed_date":"2011-05-17T06:10:14-07:00","authored_date":"2011-05-17T06:10:14-07:00","message":"Regenerated to master@f305a8e19072faa41332ff771eef352d99b720dd.","tree":"4016b7b079894de95c66bc3d8e7afe2e594daccd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c7cb7d1931711ced912190193d53e26cac72d0b8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac10f735a5ff397403cdb5336ee7361eba00a2ee","id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee","committed_date":"2011-05-17T06:10:05-07:00","authored_date":"2011-05-17T06:10:05-07:00","message":"Regenerated to master@0f13d2e4f32191aa0f2c5429666f0afb31934aee.","tree":"e316a4711d80f71e10a4ee2a4540908ace2b2944","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c7cb7d1931711ced912190193d53e26cac72d0b8","id":"c7cb7d1931711ced912190193d53e26cac72d0b8","committed_date":"2011-05-17T06:09:57-07:00","authored_date":"2011-05-17T06:09:57-07:00","message":"Regenerated to master@44e4062f93c5d19d41f9d2158a382991f71b1142.","tree":"7791fcaf2992e7f762caf65bb8b7fc6756ca6a4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"495b96a92c6d673c462011284cca1e8c273eeb0c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","committed_date":"2011-05-17T06:09:36-07:00","authored_date":"2011-05-17T06:09:36-07:00","message":"Regenerated to master@f96f3d6df6e5c7be94957be247ddc0c569e99ed1.","tree":"b8e0182e827097942590d66e39bab525ec4c7cbf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e4740d92686cf0bd2f1b745a1fbcff7d6f67f282"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/495b96a92c6d673c462011284cca1e8c273eeb0c","id":"495b96a92c6d673c462011284cca1e8c273eeb0c","committed_date":"2011-05-17T06:09:26-07:00","authored_date":"2011-05-17T06:09:26-07:00","message":"Regenerated to master@7c4ab2b4bcc82b1a6e80c8aa6b66128eecbbd59a.","tree":"9b5aeceb9c96dd4483f3cfa6e9d89c2a4b48947c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 new file mode 100644 index 0000000..03bed3e --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 @@ -0,0 +1,14 @@ +status: 200 +content-length: 19508 +content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages/packages/dev-python.html +set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +x-runtime: 90ms +server: nginx/0.7.67 +connection: keep-alive +etag: "f853c8c431fcb88f7d265f942abcb2a1" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 20:54:07 GMT +content-type: application/json; charset=utf-8 + +{"commits":[{"parents":[{"id":"dc510f30d64636acec23adb685f75216b2a5c536"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/482f657443df4b701137a3025ae08476cddd2b7d","id":"482f657443df4b701137a3025ae08476cddd2b7d","committed_date":"2011-05-22T00:24:02-07:00","authored_date":"2011-05-22T00:24:02-07:00","message":"Regenerated to master@37233b357d1a3648434ffda8f569ce96b3bcbf53.","tree":"1001c361f15bd70b4cb1d8675d46cbe2f869d922","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c900486c92de886e204de0de9ab7ebb025300796"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc510f30d64636acec23adb685f75216b2a5c536","id":"dc510f30d64636acec23adb685f75216b2a5c536","committed_date":"2011-05-20T11:24:57-07:00","authored_date":"2011-05-20T11:24:57-07:00","message":"Regenerated to master@77174d5106157dd497a38152ff694616a6569e67.","tree":"120a08b10c9c39457c89a489e3c61cdf6150eb73","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42f6555b92064d9517c4c01786dd2d1a726267ba","id":"42f6555b92064d9517c4c01786dd2d1a726267ba","committed_date":"2011-05-18T06:19:33-07:00","authored_date":"2011-05-18T06:19:33-07:00","message":"Regenerated to master@6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2.","tree":"a764431dd319a830a6ebcfae3899b914f9f27a3a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"22d7a0ea8bd62a4ed6740568e401be59a024e909"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","committed_date":"2011-05-18T06:19:26-07:00","authored_date":"2011-05-18T06:19:26-07:00","message":"Regenerated to master@07bfd80949820c9215e48ebb5e11d2fd48923e5a.","tree":"471163e95ce3c23d2b732bd001d56bca759c2420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"883e534ed48b3f672d6377d7804d55bb6dd8619b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22d7a0ea8bd62a4ed6740568e401be59a024e909","id":"22d7a0ea8bd62a4ed6740568e401be59a024e909","committed_date":"2011-05-18T06:19:19-07:00","authored_date":"2011-05-18T06:19:19-07:00","message":"Regenerated to master@944386cde5c100e699d0c2cb0ce403bf7e9cb8e7.","tree":"17dc717577ffc2c6f021efd65ec08ff3042b3e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/663d32bc6d0644762cc5c80b29ee407efaeaaa14","id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14","committed_date":"2011-05-18T06:18:48-07:00","authored_date":"2011-05-18T06:18:48-07:00","message":"Regenerated to master@0dac8c2a2410325d5095cf5c290fae441843eec6.","tree":"c722d5bc095b3c6db4ebdcb8411d23ae0aa8c753","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","committed_date":"2011-05-18T06:18:41-07:00","authored_date":"2011-05-18T06:18:41-07:00","message":"Regenerated to master@de547eab8229243de4906826a622b9305c5b972d.","tree":"553e39c28587b664b0ee28b7426cfa82f3800d17","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","committed_date":"2011-05-18T06:18:34-07:00","authored_date":"2011-05-18T06:18:34-07:00","message":"Regenerated to master@c5a0736ee365ff994ba415a42622c26016e98201.","tree":"d8d7fc2e2da5cdb910e1c501c872656f25368012","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","committed_date":"2011-05-18T06:17:38-07:00","authored_date":"2011-05-18T06:17:38-07:00","message":"Regenerated to master@01b36090e191bfa74da5199d322c6028b15f0c86.","tree":"919c8aad024b7877ef1165026372be223d31f40d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f0b4cf728581a2810191e04f95969460dce9846c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/481f71c738fbf5e85d0f91a6641af5fe2be58b51","id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51","committed_date":"2011-05-18T05:49:29-07:00","authored_date":"2011-05-18T05:49:29-07:00","message":"Regenerated to master@9bd07338404171f18dcbb99b6bf351fbb6c3a8f1.","tree":"719716dfa3d81d214ce3b968c6a8f8b67511b7f8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"901eae55af985825b5052e52892170f895f35d26"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/30a0291143512c66f3ad2811c008262e3f9c14c5","id":"30a0291143512c66f3ad2811c008262e3f9c14c5","committed_date":"2011-05-18T05:49:09-07:00","authored_date":"2011-05-18T05:49:09-07:00","message":"Regenerated to master@7fb4cf687ade6bfaffd22fc5fc06a77c2b706719.","tree":"3bc5da3e1815beaf6aaa0eee080b0f31c3464282","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5afc160a71e9f2197de1665a0a50d72395f97c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/901eae55af985825b5052e52892170f895f35d26","id":"901eae55af985825b5052e52892170f895f35d26","committed_date":"2011-05-18T05:48:23-07:00","authored_date":"2011-05-18T05:48:23-07:00","message":"Regenerated to master@6a328b3b4b1171de211dd2db765b1b403dea8e3a.","tree":"d6e0d83186ae524b7a3f6192601b726537adbb12","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5afc160a71e9f2197de1665a0a50d72395f97c1","id":"f5afc160a71e9f2197de1665a0a50d72395f97c1","committed_date":"2011-05-18T05:48:11-07:00","authored_date":"2011-05-18T05:48:11-07:00","message":"Regenerated to master@af39c23bbd4abab5b663c66d2cd1a81f3128c4f0.","tree":"d17e07f72894905ac6dd27052222cbeeb2c0b89d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8763c79257d40461b24427ba90cc9f49c353bce7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3e0c3a8997a3943db26f9b29551a07ac2dd273e7","id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7","committed_date":"2011-05-18T05:47:59-07:00","authored_date":"2011-05-18T05:47:59-07:00","message":"Regenerated to master@3fe9cb3de79b132e461c397176138abff39c6a28.","tree":"a440bb9b08d4cd7eb6a4a8b6c61cfb7311e8478d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f5e47c236cd5846a8b466b64fbc495946297e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8763c79257d40461b24427ba90cc9f49c353bce7","id":"8763c79257d40461b24427ba90cc9f49c353bce7","committed_date":"2011-05-18T05:47:12-07:00","authored_date":"2011-05-18T05:47:12-07:00","message":"Regenerated to master@6c8484ef6186c06093553f44c830597eff01b59e.","tree":"16361af013b2f41803fdcd20907c479c9052df30","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e982c08b1c4d96cd9b734c677f1f023dd4380685"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/29d1172e655664ebd8f8df783f39972bb78a5740","id":"29d1172e655664ebd8f8df783f39972bb78a5740","committed_date":"2011-05-17T15:04:14-07:00","authored_date":"2011-05-17T15:04:14-07:00","message":"Regenerated to master@abb405c5b3cec29acf471cc5170f03b834106a6d.","tree":"a117c14f4a64eccf95c7d310e6059d3dd0b11bcb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7319a81f15c5a99203c01f7438959ca021334179"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e982c08b1c4d96cd9b734c677f1f023dd4380685","id":"e982c08b1c4d96cd9b734c677f1f023dd4380685","committed_date":"2011-05-17T06:11:23-07:00","authored_date":"2011-05-17T06:11:23-07:00","message":"Regenerated to master@f72c51b7f65ada1bd377298c0e462fed499afcee.","tree":"a0139a1fd72f0062fafe128784a352e633df8f56","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9691bcc215a8fe204661044c625d97c55f1f8653"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7319a81f15c5a99203c01f7438959ca021334179","id":"7319a81f15c5a99203c01f7438959ca021334179","committed_date":"2011-05-17T06:11:16-07:00","authored_date":"2011-05-17T06:11:16-07:00","message":"Regenerated to master@48b55622c5c478bb5e6ffa0426c37f16029e6637.","tree":"8950bf04f5a650e1b354c234e8bab6529efbb683","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac185a94dd7f5190ac317ee16042244ff0e24783","id":"ac185a94dd7f5190ac317ee16042244ff0e24783","committed_date":"2011-05-17T06:10:38-07:00","authored_date":"2011-05-17T06:10:38-07:00","message":"Regenerated to master@1a81af79e9448cc17cb962e6e554d2f95627e48a.","tree":"170fa4eb3372c8fae99c757c9e881b16d9f42b4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb4e460851da323c1821b83b3ee9431e7961bb90","id":"cb4e460851da323c1821b83b3ee9431e7961bb90","committed_date":"2011-05-17T06:10:14-07:00","authored_date":"2011-05-17T06:10:14-07:00","message":"Regenerated to master@f305a8e19072faa41332ff771eef352d99b720dd.","tree":"4016b7b079894de95c66bc3d8e7afe2e594daccd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c7cb7d1931711ced912190193d53e26cac72d0b8","id":"c7cb7d1931711ced912190193d53e26cac72d0b8","committed_date":"2011-05-17T06:09:57-07:00","authored_date":"2011-05-17T06:09:57-07:00","message":"Regenerated to master@44e4062f93c5d19d41f9d2158a382991f71b1142.","tree":"7791fcaf2992e7f762caf65bb8b7fc6756ca6a4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"495b96a92c6d673c462011284cca1e8c273eeb0c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","committed_date":"2011-05-17T06:09:36-07:00","authored_date":"2011-05-17T06:09:36-07:00","message":"Regenerated to master@f96f3d6df6e5c7be94957be247ddc0c569e99ed1.","tree":"b8e0182e827097942590d66e39bab525ec4c7cbf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e4740d92686cf0bd2f1b745a1fbcff7d6f67f282"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/495b96a92c6d673c462011284cca1e8c273eeb0c","id":"495b96a92c6d673c462011284cca1e8c273eeb0c","committed_date":"2011-05-17T06:09:26-07:00","authored_date":"2011-05-17T06:09:26-07:00","message":"Regenerated to master@7c4ab2b4bcc82b1a6e80c8aa6b66128eecbbd59a.","tree":"9b5aeceb9c96dd4483f3cfa6e9d89c2a4b48947c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8832aeb528b781e4ee15517b72fb8c12c953b3ca"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7e1731965a19c2c70b1a10b42cf01b9007291b40","id":"7e1731965a19c2c70b1a10b42cf01b9007291b40","committed_date":"2011-05-17T06:08:39-07:00","authored_date":"2011-05-17T06:08:39-07:00","message":"Regenerated to master@a487ce90671d5ef3244d742d7fbe5ddb450802c0.","tree":"eff57796660ae68d5223ef4faba4d37ad37b9e74","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6c0ecbe11add1596cf0420f07f8e5b1ceb396df3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/207d15e62a7ddb2d540da908b85437e87978a1e1","id":"207d15e62a7ddb2d540da908b85437e87978a1e1","committed_date":"2011-05-16T12:54:56-07:00","authored_date":"2011-05-16T12:54:56-07:00","message":"Regenerated to master@6b4a857ed3a0326fe543d5a41f49c942bae93420.","tree":"83534523596feaf881abfcc7eef1af92aba2e624","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d464c1dbe8de864da90423bca39f09d8a469782b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6c0ecbe11add1596cf0420f07f8e5b1ceb396df3","id":"6c0ecbe11add1596cf0420f07f8e5b1ceb396df3","committed_date":"2011-05-16T12:49:24-07:00","authored_date":"2011-05-16T12:49:24-07:00","message":"Regenerated to master@67da4a90939757514ef5b8907b1cc30da088372e.","tree":"9f1fc9939b7cb42eee18adb48303b9b550ed7a9f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c3676fcd73c1811abe26290dd4cd2da808468567"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3cb5e43810e2c96551a501172ac2c7afe1c635a2","id":"3cb5e43810e2c96551a501172ac2c7afe1c635a2","committed_date":"2011-05-14T06:07:04-07:00","authored_date":"2011-05-14T06:07:04-07:00","message":"Regenerated to master@d0ca7960c54b7c9a3ffd98e9ed5b430de4f1cf8f.","tree":"70fc54533649a0243cc2eee24e10f2889b984154","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d5711d508b6abdf75db245e4a019d5e231c45b66"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d19310d2a984e62f9d384c1af162d628f2d328e2","id":"d19310d2a984e62f9d384c1af162d628f2d328e2","committed_date":"2011-05-14T06:06:18-07:00","authored_date":"2011-05-14T06:06:18-07:00","message":"Regenerated to master@832382c82969074291673c3e4aba05fdcef11515.","tree":"953ca90550e721f055c2a08aab45757805079817","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7380a4c52a9c3442fa2e975e04479499bf96216f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d5711d508b6abdf75db245e4a019d5e231c45b66","id":"d5711d508b6abdf75db245e4a019d5e231c45b66","committed_date":"2011-05-14T04:26:35-07:00","authored_date":"2011-05-14T04:26:35-07:00","message":"Regenerated to master@8b8ca395b5c01fec3335480aab6eec667a680248.","tree":"1bffb4fe8b6ee8e2ab8aaad5481323023c9972ee","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9837e052d55f730afea7dfbec5ff649b81eb9552"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/99ca4e94afa0a0cdbde5172e16230305c90ae7dc","id":"99ca4e94afa0a0cdbde5172e16230305c90ae7dc","committed_date":"2011-05-14T04:25:57-07:00","authored_date":"2011-05-14T04:25:57-07:00","message":"Regenerated to master@41ef19778b0b975cf7942ae88deec19ee3a7245e.","tree":"32295f76ecec241b4ca6521342dac97a52949804","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6a011c235d25a97fee032317fda4afafac3c06b0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fc439c18008715db78150e3df88b57d77d3372f1","id":"fc439c18008715db78150e3df88b57d77d3372f1","committed_date":"2011-05-13T12:34:28-07:00","authored_date":"2011-05-13T12:34:28-07:00","message":"Regenerated to master@1413f01349c6187c6ed25896d1d90f9164783784.","tree":"bf901c86ac99a79697dd0b7689e6744c95fb3dd3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6a011c235d25a97fee032317fda4afafac3c06b0","id":"6a011c235d25a97fee032317fda4afafac3c06b0","committed_date":"2011-05-13T02:36:40-07:00","authored_date":"2011-05-13T02:36:40-07:00","message":"Regenerated to master@b276cdf6dc077f988fbf422ae150c518a0cf5c66.","tree":"d622cbf0065e5f8a2376b3e97ae4e30a8d11765f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ad818893ed1df55fa9fd2176fedea03c857e8fb3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d","id":"b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d","committed_date":"2011-05-12T08:50:32-07:00","authored_date":"2011-05-12T08:50:32-07:00","message":"Regenerated to master@2f09d163876dcc7832509844a7e6160598c8ed75.","tree":"ad8128fb4ba0d9ca26000b7153f4705d0c8abe58","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d91631eaf1d6351060123b79489df9663f60aa8e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ad818893ed1df55fa9fd2176fedea03c857e8fb3","id":"ad818893ed1df55fa9fd2176fedea03c857e8fb3","committed_date":"2011-05-12T07:21:30-07:00","authored_date":"2011-05-12T07:21:30-07:00","message":"Regenerated to master@709bad1bf4e70b735b1c1284f11db4b89d8a6936.","tree":"e36c66980818c31f574f74cb55f38baafdf5f706","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d67fc99da1a396f8bbe918900af741c2ab6eb219"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d91631eaf1d6351060123b79489df9663f60aa8e","id":"d91631eaf1d6351060123b79489df9663f60aa8e","committed_date":"2011-05-12T07:21:16-07:00","authored_date":"2011-05-12T07:21:16-07:00","message":"Regenerated to master@0934e9be7d28a79de1ebd8374cf146d6cca61e87.","tree":"99c251d931dbe690b41b4c062ec09960b5aa5743","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 new file mode 100644 index 0000000..57d90d1 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 @@ -0,0 +1,14 @@ +status: 200 +content-length: 17134 +content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master/Makefile +set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +x-runtime: 372ms +server: nginx/0.7.67 +connection: keep-alive +etag: "306a5ce3acb78b41e3e36ad181c44754" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 20:53:40 GMT +content-type: application/json; charset=utf-8 + +{"commits":[{"parents":[{"id":"8f24d1b91d885b3ce52dd8e7cc5e18b369c5867e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/41bcd985139189763256a8c82b8f0fcbe150eb03","id":"41bcd985139189763256a8c82b8f0fcbe150eb03","committed_date":"2011-04-29T21:17:59-07:00","authored_date":"2011-04-29T21:17:59-07:00","message":"Revert \"Write org-mode compatible removal reminders.\"\n\nThis reverts commit 4343c1c3ee6a353ed51ea863a8b213a05d5f5b80.\n\nConflicts:\n\n\tMakefile\n\tsupport/gen_removal.py","tree":"4ed8c0153f80d68fa68e434e6e12d8e2eec76281","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","id":"90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","committed_date":"2011-03-07T00:36:47-08:00","authored_date":"2011-03-07T00:02:09-08:00","message":"Switched to org-mode syntax for stabilisation reminders.","tree":"92c0eaeb7b29036393c05c3ee3142d879067e865","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f9be28146dce6fd69e36d7dd72b8ecf5bc9bbd1f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","committed_date":"2011-03-07T00:36:25-08:00","authored_date":"2011-03-07T00:01:41-08:00","message":"Write org-mode compatible removal reminders.\n\nNo longer using remind for this task.","tree":"f7f12bd835b4ae09e6bfc82bf04f8115e628aa85","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"639727a4d533288fdadcd68b8bde2dc84c26812c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7fe50fe7294204120a23c4199d575313d89cc1dd","id":"7fe50fe7294204120a23c4199d575313d89cc1dd","committed_date":"2011-02-10T14:17:41-08:00","authored_date":"2011-02-10T14:17:41-08:00","message":"Small formatting and indentation fix.","tree":"02ad5b7e568f63ee9fe7d4244755451035bda02b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9e60846c4692cccb38361f5eb93347ed1ad782bc"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/639727a4d533288fdadcd68b8bde2dc84c26812c","id":"639727a4d533288fdadcd68b8bde2dc84c26812c","committed_date":"2011-02-10T14:17:16-08:00","authored_date":"2011-02-10T14:17:16-08:00","message":"Don't fail Manifest generation with unset SIGN_KEY.","tree":"17251ab93e3d9d7f1a204c9387495a4658418257","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0d519f8110843158a21d14c01d852b2ceef9f21f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9e60846c4692cccb38361f5eb93347ed1ad782bc","id":"9e60846c4692cccb38361f5eb93347ed1ad782bc","committed_date":"2011-02-10T14:15:32-08:00","authored_date":"2011-02-10T14:15:32-08:00","message":"Don't regenerate categories list for packages.","tree":"19153dc4562525730e67753b3c3dd3149b5376b6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"50ab7577069d92f97634aff0a491a8a6fba11d71"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fa7796f65f38ad5e6587f1e6a85fd03f53d14023","id":"fa7796f65f38ad5e6587f1e6a85fd03f53d14023","committed_date":"2011-02-04T03:12:25-08:00","authored_date":"2011-02-04T03:12:25-08:00","message":"Generate doc/thanks.rst from README.rst.\n\nReally shouldn't be manually maintaining lists.","tree":"25c92e68f1083444c6d7db6dbe597bea027aef8d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2f3b0f35fdf24af9246f237843240915a18e9aa3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f55f382d4f395d0d0e807c77495776224c0e1a23","id":"f55f382d4f395d0d0e807c77495776224c0e1a23","committed_date":"2011-02-02T09:31:51-08:00","authored_date":"2011-02-02T09:19:13-08:00","message":"Fixed categories generation, should overwrite and not append.","tree":"7228d33c816d69d5e9a5cbc63c421366e3304319","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a99c6a599adbce66f69437515182ec205ebe1123"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/053c83cd2413d36b25413279eb1065c89e3e048d","id":"053c83cd2413d36b25413279eb1065c89e3e048d","committed_date":"2011-02-01T05:35:07-08:00","authored_date":"2011-02-01T05:35:07-08:00","message":"Moved news signing comment out of rule, it shouldn't be displayed.","tree":"860eadb5d60fe8f30553b72da214fd46601c6b05","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"074eedb9c02842a0196b4b9ad3ee386bc6182a84"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a99c6a599adbce66f69437515182ec205ebe1123","id":"a99c6a599adbce66f69437515182ec205ebe1123","committed_date":"2011-02-01T05:29:13-08:00","authored_date":"2011-02-01T05:29:13-08:00","message":"Added rule to re-generate HTML documentation.","tree":"9e9d6df5fa81a759adcd6b8fc2197baa8fa75938","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cb2234e17ebf226097321873cbb52d3ab924cf52"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","id":"e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","committed_date":"2011-01-29T23:49:11-08:00","authored_date":"2011-01-29T23:49:11-08:00","message":"Validate reST syntax with check rule.","tree":"90fede79cf4777fc9f0deb7a47f7696d5c0afbbd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"764c5aa41de29e22ff23c45c7278234ca1802795"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb2234e17ebf226097321873cbb52d3ab924cf52","id":"cb2234e17ebf226097321873cbb52d3ab924cf52","committed_date":"2011-01-29T23:46:05-08:00","authored_date":"2011-01-29T23:46:05-08:00","message":"No need to loop for profiles/categories generation.","tree":"92ed35edc1c4ca1072204a3b60087c3c2f4b5523","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"19838ee7086f5517bb5722986bca825e803d6304"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/764c5aa41de29e22ff23c45c7278234ca1802795","id":"764c5aa41de29e22ff23c45c7278234ca1802795","committed_date":"2011-01-29T23:45:40-08:00","authored_date":"2011-01-29T23:45:40-08:00","message":"Delete stale signatures, if SIGN_KEY is not set.","tree":"7f3546c7fbbda89b5e73c76b12c2b2d69e63530a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f81e2b6b85169e487ec462864ea0d27ca25fefdd","id":"f81e2b6b85169e487ec462864ea0d27ca25fefdd","committed_date":"2011-01-12T05:38:07-08:00","authored_date":"2011-01-12T05:38:06-08:00","message":"Updated cupage-check rule to check for watch file existence.","tree":"56e1a14e263c3fac5f199abcb9966300f7cf106e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d1f839991b272875e0c5589bfdb3dd75668a72f2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","committed_date":"2011-01-12T05:37:43-08:00","authored_date":"2011-01-12T05:37:43-08:00","message":"Generate cupage.conf from watch files.","tree":"c0e404e5a8ebf36bcef6c580622c2b645820533c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af5f536666b22b864d1012b7b02258cf745d89ae"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4f01f61e35439c1458a01e389f1c8dbe3496e3bf","id":"4f01f61e35439c1458a01e389f1c8dbe3496e3bf","committed_date":"2010-12-06T03:39:29-08:00","authored_date":"2010-12-06T03:39:29-08:00","message":"Manifests depend on ChangeLogs and metadata.xml.","tree":"b999161e481624d61f446d7fa4fdc32db6def3c3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b58cfa8600da5ad54b382067ad7c6e270845ea0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af5f536666b22b864d1012b7b02258cf745d89ae","id":"af5f536666b22b864d1012b7b02258cf745d89ae","committed_date":"2010-12-06T03:37:30-08:00","authored_date":"2010-12-06T03:37:30-08:00","message":"Read repository name from profiles/repo_name.","tree":"99244aa4b9404b64af0dea365cc54ad809cf9b35","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"60ba3e0f33576cebbfcea06307dabd7394164541"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6adf9d861925c5f66c0c1883e6c70c423bd409d4","id":"6adf9d861925c5f66c0c1883e6c70c423bd409d4","committed_date":"2010-12-06T03:26:08-08:00","authored_date":"2010-12-06T03:26:08-08:00","message":"Switched to egencache for use.local.desc generation.","tree":"a29b65e2faaf6481fb2d5a6388e890b3524836e1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"31792887bcee17be39401fa59f681c243a2a2519"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/290fec4694bddde6ca54584cfd26c04b69e3dd6e","id":"290fec4694bddde6ca54584cfd26c04b69e3dd6e","committed_date":"2010-11-01T09:20:53-07:00","authored_date":"2010-11-01T09:20:53-07:00","message":"Fixed generation of news file signatures.","tree":"34c9f3041b226619376375f3e4b4444372ca0642","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cc66dc063bd13810a3f8fb093a1080052e426f82"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/128ac9109ac751a569588ae056dffa336e21a1d2","id":"128ac9109ac751a569588ae056dffa336e21a1d2","committed_date":"2010-08-24T21:49:06-07:00","authored_date":"2010-08-24T21:49:06-07:00","message":"Regenerate removal.remind if gen_removal.py changes.","tree":"cf67a412f9596e7712f55cfe91eea755c0f61a88","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"826fee37fa53cf2073d27424913291d2bdb11b78"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7434a9050a915925004bf7b4467026525d55bfe7","id":"7434a9050a915925004bf7b4467026525d55bfe7","committed_date":"2010-06-17T23:46:20-07:00","authored_date":"2010-06-17T23:30:53-07:00","message":"Added layman XML validation checks.","tree":"999127b0d3eaf319bcc6b927c44c51bf5706193d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6d38719b62decff9bbae5596a26fbfb5188cc629"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ffce8932c08076b1025bdc4c9fb77ac14ba7894c","id":"ffce8932c08076b1025bdc4c9fb77ac14ba7894c","committed_date":"2010-04-19T02:07:06-07:00","authored_date":"2010-04-19T02:07:06-07:00","message":"Use --strict with rst2html conversions.","tree":"7b4938d419aceee60d2d010b5554af168c17e897","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"42118bbee7a86a310da541bc13e629c9e91bb709"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ea418cd008b59f8176477fbff773ac1bc5fbaad","id":"6ea418cd008b59f8176477fbff773ac1bc5fbaad","committed_date":"2010-03-30T08:25:12-07:00","authored_date":"2010-03-30T08:22:33-07:00","message":"Added tool to generate package removal reminders.\n\nThe display of removal reminders is called with the default make target. The\npackage.mask file is updated to use gen_removal.py compliant syntax.","tree":"c7eefd7905c26b8c952cbd2dd2a4e0c74aaf6e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f7c8303f62595e425a352218116f5ae35e809c2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42118bbee7a86a310da541bc13e629c9e91bb709","id":"42118bbee7a86a310da541bc13e629c9e91bb709","committed_date":"2010-03-30T05:59:00-07:00","authored_date":"2010-03-30T05:59:00-07:00","message":"Warn if PORTAGE_GPG_KEY is not set.","tree":"87ee1dafb47c4eb1aed0a4760d282ccae9aee7cb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f1efe654295570a296d5b657e6e163db7279ee06"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8f7c8303f62595e425a352218116f5ae35e809c2","id":"8f7c8303f62595e425a352218116f5ae35e809c2","committed_date":"2010-03-30T05:55:42-07:00","authored_date":"2010-03-30T05:55:42-07:00","message":"Added rule to sign news files.","tree":"c1232c5b6ace06f681f16319fdb67dc5de3f4977","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e973103cd372c22f7b5cc9d6b7d4ead3b43babe4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f2ce27bd70042cd6266070a3a2d439f1c187c56a","id":"f2ce27bd70042cd6266070a3a2d439f1c187c56a","committed_date":"2009-11-11T22:11:39-08:00","authored_date":"2009-11-11T21:18:41-08:00","message":"Added rule to check for cupage.conf entries.","tree":"93765109726896a83fe424b0ca8c9c39ebea61ca","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"edb40795241f945055e368c27295248124bfcec5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22071b1b529d3abfefd6b4aeb573789aea2ad531","id":"22071b1b529d3abfefd6b4aeb573789aea2ad531","committed_date":"2009-10-06T05:35:30-07:00","authored_date":"2009-10-06T05:35:30-07:00","message":"List stablisation reminders in default make target.","tree":"15d8e6e263955e8f597b597243294fe1fb9fb6f2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"58aadc74c7f6f1e9f7b89e86924cc005096696da"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/acda9182a87201afb828ae7f00da6657507f0556","id":"acda9182a87201afb828ae7f00da6657507f0556","committed_date":"2009-10-06T05:31:55-07:00","authored_date":"2009-10-06T05:27:51-07:00","message":"Added reminder file for stabilisation.","tree":"1dbcebdaaaade95b4f3ae67d5eee38c4c4b65321","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d00f6fece38fa7e2effe0865856ac20e4e3698c4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","id":"9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","committed_date":"2009-09-21T19:49:02-07:00","authored_date":"2009-09-21T19:46:16-07:00","message":"[583: Fixed] Added script to generate profiles/use.local.desc files.","tree":"8997af31834c449576b5e3c734349a6b9428c0a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8315eb308b260edce84ff2546d3ed5237888b2e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/08432266614581afb2a93fa9a69a3b6f9411b076","id":"08432266614581afb2a93fa9a69a3b6f9411b076","committed_date":"2009-05-26T14:59:48-07:00","authored_date":"2009-05-26T14:59:18-07:00","message":"Fixed quoting in gnupg key check.","tree":"96d960aca7a65a6f327b09d5304c33bbc5dba9d0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"aaee60ccf8cd8f50e8445e40a51ab90df9269178"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","id":"e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","committed_date":"2009-05-24T00:14:26-07:00","authored_date":"2009-05-24T00:14:26-07:00","message":"Added Makefile with simple repo maintenance rules.","tree":"52e9206f8f4c7801ba59b5d81945ab54922761de","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 new file mode 100644 index 0000000..4975802 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 @@ -0,0 +1,14 @@ +status: 200 +content-length: 22233 +content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master +set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +x-runtime: 149ms +server: nginx/0.7.67 +connection: keep-alive +etag: "0f46540a52ac460fe1eba437c8ebd2d4" +cache-control: private, max-age=0, must-revalidate +date: Sun, 22 May 2011 20:47:57 GMT +content-type: application/json; charset=utf-8 + +{"commits":[{"parents":[{"id":"4faa329f56b4c0470db03eaa42b318a83ca889c4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/37233b357d1a3648434ffda8f569ce96b3bcbf53","id":"37233b357d1a3648434ffda8f569ce96b3bcbf53","committed_date":"2011-05-22T00:23:30-07:00","authored_date":"2011-05-22T00:22:41-07:00","message":"socksipy-1.01 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"8adbb3bc1878b5a1307a39a4d23ca776a4f3adeb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"809ed8d37fd3736e88ceb222174cea50540b9156"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4faa329f56b4c0470db03eaa42b318a83ca889c4","id":"4faa329f56b4c0470db03eaa42b318a83ca889c4","committed_date":"2011-05-20T11:32:11-07:00","authored_date":"2011-05-20T11:31:49-07:00","message":"Added missing watch file for nwdiag.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"a289368450d5de2aa1e91a47a8eff493b68b0031","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f94a5d296b13f9a6c9110ad174051900a16e83"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/809ed8d37fd3736e88ceb222174cea50540b9156","id":"809ed8d37fd3736e88ceb222174cea50540b9156","committed_date":"2011-05-20T11:30:58-07:00","authored_date":"2011-05-20T11:28:38-07:00","message":"Initial socksipy ebuild.\n\nRequired for testing python-github2, and will be a USE=socks dep in new\nreleases.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"64914a9ef2b148ce4e1c4f978c09a26b0fce1a44","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1"},{"id":"ddcad38eea125d5e0748b5c9a3c39d05269bd584"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5f94a5d296b13f9a6c9110ad174051900a16e83","id":"f5f94a5d296b13f9a6c9110ad174051900a16e83","committed_date":"2011-05-18T06:16:59-07:00","authored_date":"2011-05-18T06:16:59-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n pw-0.1.4 keyworded x86.\n plac-0.8.1 keyworded x86.\n pdbpp-0.7 keyworded x86.\n github2-0.3.1 keyworded x86.\n nwdiag-0.2.3 keyworded ~x86.\n cake-0.2 keyworded ~x86.\n jsonpipe-0.0.7 keyworded ~x86.\n vanity-1.0 keyworded ~x86.\n sure-0.4.0 keyworded ~x86.\n stencil-0.1 keyworded ~x86.\n calabash-0.0.3 keyworded ~x86.","tree":"12bf21b11693ffcb64a9df56d1e8446e45e9e648","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ddcad38eea125d5e0748b5c9a3c39d05269bd584","id":"ddcad38eea125d5e0748b5c9a3c39d05269bd584","committed_date":"2011-05-18T06:16:23-07:00","authored_date":"2011-05-18T06:16:14-07:00","message":"pw-0.1.4 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"12bf21b11693ffcb64a9df56d1e8446e45e9e648","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"07bfd80949820c9215e48ebb5e11d2fd48923e5a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2","id":"6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2","committed_date":"2011-05-18T06:15:45-07:00","authored_date":"2011-05-18T06:15:16-07:00","message":"plac-0.8.1 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"19eafacfe02a2dd65a51c91ac503d22a6bc83631","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"944386cde5c100e699d0c2cb0ce403bf7e9cb8e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/07bfd80949820c9215e48ebb5e11d2fd48923e5a","id":"07bfd80949820c9215e48ebb5e11d2fd48923e5a","committed_date":"2011-05-18T06:14:12-07:00","authored_date":"2011-05-18T06:14:02-07:00","message":"pdbpp-0.7 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"efb47845dde6468625ba06605c2dcc7bac9f2b8b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"dc40235add8b9cecd18b8d62a932ead301351075"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/944386cde5c100e699d0c2cb0ce403bf7e9cb8e7","id":"944386cde5c100e699d0c2cb0ce403bf7e9cb8e7","committed_date":"2011-05-18T06:12:52-07:00","authored_date":"2011-05-18T06:12:45-07:00","message":"github2-0.3.1 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ae1c66f72254b9833f7d19393d82fee02dc37c76","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"472da1f32f55d219286b106c97fa25dab1c33758"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc40235add8b9cecd18b8d62a932ead301351075","id":"dc40235add8b9cecd18b8d62a932ead301351075","committed_date":"2011-05-18T06:10:57-07:00","authored_date":"2011-05-18T06:10:46-07:00","message":"nwdiag-0.2.3 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"3d566ba9cfecd799b4d4fa858b3d95ac6aa873a4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"79c0fb209d27eded8947eb4ffa5c74db4379abfe"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/472da1f32f55d219286b106c97fa25dab1c33758","id":"472da1f32f55d219286b106c97fa25dab1c33758","committed_date":"2011-05-18T06:10:08-07:00","authored_date":"2011-05-18T06:09:58-07:00","message":"cake-0.2 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"1f4ddf23029be3cfbccce1f41bfa3199a91af175","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0dac8c2a2410325d5095cf5c290fae441843eec6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/79c0fb209d27eded8947eb4ffa5c74db4379abfe","id":"79c0fb209d27eded8947eb4ffa5c74db4379abfe","committed_date":"2011-05-18T06:08:37-07:00","authored_date":"2011-05-18T06:08:17-07:00","message":"jsonpipe-0.0.7 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ec644f779e6a9abc0d726ffff01668999691097f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"de547eab8229243de4906826a622b9305c5b972d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0dac8c2a2410325d5095cf5c290fae441843eec6","id":"0dac8c2a2410325d5095cf5c290fae441843eec6","committed_date":"2011-05-18T06:06:14-07:00","authored_date":"2011-05-18T06:06:05-07:00","message":"vanity-1.0 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"faa00aaea5faebbdc0d90086c3980b3f2a71b3f4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c5a0736ee365ff994ba415a42622c26016e98201"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/de547eab8229243de4906826a622b9305c5b972d","id":"de547eab8229243de4906826a622b9305c5b972d","committed_date":"2011-05-18T06:04:14-07:00","authored_date":"2011-05-18T06:03:54-07:00","message":"sure-0.4.0 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"a125da9dffea83d1e4311f4a99876f810c3bcbe4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"01b36090e191bfa74da5199d322c6028b15f0c86"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c5a0736ee365ff994ba415a42622c26016e98201","id":"c5a0736ee365ff994ba415a42622c26016e98201","committed_date":"2011-05-18T06:02:48-07:00","authored_date":"2011-05-18T06:02:17-07:00","message":"stencil-0.1 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ea6febd89f9e82963562156fd9b25b80b866f61e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/01b36090e191bfa74da5199d322c6028b15f0c86","id":"01b36090e191bfa74da5199d322c6028b15f0c86","committed_date":"2011-05-18T06:00:45-07:00","authored_date":"2011-05-18T05:59:53-07:00","message":"calabash-0.0.3 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"08d452208de4b47c16242c65653cd54a5b89fb4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3fe9cb3de79b132e461c397176138abff39c6a28"},{"id":"4654ab67b1767f066e38cfb55910095bbd797b2e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9bd07338404171f18dcbb99b6bf351fbb6c3a8f1","id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1","committed_date":"2011-05-18T05:42:54-07:00","authored_date":"2011-05-18T05:42:54-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n pw-0.1.4 keyworded amd64.\n plac-0.8.1 keyworded amd64.\n pdbpp-0.7 keyworded amd64.\n github2-0.3.1 keyworded amd64.\n\nConflicts:\n\tsupport/stabilisation.remind","tree":"8741a00f0bc0c6342ea4cc7ae21fdac93a769854","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6c8484ef6186c06093553f44c830597eff01b59e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3fe9cb3de79b132e461c397176138abff39c6a28","id":"3fe9cb3de79b132e461c397176138abff39c6a28","committed_date":"2011-05-18T05:42:18-07:00","authored_date":"2011-05-18T05:41:41-07:00","message":"Removed stale twython ebuild.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"dca1153895f7bc40acb730a35dcf8699b908e7a7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2db3879ca018193235c8967562ce9f4853202943"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6c8484ef6186c06093553f44c830597eff01b59e","id":"6c8484ef6186c06093553f44c830597eff01b59e","committed_date":"2011-05-18T05:41:06-07:00","authored_date":"2011-05-18T05:41:03-07:00","message":"Pushed twython stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-python/oauth2.","tree":"787fde8bb8cc31ebe8b19dab8aee7c2d95514ac1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7fb4cf687ade6bfaffd22fc5fc06a77c2b706719"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4654ab67b1767f066e38cfb55910095bbd797b2e","id":"4654ab67b1767f066e38cfb55910095bbd797b2e","committed_date":"2011-05-18T05:38:42-07:00","authored_date":"2011-05-18T05:38:32-07:00","message":"pw-0.1.4 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"8fbac38110dbb73bb7204ca9797c4fa7acf44463","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6a328b3b4b1171de211dd2db765b1b403dea8e3a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7fb4cf687ade6bfaffd22fc5fc06a77c2b706719","id":"7fb4cf687ade6bfaffd22fc5fc06a77c2b706719","committed_date":"2011-05-18T05:38:13-07:00","authored_date":"2011-05-18T05:38:00-07:00","message":"plac-0.8.1 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"975b3b667d27dd1734fa4992cc2244a2eac036a9","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af39c23bbd4abab5b663c66d2cd1a81f3128c4f0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6a328b3b4b1171de211dd2db765b1b403dea8e3a","id":"6a328b3b4b1171de211dd2db765b1b403dea8e3a","committed_date":"2011-05-18T05:37:39-07:00","authored_date":"2011-05-18T05:37:25-07:00","message":"pdbpp-0.7 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"a161646c769641fe645121ad479676b6c10b29f4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2db3879ca018193235c8967562ce9f4853202943"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af39c23bbd4abab5b663c66d2cd1a81f3128c4f0","id":"af39c23bbd4abab5b663c66d2cd1a81f3128c4f0","committed_date":"2011-05-18T05:36:38-07:00","authored_date":"2011-05-18T05:36:08-07:00","message":"github2-0.3.1 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"6db921005c57b50d9f2ade0b9bc754316b1e78fc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b86595f9a5f049b52d359b3c9c56895851ef021"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/2db3879ca018193235c8967562ce9f4853202943","id":"2db3879ca018193235c8967562ce9f4853202943","committed_date":"2011-05-17T15:05:16-07:00","authored_date":"2011-05-17T14:59:00-07:00","message":"Masked vicious for removal.\n\nThe maintenance burden of shadowing an upstream ebuild is too high, for too\nlittle gain. Sorry, if you have trouble migrating.","tree":"2d5fef6cf947cf7921bf8b32e5b17ae20b4ac682","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"abb405c5b3cec29acf471cc5170f03b834106a6d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6b86595f9a5f049b52d359b3c9c56895851ef021","id":"6b86595f9a5f049b52d359b3c9c56895851ef021","committed_date":"2011-05-17T14:52:27-07:00","authored_date":"2011-05-17T14:52:01-07:00","message":"media-gfx/seqdiag-0.3.3 version bump.\n\nCloses #370.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"0b7df5f5e26c2d367c2ffb5e4f83eaf138c58f7b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"546c70884c3692f17eafa53f29ed7925ab9dcf3f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/abb405c5b3cec29acf471cc5170f03b834106a6d","id":"abb405c5b3cec29acf471cc5170f03b834106a6d","committed_date":"2011-05-17T14:48:49-07:00","authored_date":"2011-05-17T14:48:12-07:00","message":"dev-python/pyscss-1.0.8 version bump.\n\nCloses #369.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"3691f00deee4b003db09cfec6f2abbb42e8010e7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3"},{"id":"f72c51b7f65ada1bd377298c0e462fed499afcee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/546c70884c3692f17eafa53f29ed7925ab9dcf3f","id":"546c70884c3692f17eafa53f29ed7925ab9dcf3f","committed_date":"2011-05-17T05:42:35-07:00","authored_date":"2011-05-17T05:42:35-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n python-osmgpsmap-0.7.3 keyworded x86.\n dexml-0.4.0 keyworded x86.\n cupage-0.5.5 keyworded x86.\n osm-gps-map-0.7.3 keyworded x86.\n Term-Animation-0.2.6 keyworded x86.\n lettuce-0.1.25 keyworded x86.","tree":"8df1051a7b7a1e0c0576043aa3fe34f4e91f49e6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"48b55622c5c478bb5e6ffa0426c37f16029e6637"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f72c51b7f65ada1bd377298c0e462fed499afcee","id":"f72c51b7f65ada1bd377298c0e462fed499afcee","committed_date":"2011-05-17T05:42:26-07:00","authored_date":"2011-05-17T05:42:17-07:00","message":"python-osmgpsmap-0.7.3 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"8df1051a7b7a1e0c0576043aa3fe34f4e91f49e6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0e5d390672e7713ce9d6882820477fa26a2403a8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/48b55622c5c478bb5e6ffa0426c37f16029e6637","id":"48b55622c5c478bb5e6ffa0426c37f16029e6637","committed_date":"2011-05-17T05:41:49-07:00","authored_date":"2011-05-17T05:41:41-07:00","message":"dexml-0.4.0 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"fb4428443fc8cacde6c3a3aa5509503ffd63bf06","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"aadb8c461bcff5f98d2629791a6526319ebedebf"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0e5d390672e7713ce9d6882820477fa26a2403a8","id":"0e5d390672e7713ce9d6882820477fa26a2403a8","committed_date":"2011-05-17T05:41:16-07:00","authored_date":"2011-05-17T05:39:50-07:00","message":"cupage-0.5.5 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"4535e52b40718ba2adf17926605b504d28676d84","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"938698435b6feaeb5798b0b8265dec3c86a79f21"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/aadb8c461bcff5f98d2629791a6526319ebedebf","id":"aadb8c461bcff5f98d2629791a6526319ebedebf","committed_date":"2011-05-17T05:38:50-07:00","authored_date":"2011-05-17T05:38:43-07:00","message":"osm-gps-map-0.7.3 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"630850a2b4d6af7886aa4979d261f9f4b5bd9e44","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"1a81af79e9448cc17cb962e6e554d2f95627e48a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/938698435b6feaeb5798b0b8265dec3c86a79f21","id":"938698435b6feaeb5798b0b8265dec3c86a79f21","committed_date":"2011-05-17T05:37:28-07:00","authored_date":"2011-05-17T05:37:17-07:00","message":"Term-Animation-0.2.6 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"86b67e7be739710b4a0dcd3c116e6789f617649c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/1a81af79e9448cc17cb962e6e554d2f95627e48a","id":"1a81af79e9448cc17cb962e6e554d2f95627e48a","committed_date":"2011-05-17T05:36:49-07:00","authored_date":"2011-05-17T05:35:41-07:00","message":"lettuce-0.1.25 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"febaaf0a9ef70fe4393f783c0ced6ecdf758d28f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f305a8e19072faa41332ff771eef352d99b720dd"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a42f9cc6206d3ab898d7e3f128d9435bccec36f3","id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3","committed_date":"2011-05-17T04:36:30-07:00","authored_date":"2011-05-17T04:35:37-07:00","message":"Pushed Net-Twitter-Lite stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-perl/JSON-Any.","tree":"0bf98e75b14cbba85cd9d33723816d85a12630ff","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0f13d2e4f32191aa0f2c5429666f0afb31934aee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f305a8e19072faa41332ff771eef352d99b720dd","id":"f305a8e19072faa41332ff771eef352d99b720dd","committed_date":"2011-05-17T04:36:30-07:00","authored_date":"2011-05-17T04:35:04-07:00","message":"Pushed pycparser stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-python/ply.","tree":"9699c4e28bcca4e7c9e60b0f6dfc19e6c49f5e43","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"44e4062f93c5d19d41f9d2158a382991f71b1142"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0f13d2e4f32191aa0f2c5429666f0afb31934aee","id":"0f13d2e4f32191aa0f2c5429666f0afb31934aee","committed_date":"2011-05-17T04:36:22-07:00","authored_date":"2011-05-17T04:34:03-07:00","message":"Removed stale Net-Twitter-Lite ebuild.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"9fd3fc814c8a76bde8e525caa1dd3271d4312209","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/test_commits.py b/tests/test_commits.py new file mode 100644 index 0000000..843688f --- /dev/null +++ b/tests/test_commits.py @@ -0,0 +1,36 @@ +import _setup + +import sys + +from nose.tools import assert_equals + +import utils + + +class CommitsQueries(utils.HttpMockTestCase): + """Test commit querying""" + def test_list(self): + commits = self.client.commits.list('JNRowe/misc-overlay') + assert_equals(len(commits), 35) + assert_equals(commits[0].id, + '37233b357d1a3648434ffda8f569ce96b3bcbf53') + + def test_list_with_branch(self): + commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages') + assert_equals(len(commits), 35) + assert_equals(commits[0].id, + '482f657443df4b701137a3025ae08476cddd2b7d') + + def test_list_with_file(self): + commits = self.client.commits.list('JNRowe/misc-overlay', + file='Makefile') + assert_equals(len(commits), 31) + assert_equals(commits[0].id, + '41bcd985139189763256a8c82b8f0fcbe150eb03') + + def test_list_with_branch_and_file(self): + commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages', + 'packages/dev-python.html') + assert_equals(len(commits), 35) + assert_equals(commits[0].id, + '482f657443df4b701137a3025ae08476cddd2b7d') From bf97f4da9f03ad01a670c3afd09d4e88d6747acb Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 22 May 2011 22:15:00 +0100 Subject: [PATCH 242/454] Added warning for listing commits in repos containing '.'. --- github2/commits.py | 5 +++++ ...rg,master,f245f9d2f5db473934bef7aed73bbdac | 12 +++++++++++ tests/test_commits.py | 20 ++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac diff --git a/github2/commits.py b/github2/commits.py index 97ec231..cd969cf 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -29,6 +29,11 @@ class Commits(GithubCommand): def list(self, project, branch="master", file=None): """List commits on a project + .. warning:: + Unfortunately, listing the commits from repositories containing + certain characters such as '.' will fail. This is an issue with the + GitHub API, and can't currently be worked around in this library. + :param str project: project name :param str branch: branch name :param str file: optional file filter diff --git a/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac b/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac new file mode 100644 index 0000000..8fce793 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac @@ -0,0 +1,12 @@ +status: 404 +content-location: https://github.com/api/v2/json/commits/list/kennethreitz/osxpython.org/master +x-runtime: 24ms +content-length: 21 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +cache-control: no-cache +date: Sun, 22 May 2011 20:40:50 GMT +content-type: application/json; charset=utf-8 + +{"error":"Not Found"} \ No newline at end of file diff --git a/tests/test_commits.py b/tests/test_commits.py index 843688f..f082c13 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -2,7 +2,7 @@ import sys -from nose.tools import assert_equals +from nose.tools import (assert_equals, assert_false) import utils @@ -34,3 +34,21 @@ def test_list_with_branch_and_file(self): assert_equals(len(commits), 35) assert_equals(commits[0].id, '482f657443df4b701137a3025ae08476cddd2b7d') + + def test_list_repo_with_dot(self): + """GitHub returns error listing commits in repos containing '.' + + The purpose of this test is to tell us when this issue is fixed + upstream. + """ + try: + commits = self.client.commits.list('kennethreitz/osxpython.org') + except RuntimeError: + # The hoop jumping here is for Python 2 & 3 compatibility, it is + # also good a sign it may be time to use 2to3 on the tests. + e = sys.exc_info()[1] + if """'{"error":"Not Found"}'""" not in e.args[0]: + raise + commits = None + assert_false(commits, + "Listing commits with '.' in name is fixed upstream!") From c0a1da46a4c0b4c77c34adedcb1e50ee81e1ef6d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 05:30:13 +0100 Subject: [PATCH 243/454] Move repo with '.' warning to Commits. This affects the whole of the commits API path. --- github2/commits.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/github2/commits.py b/github2/commits.py index cd969cf..3a292a0 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -24,16 +24,17 @@ def __repr__(self): class Commits(GithubCommand): + """ + .. warning:: + Unfortunately, commits from repositories containing certain characters + such as '.' will fail. This is an issue with the GitHub API, and can't + currently be worked around in this library. + """ domain = "commits" def list(self, project, branch="master", file=None): """List commits on a project - .. warning:: - Unfortunately, listing the commits from repositories containing - certain characters such as '.' will fail. This is an issue with the - GitHub API, and can't currently be worked around in this library. - :param str project: project name :param str branch: branch name :param str file: optional file filter From 756458d6d68859a624b194ff53d97823064e6c74 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 05:30:53 +0100 Subject: [PATCH 244/454] Added tests for private user data. --- tests/test_user.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_user.py b/tests/test_user.py index ac24490..cdf5022 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -41,6 +41,14 @@ def test_is_authenticated(self): user = self.client.users.show('fake_jnrowe_with_auth') assert_true(user.is_authenticated() is True) + def test_private_data(self): + user = self.client.users.show('fake_jnrowe_with_auth') + assert_equals(user.total_private_repo_count, 0) + assert_equals(user.collaborators, 0) + assert_equals(user.disk_usage, 66069) + assert_equals(user.owned_private_repo_count, 0) + assert_equals(user.private_gist_count, 7) + class UserQueries(utils.HttpMockTestCase): """Test user querying """ From c6fa68a116f151698f0807a313268c4e84ce079e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 05:31:14 +0100 Subject: [PATCH 245/454] Added tests for user plan data. --- tests/test_user.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_user.py b/tests/test_user.py index cdf5022..9c6ec0b 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -49,6 +49,13 @@ def test_private_data(self): assert_equals(user.owned_private_repo_count, 0) assert_equals(user.private_gist_count, 7) + def test_plan_data(self): + user = self.client.users.show('fake_jnrowe_with_auth') + assert_equals(user.plan['name'], "free") + assert_equals(user.plan['collaborators'], 0) + assert_equals(user.plan['space'], 307200) + assert_equals(user.plan['private_repos'], 0) + class UserQueries(utils.HttpMockTestCase): """Test user querying """ From 6e1a8f772b5778d855a8a00212914277910db709 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 08:07:30 +0100 Subject: [PATCH 246/454] Make setup.py executable. --- setup.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 setup.py diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 From 6337009b8cefecaff3d5b73883d3da541cc25432 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 08:10:55 +0100 Subject: [PATCH 247/454] Bumped version to 0.4.0. --- NEWS.rst | 4 ++-- README.rst | 2 +- github2/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index b14f797..1d99105 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,8 +3,8 @@ User-visible changes .. contents:: -``master`` branch ------------------ +0.4.0 - 2011-05-23 +------------------ * Python 3 compatibility * The ``github_manage_collaborators`` script will be installed using diff --git a/README.rst b/README.rst index 5b2915d..1d90f9d 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.3.1 +:Version: 0.4.0 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 15f242c..df643a0 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 3, 1) +VERSION = (0, 4, 0) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From daaf28046bc963435763e4c0eac54d36083d44fc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 23 May 2011 08:51:24 +0100 Subject: [PATCH 248/454] Fixed HTML path for upload_docs. --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index e246375..141e45e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [aliases] build_dist = sdist --formats=gztar,bztar,zip [upload_docs] -upload-dir = docs/.build/html +upload-dir = doc/.build/html [nosetests] cover-package = github2 detailed-errors = 1 From 4dfd222fcd9b16576a8ba7d33f87eb98c02d9221 Mon Sep 17 00:00:00 2001 From: hub-cap Date: Mon, 23 May 2011 20:05:40 -0500 Subject: [PATCH 249/454] Fixing the init of the proxy code. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 1e1e4d2..af149f4 100644 --- a/github2/request.py +++ b/github2/request.py @@ -78,7 +78,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, 'Install a Python SOCKS library.') else: proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, - proxy_host, proxy_port), + proxy_host, proxy_port) self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) def encode_authentication_data(self, extra_post_data): From 22d3f1d0f791fcb38535615e5c0d13766d28a105 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 24 May 2011 04:52:04 +0100 Subject: [PATCH 250/454] Added test for handling proxy settings. This changes makes SocksiPy-branch required for running tests. --- tests/test_regression.py | 25 +++++++++++++++++++++++++ tests/utils.py | 8 +++++++- tox.ini | 3 +++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/test_regression.py diff --git a/tests/test_regression.py b/tests/test_regression.py new file mode 100644 index 0000000..5438888 --- /dev/null +++ b/tests/test_regression.py @@ -0,0 +1,25 @@ +import _setup + +import httplib2 + +from nose.tools import assert_equals + +from github2.client import Github + +import utils + + +def test_issue_50(): + """Erroneous init of ``Http`` with proxy setup + + See https://github.com/ask/python-github2/pull/50 + """ + utils.set_http_mock() + + client = Github(proxy_host="my.proxy.com", proxy_port=9000) + setup_args = client.request._http.called_with + assert_equals(type(setup_args['proxy_info']), httplib2.ProxyInfo) + assert_equals(setup_args['proxy_info'].proxy_host, 'my.proxy.com') + assert_equals(setup_args['proxy_info'].proxy_port, 9000) + + utils.unset_http_mock() diff --git a/tests/utils.py b/tests/utils.py index 8dedf71..f7684fb 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -23,7 +23,13 @@ class HttpMock(object): """ def __init__(self, cache=None, timeout=None, proxy_info=None): - pass + """Create a mock httplib.Http object + + .. attribute: called_with + + ``locals()`` during ``__init__``, for testing call spec + """ + self.called_with = locals() def request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None): diff --git a/tox.ini b/tox.ini index 66b3e7f..8798b70 100644 --- a/tox.ini +++ b/tox.ini @@ -5,6 +5,9 @@ envlist = py24, py25, py26, py27, py31, py32, rst, sphinx deps = nose coverage + + # Optional dep, but required for tests + SocksiPy-branch commands = rm -rf build {envpython} setup.py build From b7e4b93839d168993c4d42d15d2c30f0b6994c0b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 24 May 2011 04:53:14 +0100 Subject: [PATCH 251/454] Prepare a list of projects using github2. --- doc/index.rst | 1 + doc/wild.rst | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 doc/wild.rst diff --git a/doc/index.rst b/doc/index.rst index e13f974..18e48f0 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -42,6 +42,7 @@ Contents api/index bugs contributing + wild license Indices and tables diff --git a/doc/wild.rst b/doc/wild.rst new file mode 100644 index 0000000..f01c287 --- /dev/null +++ b/doc/wild.rst @@ -0,0 +1,13 @@ +In the wild +----------- + +:mod:`github2` can be seen in the wild helping to power the tools and web sites +listed on this page. + +.. note:: + Have an interesting Open Source project or public website using + :mod:`github2`? Add it to this list! Just `open an issue`_ or click the + ``Fork and edit this file`` button on the `project website`_ + +.. _open an issue: https://github.com/ask/python-github2/issues/ +.. _project website: https://github.com/ask/python-github2/blob/master/doc/wild.rst From c5bb79584e1880bbe60a0504234524c18c328f99 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 24 May 2011 04:54:33 +0100 Subject: [PATCH 252/454] Added the projects I'm currently aware of. With the exception of gh_bugs, because it isn't prime-time ready. --- doc/wild.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index f01c287..48e5af0 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -9,5 +9,28 @@ listed on this page. :mod:`github2`? Add it to this list! Just `open an issue`_ or click the ``Fork and edit this file`` button on the `project website`_ +``bitbucket2github`` +'''''''''''''''''''' + + Mirrors all public repos of a BitBucket account to GitHub and vice versa. + +:PyPI page: :pypi:`bitbucket2github` + +``forkfeed`` +'''''''''''' + + Utility to build atom feeds for all commits in all forks of your projects on + GitHub. + +:PyPI page: :pypi:`forkfeed` + +``roundabout`` +'''''''''''''' + + ``Roundabout`` is a tool that automatically prevents code with failing tests + from being merged into a github repository. + +:Git repository: https://github.com/ChristopherMacGown/roundabout + .. _open an issue: https://github.com/ask/python-github2/issues/ .. _project website: https://github.com/ask/python-github2/blob/master/doc/wild.rst From 96b0a41dd249c521323700bc11a0a721a7c9e642 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 24 May 2011 04:55:26 +0100 Subject: [PATCH 253/454] Bumped version to 0.4.1. --- README.rst | 2 +- github2/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 1d90f9d..595a174 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.4.0 +:Version: 0.4.1 This is an experimental python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index df643a0..c5e89fa 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 4, 0) +VERSION = (0, 4, 1) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From 017690e57d87abffc131fb7d5f796062358909d9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 27 May 2011 02:00:47 +0100 Subject: [PATCH 254/454] Added warning about default branch to `commits.list`. Closes #44. --- github2/commits.py | 13 +++++------ ...rg,master,f245f9d2f5db473934bef7aed73bbdac | 12 ---------- tests/test_commits.py | 22 +------------------ 3 files changed, 7 insertions(+), 40 deletions(-) delete mode 100644 tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac diff --git a/github2/commits.py b/github2/commits.py index 3a292a0..97ecbad 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -24,19 +24,18 @@ def __repr__(self): class Commits(GithubCommand): - """ - .. warning:: - Unfortunately, commits from repositories containing certain characters - such as '.' will fail. This is an issue with the GitHub API, and can't - currently be worked around in this library. - """ domain = "commits" def list(self, project, branch="master", file=None): """List commits on a project + .. warning:: + Not all projects use ``master`` as their default branch, you can + check the value of the ``Repo(project).master_branch`` attribute to + determine the default branch of a given repository. + :param str project: project name - :param str branch: branch name + :param str branch: branch name, or ``master`` if not given :param str file: optional file filter """ return self.get_values("list", project, branch, file, diff --git a/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac b/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac deleted file mode 100644 index 8fce793..0000000 --- a/tests/data/github.com,api,v2,json,commits,list,kennethreitz,osxpython.org,master,f245f9d2f5db473934bef7aed73bbdac +++ /dev/null @@ -1,12 +0,0 @@ -status: 404 -content-location: https://github.com/api/v2/json/commits/list/kennethreitz/osxpython.org/master -x-runtime: 24ms -content-length: 21 -server: nginx/0.7.67 -connection: keep-alive -x-ratelimit-limit: 60 -cache-control: no-cache -date: Sun, 22 May 2011 20:40:50 GMT -content-type: application/json; charset=utf-8 - -{"error":"Not Found"} \ No newline at end of file diff --git a/tests/test_commits.py b/tests/test_commits.py index f082c13..7bfe4e7 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -1,8 +1,6 @@ import _setup -import sys - -from nose.tools import (assert_equals, assert_false) +from nose.tools import assert_equals import utils @@ -34,21 +32,3 @@ def test_list_with_branch_and_file(self): assert_equals(len(commits), 35) assert_equals(commits[0].id, '482f657443df4b701137a3025ae08476cddd2b7d') - - def test_list_repo_with_dot(self): - """GitHub returns error listing commits in repos containing '.' - - The purpose of this test is to tell us when this issue is fixed - upstream. - """ - try: - commits = self.client.commits.list('kennethreitz/osxpython.org') - except RuntimeError: - # The hoop jumping here is for Python 2 & 3 compatibility, it is - # also good a sign it may be time to use 2to3 on the tests. - e = sys.exc_info()[1] - if """'{"error":"Not Found"}'""" not in e.args[0]: - raise - commits = None - assert_false(commits, - "Listing commits with '.' in name is fixed upstream!") From 1b499c79a4f6f5b9c64b315d7416602345d5fd34 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 27 May 2011 02:02:52 +0100 Subject: [PATCH 255/454] Use verbose nosetests output in tox runs. --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 8798b70..62d4032 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ deps = commands = rm -rf build {envpython} setup.py build - nosetests tests + nosetests -vv tests [testenv:rst] deps = docutils From ebb5968d72718a0b6c4477dc901a7a4f4f352957 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 27 May 2011 02:03:25 +0100 Subject: [PATCH 256/454] Added ghmiles to wild.rst. --- doc/wild.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 48e5af0..9963be5 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -24,6 +24,14 @@ listed on this page. :PyPI page: :pypi:`forkfeed` +``ghmiles`` +''''''''''' + + ``ghmiles`` is a Python library that generates a milestone model from the + issues in a GitHub repository. + +:PyPI page: :pypi:`ghmiles` + ``roundabout`` '''''''''''''' From 6b20199a13838434273de26b8eaf454870fb6804 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 27 May 2011 05:08:03 +0100 Subject: [PATCH 257/454] Display links to source in documentation. Because Raymond Hettinger is absolutely on the money with http://rhettinger.wordpress.com/2011/01/28/open-your-source-more/ :) --- doc/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 8f22797..e929731 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,7 +25,8 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ["sphinx.ext.%s" % ext for ext in ["autodoc", "todo", "intersphinx"]] + \ +extensions = ["sphinx.ext.%s" % ext + for ext in ["autodoc", "todo", "intersphinx", "viewcode"]] + \ ["sphinxcontrib.%s" % ext for ext in ["cheeseshop", ]] # Add any paths that contain templates here, relative to this directory. From 3d2c6c565d16894ab94f1efb4f2eaa46c223513e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 28 May 2011 14:02:08 +0100 Subject: [PATCH 258/454] Added missing doc for Github.debug. Refs #52. --- github2/client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/client.py b/github2/client.py index 3ac1dd8..23bede9 100644 --- a/github2/client.py +++ b/github2/client.py @@ -26,6 +26,7 @@ def __init__(self, username=None, api_token=None, debug=False, :param str username: your own GitHub username. :param str api_token: can be found at https://github.com/account (while logged in as that user): + :param bool debug: enable debugging information. :param str access_token: can be used when no ``username`` and/or ``api_token`` is used. The ``access_token`` is the OAuth access token that is received after successful OAuth authentication. From 6e0c39d4d556bbc76f7b969c140a6b7840b46432 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 28 May 2011 14:02:59 +0100 Subject: [PATCH 259/454] Minor reST formatting fix. --- github2/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/core.py b/github2/core.py index 968021a..a4933cc 100644 --- a/github2/core.py +++ b/github2/core.py @@ -63,8 +63,8 @@ def userdate_to_datetime(user_date): """Convert user date string to Python datetime Unfortunately this needs a special case because :meth:`~Github.users.show` - and :meth:`~Github.users.search` return a different formats for the - `created_at` attributes. + and :meth:`~Github.users.search` return different formats for the + ``created_at`` attributes. :param str user_date: date string to parse """ From c30a5e7cdf3c6331f96a0cfce79204005ec57b79 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 28 May 2011 14:38:27 +0100 Subject: [PATCH 260/454] Document debug usage. Closes #52. --- doc/bugs.rst | 7 +++---- doc/index.rst | 1 + doc/problems.rst | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 doc/problems.rst diff --git a/doc/bugs.rst b/doc/bugs.rst index 34ce7f0..d9538ca 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -22,8 +22,9 @@ hard to track down the actual cause of a bug. The first step when you've found a bug should be to test it directly, to rule out a temporary problem with GitHub or a deficiency in the API. -The official `GitHub API`_ documentation contains many examples on how to access -the API directly with curl_. +You can check which URLs your code is requesting using the ``debug`` argument +when you create your :class:`~github2.client.Github` object. See +:doc:`problems` for information on using the ``debug`` support. If the bug you've found is outside the reach of this project an issue should be opened in GitHub's `API support forum`_. It doesn't hurt to `report an issue`_ @@ -47,7 +48,5 @@ Simon Tatham has an excellent essay titled `How to Report Bugs Effectively`_, with some excellent tips on filing good bug reports. .. _report an issue: https://github.com/ask/python-github2/issues/ -.. _GitHub API: http://develop.github.com/ -.. _curl: http://curl.haxx.se/ .. _API support forum: http://support.github.com/discussions/api .. _How to Report Bugs Effectively: http://www.chiark.greenend.org.uk/~sgtatham/bugs.html diff --git a/doc/index.rst b/doc/index.rst index 18e48f0..31aa57a 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -40,6 +40,7 @@ Contents install quickstart api/index + problems bugs contributing wild diff --git a/doc/problems.rst b/doc/problems.rst new file mode 100644 index 0000000..acf4fb3 --- /dev/null +++ b/doc/problems.rst @@ -0,0 +1,42 @@ +Solving problems +================ + +The client object, :class:`~github2.client.Github`, supports a ``debug`` keyword +argument that is invaluable for troubleshooting. Enabling the ``debug`` +functionality will produce output on :data:`sys.stderr` in certain situations. + +Request data +'''''''''''' + +With ``debug`` enabled a message will be produced every time an API request is +made. + + >>> github = Github(debug=True) + >>> user = github.users.show("JNRowe") + URL:[https://github.com/api/v2/json/user/show/JNRowe] + POST_DATA:None + RESPONSE_TEXT: [{"user":{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","company":null,"name":"James Rowe","created_at":"2009/03/08 14:53:38 -0700","location":"Cambridge, UK","public_repo_count":41,"public_gist_count":64,"blog":"http://jnrowe.github.com/","following_count":5,"id":61381,"type":"User","permission":null,"followers_count":6,"login":"JNRowe","email":"jnrowe@gmail.com"}}] + >>> user.gravatar_id + u'e40de1eb6e8a74cb96b3f07f3994f155' + +In the message you can see the URL that was accessed, here +``https://github.com/api/v2/json/user/show/JNRowe``. You'll also see any HTTP +``post`` method data that was sent, in this case there was none. And the full +response from GitHub, here the user data of JNRowe. + +It has no other affect on the code. + +Rate limiting +''''''''''''' + +If rate limiting is enabled, with the ``requests_per_second`` when creating a +:class:`~github2.client.Github` object, then you'll see a message when a request +has been delayed. + + >>> github = Github(requests_per_second=0.2, debug=True) + >>> user = github.users.show("JNRowe") + >>> user = github.users.show("JNRowe") + delaying API call 4.99773 + +Here we have defined a rate limit of one call every five seconds, and doing so +has imposed an almost 5 second delay before completing the second request. From fcdad6c90a3cc4528d8521816b1961c0985708e5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 28 May 2011 15:07:32 +0100 Subject: [PATCH 261/454] Added note about including version info in bug reports. --- doc/bugs.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/bugs.rst b/doc/bugs.rst index d9538ca..28a9bd7 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -41,12 +41,17 @@ A good bug report will have the following: * A descriptive title * A full Python traceback of the error, if there is one +* The version of :mod:`github2` you are using [#]_ * A minimal test-case to reproduce the error * A list of solutions you've already tried Simon Tatham has an excellent essay titled `How to Report Bugs Effectively`_, with some excellent tips on filing good bug reports. +.. [#] The content of :data:`github2.__version__` if you're using an official + release, or the output of :command:`git describe` if you're using the git + repository directly. + .. _report an issue: https://github.com/ask/python-github2/issues/ .. _API support forum: http://support.github.com/discussions/api .. _How to Report Bugs Effectively: http://www.chiark.greenend.org.uk/~sgtatham/bugs.html From 072ac10ce763941f0a64dade74b57a3b10c9a157 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 29 May 2011 07:13:44 +0100 Subject: [PATCH 262/454] Allow overriding of args to nosetests in tox. Now requires tox-1.0.0. --- tox.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 62d4032..36639c3 100644 --- a/tox.ini +++ b/tox.ini @@ -1,4 +1,5 @@ [tox] +minversion = 1.0 envlist = py24, py25, py26, py27, py31, py32, rst, sphinx [testenv] @@ -11,7 +12,7 @@ deps = commands = rm -rf build {envpython} setup.py build - nosetests -vv tests + nosetests {posargs:-vv} tests [testenv:rst] deps = docutils From 715d03bbcb147618407d1ddda7161ed57e152f34 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 29 May 2011 16:11:23 +0100 Subject: [PATCH 263/454] Include tox config in sdist tarballs. Users should be able to run the full tests. --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index f8d1bd9..483e243 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,6 +3,7 @@ include NEWS.rst include README.rst include AUTHORS include LICENSE +include tox.ini recursive-include doc *.rst include doc/conf.py From a33fb2e15d317464acdc860e51746ee1aa466b24 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 29 May 2011 16:18:38 +0100 Subject: [PATCH 264/454] Updated pull request versionadded attribute to 0.5.0. It missed the window for 0.4.0. --- github2/pull_requests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index a863a26..e7694ad 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -4,7 +4,7 @@ class PullRequest(BaseData): """Pull request encapsulation - .. versionadded:: 0.4.0 + .. versionadded:: 0.5.0 """ state = Attribute("The pull request state") base = Attribute("The base repo") @@ -41,7 +41,7 @@ def __repr__(self): class PullRequests(GithubCommand): """Operations on pull requests - .. versionadded:: 0.4.0 + .. versionadded:: 0.5.0 """ domain = "pulls" From 227082539ac7a3022460b1d7c0a255204500509e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 29 May 2011 16:37:35 +0100 Subject: [PATCH 265/454] Added tests for pull request isodate handling. --- tests/test_date_handling.py | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index 27702f2..87a3089 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -7,7 +7,8 @@ from nose.tools import assert_equals from github2.core import (ghdate_to_datetime, datetime_to_ghdate, - commitdate_to_datetime, datetime_to_commitdate) + commitdate_to_datetime, datetime_to_commitdate, + isodate_to_datetime, datetime_to_isodate) # Commented test cases are in PST, and aren't correctly handled with the @@ -115,3 +116,52 @@ def test_datetime_to_commitdate(): '2011-04-09T09:53:00-07:00') assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), '2011-04-09T09:53:00-07:00') + +def test_isodate_to_datetime(): + assert_equals(isodate_to_datetime('2011-05-22T00:24:15Z'), + dt(2011, 5, 22, 0, 24, 15)) + assert_equals(isodate_to_datetime('2011-04-09T10:07:30Z'), + dt(2011, 4, 9, 10, 7, 30)) + assert_equals(isodate_to_datetime('2011-02-19T07:16:11Z'), + dt(2011, 2, 19, 7, 16, 11)) + assert_equals(isodate_to_datetime('2010-12-21T12:34:27Z'), + dt(2010, 12, 21, 12, 34, 27)) + assert_equals(isodate_to_datetime('2011-04-09T10:20:05Z'), + dt(2011, 4, 9, 10, 20, 5)) + assert_equals(isodate_to_datetime('2011-04-09T10:05:58Z'), + dt(2011, 4, 9, 10, 5, 58)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt(2011, 4, 9, 9, 53, 0)) + assert_equals(isodate_to_datetime('2011-04-09T10:00:21Z'), + dt(2011, 4, 9, 10, 0, 21)) + assert_equals(isodate_to_datetime('2010-12-16T15:10:59Z'), + dt(2010, 12, 16, 15, 10, 59)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt(2011, 4, 9, 9, 53, 0)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt(2011, 4, 9, 9, 53, 0)) + + +def test_datetime_to_isodate(): + assert_equals(datetime_to_isodate(dt(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 7, 30)), + '2011-04-09T10:07:30Z') + assert_equals(datetime_to_isodate(dt(2011, 2, 19, 7, 16, 11)), + '2011-02-19T07:16:11Z') + assert_equals(datetime_to_isodate(dt(2010, 12, 21, 12, 34, 27)), + '2010-12-21T12:34:27Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 20, 5)), + '2011-04-09T10:20:05Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 5, 58)), + '2011-04-09T10:05:58Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 0, 21)), + '2011-04-09T10:00:21Z') + assert_equals(datetime_to_isodate(dt(2010, 12, 16, 15, 10, 59)), + '2010-12-16T15:10:59Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') From 7d1c855d2f44a55e4b90b40017be697cf70cb4a0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 29 May 2011 16:37:59 +0100 Subject: [PATCH 266/454] Fixed isodate formatting. This is why tests are good ;) --- github2/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index 5b718e5..634007e 100644 --- a/github2/core.py +++ b/github2/core.py @@ -88,7 +88,7 @@ def datetime_to_isodate(datetime_): :param str datetime_: datetime object to convert """ - return "%s%z" % datetime_.isoformat() + return "%sZ" % datetime_.isoformat() class GithubCommand(object): From 1c83cde9b5a7c396a01af1007fb7b88765b9ae45 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 7 Jun 2011 00:13:50 +0100 Subject: [PATCH 267/454] Added cache support to manage_collaborators. --- github2/bin/manage_collaborators.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 5f3f272..aa39fe7 100644 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -25,6 +25,8 @@ def parse_commandline(): '\nTry %prog --help for details.') parser.add_option('-d', '--debug', action='store_true', help='Enables debugging mode') + parser.add_option('-c', '--cache', default=None, + help='Location for network cache [default: None]') parser.add_option('-l', '--login', help='Username to login with') parser.add_option('-a', '--account', @@ -59,7 +61,7 @@ def main(): github = github2.client.Github(username=options.login, api_token=options.apitoken, - debug=options.debug) + debug=options.debug, cache=options.cache) if len(args) == 1: for repos in github.repos.list(options.account): From c720feb2e79a725e3c541e5b9bf2190871c865a4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:22:28 +0100 Subject: [PATCH 268/454] Removed unused imports in test_repositories. --- tests/test_repositories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 8076202..1168c46 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -2,7 +2,7 @@ import datetime -from nose.tools import (assert_equals, assert_false, assert_true) +from nose.tools import assert_equals import utils From 613729f7df6e0d3e4f822c193435e3eee2d3c508 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:23:35 +0100 Subject: [PATCH 269/454] Fixed 2.4 compatibility in isodate_to_datetime. --- github2/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index 634007e..f672d9d 100644 --- a/github2/core.py +++ b/github2/core.py @@ -80,7 +80,7 @@ def isodate_to_datetime(iso_date): :param str github_date: date string to parse """ date_without_tz = iso_date[:-1] - return datetime.strptime(date_without_tz, COMMIT_DATE_FORMAT) + return strptime(date_without_tz, COMMIT_DATE_FORMAT) def datetime_to_isodate(datetime_): From 90474d2ee1b75f01538df68cd3d2826e96850ae2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:24:02 +0100 Subject: [PATCH 270/454] Minor cleanup in BaseDataType. --- github2/core.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/github2/core.py b/github2/core.py index f672d9d..0134fde 100644 --- a/github2/core.py +++ b/github2/core.py @@ -232,12 +232,9 @@ def to_dict(self): dict_ = vars(self) return dict([(attr_name, _meta[attr_name].from_python(attr_value)) for attr_name, attr_value in dict_.items()]) - # I don't understand what this is trying to do. - # whatever it was meant to do is broken and is breaking the ability to call "vars" on instantiations, which is breaking all kindsa shit. -AS - #_contribute_method("__dict__", to_dict) def iterate(self): - not_empty = lambda e: e[1] is not None # AS I *think* this is what was intended. + not_empty = lambda e: e[1] is not None return iter(filter(not_empty, vars(self).items())) _contribute_method("__iter__", iterate) @@ -245,10 +242,6 @@ def iterate(self): result_cls.__doc__ = doc_generator(result_cls.__doc__, _meta) return result_cls - def contribute_method_to_cls(cls, name, func): - func.func_name = name - return func - class BaseData(object): __metaclass__ = BaseDataType From 129a612f1815a3a2d794361e72e0bfe3078c685f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:24:59 +0100 Subject: [PATCH 271/454] Fixed test encoding for Python 3. --- tests/utils.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/utils.py b/tests/utils.py index f7684fb..17b9e41 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,6 +1,7 @@ import _setup import os +import sys import unittest from email import message_from_file @@ -11,6 +12,10 @@ from github2.request import charset_from_headers +if sys.version_info[0] == 2: + bytes = lambda x, enc: x + + HTTP_DATA_DIR = "tests/data/" ORIG_HTTP_OBJECT = httplib2.Http @@ -37,7 +42,7 @@ def request(self, uri, method='GET', body=None, headers=None, if os.path.exists(file): response = message_from_file(open(file)) headers = httplib2.Response(response) - body = response.get_payload().encode(charset_from_headers(headers)) + body = bytes(response.get_payload(), charset_from_headers(headers)) return (headers, body) else: return (httplib2.Response({"status": "404"}), From f4a7200decbff0cb1a2ddde0b3f044da5d6c5250 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:27:57 +0100 Subject: [PATCH 272/454] Return repository collaborators as User instances. --- github2/repositories.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index fd09cf4..2016c3e 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -1,5 +1,8 @@ from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.users import User + + class Repository(BaseData): name = Attribute("Name of repository.") description = Attribute("Repository description.") @@ -204,5 +207,5 @@ def list_contributors(self, project): :param str project: Github project """ - return self.make_request("show", project, "contributors", - filter="contributors") + return self.get_values("show", project, "contributors", + filter="contributors", datatype=User) From fa496720a2caa249c7e4158cf80cf4435bfb897b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:28:17 +0100 Subject: [PATCH 273/454] Return repository searches as Repository instances. --- github2/repositories.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/repositories.py b/github2/repositories.py index 2016c3e..9331fcd 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -39,7 +39,8 @@ def search(self, query): :param str query: term to search issues for """ - return self.make_request("search", query, filter="repositories") + return self.get_values("search", query, filter="repositories", + datatype=Repository) def show(self, project): """Get repository object for project. From d9ce0b2e842495e790381fc2c833b91415a9576d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:12:18 +0100 Subject: [PATCH 274/454] Added repr test for data types. --- github2/issues.py | 2 +- ...88765b9ae45,a4f58221c8131c4e0975cd806f13d76c | 14 ++++++++++++++ ...-github2,24,fd493a9ada4c1de1cd592293f9c2049e | 14 ++++++++++++++ ...-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 | 14 ++++++++++++++ ...ions,github,d8f16b26260e5cb408a092d5071996ca | 14 ++++++++++++++ ...-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 | 14 ++++++++++++++ tests/test_commits.py | 8 ++++++++ tests/test_issues.py | 17 +++++++++++++++++ tests/test_organizations.py | 12 ++++++++++++ tests/test_pull_requests.py | 12 ++++++++++++ tests/test_repositories.py | 6 ++++++ 11 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c create mode 100644 tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e create mode 100644 tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 create mode 100644 tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca create mode 100644 tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 create mode 100644 tests/test_issues.py create mode 100644 tests/test_organizations.py create mode 100644 tests/test_pull_requests.py diff --git a/github2/issues.py b/github2/issues.py index f58bf83..9d00df9 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -31,7 +31,7 @@ class Comment(BaseData): user = Attribute("The username of the user that created this comment.") def __repr__(self): - return "" % self.body + return "" % self.body[:64] class Issues(GithubCommand): diff --git a/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c new file mode 100644 index 0000000..a1a5c48 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c @@ -0,0 +1,14 @@ +status: 200 +content-length: 1578 +content-location: https://github.com/api/v2/json/commits/show/ask/python-github2/1c83cde9b5a7c396a01af1007fb7b88765b9ae45 +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +x-runtime: 38ms +server: nginx/0.7.67 +connection: keep-alive +etag: "567523fc76cd6ee4352ee33b178781af" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:43:09 GMT +content-type: application/json; charset=utf-8 + +{"commit":{"modified":[{"diff":"--- a/github2/bin/manage_collaborators.py\n+++ b/github2/bin/manage_collaborators.py\n@@ -25,6 +25,8 @@ def parse_commandline():\n '\\nTry %prog --help for details.')\n parser.add_option('-d', '--debug', action='store_true',\n help='Enables debugging mode')\n+ parser.add_option('-c', '--cache', default=None,\n+ help='Location for network cache [default: None]')\n parser.add_option('-l', '--login',\n help='Username to login with')\n parser.add_option('-a', '--account',\n@@ -59,7 +61,7 @@ def main():\n \n github = github2.client.Github(username=options.login,\n api_token=options.apitoken,\n- debug=options.debug)\n+ debug=options.debug, cache=options.cache)\n \n if len(args) == 1:\n for repos in github.repos.list(options.account):","filename":"github2/bin/manage_collaborators.py"}],"parents":[{"id":"7d1c855d2f44a55e4b90b40017be697cf70cb4a0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/ask/python-github2/commit/1c83cde9b5a7c396a01af1007fb7b88765b9ae45","id":"1c83cde9b5a7c396a01af1007fb7b88765b9ae45","committed_date":"2011-06-06T16:13:50-07:00","authored_date":"2011-06-06T16:13:50-07:00","message":"Added cache support to manage_collaborators.","tree":"f48fcc1a0b8ea97f3147dc42cf7cdb6683493e94","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e b/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e new file mode 100644 index 0000000..c16be20 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/issues/comments/ask/python-github2/24 +x-runtime: 17ms +content-length: 9146 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "cf41a767767e5b6a2c8af3b6eb6e36df" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:42:33 GMT +content-type: application/json; charset=utf-8 + +{"comments":[{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/09 22:37:26 -0800","body":"Great addition! Could you please implement the paging stuff for all API routes that support paging? Having paging for route A, but not for route B might be confusing and nobody exactly knows which API routes have been covered already.\r\n\r\nThanks in advance,\r\nVincent\r\n","updated_at":"2010/12/09 22:37:26 -0800","id":601871,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/09 23:48:23 -0800","body":"Sure, but I have another idea.\r\n\r\nList methods could return not a list but an iterable object just like Django ORM's QuerySet, which supports slicing. And this iterable object will hide internal github's paging implementation from the end user of the python-github2.\r\n\r\nFor example, they could iterate over all commits using:\r\n\r\n for commit in gh.commits.list('django/django'):\r\n process(commit)\r\n\r\nAnd github2 will make as many requests to the GitHub as required.\r\n\r\nOr user coul only fetch first 100 commits:\r\n\r\n for commit in gh.commits.list('django/django')[:100]:\r\n process(commit)\r\n\r\nAnd github2 will do no more than 3 requests to the GitHub behind the scene?\r\n\r\nI see only one con against this approach. It is backward incompartible with the previous code and to convert old code which uses github2 to work with new library, you have to use limits and perhaps lists:\r\n\r\nIf previously you wrote `commits = hg.commits.list('django/django')` and receive no more than 30 items in the list, then now you will have to write `commits = gh.commits.list('django/django')[:LIMIT]` or, if you really need a list here: `commits = list(gh.commits.list('django/django')[:LIMIT])`.\r\n\r\nI suggest this implementation because without that, many developers who using github2, will have to implement same logic in their own code. For example, here is my curren implementation of the generator:\r\n\r\n def get_commits(*params):\r\n \"\"\" Generator which fetches commits from\r\n given repository until LIMIT\r\n will be reached.\r\n \"\"\"\r\n page = 1 \r\n limit = config.LIMIT\r\n\r\n commits = gh.commits.list(page = page, *params)\r\n while commits:\r\n for commit in commits:\r\n yield commit\r\n limit -= 1\r\n if limit == 0:\r\n raise StopIteration\r\n page += 1\r\n commits = gh.commits.list(page = page, *params)\r\n\r\nBy the way, such generator could be generalized to use with any listable github's object if it will support the page argument in it's list method. And this will allow us to keep backward compatibility. But this approach is a compromise :( ","updated_at":"2010/12/09 23:48:23 -0800","id":601937,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 01:15:05 -0800","body":"I think the addition of an iterator hiding the details of paging is a great fit for this library. The backward incompatibility is a bit tricky, so I'm not too fond of changing the list method. Instead, we could solve this by providing an `iter()` method instead of `list()`? Then `list()` can keep its current semantics and people can use an iterator in the case they prefer that.\r\n\r\nBy the way: in your code sample you call `gh.commits.list('django/django')[:LIMIT]`, but AFAIK iterators aren't subscriptable. (Subscript semantics on iterators is really hard, since they involve state.) Using islice could do the trick like this, however:\r\n\r\n islice(gh.commits.list('django/django'), None, LIMIT)\r\n","updated_at":"2010/12/13 01:15:05 -0800","id":607643,"user":"nvie"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 01:28:05 -0800","body":"We could even let the `iter()` method return the islice'd iterator:\r\n\r\n def iter(self, start=None, stop=None):\r\n ...\r\n return islice(commits, start, stop)\r\n\r\nThat way, you can simply call:\r\n\r\n # iter over all commits\r\n for c in gh.commits.iter():\r\n ...\r\n \r\n # iter over a subset\r\n for c in gh.commits.iter(25, 100):\r\n ...\r\n","updated_at":"2010/12/13 01:28:05 -0800","id":607666,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/13 03:37:50 -0800","body":"Of cause, you can't apply [:LIMIT] to an iterator, but you can do this with any _iterable_ object. This will look like this for end user:\r\n\r\n for c in gh.commits.iter('django/django')[:50]:\r\n ...\r\n\r\nI'll try to write the implementation within few days, and will send you another pull request.","updated_at":"2010/12/13 03:37:50 -0800","id":607829,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 07:27:50 -0800","body":"Yeah, what I meant is that (lazy) iterables are not subscriptable (at least not up until Python 2.6), so the above code yields a syntax error. See this:\r\n\r\n >>> def count(): \r\n ... i = 0 \r\n ... while True: \r\n ... yield i \r\n ... i += 1 \r\n ... \r\n >>> for i in count()[:50]: \r\n ... print i \r\n ... \r\n Traceback (most recent call last): \r\n File \"\", line 1, in \r\n TypeError: 'generator' object is unsubscriptable \r\n >>>\r\n\r\nHowever, if you wrap it in an islice wrapper, you can subscript these kinds of infinite lists:\r\n\r\n >>> from itertools import islice\r\n >>> for i in islice(count(), None, 7):\r\n ... print i\r\n ...\r\n 0\r\n 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n\r\nAn alternative is to resolve the iterator's elements, which looses the laziness (and therefore doesn't work with infinite lists).\r\n\r\n for c in list(gh.commits.iter())[:50]:\r\n ....\r\n\r\nThis would effectively fetch *ALL* commit objects in GitHub in one big list and then slice the first 50 out of that result.","updated_at":"2010/12/13 07:27:50 -0800","id":608217,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/13 08:19:17 -0800","body":"Generators like this one are not subscribtable, but this does not mean, that I can't return in immediate object from `iter` method which will support slicing and iteration. Wait for the patch, ok? :)","updated_at":"2010/12/13 08:19:17 -0800","id":608365,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/21 14:21:14 -0800","body":"Hey Alexander, how's your patch progressing?","updated_at":"2010/12/21 14:21:14 -0800","id":628461,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/21 14:30:26 -0800","body":"Hi. Sorry for delay. It is hard to do this in stable manner, because there is no any documentation from the GitHub and I found no way to tell GitHub the page size.\r\n\r\nBy default, page size is 35 items. I need to know that this value will never changed or (better) to specify it myself. Without this, I can't to implement a reliable slicing.\r\n\r\nIf you want, I could try to implement it and hardcode that page's size is 35 items, but it could be broken someday.","updated_at":"2010/12/21 14:30:26 -0800","id":628486,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/22 12:40:18 -0800","body":"You can safely use the static page size, [technoweenie](https://github.com/technoweenie) himself [promised me](http://twitter.com/technoweenie/status/17676244548059136) it won't change for the v2 API.","updated_at":"2010/12/22 12:40:18 -0800","id":630757,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2011/01/04 16:26:06 -0800","body":"Ok, I wrote this helper, to solve this task: https://github.com/svetlyak40wt/pagerator\r\nIt is generalized and could be used anywhere else, to iterate over any paged results.\r\n\r\nFor our case, gh.commits.iter() method should return be:\r\n\r\n def iter(self, project, branch=\"master\", file=None):\r\n return pagerator.IterableQuery(\r\n lambda page: self.get_values(\r\n \"list\", project, branch, file,\r\n filter=\"commits\", datatype=Commit,\r\n post_data=dict(page=page+1)\r\n ), \r\n 35 # page_size hardcoded in the GitHub\r\n )\r\n\r\nBut I can't test it right now, because I receive \"api route not recognized\" error from the GitHub, even for list method which worked previously. Do you know how to fix it?","updated_at":"2011/01/04 16:26:06 -0800","id":653676,"user":"svetlyak40wt"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 b/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 new file mode 100644 index 0000000..f7e70e5 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/issues/show/ask/python-github2/24 +x-runtime: 54ms +content-length: 717 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "4bf7a5d7cb406c99f66a0110a1828a7b" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:40:55 GMT +content-type: application/json; charset=utf-8 + +{"issue":{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"created_at":"2010/12/08 23:50:26 -0800","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","updated_at":"2011/01/04 16:26:07 -0800","diff_url":"https://github.com/ask/python-github2/pull/24.diff","patch_url":"https://github.com/ask/python-github2/pull/24.patch","pull_request_url":"https://github.com/ask/python-github2/pull/24","html_url":"https://github.com/ask/python-github2/issues/24","user":"svetlyak40wt","labels":[],"state":"open"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca b/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca new file mode 100644 index 0000000..f69777d --- /dev/null +++ b/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/organizations/github +connection: keep-alive +content-length: 387 +server: nginx/0.7.67 +x-runtime: 21ms +x-ratelimit-limit: 60 +etag: "f02044d4890b2b09977b7b9e75053b1e" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:46:30 GMT +content-type: application/json; charset=utf-8 + +{"organization":{"gravatar_id":"61024896f291303615bcd4f7a0dcfb74","company":null,"name":"GitHub","created_at":"2008-05-10T21:37:31-07:00","location":"San Francisco, CA","public_repo_count":26,"public_gist_count":0,"blog":"https://github.com/about","following_count":0,"id":9919,"type":"Organization","permission":null,"followers_count":571,"login":"github","email":"support@github.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 new file mode 100644 index 0000000..1bdbf22 --- /dev/null +++ b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/pulls/ask/python-github2/39 +x-runtime: 149ms +content-length: 12398 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "0226e420f8447aaca8f8eb4add9a6167" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:45:25 GMT +content-type: application/json; charset=utf-8 + +{"pull":{"html_url":"https://github.com/ask/python-github2/pull/39","issue_updated_at":"2011-05-29T15:37:08Z","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"issue_user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","diff_url":"https://github.com/ask/python-github2/pull/39.diff","updated_at":"2011-06-07T13:56:50Z","created_at":"2011-04-30T12:37:40Z","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":false,"patch_url":"https://github.com/ask/python-github2/pull/39.patch","discussion":[{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/18 08:28:10 -0700","body":"The lack of timezone handling also exhibits itself for any consumers who use a timedelta to convert to local time for the duration of any gap between GitHub's switch to DST and their own. On the order of 2-4 weeks a year for regions that I personally care about ;)","updated_at":"2011/04/18 08:28:10 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1021613},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"6738adaf013cef84fb58d2aa755557e5358d122b"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"458c90b9f07c00c1a988d6f420130ee8bbf6503c","committed_date":"2011-04-30T03:03:06-07:00","authored_date":"2011-04-30T03:03:06-07:00","message":"Added feature spec for naive date handling.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"f2a5b3896a543e1b0f3381d3c35c93d068e168fd"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"458c90b9f07c00c1a988d6f420130ee8bbf6503c"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"8cca6a3d9815f84f61d0435c6592685a95c303c5","committed_date":"2011-04-30T03:06:07-07:00","authored_date":"2011-04-30T03:06:07-07:00","message":"Added feature spec for timezone-aware date handling.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"152153130dce24262d76b40286bd88a5ce3141fd"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"8cca6a3d9815f84f61d0435c6592685a95c303c5"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"ced596c31261c89a16df9b818836ff4e63022939","committed_date":"2011-04-30T03:07:35-07:00","authored_date":"2011-04-30T03:07:35-07:00","message":"Added step definitions for date handling support.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"04616bd15ea48dc3ab786e7edfb594c0856be38f"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"ced596c31261c89a16df9b818836ff4e63022939"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"0ca5486e583a3220cd3702f8520a8664f7969b57","committed_date":"2011-04-30T03:19:32-07:00","authored_date":"2011-04-30T03:19:32-07:00","message":"Added naive datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"bc78b38d34d87c3489fa296bc83462d060fa1aaf"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"0ca5486e583a3220cd3702f8520a8664f7969b57"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"fb70d0ada52ece6b0a345c203ac0a488e80acd21","committed_date":"2011-04-30T03:21:36-07:00","authored_date":"2011-04-30T03:21:36-07:00","message":"Added timezone-aware datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"02f98c58ea4acdbcd32e5813c8ceda57d956d545"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"fb70d0ada52ece6b0a345c203ac0a488e80acd21"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"8a7d44bf92c082312280d4e86c47aeee6d570e25","committed_date":"2011-04-30T03:27:30-07:00","authored_date":"2011-04-30T03:27:30-07:00","message":"Document core.NAIVE.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"141c8f0f37f9a3cb1a545c809806fec41e8ceeb7"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"8a7d44bf92c082312280d4e86c47aeee6d570e25"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"db2ac5452e81fb691b99aa307b3b0b25b2e729ff","committed_date":"2011-04-30T03:30:36-07:00","authored_date":"2011-04-30T03:30:36-07:00","message":"Added python-dateutil to requirements.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"bcd8843e10e8c4a4b8ee982476f371dc0764ea8e"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"db2ac5452e81fb691b99aa307b3b0b25b2e729ff"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"b3e405b246fd15ced629a12ec19ad5a282e2bfd9","committed_date":"2011-04-30T04:23:16-07:00","authored_date":"2011-04-30T04:23:00-07:00","message":"Require python-dateutil lower than v2.0.\n\nv2.0 only works with Python 3.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"b73cbceb5b54f99aec6e45e76e11ef95d292d8db"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"b3e405b246fd15ced629a12ec19ad5a282e2bfd9"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"a2c2b287f7863109c83636542c699d509e6c485f","committed_date":"2011-04-30T04:24:20-07:00","authored_date":"2011-04-30T04:24:20-07:00","message":"Run lettuce tests with tox.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"27c5c5bcc58b572e9c186caeddfa2b5166fd568b"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"a2c2b287f7863109c83636542c699d509e6c485f"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1","committed_date":"2011-04-30T04:31:45-07:00","authored_date":"2011-04-30T04:31:43-07:00","message":"Don't run lettuce with Python 2.4.\n\nLooks like I've been running a patched version, and didn't realise Python 2.4\nwasn't supported upstream.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"299dca4efab1cc0d76ee30f2335258ace888fc5c"},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/30 05:41:09 -0700","body":"First-run implementation of option 3 from above. Works, but needs some refactoring.","updated_at":"2011/04/30 05:41:58 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1080583},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/05/29 08:37:08 -0700","body":"With the [pull request merge](https://github.com/ask/python-github2/pull/28) there is a new issue of handling timezones because pull requests don't use the \"GitHub timezone\".","updated_at":"2011/05/29 08:37:08 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1257226}],"issue_created_at":"2011-04-18T15:25:47Z","labels":[],"head":{"label":"JNRowe:timezone_support","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"ref":"timezone_support","repository":{"watchers":3,"has_downloads":true,"homepage":"","pushed_at":"2011/06/06 16:14:48 -0700","created_at":"2010/10/31 01:03:09 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"language":"Python","name":"python-github2","owner":"JNRowe","has_issues":false,"description":"github client in python, with issues support."},"sha":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1"},"state":"open"}} \ No newline at end of file diff --git a/tests/test_commits.py b/tests/test_commits.py index 7bfe4e7..6b9135d 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -5,6 +5,14 @@ import utils +class Commit(utils.HttpMockTestCase): + def test_repr(self): + commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' + commit = self.client.commits.show('ask/python-github2', commit_id) + assert_equals(repr(commit), + '' % commit_id) + + class CommitsQueries(utils.HttpMockTestCase): """Test commit querying""" def test_list(self): diff --git a/tests/test_issues.py b/tests/test_issues.py new file mode 100644 index 0000000..879d817 --- /dev/null +++ b/tests/test_issues.py @@ -0,0 +1,17 @@ +import _setup + +from nose.tools import assert_equals + +import utils + + +class ReprTests(utils.HttpMockTestCase): + def test_issue_repr(self): + issue = self.client.issues.show('ask/python-github2', 24) + assert_equals(repr(issue), + '') + + def test_comment_repr(self): + comments = self.client.issues.comments('ask/python-github2', 24) + assert_equals(repr(comments[1]), + '') diff --git a/tests/test_organizations.py b/tests/test_organizations.py new file mode 100644 index 0000000..791672d --- /dev/null +++ b/tests/test_organizations.py @@ -0,0 +1,12 @@ +import _setup + +from nose.tools import assert_equals + +import utils + + +class Organization(utils.HttpMockTestCase): + def test_repr(self): + organization = self.client.organizations.show('github') + assert_equals(repr(organization), + '') diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py new file mode 100644 index 0000000..55732a7 --- /dev/null +++ b/tests/test_pull_requests.py @@ -0,0 +1,12 @@ +import _setup + +from nose.tools import assert_equals + +import utils + + +class PullRequest(utils.HttpMockTestCase): + def test_repr(self): + pull_request = self.client.pull_requests.show('ask/python-github2', 39) + assert_equals(repr(pull_request), + '') diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 1168c46..79f70d9 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -7,6 +7,12 @@ import utils +class Repo(utils.HttpMockTestCase): + def test_repr(self): + repo = self.client.repos.show('JNRowe/misc-overlay') + assert_equals(repr(repo), '') + + class RepoProperties(utils.HttpMockTestCase): """Test repository property handling""" def test_repo(self): From 7396b04cbd8a78868ac16d84f8346a5434275a05 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 06:15:34 +0100 Subject: [PATCH 275/454] Added repository querying tests. --- ...token=xxx,e3fc6e8774f64efc3f7fd517f3e5678c | 14 ++++++++ ...h,surfraw,ef28b342b173c62c8b892fffb6509c84 | 14 ++++++++ ...ow,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 | 14 ++++++++ ...tributors,ff5597c19e0d450ad432c56295b19cf8 | 14 ++++++++ ...ed,JNRowe,7c562435f1efb67be5b048aeb79b3f6c | 14 ++++++++ tests/test_repositories.py | 35 +++++++++++++++++++ 6 files changed, 105 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,repos,pushable,access_token=xxx,e3fc6e8774f64efc3f7fd517f3e5678c create mode 100644 tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 create mode 100644 tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 create mode 100644 tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 create mode 100644 tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c diff --git a/tests/data/github.com,api,v2,json,repos,pushable,access_token=xxx,e3fc6e8774f64efc3f7fd517f3e5678c b/tests/data/github.com,api,v2,json,repos,pushable,access_token=xxx,e3fc6e8774f64efc3f7fd517f3e5678c new file mode 100644 index 0000000..bf74454 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,pushable,access_token=xxx,e3fc6e8774f64efc3f7fd517f3e5678c @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/repos/pushable?access_token=xxx +x-runtime: 9ms +content-length: 452 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "f26fe14ce1c6baf982f9c79fa8f29791" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:37:47 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"watchers":143,"homepage":"http://packages.python.org/github2","has_downloads":true,"created_at":"2009/04/18 08:31:12 -0700","fork":false,"pushed_at":"2011/06/06 16:15:04 -0700","url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"has_wiki":true,"language":"Python","name":"python-github2","owner":"ask","open_issues":5,"description":"github client in python, with issues support.","has_issues":true}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 b/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 new file mode 100644 index 0000000..8ada865 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/repos/search/surfraw +x-runtime: 160ms +content-length: 4419 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "4caafca018e434384ec7081baae373c8" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:37:04 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"type":"repo","watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"followers":3,"url":"https://github.com/JNRowe/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/06/01 01:36:06 -0700","username":"JNRowe","pushed":"2011/06/01 01:36:06 -0700","fork":false,"size":4716,"has_downloads":true,"language":"PHP","score":6.5386825,"name":"surfraw","forks":1,"created":"2010/01/26 03:49:55 -0800","description":"Mirror of the upstream git repository","private":false,"created_at":"2010/01/26 03:49:55 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"sykora","open_issues":0,"followers":1,"url":"https://github.com/sykora/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"username":"sykora","pushed":null,"language":"","fork":false,"size":0,"has_downloads":true,"score":14.106668,"name":"surfraw","forks":1,"created":"2009/11/13 06:00:42 -0800","description":"A fork of surfraw, and my attempts at adding new elvi.","private":false,"created_at":"2009/11/13 06:00:42 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"gnufs","open_issues":0,"followers":1,"url":"https://github.com/gnufs/surfraw-elvis","homepage":"","has_issues":true,"pushed_at":"2010/10/11 19:57:51 -0700","username":"gnufs","pushed":"2010/10/11 19:57:51 -0700","language":"","fork":false,"size":256,"has_downloads":true,"score":8.397954,"name":"surfraw-elvis","forks":1,"created":"2010/10/11 19:50:26 -0700","description":"custom elvis for surfraw","private":false,"created_at":"2010/10/11 19:50:26 -0700"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"kisom","open_issues":0,"followers":1,"url":"https://github.com/kisom/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/01/12 10:32:09 -0800","username":"kisom","pushed":"2011/01/12 10:32:09 -0800","language":"","fork":false,"size":1364,"has_downloads":true,"score":14.259327,"name":"surfraw","forks":1,"created":"2011/01/02 21:37:38 -0800","description":"local changes to surfraw - local edits prior to sending updates to surfraw-devel","private":false,"created_at":"2011/01/02 21:37:38 -0800"},{"type":"repo","watchers":1,"has_wiki":false,"owner":"twinshadow","open_issues":0,"followers":1,"url":"https://github.com/twinshadow/Surfraw","homepage":"http://surfraw.alioth.debian.org","has_issues":true,"pushed_at":"2011/02/20 02:52:58 -0800","username":"twinshadow","pushed":"2011/02/20 02:52:58 -0800","language":"","fork":false,"size":720,"has_downloads":true,"score":6.5386825,"name":"Surfraw","forks":1,"created":"2011/01/23 19:03:21 -0800","description":"Shell Users' Revolutionary Front Rage Against the Web","private":false,"created_at":"2011/01/23 19:03:21 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"twinshadow","open_issues":0,"followers":1,"url":"https://github.com/twinshadow/surfraw-elvi","homepage":"","has_issues":true,"pushed_at":"2011/02/24 15:59:30 -0800","username":"twinshadow","pushed":"2011/02/24 15:59:30 -0800","language":"","fork":false,"size":196,"has_downloads":true,"score":8.1655445,"name":"surfraw-elvi","forks":1,"created":"2011/02/24 15:58:58 -0800","description":"Twinshadow's personal collection of Elvi for Surfraw","private":false,"created_at":"2011/02/24 15:58:58 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"gnufs","open_issues":0,"followers":1,"url":"https://github.com/gnufs/rawdog-config-aligunduz.org","homepage":"http://aligunduz.org/planet","has_issues":true,"pushed_at":"2011/04/01 04:57:22 -0700","username":"gnufs","pushed":"2011/04/01 04:57:22 -0700","language":"","fork":false,"size":296,"has_downloads":true,"score":0.7137631,"name":"rawdog-config-aligunduz.org","forks":1,"created":"2010/10/11 20:22:39 -0700","description":"Surfraw configuration of \"Ali's Hive Mind\" on http://aligunduz.org/planet","private":false,"created_at":"2010/10/11 20:22:39 -0700"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"xabbu42","open_issues":0,"followers":1,"url":"https://github.com/xabbu42/psr","homepage":"","has_issues":true,"pushed_at":"2011/04/04 02:52:28 -0700","username":"xabbu42","pushed":"2011/04/04 02:52:28 -0700","language":"","fork":false,"size":730,"has_downloads":true,"score":1.0623765,"name":"psr","forks":1,"created":"2011/01/20 18:00:47 -0800","description":"perl surfraw like script","private":false,"created_at":"2011/01/20 18:00:47 -0800"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 b/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 new file mode 100644 index 0000000..5adfad3 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/repos/show/JNRowe +x-runtime: 168ms +content-length: 18333 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "09af032c0d629f2a27fe5e008c2717d1" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:37:59 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"integrate_branch":"iratqq","watchers":3,"homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","has_downloads":true,"created_at":"2009/04/05 18:46:34 -0700","fork":false,"pushed_at":"2011/05/08 23:35:07 -0700","url":"https://github.com/JNRowe/bfm","forks":3,"size":232,"private":false,"has_wiki":true,"language":"C","name":"bfm","owner":"JNRowe","open_issues":0,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","has_issues":true},{"watchers":2,"homepage":"http://jnrowe.github.com/upoints/","has_downloads":true,"created_at":"2009/04/23 04:06:46 -0700","fork":false,"pushed_at":"2011/05/16 03:48:13 -0700","url":"https://github.com/JNRowe/upoints","forks":0,"size":3288,"private":false,"has_wiki":true,"language":"Python","name":"upoints","owner":"JNRowe","open_issues":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","has_issues":true},{"watchers":13,"homepage":"http://packages.python.org/pyisbn/","has_downloads":true,"created_at":"2009/04/23 04:07:25 -0700","fork":false,"pushed_at":"2011/06/06 07:04:57 -0700","url":"https://github.com/JNRowe/pyisbn","forks":2,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"pyisbn","owner":"JNRowe","open_issues":1,"description":"A Python module for working with 10- and 13-digit ISBNs","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/04/23 04:09:02 -0700","fork":false,"pushed_at":"2011/05/09 01:49:16 -0700","url":"https://github.com/JNRowe/pytemplate","forks":0,"size":2252,"private":false,"has_wiki":true,"language":"Python","name":"pytemplate","owner":"JNRowe","open_issues":0,"description":"Package template for Python, with distutils setup","has_issues":true},{"watchers":5,"homepage":"http://jnrowe.github.com/misc-overlay/","has_downloads":true,"created_at":"2009/05/02 07:32:50 -0700","fork":false,"pushed_at":"2011/06/07 17:00:59 -0700","url":"https://github.com/JNRowe/misc-overlay","forks":0,"size":11049,"private":false,"has_wiki":true,"language":"Python","name":"misc-overlay","owner":"JNRowe","open_issues":6,"description":"Gentoo overlay -- miscellaneous packages","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/fixes-overlay","has_downloads":false,"created_at":"2009/05/02 07:52:47 -0700","master_branch":"master","fork":false,"pushed_at":"2011/04/06 10:48:22 -0700","url":"https://github.com/JNRowe/fixes-overlay","forks":0,"size":3636,"private":false,"has_wiki":true,"language":"Python","name":"fixes-overlay","owner":"JNRowe","open_issues":0,"description":"Small package fixes languishing in the Gentoo BTS","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/05/08 04:18:15 -0700","fork":false,"pushed_at":"2010/05/02 19:21:40 -0700","url":"https://github.com/JNRowe/dotbash","forks":0,"size":1148,"private":false,"has_wiki":true,"name":"dotbash","owner":"JNRowe","open_issues":0,"description":"Shared bash configuration files","has_issues":true},{"watchers":2,"homepage":"http://jnrowe.github.com/","has_downloads":true,"created_at":"2009/05/14 06:43:16 -0700","master_branch":"master","fork":false,"pushed_at":"2011/06/06 07:10:57 -0700","url":"https://github.com/JNRowe/jnrowe.github.com","forks":0,"size":6272,"private":false,"has_wiki":false,"language":"JavaScript","name":"jnrowe.github.com","owner":"JNRowe","open_issues":0,"description":"My user pages repository","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/05/14 11:09:34 -0700","fork":false,"pushed_at":"2011/02/14 01:52:50 -0800","url":"https://github.com/JNRowe/local-bin","forks":0,"size":652,"private":false,"has_wiki":true,"language":"Python","name":"local-bin","owner":"JNRowe","open_issues":0,"description":"Tat from my ~/bin","has_issues":true},{"watchers":2,"homepage":"","has_downloads":true,"created_at":"2009/05/24 00:05:46 -0700","fork":true,"pushed_at":"2010/09/24 21:10:10 -0700","url":"https://github.com/JNRowe/termstyle","forks":1,"size":564,"private":false,"has_wiki":true,"name":"termstyle","owner":"JNRowe","open_issues":0,"description":"a dirt-simple terminal-colour library for python","has_issues":false},{"watchers":1,"homepage":"http://readyset.tigris.org/","has_downloads":true,"created_at":"2009/08/16 19:30:50 -0700","fork":false,"pushed_at":"2011/03/04 18:49:12 -0800","url":"https://github.com/JNRowe/readyset","forks":1,"size":3216,"private":false,"has_wiki":true,"language":"JavaScript","name":"readyset","owner":"JNRowe","open_issues":0,"description":"Ready-to-use Software Engineering Templates","has_issues":true},{"watchers":3,"homepage":"http://jnrowe.github.com/cupage","has_downloads":true,"created_at":"2009/09/17 21:03:02 -0700","fork":false,"pushed_at":"2011/05/24 23:07:45 -0700","url":"https://github.com/JNRowe/cupage","forks":1,"size":4948,"private":false,"has_wiki":true,"language":"Python","name":"cupage","owner":"JNRowe","open_issues":5,"description":"A tool to check for updates on web pages","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/09/24 18:42:48 -0700","fork":false,"pushed_at":"2011/02/28 05:02:24 -0800","url":"https://github.com/JNRowe/pages_layouts","forks":1,"size":1948,"private":false,"has_wiki":true,"name":"pages_layouts","owner":"JNRowe","open_issues":0,"description":"Shared layouts submodule for jekyll","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/bwatch/","has_downloads":true,"created_at":"2009/09/26 10:13:56 -0700","fork":false,"pushed_at":"2011/04/06 10:56:17 -0700","url":"https://github.com/JNRowe/bwatch","forks":1,"size":2248,"private":false,"has_wiki":true,"language":"Python","name":"bwatch","owner":"JNRowe","open_issues":2,"description":"Simple bandwidth watching tool","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/bleeter/","has_downloads":true,"created_at":"2009/10/14 22:19:25 -0700","fork":false,"pushed_at":"2011/05/15 08:07:47 -0700","url":"https://github.com/JNRowe/bleeter","forks":1,"size":3496,"private":false,"has_wiki":true,"language":"Python","name":"bleeter","owner":"JNRowe","open_issues":1,"description":"Nasty little twitter client","has_issues":true},{"watchers":1,"homepage":"","has_downloads":false,"created_at":"2009/10/28 13:13:46 -0700","master_branch":"master","fork":true,"pushed_at":"2011/05/26 02:55:49 -0700","url":"https://github.com/JNRowe/oh-my-zsh","forks":1,"size":416,"private":false,"has_wiki":false,"language":"Shell","name":"oh-my-zsh","owner":"JNRowe","open_issues":0,"description":"A community-driven framework for managing your zsh configuration.","has_issues":true},{"watchers":3,"homepage":"http://jnrowe.github.com/vim-configs","has_downloads":true,"created_at":"2009/11/12 06:10:53 -0800","fork":false,"pushed_at":"2011/05/30 08:42:41 -0700","url":"https://github.com/JNRowe/vim-configs","forks":1,"size":3616,"private":false,"has_wiki":true,"language":"VimL","name":"vim-configs","owner":"JNRowe","open_issues":2,"description":"Personal vim configs","has_issues":true},{"watchers":3,"homepage":"http://surfraw.alioth.debian.org/","has_downloads":true,"created_at":"2010/01/26 03:49:55 -0800","fork":false,"pushed_at":"2011/06/01 01:36:06 -0700","url":"https://github.com/JNRowe/surfraw","forks":1,"size":4716,"private":false,"has_wiki":true,"language":"PHP","name":"surfraw","owner":"JNRowe","open_issues":0,"description":"Mirror of the upstream git repository","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/blanco","has_downloads":true,"created_at":"2010/01/31 13:04:51 -0800","fork":false,"pushed_at":"2011/04/06 10:37:48 -0700","url":"https://github.com/JNRowe/blanco","forks":1,"size":4200,"private":false,"has_wiki":true,"language":"Python","name":"blanco","owner":"JNRowe","open_issues":1,"description":"Hey, remember me?","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/vim-jnrowe/","has_downloads":false,"created_at":"2010/02/11 17:12:11 -0800","fork":false,"pushed_at":"2011/04/14 04:05:52 -0700","url":"https://github.com/JNRowe/vim-jnrowe","forks":1,"size":936,"private":false,"has_wiki":true,"language":"VimL","name":"vim-jnrowe","owner":"JNRowe","open_issues":0,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2010/02/15 12:19:22 -0800","fork":false,"pushed_at":"2011/06/01 10:27:57 -0700","url":"https://github.com/JNRowe/emacs-configs","forks":1,"size":1604,"private":false,"has_wiki":true,"language":"Emacs Lisp","name":"emacs-configs","owner":"JNRowe","open_issues":0,"description":"Personal emacs configs","has_issues":true},{"watchers":1,"homepage":"http://joshthecoder.github.com/tweepy","has_downloads":true,"created_at":"2010/03/31 14:57:29 -0700","fork":true,"pushed_at":"2010/04/02 19:09:52 -0700","url":"https://github.com/JNRowe/tweepy","forks":1,"size":536,"private":false,"has_wiki":true,"name":"tweepy","owner":"JNRowe","open_issues":0,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","has_issues":true},{"watchers":1,"homepage":"www.vim.org/scripts/script.php?script_id=2540","has_downloads":false,"created_at":"2010/04/05 20:56:06 -0700","fork":true,"pushed_at":"2011/01/27 03:16:30 -0800","url":"https://github.com/JNRowe/snipmate.vim","forks":1,"size":248,"private":false,"has_wiki":false,"language":"VimL","name":"snipmate.vim","owner":"JNRowe","open_issues":0,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","has_issues":false},{"watchers":1,"homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","has_downloads":true,"created_at":"2010/05/05 00:54:23 -0700","fork":false,"pushed_at":"2010/05/05 00:55:01 -0700","url":"https://github.com/JNRowe/winwrangler","forks":1,"size":276,"private":false,"has_wiki":true,"name":"winwrangler","owner":"JNRowe","open_issues":0,"description":"Mirror of the upstream failpad source, converted for Matt","has_issues":true},{"watchers":1,"homepage":"http://divmod.org/trac/wiki/DivmodReverend","has_downloads":true,"created_at":"2010/05/06 10:58:58 -0700","fork":false,"pushed_at":"2010/05/06 11:10:51 -0700","url":"https://github.com/JNRowe/reverend","forks":1,"size":420,"private":false,"has_wiki":true,"name":"reverend","owner":"JNRowe","open_issues":0,"description":"Reverend - Simple Bayesian classifier","has_issues":true},{"watchers":1,"homepage":"http://packages.python.org/github-cli","has_downloads":true,"created_at":"2010/09/15 08:21:44 -0700","fork":true,"pushed_at":"2010/11/02 10:42:20 -0700","url":"https://github.com/JNRowe/github-cli","forks":0,"size":916,"private":false,"has_wiki":true,"name":"github-cli","owner":"JNRowe","open_issues":0,"description":"A command-line interface to the GitHub Issues API v2.","has_issues":false},{"watchers":3,"homepage":"","has_downloads":true,"created_at":"2010/10/31 01:03:09 -0700","fork":true,"pushed_at":"2011/06/06 16:14:48 -0700","url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"has_wiki":true,"language":"Python","name":"python-github2","owner":"JNRowe","open_issues":0,"description":"github client in python, with issues support.","has_issues":false},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2010/10/31 09:27:05 -0700","fork":false,"pushed_at":"2011/05/31 13:08:10 -0700","url":"https://github.com/JNRowe/gh_bugs","forks":1,"size":2564,"private":false,"has_wiki":true,"language":"Python","name":"gh_bugs","owner":"JNRowe","open_issues":6,"description":"Simple client for GitHub issues","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/01/27 03:05:32 -0800","fork":true,"pushed_at":"2011/05/17 06:22:45 -0700","url":"https://github.com/JNRowe/snipmate-snippets","forks":0,"size":956,"private":false,"has_wiki":true,"language":"VimL","name":"snipmate-snippets","owner":"JNRowe","open_issues":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","has_issues":false},{"watchers":1,"homepage":"http://github.com/caffeinehit/hammertime","has_downloads":true,"created_at":"2011/02/02 09:49:21 -0800","fork":true,"pushed_at":"2011/02/02 09:54:18 -0800","url":"https://github.com/JNRowe/hammertime","forks":0,"size":720,"private":false,"has_wiki":true,"language":"Python","name":"hammertime","owner":"JNRowe","open_issues":0,"description":"Time tracking with git","has_issues":false},{"watchers":1,"homepage":"http://jnrowe.github.com/versionah/","has_downloads":true,"created_at":"2011/02/15 08:51:56 -0800","fork":false,"pushed_at":"2011/05/31 10:24:35 -0700","url":"https://github.com/JNRowe/versionah","forks":1,"size":4404,"private":false,"has_wiki":true,"language":"Python","name":"versionah","owner":"JNRowe","open_issues":0,"description":"Simple version number mangler","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/02/22 13:00:23 -0800","fork":false,"url":"https://github.com/JNRowe/issues-test","forks":1,"size":0,"private":false,"has_wiki":true,"name":"issues-test","owner":"JNRowe","open_issues":8,"description":"Repo for testing gh-bugs","has_issues":true},{"watchers":1,"homepage":"http://docs.notmyidea.org/alexis/pelican/","has_downloads":true,"created_at":"2011/02/23 21:20:07 -0800","fork":true,"pushed_at":"2011/04/04 21:22:46 -0700","url":"https://github.com/JNRowe/pelican","forks":0,"size":3916,"private":false,"has_wiki":true,"language":"Python","name":"pelican","owner":"JNRowe","open_issues":0,"description":"Static blog generator in python, using ReST syntax","has_issues":false},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/04/04 23:37:38 -0700","fork":true,"pushed_at":"2011/04/04 23:44:42 -0700","url":"https://github.com/JNRowe/pw","forks":0,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"pw","owner":"JNRowe","open_issues":0,"description":"Grep GPG-encrypted YAML password safes.","has_issues":false},{"watchers":1,"homepage":"http://code.google.com/p/shell-doctest/","has_downloads":true,"created_at":"2011/04/05 05:32:07 -0700","fork":false,"pushed_at":"2011/04/05 05:32:44 -0700","url":"https://github.com/JNRowe/shell-doctest","forks":1,"size":128,"private":false,"has_wiki":true,"language":"Python","name":"shell-doctest","owner":"JNRowe","open_issues":0,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/blog","has_downloads":true,"created_at":"2011/04/05 09:21:16 -0700","fork":false,"pushed_at":"2011/04/05 09:22:26 -0700","url":"https://github.com/JNRowe/blog","forks":1,"size":1152,"private":false,"has_wiki":true,"name":"blog","owner":"JNRowe","open_issues":0,"description":"Old jnrowe.github.com content that *may* be resurrected.","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/04/06 07:35:40 -0700","fork":false,"pushed_at":"2011/05/13 12:27:22 -0700","url":"https://github.com/JNRowe/sphinx-jnrowe","forks":1,"size":644,"private":false,"has_wiki":true,"name":"sphinx-jnrowe","owner":"JNRowe","open_issues":0,"description":"My sphinx theme","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/05/09 06:04:35 -0700","fork":false,"pushed_at":"2011/05/27 00:50:48 -0700","url":"https://github.com/JNRowe/rdial","forks":1,"size":272,"private":false,"has_wiki":true,"language":"Python","name":"rdial","owner":"JNRowe","open_issues":0,"description":"Simple time tracking for simple people","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/05/22 23:21:28 -0700","fork":true,"pushed_at":"2011/05/30 08:39:21 -0700","url":"https://github.com/JNRowe/vim-cute-python","forks":0,"size":180,"private":false,"has_wiki":true,"language":"VimL","name":"vim-cute-python","owner":"JNRowe","open_issues":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","has_issues":false},{"watchers":1,"homepage":"http://develop.github.com","has_downloads":false,"created_at":"2011/05/23 03:32:46 -0700","master_branch":"gh-pages","fork":true,"pushed_at":"2011/05/23 03:36:51 -0700","url":"https://github.com/JNRowe/develop.github.com","forks":0,"size":1584,"private":false,"has_wiki":false,"language":"JavaScript","name":"develop.github.com","owner":"JNRowe","open_issues":0,"description":"API Documentation for GitHub","has_issues":false},{"watchers":1,"homepage":"http://python-requests.org","has_downloads":true,"created_at":"2011/05/27 00:16:23 -0700","master_branch":"develop","fork":true,"pushed_at":"2011/05/27 00:17:44 -0700","url":"https://github.com/JNRowe/requests","forks":0,"size":2648,"private":false,"has_wiki":false,"language":"Python","name":"requests","owner":"JNRowe","open_issues":0,"description":"Python HTTP Requests for Humans.","has_issues":false},{"watchers":1,"homepage":"http://github.com/caelum/restfulie-py","has_downloads":true,"created_at":"2011/05/28 22:04:51 -0700","fork":true,"pushed_at":"2011/05/28 22:05:55 -0700","url":"https://github.com/JNRowe/restfulie-py","forks":0,"size":1794,"private":false,"has_wiki":true,"language":"Python","name":"restfulie-py","owner":"JNRowe","open_issues":0,"description":"Python port of Restfulie","has_issues":false},{"watchers":1,"homepage":"http://tyrs.nicosphere.net","has_downloads":true,"created_at":"2011/06/03 02:42:16 -0700","fork":true,"pushed_at":"2011/06/03 06:45:50 -0700","url":"https://github.com/JNRowe/tyrs","forks":0,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"tyrs","owner":"JNRowe","open_issues":0,"description":"twitter curses client","has_issues":false},{"watchers":1,"homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_downloads":true,"created_at":"2011/06/06 06:21:54 -0700","fork":true,"pushed_at":"2011/06/06 06:23:32 -0700","url":"https://github.com/JNRowe/gpxviewer","forks":0,"size":1040,"private":false,"has_wiki":false,"language":"Python","name":"gpxviewer","owner":"JNRowe","open_issues":0,"description":"GPXViewer GPS trace viewer","has_issues":false}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 new file mode 100644 index 0000000..6480977 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 54 +content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/contributors +x-runtime: 43ms +content-length: 5485 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "bad07c5d349a2f8a18db3268500b2586" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:39:49 GMT +content-type: application/json; charset=utf-8 + +{"contributors":[{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","contributions":202,"location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","contributions":44,"location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},{"name":"Vincent Driessen","gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","contributions":9,"location":"Netherlands","blog":"http://nvie.com","type":"User","login":"nvie","email":"vincent@datafox.nl"},{"name":"Adam Vandenberg","gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","contributions":6,"location":"Issaquah, WA","blog":"http://adamv.com/","type":"User","login":"adamv","email":"flangy@gmail.com"},{"name":"Michael Basnight","gravatar_id":"2f3f68f62f5fc642f0b716b355071176","contributions":5,"location":"Austin","type":"User","login":"hub-cap"},{"name":"chris vale","company":"RocketNinja","gravatar_id":"d5400f77ab68a885319ac7b929bc789e","contributions":4,"location":"San Francisco","blog":"http://blog.crispywalrus.net/","type":"User","login":"crispywalrus","email":""},{"name":"Maximillian Dornseif","company":"HUDORA GmbH","gravatar_id":"ac1e94537ee54758bb954a6d1306be2a","contributions":4,"location":"Germany","blog":"http://mdornseif.github.com/","type":"User","login":"mdornseif"},{"name":"Fernando Perez","company":"University of California, Berkeley.","gravatar_id":"95198572b00e5fbcd97fb5315215bf7a","contributions":4,"location":"Berkeley, CA","blog":"http://fperez.org","type":"User","login":"fperez","email":"fernando.perez@berkeley.edu"},{"name":"Evan Broder","gravatar_id":"425ea4ff715bef0be068e0176251bf53","contributions":4,"location":"San Francisco, CA","blog":"http://ebroder.net","type":"User","login":"ebroder","email":"evan@ebroder.net"},{"name":"Jeremy Dunck","gravatar_id":"f3794e603ef53b0513ab45b6565ee457","contributions":4,"location":"Dallas, TX","type":"User","login":"jdunck","email":""},{"name":"Daniel Greenfeld","company":"pydanny.com","gravatar_id":"67e05420d4dd3492097aeb77f44f7867","contributions":3,"location":"Los Angeles, CA","blog":"http://pydanny.blogspot.com","type":"User","login":"pydanny","email":"pydanny@gmail.com"},{"name":"Scott Torborg","company":"","gravatar_id":"e45c9c1a1c6184d5572859c52ae43bfc","contributions":2,"location":"Portland, OR","blog":"http://www.scotttorborg.com","type":"User","login":"storborg","email":"storborg@mit.edu"},{"name":"Patryk Zawadzki","gravatar_id":"16483a82144b02ad846eafa078ef9b27","contributions":2,"location":"Wrocław, Poland","blog":"http://room-303.com/blog/","type":"User","login":"patrys","email":"patrys@pld-linux.org"},{"name":"Surajram Kumaravel","company":"","gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","contributions":2,"location":"Chennai, India","blog":"http://www.surajram.com","type":"User","login":"surajram","email":"root@surajram.com"},{"name":"Cody Soyland","company":"","gravatar_id":"db17092663e716b08de72e936ed082c7","contributions":2,"location":"Lawrence, KS","blog":"http://codysoyland.com/","type":"User","login":"codysoyland","email":"codysoyland@gmail.com"},{"name":"Christopher MacGown","gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","contributions":2,"location":"","type":"User","login":"ChristopherMacGown","email":""},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","contributions":1,"type":"User","login":"broderboy"},{"gravatar_id":"311e2e25841265550f884d3996a4e23b","contributions":1,"type":"User","login":"openhatched"},{"name":"Rick Harris","gravatar_id":"afb82eaa9550a5ba8538bb926b854465","contributions":1,"location":"Austin, TX","type":"User","login":"rconradharris","email":"rconradharris@gmail.com"},{"name":"Josh Weinberg","gravatar_id":"cf04727870245c17f455fb05b25f9f8e","contributions":1,"blog":"http://openemu.org","type":"User","login":"jweinberg","email":"joshuacweinberg@gmail.com"},{"name":"Claudio B.","company":"","gravatar_id":"4dea5cf83d2d6c1228750b76e579b38d","contributions":1,"location":"Los Angeles, United States","blog":"http://claudiob.github.com","type":"User","login":"claudiob","email":""},{"name":"Barthelemy Dagenais","gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","contributions":1,"location":"Montreal, QC, Canada","blog":"http://www.infobart.com","type":"User","login":"bartdag"},{"name":"Mark Paschal","company":"","gravatar_id":"30e5bdec1073df6350d27b8145bf0dab","contributions":1,"location":"San Francisco, CA, USA","blog":"http://markpasc.org/mark/","type":"User","login":"markpasc","email":""},{"name":"Jonas Obrist","company":"divio GmbH","gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","contributions":1,"location":"Zurich, Switzerland","blog":"twitter.com/ojiidotch","type":"User","login":"ojii","email":"jonas.obrist@divio.ch"},{"name":"Kenneth Reitz","company":"Arc90, Inc","gravatar_id":"2eccc4005572c1e2b12a9c00580bc86f","contributions":1,"location":"Washington, DC","blog":"http://kennethreitz.com","type":"User","login":"kennethreitz","email":"_@kennethreitz.com"},{"name":"Justin Quick","company":"Washington Times","gravatar_id":"063d31c517033677654704043d219008","contributions":1,"location":"DC","blog":"http://serotoninstorm.com","type":"User","login":"justquick","email":"justquick@gmail.com"},{"name":"Jens Ohlig","gravatar_id":"9de3f3969367fffe2051c2b405b79810","contributions":1,"blog":"http://www.johl.io","type":"User","login":"johl","email":""}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c b/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c new file mode 100644 index 0000000..c53a97a --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 55 +content-location: https://github.com/api/v2/json/repos/watched/JNRowe +x-runtime: 293ms +content-length: 37996 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "2186c1687646c71b67903b8ab8f126af" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:39:41 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"watchers":922,"has_wiki":true,"owner":"scrooloose","open_issues":40,"url":"https://github.com/scrooloose/nerdtree","homepage":"","has_issues":true,"pushed_at":"2011/05/06 03:00:51 -0700","fork":false,"size":956,"has_downloads":true,"language":"VimL","name":"nerdtree","forks":70,"description":"hax0r vim script to give you a tree explorer","private":false,"created_at":"2008/03/10 00:34:08 -0700"},{"watchers":336,"has_wiki":true,"owner":"scrooloose","open_issues":6,"url":"https://github.com/scrooloose/nerdcommenter","homepage":"","has_issues":true,"pushed_at":"2011/05/05 18:56:29 -0700","fork":false,"size":1100,"has_downloads":true,"language":"VimL","name":"nerdcommenter","forks":39,"description":"Vim plugin for intensely orgasmic commenting","private":false,"created_at":"2008/03/10 01:19:15 -0700"},{"watchers":25,"has_wiki":true,"owner":"timcharper","open_issues":2,"url":"https://github.com/timcharper/textile.vim","homepage":"http://www.vim.org/scripts/script.php?script_id=2305","has_issues":true,"pushed_at":"2011/02/21 15:23:33 -0800","fork":false,"size":296,"has_downloads":true,"language":"VimL","name":"textile.vim","forks":11,"description":"Textile for VIM","private":false,"created_at":"2008/07/21 03:55:46 -0700"},{"watchers":369,"has_wiki":false,"owner":"tpope","open_issues":7,"url":"https://github.com/tpope/vim-surround","homepage":"http://www.vim.org/scripts/script.php?script_id=1697","has_issues":true,"pushed_at":"2011/01/22 20:29:15 -0800","fork":false,"size":188,"has_downloads":true,"language":"VimL","name":"vim-surround","forks":33,"description":"surround.vim: quoting/parenthesizing made simple","private":false,"created_at":"2008/09/10 18:00:16 -0700"},{"watchers":48,"has_wiki":false,"owner":"tpope","open_issues":0,"url":"https://github.com/tpope/vim-speeddating","homepage":"http://www.vim.org/scripts/script.php?script_id=2120","has_issues":true,"pushed_at":"2010/12/28 20:46:52 -0800","fork":false,"size":148,"has_downloads":false,"language":"VimL","name":"vim-speeddating","forks":5,"description":"speeddating.vim: use CTRL-A/CTRL-X to increment dates, times, and more","private":false,"created_at":"2008/09/10 18:07:06 -0700"},{"watchers":84,"has_wiki":true,"owner":"sjbach","open_issues":7,"url":"https://github.com/sjbach/lusty","homepage":"http://www.vim.org/scripts/script.php?script_id=1890","has_issues":true,"pushed_at":"2011/06/02 19:42:36 -0700","fork":false,"size":1584,"has_downloads":false,"language":"VimL","name":"lusty","forks":16,"description":"LustyExplorer / LustyJuggler for Vim","private":false,"created_at":"2008/09/14 19:54:02 -0700"},{"watchers":135,"has_wiki":false,"owner":"github","open_issues":34,"url":"https://github.com/github/develop.github.com","homepage":"http://develop.github.com","organization":"github","has_issues":true,"pushed_at":"2011/06/01 20:54:15 -0700","master_branch":"gh-pages","fork":false,"size":112,"has_downloads":false,"language":"JavaScript","name":"develop.github.com","forks":45,"description":"API Documentation for GitHub","private":false,"created_at":"2009/02/17 15:51:23 -0800"},{"watchers":3,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/windowlayout","homepage":"","has_issues":true,"pushed_at":"2009/02/26 08:46:15 -0800","fork":false,"size":296,"has_downloads":true,"language":"VimL","name":"windowlayout","forks":0,"description":"A vim library for saving and restoring window layouts, plus demo plugins","private":false,"created_at":"2009/02/25 22:10:21 -0800"},{"watchers":157,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/tabular","homepage":"","has_issues":true,"pushed_at":"2011/04/01 18:13:35 -0700","fork":false,"size":616,"has_downloads":true,"language":"VimL","name":"tabular","forks":9,"description":"Vim script for text filtering and alignment","private":false,"created_at":"2009/03/02 22:19:16 -0800"},{"watchers":2,"has_wiki":true,"owner":"decklin","open_issues":0,"url":"https://github.com/decklin/mnemosyne","homepage":"http://www.red-bean.com/decklin/mnemosyne/","has_issues":true,"pushed_at":"2009/03/10 10:25:52 -0700","fork":false,"size":344,"has_downloads":true,"name":"mnemosyne","forks":0,"description":"Static Python/Kid weblog generator with Maildir store","private":false,"created_at":"2009/03/10 10:19:38 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/bfm","homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","has_issues":true,"pushed_at":"2011/05/08 23:35:07 -0700","integrate_branch":"iratqq","fork":false,"size":232,"has_downloads":true,"language":"C","name":"bfm","forks":3,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","private":false,"created_at":"2009/04/05 18:46:34 -0700"},{"watchers":143,"has_wiki":true,"owner":"ask","open_issues":5,"url":"https://github.com/ask/python-github2","homepage":"http://packages.python.org/github2","has_issues":true,"pushed_at":"2011/06/06 16:15:04 -0700","fork":false,"size":112,"has_downloads":true,"language":"Python","name":"python-github2","forks":50,"description":"github client in python, with issues support.","private":false,"created_at":"2009/04/18 08:31:12 -0700"},{"watchers":108,"has_wiki":true,"owner":"jsmits","open_issues":5,"url":"https://github.com/jsmits/github-cli","homepage":"http://packages.python.org/github-cli","has_issues":true,"pushed_at":"2011/03/16 13:18:51 -0700","fork":false,"size":100,"has_downloads":true,"language":"Python","name":"github-cli","forks":12,"description":"A command-line interface to the GitHub Issues API v2.","private":false,"created_at":"2009/04/19 02:05:27 -0700"},{"watchers":2,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/upoints","homepage":"http://jnrowe.github.com/upoints/","has_issues":true,"pushed_at":"2011/05/16 03:48:13 -0700","fork":false,"size":3288,"has_downloads":true,"language":"Python","name":"upoints","forks":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","private":false,"created_at":"2009/04/23 04:06:46 -0700"},{"watchers":13,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/pyisbn","homepage":"http://packages.python.org/pyisbn/","has_issues":true,"pushed_at":"2011/06/06 07:04:57 -0700","fork":false,"size":132,"has_downloads":true,"language":"Python","name":"pyisbn","forks":2,"description":"A Python module for working with 10- and 13-digit ISBNs","private":false,"created_at":"2009/04/23 04:07:25 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pytemplate","homepage":"","has_issues":true,"pushed_at":"2011/05/09 01:49:16 -0700","fork":false,"size":2252,"has_downloads":true,"language":"Python","name":"pytemplate","forks":0,"description":"Package template for Python, with distutils setup","private":false,"created_at":"2009/04/23 04:09:02 -0700"},{"watchers":5,"has_wiki":true,"owner":"JNRowe","open_issues":6,"url":"https://github.com/JNRowe/misc-overlay","homepage":"http://jnrowe.github.com/misc-overlay/","has_issues":true,"pushed_at":"2011/06/07 17:00:59 -0700","fork":false,"size":11049,"has_downloads":true,"language":"Python","name":"misc-overlay","forks":0,"description":"Gentoo overlay -- miscellaneous packages","private":false,"created_at":"2009/05/02 07:32:50 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/fixes-overlay","homepage":"http://jnrowe.github.com/fixes-overlay","has_issues":true,"pushed_at":"2011/04/06 10:48:22 -0700","master_branch":"master","fork":false,"size":3636,"has_downloads":false,"language":"Python","name":"fixes-overlay","forks":0,"description":"Small package fixes languishing in the Gentoo BTS","private":false,"created_at":"2009/05/02 07:52:47 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/dotbash","homepage":"","has_issues":true,"pushed_at":"2010/05/02 19:21:40 -0700","fork":false,"size":1148,"has_downloads":true,"name":"dotbash","forks":0,"description":"Shared bash configuration files","private":false,"created_at":"2009/05/08 04:18:15 -0700"},{"watchers":2,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/jnrowe.github.com","homepage":"http://jnrowe.github.com/","has_issues":true,"pushed_at":"2011/06/06 07:10:57 -0700","master_branch":"master","fork":false,"size":6272,"has_downloads":true,"language":"JavaScript","name":"jnrowe.github.com","forks":0,"description":"My user pages repository","private":false,"created_at":"2009/05/14 06:43:16 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/local-bin","homepage":"","has_issues":true,"pushed_at":"2011/02/14 01:52:50 -0800","fork":false,"size":652,"has_downloads":true,"language":"Python","name":"local-bin","forks":0,"description":"Tat from my ~/bin","private":false,"created_at":"2009/05/14 11:09:34 -0700"},{"watchers":2,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/termstyle","homepage":"","has_issues":false,"pushed_at":"2010/09/24 21:10:10 -0700","fork":true,"size":564,"has_downloads":true,"name":"termstyle","forks":1,"description":"a dirt-simple terminal-colour library for python","private":false,"created_at":"2009/05/24 00:05:46 -0700"},{"watchers":659,"has_wiki":false,"owner":"tweepy","open_issues":48,"url":"https://github.com/tweepy/tweepy","homepage":"http://tweepy.github.com/","organization":"tweepy","has_issues":true,"pushed_at":"2011/05/25 22:50:37 -0700","fork":false,"size":933,"has_downloads":true,"language":"Python","name":"tweepy","forks":117,"description":"A Python library for access the Twitter API","private":false,"created_at":"2009/07/05 21:15:34 -0700"},{"watchers":35,"has_wiki":true,"owner":"ciaranm","open_issues":0,"url":"https://github.com/ciaranm/inkpot","homepage":"","has_issues":true,"pushed_at":"2009/11/27 15:42:40 -0800","fork":false,"size":124,"has_downloads":true,"language":"VimL","name":"inkpot","forks":3,"description":"Inkpot 88/256 Colour Scheme for Vim","private":false,"created_at":"2009/07/06 09:24:19 -0700"},{"watchers":21,"has_wiki":true,"owner":"ciaranm","open_issues":0,"url":"https://github.com/ciaranm/detectindent","homepage":"","has_issues":true,"pushed_at":"2011/05/23 07:50:37 -0700","fork":false,"size":136,"has_downloads":true,"language":"VimL","name":"detectindent","forks":4,"description":"Vim script for automatically detecting indent settings","private":false,"created_at":"2009/07/09 07:13:01 -0700"},{"watchers":12,"has_wiki":true,"owner":"ciaranm","open_issues":1,"url":"https://github.com/ciaranm/securemodelines","homepage":"","has_issues":true,"pushed_at":"2011/02/06 04:47:00 -0800","fork":false,"size":104,"has_downloads":true,"language":"VimL","name":"securemodelines","forks":4,"description":"A secure alternative to Vim modelines","private":false,"created_at":"2009/07/09 07:18:16 -0700"},{"watchers":190,"has_wiki":true,"owner":"scrooloose","open_issues":12,"url":"https://github.com/scrooloose/syntastic","homepage":"","has_issues":true,"pushed_at":"2011/06/02 13:26:53 -0700","fork":false,"size":120,"has_downloads":true,"language":"VimL","name":"syntastic","forks":42,"description":"Syntax checking hacks for vim","private":false,"created_at":"2009/07/10 21:05:54 -0700"},{"watchers":8,"has_wiki":false,"owner":"flother","open_issues":0,"url":"https://github.com/flother/participationgraphs","homepage":"http://www.flother.com/blog/2009/django-github-sparklines/","has_issues":true,"pushed_at":"2010/09/25 03:57:52 -0700","fork":false,"size":628,"has_downloads":false,"language":"Python","name":"participationgraphs","forks":1,"description":"Django app with a template tag to allow you to include sparklines of the 52-week commit history for a project on Github","private":false,"created_at":"2009/07/15 05:07:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/readyset","homepage":"http://readyset.tigris.org/","has_issues":true,"pushed_at":"2011/03/04 18:49:12 -0800","fork":false,"size":3216,"has_downloads":true,"language":"JavaScript","name":"readyset","forks":1,"description":"Ready-to-use Software Engineering Templates","private":false,"created_at":"2009/08/16 19:30:50 -0700"},{"watchers":35,"has_wiki":true,"owner":"spiiph","open_issues":9,"url":"https://github.com/spiiph/vim-space","homepage":"","has_issues":true,"pushed_at":"2010/04/13 07:32:09 -0700","fork":false,"size":572,"has_downloads":true,"language":"VimL","name":"vim-space","forks":7,"description":"space.vim - Smart Space key for Vim","private":false,"created_at":"2009/08/17 05:27:00 -0700"},{"watchers":151,"has_wiki":true,"owner":"sixapart","open_issues":11,"url":"https://github.com/sixapart/remoteobjects","homepage":"http://sixapart.github.com/remoteobjects/","organization":"sixapart","has_issues":true,"pushed_at":"2011/04/19 09:58:32 -0700","fork":false,"size":336,"has_downloads":true,"language":"Python","name":"remoteobjects","forks":12,"description":"An object RESTational model","private":false,"created_at":"2009/08/18 11:26:38 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":5,"url":"https://github.com/JNRowe/cupage","homepage":"http://jnrowe.github.com/cupage","has_issues":true,"pushed_at":"2011/05/24 23:07:45 -0700","fork":false,"size":4948,"has_downloads":true,"language":"Python","name":"cupage","forks":1,"description":"A tool to check for updates on web pages","private":false,"created_at":"2009/09/17 21:03:02 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pages_layouts","homepage":"","has_issues":true,"pushed_at":"2011/02/28 05:02:24 -0800","fork":false,"size":1948,"has_downloads":true,"name":"pages_layouts","forks":1,"description":"Shared layouts submodule for jekyll","private":false,"created_at":"2009/09/24 18:42:48 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":2,"url":"https://github.com/JNRowe/bwatch","homepage":"http://jnrowe.github.com/bwatch/","has_issues":true,"pushed_at":"2011/04/06 10:56:17 -0700","fork":false,"size":2248,"has_downloads":true,"language":"Python","name":"bwatch","forks":1,"description":"Simple bandwidth watching tool","private":false,"created_at":"2009/09/26 10:13:56 -0700"},{"watchers":1205,"has_wiki":false,"owner":"tpope","open_issues":17,"url":"https://github.com/tpope/vim-fugitive","homepage":"http://www.vim.org/scripts/script.php?script_id=2975","has_issues":true,"pushed_at":"2011/06/02 18:40:54 -0700","fork":false,"size":176,"has_downloads":false,"language":"VimL","name":"vim-fugitive","forks":32,"description":"fugitive.vim: a Git wrapper so awesome, it should be illegal","private":false,"created_at":"2009/10/08 18:09:49 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/bleeter","homepage":"http://jnrowe.github.com/bleeter/","has_issues":true,"pushed_at":"2011/05/15 08:07:47 -0700","fork":false,"size":3496,"has_downloads":true,"language":"Python","name":"bleeter","forks":1,"description":"Nasty little twitter client","private":false,"created_at":"2009/10/14 22:19:25 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/oh-my-zsh","homepage":"","has_issues":true,"pushed_at":"2011/05/26 02:55:49 -0700","master_branch":"master","fork":true,"size":416,"has_downloads":false,"language":"Shell","name":"oh-my-zsh","forks":1,"description":"A community-driven framework for managing your zsh configuration.","private":false,"created_at":"2009/10/28 13:13:46 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":2,"url":"https://github.com/JNRowe/vim-configs","homepage":"http://jnrowe.github.com/vim-configs","has_issues":true,"pushed_at":"2011/05/30 08:42:41 -0700","fork":false,"size":3616,"has_downloads":true,"language":"VimL","name":"vim-configs","forks":1,"description":"Personal vim configs","private":false,"created_at":"2009/11/12 06:10:53 -0800"},{"watchers":3,"has_wiki":true,"owner":"baruch","open_issues":0,"url":"https://github.com/baruch/notmuch-gtk","homepage":"http://baruch.github.com/notmuch-gtk","has_issues":true,"pushed_at":"2009/11/28 15:42:12 -0800","fork":false,"size":1638,"has_downloads":true,"name":"notmuch-gtk","forks":1,"description":"A Gtk+ interface to the notmuch mail client, not maintained anymore, I switched to gmail instead.","private":false,"created_at":"2009/11/26 07:59:04 -0800"},{"watchers":10,"has_wiki":true,"owner":"c9s","open_issues":2,"url":"https://github.com/c9s/gsession.vim","has_issues":true,"pushed_at":"2010/12/10 00:52:20 -0800","fork":false,"size":144,"has_downloads":true,"language":"VimL","name":"gsession.vim","forks":4,"description":"gsession.vim saves your session files into the same directory (~/.vim/session/) by default. and auto-detect your session file to load session file when you are opening vim editor without arguments.","private":false,"created_at":"2009/12/07 06:31:08 -0800"},{"watchers":565,"has_wiki":true,"owner":"tpope","open_issues":6,"url":"https://github.com/tpope/vim-pathogen","homepage":"http://www.vim.org/scripts/script.php?script_id=2332","has_issues":true,"pushed_at":"2011/05/13 20:58:53 -0700","fork":false,"size":256,"has_downloads":false,"language":"VimL","name":"vim-pathogen","forks":24,"description":"pathogen.vim: manage your runtimepath","private":false,"created_at":"2009/12/13 12:59:18 -0800"},{"watchers":4,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/colorchart","homepage":"","has_issues":true,"pushed_at":"2010/09/25 18:11:09 -0700","fork":false,"size":480,"has_downloads":true,"language":"VimL","name":"colorchart","forks":1,"description":"Provides an interactive color chart from examining terminal color palettes in vim","private":false,"created_at":"2009/12/21 00:35:24 -0800"},{"watchers":88,"has_wiki":true,"owner":"tpope","open_issues":2,"url":"https://github.com/tpope/vim-ragtag","homepage":"http://www.vim.org/scripts/script.php?script_id=1896","has_issues":true,"pushed_at":"2010/09/26 08:43:54 -0700","fork":false,"size":736,"has_downloads":true,"language":"VimL","name":"vim-ragtag","forks":13,"description":"ragtag.vim: ghetto HTML/XML mappings (formerly allml.vim)","private":false,"created_at":"2010/01/17 17:04:48 -0800"},{"watchers":2050,"has_wiki":true,"owner":"nvie","open_issues":47,"url":"https://github.com/nvie/gitflow","homepage":"http://nvie.com/posts/a-successful-git-branching-model/","has_issues":true,"pushed_at":"2011/05/23 04:02:34 -0700","integrate_branch":"develop","master_branch":"develop","fork":false,"size":5290,"has_downloads":true,"language":"Shell","name":"gitflow","forks":129,"description":"Git extensions to provide high-level repository operations for Vincent Driessen's branching model.","private":false,"created_at":"2010/01/20 15:14:12 -0800"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/06/01 01:36:06 -0700","fork":false,"size":4716,"has_downloads":true,"language":"PHP","name":"surfraw","forks":1,"description":"Mirror of the upstream git repository","private":false,"created_at":"2010/01/26 03:49:55 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/blanco","homepage":"http://jnrowe.github.com/blanco","has_issues":true,"pushed_at":"2011/04/06 10:37:48 -0700","fork":false,"size":4200,"has_downloads":true,"language":"Python","name":"blanco","forks":1,"description":"Hey, remember me?","private":false,"created_at":"2010/01/31 13:04:51 -0800"},{"watchers":144,"has_wiki":true,"owner":"benoitc","open_issues":5,"url":"https://github.com/benoitc/restkit","homepage":"http://benoitc.github.com/restkit","has_issues":true,"pushed_at":"2011/05/30 02:02:01 -0700","fork":false,"size":2584,"has_downloads":true,"language":"Python","name":"restkit","forks":11,"description":"an HTTP resource kit for Python","private":false,"created_at":"2010/02/04 05:21:24 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/vim-jnrowe","homepage":"http://jnrowe.github.com/vim-jnrowe/","has_issues":true,"pushed_at":"2011/04/14 04:05:52 -0700","fork":false,"size":936,"has_downloads":false,"language":"VimL","name":"vim-jnrowe","forks":1,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","private":false,"created_at":"2010/02/11 17:12:11 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/emacs-configs","homepage":"","has_issues":true,"pushed_at":"2011/06/01 10:27:57 -0700","fork":false,"size":1604,"has_downloads":true,"language":"Emacs Lisp","name":"emacs-configs","forks":1,"description":"Personal emacs configs","private":false,"created_at":"2010/02/15 12:19:22 -0800"},{"watchers":19,"has_wiki":true,"owner":"rc0","open_issues":1,"url":"https://github.com/rc0/mairix","homepage":"http://www.rc0.org.uk/mairix","has_issues":true,"pushed_at":"2011/02/09 16:31:13 -0800","fork":false,"size":200,"has_downloads":true,"language":"C","name":"mairix","forks":6,"description":"mairix is a program for indexing and searching email messages stored in Maildir, MH or mbox folders","private":false,"created_at":"2010/03/05 14:34:27 -0800"},{"watchers":3,"has_wiki":true,"owner":"rc0","open_issues":0,"url":"https://github.com/rc0/spill","homepage":"http://www.rc0.org.uk/spill","has_issues":true,"pushed_at":"2011/05/17 15:52:40 -0700","fork":false,"size":252,"has_downloads":true,"language":"C","name":"spill","forks":1,"description":"spill is a program for creating set of symbolic links from one directory hierarchy which point to corresponding filenames in a separate directory hierarchy.","private":false,"created_at":"2010/03/06 13:28:55 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/tweepy","homepage":"http://joshthecoder.github.com/tweepy","has_issues":true,"pushed_at":"2010/04/02 19:09:52 -0700","fork":true,"size":536,"has_downloads":true,"name":"tweepy","forks":1,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","private":false,"created_at":"2010/03/31 14:57:29 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/snipmate.vim","homepage":"www.vim.org/scripts/script.php?script_id=2540","has_issues":false,"pushed_at":"2011/01/27 03:16:30 -0800","fork":true,"size":248,"has_downloads":false,"language":"VimL","name":"snipmate.vim","forks":1,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","private":false,"created_at":"2010/04/05 20:56:06 -0700"},{"watchers":11,"has_wiki":true,"owner":"zacharyvoase","open_issues":2,"url":"https://github.com/zacharyvoase/urlobject","homepage":"","has_issues":true,"pushed_at":"2011/06/01 04:53:17 -0700","fork":false,"size":808,"has_downloads":true,"language":"Python","name":"urlobject","forks":1,"description":"Python library for manipulating URLs (and some URIs) in a more natural way.","private":false,"created_at":"2010/04/08 06:44:42 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/winwrangler","homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","has_issues":true,"pushed_at":"2010/05/05 00:55:01 -0700","fork":false,"size":276,"has_downloads":true,"name":"winwrangler","forks":1,"description":"Mirror of the upstream failpad source, converted for Matt","private":false,"created_at":"2010/05/05 00:54:23 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/reverend","homepage":"http://divmod.org/trac/wiki/DivmodReverend","has_issues":true,"pushed_at":"2010/05/06 11:10:51 -0700","fork":false,"size":420,"has_downloads":true,"name":"reverend","forks":1,"description":"Reverend - Simple Bayesian classifier","private":false,"created_at":"2010/05/06 10:58:58 -0700"},{"watchers":4,"has_wiki":false,"owner":"andrewgee","open_issues":0,"url":"https://github.com/andrewgee/gpxviewer","homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_issues":false,"pushed_at":"2011/06/06 06:29:23 -0700","fork":false,"size":1044,"has_downloads":true,"language":"Python","name":"gpxviewer","forks":4,"description":"GPXViewer GPS trace viewer","private":false,"created_at":"2010/05/16 02:56:55 -0700"},{"watchers":4,"has_wiki":true,"owner":"c9s","open_issues":0,"url":"https://github.com/c9s/fontselector.vim","has_issues":true,"pushed_at":"2010/10/02 05:46:45 -0700","fork":false,"size":248,"has_downloads":true,"language":"VimL","name":"fontselector.vim","forks":1,"description":"font select plugin for gvim.","private":false,"created_at":"2010/08/06 00:40:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/github-cli","homepage":"http://packages.python.org/github-cli","has_issues":false,"pushed_at":"2010/11/02 10:42:20 -0700","fork":true,"size":916,"has_downloads":true,"name":"github-cli","forks":0,"description":"A command-line interface to the GitHub Issues API v2.","private":false,"created_at":"2010/09/15 08:21:44 -0700"},{"watchers":151,"has_wiki":false,"owner":"sjl","open_issues":0,"url":"https://github.com/sjl/gundo.vim","homepage":"http://sjl.bitbucket.org/gundo.vim/","has_issues":false,"pushed_at":"2011/05/27 07:59:39 -0700","fork":false,"size":480,"has_downloads":true,"language":"VimL","name":"gundo.vim","forks":18,"description":"A git mirror of gundo.vim","private":false,"created_at":"2010/10/09 09:31:25 -0700"},{"watchers":38,"has_wiki":true,"owner":"ehamberg","open_issues":0,"url":"https://github.com/ehamberg/vim-cute-python","homepage":"","has_issues":true,"pushed_at":"2011/05/27 01:43:48 -0700","fork":false,"size":120,"has_downloads":true,"language":"VimL","name":"vim-cute-python","forks":9,"description":"Unicode goodness for Python code by using vim's “conceal” feature","private":false,"created_at":"2010/10/19 13:23:10 -0700"},{"watchers":24,"has_wiki":true,"owner":"caelum","open_issues":1,"url":"https://github.com/caelum/restfulie-py","homepage":"http://github.com/caelum/restfulie-py","organization":"caelum","has_issues":true,"pushed_at":"2011/05/29 17:47:58 -0700","fork":false,"size":134,"has_downloads":true,"language":"Python","name":"restfulie-py","forks":6,"description":"Python port of Restfulie","private":false,"created_at":"2010/10/25 04:23:23 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/python-github2","homepage":"","has_issues":false,"pushed_at":"2011/06/06 16:14:48 -0700","fork":true,"size":156,"has_downloads":true,"language":"Python","name":"python-github2","forks":0,"description":"github client in python, with issues support.","private":false,"created_at":"2010/10/31 01:03:09 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":6,"url":"https://github.com/JNRowe/gh_bugs","homepage":"","has_issues":true,"pushed_at":"2011/05/31 13:08:10 -0700","fork":false,"size":2564,"has_downloads":true,"language":"Python","name":"gh_bugs","forks":1,"description":"Simple client for GitHub issues","private":false,"created_at":"2010/10/31 09:27:05 -0700"},{"watchers":215,"has_wiki":true,"owner":"hsitz","open_issues":8,"url":"https://github.com/hsitz/VimOrganizer","homepage":"http://vimeo.com/17182850 ","has_issues":true,"pushed_at":"2011/04/27 20:03:17 -0700","fork":false,"size":540,"has_downloads":true,"language":"VimL","name":"VimOrganizer","forks":15,"description":"-- partial clone of Emacs' Org-mode -- please use development branch for newest changes ","private":false,"created_at":"2010/11/09 13:33:13 -0800"},{"watchers":26,"has_wiki":true,"owner":"j4mie","open_issues":0,"url":"https://github.com/j4mie/micromodels","homepage":"","has_issues":true,"pushed_at":"2011/02/24 00:46:32 -0800","integrate_branch":"develop","fork":false,"size":336,"has_downloads":true,"language":"Python","name":"micromodels","forks":6,"description":"Declarative dictionary-based model classes for Python","private":false,"created_at":"2010/12/08 16:21:15 -0800"},{"watchers":2,"has_wiki":true,"owner":"catch22","open_issues":0,"url":"https://github.com/catch22/pw","homepage":"","has_issues":true,"pushed_at":"2011/05/17 12:21:16 -0700","fork":false,"size":202,"has_downloads":true,"language":"Python","name":"pw","forks":2,"description":"Grep GPG-encrypted YAML password safes.","private":false,"created_at":"2010/12/18 05:32:17 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/snipmate-snippets","homepage":"","has_issues":false,"pushed_at":"2011/05/17 06:22:45 -0700","fork":true,"size":956,"has_downloads":true,"language":"VimL","name":"snipmate-snippets","forks":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","private":false,"created_at":"2011/01/27 03:05:32 -0800"},{"watchers":406,"has_wiki":false,"owner":"github","open_issues":0,"url":"https://github.com/github/dmca","homepage":"http://help.github.com/dmca","organization":"github","has_issues":false,"pushed_at":"2011/06/07 16:24:20 -0700","fork":false,"size":148,"has_downloads":true,"name":"dmca","forks":8,"description":"DMCA takedowns GitHub has received","private":false,"created_at":"2011/01/28 15:58:38 -0800"},{"watchers":3,"has_wiki":true,"owner":"passy","open_issues":0,"url":"https://github.com/passy/nose-lettuce","homepage":"","has_issues":true,"pushed_at":"2011/01/31 13:18:55 -0800","fork":false,"size":248,"has_downloads":true,"language":"Python","name":"nose-lettuce","forks":1,"description":"A probably bad idea of how to run lettuce from nose","private":false,"created_at":"2011/01/31 13:04:03 -0800"},{"watchers":6,"has_wiki":true,"owner":"caffeinehit","open_issues":0,"url":"https://github.com/caffeinehit/hammertime","homepage":"http://github.com/caffeinehit/hammertime","organization":"caffeinehit","has_issues":true,"pushed_at":"2011/02/03 02:40:25 -0800","fork":false,"size":140,"has_downloads":true,"language":"Python","name":"hammertime","forks":2,"description":"Time tracking with git","private":false,"created_at":"2011/02/02 02:18:33 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/hammertime","homepage":"http://github.com/caffeinehit/hammertime","has_issues":false,"pushed_at":"2011/02/02 09:54:18 -0800","fork":true,"size":720,"has_downloads":true,"language":"Python","name":"hammertime","forks":0,"description":"Time tracking with git","private":false,"created_at":"2011/02/02 09:49:21 -0800"},{"watchers":330,"has_wiki":false,"owner":"kennethreitz","open_issues":10,"url":"https://github.com/kennethreitz/requests","homepage":"http://python-requests.org","has_issues":true,"pushed_at":"2011/06/05 18:22:38 -0700","master_branch":"develop","fork":false,"size":164,"has_downloads":true,"language":"Python","name":"requests","forks":24,"description":"Python HTTP Requests for Humans.","private":false,"created_at":"2011/02/13 10:38:17 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/versionah","homepage":"http://jnrowe.github.com/versionah/","has_issues":true,"pushed_at":"2011/05/31 10:24:35 -0700","fork":false,"size":4404,"has_downloads":true,"language":"Python","name":"versionah","forks":1,"description":"Simple version number mangler","private":false,"created_at":"2011/02/15 08:51:56 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":8,"url":"https://github.com/JNRowe/issues-test","homepage":"","has_issues":true,"fork":false,"size":0,"has_downloads":true,"name":"issues-test","forks":1,"description":"Repo for testing gh-bugs","private":false,"created_at":"2011/02/22 13:00:23 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pelican","homepage":"http://docs.notmyidea.org/alexis/pelican/","has_issues":false,"pushed_at":"2011/04/04 21:22:46 -0700","fork":true,"size":3916,"has_downloads":true,"language":"Python","name":"pelican","forks":0,"description":"Static blog generator in python, using ReST syntax","private":false,"created_at":"2011/02/23 21:20:07 -0800"},{"watchers":19,"has_wiki":true,"owner":"dcramer","open_issues":2,"url":"https://github.com/dcramer/decruft","homepage":"http://code.google.com/p/decruft/","has_issues":true,"pushed_at":"2011/05/18 13:19:39 -0700","fork":false,"size":508,"has_downloads":true,"language":"Python","name":"decruft","forks":5,"description":"python-readability, but faster (mirror-ish)","private":false,"created_at":"2011/02/28 18:07:04 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pw","homepage":"","has_issues":false,"pushed_at":"2011/04/04 23:44:42 -0700","fork":true,"size":132,"has_downloads":true,"language":"Python","name":"pw","forks":0,"description":"Grep GPG-encrypted YAML password safes.","private":false,"created_at":"2011/04/04 23:37:38 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/shell-doctest","homepage":"http://code.google.com/p/shell-doctest/","has_issues":true,"pushed_at":"2011/04/05 05:32:44 -0700","fork":false,"size":128,"has_downloads":true,"language":"Python","name":"shell-doctest","forks":1,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","private":false,"created_at":"2011/04/05 05:32:07 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/blog","homepage":"http://jnrowe.github.com/blog","has_issues":true,"pushed_at":"2011/04/05 09:22:26 -0700","fork":false,"size":1152,"has_downloads":true,"name":"blog","forks":1,"description":"Old jnrowe.github.com content that *may* be resurrected.","private":false,"created_at":"2011/04/05 09:21:16 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/sphinx-jnrowe","homepage":"","has_issues":true,"pushed_at":"2011/05/13 12:27:22 -0700","fork":false,"size":644,"has_downloads":true,"name":"sphinx-jnrowe","forks":1,"description":"My sphinx theme","private":false,"created_at":"2011/04/06 07:35:40 -0700"},{"watchers":15,"has_wiki":true,"owner":"Nic0","open_issues":3,"url":"https://github.com/Nic0/tyrs","homepage":"http://tyrs.nicosphere.net","has_issues":true,"pushed_at":"2011/06/07 19:41:57 -0700","fork":false,"size":436,"has_downloads":true,"language":"Python","name":"tyrs","forks":5,"description":"Twitter and Identica client using curses","private":false,"created_at":"2011/04/28 17:44:58 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/rdial","homepage":"","has_issues":true,"pushed_at":"2011/05/27 00:50:48 -0700","fork":false,"size":272,"has_downloads":true,"language":"Python","name":"rdial","forks":1,"description":"Simple time tracking for simple people","private":false,"created_at":"2011/05/09 06:04:35 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/vim-cute-python","homepage":"","has_issues":false,"pushed_at":"2011/05/30 08:39:21 -0700","fork":true,"size":180,"has_downloads":true,"language":"VimL","name":"vim-cute-python","forks":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","private":false,"created_at":"2011/05/22 23:21:28 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/develop.github.com","homepage":"http://develop.github.com","has_issues":false,"pushed_at":"2011/05/23 03:36:51 -0700","master_branch":"gh-pages","fork":true,"size":1584,"has_downloads":false,"language":"JavaScript","name":"develop.github.com","forks":0,"description":"API Documentation for GitHub","private":false,"created_at":"2011/05/23 03:32:46 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/requests","homepage":"http://python-requests.org","has_issues":false,"pushed_at":"2011/05/27 00:17:44 -0700","master_branch":"develop","fork":true,"size":2648,"has_downloads":true,"language":"Python","name":"requests","forks":0,"description":"Python HTTP Requests for Humans.","private":false,"created_at":"2011/05/27 00:16:23 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/restfulie-py","homepage":"http://github.com/caelum/restfulie-py","has_issues":false,"pushed_at":"2011/05/28 22:05:55 -0700","fork":true,"size":1794,"has_downloads":true,"language":"Python","name":"restfulie-py","forks":0,"description":"Python port of Restfulie","private":false,"created_at":"2011/05/28 22:04:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/tyrs","homepage":"http://tyrs.nicosphere.net","has_issues":false,"pushed_at":"2011/06/03 06:45:50 -0700","fork":true,"size":132,"has_downloads":true,"language":"Python","name":"tyrs","forks":0,"description":"twitter curses client","private":false,"created_at":"2011/06/03 02:42:16 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/gpxviewer","homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_issues":false,"pushed_at":"2011/06/06 06:23:32 -0700","fork":true,"size":1040,"has_downloads":true,"language":"Python","name":"gpxviewer","forks":0,"description":"GPXViewer GPS trace viewer","private":false,"created_at":"2011/06/06 06:21:54 -0700"}]} \ No newline at end of file diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 79f70d9..b33fab6 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -4,6 +4,7 @@ from nose.tools import assert_equals +from github2.client import Github import utils @@ -44,3 +45,37 @@ def test_meta(self): assert_equals(repo.has_wiki, True) assert_equals(repo.has_issues, True) assert_equals(repo.language, 'Python') + + +class RepoQueries(utils.HttpMockTestCase): + """Test repository querying""" + def test_search(self): + repos = self.client.repos.search('surfraw') + assert_equals(len(repos), 8) + assert_equals(repos[0].owner, 'JNRowe') + + def test_list(self): + repos = self.client.repos.list('JNRowe') + assert_equals(len(repos), 44) + assert_equals(repos[0].name, 'bfm') + + def test_watching(self): + repos = self.client.repos.watching('JNRowe') + assert_equals(len(repos), 89) + assert_equals(repos[0].name, 'nerdtree') + + def test_contributors(self): + contributors = self.client.repos.list_contributors('ask/python-github2') + assert_equals(len(contributors), 27) + assert_equals(contributors[1].name, 'Ask Solem Hoel') + + +class AuthenticatedRepoQueries(utils.HttpMockTestCase): + def setUp(self): + super(AuthenticatedRepoQueries, self).setUp() + self.client = Github(access_token='xxx') + + def test_pushable(self): + repos = self.client.repos.pushable() + assert_equals(len(repos), 1) + assert_equals(repos[0].name, 'python-github2') From e8728111d42e3823bdadd2c2450f13a1ff98e1fe Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 07:58:28 +0100 Subject: [PATCH 276/454] Added test for listing pull requests. --- ...n-github2,open,80fdb1a6835888c7811257428c93eef4 | 14 ++++++++++++++ tests/test_pull_requests.py | 8 ++++++++ 2 files changed, 22 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 diff --git a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 new file mode 100644 index 0000000..e9dc3d0 --- /dev/null +++ b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/pulls/ask/python-github2/open +x-runtime: 44ms +content-length: 6535 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "e579ac09b626d198c687da824b39edc2" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:44:58 GMT +content-type: application/json; charset=utf-8 + +{"pulls":[{"html_url":"https://github.com/ask/python-github2/pull/39","issue_updated_at":"2011-05-29T15:37:08Z","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"issue_user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","diff_url":"https://github.com/ask/python-github2/pull/39.diff","updated_at":"2011-06-07T13:56:50Z","created_at":"2011-04-30T12:37:40Z","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":false,"patch_url":"https://github.com/ask/python-github2/pull/39.patch","issue_created_at":"2011-04-18T15:25:47Z","labels":[],"head":{"label":"JNRowe:timezone_support","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"ref":"timezone_support","repository":{"watchers":3,"has_downloads":true,"homepage":"","pushed_at":"2011/06/06 16:14:48 -0700","created_at":"2010/10/31 01:03:09 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"language":"Python","name":"python-github2","owner":"JNRowe","has_issues":false,"description":"github client in python, with issues support."},"sha":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1"},"state":"open"},{"html_url":"https://github.com/ask/python-github2/pull/24","issue_updated_at":"2011-01-05T00:26:07Z","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"issue_user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","diff_url":"https://github.com/ask/python-github2/pull/24.diff","updated_at":"2011-05-22T07:56:37Z","created_at":"2010-12-09T07:50:26Z","user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":null,"patch_url":"https://github.com/ask/python-github2/pull/24.patch","issue_created_at":"2010-12-09T07:50:26Z","labels":[],"head":{"label":"svetlyak40wt:master","user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"ref":"master","repository":{"watchers":1,"has_downloads":true,"homepage":"","pushed_at":"2011/01/04 16:32:23 -0800","created_at":"2010/12/08 10:39:12 -0800","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/svetlyak40wt/python-github2","forks":0,"size":176,"private":false,"name":"python-github2","owner":"svetlyak40wt","has_issues":false,"description":"github client in python, with issues support."},"sha":"f337f3c7b48e85dda72744f7696c693fe8d5fee0"},"state":"open"}]} \ No newline at end of file diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 55732a7..23f571c 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -10,3 +10,11 @@ def test_repr(self): pull_request = self.client.pull_requests.show('ask/python-github2', 39) assert_equals(repr(pull_request), '') + + +class PullRequestQueries(utils.HttpMockTestCase): + """Test pull request querying""" + def test_list(self): + pull_requests = self.client.pull_requests.list('ask/python-github2') + assert_equals(len(pull_requests), 2) + assert_equals(pull_requests[0].title, 'Datetime timezone handling.') From 886ccc9ce74a89962f9e4309eb60968e7d969f29 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:00:30 +0100 Subject: [PATCH 277/454] Added tests for issue querying. --- ...c-overlay,b81a30109b72cf3356114dcc6e2e29ca | 14 +++++++++++ ...b2,closed,3662da90eba27809e7bff7600392ec94 | 14 +++++++++++ ...hub2,open,fe32d5f6ebc81579886964c4c353403e | 14 +++++++++++ ...,timezone,e8e32dc210586a68a9d7e0a88b74214f | 14 +++++++++++ tests/test_issues.py | 23 +++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca create mode 100644 tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 create mode 100644 tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e create mode 100644 tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f diff --git a/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca b/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca new file mode 100644 index 0000000..84de95f --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/issues/labels/JNRowe/misc-overlay +x-runtime: 10ms +content-length: 35 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "a97c4b6aaa3d373f86315a8577170b10" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:42:11 GMT +content-type: application/json; charset=utf-8 + +{"labels":["feature","bug","task"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 new file mode 100644 index 0000000..eec6517 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/issues/list/ask/python-github2/closed +connection: keep-alive +content-length: 46568 +server: nginx/0.7.67 +x-runtime: 233ms +x-ratelimit-limit: 60 +etag: "99198abdc7b302c3eb2571030f4bee4c" +cache-control: private, max-age=0, must-revalidate +date: Tue, 31 May 2011 13:57:50 GMT +content-type: application/json; charset=utf-8 + +{"issues":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":52.0,"number":52,"votes":0,"created_at":"2011/05/28 02:03:37 -0700","comments":0,"body":"\nSee [this bug](https://github.com/ask/python-github2/issues/51#issuecomment-1253464)","title":"Document purpose, and use, of ``debug`` attributes.","updated_at":"2011/05/28 06:40:00 -0700","closed_at":"2011/05/28 06:40:00 -0700","html_url":"https://github.com/ask/python-github2/issues/52","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":51.0,"number":51,"votes":0,"created_at":"2011/05/28 01:09:46 -0700","comments":12,"body":"```pycon \r\n>>> github.repos.watch(\"schacon/grit\")\r\nTraceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/repositories.py\", line 69, in watch\r\n return self.make_request(\"watch\", project)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\r\n result = self.raw_request(url, extra_post_data, method=method)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\r\n response.status, content))\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"invalid repository to watch\"}'\r\n\r\n```\r\n\r\nI can't seem to watch that repository. I used the OAuth key to get the github object. ","title":"Watching repositories doesn't work","updated_at":"2011/05/28 20:30:12 -0700","closed_at":"2011/05/28 20:30:11 -0700","html_url":"https://github.com/ask/python-github2/issues/51","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":50.0,"number":50,"votes":0,"created_at":"2011/05/23 18:05:57 -0700","comments":2,"body":"","title":"Fixing the init of the proxy code.","updated_at":"2011/05/23 21:09:45 -0700","diff_url":"https://github.com/ask/python-github2/pull/50.diff","patch_url":"https://github.com/ask/python-github2/pull/50.patch","pull_request_url":"https://github.com/ask/python-github2/pull/50","closed_at":"2011/05/23 20:43:20 -0700","html_url":"https://github.com/ask/python-github2/issues/50","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":49.0,"number":49,"votes":0,"created_at":"2011/05/20 11:46:19 -0700","comments":8,"body":"I am was wondering if you could better document the Mocks being used for testing. I wouldn't mind writing up the test cases, if you could comment the testing code that is currently present. Increase the robustness of the project. \n\nThoughts? Even a link to the background knowledge needed to understand what you are doing. I am tried creating a couple of tests in my branch but unable to get anything but errors. \n\nMaybe a wiki describing setup and what needs to be done. ","title":"Testing Documentation/Wiki","updated_at":"2011/05/22 14:25:06 -0700","closed_at":"2011/05/22 14:25:06 -0700","html_url":"https://github.com/ask/python-github2/issues/49","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":48.0,"number":48,"votes":0,"created_at":"2011/05/19 08:40:47 -0700","comments":3,"body":"* Added basic proxy support documentation","title":"Add proxy documentation","updated_at":"2011/05/19 15:12:47 -0700","diff_url":"https://github.com/ask/python-github2/pull/48.diff","patch_url":"https://github.com/ask/python-github2/pull/48.patch","pull_request_url":"https://github.com/ask/python-github2/pull/48","closed_at":"2011/05/19 15:09:09 -0700","html_url":"https://github.com/ask/python-github2/issues/48","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":47.0,"number":47,"votes":0,"created_at":"2011/05/18 18:40:20 -0700","comments":1,"body":"Made the socks stuff optional. I wasnt able to test the extras_require portion of the setup.py (im not terribly well versed in setuptools) but i tested manually by uninstalling/reinstalling the socks lib and watching the error raised.","title":"Updated Add Proxy Support - now optional","updated_at":"2011/05/18 19:04:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/47.diff","patch_url":"https://github.com/ask/python-github2/pull/47.patch","pull_request_url":"https://github.com/ask/python-github2/pull/47","closed_at":"2011/05/18 19:04:29 -0700","html_url":"https://github.com/ask/python-github2/issues/47","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":46.0,"number":46,"votes":0,"created_at":"2011/05/18 09:37:00 -0700","comments":12,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/23 18:06:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/46.diff","patch_url":"https://github.com/ask/python-github2/pull/46.patch","pull_request_url":"https://github.com/ask/python-github2/pull/46","closed_at":"2011/05/19 07:59:05 -0700","html_url":"https://github.com/ask/python-github2/issues/46","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":45.0,"number":45,"votes":0,"created_at":"2011/05/18 08:47:38 -0700","comments":1,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/18 09:07:34 -0700","diff_url":"https://github.com/ask/python-github2/pull/45.diff","patch_url":"https://github.com/ask/python-github2/pull/45.patch","pull_request_url":"https://github.com/ask/python-github2/pull/45","closed_at":"2011/05/18 09:07:33 -0700","html_url":"https://github.com/ask/python-github2/issues/45","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":44.0,"number":44,"votes":0,"created_at":"2011/05/14 20:43:34 -0700","comments":13,"body":"When getting the commits for repositories that have '.' it can't seem to find the repository.\n\n``` pycon\n>>> commits += github.commits.list('kennethreitz/osxpython.org')\nTraceback (most recent call last):\n File \"\", line 1, in \n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/commits.py\", line 37, in list\n filter=\"commits\", datatype=Commit)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 75, in get_values\n values = self.make_request(*args, **kwargs)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\n response = self.request.get(self.domain, command, *args)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\n return self.make_request(\"/\".join(path_components))\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\n result = self.raw_request(url, extra_post_data, method=method)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\n response.status, content))\nRuntimeError: unexpected response from github.com 404: '{\"error\":\"Not Found\"}'\n```","title":"repositories with '.' are not found","updated_at":"2011/05/26 23:46:28 -0700","closed_at":"2011/05/26 18:03:57 -0700","html_url":"https://github.com/ask/python-github2/issues/44","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2028496e3344d92d8b3af64eb0d9e19e","position":43.0,"number":43,"votes":0,"created_at":"2011/05/09 20:51:03 -0700","comments":8,"body":"The docs are already using Sphinx. It'd be much more convenient if they were hosted.\r\n\r\nhttp://Readthedocs.org is free and sphinx powered, getting them up there should be easy.\r\n\r\nFun even.","title":"Read the Docs","updated_at":"2011/05/11 07:02:48 -0700","closed_at":"2011/05/11 06:44:44 -0700","html_url":"https://github.com/ask/python-github2/issues/43","user":"GraylinKim","labels":[],"state":"closed"},{"gravatar_id":"b7699be15e710c4be309f9d537fb252b","position":42.0,"number":42,"votes":0,"created_at":"2011/05/09 08:24:36 -0700","comments":12,"body":"This is my just running 2to3 over the library, and fixing one or two things with json. Don't know if you want or need it. I'm using it for some blogofile stuff, which just bumped to python 3 for all main development, and wanted to keep using your work with my site.","title":"Python3","updated_at":"2011/05/23 00:55:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/42.diff","patch_url":"https://github.com/ask/python-github2/pull/42.patch","pull_request_url":"https://github.com/ask/python-github2/pull/42","closed_at":"2011/05/19 15:19:30 -0700","html_url":"https://github.com/ask/python-github2/issues/42","user":"goosemo","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":41.0,"number":41,"votes":0,"created_at":"2011/04/24 09:35:15 -0700","comments":3,"body":"","title":"Easy way to call tests from cli","updated_at":"2011/04/27 09:45:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/41.diff","patch_url":"https://github.com/ask/python-github2/pull/41.patch","pull_request_url":"https://github.com/ask/python-github2/pull/41","closed_at":"2011/04/27 09:45:11 -0700","html_url":"https://github.com/ask/python-github2/issues/41","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","position":40.0,"number":40,"votes":0,"created_at":"2011/04/22 12:26:50 -0700","comments":3,"body":"https://github.com/broderboy/python-github2/commit/48d85d517b4e51652217b71b264c866caa5ca874\r\n\r\nI'm not sure why git put that as a full file change\r\nline changed: prune doc/.build\r\n\r\nThanks\r\n\r\nOriginal Error: \r\nrunning install\r\nrunning bdist_egg\r\nrunning egg_info\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nreading manifest file 'github2.egg-info\\SOURCES.txt'\r\nreading manifest template 'MANIFEST.in'\r\nTraceback (most recent call last):\r\n File \".\\setup.py\", line 46, in \r\n \"Topic :: Software Development :: Libraries\",\r\n File \"C:\\Python26\\lib\\distutils\\core.py\", line 152, in setup\r\n dist.run_commands()\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 975, in run_commands\r\n self.run_command(cmd)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 73, in run\r\n self.do_egg_install()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 93, in do_egg_install\r\n self.run_command('bdist_egg')\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\bdist_egg.py\", line 167, in run\r\n self.run_command(\"egg_info\")\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 179, in run\r\n self.find_sources()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 254, in find_sources\r\n mm.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 310, in run\r\n self.read_template()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\sdist.py\", line 204, in read_template\r\n _sdist.read_template(self)\r\n File \"C:\\Python26\\lib\\distutils\\command\\sdist.py\", line 336, in read_template\r\n self.filelist.process_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 129, in process_template_line\r\n (action, patterns, dir, dir_pattern) = self._parse_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 112, in _parse_template_line\r\n dir_pattern = convert_path(words[1])\r\n File \"C:\\Python26\\lib\\distutils\\util.py\", line 201, in convert_path\r\n raise ValueError, \"path '%s' cannot end with '/'\" % pathname\r\nValueError: path 'doc/.build/' cannot end with '/'","title":"Modified MANIFEST.in. It wasn't installing on Windows","updated_at":"2011/04/23 07:18:49 -0700","diff_url":"https://github.com/ask/python-github2/pull/40.diff","patch_url":"https://github.com/ask/python-github2/pull/40.patch","pull_request_url":"https://github.com/ask/python-github2/pull/40","closed_at":"2011/04/23 04:53:48 -0700","html_url":"https://github.com/ask/python-github2/issues/40","user":"broderboy","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":38.0,"number":38,"votes":0,"created_at":"2011/04/17 17:11:51 -0700","comments":9,"body":"e.g when I am using the call \r\n\r\nGithub(access_token=oauthtoken) -- it seems to work fine for all calls expect, the following call \r\n\r\nproject being repo.project\r\n\r\ncommits += self.client.commits.list(str(project))\r\n\r\n\r\nI get the follow exception\r\n\r\nunexpected response from github.com 401: '{\"error\":\"Couldn\\'t authenticate you\"}'\r\n\r\nI managed to work around this issue by creating the self.client using the following instantiation \r\n\r\nGithub(self.oauthtoken)\r\n\r\nIt probably not being pass down the OAuth token on the particular call. \r\n","title":"OAuth token isn't being passed down","updated_at":"2011/05/11 09:48:20 -0700","closed_at":"2011/05/11 09:48:20 -0700","html_url":"https://github.com/ask/python-github2/issues/38","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2c8089a78bf15883302e9ac5b4367895","position":37.0,"number":37,"votes":0,"created_at":"2011/04/14 17:19:33 -0700","comments":2,"body":"The current [Commits API](http://develop.github.com/p/commits.html) specifies a user_id in the pathspec:\n\n`commits/list/:user_id/:repository/:branch`\n`commits/list/:user_id/:repository/:branch/*path`\n\nThis parameter was not present in the `list` or `show` methods of the `Commits` class, consequently requesting commits was not possible (as far as I could tell)\n\n","title":"added user_id to commits path spec","updated_at":"2011/04/15 05:13:56 -0700","diff_url":"https://github.com/ask/python-github2/pull/37.diff","patch_url":"https://github.com/ask/python-github2/pull/37.patch","pull_request_url":"https://github.com/ask/python-github2/pull/37","closed_at":"2011/04/15 05:13:56 -0700","html_url":"https://github.com/ask/python-github2/issues/37","user":"loganlinn","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":36.0,"number":36,"votes":0,"created_at":"2011/04/12 03:47:52 -0700","comments":2,"body":"@ask and interested others,\r\n\r\nYou said to treat the repo like home, but I just wanted to run this past you in case you have objections.\r\n\r\nThe changes are quite invasive. It strips out the examples from `README.rst`(it is a bit cluttered IMO), reformats many docstrings for use with Sphinx's [autodoc](http://sphinx.pocoo.org/tutorial.html#autodoc), fiddles with the cool `Attribute` docstring generator, etc.\r\n\r\nOpinions? If part of it is okay, say which part and I'll remove/rework the rest. If you hate it all just say so, it won't hurt my feelings I promise ;)\r\n\r\nThanks,\r\n\r\nJames","title":"Using Sphinx doc for documentation","updated_at":"2011/04/13 13:06:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/36.diff","patch_url":"https://github.com/ask/python-github2/pull/36.patch","pull_request_url":"https://github.com/ask/python-github2/pull/36","closed_at":"2011/04/13 13:01:44 -0700","html_url":"https://github.com/ask/python-github2/issues/36","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","position":35.0,"number":35,"votes":0,"created_at":"2011/04/10 18:02:50 -0700","comments":1,"body":"I added a function to get all blobs as a dictionary between the path & sha for a given tree. ","title":"Get All Blobs","updated_at":"2011/04/11 02:38:53 -0700","diff_url":"https://github.com/ask/python-github2/pull/35.diff","patch_url":"https://github.com/ask/python-github2/pull/35.patch","pull_request_url":"https://github.com/ask/python-github2/pull/35","closed_at":"2011/04/11 02:38:53 -0700","html_url":"https://github.com/ask/python-github2/issues/35","user":"surajram","labels":[],"state":"closed"},{"gravatar_id":"3aa27c0add742f542848af3b8a9e980c","position":34.0,"number":34,"votes":0,"created_at":"2011/03/26 10:57:22 -0700","comments":4,"body":"e.g. github.repos.list() specifies following behaviour: \"If no user is given, repositoris for the currently logged in user are returned.\"\r\n\r\nHowever this works only if using username for authentication but with OAuth2 access token following error is thrown:\r\n\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"api route not recognized\"}'\r\n\r\nWorkaround for this is to request current username using following pattern:\r\n\r\nuser = github.users.show(\"\")\r\n\r\nand then use returned username as an parameter for list(). \r\n\r\nI guess we need to populate the internal username in a constructor via show API when username is not given or is there better solution?\r\n\r\n\r\n\r\n\r\n\r\n","title":"Getting \"currently logged in user data\" when using access_token","updated_at":"2011/05/10 06:57:46 -0700","diff_url":"https://github.com/ask/python-github2/pull/34.diff","patch_url":"https://github.com/ask/python-github2/pull/34.patch","pull_request_url":"https://github.com/ask/python-github2/pull/34","closed_at":"2011/05/10 06:57:46 -0700","html_url":"https://github.com/ask/python-github2/issues/34","user":"pmuilu","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":33.0,"number":33,"votes":0,"created_at":"2011/03/03 09:26:59 -0800","comments":7,"body":"A few months ago when playing with `python-github2` I switched to using `httplib2` for network requests. I hadn't really planned on opening a pull request, but I've been using it as my full time branch so I've changed my mind :).\r\n\r\nThe benefits of `httplib2` are the (imo) simplification of the request handling, built-in caching support with effortless `ETag` handling and free HTTP compression support should GitHub enable it at some point..\r\n\r\nI'm just curious how you guys feel about it. Maybe there are some changes to be made to make it pullable, maybe you just don't like the idea of another external dependency or .\r\n\r\nThanks,\r\n\r\nJames","title":"RFC: httplib2 usage","updated_at":"2011/04/11 02:41:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/33.diff","patch_url":"https://github.com/ask/python-github2/pull/33.patch","pull_request_url":"https://github.com/ask/python-github2/pull/33","closed_at":"2011/04/11 02:41:30 -0700","html_url":"https://github.com/ask/python-github2/issues/33","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","position":32.0,"number":32,"votes":0,"created_at":"2011/02/19 07:18:36 -0800","comments":1,"body":"Added two operations in the issues module: list labels and search issues by label.","title":"List labels and Search Issues by Label","updated_at":"2011/04/09 10:25:23 -0700","diff_url":"https://github.com/ask/python-github2/pull/32.diff","patch_url":"https://github.com/ask/python-github2/pull/32.patch","pull_request_url":"https://github.com/ask/python-github2/pull/32","closed_at":"2011/04/09 10:25:23 -0700","html_url":"https://github.com/ask/python-github2/issues/32","user":"bartdag","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":31.0,"number":31,"votes":0,"created_at":"2011/02/16 06:44:12 -0800","comments":1,"body":"Adding or removing labels has recently broken, this small change to force `POST` fixes it.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix issue label addition/removal.","updated_at":"2011/04/09 10:36:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/31.diff","patch_url":"https://github.com/ask/python-github2/pull/31.patch","pull_request_url":"https://github.com/ask/python-github2/pull/31","closed_at":"2011/04/09 10:36:11 -0700","html_url":"https://github.com/ask/python-github2/issues/31","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"377e59815b7b7d6dfc23c808f0d07f05","position":30.0,"number":30,"votes":1,"created_at":"2011/02/15 12:30:09 -0800","comments":1,"body":"From:\r\n\r\nhttp://develop.github.com/p/repo.html\r\n\r\nrepos.delete returns a dictionary with a delete_token key. This key then needs to be POST'd back to the same URL. The repos.delete method as it is does nothing with this key and does not accept a post_data dictionary as a keyword argument.","title":"repos.delete not functional","updated_at":"2011/04/13 13:01:43 -0700","closed_at":"2011/04/13 13:01:43 -0700","html_url":"https://github.com/ask/python-github2/issues/30","user":"sxalexander","labels":[],"state":"closed"},{"gravatar_id":"d7ed4dc5ad80ffecb3aed70fc7190e52","position":29.0,"number":29,"votes":0,"created_at":"2011/01/25 07:13:12 -0800","comments":1,"body":"Steps to reproduce:\n\nfrom github2.client import Github\nclient = Github(username='', api_token='', requests_per_second=1)\npull_req = client.request.get('pulls', 'username/repo_name', '')\n\nThis works fine for most pull requests. However, if a commit associated with the pull request has 'line notes', it seems to fail.\nAs an example, you can try this on one of my pull requests:\n\npull_req = client.request.get('pulls', 'larsbutler/roundabout', '1')","title":"\"Github Server Error\" when trying to get pull requests which include line notes","updated_at":"2011/01/25 08:16:09 -0800","closed_at":"2011/01/25 08:16:09 -0800","html_url":"https://github.com/ask/python-github2/issues/29","user":"larsbutler","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":28.0,"number":28,"votes":0,"created_at":"2010/12/30 10:28:59 -0800","comments":8,"body":"This implements the github API pull requests functionality. ","title":"Pull requests","updated_at":"2011/05/29 08:27:58 -0700","diff_url":"https://github.com/ask/python-github2/pull/28.diff","patch_url":"https://github.com/ask/python-github2/pull/28.patch","pull_request_url":"https://github.com/ask/python-github2/pull/28","closed_at":"2011/05/29 08:27:23 -0700","html_url":"https://github.com/ask/python-github2/issues/28","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"cf04727870245c17f455fb05b25f9f8e","position":27.0,"number":27,"votes":0,"created_at":"2010/12/21 12:37:06 -0800","comments":0,"body":"The URL wasn't escaped properly when labels included a space \"This is a label\" during the add_label request.","title":"Failed to add a label with a space to an issue ","updated_at":"2011/04/09 09:47:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/27.diff","patch_url":"https://github.com/ask/python-github2/pull/27.patch","pull_request_url":"https://github.com/ask/python-github2/pull/27","closed_at":"2011/04/09 09:47:50 -0700","html_url":"https://github.com/ask/python-github2/issues/27","user":"jweinberg","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":26.0,"number":26,"votes":0,"created_at":"2010/12/16 13:59:45 -0800","comments":1,"body":"","title":"Patch to add organizations and teams.","updated_at":"2010/12/30 10:30:53 -0800","diff_url":"https://github.com/ask/python-github2/pull/26.diff","patch_url":"https://github.com/ask/python-github2/pull/26.patch","pull_request_url":"https://github.com/ask/python-github2/pull/26","closed_at":"2010/12/30 10:30:53 -0800","html_url":"https://github.com/ask/python-github2/issues/26","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":25.0,"number":25,"votes":0,"created_at":"2010/12/10 23:18:57 -0800","comments":1,"body":"As [nvie](http://github.com/nvie) rightly pointed out in [my other pull request](https://github.com/ask/python-github2/pull/14#issuecomment-601878), I hadn't added any documentation for my changes... here that is.\r\n\r\nI've also fixed issue searches for multiple words. I only spotted the problem as a result of adding the entry to `README.rst`, so I should probably learn something from that ;)\r\n\r\nFinally, there is some slight reformatting of the documentation. *Most* of the text was wrapped at ~80 characters and code samples indented 4 spaces, the [final commit](https://github.com/JNRowe/python-github2/commit/ff9132f9054bcc3827c94fd927c30cf257d84954) just makes that consistent across the rest of the documentation. I realise that may be controversial, but wrapped or not wrapped it should at least be consistent.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix for issue searching and documentation updates.","updated_at":"2010/12/12 23:27:36 -0800","diff_url":"https://github.com/ask/python-github2/pull/25.diff","patch_url":"https://github.com/ask/python-github2/pull/25.patch","pull_request_url":"https://github.com/ask/python-github2/pull/25","closed_at":"2010/12/12 23:27:36 -0800","html_url":"https://github.com/ask/python-github2/issues/25","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":23.0,"number":23,"votes":0,"created_at":"2010/12/08 00:17:49 -0800","comments":4,"body":"See the docs at http://develop.github.com/p/orgs.html","title":"Add support for the new Organizations API","updated_at":"2011/05/10 06:53:12 -0700","closed_at":"2011/05/10 06:12:12 -0700","html_url":"https://github.com/ask/python-github2/issues/23","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":22.0,"number":22,"votes":0,"created_at":"2010/12/06 21:28:03 -0800","comments":0,"body":"Hi Ask,\r\n\r\nI added support for authenticating using Github's OAuth service. When you do this, you get an access_token, which you can now use instead of the username/api_token combination. You pass it in to the Github constructor like this:\r\n\r\n github = Github(access_token=\"...\")\r\n\r\nIt puts the access_token on the GET request, like described in the third bullet under [Web Application Flow](https://gist.github.com/419219).\r\n\r\nIts use is documented in the README file.\r\n\r\nCheers,\r\nVincent\r\n","title":"Added support for Github's OAuth-based URL requests","updated_at":"2010/12/08 00:16:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/22.diff","patch_url":"https://github.com/ask/python-github2/pull/22.patch","pull_request_url":"https://github.com/ask/python-github2/pull/22","closed_at":"2010/12/08 00:16:25 -0800","html_url":"https://github.com/ask/python-github2/issues/22","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":21.0,"number":21,"votes":0,"created_at":"2010/12/06 13:10:09 -0800","comments":1,"body":"Hi Ask,\r\n\r\nToday, I commited several patches. First of all, I added support for authenticating using `Github(access_token=\"...\")` GET requests instead of `Github(username=\"foo\", api_token=\"...\")` POST requests. This is the way Github API v2 URLs need to be called when using their (experimental) OAuth model.\r\n\r\nFurthermore, while I was testing this, the Github API seems to have changed the format of all dates to be nice UTC dates with timezone info. This makes the special conversion hoops and tricks unnecessary, so I removed them. For safety, I kept the \"flexible date conversion function lookup\" construct around, but maybe this could be removed as a whole. I'll leave this judgement up to you.\r\n\r\nHave a blast!\r\n\r\nCheers,\r\nVincent\r\n","title":"Add support for OAuth URLs, and a fix for date format","updated_at":"2010/12/06 21:28:42 -0800","diff_url":"https://github.com/ask/python-github2/pull/21.diff","patch_url":"https://github.com/ask/python-github2/pull/21.patch","pull_request_url":"https://github.com/ask/python-github2/pull/21","closed_at":"2010/12/06 21:28:42 -0800","html_url":"https://github.com/ask/python-github2/issues/21","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"9de3f3969367fffe2051c2b405b79810","position":20.0,"number":20,"votes":0,"created_at":"2010/11/25 16:07:26 -0800","comments":1,"body":"http://develop.github.com/p/repo.html:\r\n\r\n\"To get a list of repos you can push to that are not your own, GET\r\n\r\nrepos/pushable\"\r\n\r\nI was surprised not to find this, so I added it.","title":"Added github.repos.pushable() as described in the API documentation.","updated_at":"2010/11/26 13:37:12 -0800","diff_url":"https://github.com/ask/python-github2/pull/20.diff","patch_url":"https://github.com/ask/python-github2/pull/20.patch","pull_request_url":"https://github.com/ask/python-github2/pull/20","closed_at":"2010/11/26 13:37:12 -0800","html_url":"https://github.com/ask/python-github2/issues/20","user":"johl","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":19.0,"number":19,"votes":0,"created_at":"2010/11/19 21:23:56 -0800","comments":5,"body":"I realized I didn't include fractions of a second in my earlier api-limits change. This one does. \r\n\r\nThis pull includes my commits from repo-project as well.","title":"Api limits","updated_at":"2010/11/26 13:25:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/19.diff","patch_url":"https://github.com/ask/python-github2/pull/19.patch","pull_request_url":"https://github.com/ask/python-github2/pull/19","closed_at":"2010/11/26 13:25:25 -0800","html_url":"https://github.com/ask/python-github2/issues/19","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":18.0,"number":18,"votes":0,"created_at":"2010/11/19 21:00:10 -0800","comments":0,"body":"Hey Ask, I added a Repo.project property - in my client code, I'm fairly often having to pass the project string to methods, and writing owner+'/'+name is getting boring. :-)","title":"Repo project","updated_at":"2010/11/20 12:08:27 -0800","diff_url":"https://github.com/ask/python-github2/pull/18.diff","patch_url":"https://github.com/ask/python-github2/pull/18.patch","pull_request_url":"https://github.com/ask/python-github2/pull/18","closed_at":"2010/11/20 12:08:27 -0800","html_url":"https://github.com/ask/python-github2/issues/18","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"ad448ae5b261e252ddaeeccf5c69a4ba","position":17.0,"number":17,"votes":1,"created_at":"2010/11/12 04:14:24 -0800","comments":1,"body":"This is very useful and provided by the underlying api and I would like to use it for my cmd line tool - https://github.com/kashifrazzaqui/github-issues\r\n\r\nIf you will please add this.\r\nThanks.","title":"List does not allow filteration by label","updated_at":"2011/04/09 10:51:59 -0700","closed_at":"2011/04/09 10:51:59 -0700","html_url":"https://github.com/ask/python-github2/issues/17","user":"kashifrazzaqui","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":16.0,"number":16,"votes":0,"created_at":"2010/11/04 17:26:33 -0700","comments":0,"body":"Fixes https://github.com/ask/python-github2/issues#issue/15\r\n\r\nThis was caused by github switching to HTTPS. Is in production at http://djangopackages.com","title":"Changed over to HTTPS","updated_at":"2010/11/24 06:10:48 -0800","diff_url":"https://github.com/ask/python-github2/pull/16.diff","patch_url":"https://github.com/ask/python-github2/pull/16.patch","pull_request_url":"https://github.com/ask/python-github2/pull/16","closed_at":"2010/11/24 06:10:48 -0800","html_url":"https://github.com/ask/python-github2/issues/16","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":15.0,"number":15,"votes":0,"created_at":"2010/11/04 16:56:50 -0700","comments":1,"body":"The API seems to work when I do curl. But it breaks via python-github2. \r\n\r\n >>> gh.commits.list(\"mojombo/grit\", \"master\")\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/commits.py\", line 31, in list\r\n filter=\"commits\", datatype=Commit)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 60, in get_values\r\n values = self.make_request(*args, **kwargs)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 43, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 53, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 63, in make_request\r\n return self.raw_request(url, extra_post_data, method=method)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 91, in raw_request\r\n json = simplejson.loads(response_text)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/__init__.py\", line 384, in loads\r\n return _default_decoder.decode(s)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 402, in decode\r\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 420, in raw_decode\r\n raise JSONDecodeError(\"No JSON object could be decoded\", s, idx)\r\n JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)","title":"commits API is broken","updated_at":"2010/11/04 17:27:00 -0700","closed_at":"2010/11/04 17:27:00 -0700","html_url":"https://github.com/ask/python-github2/issues/15","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":14.0,"number":14,"votes":0,"created_at":"2010/11/02 13:17:42 -0700","comments":2,"body":"Hi, \r\n\r\nJust a couple of small commits to fix minor problems I've found, and add support for some missing issues features. If you prefer to receive changes in a different way, please just say and I'll rework these(and any future ones) to fit.\r\n\r\nI'll take this opportunity to say thanks for releasing this package, I've found it very useful when playing with the github API.\r\n\r\nThanks,\r\n\r\nJames.\r\n","title":"Small fixes and more support for issues","updated_at":"2010/12/09 22:41:52 -0800","diff_url":"https://github.com/ask/python-github2/pull/14.diff","patch_url":"https://github.com/ask/python-github2/pull/14.patch","pull_request_url":"https://github.com/ask/python-github2/pull/14","closed_at":"2010/12/10 06:32:31 -0800","html_url":"https://github.com/ask/python-github2/issues/14","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","position":13.0,"number":13,"votes":0,"created_at":"2010/10/20 09:38:43 -0700","comments":0,"body":"I added some more fields that are in the API but not on github2 Repositories:\r\n\r\n- created_at\r\n- pushed_at\r\n- has_wiki\r\n- has_issues\r\n- has_downloads","title":"More information on Repository","updated_at":"2010/10/29 03:23:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/13.diff","patch_url":"https://github.com/ask/python-github2/pull/13.patch","pull_request_url":"https://github.com/ask/python-github2/pull/13","closed_at":"2010/10/29 03:23:50 -0700","html_url":"https://github.com/ask/python-github2/issues/13","user":"ojii","labels":[],"state":"closed"},{"gravatar_id":"4053d6caab18829c4e8d393b6afa8ad8","position":12.0,"number":12,"votes":0,"created_at":"2010/10/15 15:45:16 -0700","comments":1,"body":".. this directory is also used by the `pastedeploy` package\r\nhttp://twitter.com/ActiveState/status/27484677815\r\nPut it in site-packages/github2/tests instead.\r\n\r\n ~/Library/Python/2.7/bin \r\n ~/Library/Python/2.7/bin/github_manage_collaborators \r\n ~/Library/Python/2.7/lib \r\n ~/Library/Python/2.7/lib/python \r\n ~/Library/Python/2.7/lib/python/site-packages \r\n ~/Library/Python/2.7/lib/python/site-packages/github2 \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/PKG-INFO \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/SOURCES.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/dependency_links.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/top_level.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/client.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/commits.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/core.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/issues.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/repositories.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/request.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/users.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/unit.py ","title":"Avoiding polluting site-packages/tests/ directory","updated_at":"2010/12/09 22:39:34 -0800","closed_at":"2010/12/09 22:39:34 -0800","html_url":"https://github.com/ask/python-github2/issues/12","user":"srid","labels":[],"state":"closed"},{"gravatar_id":"9bfcdf9a72021d081a4cebf69a49ada8","position":11.0,"number":11,"votes":0,"created_at":"2010/10/15 04:42:12 -0700","comments":1,"body":"Python's timedelta did not have a 'total_seconds' method before python 2.7. This patches calculates seconds as documented at http://docs.python.org/library/datetime.html#datetime.timedelta.total_seconds.\n\nThis makes github2 compatible with python2.6 at least.\n\nPatch here: http://gist.github.com/628061","title":"Incompatibility for python 2.6: timedelta total_seconds","updated_at":"2011/04/13 13:06:54 -0700","closed_at":"2011/04/13 13:06:54 -0700","html_url":"https://github.com/ask/python-github2/issues/11","user":"arthur-debert","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":10.0,"number":10,"votes":0,"created_at":"2010/09/20 21:32:49 -0700","comments":1,"body":"I added a param to the Github class which enforces rate limits by sleeping the thread if requests are occurring too fast.\r\n\r\nIt's backwards compatible because delays only happen if requests_per_second is passed in. Includes a test, some docstrings, and an updated README.\r\n","title":"Api limits","updated_at":"2010/09/20 22:55:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/10.diff","patch_url":"https://github.com/ask/python-github2/pull/10.patch","pull_request_url":"https://github.com/ask/python-github2/pull/10","closed_at":"2010/09/21 05:55:06 -0700","html_url":"https://github.com/ask/python-github2/issues/10","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"5b45540ae377ec54a071f313b7193a27","position":9.0,"number":9,"votes":0,"created_at":"2010/07/28 12:56:51 -0700","comments":2,"body":" Traceback (most recent call last):\r\n File \"migrate_to_github.py\", line 74, in \r\n gh = Github()\r\n TypeError: __init__() takes at least 3 arguments (1 given)\r\n","title":"Doesn't support unauthenticated session","updated_at":"2011/04/18 07:04:50 -0700","closed_at":"2011/04/18 07:04:50 -0700","html_url":"https://github.com/ask/python-github2/issues/9","user":"dabrahams","labels":[],"state":"closed"},{"gravatar_id":"71c4e8223f5bddfbcce0607d387d2125","position":8.0,"number":8,"votes":1,"created_at":"2010/06/20 06:13:37 -0700","comments":1,"body":"There is a cool new way to do Github authentication: http://github.com/blog/656-github-oauth2-support","title":"support for the new OAuth2 authentication","updated_at":"2011/04/26 06:31:50 -0700","closed_at":"2011/04/26 06:31:50 -0700","html_url":"https://github.com/ask/python-github2/issues/8","user":"tarpas","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":7.0,"number":7,"votes":0,"created_at":"2010/05/26 17:08:41 -0700","comments":3,"body":"Python 2.6 includes simplejson (renaming to just json), removing the need for the external dep. To work on 2.5 and 2.6, use try:import:\r\nhttp://github.com/adamv/python-github2/commit/5b2f09d89420aac0d071522b3fbed9b026af6def\r\n","title":"Use json instead of simplejson on Python 2.6","updated_at":"2011/04/09 10:46:22 -0700","closed_at":"2011/04/09 10:46:22 -0700","html_url":"https://github.com/ask/python-github2/issues/7","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":6.0,"number":6,"votes":0,"created_at":"2010/05/25 21:59:37 -0700","comments":2,"body":"An object's __repr__ in Python 2.x is required to be ASCII. Various objects in this API return unicode values, as unicode is returned from titles, etc. from the web calls, and those are used in __repr__.\r\n\r\nIn my particular case, I got an error printing Issues that happened to contain non-ASCII characters.\r\n\r\nI'll probably add a commit to this bug tomorrow/later.","title":"__repr__ should return ASCII on Python 2.x","updated_at":"2010/12/08 19:46:28 -0800","closed_at":"2010/12/08 19:46:28 -0800","html_url":"https://github.com/ask/python-github2/issues/6","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"2e47ce8a038f8eaf3fe80c069e380814","position":4.0,"number":4,"votes":0,"created_at":"2010/04/17 17:24:29 -0700","comments":1,"body":"This package isn't on PyPi near as I can tell.\r\n\r\n* http://pypi.python.org/pypi/github2 \r\n* http://pypi.python.org/pypi/python-github2\r\n\r\nResponse from easy_install:\r\nNo local packages or download links found for python-github2","title":"Not installable via easy_install","updated_at":"2010/04/19 02:26:01 -0700","closed_at":"2010/04/19 02:26:01 -0700","html_url":"https://github.com/ask/python-github2/issues/4","user":"joestump","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":3.0,"number":3,"votes":0,"created_at":"2009/11/12 21:16:20 -0800","comments":2,"body":"In your README, your import path says\r\n\r\n >>> from github.client import Github\r\n\r\nbut it should really be\r\n\r\n >>> from github2.client import Github","title":"README has improper imports","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/3","user":"justinlilly","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":2.0,"number":2,"votes":0,"created_at":"2009/11/12 21:15:17 -0800","comments":1,"body":"When searching repos for django, I get an error caused by the emdash in the description of http://github.com/brosner/django \r\n\r\n Traceback: \r\n >>> github.repos.search('django')\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/repositories.py\", line 21, in search\r\n return self.make_request(\"search\", query, filter=\"repositories\")\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/core.py\", line 42, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 46, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 55, in make_request\r\n return self.raw_request(url, extra_post_data)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 71, in raw_request\r\n response_text = response.read().encode(\"utf-8\")\r\n UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 7065: ordinal not in range(128)\r\n","title":"Unicode handling error","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/2","user":"justinlilly","labels":[],"state":"closed"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e new file mode 100644 index 0000000..61ad1b6 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/issues/list/ask/python-github2/open +x-runtime: 36ms +content-length: 4100 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "d4fc8ccc95a538f78b061f48e21b40e2" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:41:36 GMT +content-type: application/json; charset=utf-8 + +{"issues":[{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":1.0,"number":1,"votes":0,"created_at":"2009/04/18 13:04:09 -0700","comments":0,"body":"This to support getting raw blob/tree data as specified in http://develop.github.com/p/object.html.","title":"option to make_request so it doesn't parse the response as json.","updated_at":"2009/04/18 13:04:09 -0700","html_url":"https://github.com/ask/python-github2/issues/1","user":"ask","labels":[],"state":"open"},{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":5.0,"number":5,"votes":1,"created_at":"2010/05/18 06:10:36 -0700","comments":1,"body":"Goes without saying...","title":"This project needs tests!","updated_at":"2010/06/20 05:47:06 -0700","html_url":"https://github.com/ask/python-github2/issues/5","user":"ask","labels":[],"state":"open"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"created_at":"2010/12/08 23:50:26 -0800","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","updated_at":"2011/01/04 16:26:07 -0800","diff_url":"https://github.com/ask/python-github2/pull/24.diff","patch_url":"https://github.com/ask/python-github2/pull/24.patch","pull_request_url":"https://github.com/ask/python-github2/pull/24","html_url":"https://github.com/ask/python-github2/issues/24","user":"svetlyak40wt","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/05/29 08:37:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":53.0,"number":53,"votes":0,"created_at":"2011/05/28 22:15:49 -0700","comments":1,"body":"It would make more sense, and be easy to filter wanted data, if debug info was handled with the `logging` module. Side effect being the output will change significantly, but does it matter for debugging output anyway?","title":"Use logging for debug information.","updated_at":"2011/06/06 16:17:26 -0700","html_url":"https://github.com/ask/python-github2/issues/53","user":"JNRowe","labels":[],"state":"open"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f b/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f new file mode 100644 index 0000000..eb6514d --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/issues/search/ask/python-github2/open/timezone +x-runtime: 786ms +content-length: 2831 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "7ad27323679884e25d6250c231999fbf" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:41:21 GMT +content-type: application/json; charset=utf-8 + +{"issues":[{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":1.0,"number":1,"votes":0,"created_at":"2009/04/18 13:04:09 -0700","comments":0,"body":"This to support getting raw blob/tree data as specified in http://develop.github.com/p/object.html.","title":"option to make_request so it doesn't parse the response as json.","updated_at":"2009/04/18 13:04:09 -0700","html_url":"https://github.com/ask/python-github2/issues/1","user":"ask","labels":[],"state":"open"},{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":5.0,"number":5,"votes":1,"created_at":"2010/05/18 06:10:36 -0700","comments":1,"body":"Goes without saying...","title":"This project needs tests!","updated_at":"2010/06/20 05:47:06 -0700","html_url":"https://github.com/ask/python-github2/issues/5","user":"ask","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/05/29 08:37:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"open"}]} \ No newline at end of file diff --git a/tests/test_issues.py b/tests/test_issues.py index 879d817..5cec110 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -15,3 +15,26 @@ def test_comment_repr(self): comments = self.client.issues.comments('ask/python-github2', 24) assert_equals(repr(comments[1]), '') + + +class IssueQueries(utils.HttpMockTestCase): + """Test issue querying""" + def test_search(self): + issues = self.client.issues.search('ask/python-github2', 'timezone') + assert_equals(len(issues), 3) + assert_equals(issues[2].number, 39) + + def test_list(self): + issues = self.client.issues.list('ask/python-github2') + assert_equals(len(issues), 5) + assert_equals(issues[-1].number, 53) + + def test_list_with_state(self): + issues = self.client.issues.list('ask/python-github2', "closed") + assert_equals(len(issues), 48) + assert_equals(issues[0].number, 52) + + def test_issue_labels(self): + labels = self.client.issues.list_labels('JNRowe/misc-overlay') + assert_equals(len(labels), 3) + assert_equals(labels[0], 'feature') From 56a1e1429e1db8e6d364da1ac66a78112df4c5db Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:03:25 +0100 Subject: [PATCH 278/454] Added tests for organisation querying. --- ...public_members,01d1fb446743540669e4773bf8cf53c3 | 14 ++++++++++++++ ...c_repositories,f3e3e76ac876947b47b43a16fa0e44e5 | 14 ++++++++++++++ tests/test_organizations.py | 13 +++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 create mode 100644 tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 diff --git a/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 b/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 new file mode 100644 index 0000000..924af5f --- /dev/null +++ b/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 56 +content-location: https://github.com/api/v2/json/organizations/github/public_members +x-runtime: 2059ms +content-length: 12105 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "defe4971b2099cdb3aafc77717bc32f7" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:46:58 GMT +content-type: application/json; charset=utf-8 + +{"users":[{"gravatar_id":"7f67284c12b6d38fa1c8590911fd58a0","company":"GitHub","name":"Petros Amiridis","created_at":"2008/10/13 14:19:57 -0700","location":"Thessaloniki, Greece","public_repo_count":12,"public_gist_count":19,"blog":"amiridis.net","following_count":50,"id":28818,"type":"User","permission":null,"followers_count":32,"login":"amiridis","email":"petros@amiridis.net"},{"gravatar_id":"a86224d72ce21cd9f5bee6784d4b06c7","company":"GitHub","name":"Corey Donohoe","created_at":"2008/01/22 01:14:11 -0800","location":"Potrero, SF","public_repo_count":85,"public_gist_count":145,"blog":"http://www.atmos.org","following_count":161,"id":38,"type":"User","permission":null,"followers_count":313,"login":"atmos","email":"atmos@atmos.org"},{"gravatar_id":"4d1c9dad17af98e55cb65b4efce27c42","company":"GitHub","name":"Ben Burkert","created_at":"2008/01/28 15:44:14 -0800","location":"SF","public_repo_count":50,"public_gist_count":23,"blog":"http://benburkert.com","following_count":16,"id":77,"type":"User","permission":null,"followers_count":75,"login":"benburkert","email":"ben@benburkert.com"},{"gravatar_id":"4f237ee952d1af0c47028bfda53664a8","company":"Github, Inc. ","name":"Beth Newland","created_at":"2011/06/06 15:11:41 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":0,"id":833804,"type":"User","permission":null,"followers_count":0,"login":"bethnewland","email":"beth@github.com"},{"gravatar_id":"aeb22e809b34e9c8a5623ba6c4738a63","company":"GitHub, Inc.","name":"Ben Bleikamp","created_at":"2008/09/22 13:28:53 -0700","location":"San Francisco, CA","public_repo_count":5,"public_gist_count":14,"blog":"http://bleikamp.com","following_count":36,"id":25792,"type":"User","permission":null,"followers_count":38,"login":"bleikamp","email":"ben@github.com"},{"gravatar_id":"c9f60c0cb1d941fa8e93bbfcb907c27e","company":"GitHub","name":"Brian Lopez","created_at":"2008/05/26 15:54:55 -0700","location":"San Francisco, Ca","public_repo_count":43,"public_gist_count":118,"blog":"http://github.com","following_count":141,"id":11571,"type":"User","permission":null,"followers_count":172,"login":"brianmario","email":"seniorlopez@gmail.com"},{"gravatar_id":"edad3aaefdd499ab37b910aded54e1b3","company":"GitHub, Inc. / Revyver, Inc.","name":"Bryan Veloso","created_at":"2008/02/27 14:57:03 -0800","location":"Los Angeles, CA","public_repo_count":19,"public_gist_count":30,"blog":"http://avalonstar.com","following_count":109,"id":1258,"type":"User","permission":null,"followers_count":192,"login":"bryanveloso","email":"bryan@github.com"},{"gravatar_id":"a79ff2bb7da84e275361857d2feb2b1b","company":"GitHub","name":"Cameron McEfee","created_at":"2009/04/11 23:16:59 -0700","location":"San Francisco","public_repo_count":3,"public_gist_count":0,"blog":"http://www.cameronmcefee.com","following_count":3,"id":72919,"type":"User","permission":null,"followers_count":39,"login":"cameronmcefee","email":"cameron@github.com"},{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":93,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":211,"id":2,"type":"User","permission":null,"followers_count":2760,"login":"defunkt","email":"chris@wanstrath.com"},{"gravatar_id":"fd923a707b3e788b3d6b0e8f84cfbbe3","company":"GitHub","name":"Alex Malinovich","created_at":"2008/04/15 00:17:51 -0700","location":"San Francisco, CA","public_repo_count":15,"public_gist_count":12,"blog":"http://www.the-love-shack.net","following_count":8,"id":7385,"type":"User","permission":null,"followers_count":22,"login":"demonbane","email":"alex@github.com"},{"gravatar_id":"eb6845de9b94082d7d90a0603d91ff42","company":"GitHub","name":"Heather A. Baldry","created_at":"2011/05/03 14:39:07 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":10,"id":766591,"type":"User","permission":null,"followers_count":5,"login":"Foggybtmgirl","email":"heather@github.com"},{"gravatar_id":"6f63cde8b16b035280ca615f621a6c8c","company":"GitHub","name":"Zach Holman","created_at":"2008/03/10 09:32:37 -0700","location":"San Francisco, CA","public_repo_count":33,"public_gist_count":12,"blog":"http://zachholman.com/about","following_count":65,"id":2723,"type":"User","permission":null,"followers_count":278,"login":"holman","email":"hello@zachholman.com"},{"gravatar_id":"bbe5dc8dcf248706525ab76f46185520","company":"GitHub","name":"Joshua Peek","created_at":"2008/02/03 14:05:54 -0800","location":"Chicago, IL","public_repo_count":71,"public_gist_count":50,"blog":"http://joshpeek.com/","following_count":33,"id":137,"type":"User","permission":null,"followers_count":561,"login":"josh","email":"josh@joshpeek.com"},{"gravatar_id":"62e8c8bfaa8d755cab82accb48d335c8","company":"GitHub","name":"Josh Abernathy","created_at":"2008/06/14 17:25:05 -0700","location":"Seattle, WA","public_repo_count":13,"public_gist_count":4,"blog":"http://twitter.com/joshaber","following_count":23,"id":13760,"type":"User","permission":null,"followers_count":166,"login":"joshaber","email":"josh@github.com"},{"gravatar_id":"e650a773fc40f042e46d1e36b326e4e1","company":"GitHub Inc.","name":"Jason Costello","created_at":"2010/09/26 12:46:13 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":"jason-costello.com","following_count":6,"id":416727,"type":"User","permission":null,"followers_count":18,"login":"jsncostello","email":"jason@github.com"},{"gravatar_id":"28bda3f5dfcc92365efe4eecc0b38eb8","company":"GitHub","name":"Kami","created_at":"2010/10/17 13:21:26 -0700","location":"San Francisco, CA","public_repo_count":4,"public_gist_count":0,"blog":null,"following_count":47,"id":443094,"type":"User","permission":null,"followers_count":30,"login":"kamzilla","email":"kami@github.com"},{"gravatar_id":"4e3f068bcac207404306e790c0d662ed","company":"GitHub Inc.","name":"Kevin Sawicki","created_at":"2011/03/15 09:46:18 -0700","location":"Redwood City, CA","public_repo_count":8,"public_gist_count":4,"blog":null,"following_count":10,"id":671378,"type":"User","permission":null,"followers_count":48,"login":"kevinsawicki","email":"kevin@github.com"},{"gravatar_id":"5f2da528927a2ec9ba4fec2069cbc958","company":"GitHub, Inc.","name":"Kyle Neath","created_at":"2008/02/27 16:48:15 -0800","location":"San Francisco, CA","public_repo_count":21,"public_gist_count":32,"blog":"http://warpspire.com","following_count":40,"id":1354,"type":"User","permission":null,"followers_count":304,"login":"kneath","email":"kyle@github.com"},{"gravatar_id":"17fc534665d54bcd8b4d2676d709aa99","company":"GitHub","name":"Melissa Severini","created_at":"2009/03/19 16:48:58 -0700","location":"San Francisco, CA","public_repo_count":2,"public_gist_count":0,"blog":"http://luckiestmonkey.tumblr.com/","following_count":12,"id":65087,"type":"User","permission":null,"followers_count":58,"login":"luckiestmonkey","email":"luckiest.monkey@gmail.com"},{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":50,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":1960,"login":"mojombo","email":"tom@github.com"},{"gravatar_id":"b6861bc75bff3c594212338a914a39ad","company":"Highgroove Studios","name":"Matt Todd","created_at":"2008/02/10 22:28:43 -0800","location":"Atlanta, GA","public_repo_count":89,"public_gist_count":93,"blog":"http://maraby.org/","following_count":175,"id":182,"type":"User","permission":null,"followers_count":102,"login":"mtodd","email":"mtodd@highgroove.com"},{"gravatar_id":"63027897db609fdbe6ac820fa12736b9","company":null,"name":"Jeff King","created_at":"2009/01/12 01:29:10 -0800","location":null,"public_repo_count":7,"public_gist_count":2,"blog":null,"following_count":0,"id":45925,"type":"User","permission":null,"followers_count":31,"login":"peff","email":"peff@peff.net"},{"gravatar_id":"947c333c75de1dc54a711a400d575c8c","company":"GitHub, Inc.","name":"PJ Hyett","created_at":"2008/01/07 09:54:22 -0800","location":"San Francisco, CA","public_repo_count":16,"public_gist_count":23,"blog":"http://twitter.com/pjhyett","following_count":23,"id":3,"type":"User","permission":null,"followers_count":824,"login":"pjhyett","email":"pj@github.com"},{"gravatar_id":"ac65e62b7ad42e9bc5fdf391d0e250a7","company":"mystery","name":"Corey Johnson","created_at":"2008/02/21 14:07:26 -0800","location":"San Francisco","public_repo_count":18,"public_gist_count":57,"blog":"","following_count":1,"id":596,"type":"User","permission":null,"followers_count":134,"login":"probablycorey","email":"cj@github.com"},{"gravatar_id":"920e60e81da4fb61eaeb95fa9d7c3b70","company":"GitHub","name":"Tim Sharpe","created_at":"2009/05/03 20:28:14 -0700","location":"Sydney :: Australia","public_repo_count":29,"public_gist_count":8,"blog":"","following_count":0,"id":80629,"type":"User","permission":null,"followers_count":43,"login":"rodjek","email":"tim@github.com"},{"gravatar_id":"abfc88b96ae18c85ba7aac3bded2ec5e","company":"GitHub","name":"Ryan Tomayko","created_at":"2008/02/18 19:30:53 -0800","location":"San Francisco","public_repo_count":34,"public_gist_count":81,"blog":"http://tomayko.com/about","following_count":79,"id":404,"type":"User","permission":null,"followers_count":870,"login":"rtomayko","email":"r@tomayko.com"},{"gravatar_id":"9375a9529679f1b42b567a640d775e7d","company":"GitHub","name":"Scott Chacon","created_at":"2008/01/27 09:19:28 -0800","location":"San Francisco, CA","public_repo_count":124,"public_gist_count":69,"blog":"http://scottchacon.com","following_count":17,"id":70,"type":"User","permission":null,"followers_count":1479,"login":"schacon","email":"schacon@gmail.com"},{"gravatar_id":"8cf17bf55c4d16cf52480619bb0b6c92","company":"GitHub","name":"Simon Rozet","created_at":"2008/01/29 12:37:53 -0800","location":"Brussels, Belgium","public_repo_count":91,"public_gist_count":52,"blog":"http://atonie.org","following_count":166,"id":90,"type":"User","permission":null,"followers_count":270,"login":"sr","email":"simon@rozet.name"},{"gravatar_id":"6804f1775cb4babfcc3851298566fbce","company":"GitHub","name":"Vicent Martí","created_at":"2008/12/26 12:21:00 -0800","location":"Mainly Europe","public_repo_count":12,"public_gist_count":2,"blog":null,"following_count":20,"id":42793,"type":"User","permission":null,"followers_count":72,"login":"tanoku","email":"vicent@github.com"},{"gravatar_id":"2f4861b27dc35663ed271d39f5358261","company":"GitHub","name":"Tim Clem","created_at":"2009/10/07 13:26:53 -0700","location":"San Francisco, CA","public_repo_count":10,"public_gist_count":3,"blog":"http://timclem.wordpress.com","following_count":1,"id":136521,"type":"User","permission":null,"followers_count":31,"login":"tclem","email":"timothy.clem@gmail.com"},{"gravatar_id":"821395fe70906c8290df7f18ac4ac6cf","company":"GitHub","name":"rick","created_at":"2008/01/13 20:33:35 -0800","location":"sf","public_repo_count":120,"public_gist_count":83,"blog":"http://techno-weenie.net","following_count":14,"id":21,"type":"User","permission":null,"followers_count":1478,"login":"technoweenie","email":"technoweenie@gmail.com"},{"gravatar_id":"495abe87ebbc36e70c8db98680ec8a46","company":null,"name":"Tekkub","created_at":"2008/02/23 13:14:45 -0800","location":"Denver, CO","public_repo_count":132,"public_gist_count":204,"blog":"tekkub.net","following_count":0,"id":706,"type":"User","permission":null,"followers_count":327,"login":"tekkub","email":null},{"gravatar_id":"d47656e20ff5e42f125fc5ea0fd636c6","company":"GitHub, Inc.","name":"Aman Gupta","created_at":"2008/03/07 18:10:31 -0800","location":"San Francisco, CA","public_repo_count":67,"public_gist_count":92,"blog":"http://twitter.com/tmm1","following_count":129,"id":2567,"type":"User","permission":null,"followers_count":537,"login":"tmm1","email":"aman@tmm1.net"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 b/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 new file mode 100644 index 0000000..995ca97 --- /dev/null +++ b/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/organizations/github/public_repositories +x-runtime: 62ms +content-length: 11291 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "1f0d429e423a830166d933f216bfd508" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:46:47 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"watchers":61,"has_downloads":true,"organization":"github","homepage":"https://github.com/","pushed_at":"2011/05/31 16:40:29 -0700","created_at":"2008/03/09 15:43:49 -0700","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/media","forks":6,"size":128,"private":false,"name":"media","owner":"github","has_issues":false,"description":"Media files for use in your GitHub integration projects"},{"watchers":101,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2011/04/19 17:45:38 -0700","created_at":"2008/05/10 21:45:03 -0700","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/albino","forks":12,"size":1296,"private":false,"language":"Ruby","name":"albino","owner":"github","has_issues":true,"description":"Ruby wrapper for the Pygments syntax highlighter."},{"watchers":42,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:00 -0700","created_at":"2008/05/10 21:45:18 -0700","fork":false,"has_wiki":false,"open_issues":1,"url":"https://github.com/github/hubahuba","forks":9,"size":0,"private":false,"language":"Ruby","name":"hubahuba","owner":"github","has_issues":true,"description":"Ruby and Rails core extensions used by GitHub."},{"watchers":50,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:22 -0700","created_at":"2008/05/10 21:45:31 -0700","fork":false,"has_wiki":false,"open_issues":1,"url":"https://github.com/github/jquery-hotkeys","forks":7,"size":0,"private":false,"name":"jquery-hotkeys","owner":"github","has_issues":true,"description":"jQuery hotkeys plugin."},{"watchers":72,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:38 -0700","created_at":"2008/05/10 21:45:52 -0700","fork":false,"has_wiki":false,"open_issues":2,"url":"https://github.com/github/jquery-relatize_date","forks":9,"size":0,"private":false,"name":"jquery-relatize_date","owner":"github","has_issues":true,"description":"jQuery version of technoweenie's relative date js library."},{"watchers":11,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/12/30 13:04:00 -0800","created_at":"2008/05/10 21:46:10 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/request_timer","forks":0,"size":140,"private":false,"language":"Ruby","name":"request_timer","owner":"github","has_issues":true,"description":"Simple Rails request timer with even simpler js bookmarklet."},{"watchers":27,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:53:11 -0700","created_at":"2008/05/10 21:46:27 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/will_paginate_with_hotkeys","forks":1,"size":0,"private":false,"language":"Ruby","name":"will_paginate_with_hotkeys","owner":"github","has_issues":true,"description":"Evil twin plugin version of will_paginate to work with jQuery hotkeys plugin."},{"watchers":25,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/11/03 20:54:57 -0800","created_at":"2008/10/24 15:29:32 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/gem-builder","forks":3,"size":76,"private":false,"language":"Ruby","name":"gem-builder","owner":"github","has_issues":true,"description":"The scripts used to build RubyGems on GitHub"},{"watchers":4,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2009/04/08 17:36:30 -0700","created_at":"2009/02/10 19:56:17 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/safegem","forks":0,"size":1024,"private":false,"language":"Ruby","name":"safegem","owner":"github","has_issues":true,"description":"GitHub's safe gem eval web service"},{"watchers":135,"has_downloads":false,"organization":"github","homepage":"http://develop.github.com","pushed_at":"2011/06/01 20:54:15 -0700","created_at":"2009/02/17 15:51:23 -0800","master_branch":"gh-pages","fork":false,"has_wiki":false,"open_issues":34,"url":"https://github.com/github/develop.github.com","forks":45,"size":112,"private":false,"language":"JavaScript","name":"develop.github.com","owner":"github","has_issues":true,"description":"API Documentation for GitHub"},{"watchers":69,"has_downloads":true,"organization":"github","homepage":"http://github.github.com/github-flavored-markdown/","pushed_at":"2011/04/28 04:10:37 -0700","created_at":"2009/04/10 16:01:43 -0700","master_branch":"gh-pages","fork":false,"has_wiki":true,"open_issues":20,"url":"https://github.com/github/github-flavored-markdown","forks":14,"size":232,"private":false,"language":"JavaScript","name":"github-flavored-markdown","owner":"github","has_issues":true,"description":""},{"watchers":314,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2011/04/03 11:21:14 -0700","created_at":"2009/10/30 18:02:46 -0700","fork":false,"has_wiki":false,"open_issues":41,"url":"https://github.com/github/markup","forks":66,"size":384,"private":false,"language":"Python","name":"markup","owner":"github","has_issues":true,"description":"The code we use to render README.your_favorite_markup"},{"watchers":1209,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/06/07 23:44:52 -0700","created_at":"2010/03/29 11:30:53 -0700","fork":false,"has_wiki":true,"open_issues":87,"url":"https://github.com/github/gollum","forks":136,"size":4812,"private":false,"language":"JavaScript","name":"gollum","owner":"github","has_issues":true,"description":"A simple, Git-powered wiki with a sweet API and local frontend."},{"watchers":23,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/08/01 01:04:46 -0700","created_at":"2010/04/02 21:50:46 -0700","fork":false,"has_wiki":true,"open_issues":2,"url":"https://github.com/github/upload","forks":4,"size":276,"private":false,"language":"Ruby","name":"upload","owner":"github","has_issues":true,"description":"Script to upload files to non-repo storage from the command line"},{"watchers":312,"has_downloads":false,"organization":"github","homepage":"http://github.com/blog/53-github-services-ipo","pushed_at":"2011/06/06 16:57:52 -0700","created_at":"2010/05/14 13:07:36 -0700","fork":false,"has_wiki":false,"open_issues":27,"url":"https://github.com/github/github-services","forks":334,"size":128,"private":false,"language":"Ruby","name":"github-services","owner":"github","has_issues":true,"description":"Official GitHub Services Integration - You can set these up in your repo admin screen under Service Hooks"},{"watchers":154,"has_downloads":false,"organization":"github","homepage":"http://help.github.com","pushed_at":"2011/06/07 09:55:45 -0700","created_at":"2010/05/17 00:25:56 -0700","master_branch":"gh-pages","fork":false,"has_wiki":false,"open_issues":8,"url":"https://github.com/github/help.github.com","forks":107,"size":424,"private":false,"language":"JavaScript","name":"help.github.com","owner":"github","has_issues":false,"description":"GitHub help guides"},{"watchers":1,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/08/24 12:41:38 -0700","created_at":"2010/08/24 12:16:26 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/project","forks":1,"size":296,"private":false,"language":"Ruby","name":"project","owner":"github","has_issues":false,"description":"test project for tutorial"},{"watchers":8,"has_downloads":true,"organization":"github","homepage":"http://git-scm.com","pushed_at":"2010/12/13 15:34:29 -0800","created_at":"2010/10/14 15:25:49 -0700","master_branch":"dup-post-receive-refs","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/git","forks":0,"size":292,"private":false,"language":"C","name":"git","owner":"github","has_issues":false,"description":"Git Source Code Mirror"},{"watchers":6,"has_downloads":true,"organization":"github","homepage":"http://rubyonrails.org","pushed_at":"2011/02/16 02:11:39 -0800","created_at":"2010/10/15 17:01:48 -0700","master_branch":"github","fork":true,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/rails","forks":1,"size":460,"private":false,"language":"Ruby","name":"rails","owner":"github","has_issues":false,"integrate_branch":"master","description":"Ruby on Rails + GitHub patches"},{"watchers":2132,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/04/29 02:06:53 -0700","created_at":"2010/11/08 12:17:14 -0800","fork":false,"has_wiki":false,"open_issues":22,"url":"https://github.com/github/gitignore","forks":268,"size":520,"private":false,"name":"gitignore","owner":"github","has_issues":false,"description":"A collection of useful .gitignore templates"},{"watchers":2,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/11/17 18:25:38 -0800","created_at":"2010/11/17 18:06:38 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/testrepo","forks":3,"size":168,"private":false,"language":"C","name":"testrepo","owner":"github","has_issues":false,"description":"my test repo (used for nodeload tests)"},{"watchers":406,"has_downloads":true,"organization":"github","homepage":"http://help.github.com/dmca","pushed_at":"2011/06/07 16:24:20 -0700","created_at":"2011/01/28 15:58:38 -0800","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/dmca","forks":8,"size":148,"private":false,"name":"dmca","owner":"github","has_issues":false,"description":"DMCA takedowns GitHub has received"},{"watchers":3,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/02/19 17:38:14 -0800","created_at":"2011/02/19 17:37:40 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/pong","forks":1,"size":108,"private":false,"name":"pong","owner":"github","has_issues":true,"description":"Auxiliary repository for external ping checks"},{"watchers":484,"has_downloads":true,"organization":"github","homepage":"https://github.com/blog/799-win-a-ticket-to-pycon-us-2011","pushed_at":"2011/02/24 13:04:06 -0800","created_at":"2011/02/21 12:28:39 -0800","fork":false,"has_wiki":false,"open_issues":3,"url":"https://github.com/github/pycon2011","forks":271,"size":172,"private":false,"language":"Python","name":"pycon2011","owner":"github","has_issues":false,"description":"Fork me to win a ticket to PyCon 2011!"},{"watchers":39,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/03/17 00:28:10 -0700","created_at":"2011/02/22 18:13:11 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/email_reply_parser","forks":3,"size":844,"private":false,"language":"Ruby","name":"email_reply_parser","owner":"github","has_issues":true,"description":""},{"watchers":14,"has_downloads":true,"organization":"github","homepage":"http://developer.github.com","pushed_at":"2011/06/07 12:03:35 -0700","created_at":"2011/04/26 12:20:56 -0700","fork":false,"has_wiki":true,"open_issues":2,"url":"https://github.com/github/developer.github.com","forks":4,"size":220,"private":false,"language":"Ruby","name":"developer.github.com","owner":"github","has_issues":true,"description":"GitHub API documentation"}]} \ No newline at end of file diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 791672d..dcf6895 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -10,3 +10,16 @@ def test_repr(self): organization = self.client.organizations.show('github') assert_equals(repr(organization), '') + + +class OrganizationQueries(utils.HttpMockTestCase): + """Test organisation querying""" + def test_public_repositories(self): + repos = self.client.organizations.public_repositories('github') + assert_equals(len(repos), 26) + assert_equals(repos[2].name, 'hubahuba') + + def test_public_members(self): + members = self.client.organizations.public_members('github') + assert_equals(len(members), 33) + assert_equals(members[2].name, 'Ben Burkert') From e472c71216e9469ff7748a35795b22e469176ca6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:03:53 +0100 Subject: [PATCH 279/454] Added test for organisation authenication check. --- ..._org_with_auth,e38e621e1c8fc013c37f192c93402114 | 14 ++++++++++++++ tests/test_organizations.py | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,organizations,fake_org_with_auth,e38e621e1c8fc013c37f192c93402114 diff --git a/tests/data/github.com,api,v2,json,organizations,fake_org_with_auth,e38e621e1c8fc013c37f192c93402114 b/tests/data/github.com,api,v2,json,organizations,fake_org_with_auth,e38e621e1c8fc013c37f192c93402114 new file mode 100644 index 0000000..8b59b16 --- /dev/null +++ b/tests/data/github.com,api,v2,json,organizations,fake_org_with_auth,e38e621e1c8fc013c37f192c93402114 @@ -0,0 +1,14 @@ +status: 304 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/organizations/github +connection: keep-alive +content-length: 387 +server: nginx/0.7.67 +x-runtime: 21ms +x-ratelimit-limit: 60 +etag: "f02044d4890b2b09977b7b9e75053b1e" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:46:30 GMT +content-type: application/json; charset=utf-8 + +{"organization":{"plan":{"name":"free"}, "gravatar_id":"61024896f291303615bcd4f7a0dcfb74","company":null,"name":"GitHub","created_at":"2008-05-10T21:37:31-07:00","location":"San Francisco, CA","public_repo_count":26,"public_gist_count":0,"blog":"https://github.com/about","following_count":0,"id":9919,"type":"Organization","permission":null,"followers_count":571,"login":"github","email":"support@github.com"}} \ No newline at end of file diff --git a/tests/test_organizations.py b/tests/test_organizations.py index dcf6895..120c9c0 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -1,10 +1,18 @@ import _setup -from nose.tools import assert_equals +from nose.tools import (assert_equals, assert_true) import utils +class OrganizationProperties(utils.HttpMockTestCase): + def test_is_authenticated(self): + organization = self.client.organizations.show('github') + assert_true(organization.is_authenticated() is False) + organization = self.client.organizations.show('fake_org_with_auth') + assert_true(organization.is_authenticated() is True) + + class Organization(utils.HttpMockTestCase): def test_repr(self): organization = self.client.organizations.show('github') From 876bee3488f54af9c7ece91d623458a1851aecff Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:06:01 +0100 Subject: [PATCH 280/454] Added test for iterator support in BaseData. --- tests/test_unit.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 0bedcab..e3d6b4d 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -44,6 +44,14 @@ def test_delays(self): "between calls.") +class BaseDataIter(utils.HttpMockTestCase): + """Test iter availability of objects""" + def test_iter(self): + commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' + commit = self.client.commits.show('ask/python-github2', commit_id) + assert_true('__iter__' in dir(commit)) + + def test_project_for_user_repo(): client = Github() assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), From 1a94271a95dc158bbfa7842af61b0b25f0b79b35 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:41:12 +0100 Subject: [PATCH 281/454] Show short SHA for commit repr() output. --- github2/commits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/commits.py b/github2/commits.py index 97ecbad..5aa0284 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -20,7 +20,7 @@ class Commit(BaseData): "been modified since last commit.") def __repr__(self): - return "" % (self.id, self.message[:64]) + return "" % (self.id[:8], self.message[:64]) class Commits(GithubCommand): From 9bfcb161f6feb2f8fe81faee580e428c98060890 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:42:26 +0100 Subject: [PATCH 282/454] Show a maximum of 20 characters in a string's repr() output. --- github2/commits.py | 5 +++-- github2/core.py | 11 +++++++++++ github2/issues.py | 7 ++++--- github2/pull_requests.py | 5 +++-- tests/test_unit.py | 6 ++++++ 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/github2/commits.py b/github2/commits.py index 5aa0284..a671901 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -1,4 +1,5 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, + repr_string) class Commit(BaseData): @@ -20,7 +21,7 @@ class Commit(BaseData): "been modified since last commit.") def __repr__(self): - return "" % (self.id[:8], self.message[:64]) + return "" % (self.id[:8], repr_string(self.message)) class Commits(GithubCommand): diff --git a/github2/core.py b/github2/core.py index 0134fde..ca88d64 100644 --- a/github2/core.py +++ b/github2/core.py @@ -245,3 +245,14 @@ def iterate(self): class BaseData(object): __metaclass__ = BaseDataType + + +def repr_string(string): + """Shorten string for use in repr() output + + :param str string: string to operate on + :return: string, with maximum length of 20 characters + """ + if len(string) > 20: + string = string[:17] + '...' + return string.encode('utf-8') diff --git a/github2/issues.py b/github2/issues.py index f58bf83..7aa8d25 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,6 +1,7 @@ import urllib -from github2.core import GithubCommand, BaseData, Attribute, DateAttribute +from github2.core import (GithubCommand, BaseData, Attribute, DateAttribute, + repr_string) class Issue(BaseData): @@ -20,7 +21,7 @@ class Issue(BaseData): pull_request_url = Attribute("URL for the issue's related pull request.") def __repr__(self): - return "" % self.title.encode('utf-8') + return "" % repr_string(self.title) class Comment(BaseData): @@ -31,7 +32,7 @@ class Comment(BaseData): user = Attribute("The username of the user that created this comment.") def __repr__(self): - return "" % self.body + return "" % repr_string(self.body) class Issues(GithubCommand): diff --git a/github2/pull_requests.py b/github2/pull_requests.py index e7694ad..fe8ef1b 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -1,4 +1,5 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, + repr_string) class PullRequest(BaseData): @@ -35,7 +36,7 @@ class PullRequest(BaseData): mergeable = Attribute("Whether the pull request can be merge cleanly") def __repr__(self): - return "" % self.title.encode('utf-8') + return "" % repr_string(self.title) class PullRequests(GithubCommand): diff --git a/tests/test_unit.py b/tests/test_unit.py index 0bedcab..49e765d 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -8,6 +8,7 @@ from nose.tools import (assert_equals, assert_true) +from github2.core import repr_string from github2.issues import Issue from github2.client import Github @@ -48,3 +49,8 @@ def test_project_for_user_repo(): client = Github() assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), 'JNRowe/misc-overlay') + +def test_repr_string(): + assert_equals(repr_string('test'), 'test') + assert_equals(repr_string('abcdefghijklmnopqrst'), 'abcdefghijklmnopqrst') + assert_equals(repr_string('abcdefghijklmnopqrstu'), 'abcdefghijklmnopq...') From c13a09487b71a3a5d8fb8a1bf6be4d4a97961067 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:46:35 +0100 Subject: [PATCH 283/454] Updated tests for output changes in 9bfcb161. --- tests/test_commits.py | 2 +- tests/test_issues.py | 4 ++-- tests/test_pull_requests.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_commits.py b/tests/test_commits.py index 6b9135d..38b2055 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -10,7 +10,7 @@ def test_repr(self): commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' commit = self.client.commits.show('ask/python-github2', commit_id) assert_equals(repr(commit), - '' % commit_id) + '' % commit_id[:8]) class CommitsQueries(utils.HttpMockTestCase): diff --git a/tests/test_issues.py b/tests/test_issues.py index 5cec110..72988f3 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -9,12 +9,12 @@ class ReprTests(utils.HttpMockTestCase): def test_issue_repr(self): issue = self.client.issues.show('ask/python-github2', 24) assert_equals(repr(issue), - '') + '') def test_comment_repr(self): comments = self.client.issues.comments('ask/python-github2', 24) assert_equals(repr(comments[1]), - '') + '') class IssueQueries(utils.HttpMockTestCase): diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 23f571c..522b799 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -9,7 +9,7 @@ class PullRequest(utils.HttpMockTestCase): def test_repr(self): pull_request = self.client.pull_requests.show('ask/python-github2', 39) assert_equals(repr(pull_request), - '') + '') class PullRequestQueries(utils.HttpMockTestCase): From 361e8df4fc910e01d69dcd5075f81e4641d9ea09 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 08:49:23 +0100 Subject: [PATCH 284/454] Minor style changes to __repr__ methods. --- github2/organizations.py | 2 +- github2/repositories.py | 2 +- github2/users.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/github2/organizations.py b/github2/organizations.py index 87be125..ac8e4a2 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -27,7 +27,7 @@ def is_authenticated(self): return self.plan is not None def __repr__(self): - return "" % (self.login) + return "" % self.login class Organizations(GithubCommand): diff --git a/github2/repositories.py b/github2/repositories.py index 9331fcd..ef8426f 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -28,7 +28,7 @@ def _project(self): project = property(_project) def __repr__(self): - return "" % (self._project()) + return "" % self.project class Repositories(GithubCommand): diff --git a/github2/users.py b/github2/users.py index 4392592..4032fe3 100644 --- a/github2/users.py +++ b/github2/users.py @@ -33,7 +33,7 @@ def is_authenticated(self): return self.plan is not None def __repr__(self): - return "" % (self.login) + return "" % self.login class Users(GithubCommand): From 552a62d151000f7c73b925195dcf6df2014f231d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 7 Jun 2011 00:09:43 +0100 Subject: [PATCH 285/454] Initial conversion to logging. --- github2/client.py | 9 +++------ github2/request.py | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/github2/client.py b/github2/client.py index 28107d4..a26210d 100644 --- a/github2/client.py +++ b/github2/client.py @@ -10,9 +10,9 @@ class Github(object): - def __init__(self, username=None, api_token=None, debug=False, - requests_per_second=None, access_token=None, cache=None, - proxy_host=None, proxy_port=8080): + def __init__(self, username=None, api_token=None, requests_per_second=None, + access_token=None, cache=None, proxy_host=None, + proxy_port=8080): """ An interface to GitHub's API: http://develop.github.com/ @@ -27,7 +27,6 @@ def __init__(self, username=None, api_token=None, debug=False, :param str username: your own GitHub username. :param str api_token: can be found at https://github.com/account (while logged in as that user): - :param bool debug: enable debugging information. :param str access_token: can be used when no ``username`` and/or ``api_token`` is used. The ``access_token`` is the OAuth access token that is received after successful OAuth authentication. @@ -41,9 +40,7 @@ def __init__(self, username=None, api_token=None, debug=False, default to 8080 if a proxy_host is set and no port is set). """ - self.debug = debug self.request = GithubRequest(username=username, api_token=api_token, - debug=self.debug, requests_per_second=requests_per_second, access_token=access_token, cache=cache, proxy_host=proxy_host, diff --git a/github2/request.py b/github2/request.py index af149f4..05d407d 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,4 +1,5 @@ import datetime +import logging import re import sys import time @@ -22,6 +23,9 @@ #: Hostname for API access GITHUB_URL = "https://github.com" +#: Logger for requests module +LOGGER = logging.getLogger('github2.request') + def charset_from_headers(headers): """Parse charset from headers @@ -49,8 +53,8 @@ class GithubRequest(object): GithubError = GithubError def __init__(self, username=None, api_token=None, url_prefix=None, - debug=False, requests_per_second=None, access_token=None, - cache=None, proxy_host=None, proxy_port=None): + requests_per_second=None, access_token=None, + cache=None, proxy_host=None, proxy_port=None): """Make an API request. :see: :class:`github2.client.Github` @@ -59,7 +63,6 @@ def __init__(self, username=None, api_token=None, url_prefix=None, self.api_token = api_token self.access_token = access_token self.url_prefix = url_prefix - self.debug = debug if requests_per_second is None: self.delay = 0 else: @@ -117,8 +120,7 @@ def make_request(self, path, extra_post_data=None, method="GET"): since_last_in_seconds = (since_last.days * 24 * 60 * 60) + since_last.seconds + (since_last.microseconds/1000000.0) if since_last_in_seconds < self.delay: duration = self.delay - since_last_in_seconds - if self.debug: - sys.stderr.write("delaying API call %s\n" % duration) + LOGGER.warning("delaying API call %s second(s)", duration) time.sleep(duration) extra_post_data = extra_post_data or {} @@ -142,9 +144,9 @@ def raw_request(self, url, extra_post_data, method="GET"): query = self.encode_authentication_data(parse_qs(query)) url = urlunsplit((scheme, netloc, path, query, fragment)) response, content = self._http.request(url, method, post_data, headers) - if self.debug: - sys.stderr.write("URL:[%s] POST_DATA:%s RESPONSE_TEXT: [%s]\n" % ( - url, post_data, content)) + if LOGGER.isEnabledFor(logging.DEBUG): + logging.debug("URL: %r POST_DATA: %r RESPONSE_TEXT: %r", url, + post_data, content) if response.status >= 400: raise RuntimeError("unexpected response from github.com %d: %r" % ( response.status, content)) From 78e9cccbe3fd5359a5fe28fc9164e0b12f557f32 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 7 Jun 2011 00:11:56 +0100 Subject: [PATCH 286/454] Converted manage_collaborators script to use logging. --- github2/bin/manage_collaborators.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 5f3f272..0a5b4bf 100644 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -11,6 +11,7 @@ # Copyright (c) 2009 HUDORA. All rights reserved. # BSD licensed +import logging from optparse import OptionParser import github2.client @@ -58,9 +59,13 @@ def main(): options.account = options.login github = github2.client.Github(username=options.login, - api_token=options.apitoken, - debug=options.debug) + api_token=options.apitoken) + # PEP-308 conditional expressions are much better, but we're keeping Py2.4 + # compatibility elsewhere. + logging.basicConfig(level=options.debug and logging.DEBUG or logging.WARN, + format="%(asctime)s - %(message)s", + datefmt="%Y-%m-%dT%H:%M:%S") if len(args) == 1: for repos in github.repos.list(options.account): fullreposname = github.project_for_user_repo(options.account, repos.name) @@ -78,6 +83,8 @@ def main(): github.repos.add_collaborator(repos.name, collaborator) print "added %r to %r" % (collaborator, repos.name) + logging.shutdown() + if __name__ == '__main__': main() From fe0284cc01c35577b53bf13dfa27bf00dd7da78c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:00:04 +0100 Subject: [PATCH 287/454] Include repr_string in core API documentation. --- doc/api/core.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/api/core.rst b/doc/api/core.rst index fa6c773..d6b9f60 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -20,6 +20,8 @@ Core .. autofunction:: doc_generator +.. autofunction:: repr_string + .. autoclass:: GithubCommand(type) .. autoclass:: Attribute(type) From dfb2431788cb9259e5622abd5ee56b94f0e44aab Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:14:26 +0100 Subject: [PATCH 288/454] Added ISO-8601 conversion functions to core API document. --- doc/api/core.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/api/core.rst b/doc/api/core.rst index 16142b7..03e3bd1 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -18,6 +18,9 @@ Core .. autofunction:: userdate_to_datetime +.. autofunction:: isodate_to_datetime +.. autofunction:: datetime_to_isodate + .. autofunction:: requires_auth .. autofunction:: enhanced_by_auth From 93d25d21cba5bd9118db18d9e8c53ac99dcbe201 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:27:04 +0100 Subject: [PATCH 289/454] Use an authenticated client in follow/unfollow tests. --- ...nkt,access_token=xxx,5670385849f9826634ee63e74bcac43e} | 2 +- ...nkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444} | 2 +- tests/test_user.py | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) rename tests/data/{github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc => github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e} (93%) rename tests/data/{github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 => github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444} (92%) diff --git a/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc b/tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e similarity index 93% rename from tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc rename to tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e index 4b6edda..8b8fbb8 100644 --- a/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc +++ b/tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e @@ -1,6 +1,6 @@ status: 200 x-ratelimit-remaining: 58 -content-location: https://github.com/api/v2/json/user/show/mojombo +content-location: https://github.com/api/v2/json/user/show/mojombo?access_token=xxx x-runtime: 23ms content-length: 63 server: nginx/0.7.67 diff --git a/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 similarity index 92% rename from tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 rename to tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 index bc3e9a8..5142ac5 100644 --- a/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 +++ b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 @@ -1,6 +1,6 @@ status: 200 x-ratelimit-remaining: 58 -content-location: http://github.com/api/v2/json/user/unfollow/defunkt +content-location: http://github.com/api/v2/json/user/unfollow/defunkt?access_token=xxx x-runtime: 23ms content-length: 53 server: nginx/0.7.67 diff --git a/tests/test_user.py b/tests/test_user.py index 9c6ec0b..a4b685c 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -4,6 +4,8 @@ from nose.tools import (assert_equals, assert_false, assert_true) +from github2.client import Github + import utils @@ -68,7 +70,11 @@ def test_search_by_email(self): assert_equals(repr(user), '') -class UserMethods(utils.HttpMockTestCase): +class AuthenticatedUserMethods(utils.HttpMockTestCase): + def setUp(self): + super(AuthenticatedUserMethods, self).setUp() + self.client = Github(access_token='xxx') + def test_follow(self): result = self.client.users.follow('defunkt') assert_true('defunkt' in result['users']) From 6e8f84415bb501b8ca9b4159e33148ae022fa558 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:31:33 +0100 Subject: [PATCH 290/454] Don't encode repr_string under Python 3. --- github2/core.py | 9 ++++++++- tests/test_unit.py | 3 --- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/github2/core.py b/github2/core.py index 73dc274..525a4ac 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,7 +1,12 @@ +import sys import time from datetime import datetime +#: Running under Python 3 +PY3K = sys.version_info[0] == 3 and True or False + + GITHUB_TIMEZONE = "-0700" GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S" #2009-03-21T18:01:48-07:00 @@ -294,4 +299,6 @@ def repr_string(string): """ if len(string) > 20: string = string[:17] + '...' - return string.encode('utf-8') + if not PY3K: + string.decode('utf-8') + return string diff --git a/tests/test_unit.py b/tests/test_unit.py index 9d0476e..43fe2fc 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -3,7 +3,6 @@ import _setup import datetime -import sys import unittest from nose.tools import (assert_equals, assert_true) @@ -21,8 +20,6 @@ class ReprTests(unittest.TestCase): def test_issue(self): """Issues can have non-ASCII characters in the title.""" title = 'abcdé' - if sys.version_info[0] == 2: - title = title.decode("utf-8") i = Issue(title=title) assert_equals(str, type(repr(i))) From 6df986ed1e36232fd2d7a31a15dd8c6b04d33b0e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:49:40 +0100 Subject: [PATCH 291/454] Added commit properties tests. --- tests/test_commits.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/tests/test_commits.py b/tests/test_commits.py index 38b2055..90a4cde 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -1,16 +1,39 @@ import _setup +from datetime import datetime + from nose.tools import assert_equals import utils -class Commit(utils.HttpMockTestCase): +class CommitProperties(utils.HttpMockTestCase): + """Test commit property handling""" + commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' + def test_commit(self): + commit = self.client.commits.show('ask/python-github2', self.commit_id) + assert_equals(commit.message, + 'Added cache support to manage_collaborators.') + assert_equals(commit.parents, + [{"id": '7d1c855d2f44a55e4b90b40017be697cf70cb4a0'}]) + assert_equals(commit.url, + '/ask/python-github2/commit/%s' % self.commit_id) + assert_equals(commit.author['login'], 'JNRowe') + assert_equals(commit.id, self.commit_id) + assert_equals(commit.committed_date, + datetime(2011, 6, 6, 16, 13, 50)) + assert_equals(commit.authored_date, datetime(2011, 6, 6, 16, 13, 50)) + assert_equals(commit.tree, 'f48fcc1a0b8ea97f3147dc42cf7cdb6683493e94') + assert_equals(commit.committer['login'], 'JNRowe') + assert_equals(commit.added, None) + assert_equals(commit.removed, None) + assert_equals(commit.modified[0]['filename'], 'github2/bin/manage_collaborators.py') + + def test_repr(self): - commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' - commit = self.client.commits.show('ask/python-github2', commit_id) + commit = self.client.commits.show('ask/python-github2', self.commit_id) assert_equals(repr(commit), - '' % commit_id[:8]) + '' % self.commit_id[:8]) class CommitsQueries(utils.HttpMockTestCase): From 0a3c36fdcdc3323603b84c979d47602cd8da3c03 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 09:59:47 +0100 Subject: [PATCH 292/454] Added issue/comment properties tests. --- tests/test_issues.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/tests/test_issues.py b/tests/test_issues.py index 72988f3..377412e 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -1,16 +1,49 @@ import _setup +from datetime import datetime + from nose.tools import assert_equals import utils -class ReprTests(utils.HttpMockTestCase): +class Issue(utils.HttpMockTestCase): + def test_properties(self): + issue = self.client.issues.show('ask/python-github2', 24) + assert_equals(issue.position, 24.0) + assert_equals(issue.number, 24) + assert_equals(issue.votes, 0) + assert_equals(len(issue.body), 164) + assert_equals(issue.title, 'Pagination support for commits.') + assert_equals(issue.user, 'svetlyak40wt') + assert_equals(issue.state, 'open') + assert_equals(issue.labels, []) + assert_equals(issue.created_at, datetime(2010, 12, 8, 23, 50, 26)) + assert_equals(issue.closed_at, None) + assert_equals(issue.updated_at, datetime(2011, 1, 4, 16, 26, 7)) + assert_equals(issue.diff_url, + 'https://github.com/ask/python-github2/pull/24.diff') + assert_equals(issue.patch_url, + 'https://github.com/ask/python-github2/pull/24.patch') + assert_equals(issue.pull_request_url, + 'https://github.com/ask/python-github2/pull/24') + def test_issue_repr(self): issue = self.client.issues.show('ask/python-github2', 24) assert_equals(repr(issue), '') - + + +class Comment(utils.HttpMockTestCase): + def test_properties(self): + comments = self.client.issues.comments('ask/python-github2', 24) + comment = comments[0] + assert_equals(comment.created_at, datetime(2010, 12, 9, 22, 37, 26)) + assert_equals(comment.updated_at, datetime(2010, 12, 9, 22, 37, 26)) + assert_equals(len(comment.body), 267) + assert_equals(comment.id, 601871) + assert_equals(comment.user, 'nvie') + def test_comment_repr(self): comments = self.client.issues.comments('ask/python-github2', 24) assert_equals(repr(comments[1]), From ed0c7aa3e0868711d4acf72799baf590f2a81fea Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 10:30:13 +0100 Subject: [PATCH 293/454] Use an authenticated client, where necessary, in user tests. --- ...oken=xxx,c4b85d41b23f289441ee9b8455209d9c} | 2 +- tests/test_user.py | 44 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) rename tests/data/{github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 => github.com,api,v2,json,user,show,access_token=xxx,c4b85d41b23f289441ee9b8455209d9c} (90%) diff --git a/tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 b/tests/data/github.com,api,v2,json,user,show,access_token=xxx,c4b85d41b23f289441ee9b8455209d9c similarity index 90% rename from tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 rename to tests/data/github.com,api,v2,json,user,show,access_token=xxx,c4b85d41b23f289441ee9b8455209d9c index 1add068..8097b18 100644 --- a/tests/data/github.com,api,v2,json,user,show,fake_jnrowe_with_auth,3332dc348e8a0f294ffd182b06f12a54 +++ b/tests/data/github.com,api,v2,json,user,show,access_token=xxx,c4b85d41b23f289441ee9b8455209d9c @@ -1,6 +1,6 @@ status: 304 x-ratelimit-remaining: 58 -content-location: https://github.com/api/v2/json/user/show +content-location: https://github.com/api/v2/json/user/show?access_token=xxx connection: keep-alive content-length: 562 server: nginx/0.7.67 diff --git a/tests/test_user.py b/tests/test_user.py index a4b685c..741477f 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -37,26 +37,9 @@ def test_followers(self): def test_following(self): assert_equals(len(self.client.users.following('defunkt')), 212) - def test_is_authenticated(self): + def test_is_not_authenticated(self): user = self.client.users.show('defunkt') assert_true(user.is_authenticated() is False) - user = self.client.users.show('fake_jnrowe_with_auth') - assert_true(user.is_authenticated() is True) - - def test_private_data(self): - user = self.client.users.show('fake_jnrowe_with_auth') - assert_equals(user.total_private_repo_count, 0) - assert_equals(user.collaborators, 0) - assert_equals(user.disk_usage, 66069) - assert_equals(user.owned_private_repo_count, 0) - assert_equals(user.private_gist_count, 7) - - def test_plan_data(self): - user = self.client.users.show('fake_jnrowe_with_auth') - assert_equals(user.plan['name'], "free") - assert_equals(user.plan['collaborators'], 0) - assert_equals(user.plan['space'], 307200) - assert_equals(user.plan['private_repos'], 0) class UserQueries(utils.HttpMockTestCase): @@ -82,3 +65,28 @@ def test_follow(self): def test_unfollow(self): result = self.client.users.unfollow('defunkt') assert_false('defunkt' in result['users']) + + def test_is_authenticated(self): + user = self.client.users.show('') + assert_true(user.is_authenticated() is True) + + +class AuthenticatedUserProperties(utils.HttpMockTestCase): + def setUp(self): + super(AuthenticatedUserProperties, self).setUp() + self.client = Github(access_token='xxx') + + def test_private_data(self): + user = self.client.users.show('') + assert_equals(user.total_private_repo_count, 0) + assert_equals(user.collaborators, 0) + assert_equals(user.disk_usage, 66069) + assert_equals(user.owned_private_repo_count, 0) + assert_equals(user.private_gist_count, 7) + + def test_plan_data(self): + user = self.client.users.show('') + assert_equals(user.plan['name'], "free") + assert_equals(user.plan['collaborators'], 0) + assert_equals(user.plan['space'], 307200) + assert_equals(user.plan['private_repos'], 0) From e39c96f2ebc7a5f2c3baface8b37fb8483af2ecd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 10:34:15 +0100 Subject: [PATCH 294/454] Added an OAuth authenticated Http mock. --- tests/test_repositories.py | 6 +----- tests/test_user.py | 12 ++---------- tests/utils.py | 13 +++++++++++++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tests/test_repositories.py b/tests/test_repositories.py index b33fab6..497a5c2 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -70,11 +70,7 @@ def test_contributors(self): assert_equals(contributors[1].name, 'Ask Solem Hoel') -class AuthenticatedRepoQueries(utils.HttpMockTestCase): - def setUp(self): - super(AuthenticatedRepoQueries, self).setUp() - self.client = Github(access_token='xxx') - +class AuthenticatedRepoQueries(utils.HttpMockAuthenticatedTestCase): def test_pushable(self): repos = self.client.repos.pushable() assert_equals(len(repos), 1) diff --git a/tests/test_user.py b/tests/test_user.py index 741477f..cf5444c 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -53,11 +53,7 @@ def test_search_by_email(self): assert_equals(repr(user), '') -class AuthenticatedUserMethods(utils.HttpMockTestCase): - def setUp(self): - super(AuthenticatedUserMethods, self).setUp() - self.client = Github(access_token='xxx') - +class AuthenticatedUserMethods(utils.HttpMockAuthenticatedTestCase): def test_follow(self): result = self.client.users.follow('defunkt') assert_true('defunkt' in result['users']) @@ -71,11 +67,7 @@ def test_is_authenticated(self): assert_true(user.is_authenticated() is True) -class AuthenticatedUserProperties(utils.HttpMockTestCase): - def setUp(self): - super(AuthenticatedUserProperties, self).setUp() - self.client = Github(access_token='xxx') - +class AuthenticatedUserProperties(utils.HttpMockAuthenticatedTestCase): def test_private_data(self): user = self.client.users.show('') assert_equals(user.total_private_repo_count, 0) diff --git a/tests/utils.py b/tests/utils.py index 17b9e41..14fc457 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -70,6 +70,19 @@ def tearDown(self): httplib2.Http = ORIG_HTTP_OBJECT +class HttpMockAuthenticatedTestCase(HttpMockTestCase): + def setUp(self): + """Prepare test fixtures + + :see: ``HttpMockTestCase`` + + :attr:`client` is an authenticated :obj:`Github` object for easy use + in tests. + """ + httplib2.Http = HttpMock + self.client = Github(access_token='xxx') + + def set_http_mock(): """Function to enable ``Http`` mock From d5d2e0e86d67d29e47e8d6761deeed07e9780f44 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 10:40:00 +0100 Subject: [PATCH 295/454] Removed unused to_dict function in BaseDataType. --- github2/core.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/github2/core.py b/github2/core.py index 525a4ac..8cc68f9 100644 --- a/github2/core.py +++ b/github2/core.py @@ -268,15 +268,8 @@ def constructor(self, **kwargs): setattr(self, attr_name, attr.to_python(attr_value)) else: setattr(self, attr_name, attr_value) - _contribute_method("__init__", constructor) - def to_dict(self): - _meta = self._meta - dict_ = vars(self) - return dict([(attr_name, _meta[attr_name].from_python(attr_value)) - for attr_name, attr_value in dict_.items()]) - def iterate(self): not_empty = lambda e: e[1] is not None return iter(filter(not_empty, vars(self).items())) From bca4787cbbfd3cdc9695e32e5d67768b1fc52af3 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 10:56:42 +0100 Subject: [PATCH 296/454] Added test for list_by_label Issues method. --- ...ay,label,bug,79a89664a2d4783ee9089d29f99b660e | 16 ++++++++++++++++ tests/test_issues.py | 5 +++++ 2 files changed, 21 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,issues,list,JNRowe,misc-overlay,label,bug,79a89664a2d4783ee9089d29f99b660e diff --git a/tests/data/github.com,api,v2,json,issues,list,JNRowe,misc-overlay,label,bug,79a89664a2d4783ee9089d29f99b660e b/tests/data/github.com,api,v2,json,issues,list,JNRowe,misc-overlay,label,bug,79a89664a2d4783ee9089d29f99b660e new file mode 100644 index 0000000..e865e18 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,list,JNRowe,misc-overlay,label,bug,79a89664a2d4783ee9089d29f99b660e @@ -0,0 +1,16 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/issues/list/JNRowe/misc-overlay/label/bug +connection: keep-alive +x-next: https://github.com/api/v2/json/issues/list/JNRowe/misc-overlay/label/bug?page=2 +content-length: 15566 +server: nginx/0.7.67 +date: Wed, 08 Jun 2011 13:42:00 GMT +x-runtime: 138ms +x-ratelimit-limit: 60 +etag: "f625ba2e14adae8f3b8960c00d60e9eb" +cache-control: private, max-age=0, must-revalidate +x-last: https://github.com/api/v2/json/issues/list/JNRowe/misc-overlay/label/bug?page=2 +content-type: application/json; charset=utf-8 + +{"issues":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":1.0,"number":3,"votes":0,"created_at":"2010/09/14 17:51:13 -0700","comments":1,"body":"\n---\n`ditz-id`: `05d00a48cdce80119a2b26f7c6f0e25894ff8537`\n\n`ditz-event-time`: `2010-03-04T19:21:01.799951Z`","title":"app-text/gist file locations have changed in git repo.","updated_at":"2010/09/14 17:51:17 -0700","closed_at":"2010/09/14 17:51:17 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/3","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":4.0,"number":9,"votes":0,"created_at":"2010/09/14 17:52:17 -0700","comments":1,"body":"\n---\n`ditz-id`: `0fdb57d80db65f2370811df882adbc8e958e5d8a`\n\n`ditz-event-time`: `2009-12-21T17:53:02.947952Z`","title":"fossil uses internal copy of sqlite.","updated_at":"2010/09/14 17:52:21 -0700","closed_at":"2010/09/14 17:52:21 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/9","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":6.0,"number":11,"votes":0,"created_at":"2010/09/14 17:52:40 -0700","comments":1,"body":"\n---\n`ditz-id`: `137ec0032fe83918fd0570e125dc1f2991a37676`\n\n`ditz-event-time`: `2010-03-04T19:37:23.671948Z`","title":"dev-python/pycukes fails with recent distutills.eclass changes.","updated_at":"2010/09/14 17:52:44 -0700","closed_at":"2010/09/14 17:52:44 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/11","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":19.0,"number":24,"votes":0,"created_at":"2010/09/14 17:54:52 -0700","comments":1,"body":"\n---\n`ditz-id`: `2ca7641993a1f7a1a8cb7ab01d5cde6b874e118a`\n\n`ditz-event-time`: `2009-12-14T10:32:37.855964Z`","title":"app-text/apvlv-0.0.8.1 has automagic djvu dependency.","updated_at":"2010/09/14 17:54:57 -0700","closed_at":"2010/09/14 17:54:57 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/24","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":24.0,"number":29,"votes":0,"created_at":"2010/09/14 17:55:30 -0700","comments":2,"body":"Reported by Dennis Bruce.\n\n---\n`ditz-id`: `32197e2725b7a973e0a66f3ecaf0efbbfb966c1e`\n\n`ditz-event-time`: `2010-03-04T17:43:17.471958Z`","title":"dev-util/ccontrol fails in src_test.","updated_at":"2010/09/14 17:55:35 -0700","closed_at":"2010/09/14 17:55:35 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/29","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":25.0,"number":30,"votes":0,"created_at":"2010/09/14 17:55:37 -0700","comments":1,"body":"\n---\n`ditz-id`: `337caa2e1f972335878906cc1fbfd6091a96d633`\n\n`ditz-event-time`: `2010-03-05T21:27:08.459986Z`","title":"python.eclass changes emit warnings with jnrowe-pypi:module_script_wrapper().","updated_at":"2010/09/14 17:55:46 -0700","closed_at":"2010/09/14 17:55:46 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/30","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":28.0,"number":33,"votes":0,"created_at":"2010/09/14 17:55:59 -0700","comments":1,"body":"\n---\n`ditz-id`: `35cca70ded236159c5a3a18bf816c2af345bc811`\n\n`ditz-event-time`: `2010-07-05T17:16:15.503883Z`","title":"dev-libs/ctpl cupage check blocked by robots.txt.","updated_at":"2010/09/14 17:56:03 -0700","closed_at":"2010/09/14 17:56:03 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/33","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":29.0,"number":34,"votes":0,"created_at":"2010/09/14 17:56:06 -0700","comments":1,"body":"\n---\n`ditz-id`: `362778bbc4dd3a91ab4149f33868039c75ccc7d6`\n\n`ditz-event-time`: `2010-02-14T07:36:28.091756Z`","title":"dev-python/html doesn't work with Python 2.4.","updated_at":"2010/09/14 17:56:10 -0700","closed_at":"2010/09/14 17:56:10 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/34","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":33.0,"number":38,"votes":0,"created_at":"2010/09/14 17:56:28 -0700","comments":1,"body":"\n---\n`ditz-id`: `3a12af55a7e27b7a87cf0432c7285e4e32ace4fe`\n\n`ditz-event-time`: `2009-12-06T06:21:55.723974Z`","title":"Invalid man page install path in apvlv.","updated_at":"2010/09/14 17:56:38 -0700","closed_at":"2010/09/14 17:56:38 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/38","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":34.0,"number":39,"votes":0,"created_at":"2010/09/14 17:56:44 -0700","comments":1,"body":"\n---\n`ditz-id`: `3a3471c3a9218713445122c21458c5d7f1b72e30`\n\n`ditz-event-time`: `2010-03-04T17:44:37.431956Z`","title":"dev-util/gitserve fails with recent distutills.eclass changes.","updated_at":"2010/09/14 17:56:49 -0700","closed_at":"2010/09/14 17:56:49 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/39","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":35.0,"number":40,"votes":0,"created_at":"2010/09/14 17:56:51 -0700","comments":1,"body":"The download page has changed layout.\n\n---\n`ditz-id`: `408d842ddd5caef873f5bedcaf4e71cee992d058`\n\n`ditz-event-time`: `2009-12-31T03:25:36.464053Z`","title":"matwm2 cupage entry broken.","updated_at":"2010/09/14 17:56:56 -0700","closed_at":"2010/09/14 17:56:56 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/40","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":40.0,"number":45,"votes":0,"created_at":"2010/09/14 17:57:35 -0700","comments":1,"body":"- /usr/share/doc/apvlv-0.0.7.4/reg.png - /usr/share/doc/apvlv-0.0.7.4/dir.png - /usr/share/doc/apvlv-0.0.7.4/pdf.png\n\n---\n`ditz-id`: `48578b8bac650dad93271d2880de33140768b4f0`\n\n`ditz-event-time`: `2009-11-14T06:53:02.847996Z`","title":"apvlv stores datafiles in docdir.","updated_at":"2010/09/14 17:57:39 -0700","closed_at":"2010/09/14 17:57:39 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/45","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":49.0,"number":54,"votes":0,"created_at":"2010/09/14 17:59:00 -0700","comments":1,"body":"Some of the plugins reference the build system's default document path, which is overridden at install time. This isn't just cosmetic, it breaks help functionality in the interface.\n\n---\n`ditz-id`: `54418badf2a50f642b919f458dd561e559083e7b`\n\n`ditz-event-time`: `2010-06-20T12:35:08.378462Z`","title":"Invalid doc path used in geany-plugins-0.19.","updated_at":"2010/09/14 17:59:10 -0700","closed_at":"2010/09/14 17:59:10 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/54","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":81.0,"number":86,"votes":0,"created_at":"2010/09/14 18:08:09 -0700","comments":1,"body":"ebuild and cupage entry need updating.\n\n---\n`ditz-id`: `81ea1ed5020396c7114643281ad2bf554133f9d6`\n\n`ditz-event-time`: `2009-11-16T05:25:05.255933Z`","title":"x11-wm/parti has moved to Google's code hosting.","updated_at":"2010/09/14 18:08:13 -0700","closed_at":"2010/09/14 18:08:13 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/86","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":97.0,"number":102,"votes":0,"created_at":"2010/09/14 18:11:24 -0700","comments":6,"body":"\n---\n`ditz-id`: `971e2fc2ad70b118b79adfe1a3745e5c551932bf`\n\n`ditz-event-time`: `2009-11-12T04:40:21.007927Z`","title":"Packages missing cupage config entries.","updated_at":"2010/09/14 18:11:37 -0700","closed_at":"2010/09/14 18:11:37 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/102","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":113.0,"number":118,"votes":0,"created_at":"2010/09/14 18:13:58 -0700","comments":1,"body":"\n---\n`ditz-id`: `a7598bb237c7bb2c402c4ff4c6a4e59d543e998f`\n\n`ditz-event-time`: `2010-03-04T19:17:31.451916Z`","title":"dev-python/restview fails with recent distutills.eclass changes.","updated_at":"2010/09/14 18:14:02 -0700","closed_at":"2010/09/14 18:14:02 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/118","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":117.0,"number":122,"votes":0,"created_at":"2010/09/14 18:14:23 -0700","comments":1,"body":"\n---\n`ditz-id`: `afa05d6a5f6ccdebcdaebec759d408d61888e729`\n\n`ditz-event-time`: `2010-07-05T17:21:11.219887Z`","title":"www-client/opera-remote cupage check blocked by robots.txt.","updated_at":"2010/09/14 18:14:28 -0700","closed_at":"2010/09/14 18:14:28 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/122","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":122.0,"number":127,"votes":0,"created_at":"2010/09/14 18:15:29 -0700","comments":1,"body":"\n---\n`ditz-id`: `b48295c6d581976a0c95f26c2190865c493fc081`\n\n`ditz-event-time`: `2010-07-05T17:17:40.083880Z`","title":"dev-libs/luaposix cupage check blocked by robots.txt.","updated_at":"2010/09/14 18:15:39 -0700","closed_at":"2010/09/14 18:15:39 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/127","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":0.0,"number":141,"votes":0,"created_at":"2010/09/14 18:17:45 -0700","comments":3,"body":"\n---\n`ditz-id`: `c8d8078898af58f80139f986306433a4c4efd397`\n\n`ditz-event-time`: `2010-07-05T17:23:22.063887Z`","title":"media-gfx/psplash cupage check raises 403.","updated_at":"2011/02/25 22:13:20 -0800","closed_at":"2011/02/25 22:13:20 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/141","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":150.0,"number":155,"votes":0,"created_at":"2010/09/14 18:20:01 -0700","comments":1,"body":"Uses incorrect path.\n\n---\n`ditz-id`: `d3ba89ca556458709fe431eb3ad43989722cf274`\n\n`ditz-event-time`: `2010-06-22T18:17:54.823885Z`","title":"net-misc/bleeter-0.5.0 manpage generation broken.","updated_at":"2010/09/14 18:20:12 -0700","closed_at":"2010/09/14 18:20:12 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/155","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":166.0,"number":171,"votes":0,"created_at":"2010/09/14 18:22:48 -0700","comments":1,"body":"\n---\n`ditz-id`: `f86c46636c26fd30d5d812fc207a8ea9107c7bdc`\n\n`ditz-event-time`: `2009-12-13T11:35:43.211823Z`","title":"taskwarrior overrides user CFLAGS settings.","updated_at":"2010/09/14 18:22:53 -0700","closed_at":"2010/09/14 18:22:53 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/171","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":11.0,"number":199,"votes":0,"created_at":"2010/10/07 18:17:27 -0700","comments":2,"body":"This pypi entry seems to have been deleted. Leave this bug open for a few weeks to see if it is re-added, if not look for alternatives.","title":"dev-python/termstyle cupage check raises 404.","updated_at":"2010/11/05 05:53:12 -0700","closed_at":"2010/11/05 05:53:12 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/199","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":177.0,"number":200,"votes":0,"created_at":"2010/10/08 04:06:56 -0700","comments":1,"body":"Thanks to Daniel Brew for reporting.","title":"media-gfx/sng won't build with libpng-1.4.","updated_at":"2010/10/08 04:33:06 -0700","closed_at":"2010/10/08 04:33:06 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/200","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":18.0,"number":258,"votes":0,"created_at":"2011/01/09 22:53:39 -0800","comments":2,"body":"Recent sourceforge changes have broken matcher.","title":"sci-geosciences/gpsfeed cupage check fails.","updated_at":"2011/01/10 23:47:24 -0800","closed_at":"2011/01/10 23:47:24 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/258","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":19.0,"number":259,"votes":0,"created_at":"2011/01/09 23:02:37 -0800","comments":2,"body":"Recent sourceforge changes have broken matcher.","title":"media-gfx/sng cupage check fails.","updated_at":"2011/01/10 22:04:52 -0800","closed_at":"2011/01/10 22:04:52 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/259","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":20.0,"number":261,"votes":0,"created_at":"2011/01/09 23:04:31 -0800","comments":2,"body":"Recent sourceforge changes have broken matcher.","title":"dev-tcltk/tcludp cupage check fails.","updated_at":"2011/01/10 22:04:52 -0800","closed_at":"2011/01/10 22:04:52 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/261","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":6.0,"number":262,"votes":0,"created_at":"2011/01/09 23:44:53 -0800","comments":2,"body":"If `USE=!examples` the links in the documentation will be broken.\r\n\r\nThis obviously also applies to `mail-filter/maildirproc-python2`.","title":"mail-filter/maildirproc documentation should link to upstream for examples","updated_at":"2011/01/10 23:47:24 -0800","closed_at":"2011/01/10 23:47:24 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/262","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":0.0,"number":284,"votes":0,"created_at":"2011/02/14 03:00:42 -0800","comments":2,"body":"Upstream appears to have redesigned their site, so the cupage check needs updating.","title":"dev-python/texttable cupage check raises 404.","updated_at":"2011/02/15 05:54:47 -0800","closed_at":"2011/02/15 05:54:47 -0800","html_url":"https://github.com/JNRowe/misc-overlay/issues/284","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":9.0,"number":327,"votes":0,"created_at":"2011/04/04 21:42:38 -0700","comments":1,"body":"Appears to have switched to PyPI for listings.","title":"dev-python/feedcache cupage entry broken.","updated_at":"2011/04/05 03:59:24 -0700","closed_at":"2011/04/05 03:59:24 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/327","user":"JNRowe","labels":["bug"],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":10.0,"number":328,"votes":0,"created_at":"2011/04/04 21:44:12 -0700","comments":1,"body":"Files have been repackaged and renamed.","title":"app-misc/libeatmydata cupage entry broken.","updated_at":"2011/04/05 03:59:24 -0700","closed_at":"2011/04/05 03:59:24 -0700","html_url":"https://github.com/JNRowe/misc-overlay/issues/328","user":"JNRowe","labels":["bug"],"state":"closed"}]} \ No newline at end of file diff --git a/tests/test_issues.py b/tests/test_issues.py index 72988f3..166e592 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -38,3 +38,8 @@ def test_issue_labels(self): labels = self.client.issues.list_labels('JNRowe/misc-overlay') assert_equals(len(labels), 3) assert_equals(labels[0], 'feature') + + def test_list_by_label(self): + issues = self.client.issues.list_by_label('JNRowe/misc-overlay', 'bug') + assert_equals(len(issues), 30) + assert_equals(issues[-1].number, 328) From cfa7a543bcee2ab63619fea99bd40ffa8084eb3e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 11 Jun 2011 10:58:09 +0100 Subject: [PATCH 297/454] Added more repository querying tests. --- ...languages,941f2fae40c32a86b82f8e51a623cacd | 14 +++++++++++ ...,branches,2be8c8f036124b61fbddeecbbdf28e9c | 14 +++++++++++ ...aborators,855cea60d613a363106762311e6f53ea | 14 +++++++++++ ...hub2,tags,e7b38a20b45dffd2a22d34b5b51f41da | 14 +++++++++++ ...,watchers,8f4f641783ac93b3f5d7507bc65cf925 | 14 +++++++++++ tests/test_repositories.py | 25 +++++++++++++++++++ 6 files changed, 95 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,languages,941f2fae40c32a86b82f8e51a623cacd create mode 100644 tests/data/github.com,api,v2,json,repos,show,ask,python-github2,branches,2be8c8f036124b61fbddeecbbdf28e9c create mode 100644 tests/data/github.com,api,v2,json,repos,show,ask,python-github2,collaborators,855cea60d613a363106762311e6f53ea create mode 100644 tests/data/github.com,api,v2,json,repos,show,ask,python-github2,tags,e7b38a20b45dffd2a22d34b5b51f41da create mode 100644 tests/data/github.com,api,v2,json,repos,show,ask,python-github2,watchers,8f4f641783ac93b3f5d7507bc65cf925 diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,languages,941f2fae40c32a86b82f8e51a623cacd b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,languages,941f2fae40c32a86b82f8e51a623cacd new file mode 100644 index 0000000..15bd799 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,languages,941f2fae40c32a86b82f8e51a623cacd @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/repos/show/JNRowe/misc-overlay/languages +x-runtime: 93ms +content-length: 40 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "584c4c914a780c9338d00d146803076b" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:38:58 GMT +content-type: application/json; charset=utf-8 + +{"languages":{"VimL":82,"Python":11194}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,branches,2be8c8f036124b61fbddeecbbdf28e9c b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,branches,2be8c8f036124b61fbddeecbbdf28e9c new file mode 100644 index 0000000..ab694a6 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,branches,2be8c8f036124b61fbddeecbbdf28e9c @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/branches +x-runtime: 8ms +content-length: 66 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "9f005bc97eb5ab622f01f1810790a947" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:39:24 GMT +content-type: application/json; charset=utf-8 + +{"branches":{"master":"1c83cde9b5a7c396a01af1007fb7b88765b9ae45"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,collaborators,855cea60d613a363106762311e6f53ea b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,collaborators,855cea60d613a363106762311e6f53ea new file mode 100644 index 0000000..26c614b --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,collaborators,855cea60d613a363106762311e6f53ea @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/collaborators?access_token=xxx +x-runtime: 15ms +content-length: 50 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "03a973e8cc6d6cc0a8f05f2ef767a175" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:38:17 GMT +content-type: application/json; charset=utf-8 + +{"collaborators":["ask","jdunck","JNRowe","nvie"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,tags,e7b38a20b45dffd2a22d34b5b51f41da b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,tags,e7b38a20b45dffd2a22d34b5b51f41da new file mode 100644 index 0000000..617036e --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,tags,e7b38a20b45dffd2a22d34b5b51f41da @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/tags +x-runtime: 7ms +content-length: 372 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "25b6801155cc07a688ae97ce708404aa" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:39:16 GMT +content-type: application/json; charset=utf-8 + +{"tags":{"0.4.0":"6337009b8cefecaff3d5b73883d3da541cc25432","v0.2.0":"9c573faef38b14603c8bdca39c0b7a0140502da9","v0.3.0":"573da9892ddbe85272b7367bf2936d1a3d5d3868","v0.1.2":"03afc58f59b0023a0a9c880387b0487b9010ca98","0.4.1":"96b0a41dd249c521323700bc11a0a721a7c9e642","v0.3.1":"f4c0a1f94770dd087fe636ed98f3443db317ab8c","v0.1.3":"210b2ac7f9368e372d17b7c932e3ad08c23530d4"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,watchers,8f4f641783ac93b3f5d7507bc65cf925 b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,watchers,8f4f641783ac93b3f5d7507bc65cf925 new file mode 100644 index 0000000..cd08980 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,watchers,8f4f641783ac93b3f5d7507bc65cf925 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 56 +content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/watchers +x-runtime: 54ms +content-length: 1625 +server: nginx/0.7.67 +connection: keep-alive +x-ratelimit-limit: 60 +etag: "b358d3db0f531bd5a4942821a7b2c207" +cache-control: private, max-age=0, must-revalidate +date: Wed, 08 Jun 2011 13:39:31 GMT +content-type: application/json; charset=utf-8 + +{"watchers":["ask","bartTC","gregnewman","sneeu","playpauseandstop","bradjasper","tav","joestump","montylounge","justquick","annoma","mrevilme","matagus","stefanfoulis","paulproteus","mattdennewitz","mrolafsson","mlaprise","notesandvolts","idangazit","defunkt","ericholscher","travisjeffery","mnaberez","mikexstudios","robertpfeiffer","diox","mmalone","rconradharris","codysoyland","fperez","koenbollen","mager","eokyere","leegao","nvie","storborg","thoas","Taomio","junckritter","eklitzke","claudiob","yyliuliang","hemanth","dinoboff","hoffmann","Kuze","sixthgear","wasabi1809","CMB","dcolish","tomdyson","miyamuko","stevejalim","grauwoelfchen","pydanny","mgrouchy","kennethreitz","mrtazz","durden","tkaemming","rnelson","jbochi","cloudartisan","jdunck","mattoufoutu","MtvnGames","salsakran","jrabbit","ojii","shabda","JNRowe","zsiciarz","rnagle","imp","rdegges","travlr","johl","gregory80","markuso","meantheory","idorosen","svetlyak40wt","adamv","dforsyth","bleepbloop","ChristopherMacGown","dreynolds","TaurusOlson","rstrobl","johndagostino","droot","pierre-roux","sanjayprabhu","pquerna","iki","mt3","RaiMan","pinoystartup","adamdoupe","RafeKettler","glensc","wermut","switchyard","sammyt","patrys","blackspiraldev","fkling","rokstrnisa","myusuf3","xen-git","bassdread","pmuilu","pombredanne","sigurdga","surajram","loganlinn","k7d","throughnothing","Amper","nikescar","deeGraYve","broderboy","aculich","AntonioMeireles","pikhovkin","atkinson","sc68cal","ralphbean","goosemo","ergelo","gazoombo","zikey","hub-cap","jamesadney","EnTeQuAk","albertz","ryansb","misfire","lxneng","jean-philippe","deniszgonjanin","Irazmus"]} \ No newline at end of file diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 497a5c2..a30179b 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -69,6 +69,31 @@ def test_contributors(self): assert_equals(len(contributors), 27) assert_equals(contributors[1].name, 'Ask Solem Hoel') + def test_list_collaborators(self): + collaborators = self.client.repos.list_collaborators('ask/python-github2') + assert_equals(len(collaborators), 4) + assert_equals(collaborators[2], 'JNRowe') + + def test_languages(self): + languages = self.client.repos.languages('JNRowe/misc-overlay') + assert_equals(len(languages), 2) + assert_equals(languages['Python'], 11194) + + def test_tags(self): + tags = self.client.repos.tags('ask/python-github2') + assert_equals(len(tags), 7) + assert_equals(tags['0.4.1'], '96b0a41dd249c521323700bc11a0a721a7c9e642') + + def test_branches(self): + branches = self.client.repos.branches('ask/python-github2') + assert_equals(len(branches), 1) + assert_equals(branches['master'], '1c83cde9b5a7c396a01af1007fb7b88765b9ae45') + + def test_watchers(self): + watchers = self.client.repos.watchers('ask/python-github2') + assert_equals(len(watchers), 143) + assert_equals(watchers[0], 'ask') + class AuthenticatedRepoQueries(utils.HttpMockAuthenticatedTestCase): def test_pushable(self): From 09ff9ff5a61f0a074b978df03df99a5239aa160c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 12 Jun 2011 12:24:56 +0100 Subject: [PATCH 298/454] Added organisation properties tests. --- tests/test_organizations.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 120c9c0..0842dcc 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -1,11 +1,33 @@ import _setup +from datetime import datetime + from nose.tools import (assert_equals, assert_true) import utils class OrganizationProperties(utils.HttpMockTestCase): + def test_properties(self): + organization = self.client.organizations.show('github') + assert_equals(organization.id, 9919) + assert_equals(organization.name, 'GitHub') + assert_equals(organization.blog, 'https://github.com/about') + assert_equals(organization.location, 'San Francisco, CA') + assert_equals(organization.gravatar_id, + '61024896f291303615bcd4f7a0dcfb74') + assert_equals(organization.login, 'github') + assert_equals(organization.email, 'support@github.com') + assert_equals(organization.company, None) + assert_equals(organization.created_at, + datetime(2008, 5, 10, 21, 37, 31)) + assert_equals(organization.following_count, 0) + assert_equals(organization.followers_count, 571) + assert_equals(organization.public_gist_count, 0) + assert_equals(organization.public_repo_count, 26) + assert_equals(organization.permission, None) + assert_equals(organization.plan, None) + def test_is_authenticated(self): organization = self.client.organizations.show('github') assert_true(organization.is_authenticated() is False) From 79d4d03a070f1bc0ae3e4a4cdd5ac71a7c6ec083 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 12 Jun 2011 12:26:16 +0100 Subject: [PATCH 299/454] Added pull request properties tests. --- tests/test_pull_requests.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 522b799..8138b14 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -1,11 +1,47 @@ import _setup +from datetime import datetime + from nose.tools import assert_equals import utils class PullRequest(utils.HttpMockTestCase): + def test_properties(self): + pull_request = self.client.pull_requests.show('ask/python-github2', 39) + assert_equals(pull_request.state, 'open') + assert_equals(pull_request.base['sha'], + '6a79f43f174acd3953ced69263c06d311a6bda56') + assert_equals(pull_request.head['sha'], + 'a31cfb70343d3ac9d6330e6328008c0bc690a5a1') + assert_equals(pull_request.issue_user['login'], 'JNRowe') + assert_equals(pull_request.user['login'], 'JNRowe') + assert_equals(pull_request.title, 'Datetime timezone handling.') + assert_equals(len(pull_request.body), 1442) + assert_equals(pull_request.position, 39.0) + assert_equals(pull_request.number, 39.0) + assert_equals(pull_request.votes, 0) + assert_equals(pull_request.comments, 3) + assert_equals(pull_request.diff_url, + 'https://github.com/ask/python-github2/pull/39.diff') + assert_equals(pull_request.patch_url, + 'https://github.com/ask/python-github2/pull/39.patch') + assert_equals(pull_request.labels, []) + assert_equals(pull_request.html_url, + 'https://github.com/ask/python-github2/pull/39') + assert_equals(pull_request.issue_created_at, + datetime(2011, 4, 18, 15, 25, 47)) + assert_equals(pull_request.issue_updated_at, + datetime(2011, 5, 29, 15, 37, 8)) + assert_equals(pull_request.created_at, + datetime(2011, 4, 30, 12, 37, 40)) + assert_equals(pull_request.updated_at, + datetime(2011, 6, 7, 13, 56, 50)) + assert_equals(pull_request.closed_at, None) + assert_equals(len(pull_request.discussion), 13) + assert_equals(pull_request.mergeable, False) + def test_repr(self): pull_request = self.client.pull_requests.show('ask/python-github2', 39) assert_equals(repr(pull_request), From bf35a12199ae8431bf321fa6e4ee6e596b5137ba Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 11:19:32 +0100 Subject: [PATCH 300/454] Added naive datetime implementation. --- doc/api/core.rst | 2 -- github2/core.py | 51 +++++++++++++++++------------------------------- 2 files changed, 18 insertions(+), 35 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index 03e3bd1..2149619 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -8,8 +8,6 @@ Core of the :mod:`github2` package, but it is documented to aid contributors to the package. -.. autofunction:: strptime - .. autofunction:: ghdate_to_datetime .. autofunction:: datetime_to_ghdate diff --git a/github2/core.py b/github2/core.py index 8cc68f9..87fd82c 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,31 +1,17 @@ import sys -import time from datetime import datetime +from dateutil import (parser, tz) + #: Running under Python 3 PY3K = sys.version_info[0] == 3 and True or False - -GITHUB_TIMEZONE = "-0700" -GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S" -#2009-03-21T18:01:48-07:00 +GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S %z" +# We need to manually mangle the timezone for commit date formatting because it +# uses -xx:xx format COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" -COMMIT_TIMEZONE = "-07:00" - - -def strptime(string, format): - """Parse date strings according to specified format - - We have to create our :obj:`~datetime.datetime` objects indirectly to remain - compatible with Python 2.4, where the :class:`~datetime.datetime` class has - no :meth:`~datetime.datetime.strptime` method. - - :param str string: String to parse - :param str format: Datetime format - :return datetime: Parsed datetime - """ - return datetime(*(time.strptime(string, format)[:6])) +GITHUB_TZ = tz.gettz("America/Los_Angeles") def ghdate_to_datetime(github_date): @@ -33,8 +19,7 @@ def ghdate_to_datetime(github_date): :param str github_date: date string to parse """ - date_without_tz = " ".join(github_date.strip().split()[:2]) - return strptime(date_without_tz, GITHUB_DATE_FORMAT) + return parser.parse(github_date).replace(tzinfo=None) def datetime_to_ghdate(datetime_): @@ -42,8 +27,8 @@ def datetime_to_ghdate(datetime_): :param datetime datetime_: datetime object to convert """ - date_without_tz = datetime_.strftime(GITHUB_DATE_FORMAT) - return " ".join([date_without_tz, GITHUB_TIMEZONE]) + datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + return datetime_.strftime(GITHUB_DATE_FORMAT) def commitdate_to_datetime(commit_date): @@ -51,8 +36,7 @@ def commitdate_to_datetime(commit_date): :param str github_date: date string to parse """ - date_without_tz = commit_date[:-6] - return strptime(date_without_tz, COMMIT_DATE_FORMAT) + return parser.parse(commit_date).replace(tzinfo=None) def datetime_to_commitdate(datetime_): @@ -60,8 +44,13 @@ def datetime_to_commitdate(datetime_): :param datetime datetime_: datetime object to convert """ + datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) - return "".join([date_without_tz, COMMIT_TIMEZONE]) + utcoffset = GITHUB_TZ.utcoffset(datetime_) + hours, minutes = divmod(utcoffset.days * 86400 + utcoffset.seconds, 3600) + + return "".join([date_without_tz, "%+03d:%02d" % (hours, minutes)]) + def userdate_to_datetime(user_date): @@ -73,10 +62,7 @@ def userdate_to_datetime(user_date): :param str user_date: date string to parse """ - try: - return ghdate_to_datetime(user_date) - except ValueError: - return strptime(user_date, '%Y-%m-%dT%H:%M:%SZ') + return parser.parse(user_date).replace(tzinfo=None) def isodate_to_datetime(iso_date): @@ -84,8 +70,7 @@ def isodate_to_datetime(iso_date): :param str github_date: date string to parse """ - date_without_tz = iso_date[:-1] - return strptime(date_without_tz, COMMIT_DATE_FORMAT) + return parser.parse(iso_date).replace(tzinfo=None) def datetime_to_isodate(datetime_): From 5019b5f0dd27619bfc99162637d709dc1a5e32e6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 11:21:36 +0100 Subject: [PATCH 301/454] Added timezone-aware datetime implementation. --- github2/core.py | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/github2/core.py b/github2/core.py index 87fd82c..abf4cd6 100644 --- a/github2/core.py +++ b/github2/core.py @@ -13,13 +13,20 @@ COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" GITHUB_TZ = tz.gettz("America/Los_Angeles") +# Operate on naive datetime objects, this is the default for backwards +# compatibility +NAIVE = True + def ghdate_to_datetime(github_date): """Convert Github date string to Python datetime :param str github_date: date string to parse """ - return parser.parse(github_date).replace(tzinfo=None) + parsed = parser.parse(github_date) + if NAIVE: + parsed = parsed.replace(tzinfo=None) + return parsed def datetime_to_ghdate(datetime_): @@ -27,7 +34,10 @@ def datetime_to_ghdate(datetime_): :param datetime datetime_: datetime object to convert """ - datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + if not datetime_.tzinfo: + datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + else: + datetime_ = datetime_.astimezone(GITHUB_TZ) return datetime_.strftime(GITHUB_DATE_FORMAT) @@ -36,7 +46,10 @@ def commitdate_to_datetime(commit_date): :param str github_date: date string to parse """ - return parser.parse(commit_date).replace(tzinfo=None) + parsed = parser.parse(commit_date) + if NAIVE: + parsed = parsed.replace(tzinfo=None) + return parsed def datetime_to_commitdate(datetime_): @@ -44,7 +57,10 @@ def datetime_to_commitdate(datetime_): :param datetime datetime_: datetime object to convert """ - datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + if not datetime_.tzinfo: + datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + else: + datetime_ = datetime_.astimezone(GITHUB_TZ) date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) utcoffset = GITHUB_TZ.utcoffset(datetime_) hours, minutes = divmod(utcoffset.days * 86400 + utcoffset.seconds, 3600) @@ -62,7 +78,10 @@ def userdate_to_datetime(user_date): :param str user_date: date string to parse """ - return parser.parse(user_date).replace(tzinfo=None) + parsed = parser.parse(user_date) + if NAIVE: + parsed = parsed.replace(tzinfo=None) + return parsed def isodate_to_datetime(iso_date): @@ -70,7 +89,11 @@ def isodate_to_datetime(iso_date): :param str github_date: date string to parse """ - return parser.parse(iso_date).replace(tzinfo=None) + parsed = parser.parse(iso_date) + if NAIVE: + parsed = parsed.replace(tzinfo=None) + return parsed + def datetime_to_isodate(datetime_): @@ -78,7 +101,11 @@ def datetime_to_isodate(datetime_): :param str datetime_: datetime object to convert """ - return "%sZ" % datetime_.isoformat() + if not datetime_.tzinfo: + datetime_ = datetime_.replace(tzinfo=tz.tzutc()) + else: + datetime_ = datetime_.astimezone(tz.tzutc()) + return "%sZ" % datetime_.isoformat()[:-6] class AuthError(Exception): From 606db7c1d930c111d5766f21c49e8d66f1faf353 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 11:27:30 +0100 Subject: [PATCH 302/454] Document core.NAIVE. --- doc/api/core.rst | 4 ++++ github2/core.py | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index 2149619..9bb73f3 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -8,6 +8,10 @@ Core of the :mod:`github2` package, but it is documented to aid contributors to the package. +.. autodata:: NAIVE(bool) + + Set to ``False`` for timezone-aware :class:`datetime.datetime` objects + .. autofunction:: ghdate_to_datetime .. autofunction:: datetime_to_ghdate diff --git a/github2/core.py b/github2/core.py index abf4cd6..b1622cf 100644 --- a/github2/core.py +++ b/github2/core.py @@ -13,8 +13,8 @@ COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" GITHUB_TZ = tz.gettz("America/Los_Angeles") -# Operate on naive datetime objects, this is the default for backwards -# compatibility +#: Operate on naive :class:`datetime.datetime` objects, this is the default +#: for backwards compatibility NAIVE = True From 7cf2c6d475000eb6e0d38770f7dcc379769922f2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 13 Jun 2011 05:12:55 +0100 Subject: [PATCH 303/454] Updated documentation to reflect switch to logging. --- doc/bugs.rst | 6 +++--- doc/problems.rst | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/doc/bugs.rst b/doc/bugs.rst index 28a9bd7..2226397 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -22,9 +22,9 @@ hard to track down the actual cause of a bug. The first step when you've found a bug should be to test it directly, to rule out a temporary problem with GitHub or a deficiency in the API. -You can check which URLs your code is requesting using the ``debug`` argument -when you create your :class:`~github2.client.Github` object. See -:doc:`problems` for information on using the ``debug`` support. +You can check which URLs your code is requesting by enabling +:data:`~logging.DEBUG` level output in your logger, see the +:mod:`python:logging` for more information. If the bug you've found is outside the reach of this project an issue should be opened in GitHub's `API support forum`_. It doesn't hurt to `report an issue`_ diff --git a/doc/problems.rst b/doc/problems.rst index acf4fb3..1edd5b1 100644 --- a/doc/problems.rst +++ b/doc/problems.rst @@ -1,17 +1,25 @@ Solving problems ================ -The client object, :class:`~github2.client.Github`, supports a ``debug`` keyword -argument that is invaluable for troubleshooting. Enabling the ``debug`` -functionality will produce output on :data:`sys.stderr` in certain situations. +:mod:`github2` uses :mod:`logging` to report warnings, errors and debug messages +to the library's user. The Python documentation includes thorough documentation +for the :mod:`logging` module, and a :ref:`wonderful tutorial +`. + +.. note:: + + If there is more data you'd like the library to exposed then open an issue_, + or even better a pull request! + +.. _issue: https://github.com/ask/python-github2/issues/ Request data '''''''''''' -With ``debug`` enabled a message will be produced every time an API request is -made. +With the ``DEBUG`` logging level enabled a message will be produced every time +an API request is made. - >>> github = Github(debug=True) + >>> github = Github() >>> user = github.users.show("JNRowe") URL:[https://github.com/api/v2/json/user/show/JNRowe] POST_DATA:None @@ -22,16 +30,14 @@ made. In the message you can see the URL that was accessed, here ``https://github.com/api/v2/json/user/show/JNRowe``. You'll also see any HTTP ``post`` method data that was sent, in this case there was none. And the full -response from GitHub, here the user data of JNRowe. - -It has no other affect on the code. +response from GitHub, here the user data of ``JNRowe``. Rate limiting ''''''''''''' If rate limiting is enabled, with the ``requests_per_second`` when creating a -:class:`~github2.client.Github` object, then you'll see a message when a request -has been delayed. +:class:`~github2.client.Github` object, then you'll see a ``WARNING`` level +message when a request has been delayed. >>> github = Github(requests_per_second=0.2, debug=True) >>> user = github.users.show("JNRowe") From 608aeb6c6bc8a98a940515070d77e09d68b787d8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 20 Jun 2011 17:22:29 +0100 Subject: [PATCH 304/454] Removed unused import. --- github2/request.py | 1 - 1 file changed, 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 05d407d..5ed5730 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,7 +1,6 @@ import datetime import logging import re -import sys import time import httplib2 try: From 0786a96c80afad7bbd0747df590f649eaa46ca04 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 20 Jun 2011 17:38:16 +0100 Subject: [PATCH 305/454] The direct logging howto link isn't available in 2.7 docs. Switch back to intersphinx when it becomes available. --- doc/problems.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/problems.rst b/doc/problems.rst index 1edd5b1..90021af 100644 --- a/doc/problems.rst +++ b/doc/problems.rst @@ -3,8 +3,7 @@ Solving problems :mod:`github2` uses :mod:`logging` to report warnings, errors and debug messages to the library's user. The Python documentation includes thorough documentation -for the :mod:`logging` module, and a :ref:`wonderful tutorial -`. +for the :mod:`logging` module, and a `wonderful tutorial`_. .. note:: @@ -12,6 +11,7 @@ for the :mod:`logging` module, and a :ref:`wonderful tutorial or even better a pull request! .. _issue: https://github.com/ask/python-github2/issues/ +.. _wonderful tutorial: http://docs.python.org/howto/logging.html Request data '''''''''''' From 674806b6138a537182f029d8c7ad8ad8787bd03f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 22 Jun 2011 21:00:50 +0100 Subject: [PATCH 306/454] Added repo search script. --- github2/bin/search_repos.py | 64 +++++++++++++++++++++++++++++++++++++ setup.py | 5 ++- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100755 github2/bin/search_repos.py diff --git a/github2/bin/search_repos.py b/github2/bin/search_repos.py new file mode 100755 index 0000000..75b295c --- /dev/null +++ b/github2/bin/search_repos.py @@ -0,0 +1,64 @@ +#! /usr/bin/env python +# coding: utf-8 +"""github_search_repos - search for repositories on GitHub""" + + +import logging +import sys + +from optparse import OptionParser +from textwrap import wrap + +import github2.client + + +def parse_commandline(): + """Parse the comandline and return parsed options.""" + + parser = OptionParser() + parser.description = __doc__ + + parser.set_usage('usage: %prog [options] ') + parser.add_option('-d', '--debug', action='store_true', + help='Enables debugging mode') + parser.add_option('-c', '--cache', default=None, + help='Location for network cache [default: None]') + + options, args = parser.parse_args() + if len(args) != 1: + parser.error('wrong number of arguments') + + return options, args[0] + + +def main(): + """This implements the actual program functionality""" + return_value = 0 + + options, term = parse_commandline() + + github = github2.client.Github(cache=options.cache) + + # PEP-308 conditional expressions are much better, but we're keeping Py2.4 + # compatibility elsewhere. + logging.basicConfig(level=options.debug and logging.DEBUG or logging.WARN, + format="%(asctime)s - %(message)s", + datefmt="%Y-%m-%dT%H:%M:%S") + + repos = github.repos.search(term) + if not repos: + print 'No repos found!' + return_value = 255 + else: + for repo in repos: + print repo.project + if repo.description: + print '\n'.join(wrap(repo.description, initial_indent=' ', + subsequent_indent=' ')) + + logging.shutdown() + return return_value + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/setup.py b/setup.py index 9ff9a92..139b5c8 100755 --- a/setup.py +++ b/setup.py @@ -33,7 +33,10 @@ platforms=["any"], packages=find_packages(exclude=['tests']), entry_points={ - 'console_scripts': ['github_manage_collaborators = github2.bin.manage_collaborators:main', ] + 'console_scripts': [ + 'github_manage_collaborators = github2.bin.manage_collaborators:main', + 'github_search_repos = github2.bin.search_repos:main', + ], }, install_requires=install_requires, zip_safe=True, From 5ccc9a1549cd27f52f33cc3517772e67c20f21cc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 22 Jun 2011 21:03:51 +0100 Subject: [PATCH 307/454] Switched the purdy cloud Sphinx theme. --- doc/conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index e929731..0e68b1a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -13,6 +13,8 @@ import sys, os +import cloud_sptheme as csp + # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. @@ -94,19 +96,17 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = 'cloud' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { - "rightsidebar": True, - "stickysidebar": True, "externalrefs": True, } # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +html_theme_path = [csp.get_theme_dir(), ] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". From 813b7bab3f1d8c0123ac25f55f823a874d79defa Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 22 Jun 2011 21:04:17 +0100 Subject: [PATCH 308/454] Updated intersphinx mapping setup. This makes it much easier to override with a local tag database. --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 0e68b1a..262c466 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -225,4 +225,4 @@ autoclass_content = "init" autodoc_default_flags = ['members', ] -intersphinx_mapping = {'http://docs.python.org/': None} +intersphinx_mapping = {'python': ('http://docs.python.org/', None)} From ad4086b4bd0bd20f765adbe0ce3366a66eee3afd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 23 Jun 2011 10:23:40 +0100 Subject: [PATCH 309/454] Drop experimental status. Backward compatibility is being maintained, the upstream API is frozen and the package is definitely in stable use in various projects. --- README.rst | 7 ++----- doc/index.rst | 7 ++----- setup.py | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 595a174..1f0f6e7 100644 --- a/README.rst +++ b/README.rst @@ -6,11 +6,8 @@ github2 - Github API v2 library for Python. Ask Solem (askh@opera.com) :Version: 0.4.1 -This is an experimental python library implementing all of the features -available in version 2 of the `Github API`_. - -*Note* This software is not finished. And is likely to change in the near -future. +This is a Python library implementing all of the features available in version 2 +of the `Github API`_. See the ``doc/`` directory for installation instructions and usage information. If you prefer you can also read the `documentation online`_. diff --git a/doc/index.rst b/doc/index.rst index 31aa57a..8656174 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -17,14 +17,11 @@ :prefix: Download :class: sidebar -This is an experimental Python library implementing all of the features -available in version 2 of the `Github API`_. +This is a Python library implementing all of the features available in version 2 +of the `Github API`_. You should read the developer documentation for the `Github API`_ first. -.. Note:: - This software is not finished. And is likely to change in the near future. - :Git repository: https://github.com/ask/python-github2/ :Issue tracker: https://github.com/ask/python-github2/issues/ :Contributors: https://github.com/ask/python-github2/contributors/ diff --git a/setup.py b/setup.py index 139b5c8..d0fe0b1 100755 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ 'SOCKS': ['SocksiPy-branch==1.01'], }, classifiers=[ - "Development Status :: 3 - Alpha", + "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", From eb3c39179652dd38b18119b9359bd6b66218a994 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 30 Apr 2011 11:30:36 +0100 Subject: [PATCH 310/454] Added python-dateutil to requirements. --- doc/install.rst | 13 ++++++++----- setup.py | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/doc/install.rst b/doc/install.rst index 9625a42..3838de3 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -21,8 +21,11 @@ following:: $ python setup.py install --user # to install for a single user :mod:`github2` depends on :pypi:`httplib2`, an excellent package by Joe Gregorio -for handling HTTP sessions. :pypi:`simplejson` is also required when using -:mod:`github2` with Python 2.4 or 2.5. If you install via :pypi:`pip` or -:pypi:`easy_install ` the dependencies should be installed -automatically for you. :pypi:`SocksiPy-branch` is an optional dependency if -proxy support is needed. +for handling HTTP sessions. :pypi:`python-dateutil` is used for its date +handling [#]_. :pypi:`simplejson` is also required when using :mod:`github2` +with Python 2.4 or 2.5. If you install via :pypi:`pip` or :pypi:`easy_install +` the dependencies should be installed automatically for you. +:pypi:`SocksiPy-branch` is an optional dependency if proxy support is needed. + +.. [#] You must use :pypi:`python-dateutil` 1.x when working with Python 2.x, + the latest 2.x releases are for Python 3.x installations only. diff --git a/setup.py b/setup.py index 9ff9a92..8adb7d2 100755 --- a/setup.py +++ b/setup.py @@ -15,7 +15,10 @@ extra = {} if sys.version_info >= (3,): + install_requires.append('python-dateutil >= 2.0') extra['use_2to3'] = True +else: + install_requires.append('python-dateutil < 2.0') long_description = (codecs.open('README.rst', "r", "utf-8").read() + "\n" + codecs.open('NEWS.rst', "r", "utf-8").read()) From ee706136b6e1170e7dada74f2e876684aace0a32 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 13 Jun 2011 03:02:14 +0100 Subject: [PATCH 311/454] Added tests for timezone-aware datetimes. --- tests/test_tz_aware_date_handling.py | 181 +++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 tests/test_tz_aware_date_handling.py diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py new file mode 100644 index 0000000..bee0388 --- /dev/null +++ b/tests/test_tz_aware_date_handling.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- + +import _setup + +from datetime import datetime as dt + +from dateutil.tz import tzutc +from nose.tools import assert_equals + +from github2 import core +from github2.core import (ghdate_to_datetime, datetime_to_ghdate, + commitdate_to_datetime, datetime_to_commitdate, + isodate_to_datetime, datetime_to_isodate) + + +def setup_module(): + """Enable timezone-aware datetime handling for this module's tests""" + core.NAIVE = False + + +def teardown_module(): + """Disable timezone-aware datetime handling when finished with this module""" + core.NAIVE = True + + +def dt_utz(year, month, day, hour, minute, second): + """Produce a UTC-anchored datetime object + + :see: ``datetime.datetime`` + """ + return dt(year, month, day, hour, minute, second, tzinfo=tzutc()) + + +def test_ghdate_to_datetime(): + assert_equals(ghdate_to_datetime('2011/05/22 00:24:15 -0700'), + dt_utz(2011, 5, 22, 7, 24, 15)) + assert_equals(ghdate_to_datetime('2009/04/18 13:04:09 -0700'), + dt_utz(2009, 4, 18, 20, 4, 9)) + assert_equals(ghdate_to_datetime('2009/11/12 21:15:17 -0800'), + dt_utz(2009, 11, 13, 5, 15, 17)) + assert_equals(ghdate_to_datetime('2009/11/12 21:16:20 -0800'), + dt_utz(2009, 11, 13, 5, 16, 20)) + assert_equals(ghdate_to_datetime('2010/04/17 17:24:29 -0700'), + dt_utz(2010, 4, 18, 0, 24, 29)) + assert_equals(ghdate_to_datetime('2010/05/18 06:10:36 -0700'), + dt_utz(2010, 5, 18, 13, 10, 36)) + assert_equals(ghdate_to_datetime('2010/05/25 21:59:37 -0700'), + dt_utz(2010, 5, 26, 4, 59, 37)) + assert_equals(ghdate_to_datetime('2010/05/26 17:08:41 -0700'), + dt_utz(2010, 5, 27, 0, 8, 41)) + assert_equals(ghdate_to_datetime('2010/06/20 06:13:37 -0700'), + dt_utz(2010, 6, 20, 13, 13, 37)) + assert_equals(ghdate_to_datetime('2010/07/28 12:56:51 -0700'), + dt_utz(2010, 7, 28, 19, 56, 51)) + assert_equals(ghdate_to_datetime('2010/09/20 21:32:49 -0700'), + dt_utz(2010, 9, 21, 4, 32, 49)) + + +def test_datetime_to_ghdate(): + assert_equals(datetime_to_ghdate(dt_utz(2011, 5, 22, 7, 24, 15)), + '2011/05/22 00:24:15 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2009, 4, 18, 20, 4, 9)), + '2009/04/18 13:04:09 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 15, 17)), + '2009/11/12 20:15:17 -0800') + assert_equals(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 16, 20)), + '2009/11/12 20:16:20 -0800') + assert_equals(datetime_to_ghdate(dt_utz(2010, 4, 18, 0, 24, 29)), + '2010/04/17 17:24:29 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 18, 13, 10, 36)), + '2010/05/18 06:10:36 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 26, 5, 59, 37)), + '2010/05/25 22:59:37 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 27, 0, 8, 41)), + '2010/05/26 17:08:41 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 6, 20, 13, 13, 37)), + '2010/06/20 06:13:37 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 7, 28, 19, 56, 51)), + '2010/07/28 12:56:51 -0700') + assert_equals(datetime_to_ghdate(dt_utz(2010, 9, 21, 4, 32, 49)), + '2010/09/20 21:32:49 -0700') + + +def test_commitdate_to_datetime(): + assert_equals(commitdate_to_datetime('2011-05-22T00:24:15-07:00'), + dt_utz(2011, 5, 22, 7, 24, 15)) + assert_equals(commitdate_to_datetime('2011-04-09T10:07:30-07:00'), + dt_utz(2011, 4, 9, 17, 7, 30)) + assert_equals(commitdate_to_datetime('2011-02-19T07:16:11-08:00'), + dt_utz(2011, 2, 19, 15, 16, 11)) + assert_equals(commitdate_to_datetime('2010-12-21T12:34:27-08:00'), + dt_utz(2010, 12, 21, 20, 34, 27)) + assert_equals(commitdate_to_datetime('2011-04-09T10:20:05-07:00'), + dt_utz(2011, 4, 9, 17, 20, 5)) + assert_equals(commitdate_to_datetime('2011-04-09T10:05:58-07:00'), + dt_utz(2011, 4, 9, 17, 5, 58)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) + assert_equals(commitdate_to_datetime('2011-04-09T10:00:21-07:00'), + dt_utz(2011, 4, 9, 17, 0, 21)) + assert_equals(commitdate_to_datetime('2010-12-16T15:10:59-08:00'), + dt_utz(2010, 12, 16, 23, 10, 59)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) + assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) + + +def test_datetime_to_commitdate(): + assert_equals(datetime_to_commitdate(dt_utz(2011, 5, 22, 7, 24, 15)), + '2011-05-22T00:24:15-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 7, 30)), + '2011-04-09T10:07:30-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 2, 19, 15, 16, 11)), + '2011-02-19T07:16:11-08:00') + assert_equals(datetime_to_commitdate(dt_utz(2010, 12, 21, 20, 34, 27)), + '2010-12-21T12:34:27-08:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 20, 5)), + '2011-04-09T10:20:05-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 5, 58)), + '2011-04-09T10:05:58-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 0, 21)), + '2011-04-09T10:00:21-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2010, 12, 16, 23, 10, 59)), + '2010-12-16T15:10:59-08:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') + assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') + + +def test_isodate_to_datetime(): + assert_equals(isodate_to_datetime('2011-05-22T00:24:15Z'), + dt_utz(2011, 5, 22, 0, 24, 15)) + assert_equals(isodate_to_datetime('2011-04-09T10:07:30Z'), + dt_utz(2011, 4, 9, 10, 7, 30)) + assert_equals(isodate_to_datetime('2011-02-19T07:16:11Z'), + dt_utz(2011, 2, 19, 7, 16, 11)) + assert_equals(isodate_to_datetime('2010-12-21T12:34:27Z'), + dt_utz(2010, 12, 21, 12, 34, 27)) + assert_equals(isodate_to_datetime('2011-04-09T10:20:05Z'), + dt_utz(2011, 4, 9, 10, 20, 5)) + assert_equals(isodate_to_datetime('2011-04-09T10:05:58Z'), + dt_utz(2011, 4, 9, 10, 5, 58)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) + assert_equals(isodate_to_datetime('2011-04-09T10:00:21Z'), + dt_utz(2011, 4, 9, 10, 0, 21)) + assert_equals(isodate_to_datetime('2010-12-16T15:10:59Z'), + dt_utz(2010, 12, 16, 15, 10, 59)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) + assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) + + +def test_datetime_to_isodate(): + assert_equals(datetime_to_isodate(dt_utz(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 7, 30)), + '2011-04-09T10:07:30Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 2, 19, 7, 16, 11)), + '2011-02-19T07:16:11Z') + assert_equals(datetime_to_isodate(dt_utz(2010, 12, 21, 12, 34, 27)), + '2010-12-21T12:34:27Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 20, 5)), + '2011-04-09T10:20:05Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 5, 58)), + '2011-04-09T10:05:58Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 0, 21)), + '2011-04-09T10:00:21Z') + assert_equals(datetime_to_isodate(dt_utz(2010, 12, 16, 15, 10, 59)), + '2010-12-16T15:10:59Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') From f88175dcedbdde0cd2ca2de723283be7796004d2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 13 Jun 2011 03:15:02 +0100 Subject: [PATCH 312/454] Refactoring of datetime parsing. --- doc/api/core.rst | 9 +--- github2/core.py | 69 ++++----------------------- tests/test_date_handling.py | 71 ++++++++++++++-------------- tests/test_tz_aware_date_handling.py | 71 ++++++++++++++-------------- 4 files changed, 81 insertions(+), 139 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index 9bb73f3..e729d2b 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -12,15 +12,10 @@ Core Set to ``False`` for timezone-aware :class:`datetime.datetime` objects -.. autofunction:: ghdate_to_datetime -.. autofunction:: datetime_to_ghdate +.. autofunction:: string_to_datetime -.. autofunction:: commitdate_to_datetime +.. autofunction:: datetime_to_ghdate .. autofunction:: datetime_to_commitdate - -.. autofunction:: userdate_to_datetime - -.. autofunction:: isodate_to_datetime .. autofunction:: datetime_to_isodate .. autofunction:: requires_auth diff --git a/github2/core.py b/github2/core.py index b1622cf..393d822 100644 --- a/github2/core.py +++ b/github2/core.py @@ -18,12 +18,12 @@ NAIVE = True -def ghdate_to_datetime(github_date): - """Convert Github date string to Python datetime +def string_to_datetime(string): + """Convert a string to Python datetime :param str github_date: date string to parse """ - parsed = parser.parse(github_date) + parsed = parser.parse(string) if NAIVE: parsed = parsed.replace(tzinfo=None) return parsed @@ -41,17 +41,6 @@ def datetime_to_ghdate(datetime_): return datetime_.strftime(GITHUB_DATE_FORMAT) -def commitdate_to_datetime(commit_date): - """Convert commit date string to Python datetime - - :param str github_date: date string to parse - """ - parsed = parser.parse(commit_date) - if NAIVE: - parsed = parsed.replace(tzinfo=None) - return parsed - - def datetime_to_commitdate(datetime_): """Convert Python datetime to Github date string @@ -68,34 +57,6 @@ def datetime_to_commitdate(datetime_): return "".join([date_without_tz, "%+03d:%02d" % (hours, minutes)]) - -def userdate_to_datetime(user_date): - """Convert user date string to Python datetime - - Unfortunately this needs a special case because :meth:`~Github.users.show` - and :meth:`~Github.users.search` return different formats for the - ``created_at`` attributes. - - :param str user_date: date string to parse - """ - parsed = parser.parse(user_date) - if NAIVE: - parsed = parsed.replace(tzinfo=None) - return parsed - - -def isodate_to_datetime(iso_date): - """Convert commit date string to Python datetime - - :param str github_date: date string to parse - """ - parsed = parser.parse(iso_date) - if NAIVE: - parsed = parsed.replace(tzinfo=None) - return parsed - - - def datetime_to_isodate(datetime_): """Convert Python datetime to Github date string @@ -223,22 +184,10 @@ def to_python(self, value): class DateAttribute(Attribute): format = "github" converter_for_format = { - "github": { - "to": ghdate_to_datetime, - "from": datetime_to_ghdate, - }, - "commit": { - "to": commitdate_to_datetime, - "from": datetime_to_commitdate, - }, - "user": { - "to" : userdate_to_datetime, - "from": datetime_to_ghdate, - }, - "iso": { - "to": isodate_to_datetime, - "from": datetime_to_isodate, - } + "github": datetime_to_ghdate, + "commit": datetime_to_commitdate, + "user": datetime_to_ghdate, + "iso": datetime_to_isodate, } def __init__(self, *args, **kwargs): @@ -247,12 +196,12 @@ def __init__(self, *args, **kwargs): def to_python(self, value): if value and not isinstance(value, datetime): - return self.converter_for_format[self.format]["to"](value) + return string_to_datetime(value) return value def from_python(self, value): if value and isinstance(value, datetime): - return self.converter_for_format[self.format]["from"](value) + return self.converter_for_format[self.format](value) return value diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index 87a3089..591bb2c 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -6,37 +6,36 @@ from nose.tools import assert_equals -from github2.core import (ghdate_to_datetime, datetime_to_ghdate, - commitdate_to_datetime, datetime_to_commitdate, - isodate_to_datetime, datetime_to_isodate) +from github2.core import (datetime_to_ghdate, datetime_to_commitdate, + datetime_to_isodate, string_to_datetime) # Commented test cases are in PST, and aren't correctly handled with the # naïve datetime objects used in the current code base def test_ghdate_to_datetime(): - assert_equals(ghdate_to_datetime('2011/05/22 00:24:15 -0700'), + assert_equals(string_to_datetime('2011/05/22 00:24:15 -0700'), dt(2011, 5, 22, 0, 24, 15)) - assert_equals(ghdate_to_datetime('2009/04/18 13:04:09 -0700'), + assert_equals(string_to_datetime('2009/04/18 13:04:09 -0700'), dt(2009, 4, 18, 13, 4, 9)) - #assert_equals(ghdate_to_datetime('2009/11/12 21:15:17 -0800'), + #assert_equals(string_to_datetime('2009/11/12 21:15:17 -0800'), # dt(2009, 11, 12, 21, 15, 17)) - #assert_equals(ghdate_to_datetime('2009/11/12 21:16:20 -0800'), + #assert_equals(string_to_datetime('2009/11/12 21:16:20 -0800'), # dt(2009, 11, 12, 21, 16, 20)) - assert_equals(ghdate_to_datetime('2010/04/17 17:24:29 -0700'), + assert_equals(string_to_datetime('2010/04/17 17:24:29 -0700'), dt(2010, 4, 17, 17, 24, 29)) - assert_equals(ghdate_to_datetime('2010/05/18 06:10:36 -0700'), + assert_equals(string_to_datetime('2010/05/18 06:10:36 -0700'), dt(2010, 5, 18, 6, 10, 36)) - assert_equals(ghdate_to_datetime('2010/05/25 21:59:37 -0700'), + assert_equals(string_to_datetime('2010/05/25 21:59:37 -0700'), dt(2010, 5, 25, 21, 59, 37)) - assert_equals(ghdate_to_datetime('2010/05/26 17:08:41 -0700'), + assert_equals(string_to_datetime('2010/05/26 17:08:41 -0700'), dt(2010, 5, 26, 17, 8, 41)) - assert_equals(ghdate_to_datetime('2010/06/20 06:13:37 -0700'), + assert_equals(string_to_datetime('2010/06/20 06:13:37 -0700'), dt(2010, 6, 20, 6, 13, 37)) - assert_equals(ghdate_to_datetime('2010/07/28 12:56:51 -0700'), + assert_equals(string_to_datetime('2010/07/28 12:56:51 -0700'), dt(2010, 7, 28, 12, 56, 51)) - assert_equals(ghdate_to_datetime('2010/09/20 21:32:49 -0700'), + assert_equals(string_to_datetime('2010/09/20 21:32:49 -0700'), dt(2010, 9, 20, 21, 32, 49)) @@ -67,28 +66,28 @@ def test_datetime_to_ghdate(): def test_commitdate_to_datetime(): - assert_equals(commitdate_to_datetime('2011-05-22T00:24:15-07:00'), + assert_equals(string_to_datetime('2011-05-22T00:24:15-07:00'), dt(2011, 5, 22, 0, 24, 15)) - assert_equals(commitdate_to_datetime('2011-04-09T10:07:30-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:07:30-07:00'), dt(2011, 4, 9, 10, 7, 30)) - #assert_equals(commitdate_to_datetime('2011-02-19T07:16:11-08:00'), + #assert_equals(string_to_datetime('2011-02-19T07:16:11-08:00'), # dt(2011, 2, 19, 7, 16, 11)) - #assert_equals(commitdate_to_datetime('2010-12-21T12:34:27-08:00'), + #assert_equals(string_to_datetime('2010-12-21T12:34:27-08:00'), # dt(2010, 12, 21, 12, 34, 27)) - assert_equals(commitdate_to_datetime('2011-04-09T10:20:05-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:20:05-07:00'), dt(2011, 4, 9, 10, 20, 5)) - assert_equals(commitdate_to_datetime('2011-04-09T10:05:58-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:05:58-07:00'), dt(2011, 4, 9, 10, 5, 58)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt(2011, 4, 9, 9, 53, 0)) - assert_equals(commitdate_to_datetime('2011-04-09T10:00:21-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:00:21-07:00'), dt(2011, 4, 9, 10, 0, 21)) - #assert_equals(commitdate_to_datetime('2010-12-16T15:10:59-08:00'), + #assert_equals(string_to_datetime('2010-12-16T15:10:59-08:00'), # dt(2010, 12, 16, 15, 10, 59)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt(2011, 4, 9, 9, 53, 0)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt(2011, 4, 9, 9, 53, 0)) @@ -118,27 +117,27 @@ def test_datetime_to_commitdate(): '2011-04-09T09:53:00-07:00') def test_isodate_to_datetime(): - assert_equals(isodate_to_datetime('2011-05-22T00:24:15Z'), + assert_equals(string_to_datetime('2011-05-22T00:24:15Z'), dt(2011, 5, 22, 0, 24, 15)) - assert_equals(isodate_to_datetime('2011-04-09T10:07:30Z'), + assert_equals(string_to_datetime('2011-04-09T10:07:30Z'), dt(2011, 4, 9, 10, 7, 30)) - assert_equals(isodate_to_datetime('2011-02-19T07:16:11Z'), + assert_equals(string_to_datetime('2011-02-19T07:16:11Z'), dt(2011, 2, 19, 7, 16, 11)) - assert_equals(isodate_to_datetime('2010-12-21T12:34:27Z'), + assert_equals(string_to_datetime('2010-12-21T12:34:27Z'), dt(2010, 12, 21, 12, 34, 27)) - assert_equals(isodate_to_datetime('2011-04-09T10:20:05Z'), + assert_equals(string_to_datetime('2011-04-09T10:20:05Z'), dt(2011, 4, 9, 10, 20, 5)) - assert_equals(isodate_to_datetime('2011-04-09T10:05:58Z'), + assert_equals(string_to_datetime('2011-04-09T10:05:58Z'), dt(2011, 4, 9, 10, 5, 58)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) - assert_equals(isodate_to_datetime('2011-04-09T10:00:21Z'), + assert_equals(string_to_datetime('2011-04-09T10:00:21Z'), dt(2011, 4, 9, 10, 0, 21)) - assert_equals(isodate_to_datetime('2010-12-16T15:10:59Z'), + assert_equals(string_to_datetime('2010-12-16T15:10:59Z'), dt(2010, 12, 16, 15, 10, 59)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index bee0388..c2e07c6 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -8,9 +8,8 @@ from nose.tools import assert_equals from github2 import core -from github2.core import (ghdate_to_datetime, datetime_to_ghdate, - commitdate_to_datetime, datetime_to_commitdate, - isodate_to_datetime, datetime_to_isodate) +from github2.core import (datetime_to_ghdate, datetime_to_commitdate, + datetime_to_isodate, string_to_datetime) def setup_module(): @@ -32,27 +31,27 @@ def dt_utz(year, month, day, hour, minute, second): def test_ghdate_to_datetime(): - assert_equals(ghdate_to_datetime('2011/05/22 00:24:15 -0700'), + assert_equals(string_to_datetime('2011/05/22 00:24:15 -0700'), dt_utz(2011, 5, 22, 7, 24, 15)) - assert_equals(ghdate_to_datetime('2009/04/18 13:04:09 -0700'), + assert_equals(string_to_datetime('2009/04/18 13:04:09 -0700'), dt_utz(2009, 4, 18, 20, 4, 9)) - assert_equals(ghdate_to_datetime('2009/11/12 21:15:17 -0800'), + assert_equals(string_to_datetime('2009/11/12 21:15:17 -0800'), dt_utz(2009, 11, 13, 5, 15, 17)) - assert_equals(ghdate_to_datetime('2009/11/12 21:16:20 -0800'), + assert_equals(string_to_datetime('2009/11/12 21:16:20 -0800'), dt_utz(2009, 11, 13, 5, 16, 20)) - assert_equals(ghdate_to_datetime('2010/04/17 17:24:29 -0700'), + assert_equals(string_to_datetime('2010/04/17 17:24:29 -0700'), dt_utz(2010, 4, 18, 0, 24, 29)) - assert_equals(ghdate_to_datetime('2010/05/18 06:10:36 -0700'), + assert_equals(string_to_datetime('2010/05/18 06:10:36 -0700'), dt_utz(2010, 5, 18, 13, 10, 36)) - assert_equals(ghdate_to_datetime('2010/05/25 21:59:37 -0700'), + assert_equals(string_to_datetime('2010/05/25 21:59:37 -0700'), dt_utz(2010, 5, 26, 4, 59, 37)) - assert_equals(ghdate_to_datetime('2010/05/26 17:08:41 -0700'), + assert_equals(string_to_datetime('2010/05/26 17:08:41 -0700'), dt_utz(2010, 5, 27, 0, 8, 41)) - assert_equals(ghdate_to_datetime('2010/06/20 06:13:37 -0700'), + assert_equals(string_to_datetime('2010/06/20 06:13:37 -0700'), dt_utz(2010, 6, 20, 13, 13, 37)) - assert_equals(ghdate_to_datetime('2010/07/28 12:56:51 -0700'), + assert_equals(string_to_datetime('2010/07/28 12:56:51 -0700'), dt_utz(2010, 7, 28, 19, 56, 51)) - assert_equals(ghdate_to_datetime('2010/09/20 21:32:49 -0700'), + assert_equals(string_to_datetime('2010/09/20 21:32:49 -0700'), dt_utz(2010, 9, 21, 4, 32, 49)) @@ -82,27 +81,27 @@ def test_datetime_to_ghdate(): def test_commitdate_to_datetime(): - assert_equals(commitdate_to_datetime('2011-05-22T00:24:15-07:00'), + assert_equals(string_to_datetime('2011-05-22T00:24:15-07:00'), dt_utz(2011, 5, 22, 7, 24, 15)) - assert_equals(commitdate_to_datetime('2011-04-09T10:07:30-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:07:30-07:00'), dt_utz(2011, 4, 9, 17, 7, 30)) - assert_equals(commitdate_to_datetime('2011-02-19T07:16:11-08:00'), + assert_equals(string_to_datetime('2011-02-19T07:16:11-08:00'), dt_utz(2011, 2, 19, 15, 16, 11)) - assert_equals(commitdate_to_datetime('2010-12-21T12:34:27-08:00'), + assert_equals(string_to_datetime('2010-12-21T12:34:27-08:00'), dt_utz(2010, 12, 21, 20, 34, 27)) - assert_equals(commitdate_to_datetime('2011-04-09T10:20:05-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:20:05-07:00'), dt_utz(2011, 4, 9, 17, 20, 5)) - assert_equals(commitdate_to_datetime('2011-04-09T10:05:58-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:05:58-07:00'), dt_utz(2011, 4, 9, 17, 5, 58)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt_utz(2011, 4, 9, 16, 53, 0)) - assert_equals(commitdate_to_datetime('2011-04-09T10:00:21-07:00'), + assert_equals(string_to_datetime('2011-04-09T10:00:21-07:00'), dt_utz(2011, 4, 9, 17, 0, 21)) - assert_equals(commitdate_to_datetime('2010-12-16T15:10:59-08:00'), + assert_equals(string_to_datetime('2010-12-16T15:10:59-08:00'), dt_utz(2010, 12, 16, 23, 10, 59)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt_utz(2011, 4, 9, 16, 53, 0)) - assert_equals(commitdate_to_datetime('2011-04-09T09:53:00-07:00'), + assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), dt_utz(2011, 4, 9, 16, 53, 0)) @@ -132,27 +131,27 @@ def test_datetime_to_commitdate(): def test_isodate_to_datetime(): - assert_equals(isodate_to_datetime('2011-05-22T00:24:15Z'), + assert_equals(string_to_datetime('2011-05-22T00:24:15Z'), dt_utz(2011, 5, 22, 0, 24, 15)) - assert_equals(isodate_to_datetime('2011-04-09T10:07:30Z'), + assert_equals(string_to_datetime('2011-04-09T10:07:30Z'), dt_utz(2011, 4, 9, 10, 7, 30)) - assert_equals(isodate_to_datetime('2011-02-19T07:16:11Z'), + assert_equals(string_to_datetime('2011-02-19T07:16:11Z'), dt_utz(2011, 2, 19, 7, 16, 11)) - assert_equals(isodate_to_datetime('2010-12-21T12:34:27Z'), + assert_equals(string_to_datetime('2010-12-21T12:34:27Z'), dt_utz(2010, 12, 21, 12, 34, 27)) - assert_equals(isodate_to_datetime('2011-04-09T10:20:05Z'), + assert_equals(string_to_datetime('2011-04-09T10:20:05Z'), dt_utz(2011, 4, 9, 10, 20, 5)) - assert_equals(isodate_to_datetime('2011-04-09T10:05:58Z'), + assert_equals(string_to_datetime('2011-04-09T10:05:58Z'), dt_utz(2011, 4, 9, 10, 5, 58)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt_utz(2011, 4, 9, 9, 53, 0)) - assert_equals(isodate_to_datetime('2011-04-09T10:00:21Z'), + assert_equals(string_to_datetime('2011-04-09T10:00:21Z'), dt_utz(2011, 4, 9, 10, 0, 21)) - assert_equals(isodate_to_datetime('2010-12-16T15:10:59Z'), + assert_equals(string_to_datetime('2010-12-16T15:10:59Z'), dt_utz(2010, 12, 16, 15, 10, 59)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt_utz(2011, 4, 9, 9, 53, 0)) - assert_equals(isodate_to_datetime('2011-04-09T09:53:00Z'), + assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), dt_utz(2011, 4, 9, 9, 53, 0)) From b287bbc3e88edd10fbcbbc23a0ac4a6ce9c73992 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 13 Jun 2011 03:26:45 +0100 Subject: [PATCH 313/454] Remove duplicate timezone mangling in datetime handling. --- github2/core.py | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/github2/core.py b/github2/core.py index 393d822..b7dc19a 100644 --- a/github2/core.py +++ b/github2/core.py @@ -29,27 +29,41 @@ def string_to_datetime(string): return parsed +def _handle_naive_datetimes(f): + """Decorator to make datetime arguments use GitHub timezone + + :param func f: Function to wrap + """ + def wrapper(datetime_): + if not datetime_.tzinfo: + datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) + else: + datetime_ = datetime_.astimezone(GITHUB_TZ) + return f(datetime_) + wrapped = wrapper + wrapped.__name__ = f.__name__ + wrapped.__doc__ = ( + f.__doc__ + + """\n .. note:: Supports naive and timezone-aware datetimes""" + ) + return wrapped + + +@_handle_naive_datetimes def datetime_to_ghdate(datetime_): """Convert Python datetime to Github date string :param datetime datetime_: datetime object to convert """ - if not datetime_.tzinfo: - datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) - else: - datetime_ = datetime_.astimezone(GITHUB_TZ) return datetime_.strftime(GITHUB_DATE_FORMAT) +@_handle_naive_datetimes def datetime_to_commitdate(datetime_): """Convert Python datetime to Github date string :param datetime datetime_: datetime object to convert """ - if not datetime_.tzinfo: - datetime_ = datetime_.replace(tzinfo=GITHUB_TZ) - else: - datetime_ = datetime_.astimezone(GITHUB_TZ) date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) utcoffset = GITHUB_TZ.utcoffset(datetime_) hours, minutes = divmod(utcoffset.days * 86400 + utcoffset.seconds, 3600) @@ -61,6 +75,8 @@ def datetime_to_isodate(datetime_): """Convert Python datetime to Github date string :param str datetime_: datetime object to convert + + .. note:: Supports naive and timezone-aware datetimes """ if not datetime_.tzinfo: datetime_ = datetime_.replace(tzinfo=tz.tzutc()) From 3e4e8bed18d967c0530f3d83f059ee03402f8632 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 13 Jun 2011 03:39:16 +0100 Subject: [PATCH 314/454] Document core.GITHUB_TZ. --- doc/api/core.rst | 5 +++++ github2/core.py | 1 + 2 files changed, 6 insertions(+) diff --git a/doc/api/core.rst b/doc/api/core.rst index e729d2b..bb96daf 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -12,6 +12,11 @@ Core Set to ``False`` for timezone-aware :class:`datetime.datetime` objects +.. autodata:: GITHUB_TZ(datetime.tzinfo) + + Timezone used in output from GitHub API, currently defined as + ``America/Los_Angeles`` in the Olson database + .. autofunction:: string_to_datetime .. autofunction:: datetime_to_ghdate diff --git a/github2/core.py b/github2/core.py index b7dc19a..cb6bddc 100644 --- a/github2/core.py +++ b/github2/core.py @@ -11,6 +11,7 @@ # We need to manually mangle the timezone for commit date formatting because it # uses -xx:xx format COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S" +#: GitHub timezone used in API output GITHUB_TZ = tz.gettz("America/Los_Angeles") #: Operate on naive :class:`datetime.datetime` objects, this is the default From eddd99345e82e84935e43244c6556733f8bcd5d0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 23 Jun 2011 10:34:26 +0100 Subject: [PATCH 315/454] Added cloud_sptheme to the tox sphinx env dependency list. --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 36639c3..fd96751 100644 --- a/tox.ini +++ b/tox.ini @@ -23,6 +23,7 @@ commands = [testenv:sphinx] deps = sphinx + cloud_sptheme sphinxcontrib-cheeseshop commands = # Test HTML output From fde9628533a461e1ad175a8892e2b54e5e16f406 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 23 Jun 2011 10:34:52 +0100 Subject: [PATCH 316/454] Updated NEWS entries to eddd993. --- NEWS.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 1d99105..9b66aa7 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,6 +3,17 @@ User-visible changes .. contents:: +``master`` branch +----------------- + +* Support for `pull requests`_ +* Simple logging_ based messages for event tracking and debugging +* Requires python-dateutil_ + +.. _pull requests: http://develop.github.com/p/pulls.html +.. _logging: http://docs.python.org/library/logging.html +.. _python-dateutil: http://pypi.python.org/pypi/python-dateutil + 0.4.0 - 2011-05-23 ------------------ From b2750877d756dedef6baf777cbd233ce97bb4b1f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 24 Jun 2011 11:14:55 +0100 Subject: [PATCH 317/454] Bumped version to 0.5.0. --- NEWS.rst | 4 ++-- README.rst | 2 +- github2/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 9b66aa7..0ad44ba 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,8 +3,8 @@ User-visible changes .. contents:: -``master`` branch ------------------ +0.5.0 - 2011-05-24 +------------------ * Support for `pull requests`_ * Simple logging_ based messages for event tracking and debugging diff --git a/README.rst b/README.rst index 1f0f6e7..01f92a6 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.4.1 +:Version: 0.5.0 This is a Python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index c5e89fa..72465f6 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 4, 1) +VERSION = (0, 5, 0) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From ea047793a8438086bfed132a607dbd6d12cd03aa Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 24 Jun 2011 14:27:35 +0100 Subject: [PATCH 318/454] Added hubugs to the 'in the wild' list. --- doc/wild.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 9963be5..17dd41b 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -32,6 +32,16 @@ listed on this page. :PyPI page: :pypi:`ghmiles` +``hubugs`` +'''''''''' + + ``hubugs`` is a very simple client for working with `GitHub's issue + tracker`_. + +:PyPI page: :pypi:`hubugs` + +.. _GitHub's issue tracker: http://github.com/blog/411-github-issue-tracker + ``roundabout`` '''''''''''''' From b6c7efcd94c7bcc2a117c49d0873c003a783891b Mon Sep 17 00:00:00 2001 From: Rok Garbas Date: Wed, 29 Jun 2011 16:05:03 -0700 Subject: [PATCH 319/454] Added option to list repositories of given organization. --- AUTHORS | 1 + github2/organizations.py | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 038cf0e..379c7ef 100644 --- a/AUTHORS +++ b/AUTHORS @@ -25,3 +25,4 @@ broderboy Patryk Zawadzki Michael Basnight Christopher MacGown +Rok Garbas diff --git a/github2/organizations.py b/github2/organizations.py index ac8e4a2..25df990 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -47,15 +47,21 @@ def list(self): return self.get_values('', filter="organizations", datatype=Organization) - def repositories(self): - """Get list of all repositories in organizations you are member of""" - return self.get_values('repositories', filter="repositories", - datatype=Repository) + def repositories(self, organization=''): + """Get list of all repositories in an organization + + If organization is not given, or is empty, then this will list + repositories for all organizations the authenticated user belongs to. + + :param: str organization: organization to list repositories for + """ + return self.get_values(organization, 'repositories', + filter="repositories", datatype=Repository) def public_repositories(self, organization): """Get list of public repositories in an organization - :param str organization: organization to list repositories for + :param str organization: organization to list public repositories for """ return self.get_values(organization, 'public_repositories', filter="repositories", datatype=Repository) From e1836d821c0cc35194d2f206f84acfde70b9cd94 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 10 Jul 2011 18:56:41 +0100 Subject: [PATCH 320/454] Require httplib2 v0.7 or above. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f97d2c4..dfc5001 100755 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ import github2 -install_requires = ['httplib2', ] +install_requires = ['httplib2 >= 0.7.0', ] # simplejson is included in the standard library since Python 2.6 as json. if sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') From 83fee100b579d1a9a55d1e73037383d9183e3053 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 10 Jul 2011 18:57:09 +0100 Subject: [PATCH 321/454] Added DigiCert certificate for SSL verfication. --- MANIFEST.in | 2 ++ .../DigiCert_High_Assurance_EV_Root_CA.crt | 23 +++++++++++++++++++ github2/request.py | 8 +++++-- setup.py | 2 ++ tests/utils.py | 2 +- 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 github2/DigiCert_High_Assurance_EV_Root_CA.crt diff --git a/MANIFEST.in b/MANIFEST.in index 483e243..ac52cc3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -11,5 +11,7 @@ include doc/Makefile include doc/.templates/layout.html prune doc/.build +include github2/*.crt + include tests/*.py recursive-include tests/data * diff --git a/github2/DigiCert_High_Assurance_EV_Root_CA.crt b/github2/DigiCert_High_Assurance_EV_Root_CA.crt new file mode 100644 index 0000000..9e6810a --- /dev/null +++ b/github2/DigiCert_High_Assurance_EV_Root_CA.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- diff --git a/github2/request.py b/github2/request.py index 5ed5730..b20ef80 100644 --- a/github2/request.py +++ b/github2/request.py @@ -11,6 +11,7 @@ import socks # SOCKS support may not be installed except ImportError: socks = None +from os import path from urlparse import (urlsplit, urlunsplit) try: from urlparse import parse_qs @@ -73,15 +74,18 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } + digicert_ha_cert = path.join(path.dirname(path.abspath(__file__ )), + "DigiCert_High_Assurance_EV_Root_CA.crt") if proxy_host is None: - self._http = httplib2.Http(cache=cache) + self._http = httplib2.Http(cache=cache, ca_certs=digicert_ha_cert) elif proxy_host and socks is None: raise GithubError('Proxy support missing. ' 'Install a Python SOCKS library.') else: proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, proxy_host, proxy_port) - self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) + self._http = httplib2.Http(proxy_info=proxy_info, cache=cache, + ca_certs=digicert_ha_cert) def encode_authentication_data(self, extra_post_data): if self.access_token: diff --git a/setup.py b/setup.py index dfc5001..dad18ea 100755 --- a/setup.py +++ b/setup.py @@ -35,6 +35,8 @@ keywords="git github api", platforms=["any"], packages=find_packages(exclude=['tests']), + include_package_data=True, + package_data={'': ['*.crt', ], }, entry_points={ 'console_scripts': [ 'github_manage_collaborators = github2.bin.manage_collaborators:main', diff --git a/tests/utils.py b/tests/utils.py index 14fc457..d05e258 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -27,7 +27,7 @@ class HttpMock(object): Implementation tests should never span network boundaries """ - def __init__(self, cache=None, timeout=None, proxy_info=None): + def __init__(self, cache=None, timeout=None, proxy_info=None, ca_certs=None): """Create a mock httplib.Http object .. attribute: called_with From a38377d16358054af704e04cb90332875965070e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sun, 10 Jul 2011 19:20:41 +0100 Subject: [PATCH 322/454] socks module is bundled with httplib2 v0.7. As unfortunate as bundling may be, we may as well take advantage of it. --- doc/api/client.rst | 4 +--- doc/install.rst | 1 - github2/request.py | 9 +-------- setup.py | 3 --- tox.ini | 3 --- 5 files changed, 2 insertions(+), 18 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 18cc115..4edc07b 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -42,9 +42,7 @@ API calls are limited by github.com to 1 per second by default. To have the >>> github = Github(username="ask", api_token=".......", ... requests_per_second=1) -If you wish to use the library with a HTTP proxy, you will require a Python -SOCKS module installed. :pypi:`SocksiPy-branch` is the module we test with, but -various forks are available. Pass in the ``proxy_host`` and optionally +If you wish to use a HTTP proxy you can pass in the ``proxy_host`` and ``proxy_port`` settings to enable it. The default for ``proxy_port``, if not given, is 8080:: diff --git a/doc/install.rst b/doc/install.rst index 3838de3..8d309ee 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -25,7 +25,6 @@ for handling HTTP sessions. :pypi:`python-dateutil` is used for its date handling [#]_. :pypi:`simplejson` is also required when using :mod:`github2` with Python 2.4 or 2.5. If you install via :pypi:`pip` or :pypi:`easy_install ` the dependencies should be installed automatically for you. -:pypi:`SocksiPy-branch` is an optional dependency if proxy support is needed. .. [#] You must use :pypi:`python-dateutil` 1.x when working with Python 2.x, the latest 2.x releases are for Python 3.x installations only. diff --git a/github2/request.py b/github2/request.py index b20ef80..6d0a1d8 100644 --- a/github2/request.py +++ b/github2/request.py @@ -7,10 +7,6 @@ import json as simplejson # For Python 2.6 except ImportError: import simplejson -try: - import socks # SOCKS support may not be installed -except ImportError: - socks = None from os import path from urlparse import (urlsplit, urlunsplit) try: @@ -78,11 +74,8 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "DigiCert_High_Assurance_EV_Root_CA.crt") if proxy_host is None: self._http = httplib2.Http(cache=cache, ca_certs=digicert_ha_cert) - elif proxy_host and socks is None: - raise GithubError('Proxy support missing. ' - 'Install a Python SOCKS library.') else: - proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, + proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, proxy_host, proxy_port) self._http = httplib2.Http(proxy_info=proxy_info, cache=cache, ca_certs=digicert_ha_cert) diff --git a/setup.py b/setup.py index dad18ea..0abb26b 100755 --- a/setup.py +++ b/setup.py @@ -47,9 +47,6 @@ zip_safe=True, test_suite="nose.collector", tests_require=['nose'], - extras_require={ - 'SOCKS': ['SocksiPy-branch==1.01'], - }, classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", diff --git a/tox.ini b/tox.ini index fd96751..7a01449 100644 --- a/tox.ini +++ b/tox.ini @@ -6,9 +6,6 @@ envlist = py24, py25, py26, py27, py31, py32, rst, sphinx deps = nose coverage - - # Optional dep, but required for tests - SocksiPy-branch commands = rm -rf build {envpython} setup.py build From 837f0f1dfc1c5e826749f1297b50237c0c3ff054 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Jul 2011 10:54:18 +0100 Subject: [PATCH 323/454] Bumped version to 0.5.1. --- NEWS.rst | 6 ++++++ README.rst | 2 +- github2/__init__.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 0ad44ba..7a8b477 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,6 +3,12 @@ User-visible changes .. contents:: +0.5.1 - 2011-06-11 +------------------ + +* This is a bugfix release for compatibility with the latest httplib2_ release +* httplib2_ v0.7.0, or higher, is required + 0.5.0 - 2011-05-24 ------------------ diff --git a/README.rst b/README.rst index 01f92a6..d28c84e 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.5.0 +:Version: 0.5.1 This is a Python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index 72465f6..b65a729 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 5, 0) +VERSION = (0, 5, 1) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From 1adc5eabc5bf2278e2f1205e901a511ec870470b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionu=C8=9B=20Ar=C8=9B=C4=83ri=C8=99i?= Date: Tue, 12 Jul 2011 11:37:44 +0200 Subject: [PATCH 324/454] Doc fix for PullRequests.create's project parameter --- github2/pull_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index fe8ef1b..c4186b6 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -53,7 +53,7 @@ def create(self, project, base, head, title=None, body=None, issue=None): issue. If an ``issue`` parameter is supplied the pull request is attached to that issue, else a new pull request is created. - :param str project: Github project + :param str project: the Github project to send the pull request to :param str base: branch changes should be pulled into :param str head: branch of the changes to be pulled :param str title: title for pull request From 58c772e84f4fb14c49acba56eb182dae7ce43838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionu=C8=9B=20Ar=C8=9B=C4=83ri=C8=99i?= Date: Tue, 12 Jul 2011 11:41:19 +0200 Subject: [PATCH 325/454] Fail when creating pull request without title or issue. Raises TypeError when creating pull requests, if one of the alternative arguments is not given. --- github2/pull_requests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index c4186b6..09f92e5 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -67,6 +67,10 @@ def create(self, project, base, head, title=None, body=None, issue=None): post_data["title"] = title if body: post_data["body"] = body + else: + raise TypeError("You must either specify a title for the " + "pull request or an issue number to which the " + "pull request should be attached.") pull_request_data = [("pull[%s]" % k, v) for k, v in post_data.items()] return self.get_value(project, post_data=dict(pull_request_data), filter="pull", datatype=PullRequest) From 1924b46ade2ac66fc3986df9381f587bf60133a8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Jul 2011 17:12:10 +0100 Subject: [PATCH 326/454] Reworded pull request creation examples. --- doc/api/pull_requests.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst index 02c26b5..d517fdb 100644 --- a/doc/api/pull_requests.rst +++ b/doc/api/pull_requests.rst @@ -25,7 +25,7 @@ View a pull request Open pull request ''''''''''''''''' -To open a new pull request:: +To open a new pull request against the ``ask/python-github2`` project:: >>> pull = github.pull_requests.create("ask/python-github2", "master", ... "JNRowe:my_new_branch", @@ -33,7 +33,10 @@ To open a new pull request:: >>> pull.number 4 -To attach code to an existing issue:: +This creates a pull request for changes in ``JNRowe``'s ``my_new_branch`` and +asks for it to be merged to ``ask``'s ``master`` branch. + +To attach code to an existing issue and make it a pull request:: >>> pull = github.pull_requests.create("ask/python-github2", "master", ... "JNRowe:my_new_branch", From b6c98f91ead4d3bbb6cac5e5cbb5f26147c1b2e5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Jul 2011 17:30:48 +0100 Subject: [PATCH 327/454] Link to the official API docs in our API docs. --- doc/api/commit.rst | 6 ++++++ doc/api/issues.rst | 6 ++++++ doc/api/network.rst | 4 ++-- doc/api/object.rst | 6 +++++- doc/api/organizations.rst | 8 +++++++- doc/api/pull_requests.rst | 6 +++++- doc/api/repos.rst | 6 ++++++ doc/api/teams.rst | 8 +++++++- doc/api/users.rst | 6 ++++++ 9 files changed, 50 insertions(+), 6 deletions(-) diff --git a/doc/api/commit.rst b/doc/api/commit.rst index 5d4d100..7a37e07 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -3,6 +3,12 @@ Commit ====== +.. note:: + + See the official GitHub API v2 documentation for commits_. + +.. _commits: http://develop.github.com/p/commits.html + .. autoclass:: Commit(type) .. autoclass:: Commits(type) diff --git a/doc/api/issues.rst b/doc/api/issues.rst index f6635a7..6ba740c 100644 --- a/doc/api/issues.rst +++ b/doc/api/issues.rst @@ -3,6 +3,12 @@ Issues ====== +.. note:: + + See the official GitHub API v2 documentation for issues_. + +.. _issues: http://develop.github.com/p/issues.html + .. autoclass:: Issue(type) .. autoclass:: Comment(type) diff --git a/doc/api/network.rst b/doc/api/network.rst index 2825cff..f07baa9 100644 --- a/doc/api/network.rst +++ b/doc/api/network.rst @@ -1,8 +1,8 @@ +.. currentmodule:: github2.client + Network ======= -.. currentmodule:: github2.client - .. automethod:: Github.get_network_meta .. automethod:: Github.get_network_data diff --git a/doc/api/object.rst b/doc/api/object.rst index 29227a3..79842c7 100644 --- a/doc/api/object.rst +++ b/doc/api/object.rst @@ -1,7 +1,11 @@ +.. currentmodule:: github2.client + Object ====== -.. currentmodule:: github2.client +See the official GitHub API v2 documentation for objects_. + +.. _objects: http://develop.github.com/p/object.html .. automethod:: Github.get_all_blobs diff --git a/doc/api/organizations.rst b/doc/api/organizations.rst index a75bc65..fc46950 100644 --- a/doc/api/organizations.rst +++ b/doc/api/organizations.rst @@ -1,7 +1,13 @@ +.. module:: github2.organizations + Organizations ============= -.. currentmodule:: github2.organizations +.. note:: + + See the official GitHub API v2 documentation for `organizations and teams`_. + +.. _organizations and teams: http://develop.github.com/p/orgs.html .. autoclass:: Organization(type) diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst index d517fdb..ea94615 100644 --- a/doc/api/pull_requests.rst +++ b/doc/api/pull_requests.rst @@ -1,7 +1,11 @@ +.. module:: github2.pull_requests + Pull requests ============= -.. py:currentmodule:: github2.pull_requests +See the official GitHub API v2 documentation for `pull requests`_. + +.. _pull_requests: http://develop.github.com/p/pulls.html .. autoclass:: PullRequest(type) diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 161b9b7..45c4b4a 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -3,6 +3,12 @@ Repository ========== +.. note:: + + See the official GitHub API v2 documentation for `repositories`_. + +.. _repositories: http://develop.github.com/p/repo.html + .. autoclass:: Repository(type) .. autoclass:: Repositories(type) diff --git a/doc/api/teams.rst b/doc/api/teams.rst index 8a67cf8..dc2102b 100644 --- a/doc/api/teams.rst +++ b/doc/api/teams.rst @@ -1,7 +1,13 @@ +.. module:: github2.teams + Teams ===== -.. currentmodule:: github2.teams +.. note:: + + See the official GitHub API v2 documentation for `organizations and teams`_. + +.. _organizations and teams: http://develop.github.com/p/teams.html .. autoclass:: Team(type) diff --git a/doc/api/users.rst b/doc/api/users.rst index 842b06d..36f086d 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -3,6 +3,12 @@ Users ===== +.. note:: + + See the official GitHub API v2 documentation for users_. + +.. _users: http://develop.github.com/p/teams.html + .. autoclass:: User(type) .. autoclass:: Users(type) From a9a31dfcca79f64a9937e95d21a850ecc16e93e6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Jul 2011 17:31:11 +0100 Subject: [PATCH 328/454] Add note about tree-ish refs to pull request doc. --- doc/api/pull_requests.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst index ea94615..a2748cc 100644 --- a/doc/api/pull_requests.rst +++ b/doc/api/pull_requests.rst @@ -45,3 +45,8 @@ To attach code to an existing issue and make it a pull request:: >>> pull = github.pull_requests.create("ask/python-github2", "master", ... "JNRowe:my_new_branch", ... issue=4) + +.. note:: + + You can use any ``tree-ish`` for the ``head`` argument, you are not + restricted to symbolic references. From a457609136d2b30f0ac327b18935af6158172434 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Jul 2011 17:51:27 +0100 Subject: [PATCH 329/454] Read Python Sphinx objects from $SPHINX_PYTHON_OBJECTS. This is mainly to speed up tox runs, and also to make building the docs simpler on the train ;) --- doc/conf.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 262c466..2f2b3bf 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -225,4 +225,6 @@ autoclass_content = "init" autodoc_default_flags = ['members', ] -intersphinx_mapping = {'python': ('http://docs.python.org/', None)} +intersphinx_mapping = { + 'python': ('http://docs.python.org/', os.getenv('SPHINX_PYTHON_OBJECTS')) +} From ef0cb801ca1ec7aa7b972cfbd53e8335074f8260 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 12 Jul 2011 17:54:13 +0100 Subject: [PATCH 330/454] Fix silly syntax error with docutils 0.8. --- doc/wild.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/wild.rst b/doc/wild.rst index 17dd41b..6c83ed3 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -5,6 +5,7 @@ In the wild listed on this page. .. note:: + Have an interesting Open Source project or public website using :mod:`github2`? Add it to this list! Just `open an issue`_ or click the ``Fork and edit this file`` button on the `project website`_ From 4486b7c745083baf031c4cd7227aa2bb03ed4c22 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 15 Aug 2011 20:41:11 +0100 Subject: [PATCH 331/454] Set Accept header to application/json. Closes #59. --- github2/request.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/github2/request.py b/github2/request.py index 6d0a1d8..7a6581c 100644 --- a/github2/request.py +++ b/github2/request.py @@ -131,7 +131,6 @@ def raw_request(self, url, extra_post_data, method="GET"): scheme, netloc, path, query, fragment = urlsplit(url) post_data = None headers = self.http_headers - headers["Accept"] = "text/html" method = method.upper() if extra_post_data or method == "POST": post_data = self.encode_authentication_data(extra_post_data) @@ -154,5 +153,7 @@ def raw_request(self, url, extra_post_data, method="GET"): @property def http_headers(self): - return {"User-Agent": "pygithub2 v1", - "Accept-Encoding": "application/json"} + return { + "User-Agent": "pygithub2 v1", + "Accept": "application/json", + } From ab38850a656afce606a326639c4717c943f19a1e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 25 Aug 2011 08:01:13 +0100 Subject: [PATCH 332/454] Updated offline test data. --- ...,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 | 17 ++++++++++------- ...thon.html,8622bc5e052f03439528cc9b7bf3fea2 | 17 ++++++++++------- ...,Makefile,75d9a1e41e76c3b924420d48b56dc756 | 17 ++++++++++------- ...ay,master,bfb4f990e48c87dab73d988a81318d69 | 17 ++++++++++------- ...765b9ae45,a4f58221c8131c4e0975cd806f13d76c | 13 ++++++++----- ...ithub2,24,fd493a9ada4c1de1cd592293f9c2049e | 13 +++++++------ ...c-overlay,b81a30109b72cf3356114dcc6e2e29ca | 13 +++++++------ ...b2,closed,3662da90eba27809e7bff7600392ec94 | 17 +++++++++-------- ...hub2,open,fe32d5f6ebc81579886964c4c353403e | 15 ++++++++------- ...,timezone,ca6c06a1218893c7591a54352d1dc532 | 15 +++++++++++++++ ...,timezone,e8e32dc210586a68a9d7e0a88b74214f | 14 -------------- ...ithub2,24,5b0c4463c84fc26a94bc1bfaa191fed5 | 11 ++++++----- ...ns,github,d8f16b26260e5cb408a092d5071996ca | 15 ++++++++------- ...c_members,01d1fb446743540669e4773bf8cf53c3 | 15 ++++++++------- ...ositories,f3e3e76ac876947b47b43a16fa0e44e5 | 15 ++++++++------- ...ithub2,39,599fd11f8dd1b224e0c640d3f70f34c8 | 13 +++++++------ ...hub2,open,80fdb1a6835888c7811257428c93eef4 | 15 ++++++++------- ...h,surfraw,ef28b342b173c62c8b892fffb6509c84 | 13 +++++++------ ...ow,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 | 15 ++++++++------- ...c-overlay,0d310ea1b3942e443c6e5cae4f3db39f | 15 ++++++++------- ...tributors,ff5597c19e0d450ad432c56295b19cf8 | 15 ++++++++------- ...ed,JNRowe,7c562435f1efb67be5b048aeb79b3f6c | 15 ++++++++------- ...gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 | 15 ++++++++------- ...token=xxx,5670385849f9826634ee63e74bcac43e | 14 -------------- ...w,defunkt,eb59ee564b4598ac4a39c71474b539fc | 14 ++++++++++++++ ...es%2BRowe,95221a552352bf0535e2445659dc9ed5 | 15 ++++++++------- ...w,defunkt,379cb3d60bbce3d9b30e6e6aae66840c | 15 ++++++++------- ...followers,aba15090598242283ff9d4a8b5969f52 | 17 +++++++++-------- ...following,dc4e4027f60d0737177e4d793ff8a5de | 17 +++++++++-------- ...w,mojombo,640a810b9b927be6912b70d53d6b0eb1 | 13 +++++++------ ...,defunkt,c18f5f6c951d12528f9f3c2af3e1e623} | 12 ++++++------ tests/test_commits.py | 10 +++++----- tests/test_issues.py | 19 ++++++++++--------- tests/test_organizations.py | 4 ++-- tests/test_pull_requests.py | 4 ++-- tests/test_repositories.py | 10 +++++----- tests/test_user.py | 8 ++++---- 37 files changed, 275 insertions(+), 237 deletions(-) create mode 100644 tests/data/github.com,api,v2,json,issues,search,ask,python-github2,closed,timezone,ca6c06a1218893c7591a54352d1dc532 delete mode 100644 tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f delete mode 100644 tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e create mode 100644 tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc rename tests/data/{github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 => github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623} (62%) diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 index 7d9f455..56b04cb 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 @@ -1,14 +1,17 @@ status: 200 -content-length: 19508 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages -set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; +-content-encoding: gzip +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly -x-runtime: 74ms -server: nginx/0.7.67 connection: keep-alive -etag: "f853c8c431fcb88f7d265f942abcb2a1" +content-length: 19508 +server: nginx/1.0.4 +x-runtime: 90ms +x-ratelimit-limit: 60 +etag: "39dd7030e2a0f6ca6c81ecbaec0945b8" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 20:51:32 GMT +date: Thu, 25 Aug 2011 06:47:19 GMT content-type: application/json; charset=utf-8 -{"commits":[{"parents":[{"id":"dc510f30d64636acec23adb685f75216b2a5c536"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/482f657443df4b701137a3025ae08476cddd2b7d","id":"482f657443df4b701137a3025ae08476cddd2b7d","committed_date":"2011-05-22T00:24:02-07:00","authored_date":"2011-05-22T00:24:02-07:00","message":"Regenerated to master@37233b357d1a3648434ffda8f569ce96b3bcbf53.","tree":"1001c361f15bd70b4cb1d8675d46cbe2f869d922","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c900486c92de886e204de0de9ab7ebb025300796"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc510f30d64636acec23adb685f75216b2a5c536","id":"dc510f30d64636acec23adb685f75216b2a5c536","committed_date":"2011-05-20T11:24:57-07:00","authored_date":"2011-05-20T11:24:57-07:00","message":"Regenerated to master@77174d5106157dd497a38152ff694616a6569e67.","tree":"120a08b10c9c39457c89a489e3c61cdf6150eb73","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"42f6555b92064d9517c4c01786dd2d1a726267ba"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c900486c92de886e204de0de9ab7ebb025300796","id":"c900486c92de886e204de0de9ab7ebb025300796","committed_date":"2011-05-18T06:19:40-07:00","authored_date":"2011-05-18T06:19:40-07:00","message":"Regenerated to master@ddcad38eea125d5e0748b5c9a3c39d05269bd584.","tree":"7176d813fcd92e06e7cf63bbc4a489da0f0d6a96","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42f6555b92064d9517c4c01786dd2d1a726267ba","id":"42f6555b92064d9517c4c01786dd2d1a726267ba","committed_date":"2011-05-18T06:19:33-07:00","authored_date":"2011-05-18T06:19:33-07:00","message":"Regenerated to master@6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2.","tree":"a764431dd319a830a6ebcfae3899b914f9f27a3a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"22d7a0ea8bd62a4ed6740568e401be59a024e909"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","committed_date":"2011-05-18T06:19:26-07:00","authored_date":"2011-05-18T06:19:26-07:00","message":"Regenerated to master@07bfd80949820c9215e48ebb5e11d2fd48923e5a.","tree":"471163e95ce3c23d2b732bd001d56bca759c2420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"883e534ed48b3f672d6377d7804d55bb6dd8619b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22d7a0ea8bd62a4ed6740568e401be59a024e909","id":"22d7a0ea8bd62a4ed6740568e401be59a024e909","committed_date":"2011-05-18T06:19:19-07:00","authored_date":"2011-05-18T06:19:19-07:00","message":"Regenerated to master@944386cde5c100e699d0c2cb0ce403bf7e9cb8e7.","tree":"17dc717577ffc2c6f021efd65ec08ff3042b3e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f1416b80d2d8b1400561c62caa3a8c419d565c8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/883e534ed48b3f672d6377d7804d55bb6dd8619b","id":"883e534ed48b3f672d6377d7804d55bb6dd8619b","committed_date":"2011-05-18T06:19:12-07:00","authored_date":"2011-05-18T06:19:12-07:00","message":"Regenerated to master@dc40235add8b9cecd18b8d62a932ead301351075.","tree":"a070f9ccff562fd99bfdc30dcab3636e5787c493","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"bc629a169cf2c39391f07d4a8280d72926a5cf37"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8f1416b80d2d8b1400561c62caa3a8c419d565c8","id":"8f1416b80d2d8b1400561c62caa3a8c419d565c8","committed_date":"2011-05-18T06:19:03-07:00","authored_date":"2011-05-18T06:19:03-07:00","message":"Regenerated to master@472da1f32f55d219286b106c97fa25dab1c33758.","tree":"4634dd6b341f04f5f030ab7a6f8ec04780b03ddc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/bc629a169cf2c39391f07d4a8280d72926a5cf37","id":"bc629a169cf2c39391f07d4a8280d72926a5cf37","committed_date":"2011-05-18T06:18:55-07:00","authored_date":"2011-05-18T06:18:55-07:00","message":"Regenerated to master@79c0fb209d27eded8947eb4ffa5c74db4379abfe.","tree":"94957a98dc1f3898806ad9a6639dc2f634372120","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/663d32bc6d0644762cc5c80b29ee407efaeaaa14","id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14","committed_date":"2011-05-18T06:18:48-07:00","authored_date":"2011-05-18T06:18:48-07:00","message":"Regenerated to master@0dac8c2a2410325d5095cf5c290fae441843eec6.","tree":"c722d5bc095b3c6db4ebdcb8411d23ae0aa8c753","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","committed_date":"2011-05-18T06:18:41-07:00","authored_date":"2011-05-18T06:18:41-07:00","message":"Regenerated to master@de547eab8229243de4906826a622b9305c5b972d.","tree":"553e39c28587b664b0ee28b7426cfa82f3800d17","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","committed_date":"2011-05-18T06:18:34-07:00","authored_date":"2011-05-18T06:18:34-07:00","message":"Regenerated to master@c5a0736ee365ff994ba415a42622c26016e98201.","tree":"d8d7fc2e2da5cdb910e1c501c872656f25368012","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","committed_date":"2011-05-18T06:17:38-07:00","authored_date":"2011-05-18T06:17:38-07:00","message":"Regenerated to master@01b36090e191bfa74da5199d322c6028b15f0c86.","tree":"919c8aad024b7877ef1165026372be223d31f40d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f0b4cf728581a2810191e04f95969460dce9846c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/481f71c738fbf5e85d0f91a6641af5fe2be58b51","id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51","committed_date":"2011-05-18T05:49:29-07:00","authored_date":"2011-05-18T05:49:29-07:00","message":"Regenerated to master@9bd07338404171f18dcbb99b6bf351fbb6c3a8f1.","tree":"719716dfa3d81d214ce3b968c6a8f8b67511b7f8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"30a0291143512c66f3ad2811c008262e3f9c14c5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f0b4cf728581a2810191e04f95969460dce9846c","id":"f0b4cf728581a2810191e04f95969460dce9846c","committed_date":"2011-05-18T05:49:21-07:00","authored_date":"2011-05-18T05:49:21-07:00","message":"Regenerated to master@4654ab67b1767f066e38cfb55910095bbd797b2e.","tree":"671d07f1dcd6f4cb9b3ed7ec0c0a64c15cff924f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"901eae55af985825b5052e52892170f895f35d26"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/30a0291143512c66f3ad2811c008262e3f9c14c5","id":"30a0291143512c66f3ad2811c008262e3f9c14c5","committed_date":"2011-05-18T05:49:09-07:00","authored_date":"2011-05-18T05:49:09-07:00","message":"Regenerated to master@7fb4cf687ade6bfaffd22fc5fc06a77c2b706719.","tree":"3bc5da3e1815beaf6aaa0eee080b0f31c3464282","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5afc160a71e9f2197de1665a0a50d72395f97c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/901eae55af985825b5052e52892170f895f35d26","id":"901eae55af985825b5052e52892170f895f35d26","committed_date":"2011-05-18T05:48:23-07:00","authored_date":"2011-05-18T05:48:23-07:00","message":"Regenerated to master@6a328b3b4b1171de211dd2db765b1b403dea8e3a.","tree":"d6e0d83186ae524b7a3f6192601b726537adbb12","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5afc160a71e9f2197de1665a0a50d72395f97c1","id":"f5afc160a71e9f2197de1665a0a50d72395f97c1","committed_date":"2011-05-18T05:48:11-07:00","authored_date":"2011-05-18T05:48:11-07:00","message":"Regenerated to master@af39c23bbd4abab5b663c66d2cd1a81f3128c4f0.","tree":"d17e07f72894905ac6dd27052222cbeeb2c0b89d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8763c79257d40461b24427ba90cc9f49c353bce7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3e0c3a8997a3943db26f9b29551a07ac2dd273e7","id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7","committed_date":"2011-05-18T05:47:59-07:00","authored_date":"2011-05-18T05:47:59-07:00","message":"Regenerated to master@3fe9cb3de79b132e461c397176138abff39c6a28.","tree":"a440bb9b08d4cd7eb6a4a8b6c61cfb7311e8478d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f5e47c236cd5846a8b466b64fbc495946297e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8763c79257d40461b24427ba90cc9f49c353bce7","id":"8763c79257d40461b24427ba90cc9f49c353bce7","committed_date":"2011-05-18T05:47:12-07:00","authored_date":"2011-05-18T05:47:12-07:00","message":"Regenerated to master@6c8484ef6186c06093553f44c830597eff01b59e.","tree":"16361af013b2f41803fdcd20907c479c9052df30","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"38a34ed6c0f72157438e576a2cabd855dba2f98f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5f5e47c236cd5846a8b466b64fbc495946297e4","id":"f5f5e47c236cd5846a8b466b64fbc495946297e4","committed_date":"2011-05-17T15:05:40-07:00","authored_date":"2011-05-17T15:05:40-07:00","message":"Regenerated to master@2db3879ca018193235c8967562ce9f4853202943.","tree":"89666ab4f20f6bdd272025aa5dc10d2432bd29a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"29d1172e655664ebd8f8df783f39972bb78a5740"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/38a34ed6c0f72157438e576a2cabd855dba2f98f","id":"38a34ed6c0f72157438e576a2cabd855dba2f98f","committed_date":"2011-05-17T15:04:22-07:00","authored_date":"2011-05-17T15:04:22-07:00","message":"Regenerated to master@6b86595f9a5f049b52d359b3c9c56895851ef021.","tree":"020f7ad66cb5a84900f89ee2dff620c83f022c76","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e982c08b1c4d96cd9b734c677f1f023dd4380685"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/29d1172e655664ebd8f8df783f39972bb78a5740","id":"29d1172e655664ebd8f8df783f39972bb78a5740","committed_date":"2011-05-17T15:04:14-07:00","authored_date":"2011-05-17T15:04:14-07:00","message":"Regenerated to master@abb405c5b3cec29acf471cc5170f03b834106a6d.","tree":"a117c14f4a64eccf95c7d310e6059d3dd0b11bcb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7319a81f15c5a99203c01f7438959ca021334179"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e982c08b1c4d96cd9b734c677f1f023dd4380685","id":"e982c08b1c4d96cd9b734c677f1f023dd4380685","committed_date":"2011-05-17T06:11:23-07:00","authored_date":"2011-05-17T06:11:23-07:00","message":"Regenerated to master@f72c51b7f65ada1bd377298c0e462fed499afcee.","tree":"a0139a1fd72f0062fafe128784a352e633df8f56","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9691bcc215a8fe204661044c625d97c55f1f8653"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7319a81f15c5a99203c01f7438959ca021334179","id":"7319a81f15c5a99203c01f7438959ca021334179","committed_date":"2011-05-17T06:11:16-07:00","authored_date":"2011-05-17T06:11:16-07:00","message":"Regenerated to master@48b55622c5c478bb5e6ffa0426c37f16029e6637.","tree":"8950bf04f5a650e1b354c234e8bab6529efbb683","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e5b1a93b37350421766cda46b90cabdd2171d197"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9691bcc215a8fe204661044c625d97c55f1f8653","id":"9691bcc215a8fe204661044c625d97c55f1f8653","committed_date":"2011-05-17T06:11:06-07:00","authored_date":"2011-05-17T06:11:06-07:00","message":"Regenerated to master@0e5d390672e7713ce9d6882820477fa26a2403a8.","tree":"1fc1562e7607848761d3af82fdf8cc3f25664c09","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"373157918971c6f5e313491ef6006c67fd50d497"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e5b1a93b37350421766cda46b90cabdd2171d197","id":"e5b1a93b37350421766cda46b90cabdd2171d197","committed_date":"2011-05-17T06:10:59-07:00","authored_date":"2011-05-17T06:10:59-07:00","message":"Regenerated to master@aadb8c461bcff5f98d2629791a6526319ebedebf.","tree":"990626dece365eaa5894e07972eb72ee584133ff","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac185a94dd7f5190ac317ee16042244ff0e24783"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/373157918971c6f5e313491ef6006c67fd50d497","id":"373157918971c6f5e313491ef6006c67fd50d497","committed_date":"2011-05-17T06:10:47-07:00","authored_date":"2011-05-17T06:10:47-07:00","message":"Regenerated to master@938698435b6feaeb5798b0b8265dec3c86a79f21.","tree":"0f91836cab86969d1e17ff2c4d1756788bac1bdf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac185a94dd7f5190ac317ee16042244ff0e24783","id":"ac185a94dd7f5190ac317ee16042244ff0e24783","committed_date":"2011-05-17T06:10:38-07:00","authored_date":"2011-05-17T06:10:38-07:00","message":"Regenerated to master@1a81af79e9448cc17cb962e6e554d2f95627e48a.","tree":"170fa4eb3372c8fae99c757c9e881b16d9f42b4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cb4e460851da323c1821b83b3ee9431e7961bb90"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/39dfbb9ff704c4d0c86b48deccdf35c013b45871","id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871","committed_date":"2011-05-17T06:10:23-07:00","authored_date":"2011-05-17T06:10:23-07:00","message":"Regenerated to master@a42f9cc6206d3ab898d7e3f128d9435bccec36f3.","tree":"27d6c775e3514cb0047bdf37e1e0d4d62a49b86e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb4e460851da323c1821b83b3ee9431e7961bb90","id":"cb4e460851da323c1821b83b3ee9431e7961bb90","committed_date":"2011-05-17T06:10:14-07:00","authored_date":"2011-05-17T06:10:14-07:00","message":"Regenerated to master@f305a8e19072faa41332ff771eef352d99b720dd.","tree":"4016b7b079894de95c66bc3d8e7afe2e594daccd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c7cb7d1931711ced912190193d53e26cac72d0b8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac10f735a5ff397403cdb5336ee7361eba00a2ee","id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee","committed_date":"2011-05-17T06:10:05-07:00","authored_date":"2011-05-17T06:10:05-07:00","message":"Regenerated to master@0f13d2e4f32191aa0f2c5429666f0afb31934aee.","tree":"e316a4711d80f71e10a4ee2a4540908ace2b2944","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c7cb7d1931711ced912190193d53e26cac72d0b8","id":"c7cb7d1931711ced912190193d53e26cac72d0b8","committed_date":"2011-05-17T06:09:57-07:00","authored_date":"2011-05-17T06:09:57-07:00","message":"Regenerated to master@44e4062f93c5d19d41f9d2158a382991f71b1142.","tree":"7791fcaf2992e7f762caf65bb8b7fc6756ca6a4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"495b96a92c6d673c462011284cca1e8c273eeb0c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","committed_date":"2011-05-17T06:09:36-07:00","authored_date":"2011-05-17T06:09:36-07:00","message":"Regenerated to master@f96f3d6df6e5c7be94957be247ddc0c569e99ed1.","tree":"b8e0182e827097942590d66e39bab525ec4c7cbf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e4740d92686cf0bd2f1b745a1fbcff7d6f67f282"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/495b96a92c6d673c462011284cca1e8c273eeb0c","id":"495b96a92c6d673c462011284cca1e8c273eeb0c","committed_date":"2011-05-17T06:09:26-07:00","authored_date":"2011-05-17T06:09:26-07:00","message":"Regenerated to master@7c4ab2b4bcc82b1a6e80c8aa6b66128eecbbd59a.","tree":"9b5aeceb9c96dd4483f3cfa6e9d89c2a4b48947c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file +{"commits":[{"parents":[{"id":"0a98287afb6659dccb1e24d62244c94f945c757d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/025148bdaa6fb6bdac9c3522d481fadf1c0a456f","id":"025148bdaa6fb6bdac9c3522d481fadf1c0a456f","committed_date":"2011-08-24T16:52:47-07:00","authored_date":"2011-08-24T16:52:47-07:00","message":"Regenerated to master@89a8193a669ad3ea96e4d0aeb00a12a366df5733.","tree":"6c70f9ace4bdcb5607a3bf59cd92bcd096d4e481","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"58986b8a454d299a02a80d6f739a8439d9715bf6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0a98287afb6659dccb1e24d62244c94f945c757d","id":"0a98287afb6659dccb1e24d62244c94f945c757d","committed_date":"2011-08-24T16:52:39-07:00","authored_date":"2011-08-24T16:52:39-07:00","message":"Regenerated to master@f192c08d43d64f6b7aec405963223d583ef8a040.","tree":"2a9be0b4c654cb10c17e69142f2c93a687679bf4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"079dbbe7bb20f5e22c2bf25c8b403810268949a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/58986b8a454d299a02a80d6f739a8439d9715bf6","id":"58986b8a454d299a02a80d6f739a8439d9715bf6","committed_date":"2011-08-24T16:52:32-07:00","authored_date":"2011-08-24T16:52:32-07:00","message":"Regenerated to master@88b910c15ec1da485a24a4806c7021bfee218472.","tree":"6c70f9ace4bdcb5607a3bf59cd92bcd096d4e481","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af8bd58ce3bd2d6e99f153acdb1fc7cf05983868"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/079dbbe7bb20f5e22c2bf25c8b403810268949a1","id":"079dbbe7bb20f5e22c2bf25c8b403810268949a1","committed_date":"2011-08-24T16:52:24-07:00","authored_date":"2011-08-24T16:52:24-07:00","message":"Regenerated to master@9d87ea27ba57d33d4f81e798b9dfee501f92418a.","tree":"17ca2418dde910a810a2079d7257d0218fcfa3c3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af8bd58ce3bd2d6e99f153acdb1fc7cf05983868","id":"af8bd58ce3bd2d6e99f153acdb1fc7cf05983868","committed_date":"2011-08-23T13:19:27-07:00","authored_date":"2011-08-23T13:19:27-07:00","message":"Regenerated to master@56c2ffa6f33bb6d19a424735e2be56d4b94a64ba.","tree":"1d5784c3762e929008d0124f3fe64baf7ee00e0e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"57c7bd5ffc5a88310014d84edb0f03c5f1763b42"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9","id":"3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9","committed_date":"2011-08-23T13:19:19-07:00","authored_date":"2011-08-23T13:19:19-07:00","message":"Regenerated to master@da7a75fd6c1fc4e3f7a54e946f5a99d7517a5a2d.","tree":"f7e528a6ae9301e14ae2cd632b4413aa4b8d6ae8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"12a50df4c4b101c04ec0c1b0f478be28434696a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/57c7bd5ffc5a88310014d84edb0f03c5f1763b42","id":"57c7bd5ffc5a88310014d84edb0f03c5f1763b42","committed_date":"2011-08-23T13:19:11-07:00","authored_date":"2011-08-23T13:19:11-07:00","message":"Regenerated to master@e1656e0222fedbbe7fc9995975d598629dc03d09.","tree":"656503e84cd1b0270934be1f382637fb65917b51","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/12a50df4c4b101c04ec0c1b0f478be28434696a1","id":"12a50df4c4b101c04ec0c1b0f478be28434696a1","committed_date":"2011-08-23T13:19:04-07:00","authored_date":"2011-08-23T13:19:04-07:00","message":"Regenerated to master@2f90ca3bbada2b5cd0bd29f1d6464eabcf8e0f16.","tree":"8b968a6af9e041abe0e19c38ef80d521ae7c2309","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2ede8b05e71baff32374225c9f3575194ebd44e6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b","id":"0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b","committed_date":"2011-08-23T13:18:56-07:00","authored_date":"2011-08-23T13:18:56-07:00","message":"Regenerated to master@b0bf53ab02e9094419eb44103959375e6e636fa3.","tree":"6c7aeffe9c7252cab3070713df3a3e2b31e56926","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8014a2be87434a8216a45fc7ec8c64a7ecfc6e3b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/2ede8b05e71baff32374225c9f3575194ebd44e6","id":"2ede8b05e71baff32374225c9f3575194ebd44e6","committed_date":"2011-08-23T13:18:47-07:00","authored_date":"2011-08-23T13:18:47-07:00","message":"Regenerated to master@1c55b62c24ed3e1375c4aced8e7107cb5827ccc3.","tree":"885e5359e6efd5a7854f00a467a5850e4c1cebab","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b053125f7d622ceec82b985cb9871307442b27a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8014a2be87434a8216a45fc7ec8c64a7ecfc6e3b","id":"8014a2be87434a8216a45fc7ec8c64a7ecfc6e3b","committed_date":"2011-08-19T12:35:56-07:00","authored_date":"2011-08-19T12:35:56-07:00","message":"Regenerated to master@7ac8c6196d6cd3aa5065afa3ee8e98e57491e3be.","tree":"9936a48eb2fdc5d460026287b0fe2c3bd0acf6b1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ad427cb2d0abcb61c3fa5ea7358f8140e8ba6c8d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6b053125f7d622ceec82b985cb9871307442b27a","id":"6b053125f7d622ceec82b985cb9871307442b27a","committed_date":"2011-08-19T12:35:49-07:00","authored_date":"2011-08-19T12:35:49-07:00","message":"Regenerated to master@be3e2ccbf0fa5a0fece6f1302bae3e0315744cef.","tree":"459fce756ba135f4c62d73b00a84e0957079bf8e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"784ca6695918ceadefe57552c349326e61af46ff"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ad427cb2d0abcb61c3fa5ea7358f8140e8ba6c8d","id":"ad427cb2d0abcb61c3fa5ea7358f8140e8ba6c8d","committed_date":"2011-08-19T12:35:41-07:00","authored_date":"2011-08-19T12:35:41-07:00","message":"Regenerated to master@23bf78b74bbd599715d54e7f34c844b2b5c0fe7c.","tree":"1b19f17a3280ade55a1c1ac314afe151fb48b866","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d55b6e7f638b713322417f01ad4156307cf2e439"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/784ca6695918ceadefe57552c349326e61af46ff","id":"784ca6695918ceadefe57552c349326e61af46ff","committed_date":"2011-08-19T12:35:33-07:00","authored_date":"2011-08-19T12:35:33-07:00","message":"Regenerated to master@8a710aaaeb7b82a01a815506f1697015cb89aad4.","tree":"0dba32a98aa1be0a1f442b19cff6716b3c4034f2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"91153a3dddd41eb52a7e55b211ba81ba7f3c6b4f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d55b6e7f638b713322417f01ad4156307cf2e439","id":"d55b6e7f638b713322417f01ad4156307cf2e439","committed_date":"2011-08-19T12:35:26-07:00","authored_date":"2011-08-19T12:35:26-07:00","message":"Regenerated to master@928830b0f2fb1708247096caa0f1a72953875ffa.","tree":"d5cbf9139337b682cfbd6c29197c37bbdf444aa3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d8a0f3e2e8fa535b66c87fe0de984fe80098f99e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/91153a3dddd41eb52a7e55b211ba81ba7f3c6b4f","id":"91153a3dddd41eb52a7e55b211ba81ba7f3c6b4f","committed_date":"2011-08-19T12:35:18-07:00","authored_date":"2011-08-19T12:35:18-07:00","message":"Regenerated to master@773007162c8597e8c3e738e4a856229d2ae87259.","tree":"c036284978961e0f3c97f4d5b5c23b198b4783d4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"598dcf108432672009ed6acae24c4f238eec0a07"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d8a0f3e2e8fa535b66c87fe0de984fe80098f99e","id":"d8a0f3e2e8fa535b66c87fe0de984fe80098f99e","committed_date":"2011-08-19T12:35:11-07:00","authored_date":"2011-08-19T12:35:11-07:00","message":"Regenerated to master@75889df6dc91f167cb370e0878dc51929e87d8cb.","tree":"b8bbad457d65c05545d7711d38d7413184c1ee4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d4b3f4f6aa519d08d4f37474dd6f7ff0900682ed"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/598dcf108432672009ed6acae24c4f238eec0a07","id":"598dcf108432672009ed6acae24c4f238eec0a07","committed_date":"2011-08-19T12:35:03-07:00","authored_date":"2011-08-19T12:35:03-07:00","message":"Regenerated to master@16cb35e13c89606f8e1cab4843d37459314adb8d.","tree":"d8f7b6bfaef75becad304ad1a7d1ed42a1fffce7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"38485affd5caa72fb8bcf5859b4cfb2d00940aff"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d4b3f4f6aa519d08d4f37474dd6f7ff0900682ed","id":"d4b3f4f6aa519d08d4f37474dd6f7ff0900682ed","committed_date":"2011-08-19T12:34:48-07:00","authored_date":"2011-08-19T12:34:48-07:00","message":"Regenerated to master@92b1180ef9bea3bf383375680d2673ad4d172885.","tree":"53d4a394a858e932c9ae09f00d84bec7a0ea54b2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ba496a6dbce08b29f4022fe7239ed5ce5d28a0f1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/38485affd5caa72fb8bcf5859b4cfb2d00940aff","id":"38485affd5caa72fb8bcf5859b4cfb2d00940aff","committed_date":"2011-08-19T12:34:40-07:00","authored_date":"2011-08-19T12:34:40-07:00","message":"Regenerated to master@9e4bfcedd81742b417b77672436322ea68c5a250.","tree":"f360eb1580f3cb0eccea8aef1f24124d8386654a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"639c26b3bca543bc6b0614c6a515b91b66e3c97a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ba496a6dbce08b29f4022fe7239ed5ce5d28a0f1","id":"ba496a6dbce08b29f4022fe7239ed5ce5d28a0f1","committed_date":"2011-08-19T12:34:32-07:00","authored_date":"2011-08-19T12:34:32-07:00","message":"Regenerated to master@02d98678efb443df5fd182644dfe07362ade1f57.","tree":"be30084dd3fcfe945313ce170251ebf43c2d88c2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9f523e62120f9e5ccf3b55760ecf1bf1005ae453"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/639c26b3bca543bc6b0614c6a515b91b66e3c97a","id":"639c26b3bca543bc6b0614c6a515b91b66e3c97a","committed_date":"2011-08-19T12:34:23-07:00","authored_date":"2011-08-19T12:34:23-07:00","message":"Regenerated to master@53af340852055e21c9fd7ab95bfd02413a529ade.","tree":"ca9f5cb320b0ecf9089263826bb02cbc62ba9b94","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"607dd0092327152b65ecda9963a8dff173ca4aa8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9f523e62120f9e5ccf3b55760ecf1bf1005ae453","id":"9f523e62120f9e5ccf3b55760ecf1bf1005ae453","committed_date":"2011-08-19T12:34:16-07:00","authored_date":"2011-08-19T12:34:16-07:00","message":"Regenerated to master@1cc2ddacda2f10e66c4e03d1ce57899ad6ec4d94.","tree":"5f400c344b33caced42ac9030beb278dd1839864","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"de67c8990c15397f58bed3abe161eca428631a17"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/607dd0092327152b65ecda9963a8dff173ca4aa8","id":"607dd0092327152b65ecda9963a8dff173ca4aa8","committed_date":"2011-08-19T12:34:08-07:00","authored_date":"2011-08-19T12:34:08-07:00","message":"Regenerated to master@113dbf403732cb0444d1d37502765fc985127173.","tree":"fae4168d424646b499d5d91c7927557aecc54911","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"94c89874b44d1ebbde6391280385fafec672c1c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/de67c8990c15397f58bed3abe161eca428631a17","id":"de67c8990c15397f58bed3abe161eca428631a17","committed_date":"2011-08-19T12:34:00-07:00","authored_date":"2011-08-19T12:34:00-07:00","message":"Regenerated to master@01fbfddc984dffa94f97acc068a747ce5d1d6242.","tree":"fa42288107ec5d2210823e803c8bf3fcfe25ed9c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6141eeb28597258a8d4d09fe8930b43faca17174"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/94c89874b44d1ebbde6391280385fafec672c1c1","id":"94c89874b44d1ebbde6391280385fafec672c1c1","committed_date":"2011-08-19T12:33:52-07:00","authored_date":"2011-08-19T12:33:52-07:00","message":"Regenerated to master@bbf0339749b25336a4d6907f69b2557ba4f65adf.","tree":"f21c7bb062828ac6ed8829d408e05476eaef1538","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"76adb634ca9c4282cfdc6fde888a01b2eefe2b7c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6141eeb28597258a8d4d09fe8930b43faca17174","id":"6141eeb28597258a8d4d09fe8930b43faca17174","committed_date":"2011-08-18T13:09:15-07:00","authored_date":"2011-08-18T13:09:15-07:00","message":"Regenerated to master@38619c8162e40a86d2edf81acd488a4ae71b8225.","tree":"857cab31f23ccf7e68d528fb4b2d5119b0d69eab","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"49dda674f0bf768fbeaaeccc865db824c2299866"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/76adb634ca9c4282cfdc6fde888a01b2eefe2b7c","id":"76adb634ca9c4282cfdc6fde888a01b2eefe2b7c","committed_date":"2011-08-18T13:08:58-07:00","authored_date":"2011-08-18T13:08:58-07:00","message":"Regenerated to master@151b0f7b09dc0ed9ee1fdc0a6ac5a6ab50bfee44.","tree":"c4676c96343948e653b7570d48f9539e80642b03","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"477929046f2952a4d52d54703c6c9e45777ee07e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/49dda674f0bf768fbeaaeccc865db824c2299866","id":"49dda674f0bf768fbeaaeccc865db824c2299866","committed_date":"2011-08-18T13:08:44-07:00","authored_date":"2011-08-18T13:08:44-07:00","message":"Regenerated to master@62f854f04fa00f8eef9e125486f9841117beac3a.","tree":"4eb4676b7db1a4b616040c82c989cd5051c6d3f4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b9a2a28b630932493d86c23843a6e00e8d8ee1a8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/477929046f2952a4d52d54703c6c9e45777ee07e","id":"477929046f2952a4d52d54703c6c9e45777ee07e","committed_date":"2011-08-18T13:08:28-07:00","authored_date":"2011-08-18T13:08:28-07:00","message":"Regenerated to master@99cc3c9af871eed65227fc7eff4803016f335b4a.","tree":"2aab1d103f2f6e381e7ffb867759bc3d818565d4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b542c7d9611a09ef4460b92ca0af79e767d873f5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b9a2a28b630932493d86c23843a6e00e8d8ee1a8","id":"b9a2a28b630932493d86c23843a6e00e8d8ee1a8","committed_date":"2011-08-18T13:08:13-07:00","authored_date":"2011-08-18T13:08:13-07:00","message":"Regenerated to master@5df5f3c4fa6a75ffd263770e0f0151aa88db69bd.","tree":"28a7fce63f8ddd3fde928fe5dd1cd211a55f65aa","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d0e4182e3402bcd3566813552afba7b05b333b26"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b542c7d9611a09ef4460b92ca0af79e767d873f5","id":"b542c7d9611a09ef4460b92ca0af79e767d873f5","committed_date":"2011-08-18T13:08:01-07:00","authored_date":"2011-08-18T13:08:01-07:00","message":"Regenerated to master@6af177d7fad34ad2b2454d972eecd9165bc1aab1.","tree":"9be8a02e3032eb5712d1de02fe7b4de8266a08af","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"be5cf5ae473749bf9224276d0042fa482218d43f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d0e4182e3402bcd3566813552afba7b05b333b26","id":"d0e4182e3402bcd3566813552afba7b05b333b26","committed_date":"2011-08-18T13:07:53-07:00","authored_date":"2011-08-18T13:07:53-07:00","message":"Regenerated to master@d7405761dd5f6bc5ec5fb44915d921f52fdae535.","tree":"7ef67ab69af9746592f8d5cd43a9f35721223dfc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a28246baeacb186293335316b6ba73b1956493b1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/be5cf5ae473749bf9224276d0042fa482218d43f","id":"be5cf5ae473749bf9224276d0042fa482218d43f","committed_date":"2011-08-18T13:07:45-07:00","authored_date":"2011-08-18T13:07:45-07:00","message":"Regenerated to master@8ca70949a7bbd6b3dab125a1aa334e3682b10ce9.","tree":"1eebd7cb1afd4500e845bd356a46febd7ba08dd4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec1607f0668354d20a389961bd39492f23077367"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a28246baeacb186293335316b6ba73b1956493b1","id":"a28246baeacb186293335316b6ba73b1956493b1","committed_date":"2011-08-18T13:07:38-07:00","authored_date":"2011-08-18T13:07:38-07:00","message":"Regenerated to master@7054ad152fe698b8a9e7255f2b89c56f4438706b.","tree":"377c85d6fa2cf52d809ceff2c583ceeb63517357","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 index 03bed3e..3493ec2 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 @@ -1,14 +1,17 @@ status: 200 -content-length: 19508 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages/packages/dev-python.html -set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; +-content-encoding: gzip +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly -x-runtime: 90ms -server: nginx/0.7.67 connection: keep-alive -etag: "f853c8c431fcb88f7d265f942abcb2a1" +content-length: 19508 +server: nginx/1.0.4 +x-runtime: 114ms +x-ratelimit-limit: 60 +etag: "39dd7030e2a0f6ca6c81ecbaec0945b8" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 20:54:07 GMT +date: Thu, 25 Aug 2011 06:48:02 GMT content-type: application/json; charset=utf-8 -{"commits":[{"parents":[{"id":"dc510f30d64636acec23adb685f75216b2a5c536"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/482f657443df4b701137a3025ae08476cddd2b7d","id":"482f657443df4b701137a3025ae08476cddd2b7d","committed_date":"2011-05-22T00:24:02-07:00","authored_date":"2011-05-22T00:24:02-07:00","message":"Regenerated to master@37233b357d1a3648434ffda8f569ce96b3bcbf53.","tree":"1001c361f15bd70b4cb1d8675d46cbe2f869d922","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c900486c92de886e204de0de9ab7ebb025300796"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc510f30d64636acec23adb685f75216b2a5c536","id":"dc510f30d64636acec23adb685f75216b2a5c536","committed_date":"2011-05-20T11:24:57-07:00","authored_date":"2011-05-20T11:24:57-07:00","message":"Regenerated to master@77174d5106157dd497a38152ff694616a6569e67.","tree":"120a08b10c9c39457c89a489e3c61cdf6150eb73","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42f6555b92064d9517c4c01786dd2d1a726267ba","id":"42f6555b92064d9517c4c01786dd2d1a726267ba","committed_date":"2011-05-18T06:19:33-07:00","authored_date":"2011-05-18T06:19:33-07:00","message":"Regenerated to master@6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2.","tree":"a764431dd319a830a6ebcfae3899b914f9f27a3a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"22d7a0ea8bd62a4ed6740568e401be59a024e909"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","id":"d54b3e1f44ffc0f1bbd3f7797957ff8908c3e7f4","committed_date":"2011-05-18T06:19:26-07:00","authored_date":"2011-05-18T06:19:26-07:00","message":"Regenerated to master@07bfd80949820c9215e48ebb5e11d2fd48923e5a.","tree":"471163e95ce3c23d2b732bd001d56bca759c2420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"883e534ed48b3f672d6377d7804d55bb6dd8619b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22d7a0ea8bd62a4ed6740568e401be59a024e909","id":"22d7a0ea8bd62a4ed6740568e401be59a024e909","committed_date":"2011-05-18T06:19:19-07:00","authored_date":"2011-05-18T06:19:19-07:00","message":"Regenerated to master@944386cde5c100e699d0c2cb0ce403bf7e9cb8e7.","tree":"17dc717577ffc2c6f021efd65ec08ff3042b3e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/663d32bc6d0644762cc5c80b29ee407efaeaaa14","id":"663d32bc6d0644762cc5c80b29ee407efaeaaa14","committed_date":"2011-05-18T06:18:48-07:00","authored_date":"2011-05-18T06:18:48-07:00","message":"Regenerated to master@0dac8c2a2410325d5095cf5c290fae441843eec6.","tree":"c722d5bc095b3c6db4ebdcb8411d23ae0aa8c753","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","id":"6ad4ec38eb73bd783fd068e5fbbcde532e07c2a1","committed_date":"2011-05-18T06:18:41-07:00","authored_date":"2011-05-18T06:18:41-07:00","message":"Regenerated to master@de547eab8229243de4906826a622b9305c5b972d.","tree":"553e39c28587b664b0ee28b7426cfa82f3800d17","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","id":"26adf3dcc7b90cdfab3eeff91240d2736e0f6aa0","committed_date":"2011-05-18T06:18:34-07:00","authored_date":"2011-05-18T06:18:34-07:00","message":"Regenerated to master@c5a0736ee365ff994ba415a42622c26016e98201.","tree":"d8d7fc2e2da5cdb910e1c501c872656f25368012","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","id":"ec2ab762a5ff82e176593ee9ed41c1d7ef3908a3","committed_date":"2011-05-18T06:17:38-07:00","authored_date":"2011-05-18T06:17:38-07:00","message":"Regenerated to master@01b36090e191bfa74da5199d322c6028b15f0c86.","tree":"919c8aad024b7877ef1165026372be223d31f40d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f0b4cf728581a2810191e04f95969460dce9846c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/481f71c738fbf5e85d0f91a6641af5fe2be58b51","id":"481f71c738fbf5e85d0f91a6641af5fe2be58b51","committed_date":"2011-05-18T05:49:29-07:00","authored_date":"2011-05-18T05:49:29-07:00","message":"Regenerated to master@9bd07338404171f18dcbb99b6bf351fbb6c3a8f1.","tree":"719716dfa3d81d214ce3b968c6a8f8b67511b7f8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"901eae55af985825b5052e52892170f895f35d26"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/30a0291143512c66f3ad2811c008262e3f9c14c5","id":"30a0291143512c66f3ad2811c008262e3f9c14c5","committed_date":"2011-05-18T05:49:09-07:00","authored_date":"2011-05-18T05:49:09-07:00","message":"Regenerated to master@7fb4cf687ade6bfaffd22fc5fc06a77c2b706719.","tree":"3bc5da3e1815beaf6aaa0eee080b0f31c3464282","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5afc160a71e9f2197de1665a0a50d72395f97c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/901eae55af985825b5052e52892170f895f35d26","id":"901eae55af985825b5052e52892170f895f35d26","committed_date":"2011-05-18T05:48:23-07:00","authored_date":"2011-05-18T05:48:23-07:00","message":"Regenerated to master@6a328b3b4b1171de211dd2db765b1b403dea8e3a.","tree":"d6e0d83186ae524b7a3f6192601b726537adbb12","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5afc160a71e9f2197de1665a0a50d72395f97c1","id":"f5afc160a71e9f2197de1665a0a50d72395f97c1","committed_date":"2011-05-18T05:48:11-07:00","authored_date":"2011-05-18T05:48:11-07:00","message":"Regenerated to master@af39c23bbd4abab5b663c66d2cd1a81f3128c4f0.","tree":"d17e07f72894905ac6dd27052222cbeeb2c0b89d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8763c79257d40461b24427ba90cc9f49c353bce7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3e0c3a8997a3943db26f9b29551a07ac2dd273e7","id":"3e0c3a8997a3943db26f9b29551a07ac2dd273e7","committed_date":"2011-05-18T05:47:59-07:00","authored_date":"2011-05-18T05:47:59-07:00","message":"Regenerated to master@3fe9cb3de79b132e461c397176138abff39c6a28.","tree":"a440bb9b08d4cd7eb6a4a8b6c61cfb7311e8478d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f5e47c236cd5846a8b466b64fbc495946297e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8763c79257d40461b24427ba90cc9f49c353bce7","id":"8763c79257d40461b24427ba90cc9f49c353bce7","committed_date":"2011-05-18T05:47:12-07:00","authored_date":"2011-05-18T05:47:12-07:00","message":"Regenerated to master@6c8484ef6186c06093553f44c830597eff01b59e.","tree":"16361af013b2f41803fdcd20907c479c9052df30","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e982c08b1c4d96cd9b734c677f1f023dd4380685"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/29d1172e655664ebd8f8df783f39972bb78a5740","id":"29d1172e655664ebd8f8df783f39972bb78a5740","committed_date":"2011-05-17T15:04:14-07:00","authored_date":"2011-05-17T15:04:14-07:00","message":"Regenerated to master@abb405c5b3cec29acf471cc5170f03b834106a6d.","tree":"a117c14f4a64eccf95c7d310e6059d3dd0b11bcb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7319a81f15c5a99203c01f7438959ca021334179"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e982c08b1c4d96cd9b734c677f1f023dd4380685","id":"e982c08b1c4d96cd9b734c677f1f023dd4380685","committed_date":"2011-05-17T06:11:23-07:00","authored_date":"2011-05-17T06:11:23-07:00","message":"Regenerated to master@f72c51b7f65ada1bd377298c0e462fed499afcee.","tree":"a0139a1fd72f0062fafe128784a352e633df8f56","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9691bcc215a8fe204661044c625d97c55f1f8653"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7319a81f15c5a99203c01f7438959ca021334179","id":"7319a81f15c5a99203c01f7438959ca021334179","committed_date":"2011-05-17T06:11:16-07:00","authored_date":"2011-05-17T06:11:16-07:00","message":"Regenerated to master@48b55622c5c478bb5e6ffa0426c37f16029e6637.","tree":"8950bf04f5a650e1b354c234e8bab6529efbb683","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"39dfbb9ff704c4d0c86b48deccdf35c013b45871"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ac185a94dd7f5190ac317ee16042244ff0e24783","id":"ac185a94dd7f5190ac317ee16042244ff0e24783","committed_date":"2011-05-17T06:10:38-07:00","authored_date":"2011-05-17T06:10:38-07:00","message":"Regenerated to master@1a81af79e9448cc17cb962e6e554d2f95627e48a.","tree":"170fa4eb3372c8fae99c757c9e881b16d9f42b4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ac10f735a5ff397403cdb5336ee7361eba00a2ee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb4e460851da323c1821b83b3ee9431e7961bb90","id":"cb4e460851da323c1821b83b3ee9431e7961bb90","committed_date":"2011-05-17T06:10:14-07:00","authored_date":"2011-05-17T06:10:14-07:00","message":"Regenerated to master@f305a8e19072faa41332ff771eef352d99b720dd.","tree":"4016b7b079894de95c66bc3d8e7afe2e594daccd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c7cb7d1931711ced912190193d53e26cac72d0b8","id":"c7cb7d1931711ced912190193d53e26cac72d0b8","committed_date":"2011-05-17T06:09:57-07:00","authored_date":"2011-05-17T06:09:57-07:00","message":"Regenerated to master@44e4062f93c5d19d41f9d2158a382991f71b1142.","tree":"7791fcaf2992e7f762caf65bb8b7fc6756ca6a4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"495b96a92c6d673c462011284cca1e8c273eeb0c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","id":"f3b0693d68e84ccfd0974b0d6e1ab4c8e983d809","committed_date":"2011-05-17T06:09:36-07:00","authored_date":"2011-05-17T06:09:36-07:00","message":"Regenerated to master@f96f3d6df6e5c7be94957be247ddc0c569e99ed1.","tree":"b8e0182e827097942590d66e39bab525ec4c7cbf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e4740d92686cf0bd2f1b745a1fbcff7d6f67f282"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/495b96a92c6d673c462011284cca1e8c273eeb0c","id":"495b96a92c6d673c462011284cca1e8c273eeb0c","committed_date":"2011-05-17T06:09:26-07:00","authored_date":"2011-05-17T06:09:26-07:00","message":"Regenerated to master@7c4ab2b4bcc82b1a6e80c8aa6b66128eecbbd59a.","tree":"9b5aeceb9c96dd4483f3cfa6e9d89c2a4b48947c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8832aeb528b781e4ee15517b72fb8c12c953b3ca"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7e1731965a19c2c70b1a10b42cf01b9007291b40","id":"7e1731965a19c2c70b1a10b42cf01b9007291b40","committed_date":"2011-05-17T06:08:39-07:00","authored_date":"2011-05-17T06:08:39-07:00","message":"Regenerated to master@a487ce90671d5ef3244d742d7fbe5ddb450802c0.","tree":"eff57796660ae68d5223ef4faba4d37ad37b9e74","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6c0ecbe11add1596cf0420f07f8e5b1ceb396df3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/207d15e62a7ddb2d540da908b85437e87978a1e1","id":"207d15e62a7ddb2d540da908b85437e87978a1e1","committed_date":"2011-05-16T12:54:56-07:00","authored_date":"2011-05-16T12:54:56-07:00","message":"Regenerated to master@6b4a857ed3a0326fe543d5a41f49c942bae93420.","tree":"83534523596feaf881abfcc7eef1af92aba2e624","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d464c1dbe8de864da90423bca39f09d8a469782b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6c0ecbe11add1596cf0420f07f8e5b1ceb396df3","id":"6c0ecbe11add1596cf0420f07f8e5b1ceb396df3","committed_date":"2011-05-16T12:49:24-07:00","authored_date":"2011-05-16T12:49:24-07:00","message":"Regenerated to master@67da4a90939757514ef5b8907b1cc30da088372e.","tree":"9f1fc9939b7cb42eee18adb48303b9b550ed7a9f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c3676fcd73c1811abe26290dd4cd2da808468567"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3cb5e43810e2c96551a501172ac2c7afe1c635a2","id":"3cb5e43810e2c96551a501172ac2c7afe1c635a2","committed_date":"2011-05-14T06:07:04-07:00","authored_date":"2011-05-14T06:07:04-07:00","message":"Regenerated to master@d0ca7960c54b7c9a3ffd98e9ed5b430de4f1cf8f.","tree":"70fc54533649a0243cc2eee24e10f2889b984154","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d5711d508b6abdf75db245e4a019d5e231c45b66"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d19310d2a984e62f9d384c1af162d628f2d328e2","id":"d19310d2a984e62f9d384c1af162d628f2d328e2","committed_date":"2011-05-14T06:06:18-07:00","authored_date":"2011-05-14T06:06:18-07:00","message":"Regenerated to master@832382c82969074291673c3e4aba05fdcef11515.","tree":"953ca90550e721f055c2a08aab45757805079817","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7380a4c52a9c3442fa2e975e04479499bf96216f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d5711d508b6abdf75db245e4a019d5e231c45b66","id":"d5711d508b6abdf75db245e4a019d5e231c45b66","committed_date":"2011-05-14T04:26:35-07:00","authored_date":"2011-05-14T04:26:35-07:00","message":"Regenerated to master@8b8ca395b5c01fec3335480aab6eec667a680248.","tree":"1bffb4fe8b6ee8e2ab8aaad5481323023c9972ee","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9837e052d55f730afea7dfbec5ff649b81eb9552"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/99ca4e94afa0a0cdbde5172e16230305c90ae7dc","id":"99ca4e94afa0a0cdbde5172e16230305c90ae7dc","committed_date":"2011-05-14T04:25:57-07:00","authored_date":"2011-05-14T04:25:57-07:00","message":"Regenerated to master@41ef19778b0b975cf7942ae88deec19ee3a7245e.","tree":"32295f76ecec241b4ca6521342dac97a52949804","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6a011c235d25a97fee032317fda4afafac3c06b0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fc439c18008715db78150e3df88b57d77d3372f1","id":"fc439c18008715db78150e3df88b57d77d3372f1","committed_date":"2011-05-13T12:34:28-07:00","authored_date":"2011-05-13T12:34:28-07:00","message":"Regenerated to master@1413f01349c6187c6ed25896d1d90f9164783784.","tree":"bf901c86ac99a79697dd0b7689e6744c95fb3dd3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6a011c235d25a97fee032317fda4afafac3c06b0","id":"6a011c235d25a97fee032317fda4afafac3c06b0","committed_date":"2011-05-13T02:36:40-07:00","authored_date":"2011-05-13T02:36:40-07:00","message":"Regenerated to master@b276cdf6dc077f988fbf422ae150c518a0cf5c66.","tree":"d622cbf0065e5f8a2376b3e97ae4e30a8d11765f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ad818893ed1df55fa9fd2176fedea03c857e8fb3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d","id":"b42902c7d26c539d52afcdf8ea6e8e1193bcdf5d","committed_date":"2011-05-12T08:50:32-07:00","authored_date":"2011-05-12T08:50:32-07:00","message":"Regenerated to master@2f09d163876dcc7832509844a7e6160598c8ed75.","tree":"ad8128fb4ba0d9ca26000b7153f4705d0c8abe58","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d91631eaf1d6351060123b79489df9663f60aa8e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ad818893ed1df55fa9fd2176fedea03c857e8fb3","id":"ad818893ed1df55fa9fd2176fedea03c857e8fb3","committed_date":"2011-05-12T07:21:30-07:00","authored_date":"2011-05-12T07:21:30-07:00","message":"Regenerated to master@709bad1bf4e70b735b1c1284f11db4b89d8a6936.","tree":"e36c66980818c31f574f74cb55f38baafdf5f706","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d67fc99da1a396f8bbe918900af741c2ab6eb219"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d91631eaf1d6351060123b79489df9663f60aa8e","id":"d91631eaf1d6351060123b79489df9663f60aa8e","committed_date":"2011-05-12T07:21:16-07:00","authored_date":"2011-05-12T07:21:16-07:00","message":"Regenerated to master@0934e9be7d28a79de1ebd8374cf146d6cca61e87.","tree":"99c251d931dbe690b41b4c062ec09960b5aa5743","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file +{"commits":[{"parents":[{"id":"0a98287afb6659dccb1e24d62244c94f945c757d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/025148bdaa6fb6bdac9c3522d481fadf1c0a456f","id":"025148bdaa6fb6bdac9c3522d481fadf1c0a456f","committed_date":"2011-08-24T16:52:47-07:00","authored_date":"2011-08-24T16:52:47-07:00","message":"Regenerated to master@89a8193a669ad3ea96e4d0aeb00a12a366df5733.","tree":"6c70f9ace4bdcb5607a3bf59cd92bcd096d4e481","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"58986b8a454d299a02a80d6f739a8439d9715bf6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0a98287afb6659dccb1e24d62244c94f945c757d","id":"0a98287afb6659dccb1e24d62244c94f945c757d","committed_date":"2011-08-24T16:52:39-07:00","authored_date":"2011-08-24T16:52:39-07:00","message":"Regenerated to master@f192c08d43d64f6b7aec405963223d583ef8a040.","tree":"2a9be0b4c654cb10c17e69142f2c93a687679bf4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"079dbbe7bb20f5e22c2bf25c8b403810268949a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/58986b8a454d299a02a80d6f739a8439d9715bf6","id":"58986b8a454d299a02a80d6f739a8439d9715bf6","committed_date":"2011-08-24T16:52:32-07:00","authored_date":"2011-08-24T16:52:32-07:00","message":"Regenerated to master@88b910c15ec1da485a24a4806c7021bfee218472.","tree":"6c70f9ace4bdcb5607a3bf59cd92bcd096d4e481","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af8bd58ce3bd2d6e99f153acdb1fc7cf05983868"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/079dbbe7bb20f5e22c2bf25c8b403810268949a1","id":"079dbbe7bb20f5e22c2bf25c8b403810268949a1","committed_date":"2011-08-24T16:52:24-07:00","authored_date":"2011-08-24T16:52:24-07:00","message":"Regenerated to master@9d87ea27ba57d33d4f81e798b9dfee501f92418a.","tree":"17ca2418dde910a810a2079d7257d0218fcfa3c3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af8bd58ce3bd2d6e99f153acdb1fc7cf05983868","id":"af8bd58ce3bd2d6e99f153acdb1fc7cf05983868","committed_date":"2011-08-23T13:19:27-07:00","authored_date":"2011-08-23T13:19:27-07:00","message":"Regenerated to master@56c2ffa6f33bb6d19a424735e2be56d4b94a64ba.","tree":"1d5784c3762e929008d0124f3fe64baf7ee00e0e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"57c7bd5ffc5a88310014d84edb0f03c5f1763b42"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9","id":"3b7c29bc9fe0c530f3ba78ee3bee8270f59578d9","committed_date":"2011-08-23T13:19:19-07:00","authored_date":"2011-08-23T13:19:19-07:00","message":"Regenerated to master@da7a75fd6c1fc4e3f7a54e946f5a99d7517a5a2d.","tree":"f7e528a6ae9301e14ae2cd632b4413aa4b8d6ae8","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"12a50df4c4b101c04ec0c1b0f478be28434696a1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/57c7bd5ffc5a88310014d84edb0f03c5f1763b42","id":"57c7bd5ffc5a88310014d84edb0f03c5f1763b42","committed_date":"2011-08-23T13:19:11-07:00","authored_date":"2011-08-23T13:19:11-07:00","message":"Regenerated to master@e1656e0222fedbbe7fc9995975d598629dc03d09.","tree":"656503e84cd1b0270934be1f382637fb65917b51","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/12a50df4c4b101c04ec0c1b0f478be28434696a1","id":"12a50df4c4b101c04ec0c1b0f478be28434696a1","committed_date":"2011-08-23T13:19:04-07:00","authored_date":"2011-08-23T13:19:04-07:00","message":"Regenerated to master@2f90ca3bbada2b5cd0bd29f1d6464eabcf8e0f16.","tree":"8b968a6af9e041abe0e19c38ef80d521ae7c2309","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2ede8b05e71baff32374225c9f3575194ebd44e6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b","id":"0cff89aa8ffb4ad17a0ddecfb21cd47dd92dd51b","committed_date":"2011-08-23T13:18:56-07:00","authored_date":"2011-08-23T13:18:56-07:00","message":"Regenerated to master@b0bf53ab02e9094419eb44103959375e6e636fa3.","tree":"6c7aeffe9c7252cab3070713df3a3e2b31e56926","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"784ca6695918ceadefe57552c349326e61af46ff"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ad427cb2d0abcb61c3fa5ea7358f8140e8ba6c8d","id":"ad427cb2d0abcb61c3fa5ea7358f8140e8ba6c8d","committed_date":"2011-08-19T12:35:41-07:00","authored_date":"2011-08-19T12:35:41-07:00","message":"Regenerated to master@23bf78b74bbd599715d54e7f34c844b2b5c0fe7c.","tree":"1b19f17a3280ade55a1c1ac314afe151fb48b866","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d55b6e7f638b713322417f01ad4156307cf2e439"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/784ca6695918ceadefe57552c349326e61af46ff","id":"784ca6695918ceadefe57552c349326e61af46ff","committed_date":"2011-08-19T12:35:33-07:00","authored_date":"2011-08-19T12:35:33-07:00","message":"Regenerated to master@8a710aaaeb7b82a01a815506f1697015cb89aad4.","tree":"0dba32a98aa1be0a1f442b19cff6716b3c4034f2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d8a0f3e2e8fa535b66c87fe0de984fe80098f99e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/91153a3dddd41eb52a7e55b211ba81ba7f3c6b4f","id":"91153a3dddd41eb52a7e55b211ba81ba7f3c6b4f","committed_date":"2011-08-19T12:35:18-07:00","authored_date":"2011-08-19T12:35:18-07:00","message":"Regenerated to master@773007162c8597e8c3e738e4a856229d2ae87259.","tree":"c036284978961e0f3c97f4d5b5c23b198b4783d4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"598dcf108432672009ed6acae24c4f238eec0a07"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d8a0f3e2e8fa535b66c87fe0de984fe80098f99e","id":"d8a0f3e2e8fa535b66c87fe0de984fe80098f99e","committed_date":"2011-08-19T12:35:11-07:00","authored_date":"2011-08-19T12:35:11-07:00","message":"Regenerated to master@75889df6dc91f167cb370e0878dc51929e87d8cb.","tree":"b8bbad457d65c05545d7711d38d7413184c1ee4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"639c26b3bca543bc6b0614c6a515b91b66e3c97a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ba496a6dbce08b29f4022fe7239ed5ce5d28a0f1","id":"ba496a6dbce08b29f4022fe7239ed5ce5d28a0f1","committed_date":"2011-08-19T12:34:32-07:00","authored_date":"2011-08-19T12:34:32-07:00","message":"Regenerated to master@02d98678efb443df5fd182644dfe07362ade1f57.","tree":"be30084dd3fcfe945313ce170251ebf43c2d88c2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9f523e62120f9e5ccf3b55760ecf1bf1005ae453"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/639c26b3bca543bc6b0614c6a515b91b66e3c97a","id":"639c26b3bca543bc6b0614c6a515b91b66e3c97a","committed_date":"2011-08-19T12:34:23-07:00","authored_date":"2011-08-19T12:34:23-07:00","message":"Regenerated to master@53af340852055e21c9fd7ab95bfd02413a529ade.","tree":"ca9f5cb320b0ecf9089263826bb02cbc62ba9b94","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"de67c8990c15397f58bed3abe161eca428631a17"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/607dd0092327152b65ecda9963a8dff173ca4aa8","id":"607dd0092327152b65ecda9963a8dff173ca4aa8","committed_date":"2011-08-19T12:34:08-07:00","authored_date":"2011-08-19T12:34:08-07:00","message":"Regenerated to master@113dbf403732cb0444d1d37502765fc985127173.","tree":"fae4168d424646b499d5d91c7927557aecc54911","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"94c89874b44d1ebbde6391280385fafec672c1c1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/de67c8990c15397f58bed3abe161eca428631a17","id":"de67c8990c15397f58bed3abe161eca428631a17","committed_date":"2011-08-19T12:34:00-07:00","authored_date":"2011-08-19T12:34:00-07:00","message":"Regenerated to master@01fbfddc984dffa94f97acc068a747ce5d1d6242.","tree":"fa42288107ec5d2210823e803c8bf3fcfe25ed9c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"49dda674f0bf768fbeaaeccc865db824c2299866"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/76adb634ca9c4282cfdc6fde888a01b2eefe2b7c","id":"76adb634ca9c4282cfdc6fde888a01b2eefe2b7c","committed_date":"2011-08-18T13:08:58-07:00","authored_date":"2011-08-18T13:08:58-07:00","message":"Regenerated to master@151b0f7b09dc0ed9ee1fdc0a6ac5a6ab50bfee44.","tree":"c4676c96343948e653b7570d48f9539e80642b03","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b542c7d9611a09ef4460b92ca0af79e767d873f5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b9a2a28b630932493d86c23843a6e00e8d8ee1a8","id":"b9a2a28b630932493d86c23843a6e00e8d8ee1a8","committed_date":"2011-08-18T13:08:13-07:00","authored_date":"2011-08-18T13:08:13-07:00","message":"Regenerated to master@5df5f3c4fa6a75ffd263770e0f0151aa88db69bd.","tree":"28a7fce63f8ddd3fde928fe5dd1cd211a55f65aa","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec1607f0668354d20a389961bd39492f23077367"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a28246baeacb186293335316b6ba73b1956493b1","id":"a28246baeacb186293335316b6ba73b1956493b1","committed_date":"2011-08-18T13:07:38-07:00","authored_date":"2011-08-18T13:07:38-07:00","message":"Regenerated to master@7054ad152fe698b8a9e7255f2b89c56f4438706b.","tree":"377c85d6fa2cf52d809ceff2c583ceeb63517357","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"272f0bb8b317decf1ffb03fd7101786b274d0a98"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/79b8cb8482c22a1740b71ff519abc96a2280b9cf","id":"79b8cb8482c22a1740b71ff519abc96a2280b9cf","committed_date":"2011-08-18T13:07:14-07:00","authored_date":"2011-08-18T13:07:14-07:00","message":"Regenerated to master@098c2e4bf47f68f0a36b095141d8514d1d589b39.","tree":"e8e7f9cf2d23fc6e48e20629e5edc6f828d6f8d9","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a5f93825dacf7dcdefd754599cd9ee1463c40dfd"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/10f305f30bf9ff11f2e7c68b54f46155c887a5a1","id":"10f305f30bf9ff11f2e7c68b54f46155c887a5a1","committed_date":"2011-08-18T13:06:27-07:00","authored_date":"2011-08-18T13:06:27-07:00","message":"Regenerated to master@be19793759e71ac355f0ce2d60875f90e1355e19.","tree":"62c404fef8c24360795b74a6cbf17a20bcbf9704","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2bfdfae0156708575fd656ece737435ffb0bb948"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/170cb19167779bdee5dc06cde2f4f6f2f2c7a5bd","id":"170cb19167779bdee5dc06cde2f4f6f2f2c7a5bd","committed_date":"2011-08-18T13:05:56-07:00","authored_date":"2011-08-18T13:05:56-07:00","message":"Regenerated to master@5ed9bf737383c4338b81974fe9f347c71afbe298.","tree":"9b6fb94063fd8c0a247b55c84cf1122c9108e8af","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9919d4b9eb1d2718e70a331bb63c77a8cbc3d95b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0b112a67e44aa2777d53f3911a8eb900fea27706","id":"0b112a67e44aa2777d53f3911a8eb900fea27706","committed_date":"2011-08-18T13:05:25-07:00","authored_date":"2011-08-18T13:05:25-07:00","message":"Regenerated to master@be6ac09388ea7b360bc4a71a91f2633ce931276b.","tree":"0573c9fffcc251a0dac03a7802542a02712f43b4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4452d8f121a85a2810409cd87965ec8d4e1ed728"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9919d4b9eb1d2718e70a331bb63c77a8cbc3d95b","id":"9919d4b9eb1d2718e70a331bb63c77a8cbc3d95b","committed_date":"2011-08-18T13:05:17-07:00","authored_date":"2011-08-18T13:05:17-07:00","message":"Regenerated to master@9021f373b0ad17def7eb7de03954cc68710945a5.","tree":"a79410b99ec16f8de250815b8a29d466ccd898ff","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3aa8429a97a40c44c789006008568db35b9a4a18"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec44714039cf1687d3e78671129ed9fddfbea1c3","id":"ec44714039cf1687d3e78671129ed9fddfbea1c3","committed_date":"2011-08-18T13:05:01-07:00","authored_date":"2011-08-18T13:05:01-07:00","message":"Regenerated to master@7c6cb75cb7a1712c5dcc3e6198815983bd904025.","tree":"a3487b1b439fc6e669e3ec4c095ec2fa21f49db1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"bdb3ca90891ab29ad93442449d32a2ea66c3f097"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3aa8429a97a40c44c789006008568db35b9a4a18","id":"3aa8429a97a40c44c789006008568db35b9a4a18","committed_date":"2011-08-16T15:32:29-07:00","authored_date":"2011-08-16T15:32:29-07:00","message":"Regenerated to master@be19793759e71ac355f0ce2d60875f90e1355e19.","tree":"4406db2633866b87e64d2ef3741c87c53a4cef05","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e029937f9ca2f98cb1d2fa73f3ad55635c9f4ab5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/587166b8a1bcf2fa060f51a0d46e9f09bb3fdae1","id":"587166b8a1bcf2fa060f51a0d46e9f09bb3fdae1","committed_date":"2011-08-16T15:31:58-07:00","authored_date":"2011-08-16T15:31:58-07:00","message":"Regenerated to master@5ed9bf737383c4338b81974fe9f347c71afbe298.","tree":"a957560e977674b11bc437081b5564fd610179fe","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b2c1c3b0d2de6263683068fa857ea62f24021d71"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f17e016dc993b09bd258dfee95d302cb4d364aa0","id":"f17e016dc993b09bd258dfee95d302cb4d364aa0","committed_date":"2011-08-11T07:30:55-07:00","authored_date":"2011-08-11T07:30:55-07:00","message":"Regenerated to master@be6ac09388ea7b360bc4a71a91f2633ce931276b.","tree":"f095e295083b4ff29543d9e40585d4051ec9fd5d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"5162c4bc66efd03fc1b4191390e8d7778287978c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b2c1c3b0d2de6263683068fa857ea62f24021d71","id":"b2c1c3b0d2de6263683068fa857ea62f24021d71","committed_date":"2011-08-11T07:30:47-07:00","authored_date":"2011-08-11T07:30:47-07:00","message":"Regenerated to master@9021f373b0ad17def7eb7de03954cc68710945a5.","tree":"0bc07339aa56abb528d954fe3924bdc3029fdd04","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"205fe69e3426c84256c58211f5ea7b1c38127d9f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5bfc136f50fc1fef3c86c72b6ba0f99a5492c0e","id":"f5bfc136f50fc1fef3c86c72b6ba0f99a5492c0e","committed_date":"2011-08-11T07:30:21-07:00","authored_date":"2011-08-11T07:30:21-07:00","message":"Regenerated to master@4a1bbcfa9d946db7c719e95af4d4911d96fe1551.","tree":"e0539f4cfd8272e0726c5f5c353bd8f4e7be1bae","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"041fae6b20b4a40e94109f633fa0ca8cda004029"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/205fe69e3426c84256c58211f5ea7b1c38127d9f","id":"205fe69e3426c84256c58211f5ea7b1c38127d9f","committed_date":"2011-08-11T07:30:03-07:00","authored_date":"2011-08-11T07:30:03-07:00","message":"Regenerated to master@6379e79a11f0dbdc8ad98201e8de03634811a03b.","tree":"0db5d904b66d909c11f9d12923f50ad02fec3b59","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"80bf5ca3cd41d53aeb20df02b5b9cbb6f0cc9318"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/229133b961d3580f26a7d7fee3ce13dd0183c168","id":"229133b961d3580f26a7d7fee3ce13dd0183c168","committed_date":"2011-08-11T07:29:39-07:00","authored_date":"2011-08-11T07:29:39-07:00","message":"Regenerated to master@9d279e279dfd06b3d5a85ebc65bac701ab027a2a.","tree":"70f8faacfc27ea2d4d25817956c1acdedbae4140","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"83ec12cd8d99f7799b78d5d6183c18965dd8c8a0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/80bf5ca3cd41d53aeb20df02b5b9cbb6f0cc9318","id":"80bf5ca3cd41d53aeb20df02b5b9cbb6f0cc9318","committed_date":"2011-08-11T07:29:31-07:00","authored_date":"2011-08-11T07:29:31-07:00","message":"Regenerated to master@86b044f91d9a16b221acfdc2f79593fd857e256f.","tree":"0901c65d8ea594e8272e098798c4a3e241da0b85","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6d9c66cf0def5fa6cb5b1b45f9308077e9354ac9"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/83ec12cd8d99f7799b78d5d6183c18965dd8c8a0","id":"83ec12cd8d99f7799b78d5d6183c18965dd8c8a0","committed_date":"2011-08-11T07:29:22-07:00","authored_date":"2011-08-11T07:29:22-07:00","message":"Regenerated to master@9653614dc45f297c0d913b5804f153696dc8083f.","tree":"70f8faacfc27ea2d4d25817956c1acdedbae4140","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 index 57d90d1..eb2d090 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 @@ -1,14 +1,17 @@ status: 200 -content-length: 17134 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master/Makefile -set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; +-content-encoding: gzip +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly -x-runtime: 372ms -server: nginx/0.7.67 connection: keep-alive -etag: "306a5ce3acb78b41e3e36ad181c44754" +content-length: 19364 +server: nginx/1.0.4 +x-runtime: 368ms +x-ratelimit-limit: 60 +etag: "9b36e2e64adcddc23c36dbefbfaf7adf" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 20:53:40 GMT +date: Thu, 25 Aug 2011 06:48:47 GMT content-type: application/json; charset=utf-8 -{"commits":[{"parents":[{"id":"8f24d1b91d885b3ce52dd8e7cc5e18b369c5867e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/41bcd985139189763256a8c82b8f0fcbe150eb03","id":"41bcd985139189763256a8c82b8f0fcbe150eb03","committed_date":"2011-04-29T21:17:59-07:00","authored_date":"2011-04-29T21:17:59-07:00","message":"Revert \"Write org-mode compatible removal reminders.\"\n\nThis reverts commit 4343c1c3ee6a353ed51ea863a8b213a05d5f5b80.\n\nConflicts:\n\n\tMakefile\n\tsupport/gen_removal.py","tree":"4ed8c0153f80d68fa68e434e6e12d8e2eec76281","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","id":"90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","committed_date":"2011-03-07T00:36:47-08:00","authored_date":"2011-03-07T00:02:09-08:00","message":"Switched to org-mode syntax for stabilisation reminders.","tree":"92c0eaeb7b29036393c05c3ee3142d879067e865","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f9be28146dce6fd69e36d7dd72b8ecf5bc9bbd1f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","committed_date":"2011-03-07T00:36:25-08:00","authored_date":"2011-03-07T00:01:41-08:00","message":"Write org-mode compatible removal reminders.\n\nNo longer using remind for this task.","tree":"f7f12bd835b4ae09e6bfc82bf04f8115e628aa85","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"639727a4d533288fdadcd68b8bde2dc84c26812c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7fe50fe7294204120a23c4199d575313d89cc1dd","id":"7fe50fe7294204120a23c4199d575313d89cc1dd","committed_date":"2011-02-10T14:17:41-08:00","authored_date":"2011-02-10T14:17:41-08:00","message":"Small formatting and indentation fix.","tree":"02ad5b7e568f63ee9fe7d4244755451035bda02b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9e60846c4692cccb38361f5eb93347ed1ad782bc"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/639727a4d533288fdadcd68b8bde2dc84c26812c","id":"639727a4d533288fdadcd68b8bde2dc84c26812c","committed_date":"2011-02-10T14:17:16-08:00","authored_date":"2011-02-10T14:17:16-08:00","message":"Don't fail Manifest generation with unset SIGN_KEY.","tree":"17251ab93e3d9d7f1a204c9387495a4658418257","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0d519f8110843158a21d14c01d852b2ceef9f21f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9e60846c4692cccb38361f5eb93347ed1ad782bc","id":"9e60846c4692cccb38361f5eb93347ed1ad782bc","committed_date":"2011-02-10T14:15:32-08:00","authored_date":"2011-02-10T14:15:32-08:00","message":"Don't regenerate categories list for packages.","tree":"19153dc4562525730e67753b3c3dd3149b5376b6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"50ab7577069d92f97634aff0a491a8a6fba11d71"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fa7796f65f38ad5e6587f1e6a85fd03f53d14023","id":"fa7796f65f38ad5e6587f1e6a85fd03f53d14023","committed_date":"2011-02-04T03:12:25-08:00","authored_date":"2011-02-04T03:12:25-08:00","message":"Generate doc/thanks.rst from README.rst.\n\nReally shouldn't be manually maintaining lists.","tree":"25c92e68f1083444c6d7db6dbe597bea027aef8d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2f3b0f35fdf24af9246f237843240915a18e9aa3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f55f382d4f395d0d0e807c77495776224c0e1a23","id":"f55f382d4f395d0d0e807c77495776224c0e1a23","committed_date":"2011-02-02T09:31:51-08:00","authored_date":"2011-02-02T09:19:13-08:00","message":"Fixed categories generation, should overwrite and not append.","tree":"7228d33c816d69d5e9a5cbc63c421366e3304319","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a99c6a599adbce66f69437515182ec205ebe1123"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/053c83cd2413d36b25413279eb1065c89e3e048d","id":"053c83cd2413d36b25413279eb1065c89e3e048d","committed_date":"2011-02-01T05:35:07-08:00","authored_date":"2011-02-01T05:35:07-08:00","message":"Moved news signing comment out of rule, it shouldn't be displayed.","tree":"860eadb5d60fe8f30553b72da214fd46601c6b05","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"074eedb9c02842a0196b4b9ad3ee386bc6182a84"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a99c6a599adbce66f69437515182ec205ebe1123","id":"a99c6a599adbce66f69437515182ec205ebe1123","committed_date":"2011-02-01T05:29:13-08:00","authored_date":"2011-02-01T05:29:13-08:00","message":"Added rule to re-generate HTML documentation.","tree":"9e9d6df5fa81a759adcd6b8fc2197baa8fa75938","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cb2234e17ebf226097321873cbb52d3ab924cf52"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","id":"e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","committed_date":"2011-01-29T23:49:11-08:00","authored_date":"2011-01-29T23:49:11-08:00","message":"Validate reST syntax with check rule.","tree":"90fede79cf4777fc9f0deb7a47f7696d5c0afbbd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"764c5aa41de29e22ff23c45c7278234ca1802795"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb2234e17ebf226097321873cbb52d3ab924cf52","id":"cb2234e17ebf226097321873cbb52d3ab924cf52","committed_date":"2011-01-29T23:46:05-08:00","authored_date":"2011-01-29T23:46:05-08:00","message":"No need to loop for profiles/categories generation.","tree":"92ed35edc1c4ca1072204a3b60087c3c2f4b5523","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"19838ee7086f5517bb5722986bca825e803d6304"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/764c5aa41de29e22ff23c45c7278234ca1802795","id":"764c5aa41de29e22ff23c45c7278234ca1802795","committed_date":"2011-01-29T23:45:40-08:00","authored_date":"2011-01-29T23:45:40-08:00","message":"Delete stale signatures, if SIGN_KEY is not set.","tree":"7f3546c7fbbda89b5e73c76b12c2b2d69e63530a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f81e2b6b85169e487ec462864ea0d27ca25fefdd","id":"f81e2b6b85169e487ec462864ea0d27ca25fefdd","committed_date":"2011-01-12T05:38:07-08:00","authored_date":"2011-01-12T05:38:06-08:00","message":"Updated cupage-check rule to check for watch file existence.","tree":"56e1a14e263c3fac5f199abcb9966300f7cf106e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d1f839991b272875e0c5589bfdb3dd75668a72f2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","committed_date":"2011-01-12T05:37:43-08:00","authored_date":"2011-01-12T05:37:43-08:00","message":"Generate cupage.conf from watch files.","tree":"c0e404e5a8ebf36bcef6c580622c2b645820533c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af5f536666b22b864d1012b7b02258cf745d89ae"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4f01f61e35439c1458a01e389f1c8dbe3496e3bf","id":"4f01f61e35439c1458a01e389f1c8dbe3496e3bf","committed_date":"2010-12-06T03:39:29-08:00","authored_date":"2010-12-06T03:39:29-08:00","message":"Manifests depend on ChangeLogs and metadata.xml.","tree":"b999161e481624d61f446d7fa4fdc32db6def3c3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b58cfa8600da5ad54b382067ad7c6e270845ea0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af5f536666b22b864d1012b7b02258cf745d89ae","id":"af5f536666b22b864d1012b7b02258cf745d89ae","committed_date":"2010-12-06T03:37:30-08:00","authored_date":"2010-12-06T03:37:30-08:00","message":"Read repository name from profiles/repo_name.","tree":"99244aa4b9404b64af0dea365cc54ad809cf9b35","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"60ba3e0f33576cebbfcea06307dabd7394164541"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6adf9d861925c5f66c0c1883e6c70c423bd409d4","id":"6adf9d861925c5f66c0c1883e6c70c423bd409d4","committed_date":"2010-12-06T03:26:08-08:00","authored_date":"2010-12-06T03:26:08-08:00","message":"Switched to egencache for use.local.desc generation.","tree":"a29b65e2faaf6481fb2d5a6388e890b3524836e1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"31792887bcee17be39401fa59f681c243a2a2519"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/290fec4694bddde6ca54584cfd26c04b69e3dd6e","id":"290fec4694bddde6ca54584cfd26c04b69e3dd6e","committed_date":"2010-11-01T09:20:53-07:00","authored_date":"2010-11-01T09:20:53-07:00","message":"Fixed generation of news file signatures.","tree":"34c9f3041b226619376375f3e4b4444372ca0642","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cc66dc063bd13810a3f8fb093a1080052e426f82"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/128ac9109ac751a569588ae056dffa336e21a1d2","id":"128ac9109ac751a569588ae056dffa336e21a1d2","committed_date":"2010-08-24T21:49:06-07:00","authored_date":"2010-08-24T21:49:06-07:00","message":"Regenerate removal.remind if gen_removal.py changes.","tree":"cf67a412f9596e7712f55cfe91eea755c0f61a88","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"826fee37fa53cf2073d27424913291d2bdb11b78"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7434a9050a915925004bf7b4467026525d55bfe7","id":"7434a9050a915925004bf7b4467026525d55bfe7","committed_date":"2010-06-17T23:46:20-07:00","authored_date":"2010-06-17T23:30:53-07:00","message":"Added layman XML validation checks.","tree":"999127b0d3eaf319bcc6b927c44c51bf5706193d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6d38719b62decff9bbae5596a26fbfb5188cc629"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ffce8932c08076b1025bdc4c9fb77ac14ba7894c","id":"ffce8932c08076b1025bdc4c9fb77ac14ba7894c","committed_date":"2010-04-19T02:07:06-07:00","authored_date":"2010-04-19T02:07:06-07:00","message":"Use --strict with rst2html conversions.","tree":"7b4938d419aceee60d2d010b5554af168c17e897","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"42118bbee7a86a310da541bc13e629c9e91bb709"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ea418cd008b59f8176477fbff773ac1bc5fbaad","id":"6ea418cd008b59f8176477fbff773ac1bc5fbaad","committed_date":"2010-03-30T08:25:12-07:00","authored_date":"2010-03-30T08:22:33-07:00","message":"Added tool to generate package removal reminders.\n\nThe display of removal reminders is called with the default make target. The\npackage.mask file is updated to use gen_removal.py compliant syntax.","tree":"c7eefd7905c26b8c952cbd2dd2a4e0c74aaf6e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f7c8303f62595e425a352218116f5ae35e809c2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42118bbee7a86a310da541bc13e629c9e91bb709","id":"42118bbee7a86a310da541bc13e629c9e91bb709","committed_date":"2010-03-30T05:59:00-07:00","authored_date":"2010-03-30T05:59:00-07:00","message":"Warn if PORTAGE_GPG_KEY is not set.","tree":"87ee1dafb47c4eb1aed0a4760d282ccae9aee7cb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f1efe654295570a296d5b657e6e163db7279ee06"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8f7c8303f62595e425a352218116f5ae35e809c2","id":"8f7c8303f62595e425a352218116f5ae35e809c2","committed_date":"2010-03-30T05:55:42-07:00","authored_date":"2010-03-30T05:55:42-07:00","message":"Added rule to sign news files.","tree":"c1232c5b6ace06f681f16319fdb67dc5de3f4977","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e973103cd372c22f7b5cc9d6b7d4ead3b43babe4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f2ce27bd70042cd6266070a3a2d439f1c187c56a","id":"f2ce27bd70042cd6266070a3a2d439f1c187c56a","committed_date":"2009-11-11T22:11:39-08:00","authored_date":"2009-11-11T21:18:41-08:00","message":"Added rule to check for cupage.conf entries.","tree":"93765109726896a83fe424b0ca8c9c39ebea61ca","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"edb40795241f945055e368c27295248124bfcec5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22071b1b529d3abfefd6b4aeb573789aea2ad531","id":"22071b1b529d3abfefd6b4aeb573789aea2ad531","committed_date":"2009-10-06T05:35:30-07:00","authored_date":"2009-10-06T05:35:30-07:00","message":"List stablisation reminders in default make target.","tree":"15d8e6e263955e8f597b597243294fe1fb9fb6f2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"58aadc74c7f6f1e9f7b89e86924cc005096696da"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/acda9182a87201afb828ae7f00da6657507f0556","id":"acda9182a87201afb828ae7f00da6657507f0556","committed_date":"2009-10-06T05:31:55-07:00","authored_date":"2009-10-06T05:27:51-07:00","message":"Added reminder file for stabilisation.","tree":"1dbcebdaaaade95b4f3ae67d5eee38c4c4b65321","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d00f6fece38fa7e2effe0865856ac20e4e3698c4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","id":"9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","committed_date":"2009-09-21T19:49:02-07:00","authored_date":"2009-09-21T19:46:16-07:00","message":"[583: Fixed] Added script to generate profiles/use.local.desc files.","tree":"8997af31834c449576b5e3c734349a6b9428c0a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8315eb308b260edce84ff2546d3ed5237888b2e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/08432266614581afb2a93fa9a69a3b6f9411b076","id":"08432266614581afb2a93fa9a69a3b6f9411b076","committed_date":"2009-05-26T14:59:48-07:00","authored_date":"2009-05-26T14:59:18-07:00","message":"Fixed quoting in gnupg key check.","tree":"96d960aca7a65a6f327b09d5304c33bbc5dba9d0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"aaee60ccf8cd8f50e8445e40a51ab90df9269178"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","id":"e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","committed_date":"2009-05-24T00:14:26-07:00","authored_date":"2009-05-24T00:14:26-07:00","message":"Added Makefile with simple repo maintenance rules.","tree":"52e9206f8f4c7801ba59b5d81945ab54922761de","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file +{"commits":[{"parents":[{"id":"eab53d5966b5473386cbb888b1497b2f7c63e496"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fc12b924d34dc38c8ce76d27a866221faa88cb72","id":"fc12b924d34dc38c8ce76d27a866221faa88cb72","committed_date":"2011-06-17T00:39:08-07:00","authored_date":"2011-06-17T00:37:47-07:00","message":"Added initial cake conversion.","tree":"54d3bce5ce074a12a033ee0a22a70cf87a391817","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"fdb9c0e5ec6c0a93ab3c692622146c41fc51b495"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/eab53d5966b5473386cbb888b1497b2f7c63e496","id":"eab53d5966b5473386cbb888b1497b2f7c63e496","committed_date":"2011-06-16T23:15:09-07:00","authored_date":"2011-06-16T23:15:09-07:00","message":"Fixed Manifest generation rule for make 3.82.","tree":"c13c9fd0e7311ed50b4ec325571ac2510338226a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3458f20fa446e143dbbd676b8088e0ded4dcaa64"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a4d178e71444c5ba4f0d2c172e0840346335ace0","id":"a4d178e71444c5ba4f0d2c172e0840346335ace0","committed_date":"2011-06-02T13:16:55-07:00","authored_date":"2011-06-02T13:16:55-07:00","message":"Revert \"Revert \"Write org-mode compatible removal reminders.\"\"\n\nThis reverts commit 41bcd985139189763256a8c82b8f0fcbe150eb03.","tree":"38a0f798931cdcb4d41807fef61cc873fb30231b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6563182337987d694a94afd5a7e5d99bde44d68d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/14723140d18fdbb0a7e577d441bee09bcb578f28","id":"14723140d18fdbb0a7e577d441bee09bcb578f28","committed_date":"2011-06-02T12:42:28-07:00","authored_date":"2011-06-02T12:42:28-07:00","message":"Fixed sorting in profiles/categories generation.","tree":"3a9ebf3081d1aeacc8b22d4a4c0728d4ea6e3215","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f24d1b91d885b3ce52dd8e7cc5e18b369c5867e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/41bcd985139189763256a8c82b8f0fcbe150eb03","id":"41bcd985139189763256a8c82b8f0fcbe150eb03","committed_date":"2011-04-29T21:17:59-07:00","authored_date":"2011-04-29T21:17:59-07:00","message":"Revert \"Write org-mode compatible removal reminders.\"\n\nThis reverts commit 4343c1c3ee6a353ed51ea863a8b213a05d5f5b80.\n\nConflicts:\n\n\tMakefile\n\tsupport/gen_removal.py","tree":"4ed8c0153f80d68fa68e434e6e12d8e2eec76281","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","id":"90ecd07cc7f08d43f441d44c020bc91a49f0b9c6","committed_date":"2011-03-07T00:36:47-08:00","authored_date":"2011-03-07T00:02:09-08:00","message":"Switched to org-mode syntax for stabilisation reminders.","tree":"92c0eaeb7b29036393c05c3ee3142d879067e865","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f9be28146dce6fd69e36d7dd72b8ecf5bc9bbd1f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","id":"4343c1c3ee6a353ed51ea863a8b213a05d5f5b80","committed_date":"2011-03-07T00:36:25-08:00","authored_date":"2011-03-07T00:01:41-08:00","message":"Write org-mode compatible removal reminders.\n\nNo longer using remind for this task.","tree":"f7f12bd835b4ae09e6bfc82bf04f8115e628aa85","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"639727a4d533288fdadcd68b8bde2dc84c26812c"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7fe50fe7294204120a23c4199d575313d89cc1dd","id":"7fe50fe7294204120a23c4199d575313d89cc1dd","committed_date":"2011-02-10T14:17:41-08:00","authored_date":"2011-02-10T14:17:41-08:00","message":"Small formatting and indentation fix.","tree":"02ad5b7e568f63ee9fe7d4244755451035bda02b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9e60846c4692cccb38361f5eb93347ed1ad782bc"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/639727a4d533288fdadcd68b8bde2dc84c26812c","id":"639727a4d533288fdadcd68b8bde2dc84c26812c","committed_date":"2011-02-10T14:17:16-08:00","authored_date":"2011-02-10T14:17:16-08:00","message":"Don't fail Manifest generation with unset SIGN_KEY.","tree":"17251ab93e3d9d7f1a204c9387495a4658418257","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0d519f8110843158a21d14c01d852b2ceef9f21f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9e60846c4692cccb38361f5eb93347ed1ad782bc","id":"9e60846c4692cccb38361f5eb93347ed1ad782bc","committed_date":"2011-02-10T14:15:32-08:00","authored_date":"2011-02-10T14:15:32-08:00","message":"Don't regenerate categories list for packages.","tree":"19153dc4562525730e67753b3c3dd3149b5376b6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"50ab7577069d92f97634aff0a491a8a6fba11d71"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/fa7796f65f38ad5e6587f1e6a85fd03f53d14023","id":"fa7796f65f38ad5e6587f1e6a85fd03f53d14023","committed_date":"2011-02-04T03:12:25-08:00","authored_date":"2011-02-04T03:12:25-08:00","message":"Generate doc/thanks.rst from README.rst.\n\nReally shouldn't be manually maintaining lists.","tree":"25c92e68f1083444c6d7db6dbe597bea027aef8d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2f3b0f35fdf24af9246f237843240915a18e9aa3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f55f382d4f395d0d0e807c77495776224c0e1a23","id":"f55f382d4f395d0d0e807c77495776224c0e1a23","committed_date":"2011-02-02T09:31:51-08:00","authored_date":"2011-02-02T09:19:13-08:00","message":"Fixed categories generation, should overwrite and not append.","tree":"7228d33c816d69d5e9a5cbc63c421366e3304319","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a99c6a599adbce66f69437515182ec205ebe1123"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/053c83cd2413d36b25413279eb1065c89e3e048d","id":"053c83cd2413d36b25413279eb1065c89e3e048d","committed_date":"2011-02-01T05:35:07-08:00","authored_date":"2011-02-01T05:35:07-08:00","message":"Moved news signing comment out of rule, it shouldn't be displayed.","tree":"860eadb5d60fe8f30553b72da214fd46601c6b05","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"074eedb9c02842a0196b4b9ad3ee386bc6182a84"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a99c6a599adbce66f69437515182ec205ebe1123","id":"a99c6a599adbce66f69437515182ec205ebe1123","committed_date":"2011-02-01T05:29:13-08:00","authored_date":"2011-02-01T05:29:13-08:00","message":"Added rule to re-generate HTML documentation.","tree":"9e9d6df5fa81a759adcd6b8fc2197baa8fa75938","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cb2234e17ebf226097321873cbb52d3ab924cf52"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","id":"e76c3c8c8bce857ae0084b413e0c6e9b73c613dd","committed_date":"2011-01-29T23:49:11-08:00","authored_date":"2011-01-29T23:49:11-08:00","message":"Validate reST syntax with check rule.","tree":"90fede79cf4777fc9f0deb7a47f7696d5c0afbbd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"764c5aa41de29e22ff23c45c7278234ca1802795"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/cb2234e17ebf226097321873cbb52d3ab924cf52","id":"cb2234e17ebf226097321873cbb52d3ab924cf52","committed_date":"2011-01-29T23:46:05-08:00","authored_date":"2011-01-29T23:46:05-08:00","message":"No need to loop for profiles/categories generation.","tree":"92ed35edc1c4ca1072204a3b60087c3c2f4b5523","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"19838ee7086f5517bb5722986bca825e803d6304"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/764c5aa41de29e22ff23c45c7278234ca1802795","id":"764c5aa41de29e22ff23c45c7278234ca1802795","committed_date":"2011-01-29T23:45:40-08:00","authored_date":"2011-01-29T23:45:40-08:00","message":"Delete stale signatures, if SIGN_KEY is not set.","tree":"7f3546c7fbbda89b5e73c76b12c2b2d69e63530a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f81e2b6b85169e487ec462864ea0d27ca25fefdd","id":"f81e2b6b85169e487ec462864ea0d27ca25fefdd","committed_date":"2011-01-12T05:38:07-08:00","authored_date":"2011-01-12T05:38:06-08:00","message":"Updated cupage-check rule to check for watch file existence.","tree":"56e1a14e263c3fac5f199abcb9966300f7cf106e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d1f839991b272875e0c5589bfdb3dd75668a72f2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","id":"7dbadeef727224b9d72bf9373bbc15fba4ccb7ed","committed_date":"2011-01-12T05:37:43-08:00","authored_date":"2011-01-12T05:37:43-08:00","message":"Generate cupage.conf from watch files.","tree":"c0e404e5a8ebf36bcef6c580622c2b645820533c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af5f536666b22b864d1012b7b02258cf745d89ae"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4f01f61e35439c1458a01e389f1c8dbe3496e3bf","id":"4f01f61e35439c1458a01e389f1c8dbe3496e3bf","committed_date":"2010-12-06T03:39:29-08:00","authored_date":"2010-12-06T03:39:29-08:00","message":"Manifests depend on ChangeLogs and metadata.xml.","tree":"b999161e481624d61f446d7fa4fdc32db6def3c3","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b58cfa8600da5ad54b382067ad7c6e270845ea0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af5f536666b22b864d1012b7b02258cf745d89ae","id":"af5f536666b22b864d1012b7b02258cf745d89ae","committed_date":"2010-12-06T03:37:30-08:00","authored_date":"2010-12-06T03:37:30-08:00","message":"Read repository name from profiles/repo_name.","tree":"99244aa4b9404b64af0dea365cc54ad809cf9b35","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"60ba3e0f33576cebbfcea06307dabd7394164541"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6adf9d861925c5f66c0c1883e6c70c423bd409d4","id":"6adf9d861925c5f66c0c1883e6c70c423bd409d4","committed_date":"2010-12-06T03:26:08-08:00","authored_date":"2010-12-06T03:26:08-08:00","message":"Switched to egencache for use.local.desc generation.","tree":"a29b65e2faaf6481fb2d5a6388e890b3524836e1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"31792887bcee17be39401fa59f681c243a2a2519"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/290fec4694bddde6ca54584cfd26c04b69e3dd6e","id":"290fec4694bddde6ca54584cfd26c04b69e3dd6e","committed_date":"2010-11-01T09:20:53-07:00","authored_date":"2010-11-01T09:20:53-07:00","message":"Fixed generation of news file signatures.","tree":"34c9f3041b226619376375f3e4b4444372ca0642","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cc66dc063bd13810a3f8fb093a1080052e426f82"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/128ac9109ac751a569588ae056dffa336e21a1d2","id":"128ac9109ac751a569588ae056dffa336e21a1d2","committed_date":"2010-08-24T21:49:06-07:00","authored_date":"2010-08-24T21:49:06-07:00","message":"Regenerate removal.remind if gen_removal.py changes.","tree":"cf67a412f9596e7712f55cfe91eea755c0f61a88","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"826fee37fa53cf2073d27424913291d2bdb11b78"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7434a9050a915925004bf7b4467026525d55bfe7","id":"7434a9050a915925004bf7b4467026525d55bfe7","committed_date":"2010-06-17T23:46:20-07:00","authored_date":"2010-06-17T23:30:53-07:00","message":"Added layman XML validation checks.","tree":"999127b0d3eaf319bcc6b927c44c51bf5706193d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6d38719b62decff9bbae5596a26fbfb5188cc629"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ffce8932c08076b1025bdc4c9fb77ac14ba7894c","id":"ffce8932c08076b1025bdc4c9fb77ac14ba7894c","committed_date":"2010-04-19T02:07:06-07:00","authored_date":"2010-04-19T02:07:06-07:00","message":"Use --strict with rst2html conversions.","tree":"7b4938d419aceee60d2d010b5554af168c17e897","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"42118bbee7a86a310da541bc13e629c9e91bb709"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6ea418cd008b59f8176477fbff773ac1bc5fbaad","id":"6ea418cd008b59f8176477fbff773ac1bc5fbaad","committed_date":"2010-03-30T08:25:12-07:00","authored_date":"2010-03-30T08:22:33-07:00","message":"Added tool to generate package removal reminders.\n\nThe display of removal reminders is called with the default make target. The\npackage.mask file is updated to use gen_removal.py compliant syntax.","tree":"c7eefd7905c26b8c952cbd2dd2a4e0c74aaf6e15","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f7c8303f62595e425a352218116f5ae35e809c2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/42118bbee7a86a310da541bc13e629c9e91bb709","id":"42118bbee7a86a310da541bc13e629c9e91bb709","committed_date":"2010-03-30T05:59:00-07:00","authored_date":"2010-03-30T05:59:00-07:00","message":"Warn if PORTAGE_GPG_KEY is not set.","tree":"87ee1dafb47c4eb1aed0a4760d282ccae9aee7cb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f1efe654295570a296d5b657e6e163db7279ee06"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8f7c8303f62595e425a352218116f5ae35e809c2","id":"8f7c8303f62595e425a352218116f5ae35e809c2","committed_date":"2010-03-30T05:55:42-07:00","authored_date":"2010-03-30T05:55:42-07:00","message":"Added rule to sign news files.","tree":"c1232c5b6ace06f681f16319fdb67dc5de3f4977","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e973103cd372c22f7b5cc9d6b7d4ead3b43babe4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f2ce27bd70042cd6266070a3a2d439f1c187c56a","id":"f2ce27bd70042cd6266070a3a2d439f1c187c56a","committed_date":"2009-11-11T22:11:39-08:00","authored_date":"2009-11-11T21:18:41-08:00","message":"Added rule to check for cupage.conf entries.","tree":"93765109726896a83fe424b0ca8c9c39ebea61ca","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"edb40795241f945055e368c27295248124bfcec5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/22071b1b529d3abfefd6b4aeb573789aea2ad531","id":"22071b1b529d3abfefd6b4aeb573789aea2ad531","committed_date":"2009-10-06T05:35:30-07:00","authored_date":"2009-10-06T05:35:30-07:00","message":"List stablisation reminders in default make target.","tree":"15d8e6e263955e8f597b597243294fe1fb9fb6f2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"58aadc74c7f6f1e9f7b89e86924cc005096696da"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/acda9182a87201afb828ae7f00da6657507f0556","id":"acda9182a87201afb828ae7f00da6657507f0556","committed_date":"2009-10-06T05:31:55-07:00","authored_date":"2009-10-06T05:27:51-07:00","message":"Added reminder file for stabilisation.","tree":"1dbcebdaaaade95b4f3ae67d5eee38c4c4b65321","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d00f6fece38fa7e2effe0865856ac20e4e3698c4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","id":"9ddef3d603782269a91dfa1fb36a4a1e5b6a956b","committed_date":"2009-09-21T19:49:02-07:00","authored_date":"2009-09-21T19:46:16-07:00","message":"[583: Fixed] Added script to generate profiles/use.local.desc files.","tree":"8997af31834c449576b5e3c734349a6b9428c0a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8315eb308b260edce84ff2546d3ed5237888b2e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/08432266614581afb2a93fa9a69a3b6f9411b076","id":"08432266614581afb2a93fa9a69a3b6f9411b076","committed_date":"2009-05-26T14:59:48-07:00","authored_date":"2009-05-26T14:59:18-07:00","message":"Fixed quoting in gnupg key check.","tree":"96d960aca7a65a6f327b09d5304c33bbc5dba9d0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"aaee60ccf8cd8f50e8445e40a51ab90df9269178"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","id":"e2702ebdddb7ef5291fcba44d62a1f0f12e6223f","committed_date":"2009-05-24T00:14:26-07:00","authored_date":"2009-05-24T00:14:26-07:00","message":"Added Makefile with simple repo maintenance rules.","tree":"52e9206f8f4c7801ba59b5d81945ab54922761de","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 index 4975802..33b6332 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 @@ -1,14 +1,17 @@ status: 200 -content-length: 22233 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master -set-cookie: _gh_sess=BAh7BzoRbG9jYWxlX2d1ZXNzMCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--719def2ab2d99283383e374327fcdbb716c45c12; +-content-encoding: gzip +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly -x-runtime: 149ms -server: nginx/0.7.67 connection: keep-alive -etag: "0f46540a52ac460fe1eba437c8ebd2d4" +content-length: 23425 +server: nginx/1.0.4 +x-runtime: 113ms +x-ratelimit-limit: 60 +etag: "c97cc3a646b424d1c6222c9540761a96" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 20:47:57 GMT +date: Mon, 15 Aug 2011 20:00:19 GMT content-type: application/json; charset=utf-8 -{"commits":[{"parents":[{"id":"4faa329f56b4c0470db03eaa42b318a83ca889c4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/37233b357d1a3648434ffda8f569ce96b3bcbf53","id":"37233b357d1a3648434ffda8f569ce96b3bcbf53","committed_date":"2011-05-22T00:23:30-07:00","authored_date":"2011-05-22T00:22:41-07:00","message":"socksipy-1.01 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"8adbb3bc1878b5a1307a39a4d23ca776a4f3adeb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"809ed8d37fd3736e88ceb222174cea50540b9156"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4faa329f56b4c0470db03eaa42b318a83ca889c4","id":"4faa329f56b4c0470db03eaa42b318a83ca889c4","committed_date":"2011-05-20T11:32:11-07:00","authored_date":"2011-05-20T11:31:49-07:00","message":"Added missing watch file for nwdiag.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"a289368450d5de2aa1e91a47a8eff493b68b0031","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5f94a5d296b13f9a6c9110ad174051900a16e83"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/809ed8d37fd3736e88ceb222174cea50540b9156","id":"809ed8d37fd3736e88ceb222174cea50540b9156","committed_date":"2011-05-20T11:30:58-07:00","authored_date":"2011-05-20T11:28:38-07:00","message":"Initial socksipy ebuild.\n\nRequired for testing python-github2, and will be a USE=socks dep in new\nreleases.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"64914a9ef2b148ce4e1c4f978c09a26b0fce1a44","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1"},{"id":"ddcad38eea125d5e0748b5c9a3c39d05269bd584"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5f94a5d296b13f9a6c9110ad174051900a16e83","id":"f5f94a5d296b13f9a6c9110ad174051900a16e83","committed_date":"2011-05-18T06:16:59-07:00","authored_date":"2011-05-18T06:16:59-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n pw-0.1.4 keyworded x86.\n plac-0.8.1 keyworded x86.\n pdbpp-0.7 keyworded x86.\n github2-0.3.1 keyworded x86.\n nwdiag-0.2.3 keyworded ~x86.\n cake-0.2 keyworded ~x86.\n jsonpipe-0.0.7 keyworded ~x86.\n vanity-1.0 keyworded ~x86.\n sure-0.4.0 keyworded ~x86.\n stencil-0.1 keyworded ~x86.\n calabash-0.0.3 keyworded ~x86.","tree":"12bf21b11693ffcb64a9df56d1e8446e45e9e648","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ddcad38eea125d5e0748b5c9a3c39d05269bd584","id":"ddcad38eea125d5e0748b5c9a3c39d05269bd584","committed_date":"2011-05-18T06:16:23-07:00","authored_date":"2011-05-18T06:16:14-07:00","message":"pw-0.1.4 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"12bf21b11693ffcb64a9df56d1e8446e45e9e648","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"07bfd80949820c9215e48ebb5e11d2fd48923e5a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2","id":"6e36ba0f2163cbd918fae302944b2cf5f4cf0ec2","committed_date":"2011-05-18T06:15:45-07:00","authored_date":"2011-05-18T06:15:16-07:00","message":"plac-0.8.1 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"19eafacfe02a2dd65a51c91ac503d22a6bc83631","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"944386cde5c100e699d0c2cb0ce403bf7e9cb8e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/07bfd80949820c9215e48ebb5e11d2fd48923e5a","id":"07bfd80949820c9215e48ebb5e11d2fd48923e5a","committed_date":"2011-05-18T06:14:12-07:00","authored_date":"2011-05-18T06:14:02-07:00","message":"pdbpp-0.7 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"efb47845dde6468625ba06605c2dcc7bac9f2b8b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"dc40235add8b9cecd18b8d62a932ead301351075"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/944386cde5c100e699d0c2cb0ce403bf7e9cb8e7","id":"944386cde5c100e699d0c2cb0ce403bf7e9cb8e7","committed_date":"2011-05-18T06:12:52-07:00","authored_date":"2011-05-18T06:12:45-07:00","message":"github2-0.3.1 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ae1c66f72254b9833f7d19393d82fee02dc37c76","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"472da1f32f55d219286b106c97fa25dab1c33758"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dc40235add8b9cecd18b8d62a932ead301351075","id":"dc40235add8b9cecd18b8d62a932ead301351075","committed_date":"2011-05-18T06:10:57-07:00","authored_date":"2011-05-18T06:10:46-07:00","message":"nwdiag-0.2.3 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"3d566ba9cfecd799b4d4fa858b3d95ac6aa873a4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"79c0fb209d27eded8947eb4ffa5c74db4379abfe"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/472da1f32f55d219286b106c97fa25dab1c33758","id":"472da1f32f55d219286b106c97fa25dab1c33758","committed_date":"2011-05-18T06:10:08-07:00","authored_date":"2011-05-18T06:09:58-07:00","message":"cake-0.2 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"1f4ddf23029be3cfbccce1f41bfa3199a91af175","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0dac8c2a2410325d5095cf5c290fae441843eec6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/79c0fb209d27eded8947eb4ffa5c74db4379abfe","id":"79c0fb209d27eded8947eb4ffa5c74db4379abfe","committed_date":"2011-05-18T06:08:37-07:00","authored_date":"2011-05-18T06:08:17-07:00","message":"jsonpipe-0.0.7 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ec644f779e6a9abc0d726ffff01668999691097f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"de547eab8229243de4906826a622b9305c5b972d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0dac8c2a2410325d5095cf5c290fae441843eec6","id":"0dac8c2a2410325d5095cf5c290fae441843eec6","committed_date":"2011-05-18T06:06:14-07:00","authored_date":"2011-05-18T06:06:05-07:00","message":"vanity-1.0 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"faa00aaea5faebbdc0d90086c3980b3f2a71b3f4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c5a0736ee365ff994ba415a42622c26016e98201"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/de547eab8229243de4906826a622b9305c5b972d","id":"de547eab8229243de4906826a622b9305c5b972d","committed_date":"2011-05-18T06:04:14-07:00","authored_date":"2011-05-18T06:03:54-07:00","message":"sure-0.4.0 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"a125da9dffea83d1e4311f4a99876f810c3bcbe4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"01b36090e191bfa74da5199d322c6028b15f0c86"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c5a0736ee365ff994ba415a42622c26016e98201","id":"c5a0736ee365ff994ba415a42622c26016e98201","committed_date":"2011-05-18T06:02:48-07:00","authored_date":"2011-05-18T06:02:17-07:00","message":"stencil-0.1 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ea6febd89f9e82963562156fd9b25b80b866f61e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/01b36090e191bfa74da5199d322c6028b15f0c86","id":"01b36090e191bfa74da5199d322c6028b15f0c86","committed_date":"2011-05-18T06:00:45-07:00","authored_date":"2011-05-18T05:59:53-07:00","message":"calabash-0.0.3 keyworded ~x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"08d452208de4b47c16242c65653cd54a5b89fb4f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3fe9cb3de79b132e461c397176138abff39c6a28"},{"id":"4654ab67b1767f066e38cfb55910095bbd797b2e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9bd07338404171f18dcbb99b6bf351fbb6c3a8f1","id":"9bd07338404171f18dcbb99b6bf351fbb6c3a8f1","committed_date":"2011-05-18T05:42:54-07:00","authored_date":"2011-05-18T05:42:54-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n pw-0.1.4 keyworded amd64.\n plac-0.8.1 keyworded amd64.\n pdbpp-0.7 keyworded amd64.\n github2-0.3.1 keyworded amd64.\n\nConflicts:\n\tsupport/stabilisation.remind","tree":"8741a00f0bc0c6342ea4cc7ae21fdac93a769854","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6c8484ef6186c06093553f44c830597eff01b59e"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3fe9cb3de79b132e461c397176138abff39c6a28","id":"3fe9cb3de79b132e461c397176138abff39c6a28","committed_date":"2011-05-18T05:42:18-07:00","authored_date":"2011-05-18T05:41:41-07:00","message":"Removed stale twython ebuild.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"dca1153895f7bc40acb730a35dcf8699b908e7a7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2db3879ca018193235c8967562ce9f4853202943"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6c8484ef6186c06093553f44c830597eff01b59e","id":"6c8484ef6186c06093553f44c830597eff01b59e","committed_date":"2011-05-18T05:41:06-07:00","authored_date":"2011-05-18T05:41:03-07:00","message":"Pushed twython stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-python/oauth2.","tree":"787fde8bb8cc31ebe8b19dab8aee7c2d95514ac1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7fb4cf687ade6bfaffd22fc5fc06a77c2b706719"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4654ab67b1767f066e38cfb55910095bbd797b2e","id":"4654ab67b1767f066e38cfb55910095bbd797b2e","committed_date":"2011-05-18T05:38:42-07:00","authored_date":"2011-05-18T05:38:32-07:00","message":"pw-0.1.4 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"8fbac38110dbb73bb7204ca9797c4fa7acf44463","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6a328b3b4b1171de211dd2db765b1b403dea8e3a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7fb4cf687ade6bfaffd22fc5fc06a77c2b706719","id":"7fb4cf687ade6bfaffd22fc5fc06a77c2b706719","committed_date":"2011-05-18T05:38:13-07:00","authored_date":"2011-05-18T05:38:00-07:00","message":"plac-0.8.1 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"975b3b667d27dd1734fa4992cc2244a2eac036a9","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"af39c23bbd4abab5b663c66d2cd1a81f3128c4f0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6a328b3b4b1171de211dd2db765b1b403dea8e3a","id":"6a328b3b4b1171de211dd2db765b1b403dea8e3a","committed_date":"2011-05-18T05:37:39-07:00","authored_date":"2011-05-18T05:37:25-07:00","message":"pdbpp-0.7 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"a161646c769641fe645121ad479676b6c10b29f4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2db3879ca018193235c8967562ce9f4853202943"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/af39c23bbd4abab5b663c66d2cd1a81f3128c4f0","id":"af39c23bbd4abab5b663c66d2cd1a81f3128c4f0","committed_date":"2011-05-18T05:36:38-07:00","authored_date":"2011-05-18T05:36:08-07:00","message":"github2-0.3.1 keyworded amd64.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"6db921005c57b50d9f2ade0b9bc754316b1e78fc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6b86595f9a5f049b52d359b3c9c56895851ef021"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/2db3879ca018193235c8967562ce9f4853202943","id":"2db3879ca018193235c8967562ce9f4853202943","committed_date":"2011-05-17T15:05:16-07:00","authored_date":"2011-05-17T14:59:00-07:00","message":"Masked vicious for removal.\n\nThe maintenance burden of shadowing an upstream ebuild is too high, for too\nlittle gain. Sorry, if you have trouble migrating.","tree":"2d5fef6cf947cf7921bf8b32e5b17ae20b4ac682","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"abb405c5b3cec29acf471cc5170f03b834106a6d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6b86595f9a5f049b52d359b3c9c56895851ef021","id":"6b86595f9a5f049b52d359b3c9c56895851ef021","committed_date":"2011-05-17T14:52:27-07:00","authored_date":"2011-05-17T14:52:01-07:00","message":"media-gfx/seqdiag-0.3.3 version bump.\n\nCloses #370.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"0b7df5f5e26c2d367c2ffb5e4f83eaf138c58f7b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"546c70884c3692f17eafa53f29ed7925ab9dcf3f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/abb405c5b3cec29acf471cc5170f03b834106a6d","id":"abb405c5b3cec29acf471cc5170f03b834106a6d","committed_date":"2011-05-17T14:48:49-07:00","authored_date":"2011-05-17T14:48:12-07:00","message":"dev-python/pyscss-1.0.8 version bump.\n\nCloses #369.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"3691f00deee4b003db09cfec6f2abbb42e8010e7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3"},{"id":"f72c51b7f65ada1bd377298c0e462fed499afcee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/546c70884c3692f17eafa53f29ed7925ab9dcf3f","id":"546c70884c3692f17eafa53f29ed7925ab9dcf3f","committed_date":"2011-05-17T05:42:35-07:00","authored_date":"2011-05-17T05:42:35-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n python-osmgpsmap-0.7.3 keyworded x86.\n dexml-0.4.0 keyworded x86.\n cupage-0.5.5 keyworded x86.\n osm-gps-map-0.7.3 keyworded x86.\n Term-Animation-0.2.6 keyworded x86.\n lettuce-0.1.25 keyworded x86.","tree":"8df1051a7b7a1e0c0576043aa3fe34f4e91f49e6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"48b55622c5c478bb5e6ffa0426c37f16029e6637"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f72c51b7f65ada1bd377298c0e462fed499afcee","id":"f72c51b7f65ada1bd377298c0e462fed499afcee","committed_date":"2011-05-17T05:42:26-07:00","authored_date":"2011-05-17T05:42:17-07:00","message":"python-osmgpsmap-0.7.3 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"8df1051a7b7a1e0c0576043aa3fe34f4e91f49e6","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0e5d390672e7713ce9d6882820477fa26a2403a8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/48b55622c5c478bb5e6ffa0426c37f16029e6637","id":"48b55622c5c478bb5e6ffa0426c37f16029e6637","committed_date":"2011-05-17T05:41:49-07:00","authored_date":"2011-05-17T05:41:41-07:00","message":"dexml-0.4.0 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"fb4428443fc8cacde6c3a3aa5509503ffd63bf06","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"aadb8c461bcff5f98d2629791a6526319ebedebf"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0e5d390672e7713ce9d6882820477fa26a2403a8","id":"0e5d390672e7713ce9d6882820477fa26a2403a8","committed_date":"2011-05-17T05:41:16-07:00","authored_date":"2011-05-17T05:39:50-07:00","message":"cupage-0.5.5 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"4535e52b40718ba2adf17926605b504d28676d84","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"938698435b6feaeb5798b0b8265dec3c86a79f21"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/aadb8c461bcff5f98d2629791a6526319ebedebf","id":"aadb8c461bcff5f98d2629791a6526319ebedebf","committed_date":"2011-05-17T05:38:50-07:00","authored_date":"2011-05-17T05:38:43-07:00","message":"osm-gps-map-0.7.3 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"630850a2b4d6af7886aa4979d261f9f4b5bd9e44","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"1a81af79e9448cc17cb962e6e554d2f95627e48a"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/938698435b6feaeb5798b0b8265dec3c86a79f21","id":"938698435b6feaeb5798b0b8265dec3c86a79f21","committed_date":"2011-05-17T05:37:28-07:00","authored_date":"2011-05-17T05:37:17-07:00","message":"Term-Animation-0.2.6 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"86b67e7be739710b4a0dcd3c116e6789f617649c","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/1a81af79e9448cc17cb962e6e554d2f95627e48a","id":"1a81af79e9448cc17cb962e6e554d2f95627e48a","committed_date":"2011-05-17T05:36:49-07:00","authored_date":"2011-05-17T05:35:41-07:00","message":"lettuce-0.1.25 keyworded x86.\n\n(Portage version: 2.1.9.42/git/Linux x86, signed Manifest commit with key C0174749)","tree":"febaaf0a9ef70fe4393f783c0ced6ecdf758d28f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f305a8e19072faa41332ff771eef352d99b720dd"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a42f9cc6206d3ab898d7e3f128d9435bccec36f3","id":"a42f9cc6206d3ab898d7e3f128d9435bccec36f3","committed_date":"2011-05-17T04:36:30-07:00","authored_date":"2011-05-17T04:35:37-07:00","message":"Pushed Net-Twitter-Lite stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-perl/JSON-Any.","tree":"0bf98e75b14cbba85cd9d33723816d85a12630ff","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"0f13d2e4f32191aa0f2c5429666f0afb31934aee"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f305a8e19072faa41332ff771eef352d99b720dd","id":"f305a8e19072faa41332ff771eef352d99b720dd","committed_date":"2011-05-17T04:36:30-07:00","authored_date":"2011-05-17T04:35:04-07:00","message":"Pushed pycparser stabilisation back 90 days.\n\nStill waiting on upstream to stabilise dev-python/ply.","tree":"9699c4e28bcca4e7c9e60b0f6dfc19e6c49f5e43","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"44e4062f93c5d19d41f9d2158a382991f71b1142"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/0f13d2e4f32191aa0f2c5429666f0afb31934aee","id":"0f13d2e4f32191aa0f2c5429666f0afb31934aee","committed_date":"2011-05-17T04:36:22-07:00","authored_date":"2011-05-17T04:34:03-07:00","message":"Removed stale Net-Twitter-Lite ebuild.\n\n(Portage version: 2.1.9.42/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"9fd3fc814c8a76bde8e525caa1dd3271d4312209","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file +{"commits":[{"parents":[{"id":"85247d6de9d2d35dfd7eea3c23c894ea9aa263e4"},{"id":"be6ac09388ea7b360bc4a71a91f2633ce931276b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4de0834d58b37ef3020c49df43c95649217a2def","id":"4de0834d58b37ef3020c49df43c95649217a2def","committed_date":"2011-08-11T07:11:14-07:00","authored_date":"2011-08-11T07:11:14-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n cloud_sptheme-1.2 keyworded x96.\n cloud_sptheme-1.2 keyworded amd64.","tree":"02813cd1ea16d6284abf816169957441648c551e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9021f373b0ad17def7eb7de03954cc68710945a5"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/be6ac09388ea7b360bc4a71a91f2633ce931276b","id":"be6ac09388ea7b360bc4a71a91f2633ce931276b","committed_date":"2011-08-11T07:11:03-07:00","authored_date":"2011-08-11T07:10:48-07:00","message":"cloud_sptheme-1.2 keyworded x96.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"02813cd1ea16d6284abf816169957441648c551e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"85247d6de9d2d35dfd7eea3c23c894ea9aa263e4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9021f373b0ad17def7eb7de03954cc68710945a5","id":"9021f373b0ad17def7eb7de03954cc68710945a5","committed_date":"2011-08-11T03:51:40-07:00","authored_date":"2011-08-11T03:51:26-07:00","message":"cloud_sptheme-1.2 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"eb5b14b29cc928de40f066a49bd6b572f8673b34","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3c173e4dc67fff74aab98e3a5ca98bb1f1401456"},{"id":"7c6cb75cb7a1712c5dcc3e6198815983bd904025"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/85247d6de9d2d35dfd7eea3c23c894ea9aa263e4","id":"85247d6de9d2d35dfd7eea3c23c894ea9aa263e4","committed_date":"2011-08-10T09:16:59-07:00","authored_date":"2011-08-10T09:16:59-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n metrics-0.1_alpha3 keyworded amd64.\n pycallgraph-0.5.1 keyworded amd64.","tree":"66341bf3f80b46fc332d6c50ed25a4c4ce6fb491","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4a1bbcfa9d946db7c719e95af4d4911d96fe1551"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7c6cb75cb7a1712c5dcc3e6198815983bd904025","id":"7c6cb75cb7a1712c5dcc3e6198815983bd904025","committed_date":"2011-08-10T09:16:51-07:00","authored_date":"2011-08-10T09:16:41-07:00","message":"metrics-0.1_alpha3 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"66341bf3f80b46fc332d6c50ed25a4c4ce6fb491","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"3c173e4dc67fff74aab98e3a5ca98bb1f1401456"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4a1bbcfa9d946db7c719e95af4d4911d96fe1551","id":"4a1bbcfa9d946db7c719e95af4d4911d96fe1551","committed_date":"2011-08-10T09:16:19-07:00","authored_date":"2011-08-10T09:16:05-07:00","message":"pycallgraph-0.5.1 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"98d909db4b977f42033ed14966302b11e755b201","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9d279e279dfd06b3d5a85ebc65bac701ab027a2a"},{"id":"6379e79a11f0dbdc8ad98201e8de03634811a03b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/3c173e4dc67fff74aab98e3a5ca98bb1f1401456","id":"3c173e4dc67fff74aab98e3a5ca98bb1f1401456","committed_date":"2011-08-08T13:45:57-07:00","authored_date":"2011-08-08T13:45:57-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n pycallgraph-0.5.1 keyworded ~x86.\n metrics-0.1_alpha3 keyworded ~x86.\n html2rest-0.2.1 keyworded ~x86.","tree":"a60bcfc6ecce9a85108a5c05f478f5bcc471c19d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"34efdfb28d809350a41498222a87ae8630622e87"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/6379e79a11f0dbdc8ad98201e8de03634811a03b","id":"6379e79a11f0dbdc8ad98201e8de03634811a03b","committed_date":"2011-08-08T13:45:49-07:00","authored_date":"2011-08-08T13:44:37-07:00","message":"pycallgraph-0.5.1 keyworded ~x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"a60bcfc6ecce9a85108a5c05f478f5bcc471c19d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d3f3838a08eb022594420137525c871c44220495"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/34efdfb28d809350a41498222a87ae8630622e87","id":"34efdfb28d809350a41498222a87ae8630622e87","committed_date":"2011-08-08T13:45:46-07:00","authored_date":"2011-08-08T13:43:51-07:00","message":"metrics-0.1_alpha3 keyworded ~x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"d8d8fbf768a040b27af02a0840eda061a60bc19e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9653614dc45f297c0d913b5804f153696dc8083f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d3f3838a08eb022594420137525c871c44220495","id":"d3f3838a08eb022594420137525c871c44220495","committed_date":"2011-08-08T13:45:42-07:00","authored_date":"2011-08-08T13:42:30-07:00","message":"html2rest-0.2.1 keyworded ~x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"f1135c9e215876e697023ee7f1d52ca584affe08","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"86b044f91d9a16b221acfdc2f79593fd857e256f"},{"id":"9653614dc45f297c0d913b5804f153696dc8083f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9d279e279dfd06b3d5a85ebc65bac701ab027a2a","id":"9d279e279dfd06b3d5a85ebc65bac701ab027a2a","committed_date":"2011-08-08T13:41:47-07:00","authored_date":"2011-08-08T13:41:47-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n tox-1.1 keyworded x86.\n sure-0.6 keyworded x86.\n sphinxcontrib-httpdomain-0.1.5 keyworded x86.\n sphinxcontrib-googlechart-0.1.4 keyworded x86.\n sphinxcontrib-ansi-0.6 keyworded x86.\n seqdiag-0.3.7 keyworded x86.\n pgmagick-0.4 keyworded x86.\n nwdiag-0.2.7 keyworded x86.\n notmuch-0.6 keyworded x86.\n html-1.16 keyworded x86.\n gitdb-0.5.4 keyworded x86.\n blockdiag-0.8.4 keyworded x86.\n webcolors-1.3.1 keyworded x86.\n actdiag-0.1.7 keyworded x86.\n Pushed rstctl stabilisation back 90 days.","tree":"013bb4b3d14d6033fec487e25fd4edc5fa33dd66","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"36072788c7714fc804b71477bef5756e5b503686"},{"id":"7f535736c7cc92032fc3e000eb49e033a500ad85"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/86b044f91d9a16b221acfdc2f79593fd857e256f","id":"86b044f91d9a16b221acfdc2f79593fd857e256f","committed_date":"2011-08-08T13:41:44-07:00","authored_date":"2011-08-08T13:41:44-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n tox-1.1 keyworded amd64.\n sure-0.6 keyworded amd64.\n sphinxcontrib-httpdomain-0.1.5 keyworded amd64.\n sphinxcontrib-googlechart-0.1.4 keyworded amd64.\n sphinxcontrib-ansi-0.6 keyworded amd64.\n seqdiag-0.3.7 keyworded amd64.\n pgmagick-0.4 keyworded amd64.\n nwdiag-0.2.7 keyworded amd64.\n notmuch-0.6 keyworded amd64.\n html-0.16 keyworded amd64.\n gitdb-0.5.4 keyworded amd64.\n blockdiag-0.8.4 keyworded amd64.\n webcolors-1.3.1 keyworded amd64.\n actdiag-0.1.7 keyworded amd64.\n Pushed rstctl stabilisation back 90 days.","tree":"065e156553982ed5c8c5430b11c53494b897a717","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b697694822e52e371d7ed39bedfc240e4e11dcf2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/9653614dc45f297c0d913b5804f153696dc8083f","id":"9653614dc45f297c0d913b5804f153696dc8083f","committed_date":"2011-08-08T13:41:35-07:00","authored_date":"2011-08-08T13:38:32-07:00","message":"tox-1.1 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"013bb4b3d14d6033fec487e25fd4edc5fa33dd66","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"76e3af7354c0de85771f17af004d3e0c428e50a2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b697694822e52e371d7ed39bedfc240e4e11dcf2","id":"b697694822e52e371d7ed39bedfc240e4e11dcf2","committed_date":"2011-08-08T13:41:34-07:00","authored_date":"2011-08-08T13:37:56-07:00","message":"sure-0.6 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"bc64b8a5e0b40226119edac879d336c1e5fdf2c5","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f0a9c03882fa92001869f2eb930d807408738c0d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/76e3af7354c0de85771f17af004d3e0c428e50a2","id":"76e3af7354c0de85771f17af004d3e0c428e50a2","committed_date":"2011-08-08T13:41:33-07:00","authored_date":"2011-08-08T13:37:33-07:00","message":"sphinxcontrib-httpdomain-0.1.5 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"abf592f48a7e2ad9f22ea78618a3e0ab456d589b","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d1cdabe1cc4aa53bc334607665249c8bea03fda8"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f0a9c03882fa92001869f2eb930d807408738c0d","id":"f0a9c03882fa92001869f2eb930d807408738c0d","committed_date":"2011-08-08T13:41:32-07:00","authored_date":"2011-08-08T13:37:02-07:00","message":"sphinxcontrib-googlechart-0.1.4 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"2379ef9ba93db2f719ebec1796c983522aacab37","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e1e608d71309c02a572631108a95ca75ce9513e7"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/d1cdabe1cc4aa53bc334607665249c8bea03fda8","id":"d1cdabe1cc4aa53bc334607665249c8bea03fda8","committed_date":"2011-08-08T13:41:29-07:00","authored_date":"2011-08-08T13:35:37-07:00","message":"sphinxcontrib-ansi-0.6 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"028250871750a79b598197fb13f34618f191383f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5cd151be2a612875d311db2ffed04dfd760827f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/e1e608d71309c02a572631108a95ca75ce9513e7","id":"e1e608d71309c02a572631108a95ca75ce9513e7","committed_date":"2011-08-08T13:40:28-07:00","authored_date":"2011-08-08T13:34:16-07:00","message":"seqdiag-0.3.7 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"5f2eac33e42893dcf62770ce597072d90d03703a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"62ffa4958619aced3a04bd7edda935cacfe46ad4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/f5cd151be2a612875d311db2ffed04dfd760827f","id":"f5cd151be2a612875d311db2ffed04dfd760827f","committed_date":"2011-08-08T13:39:43-07:00","authored_date":"2011-08-08T13:33:47-07:00","message":"pgmagick-0.4 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"993a303618ce8cba057088100008ed10a01e59d2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"bc77a39dbc61e30ac712114fad1f25d8cd9efafa"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/62ffa4958619aced3a04bd7edda935cacfe46ad4","id":"62ffa4958619aced3a04bd7edda935cacfe46ad4","committed_date":"2011-08-08T13:39:39-07:00","authored_date":"2011-08-08T13:33:10-07:00","message":"nwdiag-0.2.7 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"e45dfd3427dd1f73f77bb620d6766bb243dd90da","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"97fb801046805bec82398c8dcbb1cc901a162631"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/bc77a39dbc61e30ac712114fad1f25d8cd9efafa","id":"bc77a39dbc61e30ac712114fad1f25d8cd9efafa","committed_date":"2011-08-08T13:39:37-07:00","authored_date":"2011-08-08T13:32:40-07:00","message":"notmuch-0.6 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"5e02cd9526189e3ddda11d0e5f469ee8e5cccd9f","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b53f10f90d35338a52a77ed261914e7c5231e710"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/97fb801046805bec82398c8dcbb1cc901a162631","id":"97fb801046805bec82398c8dcbb1cc901a162631","committed_date":"2011-08-08T13:39:35-07:00","authored_date":"2011-08-08T13:32:04-07:00","message":"html-1.16 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"4d6158007976a55807667c7e9bf4079a711b12b4","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c60fefb7c493b68fec49f6532fb482d94ad82afb"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/b53f10f90d35338a52a77ed261914e7c5231e710","id":"b53f10f90d35338a52a77ed261914e7c5231e710","committed_date":"2011-08-08T13:39:32-07:00","authored_date":"2011-08-08T13:31:32-07:00","message":"gitdb-0.5.4 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"405d3a20a2e678a04795661f4468f72adf44bdb1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8fbdffdbb4c7fa41480005a64ea4050848eaf957"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/c60fefb7c493b68fec49f6532fb482d94ad82afb","id":"c60fefb7c493b68fec49f6532fb482d94ad82afb","committed_date":"2011-08-08T13:39:29-07:00","authored_date":"2011-08-08T13:31:04-07:00","message":"blockdiag-0.8.4 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"216174a1d38635ce910eb4b09c56d3d6eafb1804","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"7ca5fd4143d3ba24ca7167a0151233bc6bbe360f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/8fbdffdbb4c7fa41480005a64ea4050848eaf957","id":"8fbdffdbb4c7fa41480005a64ea4050848eaf957","committed_date":"2011-08-08T13:39:26-07:00","authored_date":"2011-08-08T13:30:36-07:00","message":"webcolors-1.3.1 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"7338cc0a184ff2d1b28ab848935d0289afeaac41","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ec56adae8d604fb30e169b058f0ebb227bf1b157"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7ca5fd4143d3ba24ca7167a0151233bc6bbe360f","id":"7ca5fd4143d3ba24ca7167a0151233bc6bbe360f","committed_date":"2011-08-08T13:39:23-07:00","authored_date":"2011-08-08T13:30:08-07:00","message":"actdiag-0.1.7 keyworded x86.\n\n(Portage version: 2.1.10.3/git/Linux x86, signed Manifest commit with key C0174749)","tree":"06b3f9742f2c531a931bf69ff04d7b0426f2b8bc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"1ad6dacf95f19da9cccd511443a5212e1e870672"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/ec56adae8d604fb30e169b058f0ebb227bf1b157","id":"ec56adae8d604fb30e169b058f0ebb227bf1b157","committed_date":"2011-08-08T13:29:22-07:00","authored_date":"2011-08-08T13:29:22-07:00","message":"Pushed rstctl stabilisation back 90 days.\n\nStill waiting on upstream to stabilise pastescript.","tree":"d456b0bf965aaf1f849612e301f7b3ab767a8402","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"9dcf33553857afa0dd32b4222ca805c0add7249a"},{"id":"7f535736c7cc92032fc3e000eb49e033a500ad85"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/1ad6dacf95f19da9cccd511443a5212e1e870672","id":"1ad6dacf95f19da9cccd511443a5212e1e870672","committed_date":"2011-08-08T13:28:39-07:00","authored_date":"2011-08-08T13:28:39-07:00","message":"Merge branch 'maint/amd64_keywording' into maint/x86_keywording\n\n* maint/amd64_keywording:\n tox-1.1 keyworded amd64.\n sure-0.6 keyworded amd64.\n sphinxcontrib-httpdomain-0.1.5 keyworded amd64.\n sphinxcontrib-googlechart-0.1.4 keyworded amd64.\n sphinxcontrib-ansi-0.6 keyworded amd64.\n seqdiag-0.3.7 keyworded amd64.\n pgmagick-0.4 keyworded amd64.\n nwdiag-0.2.7 keyworded amd64.\n notmuch-0.6 keyworded amd64.\n html-0.16 keyworded amd64.\n gitdb-0.5.4 keyworded amd64.\n blockdiag-0.8.4 keyworded amd64.\n webcolors-1.3.1 keyworded amd64.\n actdiag-0.1.7 keyworded amd64.\n Pushed rstctl stabilisation back 90 days.\n html2rest-0.2.1 keyworded amd64.\n Pushed ditz stabilisation back 90 days.","tree":"065e156553982ed5c8c5430b11c53494b897a717","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"dd9340879777d4642ff7e025e6d2569599e7272f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/7f535736c7cc92032fc3e000eb49e033a500ad85","id":"7f535736c7cc92032fc3e000eb49e033a500ad85","committed_date":"2011-08-08T13:22:29-07:00","authored_date":"2011-08-08T13:21:53-07:00","message":"tox-1.1 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"065e156553982ed5c8c5430b11c53494b897a717","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"96db5d30ddc886429618c8ea002243c4d4146659"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/dd9340879777d4642ff7e025e6d2569599e7272f","id":"dd9340879777d4642ff7e025e6d2569599e7272f","committed_date":"2011-08-08T13:22:29-07:00","authored_date":"2011-08-08T13:21:24-07:00","message":"sure-0.6 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"979b63e1deee4731ba6290c7a89b7bb5f7f1d21a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4fbb3e8b7109e217e417a19a9ede20c3eb4ebe73"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/96db5d30ddc886429618c8ea002243c4d4146659","id":"96db5d30ddc886429618c8ea002243c4d4146659","committed_date":"2011-08-08T13:22:29-07:00","authored_date":"2011-08-08T13:20:53-07:00","message":"sphinxcontrib-httpdomain-0.1.5 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"4ed313a70faad4a0888956c47a25d0e178c676e2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"2e57f31917ca081838d4ef7406107bd9c843b8fa"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/4fbb3e8b7109e217e417a19a9ede20c3eb4ebe73","id":"4fbb3e8b7109e217e417a19a9ede20c3eb4ebe73","committed_date":"2011-08-08T13:22:28-07:00","authored_date":"2011-08-08T13:20:23-07:00","message":"sphinxcontrib-googlechart-0.1.4 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"8548f7bf7cf76d705dd117e7194480664a9b5c1a","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"27ff4013a0d780b739c2ca5240c9c644c7e04ab9"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/2e57f31917ca081838d4ef7406107bd9c843b8fa","id":"2e57f31917ca081838d4ef7406107bd9c843b8fa","committed_date":"2011-08-08T13:22:28-07:00","authored_date":"2011-08-08T13:19:38-07:00","message":"sphinxcontrib-ansi-0.6 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"906a81b9ab4106b58b5d1db0bf28e39fc92e26b0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a16eecb18e2499bf0376080bbfd55272dfcc4ab1"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/27ff4013a0d780b739c2ca5240c9c644c7e04ab9","id":"27ff4013a0d780b739c2ca5240c9c644c7e04ab9","committed_date":"2011-08-08T13:22:28-07:00","authored_date":"2011-08-08T13:19:03-07:00","message":"seqdiag-0.3.7 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"e11362ea5928230d4ba856a7cceab97cc1bdd378","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"cdad2422fb73adeb752220c5d489673f8a91b8ba"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/misc-overlay/commit/a16eecb18e2499bf0376080bbfd55272dfcc4ab1","id":"a16eecb18e2499bf0376080bbfd55272dfcc4ab1","committed_date":"2011-08-08T13:22:28-07:00","authored_date":"2011-08-08T13:18:36-07:00","message":"pgmagick-0.4 keyworded amd64.\n\n(Portage version: 2.1.10.3/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"ff6404094d6f6cf7308654430df25e02d94c7dae","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c index a1a5c48..6340de4 100644 --- a/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c +++ b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c @@ -1,14 +1,17 @@ status: 200 -content-length: 1578 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/show/ask/python-github2/1c83cde9b5a7c396a01af1007fb7b88765b9ae45 +-content-encoding: gzip set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly -x-runtime: 38ms -server: nginx/0.7.67 connection: keep-alive -etag: "567523fc76cd6ee4352ee33b178781af" +content-length: 1578 +server: nginx/1.0.4 +x-runtime: 32ms +x-ratelimit-limit: 60 +etag: "848c200dc06e8b9b766294e99f795601" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:43:09 GMT +date: Mon, 15 Aug 2011 19:59:15 GMT content-type: application/json; charset=utf-8 {"commit":{"modified":[{"diff":"--- a/github2/bin/manage_collaborators.py\n+++ b/github2/bin/manage_collaborators.py\n@@ -25,6 +25,8 @@ def parse_commandline():\n '\\nTry %prog --help for details.')\n parser.add_option('-d', '--debug', action='store_true',\n help='Enables debugging mode')\n+ parser.add_option('-c', '--cache', default=None,\n+ help='Location for network cache [default: None]')\n parser.add_option('-l', '--login',\n help='Username to login with')\n parser.add_option('-a', '--account',\n@@ -59,7 +61,7 @@ def main():\n \n github = github2.client.Github(username=options.login,\n api_token=options.apitoken,\n- debug=options.debug)\n+ debug=options.debug, cache=options.cache)\n \n if len(args) == 1:\n for repos in github.repos.list(options.account):","filename":"github2/bin/manage_collaborators.py"}],"parents":[{"id":"7d1c855d2f44a55e4b90b40017be697cf70cb4a0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/ask/python-github2/commit/1c83cde9b5a7c396a01af1007fb7b88765b9ae45","id":"1c83cde9b5a7c396a01af1007fb7b88765b9ae45","committed_date":"2011-06-06T16:13:50-07:00","authored_date":"2011-06-06T16:13:50-07:00","message":"Added cache support to manage_collaborators.","tree":"f48fcc1a0b8ea97f3147dc42cf7cdb6683493e94","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e b/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e index c16be20..4b819b2 100644 --- a/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e +++ b/tests/data/github.com,api,v2,json,issues,comments,ask,python-github2,24,fd493a9ada4c1de1cd592293f9c2049e @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 57 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/issues/comments/ask/python-github2/24 -x-runtime: 17ms -content-length: 9146 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 9146 +server: nginx/1.0.4 +x-runtime: 29ms x-ratelimit-limit: 60 -etag: "cf41a767767e5b6a2c8af3b6eb6e36df" +etag: "e72eb1f693f00e16b71da10917f2893b" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:42:33 GMT +date: Thu, 25 Aug 2011 06:54:09 GMT content-type: application/json; charset=utf-8 {"comments":[{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/09 22:37:26 -0800","body":"Great addition! Could you please implement the paging stuff for all API routes that support paging? Having paging for route A, but not for route B might be confusing and nobody exactly knows which API routes have been covered already.\r\n\r\nThanks in advance,\r\nVincent\r\n","updated_at":"2010/12/09 22:37:26 -0800","id":601871,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/09 23:48:23 -0800","body":"Sure, but I have another idea.\r\n\r\nList methods could return not a list but an iterable object just like Django ORM's QuerySet, which supports slicing. And this iterable object will hide internal github's paging implementation from the end user of the python-github2.\r\n\r\nFor example, they could iterate over all commits using:\r\n\r\n for commit in gh.commits.list('django/django'):\r\n process(commit)\r\n\r\nAnd github2 will make as many requests to the GitHub as required.\r\n\r\nOr user coul only fetch first 100 commits:\r\n\r\n for commit in gh.commits.list('django/django')[:100]:\r\n process(commit)\r\n\r\nAnd github2 will do no more than 3 requests to the GitHub behind the scene?\r\n\r\nI see only one con against this approach. It is backward incompartible with the previous code and to convert old code which uses github2 to work with new library, you have to use limits and perhaps lists:\r\n\r\nIf previously you wrote `commits = hg.commits.list('django/django')` and receive no more than 30 items in the list, then now you will have to write `commits = gh.commits.list('django/django')[:LIMIT]` or, if you really need a list here: `commits = list(gh.commits.list('django/django')[:LIMIT])`.\r\n\r\nI suggest this implementation because without that, many developers who using github2, will have to implement same logic in their own code. For example, here is my curren implementation of the generator:\r\n\r\n def get_commits(*params):\r\n \"\"\" Generator which fetches commits from\r\n given repository until LIMIT\r\n will be reached.\r\n \"\"\"\r\n page = 1 \r\n limit = config.LIMIT\r\n\r\n commits = gh.commits.list(page = page, *params)\r\n while commits:\r\n for commit in commits:\r\n yield commit\r\n limit -= 1\r\n if limit == 0:\r\n raise StopIteration\r\n page += 1\r\n commits = gh.commits.list(page = page, *params)\r\n\r\nBy the way, such generator could be generalized to use with any listable github's object if it will support the page argument in it's list method. And this will allow us to keep backward compatibility. But this approach is a compromise :( ","updated_at":"2010/12/09 23:48:23 -0800","id":601937,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 01:15:05 -0800","body":"I think the addition of an iterator hiding the details of paging is a great fit for this library. The backward incompatibility is a bit tricky, so I'm not too fond of changing the list method. Instead, we could solve this by providing an `iter()` method instead of `list()`? Then `list()` can keep its current semantics and people can use an iterator in the case they prefer that.\r\n\r\nBy the way: in your code sample you call `gh.commits.list('django/django')[:LIMIT]`, but AFAIK iterators aren't subscriptable. (Subscript semantics on iterators is really hard, since they involve state.) Using islice could do the trick like this, however:\r\n\r\n islice(gh.commits.list('django/django'), None, LIMIT)\r\n","updated_at":"2010/12/13 01:15:05 -0800","id":607643,"user":"nvie"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 01:28:05 -0800","body":"We could even let the `iter()` method return the islice'd iterator:\r\n\r\n def iter(self, start=None, stop=None):\r\n ...\r\n return islice(commits, start, stop)\r\n\r\nThat way, you can simply call:\r\n\r\n # iter over all commits\r\n for c in gh.commits.iter():\r\n ...\r\n \r\n # iter over a subset\r\n for c in gh.commits.iter(25, 100):\r\n ...\r\n","updated_at":"2010/12/13 01:28:05 -0800","id":607666,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/13 03:37:50 -0800","body":"Of cause, you can't apply [:LIMIT] to an iterator, but you can do this with any _iterable_ object. This will look like this for end user:\r\n\r\n for c in gh.commits.iter('django/django')[:50]:\r\n ...\r\n\r\nI'll try to write the implementation within few days, and will send you another pull request.","updated_at":"2010/12/13 03:37:50 -0800","id":607829,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/13 07:27:50 -0800","body":"Yeah, what I meant is that (lazy) iterables are not subscriptable (at least not up until Python 2.6), so the above code yields a syntax error. See this:\r\n\r\n >>> def count(): \r\n ... i = 0 \r\n ... while True: \r\n ... yield i \r\n ... i += 1 \r\n ... \r\n >>> for i in count()[:50]: \r\n ... print i \r\n ... \r\n Traceback (most recent call last): \r\n File \"\", line 1, in \r\n TypeError: 'generator' object is unsubscriptable \r\n >>>\r\n\r\nHowever, if you wrap it in an islice wrapper, you can subscript these kinds of infinite lists:\r\n\r\n >>> from itertools import islice\r\n >>> for i in islice(count(), None, 7):\r\n ... print i\r\n ...\r\n 0\r\n 1\r\n 2\r\n 3\r\n 4\r\n 5\r\n 6\r\n\r\nAn alternative is to resolve the iterator's elements, which looses the laziness (and therefore doesn't work with infinite lists).\r\n\r\n for c in list(gh.commits.iter())[:50]:\r\n ....\r\n\r\nThis would effectively fetch *ALL* commit objects in GitHub in one big list and then slice the first 50 out of that result.","updated_at":"2010/12/13 07:27:50 -0800","id":608217,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/13 08:19:17 -0800","body":"Generators like this one are not subscribtable, but this does not mean, that I can't return in immediate object from `iter` method which will support slicing and iteration. Wait for the patch, ok? :)","updated_at":"2010/12/13 08:19:17 -0800","id":608365,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/21 14:21:14 -0800","body":"Hey Alexander, how's your patch progressing?","updated_at":"2010/12/21 14:21:14 -0800","id":628461,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2010/12/21 14:30:26 -0800","body":"Hi. Sorry for delay. It is hard to do this in stable manner, because there is no any documentation from the GitHub and I found no way to tell GitHub the page size.\r\n\r\nBy default, page size is 35 items. I need to know that this value will never changed or (better) to specify it myself. Without this, I can't to implement a reliable slicing.\r\n\r\nIf you want, I could try to implement it and hardcode that page's size is 35 items, but it could be broken someday.","updated_at":"2010/12/21 14:30:26 -0800","id":628486,"user":"svetlyak40wt"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","created_at":"2010/12/22 12:40:18 -0800","body":"You can safely use the static page size, [technoweenie](https://github.com/technoweenie) himself [promised me](http://twitter.com/technoweenie/status/17676244548059136) it won't change for the v2 API.","updated_at":"2010/12/22 12:40:18 -0800","id":630757,"user":"nvie"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","created_at":"2011/01/04 16:26:06 -0800","body":"Ok, I wrote this helper, to solve this task: https://github.com/svetlyak40wt/pagerator\r\nIt is generalized and could be used anywhere else, to iterate over any paged results.\r\n\r\nFor our case, gh.commits.iter() method should return be:\r\n\r\n def iter(self, project, branch=\"master\", file=None):\r\n return pagerator.IterableQuery(\r\n lambda page: self.get_values(\r\n \"list\", project, branch, file,\r\n filter=\"commits\", datatype=Commit,\r\n post_data=dict(page=page+1)\r\n ), \r\n 35 # page_size hardcoded in the GitHub\r\n )\r\n\r\nBut I can't test it right now, because I receive \"api route not recognized\" error from the GitHub, even for list method which worked previously. Do you know how to fix it?","updated_at":"2011/01/04 16:26:06 -0800","id":653676,"user":"svetlyak40wt"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca b/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca index 84de95f..5c09af0 100644 --- a/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca +++ b/tests/data/github.com,api,v2,json,issues,labels,JNRowe,misc-overlay,b81a30109b72cf3356114dcc6e2e29ca @@ -1,14 +1,15 @@ status: 200 x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/issues/labels/JNRowe/misc-overlay -x-runtime: 10ms -content-length: 35 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 44 +server: nginx/1.0.4 +x-runtime: 7ms x-ratelimit-limit: 60 -etag: "a97c4b6aaa3d373f86315a8577170b10" +etag: "966c6e8f6191c75088f7aeb71f8e458a" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:42:11 GMT +date: Thu, 25 Aug 2011 06:49:36 GMT content-type: application/json; charset=utf-8 -{"labels":["feature","bug","task"]} \ No newline at end of file +{"labels":["feature","bug","task","test_2"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 index eec6517..e8a53e5 100644 --- a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 +++ b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,closed,3662da90eba27809e7bff7600392ec94 @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 57 +status: 200 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/issues/list/ask/python-github2/closed +-content-encoding: gzip connection: keep-alive -content-length: 46568 -server: nginx/0.7.67 -x-runtime: 233ms +content-length: 52973 +server: nginx/1.0.4 +x-runtime: 342ms x-ratelimit-limit: 60 -etag: "99198abdc7b302c3eb2571030f4bee4c" +etag: "4a2070617d134387326d466eb9068195" cache-control: private, max-age=0, must-revalidate -date: Tue, 31 May 2011 13:57:50 GMT +date: Thu, 25 Aug 2011 06:51:25 GMT content-type: application/json; charset=utf-8 -{"issues":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":52.0,"number":52,"votes":0,"created_at":"2011/05/28 02:03:37 -0700","comments":0,"body":"\nSee [this bug](https://github.com/ask/python-github2/issues/51#issuecomment-1253464)","title":"Document purpose, and use, of ``debug`` attributes.","updated_at":"2011/05/28 06:40:00 -0700","closed_at":"2011/05/28 06:40:00 -0700","html_url":"https://github.com/ask/python-github2/issues/52","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":51.0,"number":51,"votes":0,"created_at":"2011/05/28 01:09:46 -0700","comments":12,"body":"```pycon \r\n>>> github.repos.watch(\"schacon/grit\")\r\nTraceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/repositories.py\", line 69, in watch\r\n return self.make_request(\"watch\", project)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\r\n result = self.raw_request(url, extra_post_data, method=method)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\r\n response.status, content))\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"invalid repository to watch\"}'\r\n\r\n```\r\n\r\nI can't seem to watch that repository. I used the OAuth key to get the github object. ","title":"Watching repositories doesn't work","updated_at":"2011/05/28 20:30:12 -0700","closed_at":"2011/05/28 20:30:11 -0700","html_url":"https://github.com/ask/python-github2/issues/51","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":50.0,"number":50,"votes":0,"created_at":"2011/05/23 18:05:57 -0700","comments":2,"body":"","title":"Fixing the init of the proxy code.","updated_at":"2011/05/23 21:09:45 -0700","diff_url":"https://github.com/ask/python-github2/pull/50.diff","patch_url":"https://github.com/ask/python-github2/pull/50.patch","pull_request_url":"https://github.com/ask/python-github2/pull/50","closed_at":"2011/05/23 20:43:20 -0700","html_url":"https://github.com/ask/python-github2/issues/50","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":49.0,"number":49,"votes":0,"created_at":"2011/05/20 11:46:19 -0700","comments":8,"body":"I am was wondering if you could better document the Mocks being used for testing. I wouldn't mind writing up the test cases, if you could comment the testing code that is currently present. Increase the robustness of the project. \n\nThoughts? Even a link to the background knowledge needed to understand what you are doing. I am tried creating a couple of tests in my branch but unable to get anything but errors. \n\nMaybe a wiki describing setup and what needs to be done. ","title":"Testing Documentation/Wiki","updated_at":"2011/05/22 14:25:06 -0700","closed_at":"2011/05/22 14:25:06 -0700","html_url":"https://github.com/ask/python-github2/issues/49","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":48.0,"number":48,"votes":0,"created_at":"2011/05/19 08:40:47 -0700","comments":3,"body":"* Added basic proxy support documentation","title":"Add proxy documentation","updated_at":"2011/05/19 15:12:47 -0700","diff_url":"https://github.com/ask/python-github2/pull/48.diff","patch_url":"https://github.com/ask/python-github2/pull/48.patch","pull_request_url":"https://github.com/ask/python-github2/pull/48","closed_at":"2011/05/19 15:09:09 -0700","html_url":"https://github.com/ask/python-github2/issues/48","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":47.0,"number":47,"votes":0,"created_at":"2011/05/18 18:40:20 -0700","comments":1,"body":"Made the socks stuff optional. I wasnt able to test the extras_require portion of the setup.py (im not terribly well versed in setuptools) but i tested manually by uninstalling/reinstalling the socks lib and watching the error raised.","title":"Updated Add Proxy Support - now optional","updated_at":"2011/05/18 19:04:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/47.diff","patch_url":"https://github.com/ask/python-github2/pull/47.patch","pull_request_url":"https://github.com/ask/python-github2/pull/47","closed_at":"2011/05/18 19:04:29 -0700","html_url":"https://github.com/ask/python-github2/issues/47","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":46.0,"number":46,"votes":0,"created_at":"2011/05/18 09:37:00 -0700","comments":12,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/23 18:06:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/46.diff","patch_url":"https://github.com/ask/python-github2/pull/46.patch","pull_request_url":"https://github.com/ask/python-github2/pull/46","closed_at":"2011/05/19 07:59:05 -0700","html_url":"https://github.com/ask/python-github2/issues/46","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":45.0,"number":45,"votes":0,"created_at":"2011/05/18 08:47:38 -0700","comments":1,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/18 09:07:34 -0700","diff_url":"https://github.com/ask/python-github2/pull/45.diff","patch_url":"https://github.com/ask/python-github2/pull/45.patch","pull_request_url":"https://github.com/ask/python-github2/pull/45","closed_at":"2011/05/18 09:07:33 -0700","html_url":"https://github.com/ask/python-github2/issues/45","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":44.0,"number":44,"votes":0,"created_at":"2011/05/14 20:43:34 -0700","comments":13,"body":"When getting the commits for repositories that have '.' it can't seem to find the repository.\n\n``` pycon\n>>> commits += github.commits.list('kennethreitz/osxpython.org')\nTraceback (most recent call last):\n File \"\", line 1, in \n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/commits.py\", line 37, in list\n filter=\"commits\", datatype=Commit)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 75, in get_values\n values = self.make_request(*args, **kwargs)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\n response = self.request.get(self.domain, command, *args)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\n return self.make_request(\"/\".join(path_components))\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\n result = self.raw_request(url, extra_post_data, method=method)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\n response.status, content))\nRuntimeError: unexpected response from github.com 404: '{\"error\":\"Not Found\"}'\n```","title":"repositories with '.' are not found","updated_at":"2011/05/26 23:46:28 -0700","closed_at":"2011/05/26 18:03:57 -0700","html_url":"https://github.com/ask/python-github2/issues/44","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2028496e3344d92d8b3af64eb0d9e19e","position":43.0,"number":43,"votes":0,"created_at":"2011/05/09 20:51:03 -0700","comments":8,"body":"The docs are already using Sphinx. It'd be much more convenient if they were hosted.\r\n\r\nhttp://Readthedocs.org is free and sphinx powered, getting them up there should be easy.\r\n\r\nFun even.","title":"Read the Docs","updated_at":"2011/05/11 07:02:48 -0700","closed_at":"2011/05/11 06:44:44 -0700","html_url":"https://github.com/ask/python-github2/issues/43","user":"GraylinKim","labels":[],"state":"closed"},{"gravatar_id":"b7699be15e710c4be309f9d537fb252b","position":42.0,"number":42,"votes":0,"created_at":"2011/05/09 08:24:36 -0700","comments":12,"body":"This is my just running 2to3 over the library, and fixing one or two things with json. Don't know if you want or need it. I'm using it for some blogofile stuff, which just bumped to python 3 for all main development, and wanted to keep using your work with my site.","title":"Python3","updated_at":"2011/05/23 00:55:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/42.diff","patch_url":"https://github.com/ask/python-github2/pull/42.patch","pull_request_url":"https://github.com/ask/python-github2/pull/42","closed_at":"2011/05/19 15:19:30 -0700","html_url":"https://github.com/ask/python-github2/issues/42","user":"goosemo","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":41.0,"number":41,"votes":0,"created_at":"2011/04/24 09:35:15 -0700","comments":3,"body":"","title":"Easy way to call tests from cli","updated_at":"2011/04/27 09:45:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/41.diff","patch_url":"https://github.com/ask/python-github2/pull/41.patch","pull_request_url":"https://github.com/ask/python-github2/pull/41","closed_at":"2011/04/27 09:45:11 -0700","html_url":"https://github.com/ask/python-github2/issues/41","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","position":40.0,"number":40,"votes":0,"created_at":"2011/04/22 12:26:50 -0700","comments":3,"body":"https://github.com/broderboy/python-github2/commit/48d85d517b4e51652217b71b264c866caa5ca874\r\n\r\nI'm not sure why git put that as a full file change\r\nline changed: prune doc/.build\r\n\r\nThanks\r\n\r\nOriginal Error: \r\nrunning install\r\nrunning bdist_egg\r\nrunning egg_info\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nreading manifest file 'github2.egg-info\\SOURCES.txt'\r\nreading manifest template 'MANIFEST.in'\r\nTraceback (most recent call last):\r\n File \".\\setup.py\", line 46, in \r\n \"Topic :: Software Development :: Libraries\",\r\n File \"C:\\Python26\\lib\\distutils\\core.py\", line 152, in setup\r\n dist.run_commands()\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 975, in run_commands\r\n self.run_command(cmd)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 73, in run\r\n self.do_egg_install()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 93, in do_egg_install\r\n self.run_command('bdist_egg')\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\bdist_egg.py\", line 167, in run\r\n self.run_command(\"egg_info\")\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 179, in run\r\n self.find_sources()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 254, in find_sources\r\n mm.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 310, in run\r\n self.read_template()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\sdist.py\", line 204, in read_template\r\n _sdist.read_template(self)\r\n File \"C:\\Python26\\lib\\distutils\\command\\sdist.py\", line 336, in read_template\r\n self.filelist.process_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 129, in process_template_line\r\n (action, patterns, dir, dir_pattern) = self._parse_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 112, in _parse_template_line\r\n dir_pattern = convert_path(words[1])\r\n File \"C:\\Python26\\lib\\distutils\\util.py\", line 201, in convert_path\r\n raise ValueError, \"path '%s' cannot end with '/'\" % pathname\r\nValueError: path 'doc/.build/' cannot end with '/'","title":"Modified MANIFEST.in. It wasn't installing on Windows","updated_at":"2011/04/23 07:18:49 -0700","diff_url":"https://github.com/ask/python-github2/pull/40.diff","patch_url":"https://github.com/ask/python-github2/pull/40.patch","pull_request_url":"https://github.com/ask/python-github2/pull/40","closed_at":"2011/04/23 04:53:48 -0700","html_url":"https://github.com/ask/python-github2/issues/40","user":"broderboy","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":38.0,"number":38,"votes":0,"created_at":"2011/04/17 17:11:51 -0700","comments":9,"body":"e.g when I am using the call \r\n\r\nGithub(access_token=oauthtoken) -- it seems to work fine for all calls expect, the following call \r\n\r\nproject being repo.project\r\n\r\ncommits += self.client.commits.list(str(project))\r\n\r\n\r\nI get the follow exception\r\n\r\nunexpected response from github.com 401: '{\"error\":\"Couldn\\'t authenticate you\"}'\r\n\r\nI managed to work around this issue by creating the self.client using the following instantiation \r\n\r\nGithub(self.oauthtoken)\r\n\r\nIt probably not being pass down the OAuth token on the particular call. \r\n","title":"OAuth token isn't being passed down","updated_at":"2011/05/11 09:48:20 -0700","closed_at":"2011/05/11 09:48:20 -0700","html_url":"https://github.com/ask/python-github2/issues/38","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2c8089a78bf15883302e9ac5b4367895","position":37.0,"number":37,"votes":0,"created_at":"2011/04/14 17:19:33 -0700","comments":2,"body":"The current [Commits API](http://develop.github.com/p/commits.html) specifies a user_id in the pathspec:\n\n`commits/list/:user_id/:repository/:branch`\n`commits/list/:user_id/:repository/:branch/*path`\n\nThis parameter was not present in the `list` or `show` methods of the `Commits` class, consequently requesting commits was not possible (as far as I could tell)\n\n","title":"added user_id to commits path spec","updated_at":"2011/04/15 05:13:56 -0700","diff_url":"https://github.com/ask/python-github2/pull/37.diff","patch_url":"https://github.com/ask/python-github2/pull/37.patch","pull_request_url":"https://github.com/ask/python-github2/pull/37","closed_at":"2011/04/15 05:13:56 -0700","html_url":"https://github.com/ask/python-github2/issues/37","user":"loganlinn","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":36.0,"number":36,"votes":0,"created_at":"2011/04/12 03:47:52 -0700","comments":2,"body":"@ask and interested others,\r\n\r\nYou said to treat the repo like home, but I just wanted to run this past you in case you have objections.\r\n\r\nThe changes are quite invasive. It strips out the examples from `README.rst`(it is a bit cluttered IMO), reformats many docstrings for use with Sphinx's [autodoc](http://sphinx.pocoo.org/tutorial.html#autodoc), fiddles with the cool `Attribute` docstring generator, etc.\r\n\r\nOpinions? If part of it is okay, say which part and I'll remove/rework the rest. If you hate it all just say so, it won't hurt my feelings I promise ;)\r\n\r\nThanks,\r\n\r\nJames","title":"Using Sphinx doc for documentation","updated_at":"2011/04/13 13:06:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/36.diff","patch_url":"https://github.com/ask/python-github2/pull/36.patch","pull_request_url":"https://github.com/ask/python-github2/pull/36","closed_at":"2011/04/13 13:01:44 -0700","html_url":"https://github.com/ask/python-github2/issues/36","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","position":35.0,"number":35,"votes":0,"created_at":"2011/04/10 18:02:50 -0700","comments":1,"body":"I added a function to get all blobs as a dictionary between the path & sha for a given tree. ","title":"Get All Blobs","updated_at":"2011/04/11 02:38:53 -0700","diff_url":"https://github.com/ask/python-github2/pull/35.diff","patch_url":"https://github.com/ask/python-github2/pull/35.patch","pull_request_url":"https://github.com/ask/python-github2/pull/35","closed_at":"2011/04/11 02:38:53 -0700","html_url":"https://github.com/ask/python-github2/issues/35","user":"surajram","labels":[],"state":"closed"},{"gravatar_id":"3aa27c0add742f542848af3b8a9e980c","position":34.0,"number":34,"votes":0,"created_at":"2011/03/26 10:57:22 -0700","comments":4,"body":"e.g. github.repos.list() specifies following behaviour: \"If no user is given, repositoris for the currently logged in user are returned.\"\r\n\r\nHowever this works only if using username for authentication but with OAuth2 access token following error is thrown:\r\n\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"api route not recognized\"}'\r\n\r\nWorkaround for this is to request current username using following pattern:\r\n\r\nuser = github.users.show(\"\")\r\n\r\nand then use returned username as an parameter for list(). \r\n\r\nI guess we need to populate the internal username in a constructor via show API when username is not given or is there better solution?\r\n\r\n\r\n\r\n\r\n\r\n","title":"Getting \"currently logged in user data\" when using access_token","updated_at":"2011/05/10 06:57:46 -0700","diff_url":"https://github.com/ask/python-github2/pull/34.diff","patch_url":"https://github.com/ask/python-github2/pull/34.patch","pull_request_url":"https://github.com/ask/python-github2/pull/34","closed_at":"2011/05/10 06:57:46 -0700","html_url":"https://github.com/ask/python-github2/issues/34","user":"pmuilu","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":33.0,"number":33,"votes":0,"created_at":"2011/03/03 09:26:59 -0800","comments":7,"body":"A few months ago when playing with `python-github2` I switched to using `httplib2` for network requests. I hadn't really planned on opening a pull request, but I've been using it as my full time branch so I've changed my mind :).\r\n\r\nThe benefits of `httplib2` are the (imo) simplification of the request handling, built-in caching support with effortless `ETag` handling and free HTTP compression support should GitHub enable it at some point..\r\n\r\nI'm just curious how you guys feel about it. Maybe there are some changes to be made to make it pullable, maybe you just don't like the idea of another external dependency or .\r\n\r\nThanks,\r\n\r\nJames","title":"RFC: httplib2 usage","updated_at":"2011/04/11 02:41:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/33.diff","patch_url":"https://github.com/ask/python-github2/pull/33.patch","pull_request_url":"https://github.com/ask/python-github2/pull/33","closed_at":"2011/04/11 02:41:30 -0700","html_url":"https://github.com/ask/python-github2/issues/33","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","position":32.0,"number":32,"votes":0,"created_at":"2011/02/19 07:18:36 -0800","comments":1,"body":"Added two operations in the issues module: list labels and search issues by label.","title":"List labels and Search Issues by Label","updated_at":"2011/04/09 10:25:23 -0700","diff_url":"https://github.com/ask/python-github2/pull/32.diff","patch_url":"https://github.com/ask/python-github2/pull/32.patch","pull_request_url":"https://github.com/ask/python-github2/pull/32","closed_at":"2011/04/09 10:25:23 -0700","html_url":"https://github.com/ask/python-github2/issues/32","user":"bartdag","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":31.0,"number":31,"votes":0,"created_at":"2011/02/16 06:44:12 -0800","comments":1,"body":"Adding or removing labels has recently broken, this small change to force `POST` fixes it.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix issue label addition/removal.","updated_at":"2011/04/09 10:36:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/31.diff","patch_url":"https://github.com/ask/python-github2/pull/31.patch","pull_request_url":"https://github.com/ask/python-github2/pull/31","closed_at":"2011/04/09 10:36:11 -0700","html_url":"https://github.com/ask/python-github2/issues/31","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"377e59815b7b7d6dfc23c808f0d07f05","position":30.0,"number":30,"votes":1,"created_at":"2011/02/15 12:30:09 -0800","comments":1,"body":"From:\r\n\r\nhttp://develop.github.com/p/repo.html\r\n\r\nrepos.delete returns a dictionary with a delete_token key. This key then needs to be POST'd back to the same URL. The repos.delete method as it is does nothing with this key and does not accept a post_data dictionary as a keyword argument.","title":"repos.delete not functional","updated_at":"2011/04/13 13:01:43 -0700","closed_at":"2011/04/13 13:01:43 -0700","html_url":"https://github.com/ask/python-github2/issues/30","user":"sxalexander","labels":[],"state":"closed"},{"gravatar_id":"d7ed4dc5ad80ffecb3aed70fc7190e52","position":29.0,"number":29,"votes":0,"created_at":"2011/01/25 07:13:12 -0800","comments":1,"body":"Steps to reproduce:\n\nfrom github2.client import Github\nclient = Github(username='', api_token='', requests_per_second=1)\npull_req = client.request.get('pulls', 'username/repo_name', '')\n\nThis works fine for most pull requests. However, if a commit associated with the pull request has 'line notes', it seems to fail.\nAs an example, you can try this on one of my pull requests:\n\npull_req = client.request.get('pulls', 'larsbutler/roundabout', '1')","title":"\"Github Server Error\" when trying to get pull requests which include line notes","updated_at":"2011/01/25 08:16:09 -0800","closed_at":"2011/01/25 08:16:09 -0800","html_url":"https://github.com/ask/python-github2/issues/29","user":"larsbutler","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":28.0,"number":28,"votes":0,"created_at":"2010/12/30 10:28:59 -0800","comments":8,"body":"This implements the github API pull requests functionality. ","title":"Pull requests","updated_at":"2011/05/29 08:27:58 -0700","diff_url":"https://github.com/ask/python-github2/pull/28.diff","patch_url":"https://github.com/ask/python-github2/pull/28.patch","pull_request_url":"https://github.com/ask/python-github2/pull/28","closed_at":"2011/05/29 08:27:23 -0700","html_url":"https://github.com/ask/python-github2/issues/28","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"cf04727870245c17f455fb05b25f9f8e","position":27.0,"number":27,"votes":0,"created_at":"2010/12/21 12:37:06 -0800","comments":0,"body":"The URL wasn't escaped properly when labels included a space \"This is a label\" during the add_label request.","title":"Failed to add a label with a space to an issue ","updated_at":"2011/04/09 09:47:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/27.diff","patch_url":"https://github.com/ask/python-github2/pull/27.patch","pull_request_url":"https://github.com/ask/python-github2/pull/27","closed_at":"2011/04/09 09:47:50 -0700","html_url":"https://github.com/ask/python-github2/issues/27","user":"jweinberg","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":26.0,"number":26,"votes":0,"created_at":"2010/12/16 13:59:45 -0800","comments":1,"body":"","title":"Patch to add organizations and teams.","updated_at":"2010/12/30 10:30:53 -0800","diff_url":"https://github.com/ask/python-github2/pull/26.diff","patch_url":"https://github.com/ask/python-github2/pull/26.patch","pull_request_url":"https://github.com/ask/python-github2/pull/26","closed_at":"2010/12/30 10:30:53 -0800","html_url":"https://github.com/ask/python-github2/issues/26","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":25.0,"number":25,"votes":0,"created_at":"2010/12/10 23:18:57 -0800","comments":1,"body":"As [nvie](http://github.com/nvie) rightly pointed out in [my other pull request](https://github.com/ask/python-github2/pull/14#issuecomment-601878), I hadn't added any documentation for my changes... here that is.\r\n\r\nI've also fixed issue searches for multiple words. I only spotted the problem as a result of adding the entry to `README.rst`, so I should probably learn something from that ;)\r\n\r\nFinally, there is some slight reformatting of the documentation. *Most* of the text was wrapped at ~80 characters and code samples indented 4 spaces, the [final commit](https://github.com/JNRowe/python-github2/commit/ff9132f9054bcc3827c94fd927c30cf257d84954) just makes that consistent across the rest of the documentation. I realise that may be controversial, but wrapped or not wrapped it should at least be consistent.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix for issue searching and documentation updates.","updated_at":"2010/12/12 23:27:36 -0800","diff_url":"https://github.com/ask/python-github2/pull/25.diff","patch_url":"https://github.com/ask/python-github2/pull/25.patch","pull_request_url":"https://github.com/ask/python-github2/pull/25","closed_at":"2010/12/12 23:27:36 -0800","html_url":"https://github.com/ask/python-github2/issues/25","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":23.0,"number":23,"votes":0,"created_at":"2010/12/08 00:17:49 -0800","comments":4,"body":"See the docs at http://develop.github.com/p/orgs.html","title":"Add support for the new Organizations API","updated_at":"2011/05/10 06:53:12 -0700","closed_at":"2011/05/10 06:12:12 -0700","html_url":"https://github.com/ask/python-github2/issues/23","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":22.0,"number":22,"votes":0,"created_at":"2010/12/06 21:28:03 -0800","comments":0,"body":"Hi Ask,\r\n\r\nI added support for authenticating using Github's OAuth service. When you do this, you get an access_token, which you can now use instead of the username/api_token combination. You pass it in to the Github constructor like this:\r\n\r\n github = Github(access_token=\"...\")\r\n\r\nIt puts the access_token on the GET request, like described in the third bullet under [Web Application Flow](https://gist.github.com/419219).\r\n\r\nIts use is documented in the README file.\r\n\r\nCheers,\r\nVincent\r\n","title":"Added support for Github's OAuth-based URL requests","updated_at":"2010/12/08 00:16:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/22.diff","patch_url":"https://github.com/ask/python-github2/pull/22.patch","pull_request_url":"https://github.com/ask/python-github2/pull/22","closed_at":"2010/12/08 00:16:25 -0800","html_url":"https://github.com/ask/python-github2/issues/22","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":21.0,"number":21,"votes":0,"created_at":"2010/12/06 13:10:09 -0800","comments":1,"body":"Hi Ask,\r\n\r\nToday, I commited several patches. First of all, I added support for authenticating using `Github(access_token=\"...\")` GET requests instead of `Github(username=\"foo\", api_token=\"...\")` POST requests. This is the way Github API v2 URLs need to be called when using their (experimental) OAuth model.\r\n\r\nFurthermore, while I was testing this, the Github API seems to have changed the format of all dates to be nice UTC dates with timezone info. This makes the special conversion hoops and tricks unnecessary, so I removed them. For safety, I kept the \"flexible date conversion function lookup\" construct around, but maybe this could be removed as a whole. I'll leave this judgement up to you.\r\n\r\nHave a blast!\r\n\r\nCheers,\r\nVincent\r\n","title":"Add support for OAuth URLs, and a fix for date format","updated_at":"2010/12/06 21:28:42 -0800","diff_url":"https://github.com/ask/python-github2/pull/21.diff","patch_url":"https://github.com/ask/python-github2/pull/21.patch","pull_request_url":"https://github.com/ask/python-github2/pull/21","closed_at":"2010/12/06 21:28:42 -0800","html_url":"https://github.com/ask/python-github2/issues/21","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"9de3f3969367fffe2051c2b405b79810","position":20.0,"number":20,"votes":0,"created_at":"2010/11/25 16:07:26 -0800","comments":1,"body":"http://develop.github.com/p/repo.html:\r\n\r\n\"To get a list of repos you can push to that are not your own, GET\r\n\r\nrepos/pushable\"\r\n\r\nI was surprised not to find this, so I added it.","title":"Added github.repos.pushable() as described in the API documentation.","updated_at":"2010/11/26 13:37:12 -0800","diff_url":"https://github.com/ask/python-github2/pull/20.diff","patch_url":"https://github.com/ask/python-github2/pull/20.patch","pull_request_url":"https://github.com/ask/python-github2/pull/20","closed_at":"2010/11/26 13:37:12 -0800","html_url":"https://github.com/ask/python-github2/issues/20","user":"johl","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":19.0,"number":19,"votes":0,"created_at":"2010/11/19 21:23:56 -0800","comments":5,"body":"I realized I didn't include fractions of a second in my earlier api-limits change. This one does. \r\n\r\nThis pull includes my commits from repo-project as well.","title":"Api limits","updated_at":"2010/11/26 13:25:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/19.diff","patch_url":"https://github.com/ask/python-github2/pull/19.patch","pull_request_url":"https://github.com/ask/python-github2/pull/19","closed_at":"2010/11/26 13:25:25 -0800","html_url":"https://github.com/ask/python-github2/issues/19","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":18.0,"number":18,"votes":0,"created_at":"2010/11/19 21:00:10 -0800","comments":0,"body":"Hey Ask, I added a Repo.project property - in my client code, I'm fairly often having to pass the project string to methods, and writing owner+'/'+name is getting boring. :-)","title":"Repo project","updated_at":"2010/11/20 12:08:27 -0800","diff_url":"https://github.com/ask/python-github2/pull/18.diff","patch_url":"https://github.com/ask/python-github2/pull/18.patch","pull_request_url":"https://github.com/ask/python-github2/pull/18","closed_at":"2010/11/20 12:08:27 -0800","html_url":"https://github.com/ask/python-github2/issues/18","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"ad448ae5b261e252ddaeeccf5c69a4ba","position":17.0,"number":17,"votes":1,"created_at":"2010/11/12 04:14:24 -0800","comments":1,"body":"This is very useful and provided by the underlying api and I would like to use it for my cmd line tool - https://github.com/kashifrazzaqui/github-issues\r\n\r\nIf you will please add this.\r\nThanks.","title":"List does not allow filteration by label","updated_at":"2011/04/09 10:51:59 -0700","closed_at":"2011/04/09 10:51:59 -0700","html_url":"https://github.com/ask/python-github2/issues/17","user":"kashifrazzaqui","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":16.0,"number":16,"votes":0,"created_at":"2010/11/04 17:26:33 -0700","comments":0,"body":"Fixes https://github.com/ask/python-github2/issues#issue/15\r\n\r\nThis was caused by github switching to HTTPS. Is in production at http://djangopackages.com","title":"Changed over to HTTPS","updated_at":"2010/11/24 06:10:48 -0800","diff_url":"https://github.com/ask/python-github2/pull/16.diff","patch_url":"https://github.com/ask/python-github2/pull/16.patch","pull_request_url":"https://github.com/ask/python-github2/pull/16","closed_at":"2010/11/24 06:10:48 -0800","html_url":"https://github.com/ask/python-github2/issues/16","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":15.0,"number":15,"votes":0,"created_at":"2010/11/04 16:56:50 -0700","comments":1,"body":"The API seems to work when I do curl. But it breaks via python-github2. \r\n\r\n >>> gh.commits.list(\"mojombo/grit\", \"master\")\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/commits.py\", line 31, in list\r\n filter=\"commits\", datatype=Commit)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 60, in get_values\r\n values = self.make_request(*args, **kwargs)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 43, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 53, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 63, in make_request\r\n return self.raw_request(url, extra_post_data, method=method)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 91, in raw_request\r\n json = simplejson.loads(response_text)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/__init__.py\", line 384, in loads\r\n return _default_decoder.decode(s)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 402, in decode\r\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 420, in raw_decode\r\n raise JSONDecodeError(\"No JSON object could be decoded\", s, idx)\r\n JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)","title":"commits API is broken","updated_at":"2010/11/04 17:27:00 -0700","closed_at":"2010/11/04 17:27:00 -0700","html_url":"https://github.com/ask/python-github2/issues/15","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":14.0,"number":14,"votes":0,"created_at":"2010/11/02 13:17:42 -0700","comments":2,"body":"Hi, \r\n\r\nJust a couple of small commits to fix minor problems I've found, and add support for some missing issues features. If you prefer to receive changes in a different way, please just say and I'll rework these(and any future ones) to fit.\r\n\r\nI'll take this opportunity to say thanks for releasing this package, I've found it very useful when playing with the github API.\r\n\r\nThanks,\r\n\r\nJames.\r\n","title":"Small fixes and more support for issues","updated_at":"2010/12/09 22:41:52 -0800","diff_url":"https://github.com/ask/python-github2/pull/14.diff","patch_url":"https://github.com/ask/python-github2/pull/14.patch","pull_request_url":"https://github.com/ask/python-github2/pull/14","closed_at":"2010/12/10 06:32:31 -0800","html_url":"https://github.com/ask/python-github2/issues/14","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","position":13.0,"number":13,"votes":0,"created_at":"2010/10/20 09:38:43 -0700","comments":0,"body":"I added some more fields that are in the API but not on github2 Repositories:\r\n\r\n- created_at\r\n- pushed_at\r\n- has_wiki\r\n- has_issues\r\n- has_downloads","title":"More information on Repository","updated_at":"2010/10/29 03:23:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/13.diff","patch_url":"https://github.com/ask/python-github2/pull/13.patch","pull_request_url":"https://github.com/ask/python-github2/pull/13","closed_at":"2010/10/29 03:23:50 -0700","html_url":"https://github.com/ask/python-github2/issues/13","user":"ojii","labels":[],"state":"closed"},{"gravatar_id":"4053d6caab18829c4e8d393b6afa8ad8","position":12.0,"number":12,"votes":0,"created_at":"2010/10/15 15:45:16 -0700","comments":1,"body":".. this directory is also used by the `pastedeploy` package\r\nhttp://twitter.com/ActiveState/status/27484677815\r\nPut it in site-packages/github2/tests instead.\r\n\r\n ~/Library/Python/2.7/bin \r\n ~/Library/Python/2.7/bin/github_manage_collaborators \r\n ~/Library/Python/2.7/lib \r\n ~/Library/Python/2.7/lib/python \r\n ~/Library/Python/2.7/lib/python/site-packages \r\n ~/Library/Python/2.7/lib/python/site-packages/github2 \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/PKG-INFO \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/SOURCES.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/dependency_links.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/top_level.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/client.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/commits.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/core.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/issues.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/repositories.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/request.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/users.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/unit.py ","title":"Avoiding polluting site-packages/tests/ directory","updated_at":"2010/12/09 22:39:34 -0800","closed_at":"2010/12/09 22:39:34 -0800","html_url":"https://github.com/ask/python-github2/issues/12","user":"srid","labels":[],"state":"closed"},{"gravatar_id":"9bfcdf9a72021d081a4cebf69a49ada8","position":11.0,"number":11,"votes":0,"created_at":"2010/10/15 04:42:12 -0700","comments":1,"body":"Python's timedelta did not have a 'total_seconds' method before python 2.7. This patches calculates seconds as documented at http://docs.python.org/library/datetime.html#datetime.timedelta.total_seconds.\n\nThis makes github2 compatible with python2.6 at least.\n\nPatch here: http://gist.github.com/628061","title":"Incompatibility for python 2.6: timedelta total_seconds","updated_at":"2011/04/13 13:06:54 -0700","closed_at":"2011/04/13 13:06:54 -0700","html_url":"https://github.com/ask/python-github2/issues/11","user":"arthur-debert","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":10.0,"number":10,"votes":0,"created_at":"2010/09/20 21:32:49 -0700","comments":1,"body":"I added a param to the Github class which enforces rate limits by sleeping the thread if requests are occurring too fast.\r\n\r\nIt's backwards compatible because delays only happen if requests_per_second is passed in. Includes a test, some docstrings, and an updated README.\r\n","title":"Api limits","updated_at":"2010/09/20 22:55:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/10.diff","patch_url":"https://github.com/ask/python-github2/pull/10.patch","pull_request_url":"https://github.com/ask/python-github2/pull/10","closed_at":"2010/09/21 05:55:06 -0700","html_url":"https://github.com/ask/python-github2/issues/10","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"5b45540ae377ec54a071f313b7193a27","position":9.0,"number":9,"votes":0,"created_at":"2010/07/28 12:56:51 -0700","comments":2,"body":" Traceback (most recent call last):\r\n File \"migrate_to_github.py\", line 74, in \r\n gh = Github()\r\n TypeError: __init__() takes at least 3 arguments (1 given)\r\n","title":"Doesn't support unauthenticated session","updated_at":"2011/04/18 07:04:50 -0700","closed_at":"2011/04/18 07:04:50 -0700","html_url":"https://github.com/ask/python-github2/issues/9","user":"dabrahams","labels":[],"state":"closed"},{"gravatar_id":"71c4e8223f5bddfbcce0607d387d2125","position":8.0,"number":8,"votes":1,"created_at":"2010/06/20 06:13:37 -0700","comments":1,"body":"There is a cool new way to do Github authentication: http://github.com/blog/656-github-oauth2-support","title":"support for the new OAuth2 authentication","updated_at":"2011/04/26 06:31:50 -0700","closed_at":"2011/04/26 06:31:50 -0700","html_url":"https://github.com/ask/python-github2/issues/8","user":"tarpas","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":7.0,"number":7,"votes":0,"created_at":"2010/05/26 17:08:41 -0700","comments":3,"body":"Python 2.6 includes simplejson (renaming to just json), removing the need for the external dep. To work on 2.5 and 2.6, use try:import:\r\nhttp://github.com/adamv/python-github2/commit/5b2f09d89420aac0d071522b3fbed9b026af6def\r\n","title":"Use json instead of simplejson on Python 2.6","updated_at":"2011/04/09 10:46:22 -0700","closed_at":"2011/04/09 10:46:22 -0700","html_url":"https://github.com/ask/python-github2/issues/7","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":6.0,"number":6,"votes":0,"created_at":"2010/05/25 21:59:37 -0700","comments":2,"body":"An object's __repr__ in Python 2.x is required to be ASCII. Various objects in this API return unicode values, as unicode is returned from titles, etc. from the web calls, and those are used in __repr__.\r\n\r\nIn my particular case, I got an error printing Issues that happened to contain non-ASCII characters.\r\n\r\nI'll probably add a commit to this bug tomorrow/later.","title":"__repr__ should return ASCII on Python 2.x","updated_at":"2010/12/08 19:46:28 -0800","closed_at":"2010/12/08 19:46:28 -0800","html_url":"https://github.com/ask/python-github2/issues/6","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"2e47ce8a038f8eaf3fe80c069e380814","position":4.0,"number":4,"votes":0,"created_at":"2010/04/17 17:24:29 -0700","comments":1,"body":"This package isn't on PyPi near as I can tell.\r\n\r\n* http://pypi.python.org/pypi/github2 \r\n* http://pypi.python.org/pypi/python-github2\r\n\r\nResponse from easy_install:\r\nNo local packages or download links found for python-github2","title":"Not installable via easy_install","updated_at":"2010/04/19 02:26:01 -0700","closed_at":"2010/04/19 02:26:01 -0700","html_url":"https://github.com/ask/python-github2/issues/4","user":"joestump","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":3.0,"number":3,"votes":0,"created_at":"2009/11/12 21:16:20 -0800","comments":2,"body":"In your README, your import path says\r\n\r\n >>> from github.client import Github\r\n\r\nbut it should really be\r\n\r\n >>> from github2.client import Github","title":"README has improper imports","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/3","user":"justinlilly","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":2.0,"number":2,"votes":0,"created_at":"2009/11/12 21:15:17 -0800","comments":1,"body":"When searching repos for django, I get an error caused by the emdash in the description of http://github.com/brosner/django \r\n\r\n Traceback: \r\n >>> github.repos.search('django')\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/repositories.py\", line 21, in search\r\n return self.make_request(\"search\", query, filter=\"repositories\")\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/core.py\", line 42, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 46, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 55, in make_request\r\n return self.raw_request(url, extra_post_data)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 71, in raw_request\r\n response_text = response.read().encode(\"utf-8\")\r\n UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 7065: ordinal not in range(128)\r\n","title":"Unicode handling error","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/2","user":"justinlilly","labels":[],"state":"closed"}]} \ No newline at end of file +{"issues":[{"gravatar_id":"2b3629571060965b03e885ba93c078fc","position":1.0,"number":59,"votes":0,"created_at":"2011/07/29 19:04:58 -0700","comments":2,"body":"I want to use raw_request to complete the OAuth flow, but it doesn't respond correctly unless the Accept header is correct.","title":"Fix the Accept header.","updated_at":"2011/08/15 13:03:53 -0700","diff_url":"https://github.com/ask/python-github2/pull/59.diff","patch_url":"https://github.com/ask/python-github2/pull/59.patch","pull_request_url":"https://github.com/ask/python-github2/pull/59","closed_at":"2011/08/15 13:03:53 -0700","html_url":"https://github.com/ask/python-github2/issues/59","user":"wadey","labels":[],"state":"closed"},{"gravatar_id":"68546566350063c9017dfeae5000f6b1","position":1.0,"number":57,"votes":0,"created_at":"2011/07/12 02:48:53 -0700","comments":6,"body":"I spent a good amount of time trying to figure out the proper way to call the PullRequests.create method. I'm raising a TypeError because if the user doesn't specify a title, a NoneType error will be raised later. \r\n\r\nMaybe it would be a good idea to also write an example of the call with the format for the project name. For now I've just tried to make it more obvious which project the 'project' parameter refers to.","title":"pull-requests - raise TypeError and better docs","updated_at":"2011/07/12 09:52:23 -0700","diff_url":"https://github.com/ask/python-github2/pull/57.diff","patch_url":"https://github.com/ask/python-github2/pull/57.patch","pull_request_url":"https://github.com/ask/python-github2/pull/57","closed_at":"2011/07/12 08:32:30 -0700","html_url":"https://github.com/ask/python-github2/issues/57","user":"mapleoin","labels":[],"state":"closed"},{"gravatar_id":"2d13e27bf46a6160e0bf3d455aa7fd68","position":1.0,"number":56,"votes":0,"created_at":"2011/07/09 16:50:28 -0700","comments":5,"body":"The quickstart example in the documentation fails with \r\n\r\n>>> len(github.repos.watchers(\"ask/python-github2\"))\r\nSSLHandshakeError: [Errno 1] _ssl.c:480: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed\r\n\r\nand I cannot find any information on what to do in either the error message nor the documentation.","title":"SSL certificate verify failed","updated_at":"2011/07/10 15:34:54 -0700","diff_url":"https://github.com/ask/python-github2/pull/56.diff","patch_url":"https://github.com/ask/python-github2/pull/56.patch","pull_request_url":"https://github.com/ask/python-github2/pull/56","closed_at":"2011/07/10 15:34:23 -0700","html_url":"https://github.com/ask/python-github2/issues/56","user":"ukoethe","labels":[],"state":"closed"},{"gravatar_id":"9124210529f6eb59754932c413dd3c69","position":1.0,"number":54,"votes":0,"created_at":"2011/06/29 16:05:17 -0700","comments":1,"body":"","title":"added possibility to list all repositories of certain organization","updated_at":"2011/06/30 09:43:40 -0700","diff_url":"https://github.com/ask/python-github2/pull/54.diff","patch_url":"https://github.com/ask/python-github2/pull/54.patch","pull_request_url":"https://github.com/ask/python-github2/pull/54","closed_at":"2011/06/30 09:43:40 -0700","html_url":"https://github.com/ask/python-github2/issues/54","user":"garbas","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":53.0,"number":53,"votes":0,"created_at":"2011/05/28 22:15:49 -0700","comments":2,"body":"It would make more sense, and be easy to filter wanted data, if debug info was handled with the `logging` module. Side effect being the output will change significantly, but does it matter for debugging output anyway?","title":"Use logging for debug information.","updated_at":"2011/06/20 09:43:44 -0700","closed_at":"2011/06/20 09:43:44 -0700","html_url":"https://github.com/ask/python-github2/issues/53","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":52.0,"number":52,"votes":0,"created_at":"2011/05/28 02:03:37 -0700","comments":0,"body":"\nSee [this bug](https://github.com/ask/python-github2/issues/51#issuecomment-1253464)","title":"Document purpose, and use, of ``debug`` attributes.","updated_at":"2011/05/28 06:40:00 -0700","closed_at":"2011/05/28 06:40:00 -0700","html_url":"https://github.com/ask/python-github2/issues/52","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":51.0,"number":51,"votes":0,"created_at":"2011/05/28 01:09:46 -0700","comments":14,"body":"```pycon \r\n>>> github.repos.watch(\"schacon/grit\")\r\nTraceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/repositories.py\", line 69, in watch\r\n return self.make_request(\"watch\", project)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\r\n result = self.raw_request(url, extra_post_data, method=method)\r\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\r\n response.status, content))\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"invalid repository to watch\"}'\r\n\r\n```\r\n\r\nI can't seem to watch that repository. I used the OAuth key to get the github object. ","title":"Watching repositories doesn't work","updated_at":"2011/06/02 07:57:47 -0700","closed_at":"2011/05/28 20:30:11 -0700","html_url":"https://github.com/ask/python-github2/issues/51","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":50.0,"number":50,"votes":0,"created_at":"2011/05/23 18:05:57 -0700","comments":2,"body":"","title":"Fixing the init of the proxy code.","updated_at":"2011/05/23 21:09:45 -0700","diff_url":"https://github.com/ask/python-github2/pull/50.diff","patch_url":"https://github.com/ask/python-github2/pull/50.patch","pull_request_url":"https://github.com/ask/python-github2/pull/50","closed_at":"2011/05/23 20:43:20 -0700","html_url":"https://github.com/ask/python-github2/issues/50","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":49.0,"number":49,"votes":0,"created_at":"2011/05/20 11:46:19 -0700","comments":8,"body":"I am was wondering if you could better document the Mocks being used for testing. I wouldn't mind writing up the test cases, if you could comment the testing code that is currently present. Increase the robustness of the project. \n\nThoughts? Even a link to the background knowledge needed to understand what you are doing. I am tried creating a couple of tests in my branch but unable to get anything but errors. \n\nMaybe a wiki describing setup and what needs to be done. ","title":"Testing Documentation/Wiki","updated_at":"2011/05/22 14:25:06 -0700","closed_at":"2011/05/22 14:25:06 -0700","html_url":"https://github.com/ask/python-github2/issues/49","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":48.0,"number":48,"votes":0,"created_at":"2011/05/19 08:40:47 -0700","comments":3,"body":"* Added basic proxy support documentation","title":"Add proxy documentation","updated_at":"2011/05/19 15:12:47 -0700","diff_url":"https://github.com/ask/python-github2/pull/48.diff","patch_url":"https://github.com/ask/python-github2/pull/48.patch","pull_request_url":"https://github.com/ask/python-github2/pull/48","closed_at":"2011/05/19 15:09:09 -0700","html_url":"https://github.com/ask/python-github2/issues/48","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":47.0,"number":47,"votes":0,"created_at":"2011/05/18 18:40:20 -0700","comments":1,"body":"Made the socks stuff optional. I wasnt able to test the extras_require portion of the setup.py (im not terribly well versed in setuptools) but i tested manually by uninstalling/reinstalling the socks lib and watching the error raised.","title":"Updated Add Proxy Support - now optional","updated_at":"2011/05/18 19:04:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/47.diff","patch_url":"https://github.com/ask/python-github2/pull/47.patch","pull_request_url":"https://github.com/ask/python-github2/pull/47","closed_at":"2011/05/18 19:04:29 -0700","html_url":"https://github.com/ask/python-github2/issues/47","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":46.0,"number":46,"votes":0,"created_at":"2011/05/18 09:37:00 -0700","comments":12,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/23 18:06:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/46.diff","patch_url":"https://github.com/ask/python-github2/pull/46.patch","pull_request_url":"https://github.com/ask/python-github2/pull/46","closed_at":"2011/05/19 07:59:05 -0700","html_url":"https://github.com/ask/python-github2/issues/46","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"2f3f68f62f5fc642f0b716b355071176","position":45.0,"number":45,"votes":0,"created_at":"2011/05/18 08:47:38 -0700","comments":1,"body":"Adding HTTP proxy settings to the client, as well as to the request to allow github2 to be used behind a HTTP proxy","title":"Adding HTTP Proxy support to the Request and Client","updated_at":"2011/05/18 09:07:34 -0700","diff_url":"https://github.com/ask/python-github2/pull/45.diff","patch_url":"https://github.com/ask/python-github2/pull/45.patch","pull_request_url":"https://github.com/ask/python-github2/pull/45","closed_at":"2011/05/18 09:07:33 -0700","html_url":"https://github.com/ask/python-github2/issues/45","user":"hub-cap","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":44.0,"number":44,"votes":0,"created_at":"2011/05/14 20:43:34 -0700","comments":13,"body":"When getting the commits for repositories that have '.' it can't seem to find the repository.\n\n``` pycon\n>>> commits += github.commits.list('kennethreitz/osxpython.org')\nTraceback (most recent call last):\n File \"\", line 1, in \n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/commits.py\", line 37, in list\n filter=\"commits\", datatype=Commit)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 75, in get_values\n values = self.make_request(*args, **kwargs)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/core.py\", line 58, in make_request\n response = self.request.get(self.domain, command, *args)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 70, in get\n return self.make_request(\"/\".join(path_components))\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 89, in make_request\n result = self.raw_request(url, extra_post_data, method=method)\n File \"/srv/python-environments/prologger/lib/python2.6/site-packages/github2/request.py\", line 113, in raw_request\n response.status, content))\nRuntimeError: unexpected response from github.com 404: '{\"error\":\"Not Found\"}'\n```","title":"repositories with '.' are not found","updated_at":"2011/05/26 23:46:28 -0700","closed_at":"2011/05/26 18:03:57 -0700","html_url":"https://github.com/ask/python-github2/issues/44","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2028496e3344d92d8b3af64eb0d9e19e","position":43.0,"number":43,"votes":0,"created_at":"2011/05/09 20:51:03 -0700","comments":8,"body":"The docs are already using Sphinx. It'd be much more convenient if they were hosted.\r\n\r\nhttp://Readthedocs.org is free and sphinx powered, getting them up there should be easy.\r\n\r\nFun even.","title":"Read the Docs","updated_at":"2011/05/11 07:02:48 -0700","closed_at":"2011/05/11 06:44:44 -0700","html_url":"https://github.com/ask/python-github2/issues/43","user":"GraylinKim","labels":[],"state":"closed"},{"gravatar_id":"b7699be15e710c4be309f9d537fb252b","position":42.0,"number":42,"votes":0,"created_at":"2011/05/09 08:24:36 -0700","comments":12,"body":"This is my just running 2to3 over the library, and fixing one or two things with json. Don't know if you want or need it. I'm using it for some blogofile stuff, which just bumped to python 3 for all main development, and wanted to keep using your work with my site.","title":"Python3","updated_at":"2011/05/23 00:55:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/42.diff","patch_url":"https://github.com/ask/python-github2/pull/42.patch","pull_request_url":"https://github.com/ask/python-github2/pull/42","closed_at":"2011/05/19 15:19:30 -0700","html_url":"https://github.com/ask/python-github2/issues/42","user":"goosemo","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":41.0,"number":41,"votes":0,"created_at":"2011/04/24 09:35:15 -0700","comments":3,"body":"","title":"Easy way to call tests from cli","updated_at":"2011/04/27 09:45:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/41.diff","patch_url":"https://github.com/ask/python-github2/pull/41.patch","pull_request_url":"https://github.com/ask/python-github2/pull/41","closed_at":"2011/04/27 09:45:11 -0700","html_url":"https://github.com/ask/python-github2/issues/41","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","position":40.0,"number":40,"votes":0,"created_at":"2011/04/22 12:26:50 -0700","comments":3,"body":"https://github.com/broderboy/python-github2/commit/48d85d517b4e51652217b71b264c866caa5ca874\r\n\r\nI'm not sure why git put that as a full file change\r\nline changed: prune doc/.build\r\n\r\nThanks\r\n\r\nOriginal Error: \r\nrunning install\r\nrunning bdist_egg\r\nrunning egg_info\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nwriting requirements to github2.egg-info\\requires.txt\r\nwriting github2.egg-info\\PKG-INFO\r\nwriting top-level names to github2.egg-info\\top_level.txt\r\nwriting dependency_links to github2.egg-info\\dependency_links.txt\r\nreading manifest file 'github2.egg-info\\SOURCES.txt'\r\nreading manifest template 'MANIFEST.in'\r\nTraceback (most recent call last):\r\n File \".\\setup.py\", line 46, in \r\n \"Topic :: Software Development :: Libraries\",\r\n File \"C:\\Python26\\lib\\distutils\\core.py\", line 152, in setup\r\n dist.run_commands()\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 975, in run_commands\r\n self.run_command(cmd)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 73, in run\r\n self.do_egg_install()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\install.py\", line 93, in do_egg_install\r\n self.run_command('bdist_egg')\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\bdist_egg.py\", line 167, in run\r\n self.run_command(\"egg_info\")\r\n File \"C:\\Python26\\lib\\distutils\\cmd.py\", line 333, in run_command\r\n self.distribution.run_command(command)\r\n File \"C:\\Python26\\lib\\distutils\\dist.py\", line 995, in run_command\r\n cmd_obj.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 179, in run\r\n self.find_sources()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 254, in find_sources\r\n mm.run()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\egg_info.py\", line 310, in run\r\n self.read_template()\r\n File \"C:\\Python26\\lib\\site-packages\\distribute-0.6.10-py2.6.egg\\setuptools\\command\\sdist.py\", line 204, in read_template\r\n _sdist.read_template(self)\r\n File \"C:\\Python26\\lib\\distutils\\command\\sdist.py\", line 336, in read_template\r\n self.filelist.process_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 129, in process_template_line\r\n (action, patterns, dir, dir_pattern) = self._parse_template_line(line)\r\n File \"C:\\Python26\\lib\\distutils\\filelist.py\", line 112, in _parse_template_line\r\n dir_pattern = convert_path(words[1])\r\n File \"C:\\Python26\\lib\\distutils\\util.py\", line 201, in convert_path\r\n raise ValueError, \"path '%s' cannot end with '/'\" % pathname\r\nValueError: path 'doc/.build/' cannot end with '/'","title":"Modified MANIFEST.in. It wasn't installing on Windows","updated_at":"2011/04/23 07:18:49 -0700","diff_url":"https://github.com/ask/python-github2/pull/40.diff","patch_url":"https://github.com/ask/python-github2/pull/40.patch","pull_request_url":"https://github.com/ask/python-github2/pull/40","closed_at":"2011/04/23 04:53:48 -0700","html_url":"https://github.com/ask/python-github2/issues/40","user":"broderboy","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":4,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/06/23 02:33:57 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","closed_at":"2011/06/23 02:33:57 -0700","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"fab591eb34c76cbd0716024ce22d4906","position":38.0,"number":38,"votes":0,"created_at":"2011/04/17 17:11:51 -0700","comments":9,"body":"e.g when I am using the call \r\n\r\nGithub(access_token=oauthtoken) -- it seems to work fine for all calls expect, the following call \r\n\r\nproject being repo.project\r\n\r\ncommits += self.client.commits.list(str(project))\r\n\r\n\r\nI get the follow exception\r\n\r\nunexpected response from github.com 401: '{\"error\":\"Couldn\\'t authenticate you\"}'\r\n\r\nI managed to work around this issue by creating the self.client using the following instantiation \r\n\r\nGithub(self.oauthtoken)\r\n\r\nIt probably not being pass down the OAuth token on the particular call. \r\n","title":"OAuth token isn't being passed down","updated_at":"2011/05/11 09:48:20 -0700","closed_at":"2011/05/11 09:48:20 -0700","html_url":"https://github.com/ask/python-github2/issues/38","user":"myusuf3","labels":[],"state":"closed"},{"gravatar_id":"2c8089a78bf15883302e9ac5b4367895","position":37.0,"number":37,"votes":0,"created_at":"2011/04/14 17:19:33 -0700","comments":2,"body":"The current [Commits API](http://develop.github.com/p/commits.html) specifies a user_id in the pathspec:\n\n`commits/list/:user_id/:repository/:branch`\n`commits/list/:user_id/:repository/:branch/*path`\n\nThis parameter was not present in the `list` or `show` methods of the `Commits` class, consequently requesting commits was not possible (as far as I could tell)\n\n","title":"added user_id to commits path spec","updated_at":"2011/04/15 05:13:56 -0700","diff_url":"https://github.com/ask/python-github2/pull/37.diff","patch_url":"https://github.com/ask/python-github2/pull/37.patch","pull_request_url":"https://github.com/ask/python-github2/pull/37","closed_at":"2011/04/15 05:13:56 -0700","html_url":"https://github.com/ask/python-github2/issues/37","user":"loganlinn","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":36.0,"number":36,"votes":0,"created_at":"2011/04/12 03:47:52 -0700","comments":2,"body":"@ask and interested others,\r\n\r\nYou said to treat the repo like home, but I just wanted to run this past you in case you have objections.\r\n\r\nThe changes are quite invasive. It strips out the examples from `README.rst`(it is a bit cluttered IMO), reformats many docstrings for use with Sphinx's [autodoc](http://sphinx.pocoo.org/tutorial.html#autodoc), fiddles with the cool `Attribute` docstring generator, etc.\r\n\r\nOpinions? If part of it is okay, say which part and I'll remove/rework the rest. If you hate it all just say so, it won't hurt my feelings I promise ;)\r\n\r\nThanks,\r\n\r\nJames","title":"Using Sphinx doc for documentation","updated_at":"2011/04/13 13:06:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/36.diff","patch_url":"https://github.com/ask/python-github2/pull/36.patch","pull_request_url":"https://github.com/ask/python-github2/pull/36","closed_at":"2011/04/13 13:01:44 -0700","html_url":"https://github.com/ask/python-github2/issues/36","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","position":35.0,"number":35,"votes":0,"created_at":"2011/04/10 18:02:50 -0700","comments":1,"body":"I added a function to get all blobs as a dictionary between the path & sha for a given tree. ","title":"Get All Blobs","updated_at":"2011/04/11 02:38:53 -0700","diff_url":"https://github.com/ask/python-github2/pull/35.diff","patch_url":"https://github.com/ask/python-github2/pull/35.patch","pull_request_url":"https://github.com/ask/python-github2/pull/35","closed_at":"2011/04/11 02:38:53 -0700","html_url":"https://github.com/ask/python-github2/issues/35","user":"surajram","labels":[],"state":"closed"},{"gravatar_id":"3aa27c0add742f542848af3b8a9e980c","position":34.0,"number":34,"votes":0,"created_at":"2011/03/26 10:57:22 -0700","comments":4,"body":"e.g. github.repos.list() specifies following behaviour: \"If no user is given, repositoris for the currently logged in user are returned.\"\r\n\r\nHowever this works only if using username for authentication but with OAuth2 access token following error is thrown:\r\n\r\nRuntimeError: unexpected response from github.com 401: '{\"error\":\"api route not recognized\"}'\r\n\r\nWorkaround for this is to request current username using following pattern:\r\n\r\nuser = github.users.show(\"\")\r\n\r\nand then use returned username as an parameter for list(). \r\n\r\nI guess we need to populate the internal username in a constructor via show API when username is not given or is there better solution?\r\n\r\n\r\n\r\n\r\n\r\n","title":"Getting \"currently logged in user data\" when using access_token","updated_at":"2011/05/10 06:57:46 -0700","diff_url":"https://github.com/ask/python-github2/pull/34.diff","patch_url":"https://github.com/ask/python-github2/pull/34.patch","pull_request_url":"https://github.com/ask/python-github2/pull/34","closed_at":"2011/05/10 06:57:46 -0700","html_url":"https://github.com/ask/python-github2/issues/34","user":"pmuilu","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":33.0,"number":33,"votes":0,"created_at":"2011/03/03 09:26:59 -0800","comments":7,"body":"A few months ago when playing with `python-github2` I switched to using `httplib2` for network requests. I hadn't really planned on opening a pull request, but I've been using it as my full time branch so I've changed my mind :).\r\n\r\nThe benefits of `httplib2` are the (imo) simplification of the request handling, built-in caching support with effortless `ETag` handling and free HTTP compression support should GitHub enable it at some point..\r\n\r\nI'm just curious how you guys feel about it. Maybe there are some changes to be made to make it pullable, maybe you just don't like the idea of another external dependency or .\r\n\r\nThanks,\r\n\r\nJames","title":"RFC: httplib2 usage","updated_at":"2011/04/11 02:41:30 -0700","diff_url":"https://github.com/ask/python-github2/pull/33.diff","patch_url":"https://github.com/ask/python-github2/pull/33.patch","pull_request_url":"https://github.com/ask/python-github2/pull/33","closed_at":"2011/04/11 02:41:30 -0700","html_url":"https://github.com/ask/python-github2/issues/33","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","position":32.0,"number":32,"votes":0,"created_at":"2011/02/19 07:18:36 -0800","comments":1,"body":"Added two operations in the issues module: list labels and search issues by label.","title":"List labels and Search Issues by Label","updated_at":"2011/04/09 10:25:23 -0700","diff_url":"https://github.com/ask/python-github2/pull/32.diff","patch_url":"https://github.com/ask/python-github2/pull/32.patch","pull_request_url":"https://github.com/ask/python-github2/pull/32","closed_at":"2011/04/09 10:25:23 -0700","html_url":"https://github.com/ask/python-github2/issues/32","user":"bartdag","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":31.0,"number":31,"votes":0,"created_at":"2011/02/16 06:44:12 -0800","comments":1,"body":"Adding or removing labels has recently broken, this small change to force `POST` fixes it.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix issue label addition/removal.","updated_at":"2011/04/09 10:36:11 -0700","diff_url":"https://github.com/ask/python-github2/pull/31.diff","patch_url":"https://github.com/ask/python-github2/pull/31.patch","pull_request_url":"https://github.com/ask/python-github2/pull/31","closed_at":"2011/04/09 10:36:11 -0700","html_url":"https://github.com/ask/python-github2/issues/31","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"377e59815b7b7d6dfc23c808f0d07f05","position":30.0,"number":30,"votes":1,"created_at":"2011/02/15 12:30:09 -0800","comments":1,"body":"From:\r\n\r\nhttp://develop.github.com/p/repo.html\r\n\r\nrepos.delete returns a dictionary with a delete_token key. This key then needs to be POST'd back to the same URL. The repos.delete method as it is does nothing with this key and does not accept a post_data dictionary as a keyword argument.","title":"repos.delete not functional","updated_at":"2011/04/13 13:01:43 -0700","closed_at":"2011/04/13 13:01:43 -0700","html_url":"https://github.com/ask/python-github2/issues/30","user":"sxalexander","labels":[],"state":"closed"},{"gravatar_id":"d7ed4dc5ad80ffecb3aed70fc7190e52","position":29.0,"number":29,"votes":0,"created_at":"2011/01/25 07:13:12 -0800","comments":1,"body":"Steps to reproduce:\n\nfrom github2.client import Github\nclient = Github(username='', api_token='', requests_per_second=1)\npull_req = client.request.get('pulls', 'username/repo_name', '')\n\nThis works fine for most pull requests. However, if a commit associated with the pull request has 'line notes', it seems to fail.\nAs an example, you can try this on one of my pull requests:\n\npull_req = client.request.get('pulls', 'larsbutler/roundabout', '1')","title":"\"Github Server Error\" when trying to get pull requests which include line notes","updated_at":"2011/01/25 08:16:09 -0800","closed_at":"2011/01/25 08:16:09 -0800","html_url":"https://github.com/ask/python-github2/issues/29","user":"larsbutler","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":28.0,"number":28,"votes":0,"created_at":"2010/12/30 10:28:59 -0800","comments":8,"body":"This implements the github API pull requests functionality. ","title":"Pull requests","updated_at":"2011/05/29 08:27:58 -0700","diff_url":"https://github.com/ask/python-github2/pull/28.diff","patch_url":"https://github.com/ask/python-github2/pull/28.patch","pull_request_url":"https://github.com/ask/python-github2/pull/28","closed_at":"2011/05/29 08:27:23 -0700","html_url":"https://github.com/ask/python-github2/issues/28","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"cf04727870245c17f455fb05b25f9f8e","position":27.0,"number":27,"votes":0,"created_at":"2010/12/21 12:37:06 -0800","comments":0,"body":"The URL wasn't escaped properly when labels included a space \"This is a label\" during the add_label request.","title":"Failed to add a label with a space to an issue ","updated_at":"2011/04/09 09:47:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/27.diff","patch_url":"https://github.com/ask/python-github2/pull/27.patch","pull_request_url":"https://github.com/ask/python-github2/pull/27","closed_at":"2011/04/09 09:47:50 -0700","html_url":"https://github.com/ask/python-github2/issues/27","user":"jweinberg","labels":[],"state":"closed"},{"gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","position":26.0,"number":26,"votes":0,"created_at":"2010/12/16 13:59:45 -0800","comments":1,"body":"","title":"Patch to add organizations and teams.","updated_at":"2010/12/30 10:30:53 -0800","diff_url":"https://github.com/ask/python-github2/pull/26.diff","patch_url":"https://github.com/ask/python-github2/pull/26.patch","pull_request_url":"https://github.com/ask/python-github2/pull/26","closed_at":"2010/12/30 10:30:53 -0800","html_url":"https://github.com/ask/python-github2/issues/26","user":"ChristopherMacGown","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":25.0,"number":25,"votes":0,"created_at":"2010/12/10 23:18:57 -0800","comments":1,"body":"As [nvie](http://github.com/nvie) rightly pointed out in [my other pull request](https://github.com/ask/python-github2/pull/14#issuecomment-601878), I hadn't added any documentation for my changes... here that is.\r\n\r\nI've also fixed issue searches for multiple words. I only spotted the problem as a result of adding the entry to `README.rst`, so I should probably learn something from that ;)\r\n\r\nFinally, there is some slight reformatting of the documentation. *Most* of the text was wrapped at ~80 characters and code samples indented 4 spaces, the [final commit](https://github.com/JNRowe/python-github2/commit/ff9132f9054bcc3827c94fd927c30cf257d84954) just makes that consistent across the rest of the documentation. I realise that may be controversial, but wrapped or not wrapped it should at least be consistent.\r\n\r\nThanks,\r\n\r\nJames","title":"Fix for issue searching and documentation updates.","updated_at":"2010/12/12 23:27:36 -0800","diff_url":"https://github.com/ask/python-github2/pull/25.diff","patch_url":"https://github.com/ask/python-github2/pull/25.patch","pull_request_url":"https://github.com/ask/python-github2/pull/25","closed_at":"2010/12/12 23:27:36 -0800","html_url":"https://github.com/ask/python-github2/issues/25","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":23.0,"number":23,"votes":0,"created_at":"2010/12/08 00:17:49 -0800","comments":4,"body":"See the docs at http://develop.github.com/p/orgs.html","title":"Add support for the new Organizations API","updated_at":"2011/05/10 06:53:12 -0700","closed_at":"2011/05/10 06:12:12 -0700","html_url":"https://github.com/ask/python-github2/issues/23","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":22.0,"number":22,"votes":0,"created_at":"2010/12/06 21:28:03 -0800","comments":0,"body":"Hi Ask,\r\n\r\nI added support for authenticating using Github's OAuth service. When you do this, you get an access_token, which you can now use instead of the username/api_token combination. You pass it in to the Github constructor like this:\r\n\r\n github = Github(access_token=\"...\")\r\n\r\nIt puts the access_token on the GET request, like described in the third bullet under [Web Application Flow](https://gist.github.com/419219).\r\n\r\nIts use is documented in the README file.\r\n\r\nCheers,\r\nVincent\r\n","title":"Added support for Github's OAuth-based URL requests","updated_at":"2010/12/08 00:16:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/22.diff","patch_url":"https://github.com/ask/python-github2/pull/22.patch","pull_request_url":"https://github.com/ask/python-github2/pull/22","closed_at":"2010/12/08 00:16:25 -0800","html_url":"https://github.com/ask/python-github2/issues/22","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":21.0,"number":21,"votes":0,"created_at":"2010/12/06 13:10:09 -0800","comments":1,"body":"Hi Ask,\r\n\r\nToday, I commited several patches. First of all, I added support for authenticating using `Github(access_token=\"...\")` GET requests instead of `Github(username=\"foo\", api_token=\"...\")` POST requests. This is the way Github API v2 URLs need to be called when using their (experimental) OAuth model.\r\n\r\nFurthermore, while I was testing this, the Github API seems to have changed the format of all dates to be nice UTC dates with timezone info. This makes the special conversion hoops and tricks unnecessary, so I removed them. For safety, I kept the \"flexible date conversion function lookup\" construct around, but maybe this could be removed as a whole. I'll leave this judgement up to you.\r\n\r\nHave a blast!\r\n\r\nCheers,\r\nVincent\r\n","title":"Add support for OAuth URLs, and a fix for date format","updated_at":"2010/12/06 21:28:42 -0800","diff_url":"https://github.com/ask/python-github2/pull/21.diff","patch_url":"https://github.com/ask/python-github2/pull/21.patch","pull_request_url":"https://github.com/ask/python-github2/pull/21","closed_at":"2010/12/06 21:28:42 -0800","html_url":"https://github.com/ask/python-github2/issues/21","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"9de3f3969367fffe2051c2b405b79810","position":20.0,"number":20,"votes":0,"created_at":"2010/11/25 16:07:26 -0800","comments":1,"body":"http://develop.github.com/p/repo.html:\r\n\r\n\"To get a list of repos you can push to that are not your own, GET\r\n\r\nrepos/pushable\"\r\n\r\nI was surprised not to find this, so I added it.","title":"Added github.repos.pushable() as described in the API documentation.","updated_at":"2010/11/26 13:37:12 -0800","diff_url":"https://github.com/ask/python-github2/pull/20.diff","patch_url":"https://github.com/ask/python-github2/pull/20.patch","pull_request_url":"https://github.com/ask/python-github2/pull/20","closed_at":"2010/11/26 13:37:12 -0800","html_url":"https://github.com/ask/python-github2/issues/20","user":"johl","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":19.0,"number":19,"votes":0,"created_at":"2010/11/19 21:23:56 -0800","comments":5,"body":"I realized I didn't include fractions of a second in my earlier api-limits change. This one does. \r\n\r\nThis pull includes my commits from repo-project as well.","title":"Api limits","updated_at":"2010/11/26 13:25:25 -0800","diff_url":"https://github.com/ask/python-github2/pull/19.diff","patch_url":"https://github.com/ask/python-github2/pull/19.patch","pull_request_url":"https://github.com/ask/python-github2/pull/19","closed_at":"2010/11/26 13:25:25 -0800","html_url":"https://github.com/ask/python-github2/issues/19","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":18.0,"number":18,"votes":0,"created_at":"2010/11/19 21:00:10 -0800","comments":0,"body":"Hey Ask, I added a Repo.project property - in my client code, I'm fairly often having to pass the project string to methods, and writing owner+'/'+name is getting boring. :-)","title":"Repo project","updated_at":"2010/11/20 12:08:27 -0800","diff_url":"https://github.com/ask/python-github2/pull/18.diff","patch_url":"https://github.com/ask/python-github2/pull/18.patch","pull_request_url":"https://github.com/ask/python-github2/pull/18","closed_at":"2010/11/20 12:08:27 -0800","html_url":"https://github.com/ask/python-github2/issues/18","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"ad448ae5b261e252ddaeeccf5c69a4ba","position":17.0,"number":17,"votes":1,"created_at":"2010/11/12 04:14:24 -0800","comments":1,"body":"This is very useful and provided by the underlying api and I would like to use it for my cmd line tool - https://github.com/kashifrazzaqui/github-issues\r\n\r\nIf you will please add this.\r\nThanks.","title":"List does not allow filteration by label","updated_at":"2011/04/09 10:51:59 -0700","closed_at":"2011/04/09 10:51:59 -0700","html_url":"https://github.com/ask/python-github2/issues/17","user":"kashifrazzaqui","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":16.0,"number":16,"votes":0,"created_at":"2010/11/04 17:26:33 -0700","comments":0,"body":"Fixes https://github.com/ask/python-github2/issues#issue/15\r\n\r\nThis was caused by github switching to HTTPS. Is in production at http://djangopackages.com","title":"Changed over to HTTPS","updated_at":"2010/11/24 06:10:48 -0800","diff_url":"https://github.com/ask/python-github2/pull/16.diff","patch_url":"https://github.com/ask/python-github2/pull/16.patch","pull_request_url":"https://github.com/ask/python-github2/pull/16","closed_at":"2010/11/24 06:10:48 -0800","html_url":"https://github.com/ask/python-github2/issues/16","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"67e05420d4dd3492097aeb77f44f7867","position":15.0,"number":15,"votes":0,"created_at":"2010/11/04 16:56:50 -0700","comments":1,"body":"The API seems to work when I do curl. But it breaks via python-github2. \r\n\r\n >>> gh.commits.list(\"mojombo/grit\", \"master\")\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/commits.py\", line 31, in list\r\n filter=\"commits\", datatype=Commit)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 60, in get_values\r\n values = self.make_request(*args, **kwargs)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/core.py\", line 43, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 53, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 63, in make_request\r\n return self.raw_request(url, extra_post_data, method=method)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/src/python-github2/github2/request.py\", line 91, in raw_request\r\n json = simplejson.loads(response_text)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/__init__.py\", line 384, in loads\r\n return _default_decoder.decode(s)\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 402, in decode\r\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\r\n File \"/Users/pydanny/projects/djangopackages/envdp/lib/python2.6/site-packages/simplejson/decoder.py\", line 420, in raw_decode\r\n raise JSONDecodeError(\"No JSON object could be decoded\", s, idx)\r\n JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)","title":"commits API is broken","updated_at":"2010/11/04 17:27:00 -0700","closed_at":"2010/11/04 17:27:00 -0700","html_url":"https://github.com/ask/python-github2/issues/15","user":"pydanny","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":14.0,"number":14,"votes":0,"created_at":"2010/11/02 13:17:42 -0700","comments":2,"body":"Hi, \r\n\r\nJust a couple of small commits to fix minor problems I've found, and add support for some missing issues features. If you prefer to receive changes in a different way, please just say and I'll rework these(and any future ones) to fit.\r\n\r\nI'll take this opportunity to say thanks for releasing this package, I've found it very useful when playing with the github API.\r\n\r\nThanks,\r\n\r\nJames.\r\n","title":"Small fixes and more support for issues","updated_at":"2010/12/09 22:41:52 -0800","diff_url":"https://github.com/ask/python-github2/pull/14.diff","patch_url":"https://github.com/ask/python-github2/pull/14.patch","pull_request_url":"https://github.com/ask/python-github2/pull/14","closed_at":"2010/12/10 06:32:31 -0800","html_url":"https://github.com/ask/python-github2/issues/14","user":"JNRowe","labels":[],"state":"closed"},{"gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","position":13.0,"number":13,"votes":0,"created_at":"2010/10/20 09:38:43 -0700","comments":0,"body":"I added some more fields that are in the API but not on github2 Repositories:\r\n\r\n- created_at\r\n- pushed_at\r\n- has_wiki\r\n- has_issues\r\n- has_downloads","title":"More information on Repository","updated_at":"2010/10/29 03:23:50 -0700","diff_url":"https://github.com/ask/python-github2/pull/13.diff","patch_url":"https://github.com/ask/python-github2/pull/13.patch","pull_request_url":"https://github.com/ask/python-github2/pull/13","closed_at":"2010/10/29 03:23:50 -0700","html_url":"https://github.com/ask/python-github2/issues/13","user":"ojii","labels":[],"state":"closed"},{"gravatar_id":"4053d6caab18829c4e8d393b6afa8ad8","position":12.0,"number":12,"votes":0,"created_at":"2010/10/15 15:45:16 -0700","comments":1,"body":".. this directory is also used by the `pastedeploy` package\r\nhttp://twitter.com/ActiveState/status/27484677815\r\nPut it in site-packages/github2/tests instead.\r\n\r\n ~/Library/Python/2.7/bin \r\n ~/Library/Python/2.7/bin/github_manage_collaborators \r\n ~/Library/Python/2.7/lib \r\n ~/Library/Python/2.7/lib/python \r\n ~/Library/Python/2.7/lib/python/site-packages \r\n ~/Library/Python/2.7/lib/python/site-packages/github2 \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/PKG-INFO \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/SOURCES.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/dependency_links.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2-0.1.3-py2.7.egg-info/top_level.txt \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/client.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/commits.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/core.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/issues.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/repositories.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/request.py \r\n ~/Library/Python/2.7/lib/python/site-packages/github2/users.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/__init__.py \r\n ~/Library/Python/2.7/lib/python/site-packages/tests/unit.py ","title":"Avoiding polluting site-packages/tests/ directory","updated_at":"2010/12/09 22:39:34 -0800","closed_at":"2010/12/09 22:39:34 -0800","html_url":"https://github.com/ask/python-github2/issues/12","user":"srid","labels":[],"state":"closed"},{"gravatar_id":"9bfcdf9a72021d081a4cebf69a49ada8","position":11.0,"number":11,"votes":0,"created_at":"2010/10/15 04:42:12 -0700","comments":1,"body":"Python's timedelta did not have a 'total_seconds' method before python 2.7. This patches calculates seconds as documented at http://docs.python.org/library/datetime.html#datetime.timedelta.total_seconds.\n\nThis makes github2 compatible with python2.6 at least.\n\nPatch here: http://gist.github.com/628061","title":"Incompatibility for python 2.6: timedelta total_seconds","updated_at":"2011/04/13 13:06:54 -0700","closed_at":"2011/04/13 13:06:54 -0700","html_url":"https://github.com/ask/python-github2/issues/11","user":"arthur-debert","labels":[],"state":"closed"},{"gravatar_id":"f3794e603ef53b0513ab45b6565ee457","position":10.0,"number":10,"votes":0,"created_at":"2010/09/20 21:32:49 -0700","comments":1,"body":"I added a param to the Github class which enforces rate limits by sleeping the thread if requests are occurring too fast.\r\n\r\nIt's backwards compatible because delays only happen if requests_per_second is passed in. Includes a test, some docstrings, and an updated README.\r\n","title":"Api limits","updated_at":"2010/09/20 22:55:16 -0700","diff_url":"https://github.com/ask/python-github2/pull/10.diff","patch_url":"https://github.com/ask/python-github2/pull/10.patch","pull_request_url":"https://github.com/ask/python-github2/pull/10","closed_at":"2010/09/21 05:55:06 -0700","html_url":"https://github.com/ask/python-github2/issues/10","user":"jdunck","labels":[],"state":"closed"},{"gravatar_id":"5b45540ae377ec54a071f313b7193a27","position":9.0,"number":9,"votes":0,"created_at":"2010/07/28 12:56:51 -0700","comments":2,"body":" Traceback (most recent call last):\r\n File \"migrate_to_github.py\", line 74, in \r\n gh = Github()\r\n TypeError: __init__() takes at least 3 arguments (1 given)\r\n","title":"Doesn't support unauthenticated session","updated_at":"2011/04/18 07:04:50 -0700","closed_at":"2011/04/18 07:04:50 -0700","html_url":"https://github.com/ask/python-github2/issues/9","user":"dabrahams","labels":[],"state":"closed"},{"gravatar_id":"71c4e8223f5bddfbcce0607d387d2125","position":8.0,"number":8,"votes":1,"created_at":"2010/06/20 06:13:37 -0700","comments":1,"body":"There is a cool new way to do Github authentication: http://github.com/blog/656-github-oauth2-support","title":"support for the new OAuth2 authentication","updated_at":"2011/04/26 06:31:50 -0700","closed_at":"2011/04/26 06:31:50 -0700","html_url":"https://github.com/ask/python-github2/issues/8","user":"tarpas","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":7.0,"number":7,"votes":0,"created_at":"2010/05/26 17:08:41 -0700","comments":3,"body":"Python 2.6 includes simplejson (renaming to just json), removing the need for the external dep. To work on 2.5 and 2.6, use try:import:\r\nhttp://github.com/adamv/python-github2/commit/5b2f09d89420aac0d071522b3fbed9b026af6def\r\n","title":"Use json instead of simplejson on Python 2.6","updated_at":"2011/04/09 10:46:22 -0700","closed_at":"2011/04/09 10:46:22 -0700","html_url":"https://github.com/ask/python-github2/issues/7","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","position":6.0,"number":6,"votes":0,"created_at":"2010/05/25 21:59:37 -0700","comments":2,"body":"An object's __repr__ in Python 2.x is required to be ASCII. Various objects in this API return unicode values, as unicode is returned from titles, etc. from the web calls, and those are used in __repr__.\r\n\r\nIn my particular case, I got an error printing Issues that happened to contain non-ASCII characters.\r\n\r\nI'll probably add a commit to this bug tomorrow/later.","title":"__repr__ should return ASCII on Python 2.x","updated_at":"2010/12/08 19:46:28 -0800","closed_at":"2010/12/08 19:46:28 -0800","html_url":"https://github.com/ask/python-github2/issues/6","user":"adamv","labels":[],"state":"closed"},{"gravatar_id":"2e47ce8a038f8eaf3fe80c069e380814","position":4.0,"number":4,"votes":0,"created_at":"2010/04/17 17:24:29 -0700","comments":1,"body":"This package isn't on PyPi near as I can tell.\r\n\r\n* http://pypi.python.org/pypi/github2 \r\n* http://pypi.python.org/pypi/python-github2\r\n\r\nResponse from easy_install:\r\nNo local packages or download links found for python-github2","title":"Not installable via easy_install","updated_at":"2010/04/19 02:26:01 -0700","closed_at":"2010/04/19 02:26:01 -0700","html_url":"https://github.com/ask/python-github2/issues/4","user":"joestump","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":3.0,"number":3,"votes":0,"created_at":"2009/11/12 21:16:20 -0800","comments":2,"body":"In your README, your import path says\r\n\r\n >>> from github.client import Github\r\n\r\nbut it should really be\r\n\r\n >>> from github2.client import Github","title":"README has improper imports","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/3","user":"justinlilly","labels":[],"state":"closed"},{"gravatar_id":"d819f7576d53088db65789b9732141b3","position":2.0,"number":2,"votes":0,"created_at":"2009/11/12 21:15:17 -0800","comments":1,"body":"When searching repos for django, I get an error caused by the emdash in the description of http://github.com/brosner/django \r\n\r\n Traceback: \r\n >>> github.repos.search('django')\r\n Traceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/repositories.py\", line 21, in search\r\n return self.make_request(\"search\", query, filter=\"repositories\")\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/core.py\", line 42, in make_request\r\n response = self.request.get(self.domain, command, *args)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 46, in get\r\n return self.make_request(\"/\".join(path_components))\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 55, in make_request\r\n return self.raw_request(url, extra_post_data)\r\n File \"/Users/jlilly/src/githubgraphs/env/lib/python2.5/site-packages/github2/request.py\", line 71, in raw_request\r\n response_text = response.read().encode(\"utf-8\")\r\n UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 7065: ordinal not in range(128)\r\n","title":"Unicode handling error","updated_at":"2009/11/13 03:32:29 -0800","closed_at":"2009/11/13 03:32:29 -0800","html_url":"https://github.com/ask/python-github2/issues/2","user":"justinlilly","labels":[],"state":"closed"},{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":1.0,"number":1,"votes":0,"created_at":"2009/04/18 13:04:09 -0700","comments":1,"body":"This to support getting raw blob/tree data as specified in http://develop.github.com/p/object.html.","title":"option to make_request so it doesn't parse the response as json.","updated_at":"2011/06/20 09:37:30 -0700","closed_at":"2011/06/20 09:37:30 -0700","html_url":"https://github.com/ask/python-github2/issues/1","user":"ask","labels":[],"state":"closed"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e index 61ad1b6..0220f62 100644 --- a/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e +++ b/tests/data/github.com,api,v2,json,issues,list,ask,python-github2,open,fe32d5f6ebc81579886964c4c353403e @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 57 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/issues/list/ask/python-github2/open -x-runtime: 36ms -content-length: 4100 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 3875 +server: nginx/1.0.4 +x-runtime: 42ms x-ratelimit-limit: 60 -etag: "d4fc8ccc95a538f78b061f48e21b40e2" +etag: "d04e0fd72601ec3f5a1d0440189bd216" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:41:36 GMT +date: Thu, 25 Aug 2011 06:50:48 GMT content-type: application/json; charset=utf-8 -{"issues":[{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":1.0,"number":1,"votes":0,"created_at":"2009/04/18 13:04:09 -0700","comments":0,"body":"This to support getting raw blob/tree data as specified in http://develop.github.com/p/object.html.","title":"option to make_request so it doesn't parse the response as json.","updated_at":"2009/04/18 13:04:09 -0700","html_url":"https://github.com/ask/python-github2/issues/1","user":"ask","labels":[],"state":"open"},{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":5.0,"number":5,"votes":1,"created_at":"2010/05/18 06:10:36 -0700","comments":1,"body":"Goes without saying...","title":"This project needs tests!","updated_at":"2010/06/20 05:47:06 -0700","html_url":"https://github.com/ask/python-github2/issues/5","user":"ask","labels":[],"state":"open"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"created_at":"2010/12/08 23:50:26 -0800","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","updated_at":"2011/01/04 16:26:07 -0800","diff_url":"https://github.com/ask/python-github2/pull/24.diff","patch_url":"https://github.com/ask/python-github2/pull/24.patch","pull_request_url":"https://github.com/ask/python-github2/pull/24","html_url":"https://github.com/ask/python-github2/issues/24","user":"svetlyak40wt","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/05/29 08:37:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":53.0,"number":53,"votes":0,"created_at":"2011/05/28 22:15:49 -0700","comments":1,"body":"It would make more sense, and be easy to filter wanted data, if debug info was handled with the `logging` module. Side effect being the output will change significantly, but does it matter for debugging output anyway?","title":"Use logging for debug information.","updated_at":"2011/06/06 16:17:26 -0700","html_url":"https://github.com/ask/python-github2/issues/53","user":"JNRowe","labels":[],"state":"open"}]} \ No newline at end of file +{"issues":[{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":5.0,"number":5,"votes":1,"created_at":"2010/05/18 06:10:36 -0700","comments":1,"body":"Goes without saying...","title":"This project needs tests!","updated_at":"2010/06/20 05:47:06 -0700","html_url":"https://github.com/ask/python-github2/issues/5","user":"ask","labels":[],"state":"open"},{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"created_at":"2010/12/08 23:50:26 -0800","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","updated_at":"2011/01/04 16:26:07 -0800","diff_url":"https://github.com/ask/python-github2/pull/24.diff","patch_url":"https://github.com/ask/python-github2/pull/24.patch","pull_request_url":"https://github.com/ask/python-github2/pull/24","html_url":"https://github.com/ask/python-github2/issues/24","user":"svetlyak40wt","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":1.0,"number":55,"votes":0,"created_at":"2011/06/30 09:41:09 -0700","comments":0,"body":"\nSee \"Listing Organization Memberships\" section in\nhttp://develop.github.com/p/orgs.html.","title":"Organisation repository listings should support owned/public filters.","updated_at":"2011/06/30 09:41:09 -0700","html_url":"https://github.com/ask/python-github2/issues/55","user":"JNRowe","labels":[],"state":"open"},{"gravatar_id":"390ea42c23c2c383f973abdafa24bb07","position":1.0,"number":58,"votes":0,"created_at":"2011/07/25 11:52:30 -0700","comments":3,"body":"Hi there,\r\n\r\nI was just trying to test this :\r\nhttp://packages.python.org/github2/quickstart.html\r\n\r\nAnd I got that :\r\n\r\n```bash\r\nTraceback (most recent call last):\r\n File \"\", line 1, in \r\n File \"build/bdist.macosx-10.7-intel/egg/github2/repositories.py\", line 206, in watchers\r\n File \"build/bdist.macosx-10.7-intel/egg/github2/core.py\", line 147, in make_request\r\n File \"build/bdist.macosx-10.7-intel/egg/github2/request.py\", line 96, in get\r\n File \"build/bdist.macosx-10.7-intel/egg/github2/request.py\", line 124, in make_request\r\n File \"build/bdist.macosx-10.7-intel/egg/github2/request.py\", line 142, in raw_request\r\n File \"/Library/Python/2.7/site-packages/httplib2/__init__.py\", line 1436, in request\r\n (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)\r\n File \"/Library/Python/2.7/site-packages/httplib2/__init__.py\", line 1188, in _request\r\n (response, content) = self._conn_request(conn, request_uri, method, body, headers)\r\n File \"/Library/Python/2.7/site-packages/httplib2/__init__.py\", line 1123, in _conn_request\r\n conn.connect()\r\n File \"/Library/Python/2.7/site-packages/httplib2/__init__.py\", line 890, in connect\r\n self.disable_ssl_certificate_validation, self.ca_certs)\r\n File \"/Library/Python/2.7/site-packages/httplib2/__init__.py\", line 76, in _ssl_wrap_socket\r\n cert_reqs=cert_reqs, ca_certs=ca_certs)\r\n File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py\", line 344, in wrap_socket\r\n ciphers=ciphers)\r\n File \"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py\", line 119, in __init__\r\n ciphers)\r\nssl.SSLError: [Errno 185090050] _ssl.c:336: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib\r\n```\r\n\r\nAny hints would be nice as the errors are totally cryptic.","title":"Python httplib2 cause error with certificate routine","updated_at":"2011/08/13 05:59:36 -0700","html_url":"https://github.com/ask/python-github2/issues/58","user":"gabrielstuff","labels":[],"state":"open"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,closed,timezone,ca6c06a1218893c7591a54352d1dc532 b/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,closed,timezone,ca6c06a1218893c7591a54352d1dc532 new file mode 100644 index 0000000..7083a70 --- /dev/null +++ b/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,closed,timezone,ca6c06a1218893c7591a54352d1dc532 @@ -0,0 +1,15 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/issues/search/ask/python-github2/closed/timezone +-content-encoding: gzip +connection: keep-alive +content-length: 3425 +server: nginx/1.0.4 +x-runtime: 115ms +x-ratelimit-limit: 60 +etag: "bfda19659b7735d883284fd23fd703ea" +cache-control: private, max-age=0, must-revalidate +date: Thu, 25 Aug 2011 06:53:44 GMT +content-type: application/json; charset=utf-8 + +{"issues":[{"gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","position":21.0,"number":21,"votes":0,"created_at":"2010/12/06 13:10:09 -0800","comments":1,"body":"Hi Ask,\r\n\r\nToday, I commited several patches. First of all, I added support for authenticating using `Github(access_token=\"...\")` GET requests instead of `Github(username=\"foo\", api_token=\"...\")` POST requests. This is the way Github API v2 URLs need to be called when using their (experimental) OAuth model.\r\n\r\nFurthermore, while I was testing this, the Github API seems to have changed the format of all dates to be nice UTC dates with timezone info. This makes the special conversion hoops and tricks unnecessary, so I removed them. For safety, I kept the \"flexible date conversion function lookup\" construct around, but maybe this could be removed as a whole. I'll leave this judgement up to you.\r\n\r\nHave a blast!\r\n\r\nCheers,\r\nVincent\r\n","title":"Add support for OAuth URLs, and a fix for date format","updated_at":"2010/12/06 21:28:42 -0800","diff_url":"https://github.com/ask/python-github2/pull/21.diff","patch_url":"https://github.com/ask/python-github2/pull/21.patch","pull_request_url":"https://github.com/ask/python-github2/pull/21","closed_at":"2010/12/06 21:28:42 -0800","html_url":"https://github.com/ask/python-github2/issues/21","user":"nvie","labels":[],"state":"closed"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":4,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/06/23 02:33:57 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","closed_at":"2011/06/23 02:33:57 -0700","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"closed"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f b/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f deleted file mode 100644 index eb6514d..0000000 --- a/tests/data/github.com,api,v2,json,issues,search,ask,python-github2,open,timezone,e8e32dc210586a68a9d7e0a88b74214f +++ /dev/null @@ -1,14 +0,0 @@ -status: 200 -x-ratelimit-remaining: 58 -content-location: https://github.com/api/v2/json/issues/search/ask/python-github2/open/timezone -x-runtime: 786ms -content-length: 2831 -server: nginx/0.7.67 -connection: keep-alive -x-ratelimit-limit: 60 -etag: "7ad27323679884e25d6250c231999fbf" -cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:41:21 GMT -content-type: application/json; charset=utf-8 - -{"issues":[{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":1.0,"number":1,"votes":0,"created_at":"2009/04/18 13:04:09 -0700","comments":0,"body":"This to support getting raw blob/tree data as specified in http://develop.github.com/p/object.html.","title":"option to make_request so it doesn't parse the response as json.","updated_at":"2009/04/18 13:04:09 -0700","html_url":"https://github.com/ask/python-github2/issues/1","user":"ask","labels":[],"state":"open"},{"gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","position":5.0,"number":5,"votes":1,"created_at":"2010/05/18 06:10:36 -0700","comments":1,"body":"Goes without saying...","title":"This project needs tests!","updated_at":"2010/06/20 05:47:06 -0700","html_url":"https://github.com/ask/python-github2/issues/5","user":"ask","labels":[],"state":"open"},{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"created_at":"2011/04/18 08:25:47 -0700","comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","updated_at":"2011/05/29 08:37:08 -0700","diff_url":"https://github.com/ask/python-github2/pull/39.diff","patch_url":"https://github.com/ask/python-github2/pull/39.patch","pull_request_url":"https://github.com/ask/python-github2/pull/39","html_url":"https://github.com/ask/python-github2/issues/39","user":"JNRowe","labels":[],"state":"open"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 b/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 index f7e70e5..c09772b 100644 --- a/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 +++ b/tests/data/github.com,api,v2,json,issues,show,ask,python-github2,24,5b0c4463c84fc26a94bc1bfaa191fed5 @@ -1,14 +1,15 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/issues/show/ask/python-github2/24 -x-runtime: 54ms -content-length: 717 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 717 +server: nginx/1.0.4 +x-runtime: 18ms x-ratelimit-limit: 60 -etag: "4bf7a5d7cb406c99f66a0110a1828a7b" +etag: "bb0d68a4d27526c9254b59bae43068fd" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:40:55 GMT +date: Thu, 25 Aug 2011 06:52:22 GMT content-type: application/json; charset=utf-8 {"issue":{"gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"created_at":"2010/12/08 23:50:26 -0800","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","updated_at":"2011/01/04 16:26:07 -0800","diff_url":"https://github.com/ask/python-github2/pull/24.diff","patch_url":"https://github.com/ask/python-github2/pull/24.patch","pull_request_url":"https://github.com/ask/python-github2/pull/24","html_url":"https://github.com/ask/python-github2/issues/24","user":"svetlyak40wt","labels":[],"state":"open"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca b/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca index f69777d..32ad149 100644 --- a/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca +++ b/tests/data/github.com,api,v2,json,organizations,github,d8f16b26260e5cb408a092d5071996ca @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 58 +status: 200 +x-ratelimit-remaining: 57 content-location: https://github.com/api/v2/json/organizations/github +-content-encoding: gzip connection: keep-alive content-length: 387 -server: nginx/0.7.67 -x-runtime: 21ms +server: nginx/1.0.4 +x-runtime: 23ms x-ratelimit-limit: 60 -etag: "f02044d4890b2b09977b7b9e75053b1e" +etag: "8a6bd525c73aaa95dbb493788a45e183" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:46:30 GMT +date: Thu, 25 Aug 2011 06:54:20 GMT content-type: application/json; charset=utf-8 -{"organization":{"gravatar_id":"61024896f291303615bcd4f7a0dcfb74","company":null,"name":"GitHub","created_at":"2008-05-10T21:37:31-07:00","location":"San Francisco, CA","public_repo_count":26,"public_gist_count":0,"blog":"https://github.com/about","following_count":0,"id":9919,"type":"Organization","permission":null,"followers_count":571,"login":"github","email":"support@github.com"}} \ No newline at end of file +{"organization":{"gravatar_id":"61024896f291303615bcd4f7a0dcfb74","company":null,"name":"GitHub","created_at":"2008-05-10T21:37:31-07:00","location":"San Francisco, CA","public_repo_count":31,"public_gist_count":0,"blog":"https://github.com/about","following_count":0,"id":9919,"type":"Organization","permission":null,"followers_count":591,"login":"github","email":"support@github.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 b/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 index 924af5f..4b2ecd6 100644 --- a/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 +++ b/tests/data/github.com,api,v2,json,organizations,github,public_members,01d1fb446743540669e4773bf8cf53c3 @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 56 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/organizations/github/public_members -x-runtime: 2059ms -content-length: 12105 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 12867 +server: nginx/1.0.4 +x-runtime: 744ms x-ratelimit-limit: 60 -etag: "defe4971b2099cdb3aafc77717bc32f7" +etag: "0174ac52c3b274340f5dd5bd0a372282" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:46:58 GMT +date: Thu, 25 Aug 2011 06:54:57 GMT content-type: application/json; charset=utf-8 -{"users":[{"gravatar_id":"7f67284c12b6d38fa1c8590911fd58a0","company":"GitHub","name":"Petros Amiridis","created_at":"2008/10/13 14:19:57 -0700","location":"Thessaloniki, Greece","public_repo_count":12,"public_gist_count":19,"blog":"amiridis.net","following_count":50,"id":28818,"type":"User","permission":null,"followers_count":32,"login":"amiridis","email":"petros@amiridis.net"},{"gravatar_id":"a86224d72ce21cd9f5bee6784d4b06c7","company":"GitHub","name":"Corey Donohoe","created_at":"2008/01/22 01:14:11 -0800","location":"Potrero, SF","public_repo_count":85,"public_gist_count":145,"blog":"http://www.atmos.org","following_count":161,"id":38,"type":"User","permission":null,"followers_count":313,"login":"atmos","email":"atmos@atmos.org"},{"gravatar_id":"4d1c9dad17af98e55cb65b4efce27c42","company":"GitHub","name":"Ben Burkert","created_at":"2008/01/28 15:44:14 -0800","location":"SF","public_repo_count":50,"public_gist_count":23,"blog":"http://benburkert.com","following_count":16,"id":77,"type":"User","permission":null,"followers_count":75,"login":"benburkert","email":"ben@benburkert.com"},{"gravatar_id":"4f237ee952d1af0c47028bfda53664a8","company":"Github, Inc. ","name":"Beth Newland","created_at":"2011/06/06 15:11:41 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":0,"id":833804,"type":"User","permission":null,"followers_count":0,"login":"bethnewland","email":"beth@github.com"},{"gravatar_id":"aeb22e809b34e9c8a5623ba6c4738a63","company":"GitHub, Inc.","name":"Ben Bleikamp","created_at":"2008/09/22 13:28:53 -0700","location":"San Francisco, CA","public_repo_count":5,"public_gist_count":14,"blog":"http://bleikamp.com","following_count":36,"id":25792,"type":"User","permission":null,"followers_count":38,"login":"bleikamp","email":"ben@github.com"},{"gravatar_id":"c9f60c0cb1d941fa8e93bbfcb907c27e","company":"GitHub","name":"Brian Lopez","created_at":"2008/05/26 15:54:55 -0700","location":"San Francisco, Ca","public_repo_count":43,"public_gist_count":118,"blog":"http://github.com","following_count":141,"id":11571,"type":"User","permission":null,"followers_count":172,"login":"brianmario","email":"seniorlopez@gmail.com"},{"gravatar_id":"edad3aaefdd499ab37b910aded54e1b3","company":"GitHub, Inc. / Revyver, Inc.","name":"Bryan Veloso","created_at":"2008/02/27 14:57:03 -0800","location":"Los Angeles, CA","public_repo_count":19,"public_gist_count":30,"blog":"http://avalonstar.com","following_count":109,"id":1258,"type":"User","permission":null,"followers_count":192,"login":"bryanveloso","email":"bryan@github.com"},{"gravatar_id":"a79ff2bb7da84e275361857d2feb2b1b","company":"GitHub","name":"Cameron McEfee","created_at":"2009/04/11 23:16:59 -0700","location":"San Francisco","public_repo_count":3,"public_gist_count":0,"blog":"http://www.cameronmcefee.com","following_count":3,"id":72919,"type":"User","permission":null,"followers_count":39,"login":"cameronmcefee","email":"cameron@github.com"},{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":93,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":211,"id":2,"type":"User","permission":null,"followers_count":2760,"login":"defunkt","email":"chris@wanstrath.com"},{"gravatar_id":"fd923a707b3e788b3d6b0e8f84cfbbe3","company":"GitHub","name":"Alex Malinovich","created_at":"2008/04/15 00:17:51 -0700","location":"San Francisco, CA","public_repo_count":15,"public_gist_count":12,"blog":"http://www.the-love-shack.net","following_count":8,"id":7385,"type":"User","permission":null,"followers_count":22,"login":"demonbane","email":"alex@github.com"},{"gravatar_id":"eb6845de9b94082d7d90a0603d91ff42","company":"GitHub","name":"Heather A. Baldry","created_at":"2011/05/03 14:39:07 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":10,"id":766591,"type":"User","permission":null,"followers_count":5,"login":"Foggybtmgirl","email":"heather@github.com"},{"gravatar_id":"6f63cde8b16b035280ca615f621a6c8c","company":"GitHub","name":"Zach Holman","created_at":"2008/03/10 09:32:37 -0700","location":"San Francisco, CA","public_repo_count":33,"public_gist_count":12,"blog":"http://zachholman.com/about","following_count":65,"id":2723,"type":"User","permission":null,"followers_count":278,"login":"holman","email":"hello@zachholman.com"},{"gravatar_id":"bbe5dc8dcf248706525ab76f46185520","company":"GitHub","name":"Joshua Peek","created_at":"2008/02/03 14:05:54 -0800","location":"Chicago, IL","public_repo_count":71,"public_gist_count":50,"blog":"http://joshpeek.com/","following_count":33,"id":137,"type":"User","permission":null,"followers_count":561,"login":"josh","email":"josh@joshpeek.com"},{"gravatar_id":"62e8c8bfaa8d755cab82accb48d335c8","company":"GitHub","name":"Josh Abernathy","created_at":"2008/06/14 17:25:05 -0700","location":"Seattle, WA","public_repo_count":13,"public_gist_count":4,"blog":"http://twitter.com/joshaber","following_count":23,"id":13760,"type":"User","permission":null,"followers_count":166,"login":"joshaber","email":"josh@github.com"},{"gravatar_id":"e650a773fc40f042e46d1e36b326e4e1","company":"GitHub Inc.","name":"Jason Costello","created_at":"2010/09/26 12:46:13 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":"jason-costello.com","following_count":6,"id":416727,"type":"User","permission":null,"followers_count":18,"login":"jsncostello","email":"jason@github.com"},{"gravatar_id":"28bda3f5dfcc92365efe4eecc0b38eb8","company":"GitHub","name":"Kami","created_at":"2010/10/17 13:21:26 -0700","location":"San Francisco, CA","public_repo_count":4,"public_gist_count":0,"blog":null,"following_count":47,"id":443094,"type":"User","permission":null,"followers_count":30,"login":"kamzilla","email":"kami@github.com"},{"gravatar_id":"4e3f068bcac207404306e790c0d662ed","company":"GitHub Inc.","name":"Kevin Sawicki","created_at":"2011/03/15 09:46:18 -0700","location":"Redwood City, CA","public_repo_count":8,"public_gist_count":4,"blog":null,"following_count":10,"id":671378,"type":"User","permission":null,"followers_count":48,"login":"kevinsawicki","email":"kevin@github.com"},{"gravatar_id":"5f2da528927a2ec9ba4fec2069cbc958","company":"GitHub, Inc.","name":"Kyle Neath","created_at":"2008/02/27 16:48:15 -0800","location":"San Francisco, CA","public_repo_count":21,"public_gist_count":32,"blog":"http://warpspire.com","following_count":40,"id":1354,"type":"User","permission":null,"followers_count":304,"login":"kneath","email":"kyle@github.com"},{"gravatar_id":"17fc534665d54bcd8b4d2676d709aa99","company":"GitHub","name":"Melissa Severini","created_at":"2009/03/19 16:48:58 -0700","location":"San Francisco, CA","public_repo_count":2,"public_gist_count":0,"blog":"http://luckiestmonkey.tumblr.com/","following_count":12,"id":65087,"type":"User","permission":null,"followers_count":58,"login":"luckiestmonkey","email":"luckiest.monkey@gmail.com"},{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":50,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":1960,"login":"mojombo","email":"tom@github.com"},{"gravatar_id":"b6861bc75bff3c594212338a914a39ad","company":"Highgroove Studios","name":"Matt Todd","created_at":"2008/02/10 22:28:43 -0800","location":"Atlanta, GA","public_repo_count":89,"public_gist_count":93,"blog":"http://maraby.org/","following_count":175,"id":182,"type":"User","permission":null,"followers_count":102,"login":"mtodd","email":"mtodd@highgroove.com"},{"gravatar_id":"63027897db609fdbe6ac820fa12736b9","company":null,"name":"Jeff King","created_at":"2009/01/12 01:29:10 -0800","location":null,"public_repo_count":7,"public_gist_count":2,"blog":null,"following_count":0,"id":45925,"type":"User","permission":null,"followers_count":31,"login":"peff","email":"peff@peff.net"},{"gravatar_id":"947c333c75de1dc54a711a400d575c8c","company":"GitHub, Inc.","name":"PJ Hyett","created_at":"2008/01/07 09:54:22 -0800","location":"San Francisco, CA","public_repo_count":16,"public_gist_count":23,"blog":"http://twitter.com/pjhyett","following_count":23,"id":3,"type":"User","permission":null,"followers_count":824,"login":"pjhyett","email":"pj@github.com"},{"gravatar_id":"ac65e62b7ad42e9bc5fdf391d0e250a7","company":"mystery","name":"Corey Johnson","created_at":"2008/02/21 14:07:26 -0800","location":"San Francisco","public_repo_count":18,"public_gist_count":57,"blog":"","following_count":1,"id":596,"type":"User","permission":null,"followers_count":134,"login":"probablycorey","email":"cj@github.com"},{"gravatar_id":"920e60e81da4fb61eaeb95fa9d7c3b70","company":"GitHub","name":"Tim Sharpe","created_at":"2009/05/03 20:28:14 -0700","location":"Sydney :: Australia","public_repo_count":29,"public_gist_count":8,"blog":"","following_count":0,"id":80629,"type":"User","permission":null,"followers_count":43,"login":"rodjek","email":"tim@github.com"},{"gravatar_id":"abfc88b96ae18c85ba7aac3bded2ec5e","company":"GitHub","name":"Ryan Tomayko","created_at":"2008/02/18 19:30:53 -0800","location":"San Francisco","public_repo_count":34,"public_gist_count":81,"blog":"http://tomayko.com/about","following_count":79,"id":404,"type":"User","permission":null,"followers_count":870,"login":"rtomayko","email":"r@tomayko.com"},{"gravatar_id":"9375a9529679f1b42b567a640d775e7d","company":"GitHub","name":"Scott Chacon","created_at":"2008/01/27 09:19:28 -0800","location":"San Francisco, CA","public_repo_count":124,"public_gist_count":69,"blog":"http://scottchacon.com","following_count":17,"id":70,"type":"User","permission":null,"followers_count":1479,"login":"schacon","email":"schacon@gmail.com"},{"gravatar_id":"8cf17bf55c4d16cf52480619bb0b6c92","company":"GitHub","name":"Simon Rozet","created_at":"2008/01/29 12:37:53 -0800","location":"Brussels, Belgium","public_repo_count":91,"public_gist_count":52,"blog":"http://atonie.org","following_count":166,"id":90,"type":"User","permission":null,"followers_count":270,"login":"sr","email":"simon@rozet.name"},{"gravatar_id":"6804f1775cb4babfcc3851298566fbce","company":"GitHub","name":"Vicent Martí","created_at":"2008/12/26 12:21:00 -0800","location":"Mainly Europe","public_repo_count":12,"public_gist_count":2,"blog":null,"following_count":20,"id":42793,"type":"User","permission":null,"followers_count":72,"login":"tanoku","email":"vicent@github.com"},{"gravatar_id":"2f4861b27dc35663ed271d39f5358261","company":"GitHub","name":"Tim Clem","created_at":"2009/10/07 13:26:53 -0700","location":"San Francisco, CA","public_repo_count":10,"public_gist_count":3,"blog":"http://timclem.wordpress.com","following_count":1,"id":136521,"type":"User","permission":null,"followers_count":31,"login":"tclem","email":"timothy.clem@gmail.com"},{"gravatar_id":"821395fe70906c8290df7f18ac4ac6cf","company":"GitHub","name":"rick","created_at":"2008/01/13 20:33:35 -0800","location":"sf","public_repo_count":120,"public_gist_count":83,"blog":"http://techno-weenie.net","following_count":14,"id":21,"type":"User","permission":null,"followers_count":1478,"login":"technoweenie","email":"technoweenie@gmail.com"},{"gravatar_id":"495abe87ebbc36e70c8db98680ec8a46","company":null,"name":"Tekkub","created_at":"2008/02/23 13:14:45 -0800","location":"Denver, CO","public_repo_count":132,"public_gist_count":204,"blog":"tekkub.net","following_count":0,"id":706,"type":"User","permission":null,"followers_count":327,"login":"tekkub","email":null},{"gravatar_id":"d47656e20ff5e42f125fc5ea0fd636c6","company":"GitHub, Inc.","name":"Aman Gupta","created_at":"2008/03/07 18:10:31 -0800","location":"San Francisco, CA","public_repo_count":67,"public_gist_count":92,"blog":"http://twitter.com/tmm1","following_count":129,"id":2567,"type":"User","permission":null,"followers_count":537,"login":"tmm1","email":"aman@tmm1.net"}]} \ No newline at end of file +{"users":[{"gravatar_id":"7f67284c12b6d38fa1c8590911fd58a0","company":"GitHub","name":"Petros Amiridis","created_at":"2008/10/13 14:19:57 -0700","location":"Thessaloniki, Greece","public_repo_count":25,"public_gist_count":20,"blog":"amiridis.net","following_count":53,"id":28818,"type":"User","permission":null,"followers_count":47,"login":"amiridis","email":"petros@amiridis.net"},{"gravatar_id":"a86224d72ce21cd9f5bee6784d4b06c7","company":"GitHub","name":"Corey Donohoe","created_at":"2008/01/22 01:14:11 -0800","location":"Potrero, SF","public_repo_count":87,"public_gist_count":146,"blog":"http://www.atmos.org","following_count":161,"id":38,"type":"User","permission":null,"followers_count":333,"login":"atmos","email":"atmos@atmos.org"},{"gravatar_id":"4d1c9dad17af98e55cb65b4efce27c42","company":"GitHub","name":"Ben Burkert","created_at":"2008/01/28 15:44:14 -0800","location":"SF","public_repo_count":57,"public_gist_count":24,"blog":"http://benburkert.com","following_count":16,"id":77,"type":"User","permission":null,"followers_count":80,"login":"benburkert","email":"ben@benburkert.com"},{"gravatar_id":"4f237ee952d1af0c47028bfda53664a8","company":"Github, Inc. ","name":"Beth Newland","created_at":"2011/06/06 15:11:41 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":0,"id":833804,"type":"User","permission":null,"followers_count":4,"login":"bethnewland","email":"beth@github.com"},{"gravatar_id":"aeb22e809b34e9c8a5623ba6c4738a63","company":"GitHub, Inc.","name":"Ben Bleikamp","created_at":"2008/09/22 13:28:53 -0700","location":"San Francisco, CA","public_repo_count":9,"public_gist_count":14,"blog":"http://bleikamp.com","following_count":43,"id":25792,"type":"User","permission":null,"followers_count":42,"login":"bleikamp","email":"ben@github.com"},{"gravatar_id":"c9f60c0cb1d941fa8e93bbfcb907c27e","company":"GitHub","name":"Brian Lopez","created_at":"2008/05/26 15:54:55 -0700","location":"San Francisco, Ca","public_repo_count":46,"public_gist_count":118,"blog":"http://github.com","following_count":144,"id":11571,"type":"User","permission":null,"followers_count":188,"login":"brianmario","email":"seniorlopez@gmail.com"},{"gravatar_id":"edad3aaefdd499ab37b910aded54e1b3","company":"GitHub, Inc. / Revyver, Inc.","name":"Bryan Veloso","created_at":"2008/02/27 14:57:03 -0800","location":"Los Angeles, CA","public_repo_count":19,"public_gist_count":31,"blog":"http://avalonstar.com","following_count":110,"id":1258,"type":"User","permission":null,"followers_count":199,"login":"bryanveloso","email":"bryan@github.com"},{"gravatar_id":"a79ff2bb7da84e275361857d2feb2b1b","company":"GitHub","name":"Cameron McEfee","created_at":"2009/04/11 23:16:59 -0700","location":"San Francisco","public_repo_count":3,"public_gist_count":0,"blog":"http://www.cameronmcefee.com","following_count":4,"id":72919,"type":"User","permission":null,"followers_count":67,"login":"cameronmcefee","email":"cameron@github.com"},{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":93,"public_gist_count":279,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":3516,"login":"defunkt","email":"chris@wanstrath.com"},{"gravatar_id":"fd923a707b3e788b3d6b0e8f84cfbbe3","company":"GitHub","name":"Alex Malinovich","created_at":"2008/04/15 00:17:51 -0700","location":"San Francisco, CA","public_repo_count":15,"public_gist_count":13,"blog":"http://www.the-love-shack.net","following_count":8,"id":7385,"type":"User","permission":null,"followers_count":24,"login":"demonbane","email":"alex@github.com"},{"gravatar_id":"eb6845de9b94082d7d90a0603d91ff42","company":"GitHub","name":"Heather A. Baldry","created_at":"2011/05/03 14:39:07 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":null,"following_count":11,"id":766591,"type":"User","permission":null,"followers_count":7,"login":"Foggybtmgirl","email":"heather@github.com"},{"gravatar_id":"6f63cde8b16b035280ca615f621a6c8c","company":"GitHub","name":"Zach Holman","created_at":"2008/03/10 09:32:37 -0700","location":"San Francisco, CA","public_repo_count":37,"public_gist_count":12,"blog":"http://zachholman.com/about","following_count":69,"id":2723,"type":"User","permission":null,"followers_count":401,"login":"holman","email":"hello@zachholman.com"},{"gravatar_id":"bbe5dc8dcf248706525ab76f46185520","company":"GitHub","name":"Joshua Peek","created_at":"2008/02/03 14:05:54 -0800","location":"Chicago, IL","public_repo_count":76,"public_gist_count":57,"blog":"http://joshpeek.com/","following_count":37,"id":137,"type":"User","permission":null,"followers_count":631,"login":"josh","email":"josh@joshpeek.com"},{"gravatar_id":"62e8c8bfaa8d755cab82accb48d335c8","company":"GitHub","name":"Josh Abernathy","created_at":"2008/06/14 17:25:05 -0700","location":"Seattle, WA","public_repo_count":18,"public_gist_count":5,"blog":"http://twitter.com/joshaber","following_count":28,"id":13760,"type":"User","permission":null,"followers_count":197,"login":"joshaber","email":"josh@github.com"},{"gravatar_id":"e650a773fc40f042e46d1e36b326e4e1","company":"GitHub Inc.","name":"Jason Costello","created_at":"2010/09/26 12:46:13 -0700","location":"San Francisco, CA","public_repo_count":0,"public_gist_count":0,"blog":"jason-costello.com","following_count":8,"id":416727,"type":"User","permission":null,"followers_count":21,"login":"jsncostello","email":"jason@github.com"},{"gravatar_id":"28bda3f5dfcc92365efe4eecc0b38eb8","company":"GitHub","name":"Kami","created_at":"2010/10/17 13:21:26 -0700","location":"San Francisco, CA","public_repo_count":5,"public_gist_count":3,"blog":null,"following_count":53,"id":443094,"type":"User","permission":null,"followers_count":49,"login":"kamzilla","email":"kami@github.com"},{"gravatar_id":"4e3f068bcac207404306e790c0d662ed","company":"GitHub Inc.","name":"Kevin Sawicki","created_at":"2011/03/15 09:46:18 -0700","location":"Redwood City, CA","public_repo_count":23,"public_gist_count":5,"blog":null,"following_count":10,"id":671378,"type":"User","permission":null,"followers_count":55,"login":"kevinsawicki","email":"kevin@github.com"},{"gravatar_id":"5f2da528927a2ec9ba4fec2069cbc958","company":"GitHub, Inc.","name":"Kyle Neath","created_at":"2008/02/27 16:48:15 -0800","location":"San Francisco, CA","public_repo_count":22,"public_gist_count":32,"blog":"http://warpspire.com","following_count":40,"id":1354,"type":"User","permission":null,"followers_count":347,"login":"kneath","email":"kyle@github.com"},{"gravatar_id":"17fc534665d54bcd8b4d2676d709aa99","company":"GitHub","name":"Melissa Severini","created_at":"2009/03/19 16:48:58 -0700","location":"San Francisco, CA","public_repo_count":2,"public_gist_count":0,"blog":"http://luckiestmonkey.tumblr.com/","following_count":12,"id":65087,"type":"User","permission":null,"followers_count":62,"login":"luckiestmonkey","email":"luckiest.monkey@gmail.com"},{"gravatar_id":"366472c969c9754ae2b8079e42fed1ca","company":"GitHub, Inc.","name":"Jon Maddox","created_at":"2008/02/13 15:33:31 -0800","location":"Richmond, Va","public_repo_count":56,"public_gist_count":62,"blog":"http://jonmaddox.com","following_count":8,"id":260,"type":"User","permission":null,"followers_count":184,"login":"maddox","email":"jon@jonmaddox.com"},{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":52,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":2745,"login":"mojombo","email":"tom@github.com"},{"gravatar_id":"b6861bc75bff3c594212338a914a39ad","company":"GitHub","name":"Matt Todd","created_at":"2008/02/10 22:28:43 -0800","location":"San Francisco, CA","public_repo_count":97,"public_gist_count":94,"blog":"http://maraby.org/","following_count":177,"id":182,"type":"User","permission":null,"followers_count":121,"login":"mtodd","email":"matt@github.com"},{"gravatar_id":"63027897db609fdbe6ac820fa12736b9","company":null,"name":"Jeff King","created_at":"2009/01/12 01:29:10 -0800","location":null,"public_repo_count":7,"public_gist_count":2,"blog":null,"following_count":0,"id":45925,"type":"User","permission":null,"followers_count":40,"login":"peff","email":"peff@peff.net"},{"gravatar_id":"947c333c75de1dc54a711a400d575c8c","company":"GitHub, Inc.","name":"PJ Hyett","created_at":"2008/01/07 09:54:22 -0800","location":"San Francisco, CA","public_repo_count":16,"public_gist_count":23,"blog":"http://twitter.com/pjhyett","following_count":23,"id":3,"type":"User","permission":null,"followers_count":1279,"login":"pjhyett","email":"pj@github.com"},{"gravatar_id":"ac65e62b7ad42e9bc5fdf391d0e250a7","company":"mystery","name":"Corey Johnson","created_at":"2008/02/21 14:07:26 -0800","location":"San Francisco","public_repo_count":22,"public_gist_count":63,"blog":"","following_count":2,"id":596,"type":"User","permission":null,"followers_count":145,"login":"probablycorey","email":"cj@github.com"},{"gravatar_id":"920e60e81da4fb61eaeb95fa9d7c3b70","company":"GitHub","name":"Tim Sharpe","created_at":"2009/05/03 20:28:14 -0700","location":"Sydney :: Australia","public_repo_count":33,"public_gist_count":9,"blog":"","following_count":0,"id":80629,"type":"User","permission":null,"followers_count":57,"login":"rodjek","email":"tim@github.com"},{"gravatar_id":"abfc88b96ae18c85ba7aac3bded2ec5e","company":"GitHub","name":"Ryan Tomayko","created_at":"2008/02/18 19:30:53 -0800","location":"San Francisco","public_repo_count":37,"public_gist_count":81,"blog":"http://tomayko.com/about","following_count":79,"id":404,"type":"User","permission":null,"followers_count":933,"login":"rtomayko","email":"r@tomayko.com"},{"gravatar_id":"9375a9529679f1b42b567a640d775e7d","company":"GitHub","name":"Scott Chacon","created_at":"2008/01/27 09:19:28 -0800","location":"San Francisco, CA","public_repo_count":131,"public_gist_count":76,"blog":"http://scottchacon.com","following_count":17,"id":70,"type":"User","permission":null,"followers_count":2068,"login":"schacon","email":"schacon@gmail.com"},{"gravatar_id":"8cf17bf55c4d16cf52480619bb0b6c92","company":"GitHub","name":"Simon Rozet","created_at":"2008/01/29 12:37:53 -0800","location":"Brussels, Belgium","public_repo_count":97,"public_gist_count":52,"blog":"http://twitter.com/sr","following_count":166,"id":90,"type":"User","permission":null,"followers_count":282,"login":"sr","email":"simon@rozet.name"},{"gravatar_id":"6804f1775cb4babfcc3851298566fbce","company":"GitHub","name":"Vicent Martí","created_at":"2008/12/26 12:21:00 -0800","location":"Mainly Europe","public_repo_count":16,"public_gist_count":3,"blog":"http://twitter.com/tanoku","following_count":20,"id":42793,"type":"User","permission":null,"followers_count":98,"login":"tanoku","email":"vicent@github.com"},{"gravatar_id":"2f4861b27dc35663ed271d39f5358261","company":"GitHub","name":"Tim Clem","created_at":"2009/10/07 13:26:53 -0700","location":"San Francisco, CA","public_repo_count":11,"public_gist_count":3,"blog":"http://timclem.wordpress.com","following_count":6,"id":136521,"type":"User","permission":null,"followers_count":41,"login":"tclem","email":"timothy.clem@gmail.com"},{"gravatar_id":"821395fe70906c8290df7f18ac4ac6cf","company":"GitHub","name":"rick","created_at":"2008/01/13 20:33:35 -0800","location":"San Francisco","public_repo_count":87,"public_gist_count":86,"blog":"http://techno-weenie.net","following_count":14,"id":21,"type":"User","permission":null,"followers_count":1536,"login":"technoweenie","email":"technoweenie@gmail.com"},{"gravatar_id":"495abe87ebbc36e70c8db98680ec8a46","company":null,"name":"Tekkub","created_at":"2008/02/23 13:14:45 -0800","location":"Denver, CO","public_repo_count":136,"public_gist_count":205,"blog":"tekkub.net","following_count":0,"id":706,"type":"User","permission":null,"followers_count":353,"login":"tekkub","email":null},{"gravatar_id":"d47656e20ff5e42f125fc5ea0fd636c6","company":"GitHub, Inc.","name":"Aman Gupta","created_at":"2008/03/07 18:10:31 -0800","location":"San Francisco, CA","public_repo_count":79,"public_gist_count":93,"blog":"http://twitter.com/tmm1","following_count":129,"id":2567,"type":"User","permission":null,"followers_count":585,"login":"tmm1","email":"aman@tmm1.net"},{"gravatar_id":"8de583685d3e68f79917ec82253185d8","company":"GitHub","name":"Paul Betts","created_at":"2008/02/27 18:26:12 -0800","location":"Seattle","public_repo_count":29,"public_gist_count":37,"blog":"http://blog.paulbetts.org","following_count":1,"id":1396,"type":"User","permission":null,"followers_count":53,"login":"xpaulbettsx","email":"paul@paulbetts.org"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 b/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 index 995ca97..27015a8 100644 --- a/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 +++ b/tests/data/github.com,api,v2,json,organizations,github,public_repositories,f3e3e76ac876947b47b43a16fa0e44e5 @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 57 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/organizations/github/public_repositories -x-runtime: 62ms -content-length: 11291 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 13453 +server: nginx/1.0.4 +x-runtime: 79ms x-ratelimit-limit: 60 -etag: "1f0d429e423a830166d933f216bfd508" +etag: "245b1ac3569e7232afff40d5ddc21c49" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:46:47 GMT +date: Thu, 25 Aug 2011 06:55:32 GMT content-type: application/json; charset=utf-8 -{"repositories":[{"watchers":61,"has_downloads":true,"organization":"github","homepage":"https://github.com/","pushed_at":"2011/05/31 16:40:29 -0700","created_at":"2008/03/09 15:43:49 -0700","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/media","forks":6,"size":128,"private":false,"name":"media","owner":"github","has_issues":false,"description":"Media files for use in your GitHub integration projects"},{"watchers":101,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2011/04/19 17:45:38 -0700","created_at":"2008/05/10 21:45:03 -0700","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/albino","forks":12,"size":1296,"private":false,"language":"Ruby","name":"albino","owner":"github","has_issues":true,"description":"Ruby wrapper for the Pygments syntax highlighter."},{"watchers":42,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:00 -0700","created_at":"2008/05/10 21:45:18 -0700","fork":false,"has_wiki":false,"open_issues":1,"url":"https://github.com/github/hubahuba","forks":9,"size":0,"private":false,"language":"Ruby","name":"hubahuba","owner":"github","has_issues":true,"description":"Ruby and Rails core extensions used by GitHub."},{"watchers":50,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:22 -0700","created_at":"2008/05/10 21:45:31 -0700","fork":false,"has_wiki":false,"open_issues":1,"url":"https://github.com/github/jquery-hotkeys","forks":7,"size":0,"private":false,"name":"jquery-hotkeys","owner":"github","has_issues":true,"description":"jQuery hotkeys plugin."},{"watchers":72,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:52:38 -0700","created_at":"2008/05/10 21:45:52 -0700","fork":false,"has_wiki":false,"open_issues":2,"url":"https://github.com/github/jquery-relatize_date","forks":9,"size":0,"private":false,"name":"jquery-relatize_date","owner":"github","has_issues":true,"description":"jQuery version of technoweenie's relative date js library."},{"watchers":11,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/12/30 13:04:00 -0800","created_at":"2008/05/10 21:46:10 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/request_timer","forks":0,"size":140,"private":false,"language":"Ruby","name":"request_timer","owner":"github","has_issues":true,"description":"Simple Rails request timer with even simpler js bookmarklet."},{"watchers":27,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/05/10 21:53:11 -0700","created_at":"2008/05/10 21:46:27 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/will_paginate_with_hotkeys","forks":1,"size":0,"private":false,"language":"Ruby","name":"will_paginate_with_hotkeys","owner":"github","has_issues":true,"description":"Evil twin plugin version of will_paginate to work with jQuery hotkeys plugin."},{"watchers":25,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2008/11/03 20:54:57 -0800","created_at":"2008/10/24 15:29:32 -0700","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/gem-builder","forks":3,"size":76,"private":false,"language":"Ruby","name":"gem-builder","owner":"github","has_issues":true,"description":"The scripts used to build RubyGems on GitHub"},{"watchers":4,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2009/04/08 17:36:30 -0700","created_at":"2009/02/10 19:56:17 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/safegem","forks":0,"size":1024,"private":false,"language":"Ruby","name":"safegem","owner":"github","has_issues":true,"description":"GitHub's safe gem eval web service"},{"watchers":135,"has_downloads":false,"organization":"github","homepage":"http://develop.github.com","pushed_at":"2011/06/01 20:54:15 -0700","created_at":"2009/02/17 15:51:23 -0800","master_branch":"gh-pages","fork":false,"has_wiki":false,"open_issues":34,"url":"https://github.com/github/develop.github.com","forks":45,"size":112,"private":false,"language":"JavaScript","name":"develop.github.com","owner":"github","has_issues":true,"description":"API Documentation for GitHub"},{"watchers":69,"has_downloads":true,"organization":"github","homepage":"http://github.github.com/github-flavored-markdown/","pushed_at":"2011/04/28 04:10:37 -0700","created_at":"2009/04/10 16:01:43 -0700","master_branch":"gh-pages","fork":false,"has_wiki":true,"open_issues":20,"url":"https://github.com/github/github-flavored-markdown","forks":14,"size":232,"private":false,"language":"JavaScript","name":"github-flavored-markdown","owner":"github","has_issues":true,"description":""},{"watchers":314,"has_downloads":false,"organization":"github","homepage":"","pushed_at":"2011/04/03 11:21:14 -0700","created_at":"2009/10/30 18:02:46 -0700","fork":false,"has_wiki":false,"open_issues":41,"url":"https://github.com/github/markup","forks":66,"size":384,"private":false,"language":"Python","name":"markup","owner":"github","has_issues":true,"description":"The code we use to render README.your_favorite_markup"},{"watchers":1209,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/06/07 23:44:52 -0700","created_at":"2010/03/29 11:30:53 -0700","fork":false,"has_wiki":true,"open_issues":87,"url":"https://github.com/github/gollum","forks":136,"size":4812,"private":false,"language":"JavaScript","name":"gollum","owner":"github","has_issues":true,"description":"A simple, Git-powered wiki with a sweet API and local frontend."},{"watchers":23,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/08/01 01:04:46 -0700","created_at":"2010/04/02 21:50:46 -0700","fork":false,"has_wiki":true,"open_issues":2,"url":"https://github.com/github/upload","forks":4,"size":276,"private":false,"language":"Ruby","name":"upload","owner":"github","has_issues":true,"description":"Script to upload files to non-repo storage from the command line"},{"watchers":312,"has_downloads":false,"organization":"github","homepage":"http://github.com/blog/53-github-services-ipo","pushed_at":"2011/06/06 16:57:52 -0700","created_at":"2010/05/14 13:07:36 -0700","fork":false,"has_wiki":false,"open_issues":27,"url":"https://github.com/github/github-services","forks":334,"size":128,"private":false,"language":"Ruby","name":"github-services","owner":"github","has_issues":true,"description":"Official GitHub Services Integration - You can set these up in your repo admin screen under Service Hooks"},{"watchers":154,"has_downloads":false,"organization":"github","homepage":"http://help.github.com","pushed_at":"2011/06/07 09:55:45 -0700","created_at":"2010/05/17 00:25:56 -0700","master_branch":"gh-pages","fork":false,"has_wiki":false,"open_issues":8,"url":"https://github.com/github/help.github.com","forks":107,"size":424,"private":false,"language":"JavaScript","name":"help.github.com","owner":"github","has_issues":false,"description":"GitHub help guides"},{"watchers":1,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/08/24 12:41:38 -0700","created_at":"2010/08/24 12:16:26 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/project","forks":1,"size":296,"private":false,"language":"Ruby","name":"project","owner":"github","has_issues":false,"description":"test project for tutorial"},{"watchers":8,"has_downloads":true,"organization":"github","homepage":"http://git-scm.com","pushed_at":"2010/12/13 15:34:29 -0800","created_at":"2010/10/14 15:25:49 -0700","master_branch":"dup-post-receive-refs","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/git","forks":0,"size":292,"private":false,"language":"C","name":"git","owner":"github","has_issues":false,"description":"Git Source Code Mirror"},{"watchers":6,"has_downloads":true,"organization":"github","homepage":"http://rubyonrails.org","pushed_at":"2011/02/16 02:11:39 -0800","created_at":"2010/10/15 17:01:48 -0700","master_branch":"github","fork":true,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/rails","forks":1,"size":460,"private":false,"language":"Ruby","name":"rails","owner":"github","has_issues":false,"integrate_branch":"master","description":"Ruby on Rails + GitHub patches"},{"watchers":2132,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/04/29 02:06:53 -0700","created_at":"2010/11/08 12:17:14 -0800","fork":false,"has_wiki":false,"open_issues":22,"url":"https://github.com/github/gitignore","forks":268,"size":520,"private":false,"name":"gitignore","owner":"github","has_issues":false,"description":"A collection of useful .gitignore templates"},{"watchers":2,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2010/11/17 18:25:38 -0800","created_at":"2010/11/17 18:06:38 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/testrepo","forks":3,"size":168,"private":false,"language":"C","name":"testrepo","owner":"github","has_issues":false,"description":"my test repo (used for nodeload tests)"},{"watchers":406,"has_downloads":true,"organization":"github","homepage":"http://help.github.com/dmca","pushed_at":"2011/06/07 16:24:20 -0700","created_at":"2011/01/28 15:58:38 -0800","fork":false,"has_wiki":false,"open_issues":0,"url":"https://github.com/github/dmca","forks":8,"size":148,"private":false,"name":"dmca","owner":"github","has_issues":false,"description":"DMCA takedowns GitHub has received"},{"watchers":3,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/02/19 17:38:14 -0800","created_at":"2011/02/19 17:37:40 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/pong","forks":1,"size":108,"private":false,"name":"pong","owner":"github","has_issues":true,"description":"Auxiliary repository for external ping checks"},{"watchers":484,"has_downloads":true,"organization":"github","homepage":"https://github.com/blog/799-win-a-ticket-to-pycon-us-2011","pushed_at":"2011/02/24 13:04:06 -0800","created_at":"2011/02/21 12:28:39 -0800","fork":false,"has_wiki":false,"open_issues":3,"url":"https://github.com/github/pycon2011","forks":271,"size":172,"private":false,"language":"Python","name":"pycon2011","owner":"github","has_issues":false,"description":"Fork me to win a ticket to PyCon 2011!"},{"watchers":39,"has_downloads":true,"organization":"github","homepage":"","pushed_at":"2011/03/17 00:28:10 -0700","created_at":"2011/02/22 18:13:11 -0800","fork":false,"has_wiki":true,"open_issues":0,"url":"https://github.com/github/email_reply_parser","forks":3,"size":844,"private":false,"language":"Ruby","name":"email_reply_parser","owner":"github","has_issues":true,"description":""},{"watchers":14,"has_downloads":true,"organization":"github","homepage":"http://developer.github.com","pushed_at":"2011/06/07 12:03:35 -0700","created_at":"2011/04/26 12:20:56 -0700","fork":false,"has_wiki":true,"open_issues":2,"url":"https://github.com/github/developer.github.com","forks":4,"size":220,"private":false,"language":"Ruby","name":"developer.github.com","owner":"github","has_issues":true,"description":"GitHub API documentation"}]} \ No newline at end of file +{"repositories":[{"description":"Media files for use in your GitHub integration projects","forks":7,"pushed_at":"2011/08/19 12:52:33 -0700","has_downloads":true,"created_at":"2008/03/09 15:43:49 -0700","organization":"github","homepage":"https://github.com/","watchers":67,"fork":false,"has_wiki":false,"size":132,"private":false,"open_issues":0,"name":"media","url":"https://github.com/github/media","owner":"github","has_issues":false},{"description":"Ruby wrapper for the Pygments syntax highlighter.","forks":19,"pushed_at":"2011/07/20 07:47:19 -0700","has_downloads":false,"created_at":"2008/05/10 21:45:03 -0700","organization":"github","homepage":"","watchers":150,"fork":false,"language":"Ruby","has_wiki":false,"size":136,"private":false,"open_issues":1,"name":"albino","url":"https://github.com/github/albino","owner":"github","has_issues":true},{"description":"Ruby and Rails core extensions used by GitHub.","forks":10,"pushed_at":"2008/05/10 21:52:00 -0700","has_downloads":false,"created_at":"2008/05/10 21:45:18 -0700","organization":"github","homepage":"","watchers":45,"fork":false,"language":"Ruby","has_wiki":false,"size":0,"private":false,"open_issues":1,"name":"hubahuba","url":"https://github.com/github/hubahuba","owner":"github","has_issues":true},{"description":"jQuery hotkeys plugin.","forks":7,"pushed_at":"2008/05/10 21:52:22 -0700","has_downloads":false,"created_at":"2008/05/10 21:45:31 -0700","organization":"github","homepage":"","watchers":55,"fork":false,"has_wiki":false,"size":0,"private":false,"open_issues":0,"name":"jquery-hotkeys","url":"https://github.com/github/jquery-hotkeys","owner":"github","has_issues":true},{"description":"jQuery version of technoweenie's relative date js library.","forks":10,"pushed_at":"2008/05/10 21:52:38 -0700","has_downloads":false,"created_at":"2008/05/10 21:45:52 -0700","organization":"github","homepage":"","watchers":79,"fork":false,"has_wiki":false,"size":0,"private":false,"open_issues":2,"name":"jquery-relatize_date","url":"https://github.com/github/jquery-relatize_date","owner":"github","has_issues":true},{"description":"Simple Rails request timer with even simpler js bookmarklet.","forks":0,"pushed_at":"2008/12/30 13:04:00 -0800","has_downloads":true,"created_at":"2008/05/10 21:46:10 -0700","organization":"github","homepage":"","watchers":11,"fork":false,"language":"Ruby","has_wiki":true,"size":140,"private":false,"open_issues":0,"name":"request_timer","url":"https://github.com/github/request_timer","owner":"github","has_issues":true},{"description":"Evil twin plugin version of will_paginate to work with jQuery hotkeys plugin.","forks":1,"pushed_at":"2008/05/10 21:53:11 -0700","has_downloads":true,"created_at":"2008/05/10 21:46:27 -0700","organization":"github","homepage":"","watchers":27,"fork":false,"language":"Ruby","has_wiki":true,"size":0,"private":false,"open_issues":0,"name":"will_paginate_with_hotkeys","url":"https://github.com/github/will_paginate_with_hotkeys","owner":"github","has_issues":true},{"description":"The scripts used to build RubyGems on GitHub","forks":3,"pushed_at":"2008/11/03 20:54:57 -0800","has_downloads":true,"created_at":"2008/10/24 15:29:32 -0700","organization":"github","homepage":"","watchers":26,"fork":false,"language":"Ruby","has_wiki":true,"size":76,"private":false,"open_issues":0,"name":"gem-builder","url":"https://github.com/github/gem-builder","owner":"github","has_issues":true},{"description":"GitHub's safe gem eval web service","forks":0,"pushed_at":"2009/04/08 17:36:30 -0700","has_downloads":true,"created_at":"2009/02/10 19:56:17 -0800","organization":"github","homepage":"","watchers":5,"fork":false,"language":"Ruby","has_wiki":true,"size":1024,"private":false,"open_issues":0,"name":"safegem","url":"https://github.com/github/safegem","owner":"github","has_issues":true},{"description":"API Documentation for GitHub","forks":50,"pushed_at":"2011/08/22 19:07:27 -0700","has_downloads":false,"created_at":"2009/02/17 15:51:23 -0800","organization":"github","homepage":"http://develop.github.com","watchers":147,"fork":false,"language":"JavaScript","has_wiki":false,"size":292,"private":false,"open_issues":38,"name":"develop.github.com","url":"https://github.com/github/develop.github.com","owner":"github","has_issues":true,"master_branch":"gh-pages"},{"description":"","forks":18,"pushed_at":"2011/08/10 13:56:42 -0700","has_downloads":true,"created_at":"2009/04/10 16:01:43 -0700","organization":"github","homepage":"http://github.github.com/github-flavored-markdown/","watchers":88,"fork":false,"language":"JavaScript","has_wiki":true,"size":272,"private":false,"open_issues":21,"name":"github-flavored-markdown","url":"https://github.com/github/github-flavored-markdown","owner":"github","has_issues":true,"master_branch":"gh-pages"},{"description":"The code we use to render README.your_favorite_markup","forks":84,"pushed_at":"2011/08/24 02:41:45 -0700","has_downloads":false,"created_at":"2009/10/30 18:02:46 -0700","organization":"github","homepage":"","watchers":373,"fork":false,"language":"Python","has_wiki":false,"size":500,"private":false,"open_issues":51,"name":"markup","url":"https://github.com/github/markup","owner":"github","has_issues":true},{"description":"A simple, Git-powered wiki with a sweet API and local frontend.","forks":152,"pushed_at":"2011/08/08 15:46:02 -0700","has_downloads":true,"created_at":"2010/03/29 11:30:53 -0700","organization":"github","homepage":"","watchers":1366,"fork":false,"language":"JavaScript","has_wiki":true,"size":608,"private":false,"open_issues":96,"name":"gollum","url":"https://github.com/github/gollum","owner":"github","has_issues":true},{"description":"Script to upload files to non-repo storage from the command line","forks":6,"pushed_at":"2010/08/01 01:04:46 -0700","has_downloads":true,"created_at":"2010/04/02 21:50:46 -0700","organization":"github","homepage":"","watchers":26,"fork":false,"language":"Ruby","has_wiki":true,"size":276,"private":false,"open_issues":2,"name":"upload","url":"https://github.com/github/upload","owner":"github","has_issues":true},{"description":"Official GitHub Services Integration - You can set these up in your repo admin screen under Service Hooks","forks":358,"pushed_at":"2011/08/24 08:01:45 -0700","has_downloads":false,"created_at":"2010/05/14 13:07:36 -0700","organization":"github","homepage":"http://github.com/blog/53-github-services-ipo","watchers":428,"fork":false,"language":"Ruby","has_wiki":false,"size":1028,"private":false,"open_issues":23,"name":"github-services","url":"https://github.com/github/github-services","owner":"github","has_issues":true},{"description":"GitHub help guides","forks":153,"pushed_at":"2011/08/22 19:52:54 -0700","has_downloads":false,"created_at":"2010/05/17 00:25:56 -0700","organization":"github","homepage":"http://help.github.com","watchers":234,"fork":false,"language":"JavaScript","has_wiki":false,"size":696,"private":false,"open_issues":16,"name":"help.github.com","url":"https://github.com/github/help.github.com","owner":"github","has_issues":false,"master_branch":"gh-pages"},{"description":"test project for tutorial","forks":1,"pushed_at":"2010/08/24 12:41:38 -0700","has_downloads":true,"created_at":"2010/08/24 12:16:26 -0700","organization":"github","homepage":"","watchers":1,"fork":true,"language":"Ruby","has_wiki":true,"size":296,"private":false,"open_issues":0,"name":"project","url":"https://github.com/github/project","owner":"github","has_issues":false},{"description":"Git Source Code Mirror","forks":1,"pushed_at":"2011/08/16 16:59:50 -0700","has_downloads":true,"created_at":"2010/10/14 15:25:49 -0700","organization":"github","homepage":"http://git-scm.com","watchers":10,"fork":true,"language":"C","has_wiki":true,"size":212,"private":false,"open_issues":0,"name":"git","url":"https://github.com/github/git","owner":"github","has_issues":false,"master_branch":"dup-post-receive-refs"},{"description":"Ruby on Rails + GitHub patches","forks":2,"pushed_at":"2011/02/16 02:11:39 -0800","has_downloads":true,"created_at":"2010/10/15 17:01:48 -0700","organization":"github","homepage":"http://rubyonrails.org","watchers":8,"fork":true,"language":"Ruby","has_wiki":false,"size":460,"private":false,"open_issues":0,"name":"rails","url":"https://github.com/github/rails","owner":"github","has_issues":false,"integrate_branch":"master","master_branch":"github"},{"description":"A collection of useful .gitignore templates","forks":336,"pushed_at":"2011/08/20 09:38:11 -0700","has_downloads":true,"created_at":"2010/11/08 12:17:14 -0800","organization":"github","homepage":"","watchers":2630,"fork":false,"has_wiki":false,"size":520,"private":false,"open_issues":47,"name":"gitignore","url":"https://github.com/github/gitignore","owner":"github","has_issues":false},{"description":"DMCA takedowns GitHub has received","forks":8,"pushed_at":"2011/07/03 12:25:15 -0700","has_downloads":true,"created_at":"2011/01/28 15:58:38 -0800","organization":"github","homepage":"http://help.github.com/dmca","watchers":436,"fork":false,"has_wiki":false,"size":136,"private":false,"open_issues":0,"name":"dmca","url":"https://github.com/github/dmca","owner":"github","has_issues":false},{"description":"Auxiliary repository for external ping checks","forks":1,"pushed_at":"2011/02/19 17:38:14 -0800","has_downloads":true,"created_at":"2011/02/19 17:37:40 -0800","organization":"github","homepage":"","watchers":3,"fork":false,"has_wiki":true,"size":108,"private":false,"open_issues":0,"name":"pong","url":"https://github.com/github/pong","owner":"github","has_issues":true},{"description":"Fork me to win a ticket to PyCon 2011!","forks":233,"pushed_at":"2011/02/24 13:04:06 -0800","has_downloads":true,"created_at":"2011/02/21 12:28:39 -0800","organization":"github","homepage":"https://github.com/blog/799-win-a-ticket-to-pycon-us-2011","watchers":462,"fork":false,"language":"Python","has_wiki":false,"size":172,"private":false,"open_issues":3,"name":"pycon2011","url":"https://github.com/github/pycon2011","owner":"github","has_issues":false},{"description":"","forks":3,"pushed_at":"2011/08/23 16:18:47 -0700","has_downloads":true,"created_at":"2011/02/22 18:13:11 -0800","organization":"github","homepage":"","watchers":46,"fork":false,"language":"Ruby","has_wiki":true,"size":116,"private":false,"open_issues":0,"name":"email_reply_parser","url":"https://github.com/github/email_reply_parser","owner":"github","has_issues":true},{"description":"GitHub API documentation","forks":22,"pushed_at":"2011/08/22 20:06:11 -0700","has_downloads":true,"created_at":"2011/04/26 12:20:56 -0700","organization":"github","homepage":"http://developer.github.com","watchers":59,"fork":false,"language":"Ruby","has_wiki":true,"size":256,"private":false,"open_issues":14,"name":"developer.github.com","url":"https://github.com/github/developer.github.com","owner":"github","has_issues":true},{"description":"Language Savant","forks":61,"pushed_at":"2011/08/23 10:42:19 -0700","has_downloads":true,"created_at":"2011/05/09 15:53:13 -0700","organization":"github","homepage":"","watchers":552,"fork":false,"language":"JavaScript","has_wiki":false,"size":664,"private":false,"open_issues":0,"name":"linguist","url":"https://github.com/github/linguist","owner":"github","has_issues":true},{"description":"github terminal","forks":2,"pushed_at":"2011/07/06 21:18:47 -0700","has_downloads":true,"created_at":"2011/05/25 09:13:15 -0700","organization":"github","homepage":"https://ghterm.heroku.com","watchers":21,"fork":false,"language":"JavaScript","has_wiki":true,"size":192,"private":false,"open_issues":5,"name":"ghterm","url":"https://github.com/github/ghterm","owner":"github","has_issues":true},{"description":"DON'T DELETE THIS. USED FOR MONITORING AND WHATNOT.","forks":1,"pushed_at":"2011/06/23 13:36:23 -0700","has_downloads":true,"created_at":"2011/06/23 13:34:49 -0700","organization":"github","homepage":"","watchers":3,"fork":false,"has_wiki":true,"size":0,"private":false,"open_issues":0,"name":"testrepo","url":"https://github.com/github/testrepo","owner":"github","has_issues":true},{"description":"node.js client for Etsy'd StatsD server","forks":0,"pushed_at":"2011/08/02 20:04:55 -0700","has_downloads":true,"created_at":"2011/08/01 16:04:48 -0700","organization":"github","homepage":"","watchers":1,"fork":true,"language":"JavaScript","has_wiki":true,"size":112,"private":false,"open_issues":0,"name":"node-statsd","url":"https://github.com/github/node-statsd","owner":"github","has_issues":false},{"description":"A Ruby Statsd client that isn't a direct port of the Python example code. Because Ruby isn't Python.","forks":0,"pushed_at":"2011/08/10 09:29:51 -0700","has_downloads":true,"created_at":"2011/08/10 08:35:44 -0700","organization":"github","homepage":"","watchers":1,"fork":true,"language":"Ruby","has_wiki":false,"size":120,"private":false,"open_issues":0,"name":"statsd-ruby","url":"https://github.com/github/statsd-ruby","owner":"github","has_issues":false},{"description":"Grit gives you object oriented read/write access to Git repositories via Ruby.","forks":0,"pushed_at":"2011/08/19 22:50:44 -0700","has_downloads":true,"created_at":"2011/08/18 09:43:26 -0700","organization":"github","homepage":"http://grit.rubyforge.org/","watchers":2,"fork":true,"language":"Ruby","has_wiki":true,"size":120,"private":false,"open_issues":0,"name":"grit","url":"https://github.com/github/grit","owner":"github","has_issues":false}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 index 1bdbf22..cda75fa 100644 --- a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 +++ b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,39,599fd11f8dd1b224e0c640d3f70f34c8 @@ -1,14 +1,15 @@ status: 200 x-ratelimit-remaining: 57 content-location: https://github.com/api/v2/json/pulls/ask/python-github2/39 -x-runtime: 149ms -content-length: 12398 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 12222 +server: nginx/1.0.4 +x-runtime: 106ms x-ratelimit-limit: 60 -etag: "0226e420f8447aaca8f8eb4add9a6167" +etag: "6139ed3c079c5dc3080cedd92858edf7" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:45:25 GMT +date: Thu, 25 Aug 2011 06:55:51 GMT content-type: application/json; charset=utf-8 -{"pull":{"html_url":"https://github.com/ask/python-github2/pull/39","issue_updated_at":"2011-05-29T15:37:08Z","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"issue_user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","diff_url":"https://github.com/ask/python-github2/pull/39.diff","updated_at":"2011-06-07T13:56:50Z","created_at":"2011-04-30T12:37:40Z","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":false,"patch_url":"https://github.com/ask/python-github2/pull/39.patch","discussion":[{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/18 08:28:10 -0700","body":"The lack of timezone handling also exhibits itself for any consumers who use a timedelta to convert to local time for the duration of any gap between GitHub's switch to DST and their own. On the order of 2-4 weeks a year for regions that I personally care about ;)","updated_at":"2011/04/18 08:28:10 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1021613},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"6738adaf013cef84fb58d2aa755557e5358d122b"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"458c90b9f07c00c1a988d6f420130ee8bbf6503c","committed_date":"2011-04-30T03:03:06-07:00","authored_date":"2011-04-30T03:03:06-07:00","message":"Added feature spec for naive date handling.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"f2a5b3896a543e1b0f3381d3c35c93d068e168fd"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"458c90b9f07c00c1a988d6f420130ee8bbf6503c"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"8cca6a3d9815f84f61d0435c6592685a95c303c5","committed_date":"2011-04-30T03:06:07-07:00","authored_date":"2011-04-30T03:06:07-07:00","message":"Added feature spec for timezone-aware date handling.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"152153130dce24262d76b40286bd88a5ce3141fd"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"8cca6a3d9815f84f61d0435c6592685a95c303c5"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"ced596c31261c89a16df9b818836ff4e63022939","committed_date":"2011-04-30T03:07:35-07:00","authored_date":"2011-04-30T03:07:35-07:00","message":"Added step definitions for date handling support.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"04616bd15ea48dc3ab786e7edfb594c0856be38f"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"ced596c31261c89a16df9b818836ff4e63022939"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"0ca5486e583a3220cd3702f8520a8664f7969b57","committed_date":"2011-04-30T03:19:32-07:00","authored_date":"2011-04-30T03:19:32-07:00","message":"Added naive datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"bc78b38d34d87c3489fa296bc83462d060fa1aaf"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"0ca5486e583a3220cd3702f8520a8664f7969b57"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"fb70d0ada52ece6b0a345c203ac0a488e80acd21","committed_date":"2011-04-30T03:21:36-07:00","authored_date":"2011-04-30T03:21:36-07:00","message":"Added timezone-aware datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"02f98c58ea4acdbcd32e5813c8ceda57d956d545"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"fb70d0ada52ece6b0a345c203ac0a488e80acd21"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"8a7d44bf92c082312280d4e86c47aeee6d570e25","committed_date":"2011-04-30T03:27:30-07:00","authored_date":"2011-04-30T03:27:30-07:00","message":"Document core.NAIVE.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"141c8f0f37f9a3cb1a545c809806fec41e8ceeb7"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"8a7d44bf92c082312280d4e86c47aeee6d570e25"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"db2ac5452e81fb691b99aa307b3b0b25b2e729ff","committed_date":"2011-04-30T03:30:36-07:00","authored_date":"2011-04-30T03:30:36-07:00","message":"Added python-dateutil to requirements.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"bcd8843e10e8c4a4b8ee982476f371dc0764ea8e"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"db2ac5452e81fb691b99aa307b3b0b25b2e729ff"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"b3e405b246fd15ced629a12ec19ad5a282e2bfd9","committed_date":"2011-04-30T04:23:16-07:00","authored_date":"2011-04-30T04:23:00-07:00","message":"Require python-dateutil lower than v2.0.\n\nv2.0 only works with Python 3.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"b73cbceb5b54f99aec6e45e76e11ef95d292d8db"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"b3e405b246fd15ced629a12ec19ad5a282e2bfd9"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"a2c2b287f7863109c83636542c699d509e6c485f","committed_date":"2011-04-30T04:24:20-07:00","authored_date":"2011-04-30T04:24:20-07:00","message":"Run lettuce tests with tox.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"27c5c5bcc58b572e9c186caeddfa2b5166fd568b"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"a2c2b287f7863109c83636542c699d509e6c485f"}],"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1","committed_date":"2011-04-30T04:31:45-07:00","authored_date":"2011-04-30T04:31:43-07:00","message":"Don't run lettuce with Python 2.4.\n\nLooks like I've been running a patched version, and didn't realise Python 2.4\nwasn't supported upstream.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"299dca4efab1cc0d76ee30f2335258ace888fc5c"},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/30 05:41:09 -0700","body":"First-run implementation of option 3 from above. Works, but needs some refactoring.","updated_at":"2011/04/30 05:41:58 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1080583},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/05/29 08:37:08 -0700","body":"With the [pull request merge](https://github.com/ask/python-github2/pull/28) there is a new issue of handling timezones because pull requests don't use the \"GitHub timezone\".","updated_at":"2011/05/29 08:37:08 -0700","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"id":1257226}],"issue_created_at":"2011-04-18T15:25:47Z","labels":[],"head":{"label":"JNRowe:timezone_support","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"ref":"timezone_support","repository":{"watchers":3,"has_downloads":true,"homepage":"","pushed_at":"2011/06/06 16:14:48 -0700","created_at":"2010/10/31 01:03:09 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"language":"Python","name":"python-github2","owner":"JNRowe","has_issues":false,"description":"github client in python, with issues support."},"sha":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1"},"state":"open"}} \ No newline at end of file +{"pull":{"issue_updated_at":"2011-06-23T09:33:57Z","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"html_url":"https://github.com/ask/python-github2/pull/39","mergeable":true,"created_at":"2011-06-20T16:51:24Z","comments":4,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","diff_url":"https://github.com/ask/python-github2/pull/39.diff","head":{"sha":"5438e41d9c390f53089ed3fa0842831fafc73d8e","label":"ask:5438e41d9c390f53089ed3fa0842831fafc73d8e","repository":{"description":"github client in python, with issues support.","forks":55,"pushed_at":"2011/08/15 13:20:40 -0700","has_downloads":true,"created_at":"2009/04/18 08:31:12 -0700","homepage":"http://packages.python.org/github2","watchers":149,"fork":false,"language":"Python","has_wiki":true,"size":476,"private":false,"open_issues":4,"name":"python-github2","url":"https://github.com/ask/python-github2","owner":"ask","has_issues":true},"user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"5438e41d9c390f53089ed3fa0842831fafc73d8e"},"issue_user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"base":{"sha":"0786a96c80afad7bbd0747df590f649eaa46ca04","label":"ask:master","repository":{"description":"github client in python, with issues support.","forks":55,"pushed_at":"2011/08/15 13:20:40 -0700","has_downloads":true,"created_at":"2009/04/18 08:31:12 -0700","homepage":"http://packages.python.org/github2","watchers":149,"fork":false,"language":"Python","has_wiki":true,"size":476,"private":false,"open_issues":4,"name":"python-github2","url":"https://github.com/ask/python-github2","owner":"ask","has_issues":true},"user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master"},"patch_url":"https://github.com/ask/python-github2/pull/39.patch","discussion":[{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/18 08:28:10 -0700","body":"The lack of timezone handling also exhibits itself for any consumers who use a timedelta to convert to local time for the duration of any gap between GitHub's switch to DST and their own. On the order of 2-4 weeks a year for regions that I personally care about ;)","updated_at":"2011/04/18 08:28:10 -0700","id":1021613,"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"}},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/04/30 05:41:09 -0700","body":"First-run implementation of option 3 from above. Works, but needs some refactoring.","updated_at":"2011/04/30 05:41:58 -0700","id":1080583,"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"}},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/05/29 08:37:08 -0700","body":"With the [pull request merge](https://github.com/ask/python-github2/pull/28) there is a new issue of handling timezones because pull requests don't use the \"GitHub timezone\".","updated_at":"2011/05/29 08:37:08 -0700","id":1257226,"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"}},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"d5d2e0e86d67d29e47e8d6761deeed07e9780f44"}],"id":"bf35a12199ae8431bf321fa6e4ee6e596b5137ba","committed_date":"2011-06-12T18:41:43-07:00","authored_date":"2011-04-30T03:19:32-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Added naive datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"ea8747e3cb0c4e375e8b1a5ad594bc8fbaf5ba44"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"bf35a12199ae8431bf321fa6e4ee6e596b5137ba"}],"id":"5019b5f0dd27619bfc99162637d709dc1a5e32e6","committed_date":"2011-06-12T19:02:40-07:00","authored_date":"2011-04-30T03:21:36-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Added timezone-aware datetime implementation.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"64682f561d53986ff30d422d3862b65cb28c858a"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"69676d331f6a0b38eb373dbf6026a60dbac44c41"}],"id":"a6ec7be62110eab205f23a799a78e05b821b51ca","committed_date":"2011-06-12T19:02:41-07:00","authored_date":"2011-04-30T04:23:00-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Require python-dateutil lower than v2.0.\n\nv2.0 only works with Python 3.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"d8a4ed6f73e6c96775f4bee61a7527ef5d080d7e"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"5019b5f0dd27619bfc99162637d709dc1a5e32e6"}],"id":"606db7c1d930c111d5766f21c49e8d66f1faf353","committed_date":"2011-06-12T19:02:41-07:00","authored_date":"2011-04-30T03:27:30-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Document core.NAIVE.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"666b5a96a8efc5f2b1e71427d0a10167d529e859"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"606db7c1d930c111d5766f21c49e8d66f1faf353"}],"id":"69676d331f6a0b38eb373dbf6026a60dbac44c41","committed_date":"2011-06-12T19:02:41-07:00","authored_date":"2011-04-30T03:30:36-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Added python-dateutil to requirements.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"6c35929758727315b0896dd6dc0c2a52a9638361"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"a6ec7be62110eab205f23a799a78e05b821b51ca"}],"id":"1b8ceff9d9787e61b0c562109bc5f977b0fe2b07","committed_date":"2011-06-12T19:04:57-07:00","authored_date":"2011-06-12T19:02:14-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Added tests for timezone-aware datetimes.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"cc1667b0b89fe21b4e8032bcaee864d2775918ee"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"1b8ceff9d9787e61b0c562109bc5f977b0fe2b07"}],"id":"69e7bc54160de7ee2534e6dc57331724678afcf2","committed_date":"2011-06-12T19:16:50-07:00","authored_date":"2011-06-12T19:15:02-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Refactoring of datetime parsing.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"39f2d9a7ceeb6ca25d95758fff8f0c4119c5e17b"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"69e7bc54160de7ee2534e6dc57331724678afcf2"}],"id":"6e91ec332f144ede1bebdbac12f0eb7d8e37b802","committed_date":"2011-06-12T19:27:53-07:00","authored_date":"2011-06-12T19:26:45-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Remove duplicate timezone mangling in datetime handling.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"54765bb6953d64b02117e2a041e9fc2910e67680"},{"type":"Commit","author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"parents":[{"id":"6e91ec332f144ede1bebdbac12f0eb7d8e37b802"}],"id":"5438e41d9c390f53089ed3fa0842831fafc73d8e","committed_date":"2011-06-12T19:39:16-07:00","authored_date":"2011-06-12T19:39:16-07:00","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"message":"Document core.GITHUB_TZ.","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"tree":"839e75243afd3707e0060b96a188a41e92a14bd9"},{"type":"IssueComment","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","created_at":"2011/06/20 09:53:42 -0700","body":"The mostly new commits now listed in this pull request(`JNRowe/python-github2 feat/timezone_support`) are what I'm planning to merge RSN.","updated_at":"2011/06/20 09:53:42 -0700","id":1404012,"user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"}}],"closed_at":"2011-06-23T09:33:57Z","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"updated_at":"2011-06-23T09:28:42Z","issue_created_at":"2011-04-18T15:25:47Z","labels":[],"state":"closed"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 index e9dc3d0..4b68b12 100644 --- a/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 +++ b/tests/data/github.com,api,v2,json,pulls,ask,python-github2,open,80fdb1a6835888c7811257428c93eef4 @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 58 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/pulls/ask/python-github2/open -x-runtime: 44ms -content-length: 6535 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 2644 +server: nginx/1.0.4 +x-runtime: 37ms x-ratelimit-limit: 60 -etag: "e579ac09b626d198c687da824b39edc2" +etag: "a210795488a95b7c56c4c42cb4467065" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:44:58 GMT +date: Thu, 25 Aug 2011 06:56:02 GMT content-type: application/json; charset=utf-8 -{"pulls":[{"html_url":"https://github.com/ask/python-github2/pull/39","issue_updated_at":"2011-05-29T15:37:08Z","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","position":39.0,"number":39,"votes":0,"issue_user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"comments":3,"body":"\nFeeble brainstorming session...\n\nI've just been bitten quite badly by the lack of timezone handling, the cause is the use of naive datetime objects in the 'GitHub' timezone(`America/Los_Angeles`). While processing some tasks that span the PST/PDT changeover the ordering of events is broken.\n\nOptions are:\n\n1. Leave alone and try to process the datetime objects externally, somewhat easy but not a good solution as it requires duplication in each project that requires accurate date handling\n2. Start producing non-naive datetime objects, breaks any caller who is not prepared for it.\n3. Introduce a setting to toggle naive object availability, defaulting to naive objects to maintain backwards compatibility\n\n[python-dateutil](http://labix.org/python-dateutil) makes handling option 1 quite easy, and also simplifies the handling of option 3 at the cost of another external dependency. Option 2 is just pure evil, or pure stupidity depending on point of view.\n\nOption 3 results in a parsing using something like the following entirely untested code:\n\n datetime_ = parser.parse(github_date)\n if NAIVE:\n datetime_.replace(tzinfo=None)\n return datetime_\n\nAnd similarly producing GitHub compatible date strings would require handling of naive formats with equally untested code such as:\n\n if NAIVE:\n datetime_ = datetime_.replace(tz.gettz(\"America/Los_Angeles\"))\n return datetime_.strftime(\"%Y/%m/%d %H:%M:%S %z\")","title":"Datetime timezone handling.","diff_url":"https://github.com/ask/python-github2/pull/39.diff","updated_at":"2011-06-07T13:56:50Z","created_at":"2011-04-30T12:37:40Z","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":false,"patch_url":"https://github.com/ask/python-github2/pull/39.patch","issue_created_at":"2011-04-18T15:25:47Z","labels":[],"head":{"label":"JNRowe:timezone_support","user":{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},"ref":"timezone_support","repository":{"watchers":3,"has_downloads":true,"homepage":"","pushed_at":"2011/06/06 16:14:48 -0700","created_at":"2010/10/31 01:03:09 -0700","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"language":"Python","name":"python-github2","owner":"JNRowe","has_issues":false,"description":"github client in python, with issues support."},"sha":"a31cfb70343d3ac9d6330e6328008c0bc690a5a1"},"state":"open"},{"html_url":"https://github.com/ask/python-github2/pull/24","issue_updated_at":"2011-01-05T00:26:07Z","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"issue_user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","diff_url":"https://github.com/ask/python-github2/pull/24.diff","updated_at":"2011-05-22T07:56:37Z","created_at":"2010-12-09T07:50:26Z","user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"base":{"label":"ask:master","user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master","repository":{"watchers":143,"has_downloads":true,"homepage":"http://packages.python.org/github2","pushed_at":"2011/06/06 16:15:04 -0700","created_at":"2009/04/18 08:31:12 -0700","fork":false,"has_wiki":true,"open_issues":5,"url":"https://github.com/ask/python-github2","forks":50,"size":112,"private":false,"language":"Python","name":"python-github2","owner":"ask","has_issues":true,"description":"github client in python, with issues support."},"sha":"6a79f43f174acd3953ced69263c06d311a6bda56"},"mergeable":null,"patch_url":"https://github.com/ask/python-github2/pull/24.patch","issue_created_at":"2010-12-09T07:50:26Z","labels":[],"head":{"label":"svetlyak40wt:master","user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"ref":"master","repository":{"watchers":1,"has_downloads":true,"homepage":"","pushed_at":"2011/01/04 16:32:23 -0800","created_at":"2010/12/08 10:39:12 -0800","fork":true,"has_wiki":true,"open_issues":0,"url":"https://github.com/svetlyak40wt/python-github2","forks":0,"size":176,"private":false,"name":"python-github2","owner":"svetlyak40wt","has_issues":false,"description":"github client in python, with issues support."},"sha":"f337f3c7b48e85dda72744f7696c693fe8d5fee0"},"state":"open"}]} \ No newline at end of file +{"pulls":[{"issue_updated_at":"2011-01-05T00:26:07Z","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","position":24.0,"number":24,"votes":0,"html_url":"https://github.com/ask/python-github2/pull/24","mergeable":null,"created_at":"2010-12-09T07:50:26Z","comments":11,"body":"Hi, I added an optional 'page' argument to receive not only last 35 commits, but all others too. Think, such approach could be useful for other list operations too.","title":"Pagination support for commits.","diff_url":"https://github.com/ask/python-github2/pull/24.diff","head":{"sha":"f337f3c7b48e85dda72744f7696c693fe8d5fee0","label":"svetlyak40wt:master","repository":{"description":"github client in python, with issues support.","forks":0,"pushed_at":"2011/01/04 16:32:23 -0800","has_downloads":true,"created_at":"2010/12/08 10:39:12 -0800","homepage":"","watchers":1,"fork":true,"has_wiki":true,"size":176,"private":false,"open_issues":0,"name":"python-github2","url":"https://github.com/svetlyak40wt/python-github2","owner":"svetlyak40wt","has_issues":false},"user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"ref":"master"},"issue_user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"base":{"sha":"6a79f43f174acd3953ced69263c06d311a6bda56","label":"ask:master","repository":{"description":"github client in python, with issues support.","forks":55,"pushed_at":"2011/08/15 13:20:40 -0700","has_downloads":true,"created_at":"2009/04/18 08:31:12 -0700","homepage":"http://packages.python.org/github2","watchers":149,"fork":false,"language":"Python","has_wiki":true,"size":476,"private":false,"open_issues":4,"name":"python-github2","url":"https://github.com/ask/python-github2","owner":"ask","has_issues":true},"user":{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},"ref":"master"},"patch_url":"https://github.com/ask/python-github2/pull/24.patch","user":{"name":"Alexander Artemenko","company":"Yandex","gravatar_id":"5b3558b0fd5ca9c08d9061a6e51b555a","location":"Moscow","blog":"http://dev.svetlyak.ru","type":"User","login":"svetlyak40wt","email":"github@svetlyak.ru"},"updated_at":"2011-05-22T07:56:37Z","issue_created_at":"2010-12-09T07:50:26Z","labels":[],"state":"open"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 b/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 index 8ada865..1986340 100644 --- a/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 +++ b/tests/data/github.com,api,v2,json,repos,search,surfraw,ef28b342b173c62c8b892fffb6509c84 @@ -1,14 +1,15 @@ status: 200 x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/repos/search/surfraw -x-runtime: 160ms -content-length: 4419 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 4418 +server: nginx/1.0.4 +x-runtime: 236ms x-ratelimit-limit: 60 -etag: "4caafca018e434384ec7081baae373c8" +etag: "be8fa2627c87a9ed0c21f0f0e4636cff" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:37:04 GMT +date: Thu, 25 Aug 2011 06:58:39 GMT content-type: application/json; charset=utf-8 -{"repositories":[{"type":"repo","watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"followers":3,"url":"https://github.com/JNRowe/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/06/01 01:36:06 -0700","username":"JNRowe","pushed":"2011/06/01 01:36:06 -0700","fork":false,"size":4716,"has_downloads":true,"language":"PHP","score":6.5386825,"name":"surfraw","forks":1,"created":"2010/01/26 03:49:55 -0800","description":"Mirror of the upstream git repository","private":false,"created_at":"2010/01/26 03:49:55 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"sykora","open_issues":0,"followers":1,"url":"https://github.com/sykora/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"username":"sykora","pushed":null,"language":"","fork":false,"size":0,"has_downloads":true,"score":14.106668,"name":"surfraw","forks":1,"created":"2009/11/13 06:00:42 -0800","description":"A fork of surfraw, and my attempts at adding new elvi.","private":false,"created_at":"2009/11/13 06:00:42 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"gnufs","open_issues":0,"followers":1,"url":"https://github.com/gnufs/surfraw-elvis","homepage":"","has_issues":true,"pushed_at":"2010/10/11 19:57:51 -0700","username":"gnufs","pushed":"2010/10/11 19:57:51 -0700","language":"","fork":false,"size":256,"has_downloads":true,"score":8.397954,"name":"surfraw-elvis","forks":1,"created":"2010/10/11 19:50:26 -0700","description":"custom elvis for surfraw","private":false,"created_at":"2010/10/11 19:50:26 -0700"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"kisom","open_issues":0,"followers":1,"url":"https://github.com/kisom/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/01/12 10:32:09 -0800","username":"kisom","pushed":"2011/01/12 10:32:09 -0800","language":"","fork":false,"size":1364,"has_downloads":true,"score":14.259327,"name":"surfraw","forks":1,"created":"2011/01/02 21:37:38 -0800","description":"local changes to surfraw - local edits prior to sending updates to surfraw-devel","private":false,"created_at":"2011/01/02 21:37:38 -0800"},{"type":"repo","watchers":1,"has_wiki":false,"owner":"twinshadow","open_issues":0,"followers":1,"url":"https://github.com/twinshadow/Surfraw","homepage":"http://surfraw.alioth.debian.org","has_issues":true,"pushed_at":"2011/02/20 02:52:58 -0800","username":"twinshadow","pushed":"2011/02/20 02:52:58 -0800","language":"","fork":false,"size":720,"has_downloads":true,"score":6.5386825,"name":"Surfraw","forks":1,"created":"2011/01/23 19:03:21 -0800","description":"Shell Users' Revolutionary Front Rage Against the Web","private":false,"created_at":"2011/01/23 19:03:21 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"twinshadow","open_issues":0,"followers":1,"url":"https://github.com/twinshadow/surfraw-elvi","homepage":"","has_issues":true,"pushed_at":"2011/02/24 15:59:30 -0800","username":"twinshadow","pushed":"2011/02/24 15:59:30 -0800","language":"","fork":false,"size":196,"has_downloads":true,"score":8.1655445,"name":"surfraw-elvi","forks":1,"created":"2011/02/24 15:58:58 -0800","description":"Twinshadow's personal collection of Elvi for Surfraw","private":false,"created_at":"2011/02/24 15:58:58 -0800"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"gnufs","open_issues":0,"followers":1,"url":"https://github.com/gnufs/rawdog-config-aligunduz.org","homepage":"http://aligunduz.org/planet","has_issues":true,"pushed_at":"2011/04/01 04:57:22 -0700","username":"gnufs","pushed":"2011/04/01 04:57:22 -0700","language":"","fork":false,"size":296,"has_downloads":true,"score":0.7137631,"name":"rawdog-config-aligunduz.org","forks":1,"created":"2010/10/11 20:22:39 -0700","description":"Surfraw configuration of \"Ali's Hive Mind\" on http://aligunduz.org/planet","private":false,"created_at":"2010/10/11 20:22:39 -0700"},{"type":"repo","watchers":1,"has_wiki":true,"owner":"xabbu42","open_issues":0,"followers":1,"url":"https://github.com/xabbu42/psr","homepage":"","has_issues":true,"pushed_at":"2011/04/04 02:52:28 -0700","username":"xabbu42","pushed":"2011/04/04 02:52:28 -0700","language":"","fork":false,"size":730,"has_downloads":true,"score":1.0623765,"name":"psr","forks":1,"created":"2011/01/20 18:00:47 -0800","description":"perl surfraw like script","private":false,"created_at":"2011/01/20 18:00:47 -0800"}]} \ No newline at end of file +{"repositories":[{"type":"repo","description":"Mirror of the upstream git repository","username":"JNRowe","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2010/01/26 03:49:55 -0800","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/08/23 13:23:14 -0700","watchers":3,"fork":false,"language":"Shell","score":6.625599,"followers":3,"size":4876,"private":false,"name":"surfraw","url":"https://github.com/JNRowe/surfraw","owner":"JNRowe","has_downloads":true,"pushed":"2011/08/23 13:23:14 -0700","created":"2010/01/26 03:49:55 -0800"},{"type":"repo","description":"A fork of surfraw, and my attempts at adding new elvi.","username":"sykora","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2009/11/13 06:00:42 -0800","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"language":"","watchers":1,"fork":false,"score":14.336326,"followers":1,"size":0,"private":false,"name":"surfraw","url":"https://github.com/sykora/surfraw","owner":"sykora","has_downloads":true,"pushed":null,"created":"2009/11/13 06:00:42 -0800"},{"type":"repo","description":"custom elvis for surfraw","username":"gnufs","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2010/10/11 19:50:26 -0700","homepage":"","has_issues":true,"pushed_at":"2010/10/11 19:57:51 -0700","language":"","watchers":1,"fork":false,"score":8.581445,"followers":1,"size":256,"private":false,"name":"surfraw-elvis","url":"https://github.com/gnufs/surfraw-elvis","owner":"gnufs","has_downloads":true,"pushed":"2010/10/11 19:57:51 -0700","created":"2010/10/11 19:50:26 -0700"},{"type":"repo","description":"local changes to surfraw - local edits prior to sending updates to surfraw-devel","username":"kisom","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2011/01/02 21:37:38 -0800","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/01/12 10:32:09 -0800","language":"","watchers":1,"fork":false,"score":14.496914,"followers":1,"size":1364,"private":false,"name":"surfraw","url":"https://github.com/kisom/surfraw","owner":"kisom","has_downloads":true,"pushed":"2011/01/12 10:32:09 -0800","created":"2011/01/02 21:37:38 -0800"},{"type":"repo","description":"Shell Users' Revolutionary Front Rage Against the Web","username":"twinshadow","forks":1,"has_wiki":false,"open_issues":0,"created_at":"2011/01/23 19:03:21 -0800","homepage":"http://surfraw.alioth.debian.org","has_issues":true,"pushed_at":"2011/02/20 02:52:58 -0800","language":"","watchers":1,"fork":false,"score":6.625599,"followers":1,"size":720,"private":false,"name":"Surfraw","url":"https://github.com/twinshadow/Surfraw","owner":"twinshadow","has_downloads":true,"pushed":"2011/02/20 02:52:58 -0800","created":"2011/01/23 19:03:21 -0800"},{"type":"repo","description":"Twinshadow's personal collection of Elvi for Surfraw","username":"twinshadow","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2011/02/24 15:58:58 -0800","homepage":"","has_issues":true,"pushed_at":"2011/02/24 15:59:30 -0800","language":"","watchers":1,"fork":false,"score":8.336964,"followers":1,"size":196,"private":false,"name":"surfraw-elvi","url":"https://github.com/twinshadow/surfraw-elvi","owner":"twinshadow","has_downloads":true,"pushed":"2011/02/24 15:59:30 -0800","created":"2011/02/24 15:58:58 -0800"},{"type":"repo","description":"Surfraw configuration of \"Ali's Hive Mind\" on http://aligunduz.org/planet","username":"gnufs","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2010/10/11 20:22:39 -0700","homepage":"http://aligunduz.org/planet","has_issues":true,"pushed_at":"2011/04/01 04:57:22 -0700","language":"","watchers":1,"fork":false,"score":0.7484778,"followers":1,"size":296,"private":false,"name":"rawdog-config-aligunduz.org","url":"https://github.com/gnufs/rawdog-config-aligunduz.org","owner":"gnufs","has_downloads":true,"pushed":"2011/04/01 04:57:22 -0700","created":"2010/10/11 20:22:39 -0700"},{"type":"repo","description":"perl surfraw like script","username":"xabbu42","forks":1,"has_wiki":true,"open_issues":0,"created_at":"2011/01/20 18:00:47 -0800","homepage":"","has_issues":true,"pushed_at":"2011/04/04 02:52:28 -0700","language":"","watchers":1,"fork":false,"score":1.1151989,"followers":1,"size":730,"private":false,"name":"psr","url":"https://github.com/xabbu42/psr","owner":"xabbu42","has_downloads":true,"pushed":"2011/04/04 02:52:28 -0700","created":"2011/01/20 18:00:47 -0800"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 b/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 index 5adfad3..172d08f 100644 --- a/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,46d0b95561c6d2a42dda0406e785c3e5 @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 58 +x-ratelimit-remaining: 57 content-location: https://github.com/api/v2/json/repos/show/JNRowe -x-runtime: 168ms -content-length: 18333 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 19919 +server: nginx/1.0.4 +x-runtime: 93ms x-ratelimit-limit: 60 -etag: "09af032c0d629f2a27fe5e008c2717d1" +etag: "2ec78256aa429d189bf68539ccabe795" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:37:59 GMT +date: Mon, 15 Aug 2011 19:59:28 GMT content-type: application/json; charset=utf-8 -{"repositories":[{"integrate_branch":"iratqq","watchers":3,"homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","has_downloads":true,"created_at":"2009/04/05 18:46:34 -0700","fork":false,"pushed_at":"2011/05/08 23:35:07 -0700","url":"https://github.com/JNRowe/bfm","forks":3,"size":232,"private":false,"has_wiki":true,"language":"C","name":"bfm","owner":"JNRowe","open_issues":0,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","has_issues":true},{"watchers":2,"homepage":"http://jnrowe.github.com/upoints/","has_downloads":true,"created_at":"2009/04/23 04:06:46 -0700","fork":false,"pushed_at":"2011/05/16 03:48:13 -0700","url":"https://github.com/JNRowe/upoints","forks":0,"size":3288,"private":false,"has_wiki":true,"language":"Python","name":"upoints","owner":"JNRowe","open_issues":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","has_issues":true},{"watchers":13,"homepage":"http://packages.python.org/pyisbn/","has_downloads":true,"created_at":"2009/04/23 04:07:25 -0700","fork":false,"pushed_at":"2011/06/06 07:04:57 -0700","url":"https://github.com/JNRowe/pyisbn","forks":2,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"pyisbn","owner":"JNRowe","open_issues":1,"description":"A Python module for working with 10- and 13-digit ISBNs","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/04/23 04:09:02 -0700","fork":false,"pushed_at":"2011/05/09 01:49:16 -0700","url":"https://github.com/JNRowe/pytemplate","forks":0,"size":2252,"private":false,"has_wiki":true,"language":"Python","name":"pytemplate","owner":"JNRowe","open_issues":0,"description":"Package template for Python, with distutils setup","has_issues":true},{"watchers":5,"homepage":"http://jnrowe.github.com/misc-overlay/","has_downloads":true,"created_at":"2009/05/02 07:32:50 -0700","fork":false,"pushed_at":"2011/06/07 17:00:59 -0700","url":"https://github.com/JNRowe/misc-overlay","forks":0,"size":11049,"private":false,"has_wiki":true,"language":"Python","name":"misc-overlay","owner":"JNRowe","open_issues":6,"description":"Gentoo overlay -- miscellaneous packages","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/fixes-overlay","has_downloads":false,"created_at":"2009/05/02 07:52:47 -0700","master_branch":"master","fork":false,"pushed_at":"2011/04/06 10:48:22 -0700","url":"https://github.com/JNRowe/fixes-overlay","forks":0,"size":3636,"private":false,"has_wiki":true,"language":"Python","name":"fixes-overlay","owner":"JNRowe","open_issues":0,"description":"Small package fixes languishing in the Gentoo BTS","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/05/08 04:18:15 -0700","fork":false,"pushed_at":"2010/05/02 19:21:40 -0700","url":"https://github.com/JNRowe/dotbash","forks":0,"size":1148,"private":false,"has_wiki":true,"name":"dotbash","owner":"JNRowe","open_issues":0,"description":"Shared bash configuration files","has_issues":true},{"watchers":2,"homepage":"http://jnrowe.github.com/","has_downloads":true,"created_at":"2009/05/14 06:43:16 -0700","master_branch":"master","fork":false,"pushed_at":"2011/06/06 07:10:57 -0700","url":"https://github.com/JNRowe/jnrowe.github.com","forks":0,"size":6272,"private":false,"has_wiki":false,"language":"JavaScript","name":"jnrowe.github.com","owner":"JNRowe","open_issues":0,"description":"My user pages repository","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/05/14 11:09:34 -0700","fork":false,"pushed_at":"2011/02/14 01:52:50 -0800","url":"https://github.com/JNRowe/local-bin","forks":0,"size":652,"private":false,"has_wiki":true,"language":"Python","name":"local-bin","owner":"JNRowe","open_issues":0,"description":"Tat from my ~/bin","has_issues":true},{"watchers":2,"homepage":"","has_downloads":true,"created_at":"2009/05/24 00:05:46 -0700","fork":true,"pushed_at":"2010/09/24 21:10:10 -0700","url":"https://github.com/JNRowe/termstyle","forks":1,"size":564,"private":false,"has_wiki":true,"name":"termstyle","owner":"JNRowe","open_issues":0,"description":"a dirt-simple terminal-colour library for python","has_issues":false},{"watchers":1,"homepage":"http://readyset.tigris.org/","has_downloads":true,"created_at":"2009/08/16 19:30:50 -0700","fork":false,"pushed_at":"2011/03/04 18:49:12 -0800","url":"https://github.com/JNRowe/readyset","forks":1,"size":3216,"private":false,"has_wiki":true,"language":"JavaScript","name":"readyset","owner":"JNRowe","open_issues":0,"description":"Ready-to-use Software Engineering Templates","has_issues":true},{"watchers":3,"homepage":"http://jnrowe.github.com/cupage","has_downloads":true,"created_at":"2009/09/17 21:03:02 -0700","fork":false,"pushed_at":"2011/05/24 23:07:45 -0700","url":"https://github.com/JNRowe/cupage","forks":1,"size":4948,"private":false,"has_wiki":true,"language":"Python","name":"cupage","owner":"JNRowe","open_issues":5,"description":"A tool to check for updates on web pages","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2009/09/24 18:42:48 -0700","fork":false,"pushed_at":"2011/02/28 05:02:24 -0800","url":"https://github.com/JNRowe/pages_layouts","forks":1,"size":1948,"private":false,"has_wiki":true,"name":"pages_layouts","owner":"JNRowe","open_issues":0,"description":"Shared layouts submodule for jekyll","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/bwatch/","has_downloads":true,"created_at":"2009/09/26 10:13:56 -0700","fork":false,"pushed_at":"2011/04/06 10:56:17 -0700","url":"https://github.com/JNRowe/bwatch","forks":1,"size":2248,"private":false,"has_wiki":true,"language":"Python","name":"bwatch","owner":"JNRowe","open_issues":2,"description":"Simple bandwidth watching tool","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/bleeter/","has_downloads":true,"created_at":"2009/10/14 22:19:25 -0700","fork":false,"pushed_at":"2011/05/15 08:07:47 -0700","url":"https://github.com/JNRowe/bleeter","forks":1,"size":3496,"private":false,"has_wiki":true,"language":"Python","name":"bleeter","owner":"JNRowe","open_issues":1,"description":"Nasty little twitter client","has_issues":true},{"watchers":1,"homepage":"","has_downloads":false,"created_at":"2009/10/28 13:13:46 -0700","master_branch":"master","fork":true,"pushed_at":"2011/05/26 02:55:49 -0700","url":"https://github.com/JNRowe/oh-my-zsh","forks":1,"size":416,"private":false,"has_wiki":false,"language":"Shell","name":"oh-my-zsh","owner":"JNRowe","open_issues":0,"description":"A community-driven framework for managing your zsh configuration.","has_issues":true},{"watchers":3,"homepage":"http://jnrowe.github.com/vim-configs","has_downloads":true,"created_at":"2009/11/12 06:10:53 -0800","fork":false,"pushed_at":"2011/05/30 08:42:41 -0700","url":"https://github.com/JNRowe/vim-configs","forks":1,"size":3616,"private":false,"has_wiki":true,"language":"VimL","name":"vim-configs","owner":"JNRowe","open_issues":2,"description":"Personal vim configs","has_issues":true},{"watchers":3,"homepage":"http://surfraw.alioth.debian.org/","has_downloads":true,"created_at":"2010/01/26 03:49:55 -0800","fork":false,"pushed_at":"2011/06/01 01:36:06 -0700","url":"https://github.com/JNRowe/surfraw","forks":1,"size":4716,"private":false,"has_wiki":true,"language":"PHP","name":"surfraw","owner":"JNRowe","open_issues":0,"description":"Mirror of the upstream git repository","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/blanco","has_downloads":true,"created_at":"2010/01/31 13:04:51 -0800","fork":false,"pushed_at":"2011/04/06 10:37:48 -0700","url":"https://github.com/JNRowe/blanco","forks":1,"size":4200,"private":false,"has_wiki":true,"language":"Python","name":"blanco","owner":"JNRowe","open_issues":1,"description":"Hey, remember me?","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/vim-jnrowe/","has_downloads":false,"created_at":"2010/02/11 17:12:11 -0800","fork":false,"pushed_at":"2011/04/14 04:05:52 -0700","url":"https://github.com/JNRowe/vim-jnrowe","forks":1,"size":936,"private":false,"has_wiki":true,"language":"VimL","name":"vim-jnrowe","owner":"JNRowe","open_issues":0,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2010/02/15 12:19:22 -0800","fork":false,"pushed_at":"2011/06/01 10:27:57 -0700","url":"https://github.com/JNRowe/emacs-configs","forks":1,"size":1604,"private":false,"has_wiki":true,"language":"Emacs Lisp","name":"emacs-configs","owner":"JNRowe","open_issues":0,"description":"Personal emacs configs","has_issues":true},{"watchers":1,"homepage":"http://joshthecoder.github.com/tweepy","has_downloads":true,"created_at":"2010/03/31 14:57:29 -0700","fork":true,"pushed_at":"2010/04/02 19:09:52 -0700","url":"https://github.com/JNRowe/tweepy","forks":1,"size":536,"private":false,"has_wiki":true,"name":"tweepy","owner":"JNRowe","open_issues":0,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","has_issues":true},{"watchers":1,"homepage":"www.vim.org/scripts/script.php?script_id=2540","has_downloads":false,"created_at":"2010/04/05 20:56:06 -0700","fork":true,"pushed_at":"2011/01/27 03:16:30 -0800","url":"https://github.com/JNRowe/snipmate.vim","forks":1,"size":248,"private":false,"has_wiki":false,"language":"VimL","name":"snipmate.vim","owner":"JNRowe","open_issues":0,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","has_issues":false},{"watchers":1,"homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","has_downloads":true,"created_at":"2010/05/05 00:54:23 -0700","fork":false,"pushed_at":"2010/05/05 00:55:01 -0700","url":"https://github.com/JNRowe/winwrangler","forks":1,"size":276,"private":false,"has_wiki":true,"name":"winwrangler","owner":"JNRowe","open_issues":0,"description":"Mirror of the upstream failpad source, converted for Matt","has_issues":true},{"watchers":1,"homepage":"http://divmod.org/trac/wiki/DivmodReverend","has_downloads":true,"created_at":"2010/05/06 10:58:58 -0700","fork":false,"pushed_at":"2010/05/06 11:10:51 -0700","url":"https://github.com/JNRowe/reverend","forks":1,"size":420,"private":false,"has_wiki":true,"name":"reverend","owner":"JNRowe","open_issues":0,"description":"Reverend - Simple Bayesian classifier","has_issues":true},{"watchers":1,"homepage":"http://packages.python.org/github-cli","has_downloads":true,"created_at":"2010/09/15 08:21:44 -0700","fork":true,"pushed_at":"2010/11/02 10:42:20 -0700","url":"https://github.com/JNRowe/github-cli","forks":0,"size":916,"private":false,"has_wiki":true,"name":"github-cli","owner":"JNRowe","open_issues":0,"description":"A command-line interface to the GitHub Issues API v2.","has_issues":false},{"watchers":3,"homepage":"","has_downloads":true,"created_at":"2010/10/31 01:03:09 -0700","fork":true,"pushed_at":"2011/06/06 16:14:48 -0700","url":"https://github.com/JNRowe/python-github2","forks":0,"size":156,"private":false,"has_wiki":true,"language":"Python","name":"python-github2","owner":"JNRowe","open_issues":0,"description":"github client in python, with issues support.","has_issues":false},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2010/10/31 09:27:05 -0700","fork":false,"pushed_at":"2011/05/31 13:08:10 -0700","url":"https://github.com/JNRowe/gh_bugs","forks":1,"size":2564,"private":false,"has_wiki":true,"language":"Python","name":"gh_bugs","owner":"JNRowe","open_issues":6,"description":"Simple client for GitHub issues","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/01/27 03:05:32 -0800","fork":true,"pushed_at":"2011/05/17 06:22:45 -0700","url":"https://github.com/JNRowe/snipmate-snippets","forks":0,"size":956,"private":false,"has_wiki":true,"language":"VimL","name":"snipmate-snippets","owner":"JNRowe","open_issues":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","has_issues":false},{"watchers":1,"homepage":"http://github.com/caffeinehit/hammertime","has_downloads":true,"created_at":"2011/02/02 09:49:21 -0800","fork":true,"pushed_at":"2011/02/02 09:54:18 -0800","url":"https://github.com/JNRowe/hammertime","forks":0,"size":720,"private":false,"has_wiki":true,"language":"Python","name":"hammertime","owner":"JNRowe","open_issues":0,"description":"Time tracking with git","has_issues":false},{"watchers":1,"homepage":"http://jnrowe.github.com/versionah/","has_downloads":true,"created_at":"2011/02/15 08:51:56 -0800","fork":false,"pushed_at":"2011/05/31 10:24:35 -0700","url":"https://github.com/JNRowe/versionah","forks":1,"size":4404,"private":false,"has_wiki":true,"language":"Python","name":"versionah","owner":"JNRowe","open_issues":0,"description":"Simple version number mangler","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/02/22 13:00:23 -0800","fork":false,"url":"https://github.com/JNRowe/issues-test","forks":1,"size":0,"private":false,"has_wiki":true,"name":"issues-test","owner":"JNRowe","open_issues":8,"description":"Repo for testing gh-bugs","has_issues":true},{"watchers":1,"homepage":"http://docs.notmyidea.org/alexis/pelican/","has_downloads":true,"created_at":"2011/02/23 21:20:07 -0800","fork":true,"pushed_at":"2011/04/04 21:22:46 -0700","url":"https://github.com/JNRowe/pelican","forks":0,"size":3916,"private":false,"has_wiki":true,"language":"Python","name":"pelican","owner":"JNRowe","open_issues":0,"description":"Static blog generator in python, using ReST syntax","has_issues":false},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/04/04 23:37:38 -0700","fork":true,"pushed_at":"2011/04/04 23:44:42 -0700","url":"https://github.com/JNRowe/pw","forks":0,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"pw","owner":"JNRowe","open_issues":0,"description":"Grep GPG-encrypted YAML password safes.","has_issues":false},{"watchers":1,"homepage":"http://code.google.com/p/shell-doctest/","has_downloads":true,"created_at":"2011/04/05 05:32:07 -0700","fork":false,"pushed_at":"2011/04/05 05:32:44 -0700","url":"https://github.com/JNRowe/shell-doctest","forks":1,"size":128,"private":false,"has_wiki":true,"language":"Python","name":"shell-doctest","owner":"JNRowe","open_issues":0,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","has_issues":true},{"watchers":1,"homepage":"http://jnrowe.github.com/blog","has_downloads":true,"created_at":"2011/04/05 09:21:16 -0700","fork":false,"pushed_at":"2011/04/05 09:22:26 -0700","url":"https://github.com/JNRowe/blog","forks":1,"size":1152,"private":false,"has_wiki":true,"name":"blog","owner":"JNRowe","open_issues":0,"description":"Old jnrowe.github.com content that *may* be resurrected.","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/04/06 07:35:40 -0700","fork":false,"pushed_at":"2011/05/13 12:27:22 -0700","url":"https://github.com/JNRowe/sphinx-jnrowe","forks":1,"size":644,"private":false,"has_wiki":true,"name":"sphinx-jnrowe","owner":"JNRowe","open_issues":0,"description":"My sphinx theme","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/05/09 06:04:35 -0700","fork":false,"pushed_at":"2011/05/27 00:50:48 -0700","url":"https://github.com/JNRowe/rdial","forks":1,"size":272,"private":false,"has_wiki":true,"language":"Python","name":"rdial","owner":"JNRowe","open_issues":0,"description":"Simple time tracking for simple people","has_issues":true},{"watchers":1,"homepage":"","has_downloads":true,"created_at":"2011/05/22 23:21:28 -0700","fork":true,"pushed_at":"2011/05/30 08:39:21 -0700","url":"https://github.com/JNRowe/vim-cute-python","forks":0,"size":180,"private":false,"has_wiki":true,"language":"VimL","name":"vim-cute-python","owner":"JNRowe","open_issues":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","has_issues":false},{"watchers":1,"homepage":"http://develop.github.com","has_downloads":false,"created_at":"2011/05/23 03:32:46 -0700","master_branch":"gh-pages","fork":true,"pushed_at":"2011/05/23 03:36:51 -0700","url":"https://github.com/JNRowe/develop.github.com","forks":0,"size":1584,"private":false,"has_wiki":false,"language":"JavaScript","name":"develop.github.com","owner":"JNRowe","open_issues":0,"description":"API Documentation for GitHub","has_issues":false},{"watchers":1,"homepage":"http://python-requests.org","has_downloads":true,"created_at":"2011/05/27 00:16:23 -0700","master_branch":"develop","fork":true,"pushed_at":"2011/05/27 00:17:44 -0700","url":"https://github.com/JNRowe/requests","forks":0,"size":2648,"private":false,"has_wiki":false,"language":"Python","name":"requests","owner":"JNRowe","open_issues":0,"description":"Python HTTP Requests for Humans.","has_issues":false},{"watchers":1,"homepage":"http://github.com/caelum/restfulie-py","has_downloads":true,"created_at":"2011/05/28 22:04:51 -0700","fork":true,"pushed_at":"2011/05/28 22:05:55 -0700","url":"https://github.com/JNRowe/restfulie-py","forks":0,"size":1794,"private":false,"has_wiki":true,"language":"Python","name":"restfulie-py","owner":"JNRowe","open_issues":0,"description":"Python port of Restfulie","has_issues":false},{"watchers":1,"homepage":"http://tyrs.nicosphere.net","has_downloads":true,"created_at":"2011/06/03 02:42:16 -0700","fork":true,"pushed_at":"2011/06/03 06:45:50 -0700","url":"https://github.com/JNRowe/tyrs","forks":0,"size":132,"private":false,"has_wiki":true,"language":"Python","name":"tyrs","owner":"JNRowe","open_issues":0,"description":"twitter curses client","has_issues":false},{"watchers":1,"homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_downloads":true,"created_at":"2011/06/06 06:21:54 -0700","fork":true,"pushed_at":"2011/06/06 06:23:32 -0700","url":"https://github.com/JNRowe/gpxviewer","forks":0,"size":1040,"private":false,"has_wiki":false,"language":"Python","name":"gpxviewer","owner":"JNRowe","open_issues":0,"description":"GPXViewer GPS trace viewer","has_issues":false}]} \ No newline at end of file +{"repositories":[{"has_downloads":true,"url":"https://github.com/JNRowe/bfm","forks":3,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","size":232,"private":false,"has_issues":true,"pushed_at":"2011/05/08 23:35:07 -0700","name":"bfm","owner":"JNRowe","integrate_branch":"iratqq","language":"C","watchers":3,"created_at":"2009/04/05 18:46:34 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/upoints","forks":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/upoints/","size":4640,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:43:42 -0700","name":"upoints","owner":"JNRowe","language":"Python","watchers":2,"created_at":"2009/04/23 04:06:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pyisbn","forks":2,"description":"A Python module for working with 10- and 13-digit ISBNs","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://packages.python.org/pyisbn/","size":132,"private":false,"has_issues":true,"pushed_at":"2011/06/06 07:04:57 -0700","name":"pyisbn","owner":"JNRowe","language":"Python","watchers":13,"created_at":"2009/04/23 04:07:25 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pytemplate","forks":0,"description":"Package template for Python, with distutils setup","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":2252,"private":false,"has_issues":true,"pushed_at":"2011/05/09 01:49:16 -0700","name":"pytemplate","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/04/23 04:09:02 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/misc-overlay","forks":0,"description":"Gentoo overlay -- miscellaneous packages","has_wiki":true,"fork":false,"open_issues":13,"homepage":"http://jnrowe.github.com/misc-overlay/","size":7777,"private":false,"has_issues":true,"pushed_at":"2011/08/11 11:46:23 -0700","name":"misc-overlay","owner":"JNRowe","language":"Python","watchers":5,"created_at":"2009/05/02 07:32:50 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/fixes-overlay","forks":0,"description":"Small package fixes languishing in the Gentoo BTS","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/fixes-overlay","size":3756,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:59:08 -0700","name":"fixes-overlay","owner":"JNRowe","language":"Python","master_branch":"master","watchers":1,"created_at":"2009/05/02 07:52:47 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/dotbash","forks":0,"description":"Shared bash configuration files","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1148,"private":false,"has_issues":true,"pushed_at":"2010/05/02 19:21:40 -0700","name":"dotbash","owner":"JNRowe","watchers":1,"created_at":"2009/05/08 04:18:15 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/jnrowe.github.com","forks":0,"description":"My user pages repository","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/","size":6636,"private":false,"has_issues":true,"pushed_at":"2011/07/09 11:32:30 -0700","name":"jnrowe.github.com","owner":"JNRowe","language":"JavaScript","master_branch":"master","watchers":2,"created_at":"2009/05/14 06:43:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/local-bin","forks":0,"description":"Tat from my ~/bin","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":656,"private":false,"has_issues":true,"pushed_at":"2011/06/20 08:39:36 -0700","name":"local-bin","owner":"JNRowe","language":"Shell","watchers":1,"created_at":"2009/05/14 11:09:34 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/termstyle","forks":1,"description":"a dirt-simple terminal-colour library for python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":564,"private":false,"has_issues":false,"pushed_at":"2010/09/24 21:10:10 -0700","name":"termstyle","owner":"JNRowe","watchers":2,"created_at":"2009/05/24 00:05:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/readyset","forks":1,"description":"Ready-to-use Software Engineering Templates","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://readyset.tigris.org/","size":3216,"private":false,"has_issues":true,"pushed_at":"2011/03/04 18:49:12 -0800","name":"readyset","owner":"JNRowe","language":"JavaScript","watchers":1,"created_at":"2009/08/16 19:30:50 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/cupage","forks":1,"description":"A tool to check for updates on web pages","has_wiki":true,"fork":false,"open_issues":3,"homepage":"http://jnrowe.github.com/cupage","size":612,"private":false,"has_issues":true,"pushed_at":"2011/07/17 10:23:45 -0700","name":"cupage","owner":"JNRowe","language":"Python","watchers":3,"created_at":"2009/09/17 21:03:02 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pages_layouts","forks":1,"description":"Shared layouts submodule for jekyll","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1948,"private":false,"has_issues":true,"pushed_at":"2011/02/28 05:02:24 -0800","name":"pages_layouts","owner":"JNRowe","watchers":1,"created_at":"2009/09/24 18:42:48 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/bwatch","forks":1,"description":"Simple bandwidth watching tool","has_wiki":true,"fork":false,"open_issues":2,"homepage":"http://jnrowe.github.com/bwatch/","size":2328,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:14:25 -0700","name":"bwatch","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/09/26 10:13:56 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/bleeter","forks":1,"description":"Nasty little twitter client","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://jnrowe.github.com/bleeter/","size":3544,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:17:05 -0700","name":"bleeter","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/10/14 22:19:25 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/oh-my-zsh","forks":1,"description":"A community-driven framework for managing your zsh configuration.","has_wiki":false,"fork":true,"open_issues":0,"homepage":"","size":416,"private":false,"has_issues":true,"pushed_at":"2011/05/26 02:55:49 -0700","name":"oh-my-zsh","owner":"JNRowe","language":"Shell","master_branch":"master","watchers":1,"created_at":"2009/10/28 13:13:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/vim-configs","forks":1,"description":"Personal vim configs","has_wiki":true,"fork":false,"open_issues":2,"homepage":"http://jnrowe.github.com/vim-configs","size":3756,"private":false,"has_issues":true,"pushed_at":"2011/08/11 11:35:34 -0700","name":"vim-configs","owner":"JNRowe","language":"VimL","watchers":3,"created_at":"2009/11/12 06:10:53 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/surfraw","forks":1,"description":"Mirror of the upstream git repository","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://surfraw.alioth.debian.org/","size":4876,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:34:59 -0700","name":"surfraw","owner":"JNRowe","language":"Shell","watchers":3,"created_at":"2010/01/26 03:49:55 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/blanco","forks":1,"description":"Hey, remember me?","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://jnrowe.github.com/blanco","size":4296,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:19:45 -0700","name":"blanco","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2010/01/31 13:04:51 -0800"},{"has_downloads":false,"url":"https://github.com/JNRowe/vim-jnrowe","forks":1,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/vim-jnrowe/","size":1244,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:25:27 -0700","name":"vim-jnrowe","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2010/02/11 17:12:11 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/emacs-configs","forks":1,"description":"Personal emacs configs","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1884,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:38:11 -0700","name":"emacs-configs","owner":"JNRowe","language":"Emacs Lisp","watchers":1,"created_at":"2010/02/15 12:19:22 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/tweepy","forks":1,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://joshthecoder.github.com/tweepy","size":536,"private":false,"has_issues":true,"pushed_at":"2010/04/02 19:09:52 -0700","name":"tweepy","owner":"JNRowe","watchers":1,"created_at":"2010/03/31 14:57:29 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/snipmate.vim","forks":1,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","has_wiki":false,"fork":true,"open_issues":0,"homepage":"www.vim.org/scripts/script.php?script_id=2540","size":248,"private":false,"has_issues":false,"pushed_at":"2011/01/27 03:16:30 -0800","name":"snipmate.vim","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2010/04/05 20:56:06 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/winwrangler","forks":1,"description":"Mirror of the upstream failpad source, converted for Matt","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","size":276,"private":false,"has_issues":true,"pushed_at":"2010/05/05 00:55:01 -0700","name":"winwrangler","owner":"JNRowe","watchers":1,"created_at":"2010/05/05 00:54:23 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/reverend","forks":1,"description":"Reverend - Simple Bayesian classifier","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://divmod.org/trac/wiki/DivmodReverend","size":420,"private":false,"has_issues":true,"pushed_at":"2010/05/06 11:10:51 -0700","name":"reverend","owner":"JNRowe","watchers":1,"created_at":"2010/05/06 10:58:58 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/github-cli","forks":0,"description":"A command-line interface to the GitHub Issues API v2.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://packages.python.org/github-cli","size":916,"private":false,"has_issues":false,"pushed_at":"2010/11/02 10:42:20 -0700","name":"github-cli","owner":"JNRowe","watchers":1,"created_at":"2010/09/15 08:21:44 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/python-github2","forks":0,"description":"github client in python, with issues support.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":144,"private":false,"has_issues":false,"pushed_at":"2011/07/12 09:55:46 -0700","name":"python-github2","owner":"JNRowe","language":"Python","watchers":3,"created_at":"2010/10/31 01:03:09 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/hubugs","forks":1,"description":"Simple client for GitHub issues","has_wiki":true,"fork":false,"open_issues":5,"homepage":"http://packages.python.org/hubugs/","size":3356,"private":false,"has_issues":true,"pushed_at":"2011/07/14 11:41:45 -0700","name":"hubugs","owner":"JNRowe","language":"Python","watchers":2,"created_at":"2010/10/31 09:27:05 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/snipmate-snippets","forks":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":956,"private":false,"has_issues":false,"pushed_at":"2011/05/17 06:22:45 -0700","name":"snipmate-snippets","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2011/01/27 03:05:32 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/hammertime","forks":0,"description":"Time tracking with git","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://github.com/caffeinehit/hammertime","size":720,"private":false,"has_issues":false,"pushed_at":"2011/02/02 09:54:18 -0800","name":"hammertime","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/02 09:49:21 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/versionah","forks":1,"description":"Simple version number mangler","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/versionah/","size":4504,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:35:57 -0700","name":"versionah","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/15 08:51:56 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/issues-test","forks":1,"description":"Repo for testing hubugs","has_wiki":true,"fork":false,"open_issues":8,"homepage":"","size":0,"private":false,"has_issues":true,"name":"issues-test","owner":"JNRowe","watchers":1,"created_at":"2011/02/22 13:00:23 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/pelican","forks":0,"description":"Static blog generator in python, using ReST syntax","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://docs.notmyidea.org/alexis/pelican/","size":3916,"private":false,"has_issues":false,"pushed_at":"2011/04/04 21:22:46 -0700","name":"pelican","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/23 21:20:07 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/pw","forks":0,"description":"Grep GPG-encrypted YAML password safes.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":132,"private":false,"has_issues":false,"pushed_at":"2011/04/04 23:44:42 -0700","name":"pw","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/04/04 23:37:38 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/shell-doctest","forks":1,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://code.google.com/p/shell-doctest/","size":128,"private":false,"has_issues":true,"pushed_at":"2011/04/05 05:32:44 -0700","name":"shell-doctest","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/04/05 05:32:07 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/blog","forks":1,"description":"Old jnrowe.github.com content that *may* be resurrected.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/blog","size":1152,"private":false,"has_issues":true,"pushed_at":"2011/04/05 09:22:26 -0700","name":"blog","owner":"JNRowe","watchers":1,"created_at":"2011/04/05 09:21:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/sphinx-jnrowe","forks":1,"description":"My sphinx theme","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":644,"private":false,"has_issues":true,"pushed_at":"2011/05/13 12:27:22 -0700","name":"sphinx-jnrowe","owner":"JNRowe","watchers":1,"created_at":"2011/04/06 07:35:40 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/rdial","forks":1,"description":"Simple time tracking for simple people","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1688,"private":false,"has_issues":true,"pushed_at":"2011/08/11 07:49:36 -0700","name":"rdial","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/05/09 06:04:35 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/vim-cute-python","forks":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":112,"private":false,"has_issues":false,"pushed_at":"2011/07/18 06:01:30 -0700","name":"vim-cute-python","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2011/05/22 23:21:28 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/develop.github.com","forks":0,"description":"API Documentation for GitHub","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://develop.github.com","size":1584,"private":false,"has_issues":false,"pushed_at":"2011/05/23 03:36:51 -0700","name":"develop.github.com","owner":"JNRowe","language":"JavaScript","master_branch":"gh-pages","watchers":1,"created_at":"2011/05/23 03:32:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/requests","forks":0,"description":"Python HTTP Requests for Humans.","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://python-requests.org","size":2648,"private":false,"has_issues":false,"pushed_at":"2011/05/27 00:17:44 -0700","name":"requests","owner":"JNRowe","language":"Python","master_branch":"develop","watchers":1,"created_at":"2011/05/27 00:16:23 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/restfulie-py","forks":0,"description":"Python port of Restfulie","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://github.com/caelum/restfulie-py","size":1794,"private":false,"has_issues":false,"pushed_at":"2011/05/28 22:05:55 -0700","name":"restfulie-py","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/05/28 22:04:51 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/tyrs","forks":0,"description":"twitter curses client","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://tyrs.nicosphere.net","size":132,"private":false,"has_issues":false,"pushed_at":"2011/06/03 06:45:50 -0700","name":"tyrs","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/03 02:42:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/gpxviewer","forks":0,"description":"GPXViewer GPS trace viewer","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://andrewgee.org/blog/projects/gpxviewer","size":1040,"private":false,"has_issues":false,"pushed_at":"2011/06/06 06:23:32 -0700","name":"gpxviewer","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/06 06:21:54 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/dwm","forks":1,"description":"The dwm codebase I run","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://dwm.suckless.org/","size":1084,"private":false,"has_issues":true,"pushed_at":"2011/06/24 09:18:06 -0700","name":"dwm","owner":"JNRowe","language":"C","master_branch":"jnrowe","watchers":1,"created_at":"2011/06/21 23:57:57 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/micromodels","forks":0,"description":"Declarative dictionary-based model classes for Python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":368,"private":false,"has_issues":false,"pushed_at":"2011/06/22 00:29:06 -0700","name":"micromodels","owner":"JNRowe","integrate_branch":"develop","language":"Python","watchers":1,"created_at":"2011/06/22 00:27:17 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/HTTPretty","forks":0,"description":"HTTP client mocking tool for Python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":172,"private":false,"has_issues":false,"pushed_at":"2011/06/30 12:24:07 -0700","name":"HTTPretty","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/30 12:19:33 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/thinote","forks":1,"description":"Move along","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":96,"private":false,"has_issues":true,"pushed_at":"2011/07/15 12:10:38 -0700","name":"thinote","owner":"JNRowe","watchers":1,"created_at":"2011/07/15 12:09:17 -0700"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f index 3ff7cf5..0b669fb 100644 --- a/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,misc-overlay,0d310ea1b3942e443c6e5cae4f3db39f @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 59 +x-ratelimit-remaining: 56 content-location: https://github.com/api/v2/json/repos/show/JNRowe/misc-overlay -x-runtime: 11ms -content-length: 447 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 448 +server: nginx/1.0.4 +x-runtime: 14ms x-ratelimit-limit: 60 -etag: "977c6513db34b26e6084b833b45c7754" +etag: "bee34b60622b6d172d1fcfadc3fb03d5" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 07:50:08 GMT +date: Mon, 15 Aug 2011 19:59:43 GMT content-type: application/json; charset=utf-8 -{"repository":{"homepage":"http://jnrowe.github.com/misc-overlay/","forks":0,"pushed_at":"2011/05/22 00:24:15 -0700","url":"https://github.com/JNRowe/misc-overlay","has_wiki":true,"watchers":5,"open_issues":6,"fork":false,"created_at":"2009/05/02 07:32:50 -0700","has_issues":true,"description":"Gentoo overlay -- miscellaneous packages","size":8449,"private":false,"name":"misc-overlay","owner":"JNRowe","language":"Python","has_downloads":true}} \ No newline at end of file +{"repository":{"has_downloads":true,"url":"https://github.com/JNRowe/misc-overlay","forks":0,"description":"Gentoo overlay -- miscellaneous packages","has_wiki":true,"fork":false,"open_issues":13,"homepage":"http://jnrowe.github.com/misc-overlay/","size":7777,"private":false,"has_issues":true,"pushed_at":"2011/08/11 11:46:23 -0700","name":"misc-overlay","owner":"JNRowe","language":"Python","watchers":5,"created_at":"2009/05/02 07:32:50 -0700"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 index 6480977..4118e5d 100644 --- a/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 +++ b/tests/data/github.com,api,v2,json,repos,show,ask,python-github2,contributors,ff5597c19e0d450ad432c56295b19cf8 @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 54 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/repos/show/ask/python-github2/contributors -x-runtime: 43ms -content-length: 5485 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 6007 +server: nginx/1.0.4 +x-runtime: 92ms x-ratelimit-limit: 60 -etag: "bad07c5d349a2f8a18db3268500b2586" +etag: "436cb11fc3ae37c80a03c3b50a30532c" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:39:49 GMT +date: Thu, 25 Aug 2011 06:58:04 GMT content-type: application/json; charset=utf-8 -{"contributors":[{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","contributions":202,"location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware, Inc.","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","contributions":44,"location":"London, UK","type":"User","login":"ask","email":"ask@celeryproject.org"},{"name":"Vincent Driessen","gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","contributions":9,"location":"Netherlands","blog":"http://nvie.com","type":"User","login":"nvie","email":"vincent@datafox.nl"},{"name":"Adam Vandenberg","gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","contributions":6,"location":"Issaquah, WA","blog":"http://adamv.com/","type":"User","login":"adamv","email":"flangy@gmail.com"},{"name":"Michael Basnight","gravatar_id":"2f3f68f62f5fc642f0b716b355071176","contributions":5,"location":"Austin","type":"User","login":"hub-cap"},{"name":"chris vale","company":"RocketNinja","gravatar_id":"d5400f77ab68a885319ac7b929bc789e","contributions":4,"location":"San Francisco","blog":"http://blog.crispywalrus.net/","type":"User","login":"crispywalrus","email":""},{"name":"Maximillian Dornseif","company":"HUDORA GmbH","gravatar_id":"ac1e94537ee54758bb954a6d1306be2a","contributions":4,"location":"Germany","blog":"http://mdornseif.github.com/","type":"User","login":"mdornseif"},{"name":"Fernando Perez","company":"University of California, Berkeley.","gravatar_id":"95198572b00e5fbcd97fb5315215bf7a","contributions":4,"location":"Berkeley, CA","blog":"http://fperez.org","type":"User","login":"fperez","email":"fernando.perez@berkeley.edu"},{"name":"Evan Broder","gravatar_id":"425ea4ff715bef0be068e0176251bf53","contributions":4,"location":"San Francisco, CA","blog":"http://ebroder.net","type":"User","login":"ebroder","email":"evan@ebroder.net"},{"name":"Jeremy Dunck","gravatar_id":"f3794e603ef53b0513ab45b6565ee457","contributions":4,"location":"Dallas, TX","type":"User","login":"jdunck","email":""},{"name":"Daniel Greenfeld","company":"pydanny.com","gravatar_id":"67e05420d4dd3492097aeb77f44f7867","contributions":3,"location":"Los Angeles, CA","blog":"http://pydanny.blogspot.com","type":"User","login":"pydanny","email":"pydanny@gmail.com"},{"name":"Scott Torborg","company":"","gravatar_id":"e45c9c1a1c6184d5572859c52ae43bfc","contributions":2,"location":"Portland, OR","blog":"http://www.scotttorborg.com","type":"User","login":"storborg","email":"storborg@mit.edu"},{"name":"Patryk Zawadzki","gravatar_id":"16483a82144b02ad846eafa078ef9b27","contributions":2,"location":"Wrocław, Poland","blog":"http://room-303.com/blog/","type":"User","login":"patrys","email":"patrys@pld-linux.org"},{"name":"Surajram Kumaravel","company":"","gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","contributions":2,"location":"Chennai, India","blog":"http://www.surajram.com","type":"User","login":"surajram","email":"root@surajram.com"},{"name":"Cody Soyland","company":"","gravatar_id":"db17092663e716b08de72e936ed082c7","contributions":2,"location":"Lawrence, KS","blog":"http://codysoyland.com/","type":"User","login":"codysoyland","email":"codysoyland@gmail.com"},{"name":"Christopher MacGown","gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","contributions":2,"location":"","type":"User","login":"ChristopherMacGown","email":""},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","contributions":1,"type":"User","login":"broderboy"},{"gravatar_id":"311e2e25841265550f884d3996a4e23b","contributions":1,"type":"User","login":"openhatched"},{"name":"Rick Harris","gravatar_id":"afb82eaa9550a5ba8538bb926b854465","contributions":1,"location":"Austin, TX","type":"User","login":"rconradharris","email":"rconradharris@gmail.com"},{"name":"Josh Weinberg","gravatar_id":"cf04727870245c17f455fb05b25f9f8e","contributions":1,"blog":"http://openemu.org","type":"User","login":"jweinberg","email":"joshuacweinberg@gmail.com"},{"name":"Claudio B.","company":"","gravatar_id":"4dea5cf83d2d6c1228750b76e579b38d","contributions":1,"location":"Los Angeles, United States","blog":"http://claudiob.github.com","type":"User","login":"claudiob","email":""},{"name":"Barthelemy Dagenais","gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","contributions":1,"location":"Montreal, QC, Canada","blog":"http://www.infobart.com","type":"User","login":"bartdag"},{"name":"Mark Paschal","company":"","gravatar_id":"30e5bdec1073df6350d27b8145bf0dab","contributions":1,"location":"San Francisco, CA, USA","blog":"http://markpasc.org/mark/","type":"User","login":"markpasc","email":""},{"name":"Jonas Obrist","company":"divio GmbH","gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","contributions":1,"location":"Zurich, Switzerland","blog":"twitter.com/ojiidotch","type":"User","login":"ojii","email":"jonas.obrist@divio.ch"},{"name":"Kenneth Reitz","company":"Arc90, Inc","gravatar_id":"2eccc4005572c1e2b12a9c00580bc86f","contributions":1,"location":"Washington, DC","blog":"http://kennethreitz.com","type":"User","login":"kennethreitz","email":"_@kennethreitz.com"},{"name":"Justin Quick","company":"Washington Times","gravatar_id":"063d31c517033677654704043d219008","contributions":1,"location":"DC","blog":"http://serotoninstorm.com","type":"User","login":"justquick","email":"justquick@gmail.com"},{"name":"Jens Ohlig","gravatar_id":"9de3f3969367fffe2051c2b405b79810","contributions":1,"blog":"http://www.johl.io","type":"User","login":"johl","email":""}]} \ No newline at end of file +{"contributors":[{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","contributions":267,"type":"User","login":"JNRowe","email":"jnrowe@gmail.com"},{"name":"Ask Solem Hoel","company":"RabbitMQ, VMware","gravatar_id":"7e8b501f7f579c66ddac7e65cb7962b4","location":"London, UK","contributions":44,"type":"User","login":"ask","email":"ask@celeryproject.org"},{"name":"Vincent Driessen","gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","location":"Netherlands","blog":"http://nvie.com","contributions":9,"type":"User","login":"nvie","email":"vincent@datafox.nl"},{"name":"Adam Vandenberg","gravatar_id":"7ea0cc75793eb2b1ada4abc953a41592","location":"Issaquah, WA","blog":"http://adamv.com/","contributions":6,"type":"User","login":"adamv","email":"flangy@gmail.com"},{"name":"Michael Basnight","gravatar_id":"2f3f68f62f5fc642f0b716b355071176","location":"Austin","contributions":5,"type":"User","login":"hub-cap"},{"name":"Jeremy Dunck","gravatar_id":"f3794e603ef53b0513ab45b6565ee457","location":"Dallas, TX","contributions":5,"type":"User","login":"jdunck","email":""},{"name":"Maximillian Dornseif","company":"HUDORA GmbH","gravatar_id":"ac1e94537ee54758bb954a6d1306be2a","location":"Germany","blog":"http://mdornseif.github.com/","contributions":4,"type":"User","login":"mdornseif"},{"name":"Fernando Perez","company":"University of California, Berkeley.","gravatar_id":"95198572b00e5fbcd97fb5315215bf7a","location":"Berkeley, CA","blog":"http://fperez.org","contributions":4,"type":"User","login":"fperez","email":"fernando.perez@berkeley.edu"},{"name":"Evan Broder","gravatar_id":"425ea4ff715bef0be068e0176251bf53","location":"San Francisco, CA","blog":"http://ebroder.net","contributions":4,"type":"User","login":"ebroder","email":"evan@ebroder.net"},{"name":"chris vale","company":"RocketNinja","gravatar_id":"d5400f77ab68a885319ac7b929bc789e","location":"San Francisco","blog":"http://blog.crispywalrus.net/","contributions":4,"type":"User","login":"crispywalrus","email":""},{"name":"Daniel Greenfeld","company":"pydanny.com","gravatar_id":"67e05420d4dd3492097aeb77f44f7867","location":"Los Angeles, CA","blog":"http://pydanny.blogspot.com","contributions":3,"type":"User","login":"pydanny","email":"pydanny@gmail.com"},{"name":"Scott Torborg","company":"Cart Logic, Inc.","gravatar_id":"e45c9c1a1c6184d5572859c52ae43bfc","location":"Portland, OR","blog":"http://www.scotttorborg.com","contributions":2,"type":"User","login":"storborg","email":"storborg@mit.edu"},{"name":"Ionuț Arțăriși","company":"","gravatar_id":"68546566350063c9017dfeae5000f6b1","location":"","blog":"mapleoin.bluepink.ro","contributions":2,"type":"User","login":"mapleoin","email":"mapleoin@lavabit.com"},{"name":"Surajram Kumaravel","company":"","gravatar_id":"1ee6b40a1acbcc00eb32e306e0e94037","location":"Chennai, India","blog":"http://www.surajram.com","contributions":2,"type":"User","login":"surajram","email":"root@surajram.com"},{"name":"Christopher MacGown","gravatar_id":"4174216c1dc0f223ce608d5a3b66a585","location":"","contributions":2,"type":"User","login":"ChristopherMacGown","email":""},{"name":"Cody Soyland","company":"","gravatar_id":"db17092663e716b08de72e936ed082c7","location":"Lawrence, KS","blog":"http://codysoyland.com/","contributions":2,"type":"User","login":"codysoyland","email":"codysoyland@gmail.com"},{"name":"Patryk Zawadzki","company":"Mirumee Software","gravatar_id":"16483a82144b02ad846eafa078ef9b27","location":"Wrocław, Poland","blog":"http://room-303.com/blog/","contributions":2,"type":"User","login":"patrys","email":"patrys@pld-linux.org"},{"gravatar_id":"311e2e25841265550f884d3996a4e23b","contributions":1,"type":"User","login":"openhatched"},{"name":"Rick Harris","gravatar_id":"afb82eaa9550a5ba8538bb926b854465","location":"Austin, TX","contributions":1,"type":"User","login":"rconradharris","email":"rconradharris@gmail.com"},{"gravatar_id":"464f76c5577389c5ca29e3d7cca133d5","contributions":1,"type":"User","login":"broderboy"},{"name":"Josh Weinberg","gravatar_id":"cf04727870245c17f455fb05b25f9f8e","blog":"http://openemu.org","contributions":1,"type":"User","login":"jweinberg","email":"joshuacweinberg@gmail.com"},{"name":"Jens Ohlig","gravatar_id":"9de3f3969367fffe2051c2b405b79810","blog":"http://www.johl.io","contributions":1,"type":"User","login":"johl","email":""},{"name":"Claudio B.","company":"","gravatar_id":"4dea5cf83d2d6c1228750b76e579b38d","location":"Los Angeles, United States","blog":"http://claudiob.github.com","contributions":1,"type":"User","login":"claudiob","email":""},{"name":"Jonas Obrist","company":"divio GmbH","gravatar_id":"b4f902096ea2ccfce71443d1d8fee5b3","location":"Zurich, Switzerland","blog":"twitter.com/ojiidotch","contributions":1,"type":"User","login":"ojii","email":"jonas.obrist@divio.ch"},{"name":"Mark Paschal","company":"","gravatar_id":"30e5bdec1073df6350d27b8145bf0dab","location":"San Francisco, CA, USA","blog":"http://markpasc.org/mark/","contributions":1,"type":"User","login":"markpasc","email":""},{"name":"Rok Garbas","company":"garbas.si (Python.Zope.Plone consulting)","gravatar_id":"9124210529f6eb59754932c413dd3c69","location":"Ljubljana, Slovenia","blog":"http://garbas.si","contributions":1,"type":"User","login":"garbas","email":"rok@garbas.si"},{"name":"Justin Quick","company":"Washington Times","gravatar_id":"063d31c517033677654704043d219008","location":"DC","blog":"http://serotoninstorm.com","contributions":1,"type":"User","login":"justquick","email":"justquick@gmail.com"},{"name":"Kenneth Reitz","company":"Arc90 + Readability","gravatar_id":"2eccc4005572c1e2b12a9c00580bc86f","location":"Washington, DC","blog":"http://kennethreitz.com","contributions":1,"type":"User","login":"kennethreitz","email":"_@kennethreitz.com"},{"name":"Barthelemy Dagenais","gravatar_id":"1dc7387cedba30b9a3d12792084b4b4a","location":"Montreal, QC, Canada","blog":"http://www.infobart.com","contributions":1,"type":"User","login":"bartdag"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c b/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c index c53a97a..e5c343c 100644 --- a/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c +++ b/tests/data/github.com,api,v2,json,repos,watched,JNRowe,7c562435f1efb67be5b048aeb79b3f6c @@ -1,14 +1,15 @@ status: 200 -x-ratelimit-remaining: 55 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/repos/watched/JNRowe -x-runtime: 293ms -content-length: 37996 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 38320 +server: nginx/1.0.4 +x-runtime: 264ms x-ratelimit-limit: 60 -etag: "2186c1687646c71b67903b8ab8f126af" +etag: "f708f7a7b851d375e602f662d2f7fa16" cache-control: private, max-age=0, must-revalidate -date: Wed, 08 Jun 2011 13:39:41 GMT +date: Mon, 15 Aug 2011 19:59:15 GMT content-type: application/json; charset=utf-8 -{"repositories":[{"watchers":922,"has_wiki":true,"owner":"scrooloose","open_issues":40,"url":"https://github.com/scrooloose/nerdtree","homepage":"","has_issues":true,"pushed_at":"2011/05/06 03:00:51 -0700","fork":false,"size":956,"has_downloads":true,"language":"VimL","name":"nerdtree","forks":70,"description":"hax0r vim script to give you a tree explorer","private":false,"created_at":"2008/03/10 00:34:08 -0700"},{"watchers":336,"has_wiki":true,"owner":"scrooloose","open_issues":6,"url":"https://github.com/scrooloose/nerdcommenter","homepage":"","has_issues":true,"pushed_at":"2011/05/05 18:56:29 -0700","fork":false,"size":1100,"has_downloads":true,"language":"VimL","name":"nerdcommenter","forks":39,"description":"Vim plugin for intensely orgasmic commenting","private":false,"created_at":"2008/03/10 01:19:15 -0700"},{"watchers":25,"has_wiki":true,"owner":"timcharper","open_issues":2,"url":"https://github.com/timcharper/textile.vim","homepage":"http://www.vim.org/scripts/script.php?script_id=2305","has_issues":true,"pushed_at":"2011/02/21 15:23:33 -0800","fork":false,"size":296,"has_downloads":true,"language":"VimL","name":"textile.vim","forks":11,"description":"Textile for VIM","private":false,"created_at":"2008/07/21 03:55:46 -0700"},{"watchers":369,"has_wiki":false,"owner":"tpope","open_issues":7,"url":"https://github.com/tpope/vim-surround","homepage":"http://www.vim.org/scripts/script.php?script_id=1697","has_issues":true,"pushed_at":"2011/01/22 20:29:15 -0800","fork":false,"size":188,"has_downloads":true,"language":"VimL","name":"vim-surround","forks":33,"description":"surround.vim: quoting/parenthesizing made simple","private":false,"created_at":"2008/09/10 18:00:16 -0700"},{"watchers":48,"has_wiki":false,"owner":"tpope","open_issues":0,"url":"https://github.com/tpope/vim-speeddating","homepage":"http://www.vim.org/scripts/script.php?script_id=2120","has_issues":true,"pushed_at":"2010/12/28 20:46:52 -0800","fork":false,"size":148,"has_downloads":false,"language":"VimL","name":"vim-speeddating","forks":5,"description":"speeddating.vim: use CTRL-A/CTRL-X to increment dates, times, and more","private":false,"created_at":"2008/09/10 18:07:06 -0700"},{"watchers":84,"has_wiki":true,"owner":"sjbach","open_issues":7,"url":"https://github.com/sjbach/lusty","homepage":"http://www.vim.org/scripts/script.php?script_id=1890","has_issues":true,"pushed_at":"2011/06/02 19:42:36 -0700","fork":false,"size":1584,"has_downloads":false,"language":"VimL","name":"lusty","forks":16,"description":"LustyExplorer / LustyJuggler for Vim","private":false,"created_at":"2008/09/14 19:54:02 -0700"},{"watchers":135,"has_wiki":false,"owner":"github","open_issues":34,"url":"https://github.com/github/develop.github.com","homepage":"http://develop.github.com","organization":"github","has_issues":true,"pushed_at":"2011/06/01 20:54:15 -0700","master_branch":"gh-pages","fork":false,"size":112,"has_downloads":false,"language":"JavaScript","name":"develop.github.com","forks":45,"description":"API Documentation for GitHub","private":false,"created_at":"2009/02/17 15:51:23 -0800"},{"watchers":3,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/windowlayout","homepage":"","has_issues":true,"pushed_at":"2009/02/26 08:46:15 -0800","fork":false,"size":296,"has_downloads":true,"language":"VimL","name":"windowlayout","forks":0,"description":"A vim library for saving and restoring window layouts, plus demo plugins","private":false,"created_at":"2009/02/25 22:10:21 -0800"},{"watchers":157,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/tabular","homepage":"","has_issues":true,"pushed_at":"2011/04/01 18:13:35 -0700","fork":false,"size":616,"has_downloads":true,"language":"VimL","name":"tabular","forks":9,"description":"Vim script for text filtering and alignment","private":false,"created_at":"2009/03/02 22:19:16 -0800"},{"watchers":2,"has_wiki":true,"owner":"decklin","open_issues":0,"url":"https://github.com/decklin/mnemosyne","homepage":"http://www.red-bean.com/decklin/mnemosyne/","has_issues":true,"pushed_at":"2009/03/10 10:25:52 -0700","fork":false,"size":344,"has_downloads":true,"name":"mnemosyne","forks":0,"description":"Static Python/Kid weblog generator with Maildir store","private":false,"created_at":"2009/03/10 10:19:38 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/bfm","homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","has_issues":true,"pushed_at":"2011/05/08 23:35:07 -0700","integrate_branch":"iratqq","fork":false,"size":232,"has_downloads":true,"language":"C","name":"bfm","forks":3,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","private":false,"created_at":"2009/04/05 18:46:34 -0700"},{"watchers":143,"has_wiki":true,"owner":"ask","open_issues":5,"url":"https://github.com/ask/python-github2","homepage":"http://packages.python.org/github2","has_issues":true,"pushed_at":"2011/06/06 16:15:04 -0700","fork":false,"size":112,"has_downloads":true,"language":"Python","name":"python-github2","forks":50,"description":"github client in python, with issues support.","private":false,"created_at":"2009/04/18 08:31:12 -0700"},{"watchers":108,"has_wiki":true,"owner":"jsmits","open_issues":5,"url":"https://github.com/jsmits/github-cli","homepage":"http://packages.python.org/github-cli","has_issues":true,"pushed_at":"2011/03/16 13:18:51 -0700","fork":false,"size":100,"has_downloads":true,"language":"Python","name":"github-cli","forks":12,"description":"A command-line interface to the GitHub Issues API v2.","private":false,"created_at":"2009/04/19 02:05:27 -0700"},{"watchers":2,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/upoints","homepage":"http://jnrowe.github.com/upoints/","has_issues":true,"pushed_at":"2011/05/16 03:48:13 -0700","fork":false,"size":3288,"has_downloads":true,"language":"Python","name":"upoints","forks":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","private":false,"created_at":"2009/04/23 04:06:46 -0700"},{"watchers":13,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/pyisbn","homepage":"http://packages.python.org/pyisbn/","has_issues":true,"pushed_at":"2011/06/06 07:04:57 -0700","fork":false,"size":132,"has_downloads":true,"language":"Python","name":"pyisbn","forks":2,"description":"A Python module for working with 10- and 13-digit ISBNs","private":false,"created_at":"2009/04/23 04:07:25 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pytemplate","homepage":"","has_issues":true,"pushed_at":"2011/05/09 01:49:16 -0700","fork":false,"size":2252,"has_downloads":true,"language":"Python","name":"pytemplate","forks":0,"description":"Package template for Python, with distutils setup","private":false,"created_at":"2009/04/23 04:09:02 -0700"},{"watchers":5,"has_wiki":true,"owner":"JNRowe","open_issues":6,"url":"https://github.com/JNRowe/misc-overlay","homepage":"http://jnrowe.github.com/misc-overlay/","has_issues":true,"pushed_at":"2011/06/07 17:00:59 -0700","fork":false,"size":11049,"has_downloads":true,"language":"Python","name":"misc-overlay","forks":0,"description":"Gentoo overlay -- miscellaneous packages","private":false,"created_at":"2009/05/02 07:32:50 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/fixes-overlay","homepage":"http://jnrowe.github.com/fixes-overlay","has_issues":true,"pushed_at":"2011/04/06 10:48:22 -0700","master_branch":"master","fork":false,"size":3636,"has_downloads":false,"language":"Python","name":"fixes-overlay","forks":0,"description":"Small package fixes languishing in the Gentoo BTS","private":false,"created_at":"2009/05/02 07:52:47 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/dotbash","homepage":"","has_issues":true,"pushed_at":"2010/05/02 19:21:40 -0700","fork":false,"size":1148,"has_downloads":true,"name":"dotbash","forks":0,"description":"Shared bash configuration files","private":false,"created_at":"2009/05/08 04:18:15 -0700"},{"watchers":2,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/jnrowe.github.com","homepage":"http://jnrowe.github.com/","has_issues":true,"pushed_at":"2011/06/06 07:10:57 -0700","master_branch":"master","fork":false,"size":6272,"has_downloads":true,"language":"JavaScript","name":"jnrowe.github.com","forks":0,"description":"My user pages repository","private":false,"created_at":"2009/05/14 06:43:16 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/local-bin","homepage":"","has_issues":true,"pushed_at":"2011/02/14 01:52:50 -0800","fork":false,"size":652,"has_downloads":true,"language":"Python","name":"local-bin","forks":0,"description":"Tat from my ~/bin","private":false,"created_at":"2009/05/14 11:09:34 -0700"},{"watchers":2,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/termstyle","homepage":"","has_issues":false,"pushed_at":"2010/09/24 21:10:10 -0700","fork":true,"size":564,"has_downloads":true,"name":"termstyle","forks":1,"description":"a dirt-simple terminal-colour library for python","private":false,"created_at":"2009/05/24 00:05:46 -0700"},{"watchers":659,"has_wiki":false,"owner":"tweepy","open_issues":48,"url":"https://github.com/tweepy/tweepy","homepage":"http://tweepy.github.com/","organization":"tweepy","has_issues":true,"pushed_at":"2011/05/25 22:50:37 -0700","fork":false,"size":933,"has_downloads":true,"language":"Python","name":"tweepy","forks":117,"description":"A Python library for access the Twitter API","private":false,"created_at":"2009/07/05 21:15:34 -0700"},{"watchers":35,"has_wiki":true,"owner":"ciaranm","open_issues":0,"url":"https://github.com/ciaranm/inkpot","homepage":"","has_issues":true,"pushed_at":"2009/11/27 15:42:40 -0800","fork":false,"size":124,"has_downloads":true,"language":"VimL","name":"inkpot","forks":3,"description":"Inkpot 88/256 Colour Scheme for Vim","private":false,"created_at":"2009/07/06 09:24:19 -0700"},{"watchers":21,"has_wiki":true,"owner":"ciaranm","open_issues":0,"url":"https://github.com/ciaranm/detectindent","homepage":"","has_issues":true,"pushed_at":"2011/05/23 07:50:37 -0700","fork":false,"size":136,"has_downloads":true,"language":"VimL","name":"detectindent","forks":4,"description":"Vim script for automatically detecting indent settings","private":false,"created_at":"2009/07/09 07:13:01 -0700"},{"watchers":12,"has_wiki":true,"owner":"ciaranm","open_issues":1,"url":"https://github.com/ciaranm/securemodelines","homepage":"","has_issues":true,"pushed_at":"2011/02/06 04:47:00 -0800","fork":false,"size":104,"has_downloads":true,"language":"VimL","name":"securemodelines","forks":4,"description":"A secure alternative to Vim modelines","private":false,"created_at":"2009/07/09 07:18:16 -0700"},{"watchers":190,"has_wiki":true,"owner":"scrooloose","open_issues":12,"url":"https://github.com/scrooloose/syntastic","homepage":"","has_issues":true,"pushed_at":"2011/06/02 13:26:53 -0700","fork":false,"size":120,"has_downloads":true,"language":"VimL","name":"syntastic","forks":42,"description":"Syntax checking hacks for vim","private":false,"created_at":"2009/07/10 21:05:54 -0700"},{"watchers":8,"has_wiki":false,"owner":"flother","open_issues":0,"url":"https://github.com/flother/participationgraphs","homepage":"http://www.flother.com/blog/2009/django-github-sparklines/","has_issues":true,"pushed_at":"2010/09/25 03:57:52 -0700","fork":false,"size":628,"has_downloads":false,"language":"Python","name":"participationgraphs","forks":1,"description":"Django app with a template tag to allow you to include sparklines of the 52-week commit history for a project on Github","private":false,"created_at":"2009/07/15 05:07:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/readyset","homepage":"http://readyset.tigris.org/","has_issues":true,"pushed_at":"2011/03/04 18:49:12 -0800","fork":false,"size":3216,"has_downloads":true,"language":"JavaScript","name":"readyset","forks":1,"description":"Ready-to-use Software Engineering Templates","private":false,"created_at":"2009/08/16 19:30:50 -0700"},{"watchers":35,"has_wiki":true,"owner":"spiiph","open_issues":9,"url":"https://github.com/spiiph/vim-space","homepage":"","has_issues":true,"pushed_at":"2010/04/13 07:32:09 -0700","fork":false,"size":572,"has_downloads":true,"language":"VimL","name":"vim-space","forks":7,"description":"space.vim - Smart Space key for Vim","private":false,"created_at":"2009/08/17 05:27:00 -0700"},{"watchers":151,"has_wiki":true,"owner":"sixapart","open_issues":11,"url":"https://github.com/sixapart/remoteobjects","homepage":"http://sixapart.github.com/remoteobjects/","organization":"sixapart","has_issues":true,"pushed_at":"2011/04/19 09:58:32 -0700","fork":false,"size":336,"has_downloads":true,"language":"Python","name":"remoteobjects","forks":12,"description":"An object RESTational model","private":false,"created_at":"2009/08/18 11:26:38 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":5,"url":"https://github.com/JNRowe/cupage","homepage":"http://jnrowe.github.com/cupage","has_issues":true,"pushed_at":"2011/05/24 23:07:45 -0700","fork":false,"size":4948,"has_downloads":true,"language":"Python","name":"cupage","forks":1,"description":"A tool to check for updates on web pages","private":false,"created_at":"2009/09/17 21:03:02 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pages_layouts","homepage":"","has_issues":true,"pushed_at":"2011/02/28 05:02:24 -0800","fork":false,"size":1948,"has_downloads":true,"name":"pages_layouts","forks":1,"description":"Shared layouts submodule for jekyll","private":false,"created_at":"2009/09/24 18:42:48 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":2,"url":"https://github.com/JNRowe/bwatch","homepage":"http://jnrowe.github.com/bwatch/","has_issues":true,"pushed_at":"2011/04/06 10:56:17 -0700","fork":false,"size":2248,"has_downloads":true,"language":"Python","name":"bwatch","forks":1,"description":"Simple bandwidth watching tool","private":false,"created_at":"2009/09/26 10:13:56 -0700"},{"watchers":1205,"has_wiki":false,"owner":"tpope","open_issues":17,"url":"https://github.com/tpope/vim-fugitive","homepage":"http://www.vim.org/scripts/script.php?script_id=2975","has_issues":true,"pushed_at":"2011/06/02 18:40:54 -0700","fork":false,"size":176,"has_downloads":false,"language":"VimL","name":"vim-fugitive","forks":32,"description":"fugitive.vim: a Git wrapper so awesome, it should be illegal","private":false,"created_at":"2009/10/08 18:09:49 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/bleeter","homepage":"http://jnrowe.github.com/bleeter/","has_issues":true,"pushed_at":"2011/05/15 08:07:47 -0700","fork":false,"size":3496,"has_downloads":true,"language":"Python","name":"bleeter","forks":1,"description":"Nasty little twitter client","private":false,"created_at":"2009/10/14 22:19:25 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/oh-my-zsh","homepage":"","has_issues":true,"pushed_at":"2011/05/26 02:55:49 -0700","master_branch":"master","fork":true,"size":416,"has_downloads":false,"language":"Shell","name":"oh-my-zsh","forks":1,"description":"A community-driven framework for managing your zsh configuration.","private":false,"created_at":"2009/10/28 13:13:46 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":2,"url":"https://github.com/JNRowe/vim-configs","homepage":"http://jnrowe.github.com/vim-configs","has_issues":true,"pushed_at":"2011/05/30 08:42:41 -0700","fork":false,"size":3616,"has_downloads":true,"language":"VimL","name":"vim-configs","forks":1,"description":"Personal vim configs","private":false,"created_at":"2009/11/12 06:10:53 -0800"},{"watchers":3,"has_wiki":true,"owner":"baruch","open_issues":0,"url":"https://github.com/baruch/notmuch-gtk","homepage":"http://baruch.github.com/notmuch-gtk","has_issues":true,"pushed_at":"2009/11/28 15:42:12 -0800","fork":false,"size":1638,"has_downloads":true,"name":"notmuch-gtk","forks":1,"description":"A Gtk+ interface to the notmuch mail client, not maintained anymore, I switched to gmail instead.","private":false,"created_at":"2009/11/26 07:59:04 -0800"},{"watchers":10,"has_wiki":true,"owner":"c9s","open_issues":2,"url":"https://github.com/c9s/gsession.vim","has_issues":true,"pushed_at":"2010/12/10 00:52:20 -0800","fork":false,"size":144,"has_downloads":true,"language":"VimL","name":"gsession.vim","forks":4,"description":"gsession.vim saves your session files into the same directory (~/.vim/session/) by default. and auto-detect your session file to load session file when you are opening vim editor without arguments.","private":false,"created_at":"2009/12/07 06:31:08 -0800"},{"watchers":565,"has_wiki":true,"owner":"tpope","open_issues":6,"url":"https://github.com/tpope/vim-pathogen","homepage":"http://www.vim.org/scripts/script.php?script_id=2332","has_issues":true,"pushed_at":"2011/05/13 20:58:53 -0700","fork":false,"size":256,"has_downloads":false,"language":"VimL","name":"vim-pathogen","forks":24,"description":"pathogen.vim: manage your runtimepath","private":false,"created_at":"2009/12/13 12:59:18 -0800"},{"watchers":4,"has_wiki":true,"owner":"godlygeek","open_issues":0,"url":"https://github.com/godlygeek/colorchart","homepage":"","has_issues":true,"pushed_at":"2010/09/25 18:11:09 -0700","fork":false,"size":480,"has_downloads":true,"language":"VimL","name":"colorchart","forks":1,"description":"Provides an interactive color chart from examining terminal color palettes in vim","private":false,"created_at":"2009/12/21 00:35:24 -0800"},{"watchers":88,"has_wiki":true,"owner":"tpope","open_issues":2,"url":"https://github.com/tpope/vim-ragtag","homepage":"http://www.vim.org/scripts/script.php?script_id=1896","has_issues":true,"pushed_at":"2010/09/26 08:43:54 -0700","fork":false,"size":736,"has_downloads":true,"language":"VimL","name":"vim-ragtag","forks":13,"description":"ragtag.vim: ghetto HTML/XML mappings (formerly allml.vim)","private":false,"created_at":"2010/01/17 17:04:48 -0800"},{"watchers":2050,"has_wiki":true,"owner":"nvie","open_issues":47,"url":"https://github.com/nvie/gitflow","homepage":"http://nvie.com/posts/a-successful-git-branching-model/","has_issues":true,"pushed_at":"2011/05/23 04:02:34 -0700","integrate_branch":"develop","master_branch":"develop","fork":false,"size":5290,"has_downloads":true,"language":"Shell","name":"gitflow","forks":129,"description":"Git extensions to provide high-level repository operations for Vincent Driessen's branching model.","private":false,"created_at":"2010/01/20 15:14:12 -0800"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/surfraw","homepage":"http://surfraw.alioth.debian.org/","has_issues":true,"pushed_at":"2011/06/01 01:36:06 -0700","fork":false,"size":4716,"has_downloads":true,"language":"PHP","name":"surfraw","forks":1,"description":"Mirror of the upstream git repository","private":false,"created_at":"2010/01/26 03:49:55 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":1,"url":"https://github.com/JNRowe/blanco","homepage":"http://jnrowe.github.com/blanco","has_issues":true,"pushed_at":"2011/04/06 10:37:48 -0700","fork":false,"size":4200,"has_downloads":true,"language":"Python","name":"blanco","forks":1,"description":"Hey, remember me?","private":false,"created_at":"2010/01/31 13:04:51 -0800"},{"watchers":144,"has_wiki":true,"owner":"benoitc","open_issues":5,"url":"https://github.com/benoitc/restkit","homepage":"http://benoitc.github.com/restkit","has_issues":true,"pushed_at":"2011/05/30 02:02:01 -0700","fork":false,"size":2584,"has_downloads":true,"language":"Python","name":"restkit","forks":11,"description":"an HTTP resource kit for Python","private":false,"created_at":"2010/02/04 05:21:24 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/vim-jnrowe","homepage":"http://jnrowe.github.com/vim-jnrowe/","has_issues":true,"pushed_at":"2011/04/14 04:05:52 -0700","fork":false,"size":936,"has_downloads":false,"language":"VimL","name":"vim-jnrowe","forks":1,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","private":false,"created_at":"2010/02/11 17:12:11 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/emacs-configs","homepage":"","has_issues":true,"pushed_at":"2011/06/01 10:27:57 -0700","fork":false,"size":1604,"has_downloads":true,"language":"Emacs Lisp","name":"emacs-configs","forks":1,"description":"Personal emacs configs","private":false,"created_at":"2010/02/15 12:19:22 -0800"},{"watchers":19,"has_wiki":true,"owner":"rc0","open_issues":1,"url":"https://github.com/rc0/mairix","homepage":"http://www.rc0.org.uk/mairix","has_issues":true,"pushed_at":"2011/02/09 16:31:13 -0800","fork":false,"size":200,"has_downloads":true,"language":"C","name":"mairix","forks":6,"description":"mairix is a program for indexing and searching email messages stored in Maildir, MH or mbox folders","private":false,"created_at":"2010/03/05 14:34:27 -0800"},{"watchers":3,"has_wiki":true,"owner":"rc0","open_issues":0,"url":"https://github.com/rc0/spill","homepage":"http://www.rc0.org.uk/spill","has_issues":true,"pushed_at":"2011/05/17 15:52:40 -0700","fork":false,"size":252,"has_downloads":true,"language":"C","name":"spill","forks":1,"description":"spill is a program for creating set of symbolic links from one directory hierarchy which point to corresponding filenames in a separate directory hierarchy.","private":false,"created_at":"2010/03/06 13:28:55 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/tweepy","homepage":"http://joshthecoder.github.com/tweepy","has_issues":true,"pushed_at":"2010/04/02 19:09:52 -0700","fork":true,"size":536,"has_downloads":true,"name":"tweepy","forks":1,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","private":false,"created_at":"2010/03/31 14:57:29 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/snipmate.vim","homepage":"www.vim.org/scripts/script.php?script_id=2540","has_issues":false,"pushed_at":"2011/01/27 03:16:30 -0800","fork":true,"size":248,"has_downloads":false,"language":"VimL","name":"snipmate.vim","forks":1,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","private":false,"created_at":"2010/04/05 20:56:06 -0700"},{"watchers":11,"has_wiki":true,"owner":"zacharyvoase","open_issues":2,"url":"https://github.com/zacharyvoase/urlobject","homepage":"","has_issues":true,"pushed_at":"2011/06/01 04:53:17 -0700","fork":false,"size":808,"has_downloads":true,"language":"Python","name":"urlobject","forks":1,"description":"Python library for manipulating URLs (and some URIs) in a more natural way.","private":false,"created_at":"2010/04/08 06:44:42 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/winwrangler","homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","has_issues":true,"pushed_at":"2010/05/05 00:55:01 -0700","fork":false,"size":276,"has_downloads":true,"name":"winwrangler","forks":1,"description":"Mirror of the upstream failpad source, converted for Matt","private":false,"created_at":"2010/05/05 00:54:23 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/reverend","homepage":"http://divmod.org/trac/wiki/DivmodReverend","has_issues":true,"pushed_at":"2010/05/06 11:10:51 -0700","fork":false,"size":420,"has_downloads":true,"name":"reverend","forks":1,"description":"Reverend - Simple Bayesian classifier","private":false,"created_at":"2010/05/06 10:58:58 -0700"},{"watchers":4,"has_wiki":false,"owner":"andrewgee","open_issues":0,"url":"https://github.com/andrewgee/gpxviewer","homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_issues":false,"pushed_at":"2011/06/06 06:29:23 -0700","fork":false,"size":1044,"has_downloads":true,"language":"Python","name":"gpxviewer","forks":4,"description":"GPXViewer GPS trace viewer","private":false,"created_at":"2010/05/16 02:56:55 -0700"},{"watchers":4,"has_wiki":true,"owner":"c9s","open_issues":0,"url":"https://github.com/c9s/fontselector.vim","has_issues":true,"pushed_at":"2010/10/02 05:46:45 -0700","fork":false,"size":248,"has_downloads":true,"language":"VimL","name":"fontselector.vim","forks":1,"description":"font select plugin for gvim.","private":false,"created_at":"2010/08/06 00:40:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/github-cli","homepage":"http://packages.python.org/github-cli","has_issues":false,"pushed_at":"2010/11/02 10:42:20 -0700","fork":true,"size":916,"has_downloads":true,"name":"github-cli","forks":0,"description":"A command-line interface to the GitHub Issues API v2.","private":false,"created_at":"2010/09/15 08:21:44 -0700"},{"watchers":151,"has_wiki":false,"owner":"sjl","open_issues":0,"url":"https://github.com/sjl/gundo.vim","homepage":"http://sjl.bitbucket.org/gundo.vim/","has_issues":false,"pushed_at":"2011/05/27 07:59:39 -0700","fork":false,"size":480,"has_downloads":true,"language":"VimL","name":"gundo.vim","forks":18,"description":"A git mirror of gundo.vim","private":false,"created_at":"2010/10/09 09:31:25 -0700"},{"watchers":38,"has_wiki":true,"owner":"ehamberg","open_issues":0,"url":"https://github.com/ehamberg/vim-cute-python","homepage":"","has_issues":true,"pushed_at":"2011/05/27 01:43:48 -0700","fork":false,"size":120,"has_downloads":true,"language":"VimL","name":"vim-cute-python","forks":9,"description":"Unicode goodness for Python code by using vim's “conceal” feature","private":false,"created_at":"2010/10/19 13:23:10 -0700"},{"watchers":24,"has_wiki":true,"owner":"caelum","open_issues":1,"url":"https://github.com/caelum/restfulie-py","homepage":"http://github.com/caelum/restfulie-py","organization":"caelum","has_issues":true,"pushed_at":"2011/05/29 17:47:58 -0700","fork":false,"size":134,"has_downloads":true,"language":"Python","name":"restfulie-py","forks":6,"description":"Python port of Restfulie","private":false,"created_at":"2010/10/25 04:23:23 -0700"},{"watchers":3,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/python-github2","homepage":"","has_issues":false,"pushed_at":"2011/06/06 16:14:48 -0700","fork":true,"size":156,"has_downloads":true,"language":"Python","name":"python-github2","forks":0,"description":"github client in python, with issues support.","private":false,"created_at":"2010/10/31 01:03:09 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":6,"url":"https://github.com/JNRowe/gh_bugs","homepage":"","has_issues":true,"pushed_at":"2011/05/31 13:08:10 -0700","fork":false,"size":2564,"has_downloads":true,"language":"Python","name":"gh_bugs","forks":1,"description":"Simple client for GitHub issues","private":false,"created_at":"2010/10/31 09:27:05 -0700"},{"watchers":215,"has_wiki":true,"owner":"hsitz","open_issues":8,"url":"https://github.com/hsitz/VimOrganizer","homepage":"http://vimeo.com/17182850 ","has_issues":true,"pushed_at":"2011/04/27 20:03:17 -0700","fork":false,"size":540,"has_downloads":true,"language":"VimL","name":"VimOrganizer","forks":15,"description":"-- partial clone of Emacs' Org-mode -- please use development branch for newest changes ","private":false,"created_at":"2010/11/09 13:33:13 -0800"},{"watchers":26,"has_wiki":true,"owner":"j4mie","open_issues":0,"url":"https://github.com/j4mie/micromodels","homepage":"","has_issues":true,"pushed_at":"2011/02/24 00:46:32 -0800","integrate_branch":"develop","fork":false,"size":336,"has_downloads":true,"language":"Python","name":"micromodels","forks":6,"description":"Declarative dictionary-based model classes for Python","private":false,"created_at":"2010/12/08 16:21:15 -0800"},{"watchers":2,"has_wiki":true,"owner":"catch22","open_issues":0,"url":"https://github.com/catch22/pw","homepage":"","has_issues":true,"pushed_at":"2011/05/17 12:21:16 -0700","fork":false,"size":202,"has_downloads":true,"language":"Python","name":"pw","forks":2,"description":"Grep GPG-encrypted YAML password safes.","private":false,"created_at":"2010/12/18 05:32:17 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/snipmate-snippets","homepage":"","has_issues":false,"pushed_at":"2011/05/17 06:22:45 -0700","fork":true,"size":956,"has_downloads":true,"language":"VimL","name":"snipmate-snippets","forks":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","private":false,"created_at":"2011/01/27 03:05:32 -0800"},{"watchers":406,"has_wiki":false,"owner":"github","open_issues":0,"url":"https://github.com/github/dmca","homepage":"http://help.github.com/dmca","organization":"github","has_issues":false,"pushed_at":"2011/06/07 16:24:20 -0700","fork":false,"size":148,"has_downloads":true,"name":"dmca","forks":8,"description":"DMCA takedowns GitHub has received","private":false,"created_at":"2011/01/28 15:58:38 -0800"},{"watchers":3,"has_wiki":true,"owner":"passy","open_issues":0,"url":"https://github.com/passy/nose-lettuce","homepage":"","has_issues":true,"pushed_at":"2011/01/31 13:18:55 -0800","fork":false,"size":248,"has_downloads":true,"language":"Python","name":"nose-lettuce","forks":1,"description":"A probably bad idea of how to run lettuce from nose","private":false,"created_at":"2011/01/31 13:04:03 -0800"},{"watchers":6,"has_wiki":true,"owner":"caffeinehit","open_issues":0,"url":"https://github.com/caffeinehit/hammertime","homepage":"http://github.com/caffeinehit/hammertime","organization":"caffeinehit","has_issues":true,"pushed_at":"2011/02/03 02:40:25 -0800","fork":false,"size":140,"has_downloads":true,"language":"Python","name":"hammertime","forks":2,"description":"Time tracking with git","private":false,"created_at":"2011/02/02 02:18:33 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/hammertime","homepage":"http://github.com/caffeinehit/hammertime","has_issues":false,"pushed_at":"2011/02/02 09:54:18 -0800","fork":true,"size":720,"has_downloads":true,"language":"Python","name":"hammertime","forks":0,"description":"Time tracking with git","private":false,"created_at":"2011/02/02 09:49:21 -0800"},{"watchers":330,"has_wiki":false,"owner":"kennethreitz","open_issues":10,"url":"https://github.com/kennethreitz/requests","homepage":"http://python-requests.org","has_issues":true,"pushed_at":"2011/06/05 18:22:38 -0700","master_branch":"develop","fork":false,"size":164,"has_downloads":true,"language":"Python","name":"requests","forks":24,"description":"Python HTTP Requests for Humans.","private":false,"created_at":"2011/02/13 10:38:17 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/versionah","homepage":"http://jnrowe.github.com/versionah/","has_issues":true,"pushed_at":"2011/05/31 10:24:35 -0700","fork":false,"size":4404,"has_downloads":true,"language":"Python","name":"versionah","forks":1,"description":"Simple version number mangler","private":false,"created_at":"2011/02/15 08:51:56 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":8,"url":"https://github.com/JNRowe/issues-test","homepage":"","has_issues":true,"fork":false,"size":0,"has_downloads":true,"name":"issues-test","forks":1,"description":"Repo for testing gh-bugs","private":false,"created_at":"2011/02/22 13:00:23 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pelican","homepage":"http://docs.notmyidea.org/alexis/pelican/","has_issues":false,"pushed_at":"2011/04/04 21:22:46 -0700","fork":true,"size":3916,"has_downloads":true,"language":"Python","name":"pelican","forks":0,"description":"Static blog generator in python, using ReST syntax","private":false,"created_at":"2011/02/23 21:20:07 -0800"},{"watchers":19,"has_wiki":true,"owner":"dcramer","open_issues":2,"url":"https://github.com/dcramer/decruft","homepage":"http://code.google.com/p/decruft/","has_issues":true,"pushed_at":"2011/05/18 13:19:39 -0700","fork":false,"size":508,"has_downloads":true,"language":"Python","name":"decruft","forks":5,"description":"python-readability, but faster (mirror-ish)","private":false,"created_at":"2011/02/28 18:07:04 -0800"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/pw","homepage":"","has_issues":false,"pushed_at":"2011/04/04 23:44:42 -0700","fork":true,"size":132,"has_downloads":true,"language":"Python","name":"pw","forks":0,"description":"Grep GPG-encrypted YAML password safes.","private":false,"created_at":"2011/04/04 23:37:38 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/shell-doctest","homepage":"http://code.google.com/p/shell-doctest/","has_issues":true,"pushed_at":"2011/04/05 05:32:44 -0700","fork":false,"size":128,"has_downloads":true,"language":"Python","name":"shell-doctest","forks":1,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","private":false,"created_at":"2011/04/05 05:32:07 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/blog","homepage":"http://jnrowe.github.com/blog","has_issues":true,"pushed_at":"2011/04/05 09:22:26 -0700","fork":false,"size":1152,"has_downloads":true,"name":"blog","forks":1,"description":"Old jnrowe.github.com content that *may* be resurrected.","private":false,"created_at":"2011/04/05 09:21:16 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/sphinx-jnrowe","homepage":"","has_issues":true,"pushed_at":"2011/05/13 12:27:22 -0700","fork":false,"size":644,"has_downloads":true,"name":"sphinx-jnrowe","forks":1,"description":"My sphinx theme","private":false,"created_at":"2011/04/06 07:35:40 -0700"},{"watchers":15,"has_wiki":true,"owner":"Nic0","open_issues":3,"url":"https://github.com/Nic0/tyrs","homepage":"http://tyrs.nicosphere.net","has_issues":true,"pushed_at":"2011/06/07 19:41:57 -0700","fork":false,"size":436,"has_downloads":true,"language":"Python","name":"tyrs","forks":5,"description":"Twitter and Identica client using curses","private":false,"created_at":"2011/04/28 17:44:58 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/rdial","homepage":"","has_issues":true,"pushed_at":"2011/05/27 00:50:48 -0700","fork":false,"size":272,"has_downloads":true,"language":"Python","name":"rdial","forks":1,"description":"Simple time tracking for simple people","private":false,"created_at":"2011/05/09 06:04:35 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/vim-cute-python","homepage":"","has_issues":false,"pushed_at":"2011/05/30 08:39:21 -0700","fork":true,"size":180,"has_downloads":true,"language":"VimL","name":"vim-cute-python","forks":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","private":false,"created_at":"2011/05/22 23:21:28 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/develop.github.com","homepage":"http://develop.github.com","has_issues":false,"pushed_at":"2011/05/23 03:36:51 -0700","master_branch":"gh-pages","fork":true,"size":1584,"has_downloads":false,"language":"JavaScript","name":"develop.github.com","forks":0,"description":"API Documentation for GitHub","private":false,"created_at":"2011/05/23 03:32:46 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/requests","homepage":"http://python-requests.org","has_issues":false,"pushed_at":"2011/05/27 00:17:44 -0700","master_branch":"develop","fork":true,"size":2648,"has_downloads":true,"language":"Python","name":"requests","forks":0,"description":"Python HTTP Requests for Humans.","private":false,"created_at":"2011/05/27 00:16:23 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/restfulie-py","homepage":"http://github.com/caelum/restfulie-py","has_issues":false,"pushed_at":"2011/05/28 22:05:55 -0700","fork":true,"size":1794,"has_downloads":true,"language":"Python","name":"restfulie-py","forks":0,"description":"Python port of Restfulie","private":false,"created_at":"2011/05/28 22:04:51 -0700"},{"watchers":1,"has_wiki":true,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/tyrs","homepage":"http://tyrs.nicosphere.net","has_issues":false,"pushed_at":"2011/06/03 06:45:50 -0700","fork":true,"size":132,"has_downloads":true,"language":"Python","name":"tyrs","forks":0,"description":"twitter curses client","private":false,"created_at":"2011/06/03 02:42:16 -0700"},{"watchers":1,"has_wiki":false,"owner":"JNRowe","open_issues":0,"url":"https://github.com/JNRowe/gpxviewer","homepage":"http://andrewgee.org/blog/projects/gpxviewer","has_issues":false,"pushed_at":"2011/06/06 06:23:32 -0700","fork":true,"size":1040,"has_downloads":true,"language":"Python","name":"gpxviewer","forks":0,"description":"GPXViewer GPS trace viewer","private":false,"created_at":"2011/06/06 06:21:54 -0700"}]} \ No newline at end of file +{"repositories":[{"has_downloads":true,"url":"https://github.com/scrooloose/nerdtree","forks":77,"description":"hax0r vim script to give you a tree explorer","has_wiki":true,"fork":false,"open_issues":53,"homepage":"","size":396,"private":false,"has_issues":true,"pushed_at":"2011/08/05 07:49:20 -0700","name":"nerdtree","owner":"scrooloose","language":"VimL","watchers":1019,"created_at":"2008/03/10 00:34:08 -0700"},{"has_downloads":true,"url":"https://github.com/scrooloose/nerdcommenter","forks":42,"description":"Vim plugin for intensely orgasmic commenting","has_wiki":true,"fork":false,"open_issues":7,"homepage":"","size":404,"private":false,"has_issues":true,"pushed_at":"2011/07/21 17:36:40 -0700","name":"nerdcommenter","owner":"scrooloose","language":"VimL","watchers":368,"created_at":"2008/03/10 01:19:15 -0700"},{"has_downloads":true,"url":"https://github.com/timcharper/textile.vim","forks":11,"description":"Textile for VIM","has_wiki":true,"fork":false,"open_issues":3,"homepage":"http://www.vim.org/scripts/script.php?script_id=2305","size":332,"private":false,"has_issues":true,"pushed_at":"2011/07/29 00:56:52 -0700","name":"textile.vim","owner":"timcharper","language":"VimL","watchers":26,"created_at":"2008/07/21 03:55:46 -0700"},{"has_downloads":true,"url":"https://github.com/tpope/vim-surround","forks":36,"description":"surround.vim: quoting/parenthesizing made simple","has_wiki":false,"fork":false,"open_issues":9,"homepage":"http://www.vim.org/scripts/script.php?script_id=1697","size":188,"private":false,"has_issues":true,"pushed_at":"2011/07/16 07:10:23 -0700","name":"vim-surround","owner":"tpope","language":"VimL","watchers":406,"created_at":"2008/09/10 18:00:16 -0700"},{"has_downloads":false,"url":"https://github.com/tpope/vim-speeddating","forks":6,"description":"speeddating.vim: use CTRL-A/CTRL-X to increment dates, times, and more","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://www.vim.org/scripts/script.php?script_id=2120","size":148,"private":false,"has_issues":true,"pushed_at":"2010/12/28 20:46:52 -0800","name":"vim-speeddating","owner":"tpope","language":"VimL","watchers":51,"created_at":"2008/09/10 18:07:06 -0700"},{"has_downloads":false,"url":"https://github.com/sjbach/lusty","forks":17,"description":"LustyExplorer / LustyJuggler for Vim","has_wiki":true,"fork":false,"open_issues":10,"homepage":"http://www.vim.org/scripts/script.php?script_id=1890","size":1584,"private":false,"has_issues":true,"pushed_at":"2011/08/15 05:20:36 -0700","name":"lusty","owner":"sjbach","language":"VimL","watchers":94,"created_at":"2008/09/14 19:54:02 -0700"},{"has_downloads":false,"organization":"github","url":"https://github.com/github/develop.github.com","forks":49,"description":"API Documentation for GitHub","has_wiki":false,"fork":false,"open_issues":38,"homepage":"http://develop.github.com","size":292,"private":false,"has_issues":true,"pushed_at":"2011/08/09 16:01:16 -0700","name":"develop.github.com","owner":"github","language":"JavaScript","master_branch":"gh-pages","watchers":147,"created_at":"2009/02/17 15:51:23 -0800"},{"has_downloads":true,"url":"https://github.com/godlygeek/windowlayout","forks":0,"description":"A vim library for saving and restoring window layouts, plus demo plugins","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":296,"private":false,"has_issues":true,"pushed_at":"2009/02/26 08:46:15 -0800","name":"windowlayout","owner":"godlygeek","language":"VimL","watchers":3,"created_at":"2009/02/25 22:10:21 -0800"},{"has_downloads":true,"url":"https://github.com/godlygeek/tabular","forks":9,"description":"Vim script for text filtering and alignment","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":616,"private":false,"has_issues":true,"pushed_at":"2011/04/01 18:13:35 -0700","name":"tabular","owner":"godlygeek","language":"VimL","watchers":172,"created_at":"2009/03/02 22:19:16 -0800"},{"has_downloads":true,"url":"https://github.com/decklin/mnemosyne","forks":0,"description":"Static Python/Kid weblog generator with Maildir store","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://www.red-bean.com/decklin/mnemosyne/","size":344,"private":false,"has_issues":true,"pushed_at":"2009/03/10 10:25:52 -0700","name":"mnemosyne","owner":"decklin","watchers":2,"created_at":"2009/03/10 10:19:38 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/bfm","forks":3,"description":"This program is a dockapp-style CPU, memory, swap and load average monitor.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://www.jnrowe.ukfsn.org/projects/bfm.html","size":232,"private":false,"has_issues":true,"pushed_at":"2011/05/08 23:35:07 -0700","name":"bfm","owner":"JNRowe","integrate_branch":"iratqq","language":"C","watchers":3,"created_at":"2009/04/05 18:46:34 -0700"},{"has_downloads":true,"url":"https://github.com/ask/python-github2","forks":54,"description":"github client in python, with issues support.","has_wiki":true,"fork":false,"open_issues":5,"homepage":"http://packages.python.org/github2","size":456,"private":false,"has_issues":true,"pushed_at":"2011/07/29 19:04:58 -0700","name":"python-github2","owner":"ask","language":"Python","watchers":149,"created_at":"2009/04/18 08:31:12 -0700"},{"has_downloads":true,"url":"https://github.com/jsmits/github-cli","forks":13,"description":"A command-line interface to the GitHub Issues API v2.","has_wiki":true,"fork":false,"open_issues":6,"homepage":"http://packages.python.org/github-cli","size":172,"private":false,"has_issues":true,"pushed_at":"2011/06/24 05:32:16 -0700","name":"github-cli","owner":"jsmits","language":"Python","watchers":115,"created_at":"2009/04/19 02:05:27 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/upoints","forks":0,"description":"upoints is a collection of GPL v3 licensed modules for working with points on Earth, or other near spherical objects.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/upoints/","size":4640,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:43:42 -0700","name":"upoints","owner":"JNRowe","language":"Python","watchers":2,"created_at":"2009/04/23 04:06:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pyisbn","forks":2,"description":"A Python module for working with 10- and 13-digit ISBNs","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://packages.python.org/pyisbn/","size":132,"private":false,"has_issues":true,"pushed_at":"2011/06/06 07:04:57 -0700","name":"pyisbn","owner":"JNRowe","language":"Python","watchers":13,"created_at":"2009/04/23 04:07:25 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pytemplate","forks":0,"description":"Package template for Python, with distutils setup","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":2252,"private":false,"has_issues":true,"pushed_at":"2011/05/09 01:49:16 -0700","name":"pytemplate","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/04/23 04:09:02 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/misc-overlay","forks":0,"description":"Gentoo overlay -- miscellaneous packages","has_wiki":true,"fork":false,"open_issues":13,"homepage":"http://jnrowe.github.com/misc-overlay/","size":7777,"private":false,"has_issues":true,"pushed_at":"2011/08/11 11:46:23 -0700","name":"misc-overlay","owner":"JNRowe","language":"Python","watchers":5,"created_at":"2009/05/02 07:32:50 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/fixes-overlay","forks":0,"description":"Small package fixes languishing in the Gentoo BTS","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/fixes-overlay","size":3756,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:59:08 -0700","name":"fixes-overlay","owner":"JNRowe","language":"Python","master_branch":"master","watchers":1,"created_at":"2009/05/02 07:52:47 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/dotbash","forks":0,"description":"Shared bash configuration files","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1148,"private":false,"has_issues":true,"pushed_at":"2010/05/02 19:21:40 -0700","name":"dotbash","owner":"JNRowe","watchers":1,"created_at":"2009/05/08 04:18:15 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/jnrowe.github.com","forks":0,"description":"My user pages repository","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/","size":6636,"private":false,"has_issues":true,"pushed_at":"2011/07/09 11:32:30 -0700","name":"jnrowe.github.com","owner":"JNRowe","language":"JavaScript","master_branch":"master","watchers":2,"created_at":"2009/05/14 06:43:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/local-bin","forks":0,"description":"Tat from my ~/bin","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":656,"private":false,"has_issues":true,"pushed_at":"2011/06/20 08:39:36 -0700","name":"local-bin","owner":"JNRowe","language":"Shell","watchers":1,"created_at":"2009/05/14 11:09:34 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/termstyle","forks":1,"description":"a dirt-simple terminal-colour library for python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":564,"private":false,"has_issues":false,"pushed_at":"2010/09/24 21:10:10 -0700","name":"termstyle","owner":"JNRowe","watchers":2,"created_at":"2009/05/24 00:05:46 -0700"},{"has_downloads":true,"organization":"tweepy","url":"https://github.com/tweepy/tweepy","forks":140,"description":"A Python library for access the Twitter API","has_wiki":false,"fork":false,"open_issues":55,"homepage":"http://tweepy.github.com/","size":933,"private":false,"has_issues":true,"pushed_at":"2011/07/26 12:25:55 -0700","name":"tweepy","owner":"tweepy","language":"Python","watchers":742,"created_at":"2009/07/05 21:15:34 -0700"},{"has_downloads":true,"url":"https://github.com/ciaranm/inkpot","forks":3,"description":"Inkpot 88/256 Colour Scheme for Vim","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":124,"private":false,"has_issues":true,"pushed_at":"2009/11/27 15:42:40 -0800","name":"inkpot","owner":"ciaranm","language":"VimL","watchers":39,"created_at":"2009/07/06 09:24:19 -0700"},{"has_downloads":true,"url":"https://github.com/ciaranm/detectindent","forks":4,"description":"Vim script for automatically detecting indent settings","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":252,"private":false,"has_issues":true,"pushed_at":"2011/06/26 00:04:21 -0700","name":"detectindent","owner":"ciaranm","language":"VimL","watchers":21,"created_at":"2009/07/09 07:13:01 -0700"},{"has_downloads":true,"url":"https://github.com/ciaranm/securemodelines","forks":4,"description":"A secure alternative to Vim modelines","has_wiki":true,"fork":false,"open_issues":1,"homepage":"","size":104,"private":false,"has_issues":true,"pushed_at":"2011/02/06 04:47:00 -0800","name":"securemodelines","owner":"ciaranm","language":"VimL","watchers":16,"created_at":"2009/07/09 07:18:16 -0700"},{"has_downloads":false,"url":"https://github.com/flother/participationgraphs","forks":1,"description":"Django app with a template tag to allow you to include sparklines of the 52-week commit history for a project on Github","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://www.flother.com/blog/2009/django-github-sparklines/","size":628,"private":false,"has_issues":true,"pushed_at":"2010/09/25 03:57:52 -0700","name":"participationgraphs","owner":"flother","language":"Python","watchers":8,"created_at":"2009/07/15 05:07:51 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/readyset","forks":1,"description":"Ready-to-use Software Engineering Templates","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://readyset.tigris.org/","size":3216,"private":false,"has_issues":true,"pushed_at":"2011/03/04 18:49:12 -0800","name":"readyset","owner":"JNRowe","language":"JavaScript","watchers":1,"created_at":"2009/08/16 19:30:50 -0700"},{"has_downloads":true,"url":"https://github.com/spiiph/vim-space","forks":8,"description":"space.vim - Smart Space key for Vim","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":176,"private":false,"has_issues":true,"pushed_at":"2011/07/28 01:48:09 -0700","name":"vim-space","owner":"spiiph","language":"VimL","watchers":39,"created_at":"2009/08/17 05:27:00 -0700"},{"has_downloads":true,"organization":"saymedia","url":"https://github.com/saymedia/remoteobjects","forks":14,"description":"An object RESTational model","has_wiki":true,"fork":false,"open_issues":11,"homepage":"http://sixapart.github.com/remoteobjects/","size":336,"private":false,"has_issues":true,"pushed_at":"2011/04/19 09:58:32 -0700","name":"remoteobjects","owner":"saymedia","language":"Python","watchers":152,"created_at":"2009/08/18 11:26:38 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/cupage","forks":1,"description":"A tool to check for updates on web pages","has_wiki":true,"fork":false,"open_issues":3,"homepage":"http://jnrowe.github.com/cupage","size":612,"private":false,"has_issues":true,"pushed_at":"2011/07/17 10:23:45 -0700","name":"cupage","owner":"JNRowe","language":"Python","watchers":3,"created_at":"2009/09/17 21:03:02 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/pages_layouts","forks":1,"description":"Shared layouts submodule for jekyll","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1948,"private":false,"has_issues":true,"pushed_at":"2011/02/28 05:02:24 -0800","name":"pages_layouts","owner":"JNRowe","watchers":1,"created_at":"2009/09/24 18:42:48 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/bwatch","forks":1,"description":"Simple bandwidth watching tool","has_wiki":true,"fork":false,"open_issues":2,"homepage":"http://jnrowe.github.com/bwatch/","size":2328,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:14:25 -0700","name":"bwatch","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/09/26 10:13:56 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/bleeter","forks":1,"description":"Nasty little twitter client","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://jnrowe.github.com/bleeter/","size":3544,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:17:05 -0700","name":"bleeter","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2009/10/14 22:19:25 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/oh-my-zsh","forks":1,"description":"A community-driven framework for managing your zsh configuration.","has_wiki":false,"fork":true,"open_issues":0,"homepage":"","size":416,"private":false,"has_issues":true,"pushed_at":"2011/05/26 02:55:49 -0700","name":"oh-my-zsh","owner":"JNRowe","language":"Shell","master_branch":"master","watchers":1,"created_at":"2009/10/28 13:13:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/vim-configs","forks":1,"description":"Personal vim configs","has_wiki":true,"fork":false,"open_issues":2,"homepage":"http://jnrowe.github.com/vim-configs","size":3756,"private":false,"has_issues":true,"pushed_at":"2011/08/11 11:35:34 -0700","name":"vim-configs","owner":"JNRowe","language":"VimL","watchers":3,"created_at":"2009/11/12 06:10:53 -0800"},{"has_downloads":true,"url":"https://github.com/baruch/notmuch-gtk","forks":1,"description":"A Gtk+ interface to the notmuch mail client, not maintained anymore, I switched to gmail instead.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://baruch.github.com/notmuch-gtk","size":1638,"private":false,"has_issues":true,"pushed_at":"2009/11/28 15:42:12 -0800","name":"notmuch-gtk","owner":"baruch","watchers":3,"created_at":"2009/11/26 07:59:04 -0800"},{"has_downloads":true,"url":"https://github.com/c9s/gsession.vim","forks":5,"description":"gsession.vim saves your session files into the same directory (~/.vim/session/) by default. and auto-detect your session file to load session file when you are opening vim editor without arguments.","has_wiki":true,"fork":false,"open_issues":2,"size":184,"private":false,"has_issues":true,"pushed_at":"2011/08/15 02:47:50 -0700","name":"gsession.vim","owner":"c9s","language":"Visual Basic","watchers":11,"created_at":"2009/12/07 06:31:08 -0800"},{"has_downloads":false,"url":"https://github.com/tpope/vim-pathogen","forks":27,"description":"pathogen.vim: manage your runtimepath","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://www.vim.org/scripts/script.php?script_id=2332","size":200,"private":false,"has_issues":true,"pushed_at":"2011/08/13 09:25:10 -0700","name":"vim-pathogen","owner":"tpope","language":"VimL","watchers":690,"created_at":"2009/12/13 12:59:18 -0800"},{"has_downloads":true,"url":"https://github.com/godlygeek/colorchart","forks":1,"description":"Provides an interactive color chart from examining terminal color palettes in vim","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":480,"private":false,"has_issues":true,"pushed_at":"2010/09/25 18:11:09 -0700","name":"colorchart","owner":"godlygeek","language":"VimL","watchers":4,"created_at":"2009/12/21 00:35:24 -0800"},{"has_downloads":true,"url":"https://github.com/tpope/vim-ragtag","forks":16,"description":"ragtag.vim: ghetto HTML/XML mappings (formerly allml.vim)","has_wiki":true,"fork":false,"open_issues":2,"homepage":"http://www.vim.org/scripts/script.php?script_id=1896","size":156,"private":false,"has_issues":true,"pushed_at":"2011/08/04 19:34:07 -0700","name":"vim-ragtag","owner":"tpope","language":"VimL","watchers":94,"created_at":"2010/01/17 17:04:48 -0800"},{"has_downloads":true,"url":"https://github.com/nvie/gitflow","forks":157,"description":"Git extensions to provide high-level repository operations for Vincent Driessen's branching model.","has_wiki":true,"fork":false,"open_issues":54,"homepage":"http://nvie.com/posts/a-successful-git-branching-model/","size":4654,"private":false,"has_issues":true,"pushed_at":"2011/07/27 00:56:18 -0700","name":"gitflow","owner":"nvie","integrate_branch":"develop","language":"Shell","master_branch":"develop","watchers":2422,"created_at":"2010/01/20 15:14:12 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/surfraw","forks":1,"description":"Mirror of the upstream git repository","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://surfraw.alioth.debian.org/","size":4876,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:34:59 -0700","name":"surfraw","owner":"JNRowe","language":"Shell","watchers":3,"created_at":"2010/01/26 03:49:55 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/blanco","forks":1,"description":"Hey, remember me?","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://jnrowe.github.com/blanco","size":4296,"private":false,"has_issues":true,"pushed_at":"2011/06/23 11:19:45 -0700","name":"blanco","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2010/01/31 13:04:51 -0800"},{"has_downloads":false,"url":"https://github.com/JNRowe/vim-jnrowe","forks":1,"description":"My colorscheme, decoupled from my vim-configs repo for others ;)","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/vim-jnrowe/","size":1244,"private":false,"has_issues":true,"pushed_at":"2011/06/23 09:25:27 -0700","name":"vim-jnrowe","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2010/02/11 17:12:11 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/emacs-configs","forks":1,"description":"Personal emacs configs","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1884,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:38:11 -0700","name":"emacs-configs","owner":"JNRowe","language":"Emacs Lisp","watchers":1,"created_at":"2010/02/15 12:19:22 -0800"},{"has_downloads":true,"url":"https://github.com/rc0/mairix","forks":6,"description":"mairix is a program for indexing and searching email messages stored in Maildir, MH or mbox folders","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://www.rc0.org.uk/mairix","size":140,"private":false,"has_issues":true,"pushed_at":"2011/07/29 16:53:31 -0700","name":"mairix","owner":"rc0","language":"C","watchers":21,"created_at":"2010/03/05 14:34:27 -0800"},{"has_downloads":true,"url":"https://github.com/rc0/spill","forks":1,"description":"spill is a program for creating set of symbolic links from one directory hierarchy which point to corresponding filenames in a separate directory hierarchy.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://www.rc0.org.uk/spill","size":252,"private":false,"has_issues":true,"pushed_at":"2011/05/17 15:52:40 -0700","name":"spill","owner":"rc0","language":"C","watchers":3,"created_at":"2010/03/06 13:28:55 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/tweepy","forks":1,"description":"A python library for the Twitter API. OAuth, python 3, complete coverage, streaming API","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://joshthecoder.github.com/tweepy","size":536,"private":false,"has_issues":true,"pushed_at":"2010/04/02 19:09:52 -0700","name":"tweepy","owner":"JNRowe","watchers":1,"created_at":"2010/03/31 14:57:29 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/snipmate.vim","forks":1,"description":"snipMate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim. ","has_wiki":false,"fork":true,"open_issues":0,"homepage":"www.vim.org/scripts/script.php?script_id=2540","size":248,"private":false,"has_issues":false,"pushed_at":"2011/01/27 03:16:30 -0800","name":"snipmate.vim","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2010/04/05 20:56:06 -0700"},{"has_downloads":true,"url":"https://github.com/zacharyvoase/urlobject","forks":3,"description":"Python library for manipulating URLs (and some URIs) in a more natural way.","has_wiki":true,"fork":false,"open_issues":3,"homepage":"","size":808,"private":false,"has_issues":true,"pushed_at":"2011/06/28 01:15:22 -0700","name":"urlobject","owner":"zacharyvoase","language":"Python","watchers":17,"created_at":"2010/04/08 06:44:42 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/winwrangler","forks":1,"description":"Mirror of the upstream failpad source, converted for Matt","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/2010/04/04/FtO-winwrangler_tiling_for_the_masses.html","size":276,"private":false,"has_issues":true,"pushed_at":"2010/05/05 00:55:01 -0700","name":"winwrangler","owner":"JNRowe","watchers":1,"created_at":"2010/05/05 00:54:23 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/reverend","forks":1,"description":"Reverend - Simple Bayesian classifier","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://divmod.org/trac/wiki/DivmodReverend","size":420,"private":false,"has_issues":true,"pushed_at":"2010/05/06 11:10:51 -0700","name":"reverend","owner":"JNRowe","watchers":1,"created_at":"2010/05/06 10:58:58 -0700"},{"has_downloads":true,"url":"https://github.com/andrewgee/gpxviewer","forks":4,"description":"GPXViewer GPS trace viewer","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://andrewgee.org/blog/projects/gpxviewer","size":1044,"private":false,"has_issues":false,"pushed_at":"2011/06/06 06:29:23 -0700","name":"gpxviewer","owner":"andrewgee","language":"Python","watchers":4,"created_at":"2010/05/16 02:56:55 -0700"},{"has_downloads":true,"url":"https://github.com/c9s/fontselector.vim","forks":1,"description":"font select plugin for gvim.","has_wiki":true,"fork":false,"open_issues":0,"size":248,"private":false,"has_issues":true,"pushed_at":"2010/10/02 05:46:45 -0700","name":"fontselector.vim","owner":"c9s","language":"VimL","watchers":4,"created_at":"2010/08/06 00:40:51 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/github-cli","forks":0,"description":"A command-line interface to the GitHub Issues API v2.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://packages.python.org/github-cli","size":916,"private":false,"has_issues":false,"pushed_at":"2010/11/02 10:42:20 -0700","name":"github-cli","owner":"JNRowe","watchers":1,"created_at":"2010/09/15 08:21:44 -0700"},{"has_downloads":true,"url":"https://github.com/sjl/gundo.vim","forks":20,"description":"A git mirror of gundo.vim","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://sjl.bitbucket.org/gundo.vim/","size":464,"private":false,"has_issues":false,"pushed_at":"2011/08/08 14:07:33 -0700","name":"gundo.vim","owner":"sjl","language":"VimL","watchers":166,"created_at":"2010/10/09 09:31:25 -0700"},{"has_downloads":true,"url":"https://github.com/ehamberg/vim-cute-python","forks":9,"description":"Unicode goodness for Python code by using vim's “conceal” feature","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":120,"private":false,"has_issues":true,"pushed_at":"2011/07/10 03:44:07 -0700","name":"vim-cute-python","owner":"ehamberg","language":"VimL","watchers":42,"created_at":"2010/10/19 13:23:10 -0700"},{"has_downloads":true,"organization":"caelum","url":"https://github.com/caelum/restfulie-py","forks":7,"description":"Python port of Restfulie","has_wiki":true,"fork":false,"open_issues":1,"homepage":"http://github.com/caelum/restfulie-py","size":146,"private":false,"has_issues":true,"pushed_at":"2011/07/26 20:10:12 -0700","name":"restfulie-py","owner":"caelum","language":"Python","watchers":27,"created_at":"2010/10/25 04:23:23 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/python-github2","forks":0,"description":"github client in python, with issues support.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":144,"private":false,"has_issues":false,"pushed_at":"2011/07/12 09:55:46 -0700","name":"python-github2","owner":"JNRowe","language":"Python","watchers":3,"created_at":"2010/10/31 01:03:09 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/hubugs","forks":1,"description":"Simple client for GitHub issues","has_wiki":true,"fork":false,"open_issues":5,"homepage":"http://packages.python.org/hubugs/","size":3356,"private":false,"has_issues":true,"pushed_at":"2011/07/14 11:41:45 -0700","name":"hubugs","owner":"JNRowe","language":"Python","watchers":2,"created_at":"2010/10/31 09:27:05 -0700"},{"has_downloads":true,"url":"https://github.com/hsitz/VimOrganizer","forks":17,"description":"-- partial clone of Emacs' Org-mode -- please use development branch for newest changes ","has_wiki":true,"fork":false,"open_issues":8,"homepage":"http://vimeo.com/17182850 ","size":540,"private":false,"has_issues":true,"pushed_at":"2011/04/27 20:03:17 -0700","name":"VimOrganizer","owner":"hsitz","language":"VimL","watchers":223,"created_at":"2010/11/09 13:33:13 -0800"},{"has_downloads":true,"url":"https://github.com/j4mie/micromodels","forks":8,"description":"Declarative dictionary-based model classes for Python","has_wiki":true,"fork":false,"open_issues":1,"homepage":"","size":336,"private":false,"has_issues":true,"pushed_at":"2011/02/24 00:46:32 -0800","name":"micromodels","owner":"j4mie","integrate_branch":"develop","language":"Python","watchers":26,"created_at":"2010/12/08 16:21:15 -0800"},{"has_downloads":true,"url":"https://github.com/catch22/pw","forks":2,"description":"Grep GPG-encrypted YAML password safes.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":202,"private":false,"has_issues":true,"pushed_at":"2011/05/17 12:21:16 -0700","name":"pw","owner":"catch22","language":"Python","watchers":2,"created_at":"2010/12/18 05:32:17 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/snipmate-snippets","forks":0,"description":"A collection of snippets for snipmate (vim plugin) with a focus on bash, php, html and javascript","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":956,"private":false,"has_issues":false,"pushed_at":"2011/05/17 06:22:45 -0700","name":"snipmate-snippets","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2011/01/27 03:05:32 -0800"},{"has_downloads":true,"url":"https://github.com/gabrielfalcao/HTTPretty","forks":3,"description":"HTTP client mocking tool for Python","has_wiki":true,"fork":false,"open_issues":3,"homepage":"","size":184,"private":false,"has_issues":true,"pushed_at":"2011/06/30 13:04:40 -0700","name":"HTTPretty","owner":"gabrielfalcao","language":"Python","watchers":9,"created_at":"2011/01/28 06:59:02 -0800"},{"has_downloads":true,"organization":"github","url":"https://github.com/github/dmca","forks":8,"description":"DMCA takedowns GitHub has received","has_wiki":false,"fork":false,"open_issues":0,"homepage":"http://help.github.com/dmca","size":136,"private":false,"has_issues":false,"pushed_at":"2011/07/03 12:25:15 -0700","name":"dmca","owner":"github","watchers":438,"created_at":"2011/01/28 15:58:38 -0800"},{"has_downloads":true,"url":"https://github.com/passy/nose-lettuce","forks":1,"description":"A probably bad idea of how to run lettuce from nose","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":248,"private":false,"has_issues":true,"pushed_at":"2011/01/31 13:18:55 -0800","name":"nose-lettuce","owner":"passy","language":"Python","watchers":4,"created_at":"2011/01/31 13:04:03 -0800"},{"has_downloads":true,"organization":"caffeinehit","url":"https://github.com/caffeinehit/hammertime","forks":2,"description":"Time tracking with git","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://github.com/caffeinehit/hammertime","size":140,"private":false,"has_issues":true,"pushed_at":"2011/02/03 02:40:25 -0800","name":"hammertime","owner":"caffeinehit","language":"Python","watchers":6,"created_at":"2011/02/02 02:18:33 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/hammertime","forks":0,"description":"Time tracking with git","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://github.com/caffeinehit/hammertime","size":720,"private":false,"has_issues":false,"pushed_at":"2011/02/02 09:54:18 -0800","name":"hammertime","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/02 09:49:21 -0800"},{"has_downloads":true,"url":"https://github.com/kennethreitz/requests","forks":55,"description":"Python HTTP Requests for Humans™.","has_wiki":false,"fork":false,"open_issues":21,"homepage":"http://python-requests.org","size":604,"private":false,"has_issues":true,"pushed_at":"2011/08/15 08:04:00 -0700","name":"requests","owner":"kennethreitz","language":"Python","master_branch":"develop","watchers":659,"created_at":"2011/02/13 10:38:17 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/versionah","forks":1,"description":"Simple version number mangler","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/versionah/","size":4504,"private":false,"has_issues":true,"pushed_at":"2011/08/11 09:35:57 -0700","name":"versionah","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/15 08:51:56 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/issues-test","forks":1,"description":"Repo for testing hubugs","has_wiki":true,"fork":false,"open_issues":8,"homepage":"","size":0,"private":false,"has_issues":true,"name":"issues-test","owner":"JNRowe","watchers":1,"created_at":"2011/02/22 13:00:23 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/pelican","forks":0,"description":"Static blog generator in python, using ReST syntax","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://docs.notmyidea.org/alexis/pelican/","size":3916,"private":false,"has_issues":false,"pushed_at":"2011/04/04 21:22:46 -0700","name":"pelican","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/02/23 21:20:07 -0800"},{"has_downloads":true,"url":"https://github.com/dcramer/decruft","forks":8,"description":"python-readability, but faster (mirror-ish)","has_wiki":true,"fork":false,"open_issues":3,"homepage":"http://code.google.com/p/decruft/","size":588,"private":false,"has_issues":true,"pushed_at":"2011/08/11 14:19:19 -0700","name":"decruft","owner":"dcramer","language":"Python","watchers":26,"created_at":"2011/02/28 18:07:04 -0800"},{"has_downloads":true,"url":"https://github.com/JNRowe/pw","forks":0,"description":"Grep GPG-encrypted YAML password safes.","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":132,"private":false,"has_issues":false,"pushed_at":"2011/04/04 23:44:42 -0700","name":"pw","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/04/04 23:37:38 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/shell-doctest","forks":1,"description":"shelldoctest is Doctest/UnitTest for shell (mirror of Google Code project)","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://code.google.com/p/shell-doctest/","size":128,"private":false,"has_issues":true,"pushed_at":"2011/04/05 05:32:44 -0700","name":"shell-doctest","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/04/05 05:32:07 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/blog","forks":1,"description":"Old jnrowe.github.com content that *may* be resurrected.","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://jnrowe.github.com/blog","size":1152,"private":false,"has_issues":true,"pushed_at":"2011/04/05 09:22:26 -0700","name":"blog","owner":"JNRowe","watchers":1,"created_at":"2011/04/05 09:21:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/sphinx-jnrowe","forks":1,"description":"My sphinx theme","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":644,"private":false,"has_issues":true,"pushed_at":"2011/05/13 12:27:22 -0700","name":"sphinx-jnrowe","owner":"JNRowe","watchers":1,"created_at":"2011/04/06 07:35:40 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/rdial","forks":1,"description":"Simple time tracking for simple people","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":1688,"private":false,"has_issues":true,"pushed_at":"2011/08/11 07:49:36 -0700","name":"rdial","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/05/09 06:04:35 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/vim-cute-python","forks":0,"description":"Unicode goodness for Python code by using vim's new “conceal” feature","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":112,"private":false,"has_issues":false,"pushed_at":"2011/07/18 06:01:30 -0700","name":"vim-cute-python","owner":"JNRowe","language":"VimL","watchers":1,"created_at":"2011/05/22 23:21:28 -0700"},{"has_downloads":false,"url":"https://github.com/JNRowe/develop.github.com","forks":0,"description":"API Documentation for GitHub","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://develop.github.com","size":1584,"private":false,"has_issues":false,"pushed_at":"2011/05/23 03:36:51 -0700","name":"develop.github.com","owner":"JNRowe","language":"JavaScript","master_branch":"gh-pages","watchers":1,"created_at":"2011/05/23 03:32:46 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/requests","forks":0,"description":"Python HTTP Requests for Humans.","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://python-requests.org","size":2648,"private":false,"has_issues":false,"pushed_at":"2011/05/27 00:17:44 -0700","name":"requests","owner":"JNRowe","language":"Python","master_branch":"develop","watchers":1,"created_at":"2011/05/27 00:16:23 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/restfulie-py","forks":0,"description":"Python port of Restfulie","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://github.com/caelum/restfulie-py","size":1794,"private":false,"has_issues":false,"pushed_at":"2011/05/28 22:05:55 -0700","name":"restfulie-py","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/05/28 22:04:51 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/tyrs","forks":0,"description":"twitter curses client","has_wiki":true,"fork":true,"open_issues":0,"homepage":"http://tyrs.nicosphere.net","size":132,"private":false,"has_issues":false,"pushed_at":"2011/06/03 06:45:50 -0700","name":"tyrs","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/03 02:42:16 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/gpxviewer","forks":0,"description":"GPXViewer GPS trace viewer","has_wiki":false,"fork":true,"open_issues":0,"homepage":"http://andrewgee.org/blog/projects/gpxviewer","size":1040,"private":false,"has_issues":false,"pushed_at":"2011/06/06 06:23:32 -0700","name":"gpxviewer","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/06 06:21:54 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/dwm","forks":1,"description":"The dwm codebase I run","has_wiki":true,"fork":false,"open_issues":0,"homepage":"http://dwm.suckless.org/","size":1084,"private":false,"has_issues":true,"pushed_at":"2011/06/24 09:18:06 -0700","name":"dwm","owner":"JNRowe","language":"C","master_branch":"jnrowe","watchers":1,"created_at":"2011/06/21 23:57:57 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/micromodels","forks":0,"description":"Declarative dictionary-based model classes for Python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":368,"private":false,"has_issues":false,"pushed_at":"2011/06/22 00:29:06 -0700","name":"micromodels","owner":"JNRowe","integrate_branch":"develop","language":"Python","watchers":1,"created_at":"2011/06/22 00:27:17 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/HTTPretty","forks":0,"description":"HTTP client mocking tool for Python","has_wiki":true,"fork":true,"open_issues":0,"homepage":"","size":172,"private":false,"has_issues":false,"pushed_at":"2011/06/30 12:24:07 -0700","name":"HTTPretty","owner":"JNRowe","language":"Python","watchers":1,"created_at":"2011/06/30 12:19:33 -0700"},{"has_downloads":true,"url":"https://github.com/JNRowe/thinote","forks":1,"description":"Move along","has_wiki":true,"fork":false,"open_issues":0,"homepage":"","size":96,"private":false,"has_issues":true,"pushed_at":"2011/07/15 12:10:38 -0700","name":"thinote","owner":"JNRowe","watchers":1,"created_at":"2011/07/15 12:09:17 -0700"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 b/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 index d6277ad..6f55fbb 100644 --- a/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 +++ b/tests/data/github.com,api,v2,json,user,email,jnrowe%40gmail.com,c8f8e10dbb3704bcbda62ab4de5a69e6 @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 58 +status: 200 +x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/user/email/jnrowe%40gmail.com +-content-encoding: gzip connection: keep-alive content-length: 370 -server: nginx/0.7.67 -x-runtime: 11ms +server: nginx/1.0.4 +x-runtime: 14ms x-ratelimit-limit: 60 -etag: "56cf9af8aa57da3ccc78fc91d6df4565" +etag: "9732b2f0e3b43cd609879ca8ebc6d5db" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 04:42:13 GMT +date: Mon, 15 Aug 2011 19:53:32 GMT content-type: application/json; charset=utf-8 -{"user":{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","company":null,"name":"James Rowe","created_at":"2009/03/08 14:53:38 -0700","location":"Cambridge, UK","public_repo_count":38,"public_gist_count":64,"blog":"http://jnrowe.github.com/","following_count":5,"id":61381,"type":"User","permission":null,"followers_count":6,"login":"JNRowe","email":"jnrowe@gmail.com"}} \ No newline at end of file +{"user":{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","company":null,"name":"James Rowe","created_at":"2009/03/08 14:53:38 -0700","location":"Cambridge, UK","public_repo_count":48,"public_gist_count":64,"blog":"http://jnrowe.github.com/","following_count":5,"id":61381,"type":"User","permission":null,"followers_count":6,"login":"JNRowe","email":"jnrowe@gmail.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e b/tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e deleted file mode 100644 index 8b8fbb8..0000000 --- a/tests/data/github.com,api,v2,json,user,follow,defunkt,access_token=xxx,5670385849f9826634ee63e74bcac43e +++ /dev/null @@ -1,14 +0,0 @@ -status: 200 -x-ratelimit-remaining: 58 -content-location: https://github.com/api/v2/json/user/show/mojombo?access_token=xxx -x-runtime: 23ms -content-length: 63 -server: nginx/0.7.67 -connection: keep-alive -x-ratelimit-limit: 60 -etag: "45a6fa1730ba70b40ccd595130b2390e" -cache-control: private, max-age=0, must-revalidate -date: Mon, 11 Apr 2011 14:46:22 GMT -content-type: application/json; charset=utf-8 - -{"users":["c9s","mitsuhiko","seemant","ask","tpope","defunkt"]} diff --git a/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc b/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc new file mode 100644 index 0000000..d03d4dd --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,follow,defunkt,eb59ee564b4598ac4a39c71474b539fc @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 60 +content-location: https://github.com/api/v2/json/user/follow/defunkt?access_token=xxx +x-runtime: 20ms +content-length: 76 +server: nginx/1.0.4 +connection: keep-alive +x-ratelimit-limit: 59 +etag: "051be0232ef98376d11462e632211b9d" +cache-control: private, max-age=0, must-revalidate +date: Thu, 25 Aug 2011 07:18:50 GMT +content-type: application/json; charset=utf-8 + +{"users":["c9s","mitsuhiko","seemant","ask","tpope","defunkt"]} diff --git a/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 b/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 index 45dc2b0..e190673 100644 --- a/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 +++ b/tests/data/github.com,api,v2,json,user,search,James%2BRowe,95221a552352bf0535e2445659dc9ed5 @@ -1,14 +1,15 @@ -status: 304 +status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/user/search/James%2BRowe -content-length: 847 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 847 +server: nginx/1.0.4 +x-runtime: 6029ms x-ratelimit-limit: 60 -etag: "f4b69010d01df911cd62a2c2eef3d71f" +etag: "e26a4abb93b2131fe3f9a29d3b3700d1" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 04:42:12 GMT +date: Mon, 15 Aug 2011 19:57:56 GMT content-type: application/json; charset=utf-8 -x-runtime: 10ms -{"users":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","name":"James Rowe","created_at":"2009-03-08T21:53:38Z","location":"Cambridge, UK","public_repo_count":38,"followers":6,"fullname":"James Rowe","username":"JNRowe","language":"Python","id":"user-61381","repos":38,"type":"user","followers_count":6,"pushed":"2011-05-21T06:15:08.703Z","login":"JNRowe","score":4.247995,"record":null,"created":"2009-03-08T21:53:38Z"},{"gravatar_id":"e70f90f2a6985553d18fa39b90d9db6f","name":"James Rowe","created_at":"2008-11-18T10:39:10Z","location":"Guernsey, Channel Islands","public_repo_count":2,"followers":1,"fullname":"James Rowe","language":"Ruby","username":"wooki","id":"user-35166","repos":2,"type":"user","followers_count":1,"pushed":"2011-05-13T19:15:09.524Z","login":"wooki","score":4.247995,"record":null,"created":"2008-11-18T10:39:10Z"}]} \ No newline at end of file +{"users":[{"gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","name":"James Rowe","created_at":"2009-03-08T21:53:38Z","location":"Cambridge, UK","public_repo_count":48,"followers":6,"fullname":"James Rowe","username":"JNRowe","language":"Python","id":"user-61381","repos":48,"type":"user","followers_count":6,"pushed":"2011-08-11T15:15:16.791Z","login":"JNRowe","score":4.108372,"record":null,"created":"2009-03-08T21:53:38Z"},{"gravatar_id":"e70f90f2a6985553d18fa39b90d9db6f","name":"James Rowe","created_at":"2008-11-18T10:39:10Z","location":"Guernsey, Channel Islands","public_repo_count":2,"followers":1,"fullname":"James Rowe","username":"wooki","language":"Ruby","id":"user-35166","repos":2,"type":"user","followers_count":1,"pushed":"2011-07-26T09:15:15.818Z","login":"wooki","score":4.108372,"record":null,"created":"2008-11-18T10:39:10Z"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c index 3a94ea7..f8dbc00 100644 --- a/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,379cb3d60bbce3d9b30e6e6aae66840c @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 56 +status: 200 +x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/user/show/defunkt +-content-encoding: gzip connection: keep-alive content-length: 386 -server: nginx/0.7.67 -x-runtime: 16ms +server: nginx/1.0.4 +x-runtime: 364ms x-ratelimit-limit: 60 -etag: "144f668d7265bcd9d61bc1fb91e9caeb" +etag: "198bc0b6ce2cf5d8b6f08519418c9d25" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 04:32:12 GMT +date: Mon, 15 Aug 2011 19:53:45 GMT content-type: application/json; charset=utf-8 -{"user":{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":90,"public_gist_count":277,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":2593,"login":"defunkt","email":"chris@wanstrath.com"}} \ No newline at end of file +{"user":{"gravatar_id":"b8dbb1987e8e5318584865f880036796","company":"GitHub","name":"Chris Wanstrath","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":93,"public_gist_count":278,"blog":"http://chriswanstrath.com/","following_count":212,"id":2,"type":"User","permission":null,"followers_count":3402,"login":"defunkt","email":"chris@wanstrath.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 b/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 index 9370134..3c430cf 100644 --- a/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,followers,aba15090598242283ff9d4a8b5969f52 @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 59 +status: 200 +x-ratelimit-remaining: 57 content-location: https://github.com/api/v2/json/user/show/defunkt/followers +-content-encoding: gzip connection: keep-alive -content-length: 29004 -server: nginx/0.7.67 -x-runtime: 214ms +content-length: 38576 +server: nginx/1.0.4 +x-runtime: 425ms x-ratelimit-limit: 60 -etag: "e5fafda9776b6ebe037bc5cea456ca6a" +etag: "1645986748f488c8193ded0a4713814e" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 04:32:08 GMT +date: Mon, 15 Aug 2011 19:53:47 GMT content-type: application/json; charset=utf-8 -{"users":["jnewland","pjhyett","cnix","dustym","choonkeat","nakajima","mtodd","bumi","takeo","bmizerany","zachinglis","evilchelu","manalang","mmmurf","hornbeck","mindy","therealadam","vanpelt","alexcharlie","seaofclouds","luke0x","rphillips","Caged","kamal","eventualbuddha","bigfleet","jacques","tim","KirinDave","ddemaree","benschwarz","cpjolicoeur","mmcgrana","mdarby","anildigital","ryanahamilton","entangledstate","coty","broughcut","atduskgreg","liz","brianleroux","kballard","haraldmartin","walf443","ss","elliottcable","joshuabates","eastmedia","mattman","imajes","saimonmoore","hoverbird","Fil","nesquena","membogg","ayn","jbritten","peterba","nick","willcodeforfoo","mojombo","rsl","caffo","khigia","BrianTheCoder","tkofol","dstrelau","sant0sk1","joshuaclayton","cee-dub","tooeasy","quirkey","eduardo","raja","timshadel","rsanheim","tokumine","statik","mattly","xilo32","yaroslav","sr","hchoroomi","lgn21st","purzelrakete","seven1m","douglasjarquin","ihower","freels","adamstac","fauxparse","duncanbeevers","jasonwatkinspdx","spohlenz","joaovitor","mikedamage","alainravet","whomwah","ooodigi","nerdrocket","zmack","mulder","kivanio","vlandham","yizzreel","ryanb","cho45","sandro","ratchetcat","jgross","jasherai","jw-00000","zubin","loe","fred","stuartsaunders","skippy","dgiunta","monde","charlenopires","devn","softprops","madx","lukebayes","blech75","newtonapple","edbond","ncr","boboroshi","holtonma","jhubert","libin","bastos","nullobject","croaky","trevorturk","fabioespindula","nick-b","sikachu","schacon","harper","envoked","guitsaru","brianmario","subwindow","Arthur","sob","tiagowhite","jasontorres","lawrencecurtis","bterlson","mattsears","patrickdet","academician","markpuck","mokolabs","baron","arikan","ryanking","willemderu","entombedvirus","cyx","galfert","heycarsten","shallwelin","sbfaulkner","jaehess","jonathannelson","helo","schwabsauce","gusgollings","adzap","joefiorini","trestrantham","hairballopolis","daveliu","thetacom","genki","guillermo","tekin","nextmat","hans","colin","Roman2K","kakutani","qrush","hpoydar","goodtouch","LimeHat","grobie","tosh","epitron","inkdeep","voitto","kvnsmth","darrenhinderer","njonsson","bianster","shanesveller","technicalpickles","erikj","lancecarlson","briandoll","digitalextremist","KevBurnsJr","slim","clarkware","jasoncarter","Krishna","kirk","tinogomes","wfarr","intabulas","hardbap","aziz","atmos","robbyrussell","codeslinger","evandrodutra","martinisoft","smtlaissezfaire","larrywright","joshknowles","evanwalsh","jchris","jqr","jbarnette","rafaelss","dsboulder","res0nat0r","sunfmin","topfunky","NigelThorne","supaspoida","yipstar","davidwparker","jinzhu","johnpaulashenfelter","joshua","agile","cored","visnup","calendaraboutnothing","eoin","deepak","dsparling","oleganza","pengwynn","christophermoura","jgagne33","mhutchin","matsuda","zak","railssummit","taylorrf","peleteiro","greatseth","blackwinter","rberger","elim","eric","collin","henryhamon","shinzui","tongueroo","vanntastic","swdyh","peterpunk","kabnot","ozeias","mwilliams","kamipo","bezugen","arthurgeek","fairos","webmat","bonachela","foysavas","mojodna","dwabnitz","fuzzytone","anthonybarone","mkhl","botanicus","kavu","jhsu","delameko","uhhuhyeah","jcf","nrk","brycethornton","maxdevel","ashleyw","zegomesjf","rjspotter","tjweir","slawcup","pjdavis","ngerakines","rwc9u","aka47","Bregor","oristian","JackDanger","amatsuda","josespinal","sleistner","jdp","mkrisher","rbarazi","mattmatt","luisbebop","rcrowley","anotherjesse","semikolon","albertoperdomo","kaikuehne","marcric","pardel","rads","altamic","badcarl","Marat","rfwatson","jesseclark","iamwilhelm","rtyler","kovacs","alexvollmer","rkh","joelparkerhenderson","shayfrendt","pcalcado","marcelinollano","jngo","robertpfeiffer","ukd1","jpablobr","alfredwesterveld","matthewford","haws","visionmedia","ekinci","hellekin","paulgrunt","seouri","pauldix","CodeOfficer","manuelmeurer","kristopher","mattyoho","neilmock","igorgue","miyagawa","akm","ieure","mwunsch","kairichard","leah","Siansor","kiko","breily","elmer","vshih","samsoffes","graysky","leandrosilva","blinton","ashchristopher","bensie","yura","adamaig","erotte","fernholz","jamesrose","michaeldv","raganw","sstephenson","capotej","BeamerCola","damon","amiel","iamstillalive","rduarte","jney","rymai","jtadeulopes","caironoleto","talboito","alexmchale","davglass","lian","rondevera","shashi","dira","GreenDragon","yonkeltron","jeanmartin","shelling","tehcurtis","gnlnx","joshng","bartuer","bruce","adamv","yasu","cjmartin","jarodl","jonatas","ronnieliew","polly","nonsequitur","marclove","arya","splattael","mcfearsome","skorecky","jaygooby","iande","brosner","brett","jivko","cmelbye","edwingo","hunab","zipme","mnaberez","nimo","justinlilly","howiworkdaily","johnbender","jezdez","petercoulton","juliend2","dhou","enricob","gigamo","markstephenson","gregnewman","rubify","spagalloco","Xac","attack","esycat","webiest","ogijun","travisjeffery","moongtook","meritt","stephencelis","doowttam","mrchrisadams","riethmayer","utahcreative","bkrsta","program247365","montylounge","renatocarvalho","NYiPhoneDeveloper","novas0x2a","rblackwe","basiszwo","deminew","stan","sgarza","epocRepo","georgi","radamant","munjal","jgchristopher","macro","Gig23","diogenesis","poshboytl","pablete","mpreath","ujihisa","Sixeight","andrewhavck","alexch","skateinmars","darwin","EvanBurchard","cytobank-matthew","kidpollo","kjwierenga","psyche","antrover","andrehjr","iamsolarpowered","horaci","rishav","joshbuddy","rlr","wnetoa","simplabs","alex","dustinwhittle","samvincent","memiux","ktlacaelel","rubysolo","chillicoder","teepark","tonyl","hal0thane","james-baker","stuffmc","sepposade","jastix","vianaweb","FDj","auser","sacrosby","ascarter","tdmackey","julienXX","adurity","carlp","asenchi","mazebuhu","caseyhelbling","mikereedell","verbal","satynos","cloudhead","packagethief","bsy","robhurring","davidx","foxscan","detrain","jawspeak","jschoolcraft","lokeshk","yashh","jrsims","moorage","thisgirlangie","jdamick","dsully","gregf","sjain","hughdbrown","webandy","fairchild","wesbillman","mvj3","scrogson","gtcaz","rcarver","superfeedr","didenko","JonRohan","miamiruby","nelix","rvwoens","coiscir","javan","haru01","dastels","artificemm","docgecko","electricgraffitti","detansinn","chunzi","m3talsmith","priteau","jptoto","amerine","jyr","zodman","chipski","christhomson","dayne","mmalone","ccsmail","jeffp","natebunnyfield","f1vlad","joshbutner","sferik","johan--","joahking","aaandre","dennyhalim","gregcopenhaver","teknopartz","CodeMonkeyKevin","zgchurch","vangberg","benaldred","kaichen","ap0ught","jnbn","holywarez","dambalah","juarlex","nevilleburnell","symlink","mdwrigh2","agibralter","kognate","sroegner","daksis","philipefarias","ajsharp","mwhooker","maca","kalkov","synaptic","wolverian","rnaveiras","jjcall","matthewfl","mathieuravaux","temojin","graphicsop","m7d","bbuckley","gabrielfalcao","mamuso","deepthawtz","marksands","tarellel","josh","KieranP","mrkn","raul","sd-fritze","dapi","jaryl","kylebrowning","jimpick","nikolay","joshnesbitt","maggit","xinuc","marciotrindade","bradchoate","bs","peterz","wvl","csamuel","jamesarosen","joshourisman","kacy","martinciu","osde8info","aliem","gabrielg","jaknowlden","evanfarrar","mivaul","shock","nicksergeant","lucian","Asciant","thoas","bicherele","Csele","uamuamuam","i0n","benhaan","jodosha","JonGretar","evolve2k","jondruse","polera","lr","badboy","mikelim","irfn","tangtao","st3f","thegeekbird","tweak","hackedunit","christophsturm","tobi","fvonx","marcoow","pcreux","vapidbabble","reidmix","jherdman","chrisdrackett","overture8","jits","daz","lazzarello","asoltys","Hates","mgomes","tlrobinson","bluehavana","janl","sah","gussan","brynary","adolfosousa","cypher","wintermi","bemurphy","neduma","nowells","hojberg","muddana","juvenn","jobscry","Sutto","arjunghosh","rorrego","jwilkins","nrolland","marcinbunsch","neophiliac","ranza","dusty","hoggarth","sriprasanna","davidhalldor","josephsofaer","rbriank","andreisavu","dennmart","jrmehle","whistlerbrk","shaper","jrivero","gloubidou","denzuko","dmillar","mexpolk","mkuklis","christianhellsten","johndagostino","jots","apillet","qdonce","javisantana","mikeauclair","digx","coreyhaines","rudionrails","jpbougie","brixtonasias","onesunone","bry4n","rhymes","liangzan","kvbik","professionalnerd","visola","suresh","bastih","andrem","r38y","mynyml","bitflut","danielbru","3rdman","cypriss","esdras","benpickles","ducky427","knobe","elkinsware","tpitale","foca","simonw","mrduncan","Xenome","markisisme","al3x","futoase","tomaski","meddah","shakhan","nailor","adamcooke","Hoodow","klacointe","erikvold","rtomayko","kolber","cashyboy21","luddep","closer","riggasconi","aroscoe","sven-q","kurotoshiro","angusb","binarydud","chrisb","gvarela","sukhchander","gnufied","Cutpastecreate","elg0nz","ijayasin","christianchristensen","strange","leandro","dirs","zevarito","jpf","mendelbenjamin","brianherbert","yuritomanek","latrommi","tokuhirom","qhoxie","rust","ericholscher","lxneng","lorchaos","rchk","ches","frnz","filipealvesferreira","lucasefe","paulwalker","httpdss","gdrage","jakalada","claudine","joshamos","fgrehm","rdamen","yaroot","jugyo","messa","digitaltoad","orph","galex","boriscy","rafidude","darashi","angrytuna","AdamN","paydro","rimenes","jacqui","sfkaos","dgalarza","imakado","moomerman","Ashernor","pedrodelgallego","BenWard","bashwork","axelator","zeroLaming","toothrot","pake007","sevas","btoone","dallas","danielrmz","kret","nouse","mdaisuke","fmborghino","ibolmo","zetafish","drewlesueur","dacoz","ciju","noise","salax","jotto","toastdriven","mcroydon","tfreitas","ccheever","sxlee87","jmcantrell","acts-human","bastienlabelle","terrbear","mikhailov","joshdavey","hecticjeff","garru","TBD","vancaem","jasonmc","ariekeren","shreekavi","chrisco","michaeltsmith","hmarr","binq","jakedahn","stonegao","jperras","finn","kerberoS","firman","leeky","gamesthatgive","jchaney","timonk","philippWassibauer","danblick","itspriddle","threedaymonk","michelson","tilgovi","jmchambers","jhindle","mtoledo","nhocki","mrtazz","the-architect","schallis","kneath","gustaf","ejdraper","logicaltext","levycarneiro","ktheory","robb-broome","matflores","SleepTillSeven","bencochran","tmm1","infixfilip","jemerick","edouard","ethangunderson","beanieboi","jwelshiv","MBO","gitmate","rok","santosh79","yaychris","BenHall","sirprize","abraham","heatxsink","joshwalsh","grimen","adamramadhan","mzlittle","demet8","jrpz","jeanpaulcozzatti","mtarbit","jstorimer","cacciaresi","r3trofitted","bennyfreshness","sinetris","jrun","unspace","rgarver","gabrielmansour","jnstq","hgillane","cherring","dceballos","kstewart","donnykurnia","plukevdh","diogenes","joshbrown","yolk","bitfyre","raphaelcosta","esneko","yuriyvolkov","unthinkingly","chad","quinn","wmerydith","donspaulding","notthinking","ikarius","jbr","yoshimax","silverfox","jmwinn21","extraordinaire","hartym","mattonrails","vertis","tommg","weilawei","denniscollective","72616b657368","sork","JamesHayton","kennethreitz","kurko","potomak","mmatuson","amiri","dandean","syntaxritual","holman","alimills","hammer","jnunemaker","risico","fritzek","theflow","dnozay","steshaw","bobanj","webtechnologist","PatrickTulskie","kares","miksago","fuJiin","tommychen","simonreed","foremire","LFabien","bagwanpankaj","bummytime","devinus","rays","krisb","Lymskos","zonble","aantix","vorn-coza","techfolio","albybisy","tcol","jufemaiz","pvdb","pcdavid","danopia","chrislerum","peterto","laberge","smokyonion","guinascimento","longhorny","gabe","kbuckler","durran","tricomsol","bananastalktome","jordanbreeding","c9s","alvin2ye","NV","jwachter","pulni","jjungnickel","f440","ratzefummel","krmdrms","mauriziodemagnis","inffcs00","bobthecow","bengold","gciampa","akshayrawat","said","hawx","samuel","michael","ruyrocha","fmmfonseca","chiragrules","raid5","kamui","hsbt","svenfuchs","l15n","steves","lunestae","pjaspers","chinmaygarde","scotttam","jeekl","kfinlayson","admc","kadel","bilco105","t9md","meskyanichi","timocratic","timhaines","Marak","openface","tlossen","tekacs","jasonpa","nightsailer","technoweenie","chrismear","benatkin","lloydpick","ryanmoran","Tomohiro","aslam","mineiro","gdagley","rociiu","AieshaDot","kijun","robertjwhitney","macek","willrax","VinylFox","rupa","smallacts","truemilk","alanhaggai","mitchellhislop","cobracmder","xoebus","gretch","juretta","mgsnova","invadersmustdie","tedb","jedschneider","maikelgonzalez","bdigital","raycmorgan","zenmatt","thrashr888","dug","avdi","chaifeng","bblimke","vivienschilis","fd","luckiestmonkey","Locke23rus","berlin-ab","myfreeweb","windmill","briankeairns","ricardojsanchez","angelov","cbmeeks","maetl","thepug","gluckspilz","jamin4jc","netzkontrast","mager","jarquesp","phmongeau","jdennes","danishkhan","bensonk","nano","kjbekkelund","flyerhzm","kanashii","mairon","sekimura","joericioppo","bertzhu","mislav","jroes","jenishkottaram","peterwald","alterisian","artisonian","bcherry","jbw","haifeng","stockhausen","bvandenbos","mlbright","consti","simonoff","suzukimilanpaak","ctrochalakis","acrookston","gnomet","dexterdeng","aderyabin","hwijaya","catman","vesan","frederico","zacharyscott","IsraelAgNouhYattara","mikecampo","dsueiro","reeze","stevemckenzie","avelino","stinie","thbishop","sotakone","srobbin","krongk","yaotti","tobym","robhudson","ryanbriones","jcpbacon","zhengjia","awilliford","moubry","rm","cyclades","mikethomas","dkeskar","brianlee","panggi","durbin","fmela","Shekar73","infynyxx","sorenmacbeth","unindented","kevinpanaglima","krachot","dvyjones","joshOiknine","arkx","rrichards","error400","lagsalot","JSilva","twitoaster","rbrant","shaiguitar","jmorganson","electronicbites","fredwu","jlertle","DHoffm","Tyrant505","CodeBlock","jgrevich","fpauser","lastk","scifisamurai","runawayjim","ryana","amanelis","ponzao","michelmelo","edsinclair","reustle","vshvedov","marchdoe","devi","allanberger","alup","tventura","cobra90nj","berkerpeksag","neviim","westoque","Rud5G","cjwoodward","fyskij","1ed","Axispower","icaruswings","DasIch","fredpalmer","al3d","codylindley","Bushjumper","phoenix24","pcora","welterde","VijayM","sr3d","hotoo","nwjsmith","brianjlandau","hemanth","johnknott","MatthewCampbell","mwmitchell","asymmetric","glitterfang","ptn","kraih","ono","myuhe","jque","GVRV","d-r","danthompson","zerd","selman","elsewares","unes","Debadatta","monoceroi","gchandrasa","darknighte","jreading","kron4eg","minad","cdmwebs","inuki","nabeelmukhtar","hornairs","goyox86","gosuri","revans","michaeldwan","helianthuswing","christiansmith","kidrane","melborne","darkhelmet","ikbear","blowmage","maxjustus","sebleier","mattb","GeoffTidey","warehouselabs","german","itsmeduncan","dneighbors","fireflyman","mattheath","madwork","marcosvm","rafmagana","rafaelgaspar","arden","flyfireman","saggim","mnelson","etehtsea","xantus","byrongibson","mopemope","gillesfabio","ZeuQma","tkaemming","jackhq","connrs","jpang","amorton","rubyorchard","ghg","remiprev","michaelparenteau","harikrishnan83","eddieringle","krekoten","andmej","mak1e","seungjin","christofd","gfx","mechanicles","drak","olkarls","gregory80","thheller","devreq","nanek","laripk","jefflab","rick","tapajos","denmark","richardiux","dfbrule","yrosen","ebruning","bts","AzizLight","audy","ballantyne","huerlisi","codepuzzle","khasan","nikochan","pmh","jexchan","designrelated","codykrieger","edorcutt","iamacourser","rowedev","lardissone","wxmcan","threez","cjkoch","gigq","marugoshi","tianyicui","earcar","fadhlirahim","ccollins","adanmayer","tpeden","jsocol","TaurusOlson","jaksys","leandrocg","rube","richard6363","emddudley","JensNockert","he9lin","tmilewski","rishikulkarni","wescleymatos","mootoh","ganesan","rodrigosdo","tonktonk","skaufman","jurajpelikan","fcurella","vic","eston","hiteshmanchanda","tsigo","plang","avsej","kanzure","johnturek","percyperez","vorushin","jakemcgraw","fushang318","juniorbl","alanandrade","kenn","mitchj","webdestroya","supairish","seanhellwig","guilhermechapiewski","rainerborene","zonovo","vertocardoso","vinioliveira","hotchpotch","pch","jeffself","markmhx","Archonyx","indrode","mmaheu","sigardner","kulesa","phsr","ericflo","andyferra","shurizzle","renatoelias","klandergren","fabiomcosta","johngrimes","gleuch","ecksor","lucapette","achiu","benbjohnson","selvan","ey0t","bray","komagata","longda","pixelballistics","a2ikm","hoffmann","Rich-McGrath","abelperez","galvez","mkempe","amiridis","sfgirl","makeusabrew","dragoscrintea","grzegorzkazulak","jcmuller","JustinCampbell","dpree","jquattrocchi","sri","neonsunburst","danielemilan","poseid","chancegarcia","Prog4rammer","HTApplications","cassiomarques","andrerocker","SixArm","andrewsmedina","gaubert","parabuzzle","diogosantos","seanmccann","particlebanana","CloudMarc","majtom2grndctrl","javichito","jk","arunagw","esfand","plentz","caueguerra","albertoleal","adrianoalmeida7","guilleiguaran","donaldw","TaopaiC","stephenbreen","dissolved","ikaros","andrefaria","aporia","benlambert","coolgeng","kitop","mitukiii","kayaman","sLLiK","vmseba","nkchenz","vs","jtsay","arlolra","adaoraul","Demeter","jpadvo","joshaber","ebeigarts","allenwei","nervetattoo","bostonbasso","saki","ajbolanos","seppuku","sonicgao","ainvyu","cbrammer","hostsamurai","vatrai","acadavid","danengle","paddydub","noqqe","zporter","namley","aaronky","rdegges","weatherpoof","tomxander","skyfive","dieinzige","Becojo","saysjonathan","awayken","nataliepo","notrael","mrigor","blatyo","cwaring","sshirokov","kam","joshfng","martintel","skorks","vamsee","Lispython","hansef","seenmyfate","kitt","Markitox","Antti","Kerestey","albertz","samverekar","fredrikmollerstrand","thesp0nge","kdepp","ptzn","wusher","phongvh","sayz","qbyt","mkomitee","mlen","jmanon","duk42111","Naoya-Horiguchi","brianlovesdata","dreamcat4","pxr","neiltron","tauil","jondot","phonx","mininaim","6","Mattia","blambeau","DougTabuchi","idorosen","rachelmyers","capthy","liwh","brunoarueira","DrPheltRight","csanz","scott-stewart","jacobrelkin","shaliko","AAinslie","jamierumbelow","abukhait","scottlabs","tjhanley","mmonis","mrkamel","christiancurland","clyfe","thecocktail","taicki","stephenallred","zires","acadopia","MateuszWijas","zentrification","touchinspiration","reddyonrails","mportiz08","krizzna","nmelo","andrewsardone","kotp","rossta","anups","jeffcarroll","efritz","jpogran","jdp-global","hyperbolist","bf4","lenzcom","ardwalker","L42y","sosedoff","Ajmal","abhishekmunie","kbaldyga","kamzilla","delonnewman","peter-murach","sputnikus","benwr","wijet","marlonglopes","TheFox","kblake","senny","azer","Smarty","milann","ipavelek","elitau","zyan","farnhizzle","hamzakc","Waterfox","arunjitsingh","azizur","kitenge","eatcpcks","lusis","gvt","jasonmelgoza","jichen","Zeelot","albertobarrila","procyon","Wackybob","curbina","goosetav","ghindle","vicmiclovich","wearestac","klebervirgilio","offby1","kaaliputra","Silanus","scopevale","netzflechter","poutyface","raulmangolin","dmshann0n","cricketgeek","VikramRao","mungomash","bradheitmann","kainosnoema","iromli","jwelty","sayem","tobsch","rubynerd","travisanderson","lightyrs","muellmat","cameronmcefee","hector","kjetilod","kinabalu","jglee1027","andrew","metiny","dnurzynski","redpanda","necroua","karmi","lgaches","mabonyi","vyatri","korczis","67ideas","pcunnane","dpbus","ashneo76","joshmattvander","liangcw","vineetbnagaraj","jmatraszek","mkitt","pmandia","yassersouri","yudmiy","arthurix","osebboy","baant","programaker","busticated","emilpetkov","sebacruz","mrdg","DamianZaremba","malikbakt","georgecalm","danielribeiro","Dirklectisch","sup3rcod3r","raeffu","Anthony-Geranio","jitterizer","hectcastro","rudolfochrist","excid3","lampr","voidnothings","tsenart","nt","Amokrane","levicook","qnm","technolize","aodag","sansumbrella","MindTooth","scott2449","X4","mrcaron","randomor","liuzhoou","marciogm","ardiyu07","dannymcc","nfedyashev","batuhanicoz","cognominal","sax","vybs","richardrasu","xcoderzach","lucamaraschi","mohnish","pcardune","madari","TimothyKlim","nbucciarelli","jwoertink","freakyfractal","enc","lite","aanoaa","tomvleonard","mikaa123","jeanregisser","scheibo","Psli","einux","konputer","dzello","Nilloc","cmeiklejohn","georgemandis","tembamazingi","mblair","mconnor","nerdmom","ndegruchy","spearse","larsburgess","burnto","franciscoj","sleparc","rafaelcaricio","ajray","chacha","hasanyavas","pedrolopez","mponizil","timknight","jacksinn","huacnlee","justinbaker","aswadrangnekar","Captainkrtek","DrewFitz","sleepdev","tharkoos","youwannaknow","doud","tmcgilchrist","chlayverts","thomvil","digitalpardoe","sposborne","parkerl","carlosdelfino","omgitsads","tuhin","RLovelett","eregon","sanxac","ezuelectrock","tshauck","mtsoerin","hiromitz","araee","bogdanmuresan","kloderowski","msarvar","drydevelopment","1anre","icco","joestraitiff","jmileham","Refreshe","tansu-uslu","hoverlover","handyjq","xlarsx","bojovs","ajmi","fuzzyfox","lexxx233","diversen","fabianoalmeida","martinlindelof","srih4ri","ianphilpot","pitr","ffontouras","Kjata1013","thasc","newtriks","ashbaker","Ameero","zahir","sunpech","EdlinOrg","snstoyou","nope","elemel","smly","prathe","P6rguVyrst","srisnsris","s3w47m88","semicarry","hidde-jan","rowoot","TBush","AXJ","stevedeneb","adarshp","RootSpeaking","kevasdf","mdesrosiers","Purandhar","hyesushin","DenDen1337","JBean","amhnews","aseba","diegopacheco","macluq","tonycasanova","shaoyang","rmdort","morganwatch","alexandersanz","LinGmnZ","sjh","dalpo","brentsmith","Zolomon","liveink","diulama","tanelpuhu","rcarrieche","dte","RyomaKawajiri","punytan","yoquankara","haoqili","knowncitizen","dinhkhanh","psalami","krishnanagaraj","cespujunk66","lalasusu999","pcurry","wyattdanger","shingonoide","ngoatvm","eriknrd","philfreo","luckydev","Rahulitsmca","gohavefun2","bertjwregeer","nmumen","aumgn","dobcey","davidohalloran","jowido","marksteve","dabio","rmicoy","madewulf","bosism","Tipertuba","PushinPixels","tgdn","shariefsk","m0nkey","henryleacock","CrawfordWynnes","anagri","mlareo","neil477","kdonovan","yamunamathew","berlinbrown","antawara","Cotizado25","gjorquera","Dushyanthkinjarapu","laCour","oooo723","roblecca","pmaingi","gcampbell","robeastham","jgdreyes","Caustic","morgankeys","chesleybrown","zzazang","adanoria","millr","MikeBott","keitsi","zlangley","avalanche123","ilot3k","bendiken","jeheald","ashsmithco","mycroft","lachezar","borahMoloy","cliffsull","goldenandroid","KuraFire","ngpestelos","troessner","Arnab1401","ujjwalkhanal","qadir0108","ihd2911","Firsh3k","lifeisrisky","nevans","munro9","fagiani","lojikbomb","chrisledet","ariel","marcosanson","rem","shivakantmanch","MMLK","skattyadz","mhaidarh","joedynamite","dimasaryo","trico","shaunmichael","vs4vijay","afj176","stevennathaniel","gujiao","olamedia","giupo","whatrocks","stakisko","mhockelberg","shalo","devaraj","attomos","xeneizeyorugua","ryanlecompte","jrk","deryldoucette","jacknagel","togetherville","zypher","kyledoherty","yakomoca","sastha","KMASubhani","tejasc","ErikRHanson","ghais","dontcare4free","streeter","ambreenhussain","mischa","JelenaSparic","logeshpaul","victusfate","Avaruz","hendrolaksono","jeffgw","geeksourcer","wizardwerdna","elliottgoodwin","speric","alextucker","chawei","danieltreacy","blackdoc","mgp","martinemde","tsolomko","six","jayeshinho","jakeguza","bleikamp","ryanpao","ddacunha","mrb","mamdohreda","colinvivy","piyushchauhan2011","correcto","mawaldne","swishstache","Rafe","neelvad","seriouscomedy","trendsetter","beenhero","Amper","ryanKelleher","muehlburger","marktraub","rugers285","ArtemMyagkov","oscardelben","yvesvanbroekhoven","citrus","dennismdel","SupplyBoys","italiano40","darokel","Orton","lobr","sdrkyj","ggppwx","AngeloR","zergmk2","premjg","afaolek","tobrien","fash","susanmccormick","maoer","dtrebbien","tahhan","mzahir","matthewborn","patriciomacadden","nawaidshamim","JudePea","mehrzad","ericchen0121","dominiclovell","antonr","Fir2011","mhenke","bloudermilk","PrashanthRaghu","thecoffman","hozumi","jed","baguo","grumpycola","rht","timerider","thiagocaiubi","carlop","mibbo","Imados","frankwiles","efeerdogru","realpeterz","jordanndaviss","bytecollective","brianritchie","cndv","dfd","panckreous","mike762011","MalsR","case27","mono0x","jonassm","asaaki","jhnmn","huhong","TRAVEL4FREE","marcelomilo","nmudgal","coldFox","tonisan","ctubau","danlister","apurvrdx","armandogalindo","jeremysolarz","mustardhamsters","bfirsh","dmmalam","a4extra","ezkl","michaelowen","sujayhuilgol","chadlomax","dazagrohovaz","DeveloperAlex","c1c2ai","trey","joekhoobyar","jianinz","ugtkbtk","paparts","netoxico","TeacherPond","becked","tuyennguyencanada","motord","eklipse2k8","ZoomZhao","samqiu","makiman","purban","cyberorca","imonyse","jeemar","gazay","davejacobs","bwvoss","Bensign","dann","nickaoscarter","gane5h","glowindark","arielo","joannecheng","hughhefner8","broccolini","bherrup","starmbl09","tothebeat","sabram","qianthinking","iowish","lalitnama","ejr3gan","denis-bykov","cbmd","cleercode","batasrki","dstanek","markmarch","suprsankr","rcroxyosox","treeder","baddogai","froots","haoshubin","uirusan","dzhulk","aaudu","lekkerduidelijk","mcchang","pgebhard","scottgrey","dbergey","carlitosway0","cdadia","lepture","b1naryth1ef","janjohannesson","AndreyChernyh","dynjo","maxstepanov","JonRowe","attymannyluna","cooper1388","vjkaruna","fdd","GoranHalvarsson","Rajesh1213","Triopticon","ramazanayvaz","datl","jeo4long","zeroonnet","cdog","abstractj","anirudh24seven","danielwrobert","laparicio83","balupton","austymenko","avdezine","danieldyzma","jasonbuck","amasad","sideshowbandana","BrianStorti","supercleanse","TheThumbsupguy","alexcsandru","Stdubic","betawaffle","minamipj9","kylpo","ricardovaleriano","adrijlee","hlh59","chazlever","krmboya","vanm","MIchaelChua","benbarclay","mdjohnson1","JeffBrown711","rishabhsrao","dustMason","theLearningChan","malandrew","sac2171","Omerooo95","rnpinc","ivandro","syncopated","arnklint","jayeola","JJMoy","rahman86","josephmisiti","jfilipe","cjcnance","KingsgateRas1","chambaz","sjamayee","aelam","imanzarrabian","gaochunzy","orangix","goopi","michaelkrisper","deonomo","codejoust","aroc","cavalle","johnnyhuman","alexbg","jshr","ssnau","caryhaynie","timmolter","spadin","mlong168","gurmeetkalra","new-top","trondga","maikeru","jamster","jsy","tommyhendr","Hasgaroth","ZephyrSL","rjyo","zephyrpellerin","neilparikh","beata","makestory","haneez","mdhabib","PaulKinlan","cheche","tyshen","bhxtl","osujikenneth","ketiko","frknlgn","katRHS","igrigorik","marianay","detroitexposure","Surgo","mindgap","hiroyukim","DilipSabat","espengra","soubhiks","jaybrent00","tikva","jessestuart","mtanas","redserpent","shukydvir","leoy","stylecoder","coryfoo","prashanthbr","robots2020","sidna","cmes","johndel","diogobaracho","markiBOY","tvkonline","shiawuen","dipak8959","rfosta","nickgoodfate","RiverBridge","fay","benza","karichel","psychicin","gag0q","kl365","nmccarthy","julien51","amylv","abinav","bramsdenteuling","AnonymousCow","ioncache","iesta","cemsisman","Ade147","seamusabshere","doublethink","claudio-alvarez","bird5230","anilanar","debugging","rupakg","ShaneIsley","wicz","roastgoat","dilhamsoft","sh4dy08","roboteti","pubnub","TRMW","rahulsingal14","sanjayts","nhunzaker","baldrailers","Korrawit","frode","thorsteinsson","iveney","endel","jose152","ZhengYang","Keeguon","rahul2011","iainp999","maveonair","SirCodington","sclm","snapette","dshefchik","manderson2080","djohnston08","pirateking","giftedsam","iyerlabz","alejandrolechuga","janela","BxCx","mifan","enestanriover","kernelfail","prinxezzlja","macknight","Girllovers","AquaGeek","charleskline","Foggybtmgirl","ryanatwork","plainspace","stw","naiquevin","huangjunwen","valeh","carhartl","roycefu","tmlee","williamrh","ZachWick","zhuangbiaowei","Baker1904","Skrizy","NageshJatagond","vrillusions","geekrohit","satlavida","cleichner","jhenke","beingnessa","mcgoooo","Bloophub","punklibrarian","abelmartin","take-cheeze","petersonferreira","maxwell","OsvaldoArmando","rclosner","jccorrea","koyonote","denniscking","chanduch","sd2438892","geekard","e3matheus","mbialon","yarvin","rvhani","Predoff","darkness","savethewaves","sdoering","vaporrumors","nevayeshirazi","andysamona","rkwofford","messi1988","anibe","yesimroy","tpiranav","plopezbarbosa","peterkinmond","unitysoe","mjw56","johannchiang","chrismatthieu","yasirmturk","zer09","mparrenovilla","nataliav","lucasdavila","volomike","echannel-leon","rufoni2003","ramonatravels","cpkennedy","NKjoep","witalewski","lonre","stecb","josal","Zul83","Niflheim","ChanCoolKat","umesh991987","marvin","altnerd","insparbo","kmcd","marcofranssen","defiantredpill","BarcelonaRecords1","hbtvieira","kmarcini","lea22","orbotix","sdasinglesclub","buffer","shauncr","ejenkins","yahyaman","burakdd","fjordan","cwholt","yudi-rusmawan","eldios","vascoconde","niky81","mcdave","mcobery","ramen","thePapacy","alexandresaiz","sleighter","riyalein","johmas","chriskelly","andref5","AppSlap","celikmus","bitlag","kareem-abdelsalam","joshuamckenty","jn123456789","egonSchiele","stylepraise","shaw1337","gordonmzhu","erikkallen","ermustaqbal","denisjacquemin","msgehard","robertodecurnex","dcrall","ahto","charleseff","thejspr","twilson63","franciscosouza","sam7wx","jwbecher","eklitzke","serho","vbonillo","jackdracon","brahmasta","giulianoxt","rayelward","jeffw516","jewelrydeveloper","pengper","fyamnky"]} \ No newline at end of file +{"users":["jnewland","pjhyett","cnix","dustym","choonkeat","nakajima","mtodd","bumi","takeo","bmizerany","zachinglis","evilchelu","manalang","mmmurf","hornbeck","mindy","therealadam","vanpelt","alexcharlie","seaofclouds","luke0x","rphillips","Caged","kamal","eventualbuddha","bigfleet","jacques","tim","KirinDave","ddemaree","benschwarz","cpjolicoeur","mmcgrana","mdarby","anildigital","ryanahamilton","entangledstate","coty","broughcut","atduskgreg","liz","brianleroux","kballard","haraldmartin","walf443","ss","elliottcable","joshuabates","eastmedia","mattman","imajes","saimonmoore","hoverbird","Fil","nesquena","membogg","ayn","jbritten","peterba","nick","willcodeforfoo","mojombo","rsl","caffo","khigia","BrianTheCoder","tkofol","dstrelau","sant0sk1","joshuaclayton","cee-dub","tooeasy","quirkey","eduardo","raja","timshadel","rsanheim","tokumine","statik","mattly","xilo32","yaroslav","sr","hchoroomi","lgn21st","purzelrakete","seven1m","douglasjarquin","ihower","freels","adamstac","fauxparse","duncanbeevers","jasonwatkinspdx","spohlenz","joaovitor","mikedamage","alainravet","whomwah","ooodigi","nerdrocket","zmack","mulder","kivanio","vlandham","yizzreel","ryanb","cho45","sandro","ratchetcat","jgross","jasherai","jw-00000","zubin","loe","fred","stuartsaunders","skippy","dgiunta","monde","charlenopires","devn","softprops","madx","lukebayes","blech75","newtonapple","edbond","ncr","boboroshi","holtonma","jhubert","libin","bastos","nullobject","croaky","trevorturk","fabioespindula","nick-b","sikachu","schacon","harper","envoked","guitsaru","brianmario","subwindow","Arthur","sob","tiagowhite","jasontorres","lawrencecurtis","bterlson","mattsears","patrickdet","academician","markpuck","mokolabs","baron","arikan","ryanking","willemderu","entombedvirus","cyx","galfert","heycarsten","shallwelin","sbfaulkner","jaehess","jonathannelson","helo","schwabsauce","gusgollings","adzap","joefiorini","trestrantham","hairballopolis","thetacom","genki","guillermo","tekin","nextmat","hans","colin","Roman2K","kakutani","qrush","hpoydar","goodtouch","LimeHat","grobie","tosh","epitron","inkdeep","voitto","kvnsmth","darrenhinderer","njonsson","bianster","shanesveller","technicalpickles","erikj","lancecarlson","briandoll","digitalextremist","KevBurnsJr","slim","clarkware","jasoncarter","Krishna","kirk","tinogomes","wfarr","intabulas","hardbap","aziz","atmos","robbyrussell","codeslinger","evandrodutra","martinisoft","smtlaissezfaire","larrywright","joshknowles","evanwalsh","jchris","jqr","jbarnette","rafaelss","dsboulder","res0nat0r","sunfmin","topfunky","NigelThorne","supaspoida","yipstar","davidwparker","jinzhu","johnpaulashenfelter","joshua","agile","cored","visnup","calendaraboutnothing","eoin","deepak","dsparling","oleganza","pengwynn","christophermoura","jgagne33","mhutchin","matsuda","zak","railssummit","taylorrf","peleteiro","greatseth","blackwinter","rberger","elim","eric","collin","henryhamon","shinzui","tongueroo","vanntastic","swdyh","peterpunk","kabnot","ozeias","mwilliams","kamipo","bezugen","arthurgeek","fairos","webmat","bonachela","foysavas","mojodna","dwabnitz","fuzzytone","anthonybarone","mkhl","botanicus","kavu","jhsu","delameko","uhhuhyeah","jcf","nrk","brycethornton","maxdevel","ashleyw","zegomesjf","rjspotter","tjweir","slawcup","pjdavis","ngerakines","rwc9u","aka47","Bregor","oristian","JackDanger","amatsuda","josespinal","sleistner","jdp","mkrisher","rbarazi","mattmatt","luisbebop","rcrowley","anotherjesse","semikolon","albertoperdomo","marcric","pardel","rads","altamic","badcarl","Marat","rfwatson","jesseclark","iamwilhelm","rtyler","kovacs","alexvollmer","rkh","joelparkerhenderson","shayfrendt","pcalcado","marcelinollano","jngo","robertpfeiffer","ukd1","jpablobr","alfredwesterveld","matthewford","haws","visionmedia","ekinci","hellekin","paulgrunt","seouri","pauldix","CodeOfficer","manuelmeurer","kristopher","mattyoho","neilmock","igorgue","miyagawa","akm","ieure","mwunsch","kairichard","leah","Siansor","kiko","breily","elmer","vshih","samsoffes","graysky","leandrosilva","blinton","ashchristopher","bensie","yura","adamaig","erotte","fernholz","jamesrose","michaeldv","raganw","sstephenson","capotej","BeamerCola","damon","amiel","iamstillalive","rduarte","jney","rymai","jtadeulopes","caironoleto","talboito","alexmchale","davglass","lian","rondevera","shashi","dira","GreenDragon","yonkeltron","jeanmartin","shelling","tehcurtis","gnlnx","joshng","bartuer","bruce","adamv","yasu","cjmartin","jarodl","jonatas","ronnieliew","polly","nonsequitur","marclove","arya","splattael","mcfearsome","skorecky","jaygooby","iande","brosner","brett","jivko","edwingo","hunab","zipme","mnaberez","nimo","justinlilly","howiworkdaily","johnbender","jezdez","petercoulton","juliend2","dhou","enricob","gigamo","markstephenson","gregnewman","rubify","spagalloco","Xac","attack","esycat","webiest","ogijun","travisjeffery","moongtook","meritt","stephencelis","doowttam","mrchrisadams","riethmayer","utahcreative","bkrsta","program247365","montylounge","renatocarvalho","NYiPhoneDeveloper","novas0x2a","rblackwe","basiszwo","deminew","stan","sgarza","epocRepo","georgi","radamant","munjal","jgchristopher","macro","Gig23","diogenesis","poshboytl","pablete","mpreath","ujihisa","Sixeight","andrewhavck","alexch","skateinmars","darwin","EvanBurchard","cytobank-matthew","kidpollo","kjwierenga","psyche","antrover","andrehjr","iamsolarpowered","horaci","rishav","joshbuddy","rlr","wnetoa","simplabs","alex","dustinwhittle","samvincent","memiux","ktlacaelel","rubysolo","chillicoder","teepark","tonyl","hal0thane","james-baker","stuffmc","sepposade","jastix","vianaweb","FDj","auser","sacrosby","ascarter","tdmackey","julienXX","adurity","carlp","asenchi","mazebuhu","caseyhelbling","mikereedell","verbal","satynos","cloudhead","packagethief","bsy","robhurring","davidx","foxscan","detrain","jawspeak","jschoolcraft","lokeshk","yashh","jrsims","moorage","thisgirlangie","jdamick","dsully","gregf","sjain","hughdbrown","webandy","fairchild","wesbillman","mvj3","scrogson","gtcaz","rcarver","superfeedr","didenko","JonRohan","miamiruby","nelix","rvwoens","coiscir","javan","haru01","dastels","artificemm","docgecko","electricgraffitti","detansinn","chunzi","m3talsmith","priteau","jptoto","amerine","jyr","zodman","chipski","christhomson","dayne","mmalone","ccsmail","jeffp","natebunnyfield","f1vlad","joshbutner","sferik","johan--","joahking","aaandre","dennyhalim","gregcopenhaver","teknopartz","CodeMonkeyKevin","zgchurch","vangberg","benaldred","kaichen","ap0ught","jnbn","holywarez","dambalah","juarlex","nevilleburnell","symlink","mdwrigh2","agibralter","kognate","sroegner","daksis","philipefarias","ajsharp","mwhooker","kalkov","synaptic","wolverian","rnaveiras","jjcall","matthewfl","mathieuravaux","temojin","graphicsop","m7d","bbuckley","gabrielfalcao","mamuso","deepthawtz","marksands","tarellel","josh","KieranP","mrkn","raul","sd-fritze","dapi","jaryl","kylebrowning","jimpick","nikolay","joshnesbitt","maggit","xinuc","marciotrindade","bradchoate","bs","peterz","wvl","csamuel","jamesarosen","joshourisman","kacy","martinciu","osde8info","aliem","gabrielg","jaknowlden","evanfarrar","mivaul","shock","nicksergeant","lucian","Asciant","thoas","bicherele","Csele","uamuamuam","i0n","benhaan","jodosha","JonGretar","evolve2k","jondruse","polera","lr","badboy","mikelim","irfn","tangtao","st3f","thegeekbird","tweak","hackedunit","christophsturm","tobi","fvonx","marcoow","pcreux","vapidbabble","reidmix","jherdman","chrisdrackett","overture8","jits","daz","lazzarello","asoltys","Hates","mgomes","tlrobinson","bluehavana","janl","sah","gussan","brynary","adolfosousa","cypher","wintermi","bemurphy","neduma","nowells","hojberg","muddana","juvenn","jobscry","Sutto","arjunghosh","rorrego","jwilkins","nrolland","marcinbunsch","neophiliac","ranza","dusty","hoggarth","sriprasanna","davidhalldor","josephsofaer","rbriank","andreisavu","dennmart","jrmehle","whistlerbrk","shaper","jrivero","gloubidou","denzuko","dmillar","thisivan","mkuklis","christianhellsten","johndagostino","jots","apillet","qdonce","javisantana","mikeauclair","digx","coreyhaines","rudionrails","jpbougie","brixtonasias","onesunone","bry4n","rhymes","liangzan","kvbik","jongilbraith","visola","suresh","bastih","andrem","r38y","mynyml","bitflut","danielbru","3rdman","cypriss","esdras","benpickles","ducky427","knobe","elkinsware","tpitale","foca","simonw","mrduncan","Xenome","markisisme","al3x","futoase","tomaski","meddah","shakhan","nailor","adamcooke","Hoodow","klacointe","rtomayko","kolber","cashyboy21","luddep","closer","riggasconi","aroscoe","kurotoshiro","angusb","binarydud","chrisb","gvarela","sukhchander","gnufied","Cutpastecreate","elg0nz","ijayasin","christianchristensen","strange","leandro","dirs","zevarito","jpf","mendelbenjamin","brianherbert","yuritomanek","latrommi","tokuhirom","qhoxie","rust","ericholscher","lxneng","lorchaos","rchk","ches","frnz","filipealvesferreira","lucasefe","paulwalker","httpdss","gdrage","jakalada","claudine","joshamos","fgrehm","rdamen","yaroot","jugyo","messa","digitaltoad","orph","galex","boriscy","rafidude","darashi","angrytuna","AdamN","paydro","rimenes","jacqui","sfkaos","dgalarza","imakado","moomerman","Ashernor","pedrodelgallego","BenWard","bashwork","axelator","zeroLaming","toothrot","pake007","sevas","btoone","dallas","danielrmz","kret","nouse","mdaisuke","fmborghino","ibolmo","zetafish","drewlesueur","dacoz","ciju","noise","salax","jotto","toastdriven","mcroydon","tfreitas","ccheever","sxlee87","jmcantrell","acts-human","bastienlabelle","terrbear","mikhailov","joshdavey","hecticjeff","garru","TBD","vancaem","jasonmc","ariekeren","shreekavi","chrisco","michaeltsmith","hmarr","binq","jakedahn","stonegao","jperras","finn","kerberoS","firman","leeky","gamesthatgive","jchaney","timonk","philippWassibauer","danblick","itspriddle","threedaymonk","michelson","tilgovi","jmchambers","jhindle","mtoledo","nhocki","mrtazz","the-architect","schallis","kneath","gustaf","ejdraper","logicaltext","levycarneiro","ktheory","robb-broome","matflores","SleepTillSeven","bencochran","tmm1","infixfilip","jemerick","edouard","ethangunderson","beanieboi","jwelshiv","MBO","gitmate","rok","santosh79","yaychris","BenHall","sirprize","abraham","heatxsink","joshwalsh","grimen","adamramadhan","mzlittle","demet8","jrpz","jeanpaulcozzatti","mtarbit","jstorimer","cacciaresi","r3trofitted","bennyfreshness","sinetris","jrun","unspace","rgarver","gabrielmansour","jnstq","hgillane","cherring","dceballos","kstewart","donnykurnia","plukevdh","diogenes","joshbrown","yolk","bitfyre","raphaelcosta","esneko","yuriyvolkov","unthinkingly","chad","quinn","wmerydith","donspaulding","notthinking","ikarius","jbr","yoshimax","silverfox","jmwinn21","extraordinaire","hartym","mattonrails","vertis","tommg","weilawei","denniscollective","72616b657368","sork","JamesHayton","kennethreitz","kurko","potomak","mmatuson","amiri","dandean","syntaxritual","holman","alimills","hammer","jnunemaker","risico","fritzek","theflow","dnozay","steshaw","bobanj","webtechnologist","PatrickTulskie","kares","miksago","fuJiin","tommychen","simonreed","foremire","LFabien","bagwanpankaj","bummytime","devinus","rays","krisb","Lymskos","zonble","aantix","vorn-coza","techfolio","albybisy","tcol","jufemaiz","pvdb","pcdavid","danopia","chrislerum","peterto","laberge","smokyonion","guinascimento","longhorny","gabe","kbuckler","durran","tricomsol","bananastalktome","jordanbreeding","c9s","alvin2ye","NV","jwachter","pulni","jjungnickel","f440","ratzefummel","krmdrms","mauriziodemagnis","inffcs00","bobthecow","bengold","gciampa","akshayrawat","said","hawx","samuel","michael","ruyrocha","fmmfonseca","chiragrules","raid5","kamui","hsbt","svenfuchs","l15n","steves","pjaspers","chinmaygarde","scotttam","jeekl","kfinlayson","admc","kadel","t9md","meskyanichi","timocratic","timhaines","Marak","openface","tlossen","tekacs","jasonpa","nightsailer","technoweenie","chrismear","benatkin","lloydpick","ryanmoran","Tomohiro","aslam","mineiro","gdagley","rociiu","AieshaDot","kijun","robertjwhitney","macek","willrax","VinylFox","rupa","smallacts","truemilk","alanhaggai","mitchellhislop","cobracmder","xoebus","gretch","juretta","mgsnova","invadersmustdie","tedb","jedschneider","maikelgonzalez","bdigital","raycmorgan","zenmatt","thrashr888","dug","avdi","chaifeng","bblimke","vivienschilis","fd","luckiestmonkey","Locke23rus","berlin-ab","myfreeweb","windmill","briankeairns","ricardojsanchez","angelov","cbmeeks","maetl","thepug","gluckspilz","jamin4jc","netzkontrast","mager","jarquesp","phmongeau","jdennes","danishkhan","bensonk","nano","kjbekkelund","flyerhzm","kanashii","mairon","sekimura","joericioppo","bertzhu","mislav","jroes","jenishkottaram","peterwald","alterisian","artisonian","bcherry","jbw","haifeng","stockhausen","bvandenbos","mlbright","consti","simonoff","suzukimilanpaak","ctrochalakis","acrookston","gnomet","dexterdeng","aderyabin","hwijaya","catman","vesan","frederico","zzak","IsraelAgNouhYattara","mikecampo","dsueiro","reeze","stevemckenzie","avelino","stinie","thbishop","sotakone","srobbin","krongk","yaotti","tobym","robhudson","ryanbriones","jcpbacon","zhengjia","awilliford","moubry","rm","cyclades","mikethomas","dkeskar","brianlee","panggi","durbin","fmela","Shekar73","infynyxx","sorenmacbeth","unindented","kevinpanaglima","krachot","dvyjones","joshOiknine","arkx","rrichards","error400","lagsalot","JSilva","twitoaster","rbrant","shaiguitar","jmorganson","electronicbites","fredwu","jlertle","DHoffm","Tyrant505","CodeBlock","jgrevich","fpauser","lastk","scifisamurai","runawayjim","ryana","amanelis","ponzao","michelmelo","edsinclair","vshvedov","marchdoe","devi","allanberger","alup","tventura","cobra90nj","berkerpeksag","neviim","westoque","Rud5G","cjwoodward","gildo","1ed","Axispower","icaruswings","DasIch","fredpalmer","al3d","codylindley","Bushjumper","phoenix24","pcora","welterde","VijayM","sr3d","hotoo","nwjsmith","brianjlandau","hemanth","johnknott","MatthewCampbell","mwmitchell","asymmetric","glitterfang","ptn","kraih","ono","myuhe","jque","GVRV","d-r","danthompson","zerd","selman","elsewares","unes","Debadatta","monoceroi","gchandrasa","darknighte","jreading","kron4eg","minad","cdmwebs","inuki","nabeelmukhtar","hornairs","goyox86","gosuri","revans","michaeldwan","helianthuswing","christiansmith","kidrane","melborne","darkhelmet","ikbear","blowmage","maxjustus","sebleier","mattb","GeoffTidey","warehouselabs","german","itsmeduncan","dneighbors","fireflyman","mattheath","madwork","marcosvm","rafmagana","rafaelgaspar","arden","flyfireman","saggim","mnelson","etehtsea","xantus","byrongibson","mopemope","gillesfabio","ZeuQma","tkaemming","jackhq","connrs","jpang","amorton","rubyorchard","ghg","remiprev","michaelparenteau","harikrishnan83","eddieringle","krekoten","andmej","mak1e","seungjin","christofd","gfx","mechanicles","drak","olkarls","thheller","devreq","nanek","laripk","jefflab","rick","tapajos","denmark","richardiux","dfbrule","yrosen","ebruning","bts","AzizLight","audy","ballantyne","huerlisi","codepuzzle","khasan","nikochan","pmh","jexchan","designrelated","codykrieger","edorcutt","iamacourser","rowedev","lardissone","wxmcan","threez","cjkoch","gigq","marugoshi","tianyicui","earcar","fadhlirahim","ccollins","adanmayer","tpeden","jsocol","TaurusOlson","jaksys","leandrocg","rube","richard6363","emddudley","JensNockert","he9lin","tmilewski","rishikulkarni","wescleymatos","mootoh","ganesan","rodrigosdo","tonktonk","skaufman","jurajpelikan","fcurella","vic","eston","hiteshmanchanda","tsigo","plang","avsej","kanzure","johnturek","percyperez","vorushin","jakemcgraw","fushang318","juniorbl","alanandrade","kenn","mitchj","webdestroya","supairish","seanhellwig","guilhermechapiewski","rainerborene","zonovo","vertocardoso","vinioliveira","hotchpotch","pch","jeffself","markmhx","Archonyx","indrode","mmaheu","sigardner","kulesa","phsr","ericflo","andyferra","shurizzle","renatoelias","klandergren","fabiomcosta","johngrimes","gleuch","ecksor","lucapette","achiu","benbjohnson","selvan","ey0t","bray","komagata","longda","pixelballistics","a2ikm","hoffmann","Rich-McGrath","abelperez","galvez","mkempe","amiridis","sfgirl","makeusabrew","dragoscrintea","grzegorzkazulak","jcmuller","JustinCampbell","dpree","jquattrocchi","sri","neonsunburst","danielemilan","poseid","chancegarcia","Prog4rammer","HTApplications","cassiomarques","andrerocker","SixArm","andrewsmedina","gaubert","parabuzzle","diogosantos","seanmccann","particlebanana","CloudMarc","majtom2grndctrl","javichito","jk","arunagw","esfand","plentz","caueguerra","albertoleal","adrianoalmeida7","guilleiguaran","donaldw","TaopaiC","stephenbreen","dissolved","ikaros","andrefaria","aporia","benlambert","coolgeng","kitop","mitukiii","kayaman","sLLiK","vmseba","nkchenz","vs","jtsay","arlolra","adaoraul","jpadvo","joshaber","ebeigarts","allenwei","nervetattoo","bostonbasso","saki","ajbolanos","seppuku","sonicgao","ainvyu","cbrammer","hostsamurai","vatrai","acadavid","danengle","paddydub","noqqe","zporter","namley","aaronky","rdegges","weatherpoof","tomxander","skyfive","Becojo","saysjonathan","awayken","nataliepo","sednova","mrigor","blatyo","cwaring","sshirokov","kam","joshfng","martintel","skorks","vamsee","Lispython","hansef","seenmyfate","kitt","Markitox","Antti","albertz","samverekar","fredrikmollerstrand","thesp0nge","kdepp","ptzn","wusher","phongvh","sayz","qbyt","mkomitee","mlen","jmanon","duk42111","Naoya-Horiguchi","brianlovesdata","dreamcat4","pxr","neiltron","tauil","jondot","phonx","mininaim","6","Mattia","blambeau","DougTabuchi","idorosen","rachelmyers","capthy","liwh","brunoarueira","DrPheltRight","csanz","scott-stewart","jacobrelkin","shaliko","AAinslie","jamierumbelow","abukhait","scottlabs","tjhanley","mmonis","mrkamel","christiancurland","clyfe","thecocktail","taicki","stephenallred","zires","acadopia","MateuszWijas","zentrification","touchinspiration","reddyonrails","mportiz08","krizzna","nmelo","andrewsardone","kotp","rossta","anups","jeffcarroll","efritz","jpogran","jdp-global","hyperbolist","bf4","lenzcom","ardwalker","L42y","sosedoff","Ajmal","abhishekmunie","kbaldyga","kamzilla","delonnewman","peter-murach","sputnikus","benwr","wijet","marlonglopes","TheFox","kblake","senny","azer","milann","ipavelek","elitau","zyan","farnhizzle","hamzakc","Kudu","arunjitsingh","azizur","kitenge","eatcpcks","lusis","gvt","jasonmelgoza","jichen","Zeelot","albertobarrila","procyon","Wackybob","curbina","goosetav","ghindle","vicmiclovich","klebervirgilio","offby1","kaaliputra","Silanus","scopevale","netzflechter","poutyface","raulmangolin","dmshann0n","cricketgeek","VikramRao","mungomash","bradheitmann","kainosnoema","iromli","jwelty","sayem","tobsch","travisanderson","lightyrs","muellmat","cameronmcefee","hector","kjetilod","kinabalu","jglee1027","andrew","metiny","dnurzynski","redpanda","necroua","karmi","lgaches","mabonyi","vyatri","korczis","67ideas","pcunnane","dpbus","ashneo76","joshmattvander","liangcw","vineetbnagaraj","jmatraszek","mkitt","pmandia","yassersouri","yudmiy","arthurix","osebboy","baant","programaker","busticated","emilpetkov","mrdg","DamianZaremba","malikbakt","georgecalm","danielribeiro","Dirklectisch","sup3rcod3r","raeffu","jitterizer","hectcastro","rudolfochrist","excid3","lampr","voidnothings","tsenart","nt","Amokrane","levicook","qnm","technolize","aodag","sansumbrella","MindTooth","scott2449","X4","mrcaron","randomor","liuzhoou","marciogm","ardiyu07","dannymcc","nfedyashev","batuhanicoz","cognominal","sax","vybs","richardrasu","xcoderzach","lucamaraschi","mohnish","pcardune","madari","TimothyKlim","nbucciarelli","jwoertink","freakyfractal","enc","lite","aanoaa","tomvleonard","mikaa123","jeanregisser","scheibo","Psli","einux","konputer","dzello","Nilloc","cmeiklejohn","georgemandis","tembamazingi","mconnor","nerdmom","spearse","larsburgess","burnto","franciscoj","sleparc","rafaelcaricio","ajray","chacha","hasanyavas","pedrolopez","timknight","jacksinn","huacnlee","justinbaker","aswadrangnekar","Captainkrtek","DrewFitz","sleepdev","tharkoos","youwannaknow","doud","tmcgilchrist","chlayverts","thomvil","digitalpardoe","sposborne","parkerl","carlosdelfino","omgitsads","tuhin","RLovelett","eregon","sanxac","ezuelectrock","tshauck","mtsoerin","hiromitz","araee","bogdanmuresan","kloderowski","msarvar","drydevelopment","1anre","icco","joestraitiff","jmileham","Refreshe","tansu-uslu","hoverlover","handyjq","xlarsx","bojovs","ajmi","fuzzyfox","lexxx233","diversen","fabianoalmeida","martinlindelof","srih4ri","adminian","pitr","ffontouras","Kjata1013","thasc","newtriks","ashbaker","Ameero","zahir","sunpech","EdlinOrg","snstoyou","nope","elemel","smly","prathe","P6rguVyrst","srisnsris","s3w47m88","semicarry","hidde-jan","rowoot","TBush","AXJ","stevedeneb","adarshp","RootSpeaking","kevasdf","Purandhar","hyesushin","DenDen1337","JBean","amhnews","aseba","diegopacheco","macluq","tonycasanova","shaoyang","rmdort","morganwatch","alexandersanz","LinGmnZ","sjh","dalpo","brentsmith","Zolomon","liveink","diulama","tanelpuhu","rcarrieche","dte","RyomaKawajiri","punytan","yoquankara","haoqili","knowncitizen","dinhkhanh","psalami","krishnanagaraj","cespujunk66","pcurry","wyattdanger","shingonoide","ngoatvm","eriknrd","philfreo","Rahulitsmca","gohavefun2","bertjwregeer","nmumen","aumgn","dobcey","davidohalloran","jowido","marksteve","dabio","rmicoy","madewulf","bosism","Tipertuba","PushinPixels","tgdn","shariefsk","m0nkey","henryleacock","r3clus3","anagri","mlareo","neil477","kdonovan","yamunamathew","berlinbrown","antawara","Cotizado25","gjorquera","Dushyanthkinjarapu","laCour","oooo723","roblecca","pmaingi","gcampbell","robeastham","jgdreyes","Caustic","morgankeys","chesleybrown","zzazang","adanoria","millr","MikeBott","keitsi","zlangley","avalanche123","ilot3k","bendiken","jeheald","ashsmithco","mycroft","lachezar","borahMoloy","cliffsull","goldenandroid","KuraFire","ngpestelos","troessner","Arnab1401","ujjwalkhanal","qadir0108","ihd2911","Firsh3k","lifeisrisky","nevans","munro9","fagiani","lojikbomb","chrisledet","ariel","marcosanson","rem","shivakantmanch","MMLK","skattyadz","mhaidarh","joedynamite","dimasaryo","trico","shaunmichael","vs4vijay","afj176","stevennathaniel","gujiao","olamedia","giupo","whatrocks","stakisko","mhockelberg","shalo","devaraj","attomos","xeneizeyorugua","ryanlecompte","jrk","deryldoucette","jacknagel","togetherville","zypher","kyledoherty","yakomoca","sastha","KMASubhani","tejasc","ErikRHanson","ghais","dontcare4free","streeter","ambreenhussain","mischa","JelenaSparic","logeshpaul","victusfate","Avaruz","hendrolaksono","jeffgw","geeksourcer","wizardwerdna","elliottgoodwin","speric","chawei","blackdoc","mgp","martinemde","tsolomko","six","jayeshinho","jakeguza","bleikamp","ryanpao","ddacunha","mrb","mamdohreda","colinvivy","piyushchauhan2011","correcto","mawaldne","swishstache","Rafe","neelvad","seriouscomedy","trendsetter","beenhero","Amper","ryanKelleher","muehlburger","marktraub","rugers285","ArtemMyagkov","oscardelben","yvesvanbroekhoven","citrus","dennismdel","SupplyBoys","italiano40","darokel","Orton","lobr","sdrkyj","ggppwx","AngeloR","zergmk2","premjg","afaolek","tobrien","fash","susanmccormick","maoer","dtrebbien","tahhan","mzahir","matthewborn","patriciomacadden","nawaidshamim","JudePea","mehrzad","ericchen0121","dominiclovell","antonr","Fir2011","mhenke","bloudermilk","PrashanthRaghu","thecoffman","hozumi","jed","baguo","grumpycola","rht","timerider","thiagocaiubi","carlop","mibbo","Imados","frankwiles","efeerdogru","realpeterz","jordanndaviss","bytecollective","brianritchie","cndv","dfd","panckreous","mike762011","MalsR","case27","mono0x","jonassm","asaaki","jhnmn","huhong","TRAVEL4FREE","marcelomilo","nmudgal","coldFox","ctubau","danlister","apurvrdx","armandogalindo","jeremysolarz","mustardhamsters","bfirsh","dmmalam","a4extra","ezkl","michaelowen","sujayhuilgol","chadlomax","dazagrohovaz","DeveloperAlex","c1c2ai","trey","joekhoobyar","jianinz","ugtkbtk","paparts","netoxico","TeacherPond","becked","tuyennguyencanada","motord","eklipse2k8","ZoomZhao","samqiu","purban","cyberorca","imonyse","jeemar","gazay","davejacobs","bwvoss","Bensign","dann","nickaoscarter","gane5h","glowindark","arielo","joannecheng","hughhefner8","broccolini","bherrup","starmbl09","tothebeat","sabram","qianthinking","iowish","lalitnama","ejr3gan","denis-bykov","cbmd","cleercode","batasrki","dstanek","markmarch","suprsankr","rcroxyosox","treeder","baddogai","froots","haoshubin","uirusan","dzhulk","aaudu","lekkerduidelijk","mcchang","pgebhard","scottgrey","dbergey","carlitosway0","cdadia","lepture","b1naryth1ef","janjohannesson","AndreyChernyh","dynjo","maxstepanov","JonRowe","attymannyluna","cooper1388","vjkaruna","fdd","GoranHalvarsson","Rajesh1213","Triopticon","ramazanayvaz","datl","jeo4long","zeroonnet","cdog","abstractj","anirudh24seven","danielwrobert","laparicio83","balupton","austymenko","avdezine","danieldyzma","jasonbuck","amasad","sideshowbandana","BrianStorti","supercleanse","TheThumbsupguy","alexcsandru","Stdubic","betawaffle","minamipj9","kylpo","ricardovaleriano","adrijlee","hlh59","chazlever","krmboya","vanm","MIchaelChua","mdjohnson1","JeffBrown711","rishabhsrao","dustMason","theLearningChan","malandrew","sac2171","Omerooo95","rnpinc","ivandro","syncopated","arnklint","jayeola","JJMoy","rahman86","josephmisiti","jfilipe","cjcnance","KingsgateRas1","chambaz","sjamayee","aelam","imanzarrabian","gaochunzy","goopi","michaelkrisper","deonomo","codejoust","aroc","cavalle","johnnyhuman","adimitrov","jshr","ssnau","caryhaynie","timmolter","spadin","mlong168","gurmeetkalra","new-top","trondga","maikeru","jamster","jsy","tommyhendr","Hasgaroth","ZephyrSL","rjyo","zephyrpellerin","neilparikh","beata","makestory","haneez","mdhabib","PaulKinlan","cheche","tyshen","bhxtl","osujikenneth","ketiko","frknlgn","katRHS","igrigorik","marianay","detroitexposure","Surgo","mindgap","hiroyukim","DilipSabat","espengra","soubhiks","jaybrent00","tikva","jessestuart","mtanas","redserpent","shukydvir","leoy","stylecoder","coryfoo","prashanthbr","robots2020","sidna","cmes","johndel","diogobaracho","markiBOY","tvkonline","shiawuen","dipak8959","rfosta","nickgoodfate","RiverBridge","fay","benza","karichel","psychicin","gag0q","kl365","nmccarthy","julien51","amylv","abinav","bramsdenteuling","AnonymousCow","ioncache","iesta","cemsisman","Ade147","seamusabshere","doublethink","claudio-alvarez","bird5230","anilanar","debugging","rupakg","ShaneIsley","wicz","roastgoat","dilhamsoft","sh4dy08","roboteti","TRMW","rahulsingal14","sanjayts","nhunzaker","baldrailers","Korrawit","frode","thorsteinsson","iveney","endel","jose152","ZhengYang","Keeguon","rahul2011","iainp999","maveonair","SirCodington","sclm","snapette","dshefchik","manderson2080","djohnston08","pirateking","giftedsam","iyerlabz","alejandrolechuga","janela","BxCx","mifan","enestanriover","kernelfail","prinxezzlja","macknight","Girllovers","AquaGeek","charleskline","Foggybtmgirl","ryanatwork","plainspace","stw","naiquevin","huangjunwen","valeh","carhartl","roycefu","tmlee","williamrh","ZachWick","zhuangbiaowei","Baker1904","Skrizy","NageshJatagond","vrillusions","geekrohit","satlavida","cleichner","jhenke","beingnessa","mcgoooo","Bloophub","punklibrarian","abelmartin","take-cheeze","petersonferreira","maxwell","OsvaldoArmando","rclosner","jccorrea","koyonote","denniscking","chanduch","sd2438892","geekard","e3matheus","mbialon","yarvin","rvhani","Predoff","darkness","savethewaves","sdoering","vaporrumors","nevayeshirazi","andysamona","rkwofford","messi1988","anibe","tpiranav","plopezbarbosa","peterkinmond","unitysoe","mjw56","johannchiang","chrismatthieu","yasirmturk","zer09","nataliav","lucasdavila","volomike","echannel-leon","rufoni2003","ramonatravels","cpkennedy","NKjoep","witalewski","lonre","stecb","josal","Zul83","Niflheim","ChanCoolKat","umesh991987","marvin","altnerd","insparbo","kmcd","marcofranssen","defiantredpill","BarcelonaRecords1","hbtvieira","kmarcini","lea22","orbotix","sdasinglesclub","buffer","shauncr","ejenkins","yahyaman","burakdd","fjordan","cwholt","yudi-rusmawan","eldios","vascoconde","niky81","mcdave","mcobery","ramen","mybuddymichael","alexandresaiz","sleighter","riyalein","johmas","chriskelly","andref5","AppSlap","celikmus","bitlag","kareem-abdelsalam","joshuamckenty","jn123456789","egonSchiele","stylepraise","shaw1337","gordonmzhu","erikkallen","ermustaqbal","denisjacquemin","msgehard","robertodecurnex","dcrall","ahto","charleseff","thejspr","twilson63","franciscosouza","jwbecher","eklitzke","serho","vbonillo","jackdracon","brahmasta","giulianoxt","rayelward","jeffw516","jewelrydeveloper","pengper","fyamnky","robinboening","Qzi","kewin2010","ossreleasefeed","strategit","mceachen","wawin","MarceI","dhagerty9009","vincentv","patrickbajao","swcool","xvfeng","thejeshgn","wbqtac","gsaly","dstegelman","cococoder","zeeshanlakhani","joeyliew7","lynda","anderslemke","thesimplecoder","gokulk","cfhcwebs","croddin","codereflect","dragon3","xuancongwen","bschaeffer","camilohe","seanhaufler","kenziecute","brawnski","hameedullah","Zearin","biblesamacharam","pendomena","Interrupt","ddispaltro","darwyn","anthoula","d10","fphilipe","noppanit","devGabriel","caseyohara","jeffreyengler","jsjohnst","spaceagecrystal","alanpca","phoenixxz","jianxioy","gnugat","tengyong","abuiles","jorgeecardona","jdham","Abranomos","mattevans","didxga","BenConstable","n8tr0n","mvrilo","akasame","oldirty","scottmangel","imd23","kpachnis","kr1sp1n","gidmakus","impulser","robmaceachern","mogria","wrb302","DBozhinovski","ttakezawa","Mckndsnco","maca","milkshakes","araslan","annmary","joycse06","DragonI","nicktran","francov88","luke-gru","cmelbye","plusjade","mooch","sgerrand","yankov","aksh","jemoiea","paulorcf","LeRoove","poptart","adamlapczynski","daegren","BaneZhang","Raki","ZiPlague","statico","mafis","deviscortez","kcnickerson","lynnwallenstein","zupolgec","tschellenbach","wallin","jomonjohnn","kkjorsvik","musaic","carlo2301","lxcid","glhuilli","extofer","Demenza","zdk","tsrajanr","emerleite","eturk","bgilham","fazli","bobcol","fleufleu","DavidAntaramian","YorickPeterse","Julzzz","tunght13488","joshduffy","spurslinux","terita","test84","sialan","McPhish","theduckcult","mg17-2","sebastianmoreno","kaikuehne","snytkine","aatif-naziri","axiomsofchoice","jinseyaluji","noogle","hinbody","psychophrenia","shaon","rizalp","ndres","edison","apcrash","monaxide","arfo90","anuprk","danho123","kadirpekel","dideler","basicallydan","Rendez","satishchandra","matt-hickford","coudenysj","jennycasteel","danroux","bottos","InkSpeck","pegasusplus","devderek","timurbatyrshin","yuchi","dmitrybelyakov","lukequaint","AndrewDavid","tetuyoko","Pa-Sky","danielocallaghan","robertomiranda","andersonfreitas","jpdubois","balasatyam","emmix","bryanmikaelian","smholloway","moos3","Myuzu","msabramo","freesoft","bangnab","prakashrai838","megsk","rono23","StarsoftAnalysis","rujmah","energee","krettig","qza","pandaboy","scott-gc","Pawz","bradpurchase","scristian71","nidarshan","adheputra","Trenker","johnattebury","Zaxis99","enelson","adorohovich","Lost-dog","stefanooldeman","qinguan","sachin-handiekar","eserra","thewiredman","mattash","hswolff","travishaynes","COMFORTOLUSEYI","ladylaia","MyRealityCoding","hiteshgoyani","mayhugh","katherinecopperield","liufengyun","mueblesguatemala","jcihain","tommyz","ainokna","giulianojordao","thaihau","orangewise","NARKOZ","mithun-daa","koganemusy","jorygraham","maketank","humbleSage","yapjanmichael","miggy","bulteau","jasonmel","serghost","vissi","DipendraGurung","happjon1","Frahaan","matiasmoya","themanuel","paolodedios","akostrikov","hugopt","linusjunya","skryptosaurus","majix","ariellephan","alimon808","intertribalmediawoman","svoloshin84","terryjbates","beingzy","FingerFeat","ventura15","DrakeRider256","resaprakasa","Amirul","mattlanham","sarsou","anatolyborodin","viralife","deepak-muley","camfortin","sturdy","monsterpatties","Diego81","punktilend","stefanprutianu","bohwalli","sixbit","chhantyal","bennytjia","jianzhiqi","robparvin","twu","JamesO","salloo","faneshia","JoshuaRamirez","CarlosCR16","hasantayyar","juliangruber","edavis","Yhippa","bokononistCoder","thepixelcoder","rprakasam","anjieya","docteurklein","jcliff","Murhaf","merrittenterprise","seanzarrin","t3dbundy","khanov","fearofcode","theoaks","xsole","miniroo321","chandu2varun3145","nixon","don-neufeld","valkyriesavage","halvors","joapsk8","adrianss","jwestredhat","ozzycodes","ua6ta123","glorieux","sevennineteen","captain-lightning","jordhy","bortan","anurag0535","stulentsev","Tusharlaroiya","prakash01","ikainn","get","Dzonatas","andamtech","sepdo","58bits","sabergeek","menot","jascenci","itwy","higgledy","waqarkhan","ric1950","abhishek0a","johnnykhil","salvianoo","omarf235","dossy","emcgurty","Skw33d","HerryOS","joshangell","ROBERTOAJR","env","lee0741","anilv","efekarakus","tijmenb","codeanu","sunnybarmota","Alex001001001","BrettBukowski","drogoff","gurkanoluc","alexanderpine","gkmngrgn","houcemlaw","alexginzburg","chetopunk77","trivektor","JennYung","omid55","jessemiller","swistaczek","samsonw","tathagata","tyzy","displacement","lindasalas","thontaddeo","hjdivad","dolatow1","thekerker","mikepack","sambacore","cntombela","Mieshon","vkartaviy","dfjones","robochuck84","pjg","opendomain","vanilacreate","khazamondo","pawankjajara","Mcneri","christus","goshakkk","somehume","jaitsu87","tetsuwo","garry420","jithinoc","dezmozz","jesswinter","abdulapopoola","smartweb","malroc","stevemckinney","GlenTrudgett","yaohuah","KOBA789","fugao","iraklid94","adnanchowdhury","alexishughes","yarchiko","rkjaer","kheme","ckilimci","eastok","gt50201","Tearjerker","serradura","waoywssy","austin908","tmaeda","ecarreras","yvesh","roni5","flixic","kschiess","ryanAbbott","Sophian","Pathum","barrycorbett","unknownnf","brok","ymirpl","twalve","jygeer","rongok","plainboy","yusukebe","Slike9","zxcvbnm4709","ispuk","pampalida","miguelbermudez","LordStandley","anaxi","tejaswidp","fernando9096","ossxp-com","KHaegwan","radube","killdream","rgonzalezpirker","warrenjyoung","hooptie45","saurabhsharan","chousho","debator","waifung0207","alvinkatojr","interactivenyc","1lj4z1","susanfelljohnson","paramaggarwal","batatinabobby","Limes102","matrix-revolution","tophtucker","lsandeep83","davidjeff","habzy","ptmardika","jast1986","VictorTango","scullkid","powlow","Favorlock","chiller345","galtech","vipulnsward","hugomastromauro","ssmith1975","madho","strugee","sbrown345","waferbaby","farfaj","alexgaribay","kstephens","seanli","greenyDeath","urbanmunki","balbaugh","companygardener","gnepud","andrewdisley","salspaugh","lazarofl","michaelokeefe","iftekharanam","jakubsvehla","goatslacker","FINESSE50","tjor","yetanothernguyen","vijaykumar-koppad","AdUki","sarnzzle","aajiwani","outsidefactor","premdewli","JulioPolo","saranjith","subodhinic","felipeguerrabr","gdm9000","ppasnani","cparker15","tcowley","HarleyRay","fuentesjr","SteveHerron","JackCA","kingbin","shakeel","benjaminbytheway","barbietunnie","arthith","AmyBearty","fbruges","amardaxini","lvhkhanh","TheCodeKing","aandnota","Macint","eknopf","Isaackmo","ddrone","bseanvt","drupalista-br","gqlewis","seanhelvey","sid140","razmakhin","spacez320","dudektria","sowawa","abhisheksharma","spirityy","andysolomon","jqcoder","zeekay","tylerlong","yukihr","infinityloop","heinrich-S","rrajkowski","Savion","hohmann","tt5609","ryojiosawa","xiaoyafeng","ltganesan","kdsoo","malikwahajahmed","bbatesmanb","Grekz","0rlando","germanluckboy","ConnorLee","eniev06","NAzT","monacate","windylcx","Corm","alyedu","grauwoelfchen","VictorTolbert","nobukatsu","azeagman","slander36","scottkidder","quaker66","fceccon","kfei27","gwilson1997","kaldon","moveck","Nico-Taing","sgulyaev","jeremywen","jtp8419","nickforce","cesararevalo","gcbsumid","abe4tawa8","Kobinsky","shijingbo","ckald","bilalabdulkany","mandarmulherkar","killertim1","nihen","vijayhc","CRahul","AmyTagava","humanitarian","jdizzle76","petersmileyface","l3dlp","epireve","PsychedelicBabe","mariusstratulat","RachidBkh","kranthiakula23","binary132","Red4life","zlulcon","munintech","chrisrowe","fdicarlo","fcruzt","runeroniek","swiss181","gadinkid","naughtystyle","MannyAcevedo","earth2travis","exia","vcube23","briantlc","andrewaynethompson","ckolderup","Maghawry","chaitanyav","osukaa","nottinhill","qzchenwl","samnang","saw123","faman06sw","frogotopia","bradlucas","Visgean","JMulligan","Lovestick","AMervin","daniellqueiroz","Deathmoon","campherkurt","Rudeboy7","wdt1512","gnnk","DlILLUSION","stanislaw","davidshenba","FeliciousX","Manauwarsheikh","akai","darrenlee","etapeta","qingliuyu","rishijain","verbondvanchristophorus","hardikdangar","Krilivye","dflems","jxin","linexteria","keketa","webmuch","fractalis","paulwoods","butu5","calvinliang","bajah","george-wicked","alanjcfs","chromano","JakeBell","uptown1919","shinvee","katettt","Jkaveri","thejared","cmattson","breezewiwiwi","xfstart07","teleyinex","fadillzzz","jefersonph","17tillidie","Anti-Fun","arjunrao2709","rhnvrm","nickxn","qfsmith1","Abbey","stoplion","safetyscissors","davidmckinnon","KevinR150","alexnotov","podviaznikov","addelyn","razex","Sheldor","codercode","yicrotkd","hemalchevli","K2K5150","VoidStatic","evilpenguin","j04ntoh","charryong","deepakdargade","vlea","qiuguo0205","xxd","JoshuaCE","jsmits21","n0nick","Hungsta","mtaus","N1tr0g3n","ducka","jslmnop","anassabri","seratch","kapilrokaya","riserice78","k3mm0tar","Daemon-Devarshi","soimort","coderprince","maslennikov","nateseay","kamexp","josephhurtado","Brian089","jokefun","dva","alex02","khora","flashburn","Smarty","resure","mhayashi1120","chirs","webista","kerrizor","pransome","GuilhermeCR","Tyusama","liedacil","rabishah","olance","natelaclaire","v4de","gerberduffy","xielingwang","creativityhurts","markur","Coffinfeeder","MotaSay","codenightlong","epequeno","AlainAlvarez","gotgithub","jina","SSE4","grayhound","Yasunaga1","drgomesp","mbtech86","metadave","iwasrobbed","faizadjeradi","ygbr","ljilja","slepcha","vishal-yadav","lagrz","caleb7bris","oyeitsme","malher","epdsn","asimsaeed","gezidan","xiaoguizi87","bigpigroy","5D","shogo807","richardashworth","himabindukandhula","thomb2233","TMKCodes","Funfun","jayesh19","andikurnia","dlboutwe","jackquack","alecasanovaprie","reireina","fiyarburst","sumanganguli","CarlosSaraiva","AntoineE","dorachua","esartorelli","taizo","jolin66","sunilsop","mattangriffel","clskkk2222","jo59nah","mmainguy","9Nautilus","jmflannery","mmacaulay","rolodexter","matmoody","RodDev","blackpixel0x17","MechanisM","KBSGUNS","Toetsenist","stapleup","PabloRibeiro","nnaficy","binaryblunt","mrtwiddletoes","7mattoo","thethumb","eddaddy","timaaarrreee","lckamal","la00mariposa","gregorynicholas","kets","MohammadRijwan"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de b/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de index c3f9748..3a04d2b 100644 --- a/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de +++ b/tests/data/github.com,api,v2,json,user,show,defunkt,following,dc4e4027f60d0737177e4d793ff8a5de @@ -1,14 +1,15 @@ -status: 304 -x-ratelimit-remaining: 58 +status: 200 +x-ratelimit-remaining: 56 content-location: https://github.com/api/v2/json/user/show/defunkt/following +-content-encoding: gzip connection: keep-alive -content-length: 2286 -server: nginx/0.7.67 -x-runtime: 26ms +content-length: 2289 +server: nginx/1.0.4 +x-runtime: 41ms x-ratelimit-limit: 60 -etag: "f2fb743e37fd58a65bd0b1eb2f4125ab" +etag: "11dadc10e6f1f70985abd24f75004f8c" cache-control: private, max-age=0, must-revalidate -date: Sun, 22 May 2011 04:32:09 GMT +date: Mon, 15 Aug 2011 19:54:06 GMT content-type: application/json; charset=utf-8 -{"users":["pjhyett","mojombo","francois","topfunky","alexcharlie","atmos","automatthew","jnunemaker","sco","jimweirich","parabuzzle","choonkeat","technoweenie","timburks","guitsaru","jeresig","pieter","3n","ryanking","boboroshi","eventualbuddha","freels","mattly","kballard","seaofclouds","nakajima","dustym","therealadam","hoverbird","monde","cnix","ryanb","josh","willcodeforfoo","rsanheim","jnewland","bmizerany","KirinDave","hornbeck","Caged","takeo","vanpelt","drnic","gpbmike","JackDanger","kvnsmth","rubyist","eschulte","jbarnette","smtlaissezfaire","foca","tekkub","jacobian","thwarted","leah","joestump","kastner","marcel","bs","m","BenWard","sstephenson","ericflo","digg","binarylogic","CodeOfficer","mtodd","karnowski","atebits","tmm1","mmalone","stephencelis","mschrag","verbal","qrush","jmhodges","tomaw","maddox","cliffmoon","jonforums","besquared","antirez","miyagawa","jquery","facebook","brianmario","simonw","rtomayko","kneath","jamis","brosner","chrisdrackett","jchris","jezdez","alex","gregnewman","mdirolf","tuaw","harperreed","threedaymonk","technomancy","rackspace","37signals","Sutto","brianjlandau","slact","pauldix","brynary","joshknowles","sd","trotter","fhwang","robhudson","ericholscher","idangazit","justinlilly","quirkey","rcrowley","bitprophet","mitsuhiko","malcolmt","djangrrl","markpasc","adamwiggins","peterc","al3x","mnot","adoy","fredreichbier","juvenn","jtauber","stevedekorte","davglass","trustthevote","ice799","DrewDouglass","andreasronge","dbr","bry4n","ushahidi","jpf","trek","jrk","mcarter","toastdriven","eric","palewire","thedaniel","ry","jessegrosjean","ultrasaurus","sarahmei","palm","notahat","tinymce","schacon","blackwinter","merlinmann","joehewitt","CaptainSqually","Jaymon","square","techcrunch","yahoo","sixapart","LukasRos","adamstac","pengwynn","brandonaaron","holman","evaryont","Tim-Smart","mkhl","mustache","chneukirchen","sr","leafychat","penny-arcade","adamsanderson","joericioppo","rupa","kennethreitz","raycmorgan","jed","consti","ericdwhite","ianb","eston","rojotek","eddit","tapajos","funkatron","joshaber","rentzsch","adamv","nedap","bryanveloso","rodjek","peff","luckiestmonkey","amiridis","frogandcode","karmi","jashkenas","igrigorik","bokowski","marijnh","judofyr","zbrock","quentinberder","kevinsawicki","bleikamp"]} \ No newline at end of file +{"users":["pjhyett","mojombo","francois","topfunky","alexcharlie","atmos","automatthew","jnunemaker","sco","jimweirich","parabuzzle","choonkeat","technoweenie","timburks","guitsaru","jeresig","pieter","3n","ryanking","boboroshi","eventualbuddha","freels","mattly","kballard","seaofclouds","nakajima","dustym","therealadam","hoverbird","monde","cnix","ryanb","josh","willcodeforfoo","rsanheim","jnewland","bmizerany","KirinDave","hornbeck","Caged","takeo","vanpelt","drnic","gpbmike","JackDanger","kvnsmth","rubyist","eschulte","jbarnette","smtlaissezfaire","foca","tekkub","jacobian","thwarted","leah","joestump","kastner","marcel","bs","m","BenWard","sstephenson","ericflo","digg","binarylogic","CodeOfficer","mtodd","karnowski","atebits","tmm1","mmalone","stephencelis","mschrag","verbal","qrush","jmhodges","tomaw","maddox","cliffmoon","jonforums","besquared","antirez","miyagawa","jquery","facebook","brianmario","simonw","rtomayko","kneath","jamis","brosner","chrisdrackett","jchris","jezdez","alex","gregnewman","mdirolf","tuaw","harperreed","threedaymonk","technomancy","rackspace","37signals","Sutto","brianjlandau","slact","pauldix","brynary","joshknowles","sd","trotter","fhwang","robhudson","ericholscher","idangazit","justinlilly","quirkey","rcrowley","bitprophet","mitsuhiko","malcolmt","djangrrl","markpasc","adamwiggins","peterc","al3x","mnot","adoy","fredreichbier","juvenn","jtauber","stevedekorte","davglass","trustthevote","ice799","DrewDouglass","andreasronge","dbr","ushahidi","jpf","trek","jrk","mcarter","toastdriven","eric","palewire","thedaniel","ry","jessegrosjean","ultrasaurus","sarahmei","palm","notahat","tinymce","schacon","blackwinter","merlinmann","joehewitt","CaptainSqually","Jaymon","square","techcrunch","yahoo","saymedia","LukasRos","adamstac","pengwynn","brandonaaron","holman","evaryont","Tim-Smart","mkhl","mustache","chneukirchen","sr","leafychat","penny-arcade","adamsanderson","joericioppo","rupa","kennethreitz","raycmorgan","jed","consti","ericdwhite","ianb","eston","rojotek","eddit","tapajos","funkatron","joshaber","rentzsch","adamv","nedap","bryanveloso","rodjek","peff","luckiestmonkey","amiridis","frogandcode","karmi","jashkenas","igrigorik","bokowski","marijnh","judofyr","zbrock","quentinberder","kevinsawicki","bleikamp","kamzilla"]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 b/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 index c3838b2..f76739c 100644 --- a/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 +++ b/tests/data/github.com,api,v2,json,user,show,mojombo,640a810b9b927be6912b70d53d6b0eb1 @@ -1,14 +1,15 @@ status: 200 x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/user/show/mojombo -x-runtime: 23ms -content-length: 391 -server: nginx/0.7.67 +-content-encoding: gzip connection: keep-alive +content-length: 391 +server: nginx/1.0.4 +x-runtime: 38ms x-ratelimit-limit: 60 -etag: "45a6fa1730ba70b40ccd595130b2390e" +etag: "1e5272c81749101c16c8d7f8239819ba" cache-control: private, max-age=0, must-revalidate -date: Mon, 11 Apr 2011 14:46:22 GMT +date: Mon, 15 Aug 2011 19:57:56 GMT content-type: application/json; charset=utf-8 -{"user":{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":49,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":1454,"login":"mojombo","email":"tom@github.com"}} \ No newline at end of file +{"user":{"gravatar_id":"25c7c18223fb42a4c6ae1c8db6f50f9b","company":"GitHub, Inc.","name":"Tom Preston-Werner","created_at":"2007/10/19 22:24:19 -0700","location":"San Francisco","public_repo_count":52,"public_gist_count":66,"blog":"http://tom.preston-werner.com","following_count":11,"id":1,"type":"User","permission":null,"followers_count":2654,"login":"mojombo","email":"tom@github.com"}} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 similarity index 62% rename from tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 rename to tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 index 5142ac5..6222b1c 100644 --- a/tests/data/github.com,api,v2,json,user,unfollow,defunkt,access_token=xxx,ec72b726c0324f7a53830c7e38ac6444 +++ b/tests/data/github.com,api,v2,json,user,unfollow,defunkt,c18f5f6c951d12528f9f3c2af3e1e623 @@ -1,14 +1,14 @@ status: 200 -x-ratelimit-remaining: 58 +x-ratelimit-remaining: 60 content-location: http://github.com/api/v2/json/user/unfollow/defunkt?access_token=xxx -x-runtime: 23ms +x-runtime: 20ms content-length: 53 -server: nginx/0.7.67 +server: nginx/1.0.4 connection: keep-alive -x-ratelimit-limit: 60 -etag: "45a6fa1730ba70b40ccd595130b2390e" +x-ratelimit-limit: 58 +etag: "397a2fcea970a6391b74eabcb62ed265" cache-control: private, max-age=0, must-revalidate -date: Mon, 11 Apr 2011 14:46:22 GMT +date: Thu, 25 Aug 2011 07:18:56 GMT content-type: application/json; charset=utf-8 {"users":["c9s","mitsuhiko","seemant","ask","tpope"]} diff --git a/tests/test_commits.py b/tests/test_commits.py index 38b2055..483846c 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -19,24 +19,24 @@ def test_list(self): commits = self.client.commits.list('JNRowe/misc-overlay') assert_equals(len(commits), 35) assert_equals(commits[0].id, - '37233b357d1a3648434ffda8f569ce96b3bcbf53') + '4de0834d58b37ef3020c49df43c95649217a2def') def test_list_with_branch(self): commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages') assert_equals(len(commits), 35) assert_equals(commits[0].id, - '482f657443df4b701137a3025ae08476cddd2b7d') + '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') def test_list_with_file(self): commits = self.client.commits.list('JNRowe/misc-overlay', file='Makefile') - assert_equals(len(commits), 31) + assert_equals(len(commits), 35) assert_equals(commits[0].id, - '41bcd985139189763256a8c82b8f0fcbe150eb03') + 'fc12b924d34dc38c8ce76d27a866221faa88cb72') def test_list_with_branch_and_file(self): commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages', 'packages/dev-python.html') assert_equals(len(commits), 35) assert_equals(commits[0].id, - '482f657443df4b701137a3025ae08476cddd2b7d') + '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') diff --git a/tests/test_issues.py b/tests/test_issues.py index 72988f3..83e2822 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -10,7 +10,7 @@ def test_issue_repr(self): issue = self.client.issues.show('ask/python-github2', 24) assert_equals(repr(issue), '') - + def test_comment_repr(self): comments = self.client.issues.comments('ask/python-github2', 24) assert_equals(repr(comments[1]), @@ -20,21 +20,22 @@ def test_comment_repr(self): class IssueQueries(utils.HttpMockTestCase): """Test issue querying""" def test_search(self): - issues = self.client.issues.search('ask/python-github2', 'timezone') - assert_equals(len(issues), 3) - assert_equals(issues[2].number, 39) + issues = self.client.issues.search('ask/python-github2', 'timezone', + 'closed') + assert_equals(len(issues), 2) + assert_equals(issues[1].number, 39) def test_list(self): issues = self.client.issues.list('ask/python-github2') - assert_equals(len(issues), 5) - assert_equals(issues[-1].number, 53) + assert_equals(len(issues), 4) + assert_equals(issues[-1].number, 58) def test_list_with_state(self): issues = self.client.issues.list('ask/python-github2', "closed") - assert_equals(len(issues), 48) - assert_equals(issues[0].number, 52) + assert_equals(len(issues), 55) + assert_equals(issues[0].number, 59) def test_issue_labels(self): labels = self.client.issues.list_labels('JNRowe/misc-overlay') - assert_equals(len(labels), 3) + assert_equals(len(labels), 4) assert_equals(labels[0], 'feature') diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 120c9c0..1425a07 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -24,10 +24,10 @@ class OrganizationQueries(utils.HttpMockTestCase): """Test organisation querying""" def test_public_repositories(self): repos = self.client.organizations.public_repositories('github') - assert_equals(len(repos), 26) + assert_equals(len(repos), 31) assert_equals(repos[2].name, 'hubahuba') def test_public_members(self): members = self.client.organizations.public_members('github') - assert_equals(len(members), 33) + assert_equals(len(members), 35) assert_equals(members[2].name, 'Ben Burkert') diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 522b799..a5ae228 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -16,5 +16,5 @@ class PullRequestQueries(utils.HttpMockTestCase): """Test pull request querying""" def test_list(self): pull_requests = self.client.pull_requests.list('ask/python-github2') - assert_equals(len(pull_requests), 2) - assert_equals(pull_requests[0].title, 'Datetime timezone handling.') + assert_equals(len(pull_requests), 1) + assert_equals(pull_requests[0].title, 'Pagination support for commits.') diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 497a5c2..750f1e2 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -36,11 +36,11 @@ def test_meta(self): assert_equals(repo.fork, False) assert_equals(repo.master_branch, None) assert_equals(repo.integration_branch, None) - assert_equals(repo.open_issues, 6) + assert_equals(repo.open_issues, 13) assert_equals(repo.created_at, datetime.datetime(2009, 5, 2, 7, 32, 50)) assert_equals(repo.pushed_at, - datetime.datetime(2011, 5, 22, 0, 24, 15)) + datetime.datetime(2011, 8, 11, 11, 46, 23)) assert_equals(repo.has_downloads, True) assert_equals(repo.has_wiki, True) assert_equals(repo.has_issues, True) @@ -56,17 +56,17 @@ def test_search(self): def test_list(self): repos = self.client.repos.list('JNRowe') - assert_equals(len(repos), 44) + assert_equals(len(repos), 48) assert_equals(repos[0].name, 'bfm') def test_watching(self): repos = self.client.repos.watching('JNRowe') - assert_equals(len(repos), 89) + assert_equals(len(repos), 90) assert_equals(repos[0].name, 'nerdtree') def test_contributors(self): contributors = self.client.repos.list_contributors('ask/python-github2') - assert_equals(len(contributors), 27) + assert_equals(len(contributors), 29) assert_equals(contributors[1].name, 'Ask Solem Hoel') diff --git a/tests/test_user.py b/tests/test_user.py index cf5444c..5fe4c5b 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -24,15 +24,15 @@ def test_meta(self): user = self.client.users.show('defunkt') assert_equals(user.created_at, datetime.datetime(2007, 10, 19, 22, 24, 19)) - assert_equals(user.followers_count, 2593) + assert_equals(user.followers_count, 3402) assert_equals(user.following_count, 212) assert_equals(user.gravatar_id, 'b8dbb1987e8e5318584865f880036796') assert_equals(user.id, 2) - assert_equals(user.public_gist_count, 277) - assert_equals(user.public_repo_count, 90) + assert_equals(user.public_gist_count, 278) + assert_equals(user.public_repo_count, 93) def test_followers(self): - assert_equals(len(self.client.users.followers('defunkt')), 2593) + assert_equals(len(self.client.users.followers('defunkt')), 3402) def test_following(self): assert_equals(len(self.client.users.following('defunkt')), 212) From 2ebc10066d1698d32125e2b198f60ad73fcc90f6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 25 Aug 2011 08:28:56 +0100 Subject: [PATCH 333/454] Force POST for user {,un}follow. --- github2/users.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/users.py b/github2/users.py index 7196a22..a75d5b3 100644 --- a/github2/users.py +++ b/github2/users.py @@ -86,7 +86,7 @@ def follow(self, other_user): :param str other_user: Github user name """ - return self.make_request("follow", other_user) + return self.make_request("follow", other_user, method="POST") @requires_auth def unfollow(self, other_user): @@ -94,4 +94,4 @@ def unfollow(self, other_user): :param str other_user: Github user name """ - return self.make_request("unfollow", other_user) + return self.make_request("unfollow", other_user, method="POST") From 22adc58c8a8f8f1335709e379d6b186759bad866 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 25 Aug 2011 08:30:19 +0100 Subject: [PATCH 334/454] Fixed empty POST requests. Fixes regression introduced in 6feaabb9. --- github2/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index cb6bddc..87cc117 100644 --- a/github2/core.py +++ b/github2/core.py @@ -134,7 +134,7 @@ def make_request(self, command, *args, **kwargs): filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} method = kwargs.get("method", "GET") - if method.upper() in ("POST", "GET") and post_data: + if method.upper() == "POST" or method.upper() == "GET" and post_data: response = self.request.post(self.domain, command, *args, **post_data) elif method.upper() == "PUT": From 0b76ff2facc3c5c4036a887866e5383c8c3c4c18 Mon Sep 17 00:00:00 2001 From: twidi Date: Mon, 29 Aug 2011 21:47:04 +0200 Subject: [PATCH 335/454] Added parent property for repository. Closes #60. --- AUTHORS | 1 + github2/repositories.py | 1 + ...ython-github2,ef4102f3c324bd1ce10d00d1b011f1c5 | 15 +++++++++++++++ tests/test_repositories.py | 6 ++++++ 4 files changed, 23 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,repos,show,JNRowe,python-github2,ef4102f3c324bd1ce10d00d1b011f1c5 diff --git a/AUTHORS b/AUTHORS index d917daf..3b88c6d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -27,3 +27,4 @@ Michael Basnight Christopher MacGown Rok Garbas Ionuț Arțăriși +twidi diff --git a/github2/repositories.py b/github2/repositories.py index 17476f1..61d6403 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -23,6 +23,7 @@ class Repository(BaseData): has_wiki = Attribute("If True, this repository has a wiki.") has_issues = Attribute("If True, this repository has an issue tracker.") language = Attribute("Primary language for the repository.") + parent = Attribute("The parent project of this fork.") def _project(self): return self.owner + "/" + self.name diff --git a/tests/data/github.com,api,v2,json,repos,show,JNRowe,python-github2,ef4102f3c324bd1ce10d00d1b011f1c5 b/tests/data/github.com,api,v2,json,repos,show,JNRowe,python-github2,ef4102f3c324bd1ce10d00d1b011f1c5 new file mode 100644 index 0000000..7fae8c2 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,JNRowe,python-github2,ef4102f3c324bd1ce10d00d1b011f1c5 @@ -0,0 +1,15 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/repos/show/JNRowe/python-github2 +-content-encoding: gzip +connection: keep-alive +content-length: 477 +server: nginx/1.0.4 +x-runtime: 14ms +x-ratelimit-limit: 60 +etag: "33efaec4c2fd40a4dd0369470bc1ab23" +cache-control: private, max-age=0, must-revalidate +date: Tue, 30 Aug 2011 09:23:19 GMT +content-type: application/json; charset=utf-8 + +{"repository":{"parent":"ask/python-github2","owner":"JNRowe","has_downloads":true,"homepage":"","pushed_at":"2011/08/25 00:43:37 -0700","watchers":3,"forks":0,"has_wiki":true,"source":"ask/python-github2","url":"https://github.com/JNRowe/python-github2","open_issues":0,"created_at":"2010/10/31 01:03:09 -0700","fork":true,"size":280,"name":"python-github2","has_issues":false,"private":false,"language":"Python","description":"github client in python, with issues support."}} \ No newline at end of file diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 750f1e2..1d90bbc 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -46,6 +46,12 @@ def test_meta(self): assert_equals(repo.has_issues, True) assert_equals(repo.language, 'Python') + def test_fork_properties(self): + repo = self.client.repos.show('JNRowe/python-github2') + assert_equals(repo.forks, 0) + assert_equals(repo.fork, True) + assert_equals(repo.parent, 'ask/python-github2') + class RepoQueries(utils.HttpMockTestCase): """Test repository querying""" From e6ffc94a01ce437bf3abd3294f9ab9df1f22a878 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:20:16 +0100 Subject: [PATCH 336/454] Allow subscript access on BaseData objects. This is a compatibility hack to allow us to switch from dictionary responses to BaseData derived objects. Refs #61. --- github2/core.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/github2/core.py b/github2/core.py index 87cc117..4a1b619 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,5 +1,7 @@ import sys +from warnings import warn + from datetime import datetime from dateutil import (parser, tz) @@ -261,6 +263,29 @@ def iterate(self): class BaseData(object): __metaclass__ = BaseDataType + def __getitem__(self, key): + """Access objects's attribute using subscript notation + + This is here purely to maintain compatibility when switching ``dict`` + responses to ``BaseData`` derived objects. + """ + warn("Subscript access on %r is deprecated, use object attributes" + % self.__class__.__name__, DeprecationWarning) + if not key in self._meta.keys(): + raise KeyError(key) + return getattr(self, key) + + def __setitem__(self, key, value): + """Update object's attribute using subscript notation + + :see: ``BaseData.__getitem__`` + """ + warn("Subscript access on %r is deprecated, use object attributes" + % self.__class__.__name__, DeprecationWarning) + if not key in self._meta.keys(): + raise KeyError(key) + setattr(self, key, value) + def repr_string(string): """Shorten string for use in repr() output From 85b23a29e7446b97e6290b1ebbdcd606e949ddd1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:41:32 +0100 Subject: [PATCH 337/454] Use BaseData derived objects where possible. These were previously returning dicts. --- github2/issues.py | 6 +++--- github2/repositories.py | 9 ++++++--- github2/teams.py | 12 ++++++------ 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index c7cc74d..52fdffe 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -170,9 +170,9 @@ def comment(self, project, number, comment): :param str comment: comment to attach to issue """ comment_data = {'comment': comment} - return self.make_request("comment", project, str(number), - post_data=comment_data, - filter='comment') + return self.get_value("comment", project, str(number), + post_data=comment_data, filter='comment', + datatype=Comment) def comments(self, project, number): """View comments on an issue. diff --git a/github2/repositories.py b/github2/repositories.py index 61d6403..2e7d65c 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -81,7 +81,8 @@ def watch(self, project): :param str project: GitHub project """ - return self.make_request("watch", project) + return self.get_value("watch", project, filter='repository', + datatype=Repository) @requires_auth def unwatch(self, project): @@ -89,7 +90,8 @@ def unwatch(self, project): :param str project: GitHub project """ - return self.make_request("unwatch", project) + return self.get_value("unwatch", project, filter='repository', + datatype=Repository) @requires_auth def fork(self, project): @@ -173,7 +175,8 @@ def network(self, project): :param str project: Github project """ - return self.make_request("show", project, "network", filter="network") + return self.get_values("show", project, "network", filter="network", + datatype=Repository) def languages(self, project): """Get programming language data for project diff --git a/github2/teams.py b/github2/teams.py index 9332b67..859a40e 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -48,9 +48,9 @@ def add_project(self, team_id, project): """ if isinstance(project, Repository): project = project.project - return self.make_request(str(team_id), "repositories", method="POST", - post_data={'name': project}, - filter="repositories", datatype=Repository) + return self.get_values(str(team_id), "repositories", method="POST", + post_data={'name': project}, + filter="repositories", datatype=Repository) def remove_project(self, team_id, project): """Remove a project to a team @@ -60,6 +60,6 @@ def remove_project(self, team_id, project): """ if isinstance(project, Repository): project = project.project - return self.make_request(str(team_id), "repositories", method="DELETE", - post_data={'name': project}, - filter="repositories", datatype=Repository) + return self.get_values(str(team_id), "repositories", method="DELETE", + post_data={'name': project}, + filter="repositories", datatype=Repository) From 011af0a9a93f6709801068e700aa89c7f340304f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:42:27 +0100 Subject: [PATCH 338/454] =?UTF-8?q?Update=20St=C3=A9phane=20Angel's=20name?= =?UTF-8?q?=20in=20AUTHORS.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AUTHORS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 3b88c6d..66d4ec9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -27,4 +27,4 @@ Michael Basnight Christopher MacGown Rok Garbas Ionuț Arțăriși -twidi +Stéphane Angel From b8aec787de2e35f09a2eabaa17613a273af39013 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:42:51 +0100 Subject: [PATCH 339/454] Minor whitespace fixes. --- github2/pull_requests.py | 2 +- github2/repositories.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 09f92e5..c90872e 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -73,7 +73,7 @@ def create(self, project, base, head, title=None, body=None, issue=None): "pull request should be attached.") pull_request_data = [("pull[%s]" % k, v) for k, v in post_data.items()] return self.get_value(project, post_data=dict(pull_request_data), - filter="pull", datatype=PullRequest) + filter="pull", datatype=PullRequest) def show(self, project, number): """Show a single pull request diff --git a/github2/repositories.py b/github2/repositories.py index 61d6403..9774ebd 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -58,7 +58,8 @@ def pushable(self): .. versionadded:: 0.3.0 """ - return self.get_values("pushable", filter="repositories", datatype=Repository) + return self.get_values("pushable", filter="repositories", + datatype=Repository) def list(self, user=None): From b74801485f3940406cf377c77bc3a6d4ff9757ee Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:43:08 +0100 Subject: [PATCH 340/454] Added OrganizeMyRepositories entry to wild.rst. --- doc/wild.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 6c83ed3..b57d04d 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -43,6 +43,15 @@ listed on this page. .. _GitHub's issue tracker: http://github.com/blog/411-github-issue-tracker +``OrganizeMyRepositories`` +'''''''''''''''''''''''''' + + The source code of the [name to come] site, a site to help you manage all + your repositories (your own, and watched/liked/followed ones) hosted by + different providers (github, bitbucket) + +:Git repository: https://github.com/twidi/OrganizeMyRepositories + ``roundabout`` '''''''''''''' From 5016a043ab6dba23f8824bb294f757e97db8da5e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:55:08 +0100 Subject: [PATCH 341/454] Use get_value{,s} instead of make_request. It makes the return type more explicit when reading the code. --- github2/issues.py | 8 ++++---- github2/repositories.py | 15 ++++++--------- github2/users.py | 8 ++++---- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index 52fdffe..43111b0 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -147,8 +147,8 @@ def add_label(self, project, number, label): :param int number: issue number in the Github database :param str label: label to attach to issue """ - return self.make_request("label/add", project, label, str(number), - filter="labels", method="POST") + return self.get_values("label/add", project, label, str(number), + filter="labels", method="POST") @requires_auth def remove_label(self, project, number, label): @@ -158,8 +158,8 @@ def remove_label(self, project, number, label): :param int number: issue number in the Github database :param str label: label to remove from issue """ - return self.make_request("label/remove", project, label, str(number), - filter="labels", method="POST") + return self.get_values("label/remove", project, label, str(number), + filter="labels", method="POST") @requires_auth def comment(self, project, number, comment): diff --git a/github2/repositories.py b/github2/repositories.py index 2e7d65c..4a88539 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -148,8 +148,8 @@ def list_collaborators(self, project): :param str project: GitHub project """ - return self.make_request("show", project, "collaborators", - filter="collaborators") + return self.get_values("show", project, "collaborators", + filter="collaborators") @requires_auth def add_collaborator(self, project, username): @@ -183,31 +183,28 @@ def languages(self, project): :param str project: Github project """ - return self.make_request("show", project, "languages", - filter="languages") + return self.get_values("show", project, "languages", filter="languages") def tags(self, project): """Get tags for project :param str project: Github project """ - return self.make_request("show", project, "tags", filter="tags") + return self.get_values("show", project, "tags", filter="tags") def branches(self, project): """Get branch names for project :param str project: Github project """ - return self.make_request("show", project, "branches", - filter="branches") + return self.get_values("show", project, "branches", filter="branches") def watchers(self, project): """Get list of watchers for project :param str project: Github project """ - return self.make_request("show", project, "watchers", - filter="watchers") + return self.get_values("show", project, "watchers", filter="watchers") def watching(self, for_user=None): """Lists all the repos a user is watching diff --git a/github2/users.py b/github2/users.py index a75d5b3..19efcca 100644 --- a/github2/users.py +++ b/github2/users.py @@ -71,14 +71,14 @@ def followers(self, username): :param str username: Github user name """ - return self.make_request("show", username, "followers", filter="users") + return self.get_values("show", username, "followers", filter="users") def following(self, username): """Get list of users a Github user is following :param str username: Github user name """ - return self.make_request("show", username, "following", filter="users") + return self.get_values("show", username, "following", filter="users") @requires_auth def follow(self, other_user): @@ -86,7 +86,7 @@ def follow(self, other_user): :param str other_user: Github user name """ - return self.make_request("follow", other_user, method="POST") + return self.get_values("follow", other_user, method="POST") @requires_auth def unfollow(self, other_user): @@ -94,4 +94,4 @@ def unfollow(self, other_user): :param str other_user: Github user name """ - return self.make_request("unfollow", other_user, method="POST") + return self.get_values("unfollow", other_user, method="POST") From c0d021998556c0e0a1121684b652a97be1a47db2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 12:55:35 +0100 Subject: [PATCH 342/454] Adding a collaborator requires POST. --- github2/repositories.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/repositories.py b/github2/repositories.py index 9774ebd..43fe82d 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -157,7 +157,8 @@ def add_collaborator(self, project, username): :param str project: Github project :param str username: Github user to add as collaborator """ - return self.make_request("collaborators", project, "add", username) + return self.make_request("collaborators", project, "add", username, + method="POST") @requires_auth def remove_collaborator(self, project, username): From d5a84291a2e92995099fa2cb8f2c9e8316c2d422 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 30 Aug 2011 15:44:01 +0100 Subject: [PATCH 343/454] =?UTF-8?q?Added=20test=20for=20attribute=20?= =?UTF-8?q?=E2=86=92=20=5F=5Fgetitem=5F=5F=20support.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_unit.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 43fe2fc..9d6650b 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -50,6 +50,18 @@ def test_iter(self): assert_true('__iter__' in dir(commit)) +class BaseDataDict(utils.HttpMockTestCase): + """Test __getitem__ availability on objects""" + def test_getitem(self): + user = self.client.users.show('defunkt') + assert_equals(user['blog'], user.blog) + assert_equals(user['company'], user.company) + assert_equals(user['email'], user.email) + assert_equals(user['location'], user.location) + assert_equals(user['login'], user.login) + assert_equals(user['name'], user.name) + + def test_project_for_user_repo(): client = Github() assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), From 96c2fa7d5d4c2439611b4caf87f30844abbfdae5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 2 Sep 2011 17:36:29 +0100 Subject: [PATCH 344/454] Bumped version to 0.5.2. --- NEWS.rst | 8 ++++++++ README.rst | 2 +- github2/__init__.py | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 7a8b477..cebb8ac 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -3,6 +3,14 @@ User-visible changes .. contents:: +0.5.2 - 2011-09-02 +------------------ + +* Functions that returned `dict` objects have been deprecated, enable + DeprecationWarning_ support to see if you're affected + +.. _DeprecationWarning: http://docs.python.org/library/warnings.html + 0.5.1 - 2011-06-11 ------------------ diff --git a/README.rst b/README.rst index d28c84e..0746644 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.5.1 +:Version: 0.5.2 This is a Python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index b65a729..ce95e04 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,5 +1,5 @@ "Github API v2 library for Python" -VERSION = (0, 5, 1) +VERSION = (0, 5, 2) __author__ = "Ask Solem" __contact__ = "askh@opera.com" From 234e9066b5fb6343e12a285efeb4f0045b9cfb94 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 5 Sep 2011 15:58:26 +0100 Subject: [PATCH 345/454] HTTP exceptions should allow easy access to response data. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to Stéphane Angel for the suggestion. Refs #62. --- github2/request.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index 7a6581c..d350d55 100644 --- a/github2/request.py +++ b/github2/request.py @@ -3,6 +3,7 @@ import re import time import httplib2 +from httplib import responses try: import json as simplejson # For Python 2.6 except ImportError: @@ -41,6 +42,25 @@ class GithubError(Exception): """An error occured when making a request to the Github API.""" +class HttpError(RuntimeError): + """A HTTP error occured when making a request to the Github API.""" + def __init__(self, message, content, code): + """Create a HttpError exception + + :param str message: Exception string + :param str content: Full content of HTTP request + :param int code: HTTP status code + """ + self.args = (message, content, code) + self.message = message + self.content = content + self.code = code + if code: + self.code_reason = responses[code] + else: + self.code_reason = "" + + class GithubRequest(object): github_url = GITHUB_URL url_format = "%(github_url)s/api/%(api_version)s/%(api_format)s" @@ -143,8 +163,9 @@ def raw_request(self, url, extra_post_data, method="GET"): logging.debug("URL: %r POST_DATA: %r RESPONSE_TEXT: %r", url, post_data, content) if response.status >= 400: - raise RuntimeError("unexpected response from github.com %d: %r" % ( - response.status, content)) + raise HttpError("Unexpected response from github.com %d: %r" + % (response.status, content), content, + response.status) json = simplejson.loads(content.decode(charset_from_headers(response))) if json.get("error"): raise self.GithubError(json["error"][0]["error"]) From 2b6c15ec872cfb3e94dbd2c15b31210f2e4bb4f1 Mon Sep 17 00:00:00 2001 From: twidi Date: Thu, 8 Sep 2011 02:35:29 +0200 Subject: [PATCH 346/454] OrganizeMyRepositories is now named "Repos.io" --- doc/wild.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/wild.rst b/doc/wild.rst index b57d04d..52c6c38 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -43,14 +43,14 @@ listed on this page. .. _GitHub's issue tracker: http://github.com/blog/411-github-issue-tracker -``OrganizeMyRepositories`` -'''''''''''''''''''''''''' +``Repos.io`` +'''''''''''' - The source code of the [name to come] site, a site to help you manage all - your repositories (your own, and watched/liked/followed ones) hosted by - different providers (github, bitbucket) + The source code of the Repos.io site, a site to help you manage all your + repositories (your own, and watched/liked/followed ones) hosted by different + providers (github, bitbucket) -:Git repository: https://github.com/twidi/OrganizeMyRepositories +:Git repository: https://github.com/twidi/Repos.io ``roundabout`` '''''''''''''' From 00e2ce5f3a1c199fa74591d5944d6dbbe5c57a8a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 7 Oct 2011 21:18:36 +0100 Subject: [PATCH 347/454] Added applause to 'in the wild' document. --- doc/wild.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 52c6c38..6ee7751 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -10,6 +10,13 @@ listed on this page. :mod:`github2`? Add it to this list! Just `open an issue`_ or click the ``Fork and edit this file`` button on the `project website`_ +``applause`` +'''''''''''' + + Applause when a bug gets closed. Extra cheering for old bugs. + +:PyPI page: :pypi:`applause` + ``bitbucket2github`` '''''''''''''''''''' From a8125aad2e41af7bbd864dc2ffb7f76eb534c3d2 Mon Sep 17 00:00:00 2001 From: twidi Date: Mon, 17 Oct 2011 22:54:43 +0200 Subject: [PATCH 348/454] Add `page` parameter for objects supporting a list. --- github2/commits.py | 7 ++++--- github2/core.py | 3 +++ github2/pull_requests.py | 5 +++-- github2/repositories.py | 10 ++++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/github2/commits.py b/github2/commits.py index a671901..8910937 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -27,7 +27,7 @@ def __repr__(self): class Commits(GithubCommand): domain = "commits" - def list(self, project, branch="master", file=None): + def list(self, project, branch="master", file=None, page=1): """List commits on a project .. warning:: @@ -38,9 +38,10 @@ def list(self, project, branch="master", file=None): :param str project: project name :param str branch: branch name, or ``master`` if not given :param str file: optional file filter + :param int page: optional page number """ - return self.get_values("list", project, branch, file, - filter="commits", datatype=Commit) + return self.get_values("list", project, branch, file, filter="commits", + datatype=Commit, page=page) def show(self, project, sha): """Get a specific commit diff --git a/github2/core.py b/github2/core.py index 4a1b619..4e11ec7 100644 --- a/github2/core.py +++ b/github2/core.py @@ -135,6 +135,9 @@ def __init__(self, request): def make_request(self, command, *args, **kwargs): filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} + page = kwargs.pop("page", 1) + if page and not page == 1: + post_data["page"] = page method = kwargs.get("method", "GET") if method.upper() == "POST" or method.upper() == "GET" and post_data: response = self.request.post(self.domain, command, *args, diff --git a/github2/pull_requests.py b/github2/pull_requests.py index c90872e..3573f75 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -84,11 +84,12 @@ def show(self, project, number): return self.get_value(project, str(number), filter="pull", datatype=PullRequest) - def list(self, project, state="open"): + def list(self, project, state="open", page=1): """List all pull requests for a project :param str project: Github project :param str state: can be either ``open`` or ``closed`` + :param int page: optional page number """ return self.get_values(project, state, filter="pulls", - datatype=PullRequest) + datatype=PullRequest, page=page) diff --git a/github2/repositories.py b/github2/repositories.py index 11ded7a..2a81be7 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -62,7 +62,7 @@ def pushable(self): datatype=Repository) - def list(self, user=None): + def list(self, user=None, page=1): """Return a list of all repositories for a user. .. deprecated: 0.4.0 @@ -71,10 +71,11 @@ def list(self, user=None): brittle and will be removed in a future release! :param str user: Github user name to list repositories for + :param int page: optional page number """ user = user or self.request.username return self.get_values("show", user, filter="repositories", - datatype=Repository) + datatype=Repository, page=page) @requires_auth def watch(self, project): @@ -208,14 +209,15 @@ def watchers(self, project): """ return self.get_values("show", project, "watchers", filter="watchers") - def watching(self, for_user=None): + def watching(self, for_user=None, page=None): """Lists all the repos a user is watching :param str for_user: optional Github user name to list repositories for + :param int page: optional page number """ for_user = for_user or self.request.username return self.get_values("watched", for_user, filter="repositories", - datatype=Repository) + datatype=Repository, page=page) def list_contributors(self, project): """Lists all the contributors in a project From ed1e23c0ce33353dc2d41dce6f172a644a805345 Mon Sep 17 00:00:00 2001 From: twidi Date: Mon, 17 Oct 2011 22:54:43 +0200 Subject: [PATCH 349/454] Added warning for unpageable requests. --- github2/repositories.py | 3 +++ github2/users.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index 2a81be7..2724627 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -39,6 +39,9 @@ class Repositories(GithubCommand): def search(self, query): """Get all repositories that match term. + .. warning: + Returns at most 100 repositories + :param str query: term to search issues for """ return self.get_values("search", query, filter="repositories", diff --git a/github2/users.py b/github2/users.py index 19efcca..3a40a8f 100644 --- a/github2/users.py +++ b/github2/users.py @@ -43,6 +43,9 @@ class Users(GithubCommand): def search(self, query): """Search for users + .. warning: + Returns at most 100 users + :param str query: term to search for """ return self.get_values("search", urllib.quote_plus(query), From ab8ec7d91c330dafad7a120f198eaf9148f7830c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 19 Oct 2011 09:36:12 +0100 Subject: [PATCH 350/454] Added tests/examples for paged request results. --- doc/api/commit.rst | 4 ++++ doc/api/pull_requests.rst | 5 +++++ doc/api/repos.rst | 8 +++++--- ...isc,master,a252487bd992cdfc8247b3c41d0cb9fa | 18 ++++++++++++++++++ ...y-zsh,open,b0f946d4b280dcc6f7b65dd7fddeea6b | 16 ++++++++++++++++ ...how,tekkub,05ca6f8b40fe3e2ecd7da9236cbe8004 | 16 ++++++++++++++++ ...hed,tekkub,ab3eb0c9eb0123839606c57857627b30 | 16 ++++++++++++++++ tests/test_commits.py | 6 ++++++ tests/test_pull_requests.py | 6 ++++++ tests/test_repositories.py | 10 ++++++++++ 10 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa create mode 100644 tests/data/github.com,api,v2,json,pulls,robbyrussell,oh-my-zsh,open,b0f946d4b280dcc6f7b65dd7fddeea6b create mode 100644 tests/data/github.com,api,v2,json,repos,show,tekkub,05ca6f8b40fe3e2ecd7da9236cbe8004 create mode 100644 tests/data/github.com,api,v2,json,repos,watched,tekkub,ab3eb0c9eb0123839606c57857627b30 diff --git a/doc/api/commit.rst b/doc/api/commit.rst index 7a37e07..e4a69bf 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -21,6 +21,10 @@ Listing Commits on a Branch >>> commits = github.commits.list("mojombo/grit", "master") +By default the first page of results is returned, you can return further results +with the ``page`` parameter: + + >>> commits = github.commits.list("mojombo/grit", "master", page=2) Listing Commits for a File '''''''''''''''''''''''''' diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst index a2748cc..140a824 100644 --- a/doc/api/pull_requests.rst +++ b/doc/api/pull_requests.rst @@ -19,6 +19,11 @@ Listing pull requests >>> results = github.pull_requests.list("ask/python-github2") +By default the first page of results is returned, you can return further results +with the ``page`` parameter: + + >>> results = github.pull_requests.list("ask/python-github2", page=2) + View a pull request ''''''''''''''''''' diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 45c4b4a..4f777ee 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -32,11 +32,13 @@ Show Repo Info List All Repositories ''''''''''''''''''''' - # By default lists all repos for the current user. - >>> repos = github.repos.list() - >>> repos = github.repos.list("schacon") +By default the first page of results is returned, you can return further results +with the ``page`` parameter: + + >>> repos = github.repos.list("schacon", page=2) + Watching Repositories ''''''''''''''''''''' diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa b/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa new file mode 100644 index 0000000..7128271 --- /dev/null +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa @@ -0,0 +1,18 @@ +status: 200 +x-ratelimit-remaining: 59 +content-location: https://github.com/api/v2/json/commits/list/JNRowe/jnrowe-misc/master?page=2 +-content-encoding: gzip +set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; + path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly +connection: keep-alive +content-length: 22608 +server: nginx/1.0.4 +x-runtime: 76ms +x-ratelimit-limit: 60 +etag: "c08770df8de8932404acd85ac90b5ec1" +cache-control: private, max-age=0, must-revalidate +date: Wed, 19 Oct 2011 08:33:37 GMT +x-frame-options: deny +content-type: application/json; charset=utf-8 + +{"commits":[{"parents":[{"id":"243c33a2060d5cd51290d52195e1715ac29b2b58"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/1f5ad2c3206bafc4aca9e6ce50f5c605befdb3d6","id":"1f5ad2c3206bafc4aca9e6ce50f5c605befdb3d6","committed_date":"2011-10-12T16:07:14-07:00","authored_date":"2011-10-12T16:07:14-07:00","message":"Pushed hammertime stabilisation back 90 days.\n\nWaiting on upstream to stabilise git-python.","tree":"677ba94fca78e6d1430a49c2c1cd27e05a209eaf","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"5514efe6f3f2e9f7a58f0049521c8384a1c8ceb2"},{"id":"4b85ff1be7b73b1a1a3d11cc9de56e6dfd42540f"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/243c33a2060d5cd51290d52195e1715ac29b2b58","id":"243c33a2060d5cd51290d52195e1715ac29b2b58","committed_date":"2011-10-10T18:18:42-07:00","authored_date":"2011-10-10T18:18:42-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n notmuch-0.7-r1 keyworded x86.\n gitflow-0.4.1-r1 keyworded x86.\n\nConflicts:\n\tmetadata/cache/mail-client/notmuch-0.7\n\tmetadata/cache/mail-client/notmuch-0.7-r1","tree":"7886c72264760286420375d3e85c865fdfb8defc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"902317c71edc00f69edec774c5cce281c2cd9fbe"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/4b85ff1be7b73b1a1a3d11cc9de56e6dfd42540f","id":"4b85ff1be7b73b1a1a3d11cc9de56e6dfd42540f","committed_date":"2011-10-10T18:17:28-07:00","authored_date":"2011-10-10T18:16:47-07:00","message":"notmuch-0.7-r1 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"d1595b60f8341cf8dbbf8deff3952ff16163462e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"ca357f4dbfd0fb84b1e69f21319834a4231a32d6"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/902317c71edc00f69edec774c5cce281c2cd9fbe","id":"902317c71edc00f69edec774c5cce281c2cd9fbe","committed_date":"2011-10-10T18:16:22-07:00","authored_date":"2011-10-10T18:16:07-07:00","message":"gitflow-0.4.1-r1 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"524a4017fb63380d0aee437a65a31f2a6d6d0d47","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e40f04082fd0d65779b4dc4ff183228678da3a48"},{"id":"116b9861acf29a2cf0161008d372e46d8ecd6b94"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/ca357f4dbfd0fb84b1e69f21319834a4231a32d6","id":"ca357f4dbfd0fb84b1e69f21319834a4231a32d6","committed_date":"2011-10-10T18:15:11-07:00","authored_date":"2011-10-10T18:15:11-07:00","message":"Merge branch 'maint/amd64_keywording' into maint/x86_keywording\n\n* maint/amd64_keywording:\n notmuch-0.7-r1 keyworded amd64.\n gitflow-0.4.1-r1 keyworded amd64.","tree":"af0f14bb6eaa8acfedf8e3f2e6dd2a7de4c1b7fb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f7b6644a57cc3ea0032bf39a0adef64474335bc4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/5514efe6f3f2e9f7a58f0049521c8384a1c8ceb2","id":"5514efe6f3f2e9f7a58f0049521c8384a1c8ceb2","committed_date":"2011-10-10T12:58:52-07:00","authored_date":"2011-10-10T12:58:52-07:00","message":"Synced metadata cache for upstream's ruby eclass changes.","tree":"7b475d494eaa1fc176a200ed265af02ff772fb19","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b0d6bf4cec00418a08c1cd8250260742ad78de72"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/f7b6644a57cc3ea0032bf39a0adef64474335bc4","id":"f7b6644a57cc3ea0032bf39a0adef64474335bc4","committed_date":"2011-10-10T12:58:44-07:00","authored_date":"2011-10-10T12:58:44-07:00","message":"Synced metadata cache for upstream's python eclass changes.","tree":"0871aa5e0e17acbd82845416990bb8e4711ee2a0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b7a2bc11de398d17a584cbaa6d997fe72629f1d0"},{"id":"116b9861acf29a2cf0161008d372e46d8ecd6b94"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/b0d6bf4cec00418a08c1cd8250260742ad78de72","id":"b0d6bf4cec00418a08c1cd8250260742ad78de72","committed_date":"2011-10-10T12:57:08-07:00","authored_date":"2011-10-10T12:57:08-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n notmuch-0.7-r1 keyworded amd64.\n gitflow-0.4.1-r1 keyworded amd64.","tree":"af0f14bb6eaa8acfedf8e3f2e6dd2a7de4c1b7fb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d6461d1383c27228fbb95e13adb92f32f98585bb"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/116b9861acf29a2cf0161008d372e46d8ecd6b94","id":"116b9861acf29a2cf0161008d372e46d8ecd6b94","committed_date":"2011-10-10T12:56:57-07:00","authored_date":"2011-10-10T12:56:18-07:00","message":"notmuch-0.7-r1 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"af0f14bb6eaa8acfedf8e3f2e6dd2a7de4c1b7fb","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"b7a2bc11de398d17a584cbaa6d997fe72629f1d0"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/d6461d1383c27228fbb95e13adb92f32f98585bb","id":"d6461d1383c27228fbb95e13adb92f32f98585bb","committed_date":"2011-10-10T12:55:54-07:00","authored_date":"2011-10-10T12:55:40-07:00","message":"gitflow-0.4.1-r1 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"cb7b49317a7c3d0f0c4de862a074f5c165162b56","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"baa8903ad5083ac52a344000f104e00f6add0607"},{"id":"e40f04082fd0d65779b4dc4ff183228678da3a48"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/b7a2bc11de398d17a584cbaa6d997fe72629f1d0","id":"b7a2bc11de398d17a584cbaa6d997fe72629f1d0","committed_date":"2011-10-06T13:51:44-07:00","authored_date":"2011-10-06T13:51:44-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n Pushed hubugs stabilisation back 30 days.\n virtualenvwrapper-2.9 keyworded x86.\n sphinxcontrib-issuetracker-0.9 keyworded x86.\n Pushed github2 stabilisation back 30 days.\n argh-0.14.1 keyworded x86.\n Pushed hubugs stabilisation back 30 days.\n virtualenvwrapper-2.9 keyworded amd64.\n sphinxcontrib-issuetracker-0.9 keyworded amd64.\n Pushed github2 stabilisation back 30 days.\n argh-0.14.1 keyworded amd64.","tree":"f9d4490139bd84f62e00bde0f7655bc69f827d2d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"8f07dc29d4f3f882a95f75bfef58e5b3b5f846a3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/e40f04082fd0d65779b4dc4ff183228678da3a48","id":"e40f04082fd0d65779b4dc4ff183228678da3a48","committed_date":"2011-10-06T13:51:37-07:00","authored_date":"2011-10-06T13:51:37-07:00","message":"Pushed hubugs stabilisation back 30 days.\n\nWaiting on upstream to stabilise httplib2 for github2.","tree":"f9d4490139bd84f62e00bde0f7655bc69f827d2d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"39ec48f45cc57d9dbf14ad2194d718afdaa80257"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/8f07dc29d4f3f882a95f75bfef58e5b3b5f846a3","id":"8f07dc29d4f3f882a95f75bfef58e5b3b5f846a3","committed_date":"2011-10-06T13:51:20-07:00","authored_date":"2011-10-06T13:51:13-07:00","message":"virtualenvwrapper-2.9 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"97d75cbb684ff4ba8d1c5810c7055e9450b7f9c1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"12879c35cb79a3cc162c39f3fbddf22d8b74f1d3"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/39ec48f45cc57d9dbf14ad2194d718afdaa80257","id":"39ec48f45cc57d9dbf14ad2194d718afdaa80257","committed_date":"2011-10-06T13:50:38-07:00","authored_date":"2011-10-06T13:50:27-07:00","message":"sphinxcontrib-issuetracker-0.9 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"b918414c2d44d0ad8d3c40cf37c1eb163926c23e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"5a10ee7f895b5262c5608ce81d4c65c921d3c048"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/12879c35cb79a3cc162c39f3fbddf22d8b74f1d3","id":"12879c35cb79a3cc162c39f3fbddf22d8b74f1d3","committed_date":"2011-10-06T13:49:57-07:00","authored_date":"2011-10-06T13:49:57-07:00","message":"Pushed github2 stabilisation back 30 days.\n\nWaiting on upstream to stabilise httplib2.","tree":"286d652bf585eea95950c80569642d788d01d8a2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"f5d532003b18bf6bab2a3f6b87732058d46d2153"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/5a10ee7f895b5262c5608ce81d4c65c921d3c048","id":"5a10ee7f895b5262c5608ce81d4c65c921d3c048","committed_date":"2011-10-06T13:49:25-07:00","authored_date":"2011-10-06T13:49:13-07:00","message":"argh-0.14.1 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"0a4249ac47d63c6d882442cadaad66936547a61d","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"4bd60274bbb6ee0fa3448191b55c0f8e55e326d2"},{"id":"fecae2825deeebbbb4b0315f6cc74c5ac909f396"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/f5d532003b18bf6bab2a3f6b87732058d46d2153","id":"f5d532003b18bf6bab2a3f6b87732058d46d2153","committed_date":"2011-10-06T13:45:29-07:00","authored_date":"2011-10-06T13:45:29-07:00","message":"Merge branch 'maint/amd64_keywording' into maint/x86_keywording\n\n* maint/amd64_keywording:\n Pushed hubugs stabilisation back 30 days.\n virtualenvwrapper-2.9 keyworded amd64.\n sphinxcontrib-issuetracker-0.9 keyworded amd64.\n Pushed github2 stabilisation back 30 days.\n argh-0.14.1 keyworded amd64.","tree":"38b6893bc9dfe17c95bc9726580f7f7848b780ab","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6201dc6d93c4f9ebf1d6a78ce77cb010edc9bb92"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/fecae2825deeebbbb4b0315f6cc74c5ac909f396","id":"fecae2825deeebbbb4b0315f6cc74c5ac909f396","committed_date":"2011-10-06T12:35:41-07:00","authored_date":"2011-10-06T12:35:41-07:00","message":"Pushed hubugs stabilisation back 30 days.\n\nWaiting on upstream to stabilise httplib2 for github2.","tree":"38b6893bc9dfe17c95bc9726580f7f7848b780ab","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"37fed3c9c8cf3760c5f3b620307cb75998ca43fd"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/6201dc6d93c4f9ebf1d6a78ce77cb010edc9bb92","id":"6201dc6d93c4f9ebf1d6a78ce77cb010edc9bb92","committed_date":"2011-10-06T12:34:52-07:00","authored_date":"2011-10-06T12:34:41-07:00","message":"virtualenvwrapper-2.9 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"746f31efe1f0a235715f226e1546077a5604cac9","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"dce45a46cfac68218770173a3ea85d6e5c8c8738"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/37fed3c9c8cf3760c5f3b620307cb75998ca43fd","id":"37fed3c9c8cf3760c5f3b620307cb75998ca43fd","committed_date":"2011-10-06T12:34:11-07:00","authored_date":"2011-10-06T12:33:53-07:00","message":"sphinxcontrib-issuetracker-0.9 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"4c442627b85f14891bbc9ad433e70fbf608f4bfd","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d5bc5958475581d429e7a5fe3d8a5ea32cf36c14"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/dce45a46cfac68218770173a3ea85d6e5c8c8738","id":"dce45a46cfac68218770173a3ea85d6e5c8c8738","committed_date":"2011-10-06T12:33:12-07:00","authored_date":"2011-10-06T12:33:06-07:00","message":"Pushed github2 stabilisation back 30 days.\n\nWaiting on upstream to stabilise >httplib2-0.7.","tree":"a94c7c50c583ea077aea940605f8917b809021c9","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"baa8903ad5083ac52a344000f104e00f6add0607"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/d5bc5958475581d429e7a5fe3d8a5ea32cf36c14","id":"d5bc5958475581d429e7a5fe3d8a5ea32cf36c14","committed_date":"2011-10-06T12:32:14-07:00","authored_date":"2011-10-06T12:31:53-07:00","message":"argh-0.14.1 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"b75f02ad8ecf5461d834fceccea3054a36113616","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"fdf889cbecf352d2a128ac571679f18fdbe13358"},{"id":"4bd60274bbb6ee0fa3448191b55c0f8e55e326d2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/baa8903ad5083ac52a344000f104e00f6add0607","id":"baa8903ad5083ac52a344000f104e00f6add0607","committed_date":"2011-10-05T15:27:54-07:00","authored_date":"2011-10-05T15:27:54-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n poster-0.8.1-r1 keyworded x86.\n Pushed pycparser stabilisation back 120 days.\n Pushed mnemosyne stabilisation back 120 days.\n poster-0.8.1-r1 keyworded amd64.\n Pushed pycparser stabilisation back 120 days.\n Pushed mnemosyne stabilisation back 120 days.","tree":"ea91858ca8eacb66b5740d714d4c6fe2d21de420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"d04abe67da0a7e20eeab22627e7a3b9763f45894"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/4bd60274bbb6ee0fa3448191b55c0f8e55e326d2","id":"4bd60274bbb6ee0fa3448191b55c0f8e55e326d2","committed_date":"2011-10-05T15:27:24-07:00","authored_date":"2011-10-05T15:27:14-07:00","message":"poster-0.8.1-r1 keyworded x86.\n\n(Portage version: 2.1.10.11/git/Linux x86, signed Manifest commit with key C0174749)","tree":"ea91858ca8eacb66b5740d714d4c6fe2d21de420","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"6d6527c2c8fe0811b571886047d56da51ea54da4"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/d04abe67da0a7e20eeab22627e7a3b9763f45894","id":"d04abe67da0a7e20eeab22627e7a3b9763f45894","committed_date":"2011-10-05T15:26:32-07:00","authored_date":"2011-10-05T15:26:32-07:00","message":"Pushed pycparser stabilisation back 120 days.\n\nWaiting on upstream to stabilise ply.","tree":"d93a8a679e59ec246d8b50473614d72b85e408be","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c2803c6976c504e3ceb84b51393181f88b7ba206"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/6d6527c2c8fe0811b571886047d56da51ea54da4","id":"6d6527c2c8fe0811b571886047d56da51ea54da4","committed_date":"2011-10-05T15:26:03-07:00","authored_date":"2011-10-05T15:26:03-07:00","message":"Pushed mnemosyne stabilisation back 120 days.\n\nWaiting on upstream to stabilise kid.","tree":"d045483f6281a9794ded4ecafed72dd54fe3852e","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"acdf46261919b8244acdc36b323c9f8139f0b72b"},{"id":"4f472c1925b03eb936c424a65555be09c45d1a23"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/c2803c6976c504e3ceb84b51393181f88b7ba206","id":"c2803c6976c504e3ceb84b51393181f88b7ba206","committed_date":"2011-10-05T15:25:27-07:00","authored_date":"2011-10-05T15:25:27-07:00","message":"Merge branch 'maint/amd64_keywording' into maint/x86_keywording\n\n* maint/amd64_keywording:\n poster-0.8.1-r1 keyworded amd64.\n Pushed pycparser stabilisation back 120 days.\n Pushed mnemosyne stabilisation back 120 days.","tree":"e1fb02fb2adc92e006c25d7e2795e269fc32a9c1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"e6ca71e08bb48a7f1d5aebdaa21eb41404e57124"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/4f472c1925b03eb936c424a65555be09c45d1a23","id":"4f472c1925b03eb936c424a65555be09c45d1a23","committed_date":"2011-10-05T06:12:54-07:00","authored_date":"2011-10-05T06:12:39-07:00","message":"poster-0.8.1-r1 keyworded amd64.\n\n(Portage version: 2.1.10.11/git/Linux x86_64, signed Manifest commit with key C0174749)","tree":"e1fb02fb2adc92e006c25d7e2795e269fc32a9c1","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c8e0a78296e4da35a999939484e2949115116aac"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/e6ca71e08bb48a7f1d5aebdaa21eb41404e57124","id":"e6ca71e08bb48a7f1d5aebdaa21eb41404e57124","committed_date":"2011-10-05T06:11:42-07:00","authored_date":"2011-10-05T06:11:42-07:00","message":"Pushed pycparser stabilisation back 120 days.\n\nWaiting on upstream to stabilise ply.","tree":"854e90ed4557a301e50313762fc7611c971db4c2","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"fdf889cbecf352d2a128ac571679f18fdbe13358"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/c8e0a78296e4da35a999939484e2949115116aac","id":"c8e0a78296e4da35a999939484e2949115116aac","committed_date":"2011-10-05T06:11:04-07:00","authored_date":"2011-10-05T06:11:04-07:00","message":"Pushed mnemosyne stabilisation back 120 days.\n\nWaiting on upstream to stabilise kid.","tree":"883c3796c8a3f023b247e2513267e23731fe69d7","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"a676eb056510cc903a441289bda41a75261dd9c4"},{"id":"acdf46261919b8244acdc36b323c9f8139f0b72b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/fdf889cbecf352d2a128ac571679f18fdbe13358","id":"fdf889cbecf352d2a128ac571679f18fdbe13358","committed_date":"2011-10-01T12:55:17-07:00","authored_date":"2011-10-01T12:55:17-07:00","message":"Merge branch 'maint/x86_keywording'\n\n* maint/x86_keywording:\n Pushed termtool stabilisation back 30 days.","tree":"0f94ddc8cfcb53350d9fe268dfcc43092f6b3edc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"38e453da5deea4142a3e46ce8c271f1237185b7d"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/acdf46261919b8244acdc36b323c9f8139f0b72b","id":"acdf46261919b8244acdc36b323c9f8139f0b72b","committed_date":"2011-10-01T12:55:10-07:00","authored_date":"2011-10-01T12:55:10-07:00","message":"Pushed termtool stabilisation back 30 days.\n\nWaiting on upstream to stabilise progressbar.","tree":"0f94ddc8cfcb53350d9fe268dfcc43092f6b3edc","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"c0a7946e57249619437d4c47207cb99ae2741cb6"},{"id":"70dbab11e092872fe402c9108497695b013770f2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/38e453da5deea4142a3e46ce8c271f1237185b7d","id":"38e453da5deea4142a3e46ce8c271f1237185b7d","committed_date":"2011-09-30T13:50:05-07:00","authored_date":"2011-09-30T13:50:05-07:00","message":"Merge branch 'maint/amd64_keywording' into maint/x86_keywording\n\n* maint/amd64_keywording:\n Pushed termtool stabilisation back 30 days.","tree":"3b4bf1f427190c36f1f91801021c7a1c436ddab0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"31729c497b6bee3a36f20168fae12e2651cfd94b"},{"id":"70dbab11e092872fe402c9108497695b013770f2"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/a676eb056510cc903a441289bda41a75261dd9c4","id":"a676eb056510cc903a441289bda41a75261dd9c4","committed_date":"2011-09-30T13:49:20-07:00","authored_date":"2011-09-30T13:49:20-07:00","message":"Merge branch 'maint/amd64_keywording'\n\n* maint/amd64_keywording:\n Pushed termtool stabilisation back 30 days.","tree":"3b4bf1f427190c36f1f91801021c7a1c436ddab0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}},{"parents":[{"id":"31729c497b6bee3a36f20168fae12e2651cfd94b"}],"author":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"},"url":"/JNRowe/jnrowe-misc/commit/70dbab11e092872fe402c9108497695b013770f2","id":"70dbab11e092872fe402c9108497695b013770f2","committed_date":"2011-09-30T13:48:48-07:00","authored_date":"2011-09-30T13:48:48-07:00","message":"Pushed termtool stabilisation back 30 days.\n\nWaiting on upstream to stabilise progressbar.","tree":"3b4bf1f427190c36f1f91801021c7a1c436ddab0","committer":{"name":"James Rowe","login":"JNRowe","email":"jnrowe@gmail.com"}}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,pulls,robbyrussell,oh-my-zsh,open,b0f946d4b280dcc6f7b65dd7fddeea6b b/tests/data/github.com,api,v2,json,pulls,robbyrussell,oh-my-zsh,open,b0f946d4b280dcc6f7b65dd7fddeea6b new file mode 100644 index 0000000..7e87993 --- /dev/null +++ b/tests/data/github.com,api,v2,json,pulls,robbyrussell,oh-my-zsh,open,b0f946d4b280dcc6f7b65dd7fddeea6b @@ -0,0 +1,16 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/pulls/robbyrussell/oh-my-zsh/open?page=2 +-content-encoding: gzip +connection: keep-alive +content-length: 161938 +server: nginx/1.0.4 +x-runtime: 2179ms +x-ratelimit-limit: 60 +etag: "3ac026d624c5fb42df721ef6074f8e23" +cache-control: private, max-age=0, must-revalidate +date: Wed, 19 Oct 2011 08:41:49 GMT +x-frame-options: deny +content-type: application/json; charset=utf-8 + +{"pulls":[{"issue_updated_at":"2011-06-12T16:09:05Z","gravatar_id":"8357260cb0018190686f892ff6c05dab","position":421.0,"number":422,"votes":0,"user":{"name":"Simon","gravatar_id":"8357260cb0018190686f892ff6c05dab","type":"User","login":"else"},"comments":0,"body":"I've modified the install.sh script to check if zsh is installed.\r\n\r\n--Simon","title":"checking if zsh is installed before switching to the awesomeness","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/422.diff","updated_at":"2011-10-10T12:51:01Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/422","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/422.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Simon","gravatar_id":"8357260cb0018190686f892ff6c05dab","type":"User","login":"else"},"created_at":"2011-06-12T16:04:16Z","head":{"user":{"name":"Simon","gravatar_id":"8357260cb0018190686f892ff6c05dab","type":"User","login":"else"},"ref":"zshcheck","sha":"7e3f2342eb548d8c1870864335a2051bc58f15d0","label":"else:zshcheck","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/12 09:02:55 -0700","url":"https://github.com/else/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 70 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":768,"private":false,"name":"oh-my-zsh","owner":"else","created_at":"2011/03/24 01:48:09 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-06-12T16:04:16Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-09T22:22:26Z","gravatar_id":"7f81fd5c7792dabca22c433abbfbf0cb","position":415.0,"number":416,"votes":0,"user":{"name":"Danish Khan","company":"Engine Yard","gravatar_id":"7f81fd5c7792dabca22c433abbfbf0cb","location":"San Francisco, CA","blog":"http://danishkhan.org","type":"User","login":"danishkhan","email":"danishkhan@danishkhan.org"},"comments":0,"body":"","title":"Added my own custom theme","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/416.diff","updated_at":"2011-10-10T12:51:00Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/416","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/416.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Danish Khan","company":"Engine Yard","gravatar_id":"7f81fd5c7792dabca22c433abbfbf0cb","location":"San Francisco, CA","blog":"http://danishkhan.org","type":"User","login":"danishkhan","email":"danishkhan@danishkhan.org"},"created_at":"2011-06-09T22:22:26Z","head":{"user":{"name":"Danish Khan","company":"Engine Yard","gravatar_id":"7f81fd5c7792dabca22c433abbfbf0cb","location":"San Francisco, CA","blog":"http://danishkhan.org","type":"User","login":"danishkhan","email":"danishkhan@danishkhan.org"},"ref":"master","sha":"a635ad5bfc3ec28c73b8f446cf0f06cd346fc17c","label":"danishkhan:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/10 11:51:40 -0700","url":"https://github.com/danishkhan/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":164,"private":false,"name":"oh-my-zsh","owner":"danishkhan","created_at":"2011/06/09 15:01:14 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-09T22:22:26Z","labels":[],"state":"open"},{"issue_updated_at":"2011-10-12T13:09:59Z","gravatar_id":"e49e4471a176ee8b633c44835e301238","position":412.0,"number":413,"votes":0,"user":{"name":"Lowe Schmidt","company":"Unibet","gravatar_id":"e49e4471a176ee8b633c44835e301238","location":"Stockholm, Sweden","blog":"http://loweschmidt.se","type":"User","login":"lsc","email":"lowe.schmidt@gmail.com"},"comments":1,"body":"Inspired by my old one and the one called arrow.\r\nHas return status to far left, cwd + git status to the far right.\r\n\r\nScreenshots\r\nhttp://nobelium.se/frost-theme-clean.png\r\nhttp://nobelium.se/frost-theme-dirty.png\r\n\r\nNot the nicest pull request I know, shout if it needs fixing. ","title":"Yet another theme.","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/413.diff","updated_at":"2011-10-12T13:09:59Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/413","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/413.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Lowe Schmidt","company":"Unibet","gravatar_id":"e49e4471a176ee8b633c44835e301238","location":"Stockholm, Sweden","blog":"http://loweschmidt.se","type":"User","login":"lsc","email":"lowe.schmidt@gmail.com"},"created_at":"2011-06-06T13:05:51Z","head":{"user":{"name":"Lowe Schmidt","company":"Unibet","gravatar_id":"e49e4471a176ee8b633c44835e301238","location":"Stockholm, Sweden","blog":"http://loweschmidt.se","type":"User","login":"lsc","email":"lowe.schmidt@gmail.com"},"ref":"master","sha":"8c8883880ecfcb2d35c0223779e129d4c902c5c4","label":"lsc:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/06 05:42:27 -0700","url":"https://github.com/lsc/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":164,"private":false,"name":"oh-my-zsh","owner":"lsc","created_at":"2011/06/02 11:13:07 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-06T13:05:51Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-07T23:00:16Z","gravatar_id":"d12c4dde141a2caed9afe67bbab2295b","position":410.0,"number":411,"votes":0,"user":{"name":"Jesse B. Hannah","gravatar_id":"d12c4dde141a2caed9afe67bbab2295b","location":"Tempe, AZ","blog":"http://jbhannah.net/","type":"User","login":"jbhannah","email":"jesse@jbhannah.net"},"comments":4,"body":"Using the `gems` command from the RVM plugin on Ubuntu 11.04 was not working correctly—all it would do was show the GNU `sed` help output. Some playing around showed that the repeated `-E` option was causing that to happen, so removing all `-E`s after the first one returned what appears to be the correct output. I don't remember this same problem occurring on my Mac (latest 10.6, `zsh` from `brew`), and I don't have it with me to test this or to see if the output is the same as what it's supposed to be originally, but this does at least fix the radically unexpected behavior when using GNU `sed` in Ubuntu 11.04.","title":"Fixed(?) RVM gem list helper","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/411.diff","updated_at":"2011-10-10T12:51:00Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/411","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/411.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Jesse B. Hannah","gravatar_id":"d12c4dde141a2caed9afe67bbab2295b","location":"Tempe, AZ","blog":"http://jbhannah.net/","type":"User","login":"jbhannah","email":"jesse@jbhannah.net"},"created_at":"2011-06-06T03:39:45Z","head":{"user":{"name":"Jesse B. Hannah","gravatar_id":"d12c4dde141a2caed9afe67bbab2295b","location":"Tempe, AZ","blog":"http://jbhannah.net/","type":"User","login":"jbhannah","email":"jesse@jbhannah.net"},"ref":"rvm","sha":"69277bd5905479583c040063c5ac3874ccaad1a4","label":"jbhannah:rvm","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/08/04 07:53:46 -0700","url":"https://github.com/jbhannah/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":false,"size":120,"private":false,"name":"oh-my-zsh","owner":"jbhannah","created_at":"2011/06/05 18:19:42 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-06T03:39:45Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-06T02:20:30Z","gravatar_id":"c59b979bdf791fa8cacd6cc7d3e28553","position":409.0,"number":410,"votes":0,"user":{"name":"Kien Tran","gravatar_id":"c59b979bdf791fa8cacd6cc7d3e28553","location":"Arlington, Texas","blog":"http://www.kientran.com","type":"User","login":"kientran","email":"kien@kientran.com"},"comments":0,"body":"Please pull in my theme \"kientran\" into the main repo.\r\n\r\nI also make a tweak to the RVM plugin. It will now only display the RVM gemset if it is not the default one. Before it was still showing a blank set of \"()\" when it was on the default system ruby. Please verify and consider pulling that!\r\n\r\nThanks!","title":"Add my personal theme + RVM plugin tweak","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/410.diff","updated_at":"2011-10-10T12:50:59Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/410","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/410.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Kien Tran","gravatar_id":"c59b979bdf791fa8cacd6cc7d3e28553","location":"Arlington, Texas","blog":"http://www.kientran.com","type":"User","login":"kientran","email":"kien@kientran.com"},"created_at":"2011-06-06T02:20:30Z","head":{"user":{"name":"Kien Tran","gravatar_id":"c59b979bdf791fa8cacd6cc7d3e28553","location":"Arlington, Texas","blog":"http://www.kientran.com","type":"User","login":"kientran","email":"kien@kientran.com"},"ref":"master","sha":"18dbdc3e7343ea37746514f6b1edcbcfb0b1b67f","label":"kientran:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/06 13:20:49 -0700","url":"https://github.com/kientran/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":164,"private":false,"name":"oh-my-zsh","owner":"kientran","created_at":"2011/06/05 19:06:06 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-06T02:20:30Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-05T23:57:59Z","gravatar_id":"232657bc369e6379b6a8801452d2507f","position":408.0,"number":409,"votes":0,"user":{"name":"Maxim Filatov","company":"Exectum LLC","gravatar_id":"232657bc369e6379b6a8801452d2507f","location":"Saint Petersburg, Russia","blog":"","type":"User","login":"Bregor","email":"pipopolam@gmail.com"},"comments":0,"body":"Dollar sign instead of percent in unprivileged user prompt (as in real gentoo)","title":"Dollar sign instead of percent in unprivileged user prompt (as in real ge","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/409.diff","updated_at":"2011-10-10T12:50:59Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/409","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/409.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Maxim Filatov","company":"Exectum LLC","gravatar_id":"232657bc369e6379b6a8801452d2507f","location":"Saint Petersburg, Russia","blog":"","type":"User","login":"Bregor","email":"pipopolam@gmail.com"},"created_at":"2011-06-05T23:57:59Z","head":{"user":{"name":"Maxim Filatov","company":"Exectum LLC","gravatar_id":"232657bc369e6379b6a8801452d2507f","location":"Saint Petersburg, Russia","blog":"","type":"User","login":"Bregor","email":"pipopolam@gmail.com"},"ref":"patch-1","sha":"f0451195f63b3607461bda1570c5fb2a4e429b3e","label":"Bregor:patch-1","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/05 16:57:21 -0700","url":"https://github.com/Bregor/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":124,"private":false,"name":"oh-my-zsh","owner":"Bregor","created_at":"2011/06/05 16:56:25 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-05T23:57:59Z","labels":[],"state":"open"},{"issue_updated_at":"2011-07-28T05:08:23Z","gravatar_id":"40f08b15afb1b17d7d39730c993be8a8","position":401.0,"number":402,"votes":0,"user":{"name":"Mark Walling","company":"","gravatar_id":"40f08b15afb1b17d7d39730c993be8a8","location":"Schenectady, NY","blog":"markwalling.org","type":"User","login":"mwalling","email":"mark@markwalling.org"},"comments":1,"body":"Plugin provides completion for fabric targets from the `fab` command line.\r\n\r\nI think what I did is a major hack (at least it feels that way), comments very welcome.","title":"Added completion support for fabric targets","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/402.diff","updated_at":"2011-10-10T12:50:59Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/402","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/402.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"e8bd400bffc51c83e0ef6671ecb5f364dc2f5065","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Mark Walling","company":"","gravatar_id":"40f08b15afb1b17d7d39730c993be8a8","location":"Schenectady, NY","blog":"markwalling.org","type":"User","login":"mwalling","email":"mark@markwalling.org"},"created_at":"2011-06-04T20:45:05Z","head":{"user":{"name":"Mark Walling","company":"","gravatar_id":"40f08b15afb1b17d7d39730c993be8a8","location":"Schenectady, NY","blog":"markwalling.org","type":"User","login":"mwalling","email":"mark@markwalling.org"},"ref":"fabric-completion","sha":"19cea6c4435ec4fbbe7c66de6140f51348fc67bd","label":"mwalling:fabric-completion","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/04 13:42:25 -0700","url":"https://github.com/mwalling/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":136,"private":false,"name":"oh-my-zsh","owner":"mwalling","created_at":"2011/06/04 13:39:53 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-04T20:45:05Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-04T15:17:10Z","gravatar_id":"cd9ac7713c79d5e108ee1755c9d7b5cf","position":397.0,"number":398,"votes":0,"user":{"name":"Luke Lee","gravatar_id":"cd9ac7713c79d5e108ee1755c9d7b5cf","location":"Houston, TX","blog":"www.lukelee.net","type":"User","login":"durden"},"comments":1,"body":"I really wanted to ability maintain a small set of themes I like and randomize through them. It could be as easy as removing those themes that I don't like, but then you'd might have to be careful when merging changes and collaborating, etc.\r\n\r\nInstead, I thought just creating a simple shell function to make a symlink in another directory would be an easy way to keep track of 'liked' themes. This way there isn't really any overhead because the themes aren't be copied, and removing favorites or 'unliking' themes is as easy as remove the symlink.\r\n\r\nGoes along with Issue #397","title":"Add ability to 'like' and 'unlike' themes and maintain list of favorite themes","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/398.diff","updated_at":"2011-10-10T12:50:59Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/398","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/398.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"e8bd400bffc51c83e0ef6671ecb5f364dc2f5065","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Luke Lee","gravatar_id":"cd9ac7713c79d5e108ee1755c9d7b5cf","location":"Houston, TX","blog":"www.lukelee.net","type":"User","login":"durden"},"created_at":"2011-06-04T15:13:38Z","head":{"user":{"name":"Luke Lee","gravatar_id":"cd9ac7713c79d5e108ee1755c9d7b5cf","location":"Houston, TX","blog":"www.lukelee.net","type":"User","login":"durden"},"ref":"master","sha":"2e203cb1d3edc69ceda8590983da566aa97d69f3","label":"durden:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/04 08:08:53 -0700","url":"https://github.com/durden/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":376,"private":false,"name":"oh-my-zsh","owner":"durden","created_at":"2011/06/03 16:55:16 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-06-04T15:13:38Z","labels":[],"state":"open"},{"issue_updated_at":"2011-08-31T19:30:09Z","gravatar_id":"9ed1beafd217429d03af5afb05e33469","position":395.0,"number":396,"votes":0,"user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"comments":3,"body":"Ok, I've made improvements to #393. Now the code looks (a bit) nicer, and it's easier to change if you don't like some decision I've made.\r\n\r\nEnjoy!","title":"Colorize Uninstall, Improve Colorization of Install and Upgrade","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/396.diff","updated_at":"2011-10-10T12:50:58Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/396","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/396.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"created_at":"2011-06-04T12:54:25Z","head":{"user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"ref":"colorize-install","sha":"3e6d6df4fef5fa526e00db198dd6a509e57da6f8","label":"betawaffle:colorize-install","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/09 05:19:26 -0700","url":"https://github.com/betawaffle/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"Fork of robbyrussell's community-driven framework for zsh configuration.","has_wiki":false,"size":204,"private":false,"name":"oh-my-zsh","owner":"betawaffle","created_at":"2011/05/15 09:42:42 -0700","open_issues":0,"master_branch":"custom","homepage":""}},"issue_created_at":"2011-06-04T12:54:25Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-05T12:13:46Z","gravatar_id":"9ed1beafd217429d03af5afb05e33469","position":391.0,"number":392,"votes":0,"user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"comments":1,"body":"Modify directory listing aliases to make more sense. Remove conflicting helper\r\nfunction (mcd conflicts with mtools).\r\n\r\nRebased and reopened. Used to be #369","title":"Directory listing aliases and removal of mcd","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/392.diff","updated_at":"2011-10-10T12:50:58Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/392","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/392.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"created_at":"2011-06-03T17:08:34Z","head":{"user":{"name":"Andrew Hodges","company":"Vitrue, Inc.","gravatar_id":"9ed1beafd217429d03af5afb05e33469","location":"Norcross, GA","blog":"http://betawaffle.com/","type":"User","login":"betawaffle","email":"betawaffle@gmail.com"},"ref":"pull-001","sha":"25adbe81a55664335e0166c202b8d8424a67c8aa","label":"betawaffle:pull-001","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/06/09 05:19:26 -0700","url":"https://github.com/betawaffle/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"Fork of robbyrussell's community-driven framework for zsh configuration.","has_wiki":false,"size":204,"private":false,"name":"oh-my-zsh","owner":"betawaffle","created_at":"2011/05/15 09:42:42 -0700","open_issues":0,"master_branch":"custom","homepage":""}},"issue_created_at":"2011-06-03T17:08:34Z","labels":[],"state":"open"},{"issue_updated_at":"2011-08-13T19:09:40Z","gravatar_id":"7e042c238dffcc90a7535ccb682e47be","position":371.0,"number":372,"votes":0,"user":{"name":"Will Leinweber","company":"heroku","gravatar_id":"7e042c238dffcc90a7535ccb682e47be","location":"San Francisco, CA","blog":"http://bitfission.com","type":"User","login":"will","email":"will@bitfission.com"},"comments":2,"body":"before, custom plugins were getting the wrong fpath set","title":"correctly add custom/plugin plugins to fpath","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/372.diff","updated_at":"2011-10-10T12:50:58Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/372","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/372.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"142c03dbd223683fd2d99f878b68f0f075cf33fb","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Will Leinweber","company":"heroku","gravatar_id":"7e042c238dffcc90a7535ccb682e47be","location":"San Francisco, CA","blog":"http://bitfission.com","type":"User","login":"will","email":"will@bitfission.com"},"created_at":"2011-05-30T01:12:42Z","head":{"user":{"name":"Will Leinweber","company":"heroku","gravatar_id":"7e042c238dffcc90a7535ccb682e47be","location":"San Francisco, CA","blog":"http://bitfission.com","type":"User","login":"will","email":"will@bitfission.com"},"ref":"patch-1","sha":"1ec4a83bf1779379f0f353888978e3c8f696ae53","label":"will:patch-1","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/05/29 18:12:14 -0700","url":"https://github.com/will/oh-my-zsh","has_downloads":true,"forks":1,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":284,"private":false,"name":"oh-my-zsh","owner":"will","created_at":"2010/07/02 16:05:30 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-05-30T01:12:42Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-10-10T12:11:53Z","gravatar_id":"a0c7542c45873945d9e76b76c6006c56","position":366.0,"number":367,"votes":0,"user":{"name":"Reza","gravatar_id":"a0c7542c45873945d9e76b76c6006c56","type":"User","login":"ryco","email":""},"comments":4,"body":"Made it compatible with Capistrano 2.x show tasks.","title":"Fixed cap plugin","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/367.diff","updated_at":"2011-10-10T12:50:57Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/367","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/367.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ab2a7b51a8c3ead55a272fba58232d0823e519a2","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Reza","gravatar_id":"a0c7542c45873945d9e76b76c6006c56","type":"User","login":"ryco","email":""},"created_at":"2011-05-28T21:39:16Z","head":{"user":{"name":"Reza","gravatar_id":"a0c7542c45873945d9e76b76c6006c56","type":"User","login":"ryco","email":""},"ref":"cap_plugin","sha":"efa5593f88e552fbd3fde850b283fa43d36f481c","label":"ryco:cap_plugin","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/08/16 14:00:28 -0700","url":"https://github.com/ryco/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":false,"size":116,"private":false,"name":"oh-my-zsh","owner":"ryco","created_at":"2010/11/13 06:51:20 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-05-28T21:39:16Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-05-26T04:27:37Z","gravatar_id":"c5386d8b7cee5f9474cfc01c2a68fa48","position":355.0,"number":356,"votes":0,"user":{"name":"Nicolas Pinto","company":"MIT","gravatar_id":"c5386d8b7cee5f9474cfc01c2a68fa48","location":"Boston, MA","type":"User","login":"npinto","email":"pinto@mit.edu"},"comments":0,"body":"First of all, thanks a ton for oh-my-zsh, exactly what I needed !\r\n\r\nMay I ask you to merge my theme in your repo ?\r\n\r\nThanks in advance.\r\n\r\nNicolas","title":"Add npinto theme.","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/356.diff","updated_at":"2011-10-10T12:50:57Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/356","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/356.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"f9e2af2bd7e567114724c4ca7f4a1727a656e7e2","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Nicolas Pinto","company":"MIT","gravatar_id":"c5386d8b7cee5f9474cfc01c2a68fa48","location":"Boston, MA","type":"User","login":"npinto","email":"pinto@mit.edu"},"created_at":"2011-05-26T04:27:37Z","head":{"user":{"name":"Nicolas Pinto","company":"MIT","gravatar_id":"c5386d8b7cee5f9474cfc01c2a68fa48","location":"Boston, MA","type":"User","login":"npinto","email":"pinto@mit.edu"},"ref":"develop","sha":"792680131b0df0e56645df54463b95f4df450144","label":"npinto:develop","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/10/03 20:29:13 -0700","url":"https://github.com/npinto/oh-my-zsh","has_downloads":true,"forks":1,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":116,"private":false,"name":"oh-my-zsh","owner":"npinto","created_at":"2011/05/25 21:14:08 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-26T04:27:37Z","labels":["Idea","Themes"],"state":"open"},{"issue_updated_at":"2011-08-18T02:55:15Z","gravatar_id":"4625b7404fa2b2377a4818d027ba7678","position":351.0,"number":352,"votes":0,"user":{"name":"Alexander Simonov","company":"","gravatar_id":"4625b7404fa2b2377a4818d027ba7678","location":"Kiev, Ukraine","blog":"http://simonov.me","type":"User","login":"simonoff","email":"alex@simonov.me"},"comments":2,"body":"","title":"new theme and rvm theming support","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/352.diff","updated_at":"2011-10-10T12:50:57Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/352","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/352.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Alexander Simonov","company":"","gravatar_id":"4625b7404fa2b2377a4818d027ba7678","location":"Kiev, Ukraine","blog":"http://simonov.me","type":"User","login":"simonoff","email":"alex@simonov.me"},"created_at":"2011-05-24T08:12:48Z","head":{"user":{"name":"Alexander Simonov","company":"","gravatar_id":"4625b7404fa2b2377a4818d027ba7678","location":"Kiev, Ukraine","blog":"http://simonov.me","type":"User","login":"simonoff","email":"alex@simonov.me"},"ref":"master","sha":"ea55e5128eb88b4834627dadc69853341caf68a0","label":"simonoff:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/05/24 01:11:56 -0700","url":"https://github.com/simonoff/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1548,"private":false,"name":"oh-my-zsh","owner":"simonoff","created_at":"2011/05/21 00:47:57 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-24T08:12:48Z","labels":["Idea","Themes"],"state":"open"},{"issue_updated_at":"2011-05-26T08:20:29Z","gravatar_id":"faf3701bf886a19fd2643810999d287e","position":343.0,"number":344,"votes":0,"user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"comments":2,"body":"Oh-my-zsh currently breaks if the \"custom\" directory is empty. This fixes that problem, but maybe there's a better way than invoking \"find\"?\r\n\r\nContext: for tidiness, I've removed the custom/example.zsh script from my fork of oh-my-zsh. I don't like simply deleting the file after a fresh clone, because that results in the file appearing as \"deleted\" in git-status from then on. Hence the empty \"custom\" directory after a fresh clone :)","title":"Don't break when there are no files in \"custom\"","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/344.diff","updated_at":"2011-10-10T12:50:57Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/344","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/344.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"created_at":"2011-05-19T10:24:52Z","head":{"user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"ref":"allow-empty-custom","sha":"903206abf46a25f6f345eaa71db7559f8a7658c3","label":"giddie:allow-empty-custom","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/09/27 07:48:48 -0700","url":"https://github.com/giddie/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":116,"private":false,"name":"oh-my-zsh","owner":"giddie","created_at":"2011/05/18 08:13:25 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-19T10:24:52Z","labels":["Annoyance"],"state":"open"},{"issue_updated_at":"2011-09-21T09:01:21Z","gravatar_id":"faf3701bf886a19fd2643810999d287e","position":342.0,"number":343,"votes":0,"user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"comments":18,"body":"I need to use WOL for a few machines. This simple plugin helps by reducing this:\r\n\r\n# wakeonlan -f ~/.wakeonlan/mypc\r\n\r\n...to this:\r\n\r\n# wake mypc","title":"Plugin to make WOL nice & easy","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/343.diff","updated_at":"2011-10-10T12:50:56Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/343","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/343.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"created_at":"2011-05-19T10:01:38Z","head":{"user":{"name":"Paul Gideon Dann","gravatar_id":"faf3701bf886a19fd2643810999d287e","location":"Birmingham, UK","blog":"http://paulandsophiedann.co.uk","type":"User","login":"giddie","email":"pdgiddie@gmail.com"},"ref":"plugin-wakeonlan","sha":"7ba54d197dac8d5ae380271259ba4d8843f01b4f","label":"giddie:plugin-wakeonlan","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/09/27 07:48:48 -0700","url":"https://github.com/giddie/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":116,"private":false,"name":"oh-my-zsh","owner":"giddie","created_at":"2011/05/18 08:13:25 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-19T10:01:38Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-05-16T16:34:45Z","gravatar_id":"64fec2287666363ff9697ea37f0c3412","position":339.0,"number":340,"votes":0,"user":{"name":"Lori Holden","company":"Comverge","gravatar_id":"64fec2287666363ff9697ea37f0c3412","location":"Broomfield, CO","blog":"http://loriholden.com","type":"User","login":"lholden","email":"email@loriholden.com"},"comments":0,"body":"","title":"Just my theme :)","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/340.diff","updated_at":"2011-10-10T12:50:56Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/340","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/340.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Lori Holden","company":"Comverge","gravatar_id":"64fec2287666363ff9697ea37f0c3412","location":"Broomfield, CO","blog":"http://loriholden.com","type":"User","login":"lholden","email":"email@loriholden.com"},"created_at":"2011-05-16T16:34:45Z","head":{"user":{"name":"Lori Holden","company":"Comverge","gravatar_id":"64fec2287666363ff9697ea37f0c3412","location":"Broomfield, CO","blog":"http://loriholden.com","type":"User","login":"lholden","email":"email@loriholden.com"},"ref":"master","sha":"b6182e923fb75bdf2f059c849eb56d5473735134","label":"lholden:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/05/16 09:55:36 -0700","url":"https://github.com/lholden/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1492,"private":false,"name":"oh-my-zsh","owner":"lholden","created_at":"2011/05/16 09:32:33 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-16T16:34:45Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-05-16T07:25:01Z","gravatar_id":"3eae0b6c37b4ee8cc974798f79c2aff5","position":338.0,"number":339,"votes":0,"user":{"name":"Andrew Nutter-Upham","gravatar_id":"3eae0b6c37b4ee8cc974798f79c2aff5","location":"Cambridge, MA","type":"User","login":"andynu"},"comments":0,"body":"This is my first pull request. Should I have branched first?\r\n\r\nThank you so much for this project. I've been managing all my dot files in a similar fashion in svn for years and this has pushed me over the edge to convert it all to git.\r\n\r\nThe deb plugin made me smile (the only difference between my aliases and those in the plugin are capital As). I have loads of shell tweaks, and thanks to the nice structure here I'll have more pull requests as I migrate them from custom to plugin.\r\n\r\nCheers,\r\n--\r\nAndy","title":"zsh-theme function (with completion), and another theme.","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/339.diff","updated_at":"2011-10-10T12:50:56Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/339","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/339.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Andrew Nutter-Upham","gravatar_id":"3eae0b6c37b4ee8cc974798f79c2aff5","location":"Cambridge, MA","type":"User","login":"andynu"},"created_at":"2011-05-16T07:25:01Z","head":{"user":{"name":"Andrew Nutter-Upham","gravatar_id":"3eae0b6c37b4ee8cc974798f79c2aff5","location":"Cambridge, MA","type":"User","login":"andynu"},"ref":"master","sha":"31425d1600c0689f0f83b1d610fde2401512d075","label":"andynu:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/05/16 00:11:10 -0700","url":"https://github.com/andynu/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1480,"private":false,"name":"oh-my-zsh","owner":"andynu","created_at":"2011/05/15 23:08:42 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-16T07:25:01Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-05-13T17:10:24Z","gravatar_id":"dbce141f7e94c123f0e9909f21541670","position":334.0,"number":335,"votes":0,"user":{"name":"Ashley Dev","gravatar_id":"dbce141f7e94c123f0e9909f21541670","type":"User","login":"ashleydev"},"comments":0,"body":"The ashleydev theme has some optimizations and ideas that should probably make their way into lib/git.zsh for making the git prompt faster and more feature-full.\r\n\r\nI've added more aliases for git cmds (see commit description).","title":"add ashleydev theme; update git plugin","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/335.diff","updated_at":"2011-10-10T12:50:56Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/335","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/335.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"3552423de3d5ae439dc815b7f9c4cbeab3fbebe8","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Ashley Dev","gravatar_id":"dbce141f7e94c123f0e9909f21541670","type":"User","login":"ashleydev"},"created_at":"2011-05-13T17:10:24Z","head":{"user":{"name":"Ashley Dev","gravatar_id":"dbce141f7e94c123f0e9909f21541670","type":"User","login":"ashleydev"},"ref":"master","sha":"78e8fe3337e4985c9d22a03027be06be250cf309","label":"ashleydev:master","repository":{"has_issues":false,"language":"Shell","watchers":3,"pushed_at":"2011/09/29 04:23:06 -0700","url":"https://github.com/ashleydev/oh-my-zsh","has_downloads":true,"forks":1,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":132,"private":false,"name":"oh-my-zsh","owner":"ashleydev","created_at":"2011/05/14 10:14:46 -0700","open_issues":1,"homepage":""}},"issue_created_at":"2011-05-13T17:10:24Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-05-26T23:05:12Z","gravatar_id":"3a5b19932cfbe1c8387d7dc8f9baa5d6","position":327.0,"number":328,"votes":0,"user":{"name":"Dave Lee","company":"Gray101","gravatar_id":"3a5b19932cfbe1c8387d7dc8f9baa5d6","location":"St. Louis, MO","blog":"camperdave.github.com","type":"User","login":"camperdave","email":"dave@gray101.com"},"comments":2,"body":"Hey, I've been tinkering with this awesome script for a bit, and I've decided to make this script for myself called full-upgrade. It handles automatic updates to a lot of things, as well as making it easier to setup your custom changes on multiple machines.\r\n\r\nBasically, it performs a regular upgrade (via the stock script), then looks to see if the user's git repository has a remote named \"custom-overlay\". If it does, it pulls down that remote's \"custom-overlay\" branch. For an example of how that can be used, check out my other repository, over here.\r\n\r\nOnce those files are pulled down, it checks each subdirectory in the plugins folder for a .git folder inside that. That indicates that the plugin in that folder is distributed outside the main oh-my-zsh repository, and it therefore pulls down the latest changes from that repository as well.\r\n\r\nSome of the code may not be perfect. The system sometimes complains if you pull down a custom-overlay and have untracked versions of the files lying around - in that case, it prompts you to delete them before it pulls the new ones down. You can always cancel and do it manually if you want to see the differences :)\r\n\r\nHopefully this fits into your vision for this awesome piece of software. If not, I'll just use it myself :)","title":"Full update","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/328.diff","updated_at":"2011-10-10T12:50:55Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/328","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/328.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Dave Lee","company":"Gray101","gravatar_id":"3a5b19932cfbe1c8387d7dc8f9baa5d6","location":"St. Louis, MO","blog":"camperdave.github.com","type":"User","login":"camperdave","email":"dave@gray101.com"},"created_at":"2011-05-08T21:54:56Z","head":{"user":{"name":"Dave Lee","company":"Gray101","gravatar_id":"3a5b19932cfbe1c8387d7dc8f9baa5d6","location":"St. Louis, MO","blog":"camperdave.github.com","type":"User","login":"camperdave","email":"dave@gray101.com"},"ref":"full-update","sha":"b4036c3aff1c63fef143d5071124c7e078cbbc7e","label":"camperdave:full-update","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/07/06 19:34:56 -0700","url":"https://github.com/camperdave/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":184,"private":false,"name":"oh-my-zsh","owner":"camperdave","created_at":"2011/05/06 16:29:40 -0700","open_issues":0,"master_branch":"full-update","homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-05-08T21:54:56Z","labels":[],"state":"open"},{"issue_updated_at":"2011-05-08T16:27:13Z","gravatar_id":"a10db193524d6a5f9d0f6bd74614436b","position":326.0,"number":327,"votes":0,"user":{"name":"Will St. Clair","company":"Obama for America","gravatar_id":"a10db193524d6a5f9d0f6bd74614436b","location":"Chicago, IL","blog":"willstclair.com","type":"User","login":"wsc","email":"will@willstclair.com"},"comments":1,"body":"Hyphenated git commands were deprecated 5 years ago, and are non-functional on the Ubuntu git packages unless you add something to your $PATH.\r\n\r\nhttp://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.6.0.txt","title":"Hyphenated commands are deprecated/don't work","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/327.diff","updated_at":"2011-10-10T12:50:55Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/327","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/327.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"0365ef0529ddfb912ca8202773e45916c55fdf4f","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Will St. Clair","company":"Obama for America","gravatar_id":"a10db193524d6a5f9d0f6bd74614436b","location":"Chicago, IL","blog":"willstclair.com","type":"User","login":"wsc","email":"will@willstclair.com"},"created_at":"2011-05-07T22:31:10Z","head":{"user":{"name":"Will St. Clair","company":"Obama for America","gravatar_id":"a10db193524d6a5f9d0f6bd74614436b","location":"Chicago, IL","blog":"willstclair.com","type":"User","login":"wsc","email":"will@willstclair.com"},"ref":"hyphens","sha":"8d7a68bd4ce3b08d32b481ff1cb09f12dffee4aa","label":"wsc:hyphens","repository":null},"issue_created_at":"2011-05-07T22:31:10Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-04T18:39:45Z","gravatar_id":"589f0b0dd5c19c7f42fd89a91221e6a6","position":317.0,"number":318,"votes":0,"user":{"name":"Thiago Avelino","company":"Trianguli","gravatar_id":"589f0b0dd5c19c7f42fd89a91221e6a6","location":"Brasil - São Paulo / SP","blog":"http://avelino.us","type":"User","login":"avelino","email":"thiagoavelinoster@gmail.com"},"comments":1,"body":"Alias for Python and Django","title":"Add new plugin Python and Django","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/318.diff","updated_at":"2011-10-10T12:50:55Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/318","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/318.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"a525993f6b62f3c5acec0afd204ff517408b6f29","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Thiago Avelino","company":"Trianguli","gravatar_id":"589f0b0dd5c19c7f42fd89a91221e6a6","location":"Brasil - São Paulo / SP","blog":"http://avelino.us","type":"User","login":"avelino","email":"thiagoavelinoster@gmail.com"},"created_at":"2011-04-30T20:12:57Z","head":{"user":{"name":"Thiago Avelino","company":"Trianguli","gravatar_id":"589f0b0dd5c19c7f42fd89a91221e6a6","location":"Brasil - São Paulo / SP","blog":"http://avelino.us","type":"User","login":"avelino","email":"thiagoavelinoster@gmail.com"},"ref":"master","sha":"653db8fbe99084e9e0d80857fab2dfc2b2e24584","label":"avelino:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/04/30 13:20:30 -0700","url":"https://github.com/avelino/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 80 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1420,"private":false,"name":"oh-my-zsh","owner":"avelino","created_at":"2011/04/30 12:49:39 -0700","open_issues":0,"homepage":"http://twitter.com/ohmyzsh"}},"issue_created_at":"2011-04-30T20:12:57Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-09-02T20:45:27Z","gravatar_id":"e08e1c732a835527370881c93f83d517","position":315.0,"number":316,"votes":0,"user":{"name":"Pat Regan","gravatar_id":"e08e1c732a835527370881c93f83d517","location":"Scranton, PA","blog":"blog.patshead.com","type":"User","login":"oknowton","email":"thehead@patshead.com"},"comments":20,"body":"Things are a getting a bit too fast to consistently benchmark now... \r\n\r\nI ran 20 consecutive benchmarks with and without this commit. Without this change zsh takes between 0.11 and 0.15 seconds to start up. With this change it clocks between 0.09 and 0.13 seconds.\r\n\r\nWhen something causes ~/.zcompdump to change the startup time for me is about 0.45 seconds. This shouldn't happen very often, I think only when something in the fpath changes.\r\n","title":"Compile ~/.zcompdump when it has been modified, for another minor speed up","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/316.diff","updated_at":"2011-10-10T12:50:55Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/316","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/316.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7c3d12c7de1c2d8efdefe09b02349e24106e36c6","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Pat Regan","gravatar_id":"e08e1c732a835527370881c93f83d517","location":"Scranton, PA","blog":"blog.patshead.com","type":"User","login":"oknowton","email":"thehead@patshead.com"},"created_at":"2011-04-30T02:58:43Z","head":{"user":{"name":"Pat Regan","gravatar_id":"e08e1c732a835527370881c93f83d517","location":"Scranton, PA","blog":"blog.patshead.com","type":"User","login":"oknowton","email":"thehead@patshead.com"},"ref":"master","sha":"5b2e24173c865aa71dd5c9c1b80484cadd64e87b","label":"oknowton:master","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/05/18 15:18:19 -0700","url":"https://github.com/oknowton/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 70 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1324,"private":false,"name":"oh-my-zsh","owner":"oknowton","created_at":"2011/04/08 07:03:43 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-30T02:58:43Z","labels":[],"state":"open"},{"issue_updated_at":"2011-04-29T12:28:03Z","gravatar_id":"85eaedd1b833c73e1656ee21a267e59e","position":312.0,"number":313,"votes":0,"user":{"name":"Vikram Verma","gravatar_id":"85eaedd1b833c73e1656ee21a267e59e","location":"Singapore","blog":"http://vikramverma.com","type":"User","login":"vikramverma","email":"me@vikramverma.com"},"comments":0,"body":"","title":"Added 'basic' zsh theme.","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/313.diff","updated_at":"2011-10-10T12:50:54Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/313","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/313.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"784c56cd09842c28df9a2e78279dd0667db8da47","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Vikram Verma","gravatar_id":"85eaedd1b833c73e1656ee21a267e59e","location":"Singapore","blog":"http://vikramverma.com","type":"User","login":"vikramverma","email":"me@vikramverma.com"},"created_at":"2011-04-29T12:28:02Z","head":{"user":{"name":"Vikram Verma","gravatar_id":"85eaedd1b833c73e1656ee21a267e59e","location":"Singapore","blog":"http://vikramverma.com","type":"User","login":"vikramverma","email":"me@vikramverma.com"},"ref":"master","sha":"7d172696988b029c0ff6a7a5b052e02f943fe693","label":"vikramverma:master","repository":null},"issue_created_at":"2011-04-29T12:28:03Z","labels":[],"state":"open"},{"issue_updated_at":"2011-04-28T19:08:52Z","gravatar_id":"793789919cd04697f099e9ef1ecd6de1","position":305.0,"number":306,"votes":0,"user":{"name":"Justin Riley","gravatar_id":"793789919cd04697f099e9ef1ecd6de1","location":"Boston, MA","blog":"http://web.mit.edu/starcluster","type":"User","login":"jtriley"},"comments":0,"body":"I find the http://github.com/olivierverdier/zsh-git-prompt prompt extremely useful when working inside of git repos. I've added it as a plugin called 'git-prompt' in my oh-my-zsh.","title":"add git-prompt plugin from olivierverdier/zsh-git-prompt","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/306.diff","updated_at":"2011-10-10T12:50:54Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/306","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/306.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"70d0beae22e7d97d4380af32dae1618f45e3dd4b","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Justin Riley","gravatar_id":"793789919cd04697f099e9ef1ecd6de1","location":"Boston, MA","blog":"http://web.mit.edu/starcluster","type":"User","login":"jtriley"},"created_at":"2011-04-28T19:08:52Z","head":{"user":{"name":"Justin Riley","gravatar_id":"793789919cd04697f099e9ef1ecd6de1","location":"Boston, MA","blog":"http://web.mit.edu/starcluster","type":"User","login":"jtriley"},"ref":"git-prompt","sha":"e5f77b8f0496e5915383f2f456f91a20f5ff4ace","label":"jtriley:git-prompt","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/05/09 07:19:54 -0700","url":"https://github.com/jtriley/oh-my-zsh","has_downloads":true,"forks":1,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 70 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1372,"private":false,"name":"oh-my-zsh","owner":"jtriley","created_at":"2011/04/21 20:18:21 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-28T19:08:52Z","labels":[],"state":"open"},{"issue_updated_at":"2011-04-26T16:53:06Z","gravatar_id":"54169a64eca05a858bdf95173915ed79","position":291.0,"number":292,"votes":0,"user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"comments":4,"body":"Do not call `grep` for basic expressions. Use built-in ZSH regex. This also fixes a couple of bugs where certain repository changes were not indicated properly.","title":"ZSH has built-in regex support; use it!","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/292.diff","updated_at":"2011-10-10T12:50:54Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/292","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/292.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"3bb21afa88f136c18073808852118dedd7e21fbf","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"created_at":"2011-04-20T03:51:37Z","head":{"user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"ref":"lib-git","sha":"c55256b8b227c905e9022ba028535ed9f9e30aa7","label":"sorin-ionescu:lib-git","repository":{"has_issues":false,"language":"Shell","watchers":11,"pushed_at":"2011/09/21 05:14:06 -0700","url":"https://github.com/sorin-ionescu/oh-my-zsh","has_downloads":true,"forks":3,"fork":true,"description":"A community-driven framework for managing ZSH.","has_wiki":false,"size":252,"private":false,"name":"oh-my-zsh","owner":"sorin-ionescu","created_at":"2010/12/16 00:07:04 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-20T03:51:37Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-14T01:07:36Z","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","position":290.0,"number":291,"votes":0,"user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"comments":2,"body":"* Fix the gdv function, as reported in #282\r\n* Skip the _ (alias for sudo) when displaying the running command in the term title\r\n* Unset locally created variables at the end of oh-my-zsh.sh\r\n* Don't overwrite existing environment variables for grep, pager and local (fixes #425)","title":"A couple of minor fixes","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/291.diff","updated_at":"2011-10-10T12:50:54Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/291","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/291.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ed990f61ff66a5c409ef2d8a444820cecf098188","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"created_at":"2011-04-20T00:16:49Z","head":{"user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"ref":"fixes","sha":"533760df9f605cb621d250e56eb69004dbe35d81","label":"gwjo:fixes","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/08/02 17:36:27 -0700","url":"https://github.com/gwjo/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":false,"size":136,"private":false,"name":"oh-my-zsh","owner":"gwjo","created_at":"2010/09/16 17:10:00 -0700","integrate_branch":"fork-queue","open_issues":0,"master_branch":"custom","homepage":""}},"issue_created_at":"2011-04-20T00:16:49Z","labels":[],"state":"open"},{"issue_updated_at":"2011-04-19T19:34:46Z","gravatar_id":"c0944a93ae347ad93150020f52d5432b","position":288.0,"number":289,"votes":0,"user":{"name":"Benjamin Martinez","gravatar_id":"c0944a93ae347ad93150020f52d5432b","blog":"http://cruznick.github.com","type":"User","login":"cruznick","email":"cruznickbjm@gmail"},"comments":1,"body":"I created a new theme based on nanotech theme\r\n\r\n\r\nalso added a battery plugin for linux based systems that shows batt percent\r\nadded mercurial plugin\r\nand 2 distro specific plugins (chakra linux and archlinux)","title":"New theme and 4 more plugins","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/289.diff","updated_at":"2011-10-10T12:50:53Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/289","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/289.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"971b071dc67f423d8b2a6f476e1dd58819049f41","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Benjamin Martinez","gravatar_id":"c0944a93ae347ad93150020f52d5432b","blog":"http://cruznick.github.com","type":"User","login":"cruznick","email":"cruznickbjm@gmail"},"created_at":"2011-04-19T15:17:53Z","head":{"user":{"name":"Benjamin Martinez","gravatar_id":"c0944a93ae347ad93150020f52d5432b","blog":"http://cruznick.github.com","type":"User","login":"cruznick","email":"cruznickbjm@gmail"},"ref":"master","sha":"f34fb9cc04cb36adc693810bcc32749837f72bcd","label":"cruznick:master","repository":null},"issue_created_at":"2011-04-19T15:17:53Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-04-19T01:38:55Z","gravatar_id":"e0718b33da5851b64caffcddf99aa36d","position":285.0,"number":286,"votes":0,"user":{"gravatar_id":"e0718b33da5851b64caffcddf99aa36d","type":"User","login":"hjz"},"comments":0,"body":"","title":"New theme that shows # of background and suspended jobs","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/286.diff","updated_at":"2011-10-10T12:50:53Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/286","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/286.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"3552423de3d5ae439dc815b7f9c4cbeab3fbebe8","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"gravatar_id":"e0718b33da5851b64caffcddf99aa36d","type":"User","login":"hjz"},"created_at":"2011-04-18T06:46:29Z","head":{"user":{"gravatar_id":"e0718b33da5851b64caffcddf99aa36d","type":"User","login":"hjz"},"ref":"master","sha":"617b15179ba6b8bcfcf836c8fccee6bc289e12e5","label":"hjz:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/07/10 02:59:08 -0700","url":"https://github.com/hjz/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":false,"size":124,"private":false,"name":"oh-my-zsh","owner":"hjz","created_at":"2011/07/10 01:11:53 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-18T06:46:29Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-04-18T01:47:34Z","gravatar_id":"274a52c00e4f37979f33423fc8acf371","position":284.0,"number":285,"votes":0,"user":{"name":"Carter Tazio Schonwald","gravatar_id":"274a52c00e4f37979f33423fc8acf371","location":"The Northeast, USA","blog":"www.carter.schonwald.org","type":"User","login":"cartazio","email":"first name dot last name at the google mail thing"},"comments":0,"body":"its a modification of some other code so that theres a single new tab command that work on both iterm and terminal apps. \r\n\r\ni can't seem to seperate out the style file commits, and perhaps theres some naming that could be fixed up, but the command works better than the previous one, and it interacts more robustly with how to sanely embed apple script within a zsh script","title":"iterm and terminal app new tab command that works correctly","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/285.diff","updated_at":"2011-10-10T12:50:53Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/285","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/285.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"9f46eafae0bed7df50a0004fca5d25539425ff85","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Carter Tazio Schonwald","gravatar_id":"274a52c00e4f37979f33423fc8acf371","location":"The Northeast, USA","blog":"www.carter.schonwald.org","type":"User","login":"cartazio","email":"first name dot last name at the google mail thing"},"created_at":"2011-04-18T01:47:34Z","head":{"user":{"name":"Carter Tazio Schonwald","gravatar_id":"274a52c00e4f37979f33423fc8acf371","location":"The Northeast, USA","blog":"www.carter.schonwald.org","type":"User","login":"cartazio","email":"first name dot last name at the google mail thing"},"ref":"master","sha":"21fb7e419fddc7c19435de88e4b336bc66ab9a5a","label":"cartazio:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/09/01 19:14:25 -0700","url":"https://github.com/cartazio/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":116,"private":false,"name":"oh-my-zsh","owner":"cartazio","created_at":"2011/02/19 10:08:22 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-18T01:47:34Z","labels":[],"state":"open"},{"issue_updated_at":"2011-09-12T15:54:23Z","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","position":282.0,"number":283,"votes":0,"user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"comments":5,"body":"usage:\n\n growl \"Notification Text\"\n\n\nYou can use \\n and \\t to add newlines and tabs respectively, or add \\a to make it beep. I find this useful to let me know when a long command, such as a compile completes...\n\n make ; growl \"Make finished\\a\"\n\n","title":"Add growl command for iTerm/iTerm2","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/283.diff","updated_at":"2011-10-10T12:50:52Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/283","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/283.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"971b071dc67f423d8b2a6f476e1dd58819049f41","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"created_at":"2011-04-17T23:09:32Z","head":{"user":{"name":"Gareth Owen","gravatar_id":"d116c69ed16fb1af875c0fda8d1295f5","type":"User","login":"gwjo"},"ref":"osx","sha":"27cee97228e6d662e4ad5f1c08cde44cfdd0483a","label":"gwjo:osx","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/08/02 17:36:27 -0700","url":"https://github.com/gwjo/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":false,"size":136,"private":false,"name":"oh-my-zsh","owner":"gwjo","created_at":"2010/09/16 17:10:00 -0700","integrate_branch":"fork-queue","open_issues":0,"master_branch":"custom","homepage":""}},"issue_created_at":"2011-04-17T23:09:32Z","labels":[],"state":"open"},{"issue_updated_at":"2011-04-08T22:43:24Z","gravatar_id":"9c3620f41b41a013dfc20fbc90eb19ed","position":267.0,"number":268,"votes":0,"user":{"name":"Jared Hancock","gravatar_id":"9c3620f41b41a013dfc20fbc90eb19ed","location":"Louisiana, USA","type":"User","login":"greezybacon"},"comments":2,"body":"There is a bit more work that could be done to unify the various workarounds implemented in the plugins for VCS's, but this at least adds support for any VCS by adding a plugin that defines four functions. I added a Mercurial plugin to illustriate the idea. I also upgraded all the themes to use the slightly different style so that they can all work with any VCS under the hood.\r\n\r\nCheers","title":"Use a generic \"vcs\" library to support any VCS in the prompt","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/268.diff","updated_at":"2011-10-10T12:50:52Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/268","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/268.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"2e9492969b0ea90932ad3f4298330b75ef8cf2ce","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Jared Hancock","gravatar_id":"9c3620f41b41a013dfc20fbc90eb19ed","location":"Louisiana, USA","type":"User","login":"greezybacon"},"created_at":"2011-04-08T04:00:53Z","head":{"user":{"name":"Jared Hancock","gravatar_id":"9c3620f41b41a013dfc20fbc90eb19ed","location":"Louisiana, USA","type":"User","login":"greezybacon"},"ref":"master","sha":"46ffcda777a3fa3b587897a22a5726f8c24ef957","label":"greezybacon:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/04/07 21:05:49 -0700","url":"https://github.com/greezybacon/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 70 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":792,"private":false,"name":"oh-my-zsh","owner":"greezybacon","created_at":"2011/04/07 20:57:57 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-04-08T04:00:53Z","labels":[],"state":"open"},{"issue_updated_at":"2011-03-29T17:38:15Z","gravatar_id":"f9116c42e95b260f995680d301695a84","position":260.0,"number":261,"votes":0,"user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"comments":0,"body":"Please feel free to come up with an inventive name for this","title":"Add custom tweaked version of dallas theme","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/261.diff","updated_at":"2011-10-10T12:50:52Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/261","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/261.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"2497c57976b1e5002ebecd7ffa5c35bc87ada903","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"created_at":"2011-03-29T17:38:15Z","head":{"user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"ref":"custom-theme","sha":"154640c5256bcd21696fa5784053c85a5a64c401","label":"benlangfeld:custom-theme","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/04/10 07:07:39 -0700","url":"https://github.com/benlangfeld/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":776,"private":false,"name":"oh-my-zsh","owner":"benlangfeld","created_at":"2010/11/22 01:13:38 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-03-29T17:38:15Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2011-03-29T17:35:49Z","gravatar_id":"f9116c42e95b260f995680d301695a84","position":259.0,"number":260,"votes":0,"user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"comments":0,"body":"* As described here: http://ryan.mcgeary.org/2011/02/09/vendor-everything-still-applies/","title":"Update the bundler plugin to follow the \"vendor everything\" routine","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/260.diff","updated_at":"2011-10-10T12:50:52Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/260","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/260.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"2497c57976b1e5002ebecd7ffa5c35bc87ada903","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"created_at":"2011-03-29T17:35:49Z","head":{"user":{"name":"Ben Langfeld","company":"MyStudioTools Ltd","gravatar_id":"f9116c42e95b260f995680d301695a84","location":"Preston, UK","blog":"langfeld.me","type":"User","login":"benlangfeld","email":"ben@langfeld.me"},"ref":"bundler-plugin","sha":"43af3cb51342c85db08abae26b562021426d6b85","label":"benlangfeld:bundler-plugin","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/04/10 07:07:39 -0700","url":"https://github.com/benlangfeld/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":776,"private":false,"name":"oh-my-zsh","owner":"benlangfeld","created_at":"2010/11/22 01:13:38 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-03-29T17:35:49Z","labels":[],"state":"open"},{"issue_updated_at":"2011-03-24T04:27:14Z","gravatar_id":"9c2ccd0119fd43ec68aaf4fdd0a5d4d8","position":255.0,"number":256,"votes":0,"user":{"name":"Lorrin Nelson","company":"Multifarious, Inc.","gravatar_id":"9c2ccd0119fd43ec68aaf4fdd0a5d4d8","location":"Seattle","blog":"http://www.lorrin.org","type":"User","login":"lorrin"},"comments":0,"body":"","title":"Make command-not-found no-op when support not available (e.g. not on Ubuntu)","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/256.diff","updated_at":"2011-10-10T12:50:51Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/256","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/256.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"52df85440ee8ead8f17d3aa3e1fedf187162313c","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Lorrin Nelson","company":"Multifarious, Inc.","gravatar_id":"9c2ccd0119fd43ec68aaf4fdd0a5d4d8","location":"Seattle","blog":"http://www.lorrin.org","type":"User","login":"lorrin"},"created_at":"2011-03-24T04:27:14Z","head":{"user":{"name":"Lorrin Nelson","company":"Multifarious, Inc.","gravatar_id":"9c2ccd0119fd43ec68aaf4fdd0a5d4d8","location":"Seattle","blog":"http://www.lorrin.org","type":"User","login":"lorrin"},"ref":"no-op_command-not-found","sha":"e8a7a31ef66093f1b1ab034e84e01a147fa8b28a","label":"lorrin:no-op_command-not-found","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/10/13 16:10:32 -0700","url":"https://github.com/lorrin/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":112,"private":false,"name":"oh-my-zsh","owner":"lorrin","created_at":"2011/01/27 16:21:14 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-03-24T04:27:14Z","labels":[],"state":"open"},{"issue_updated_at":"2011-08-01T05:24:02Z","gravatar_id":"20171a64471be602e50c8ba7662313af","position":252.0,"number":253,"votes":0,"user":{"name":"James Smith","company":"Heyzap","gravatar_id":"20171a64471be602e50c8ba7662313af","location":"San Francisco, CA","blog":"http://loopj.com","type":"User","login":"loopj"},"comments":1,"body":"I've added function git_remote_status to lib/git.zsh which extracts if the local branch is ahead/behind/diverged from remote. Also included is my current theme \"intheloop\" which demonstrates how to use git_remote_status.","title":"Added function git_remote_status to lib/git.zsh which extracts if the local branch is ahead/behind/diverged from remote","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/253.diff","updated_at":"2011-10-10T12:50:51Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/253","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/253.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"a738ca9b645c3cc53bdb01e8676202ceca449ccf","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"James Smith","company":"Heyzap","gravatar_id":"20171a64471be602e50c8ba7662313af","location":"San Francisco, CA","blog":"http://loopj.com","type":"User","login":"loopj"},"created_at":"2011-03-20T00:53:22Z","head":{"user":{"name":"James Smith","company":"Heyzap","gravatar_id":"20171a64471be602e50c8ba7662313af","location":"San Francisco, CA","blog":"http://loopj.com","type":"User","login":"loopj"},"ref":"master","sha":"0ba398f9e1aaf05e72406d5c840f013eebb6b260","label":"loopj:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/08/01 00:45:02 -0700","url":"https://github.com/loopj/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), nearly 70 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":772,"private":false,"name":"oh-my-zsh","owner":"loopj","created_at":"2011/03/19 17:39:00 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-03-20T00:53:22Z","labels":[],"state":"open"},{"issue_updated_at":"2011-08-22T19:19:22Z","gravatar_id":"c6b62e8457dbdd18bd3c578c769497ae","position":238.0,"number":239,"votes":0,"user":{"name":"Fredrik Appelberg","gravatar_id":"c6b62e8457dbdd18bd3c578c769497ae","location":"Uppsala, Sweden","blog":"mulli.nu","type":"User","login":"fred-o"},"comments":10,"body":"Hi, I've added plugins for Maven and GNU Screen, based mostly on code I found on the web. \r\n\r\nCheers,\r\n-- Fredrik","title":"Maven and GNU Screen plugins","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/239.diff","updated_at":"2011-10-10T12:50:51Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/239","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/239.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"971b071dc67f423d8b2a6f476e1dd58819049f41","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Fredrik Appelberg","gravatar_id":"c6b62e8457dbdd18bd3c578c769497ae","location":"Uppsala, Sweden","blog":"mulli.nu","type":"User","login":"fred-o"},"created_at":"2011-03-11T09:38:59Z","head":{"user":{"name":"Fredrik Appelberg","gravatar_id":"c6b62e8457dbdd18bd3c578c769497ae","location":"Uppsala, Sweden","blog":"mulli.nu","type":"User","login":"fred-o"},"ref":"master","sha":"0a896119214b5211d26be6446d5e98af7634c5ae","label":"fred-o:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/04/17 05:03:27 -0700","url":"https://github.com/fred-o/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":744,"private":false,"name":"oh-my-zsh","owner":"fred-o","created_at":"2011/02/11 00:00:32 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-03-11T09:38:59Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-02-07T22:40:30Z","gravatar_id":"2fb7f7dfb58d70107a2efc774badb256","position":213.0,"number":214,"votes":0,"user":{"name":"Allan Caffee","gravatar_id":"2fb7f7dfb58d70107a2efc774badb256","type":"User","login":"allancaffee"},"comments":0,"body":"I've added completion for the vm names.","title":"Improved completion for vagrant","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/214.diff","updated_at":"2011-10-10T12:50:51Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/214","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/214.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"01b0366f3e27cf30f3882870100f14625fc267d1","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Allan Caffee","gravatar_id":"2fb7f7dfb58d70107a2efc774badb256","type":"User","login":"allancaffee"},"created_at":"2011-02-07T22:40:30Z","head":{"user":{"name":"Allan Caffee","gravatar_id":"2fb7f7dfb58d70107a2efc774badb256","type":"User","login":"allancaffee"},"ref":"master","sha":"8aec32b48bb88e980150a43586e7e02b9156e165","label":"allancaffee:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/02/07 12:37:44 -0800","url":"https://github.com/allancaffee/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":420,"private":false,"name":"oh-my-zsh","owner":"allancaffee","created_at":"2011/02/07 12:28:02 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-02-07T22:40:30Z","labels":[],"state":"open"},{"issue_updated_at":"2011-02-06T02:57:21Z","gravatar_id":"4e17e0dd05911f4bcd69f8aafabf1b48","position":211.0,"number":212,"votes":0,"user":{"name":"Alex Ray","company":"North Carolina State University","gravatar_id":"4e17e0dd05911f4bcd69f8aafabf1b48","location":"Raleigh, NC","blog":"machinaut.posterous.com","type":"User","login":"ajray","email":"ajray@ncsu.edu"},"comments":0,"body":"this is something actually from trabianmatt's fork of oh-my-zsh but it didnt look like he put in a pull request for it.\r\n\r\nI was just looking for a fix to my problem and i found it in his oh-my-zsh fork.","title":"Simple rvm plugin to fix the ~rvm-cwd errors","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/212.diff","updated_at":"2011-10-10T12:50:50Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/212","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/212.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"01b0366f3e27cf30f3882870100f14625fc267d1","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Alex Ray","company":"North Carolina State University","gravatar_id":"4e17e0dd05911f4bcd69f8aafabf1b48","location":"Raleigh, NC","blog":"machinaut.posterous.com","type":"User","login":"ajray","email":"ajray@ncsu.edu"},"created_at":"2011-02-06T02:57:21Z","head":{"user":{"name":"Alex Ray","company":"North Carolina State University","gravatar_id":"4e17e0dd05911f4bcd69f8aafabf1b48","location":"Raleigh, NC","blog":"machinaut.posterous.com","type":"User","login":"ajray","email":"ajray@ncsu.edu"},"ref":"master","sha":"202215a3c956450d0e2a515d3e1b8791d0b1b982","label":"ajray:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/05/26 12:13:13 -0700","url":"https://github.com/ajray/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":708,"private":false,"name":"oh-my-zsh","owner":"ajray","created_at":"2011/02/05 18:53:29 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-02-06T02:57:21Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-02-04T04:13:50Z","gravatar_id":"54169a64eca05a858bdf95173915ed79","position":208.0,"number":209,"votes":0,"user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"comments":0,"body":"The inconsistent casing was confusing me as I read the man page to see what each option does; so, I fixed it.","title":"Fixed inconsistent casing in history.zsh","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/209.diff","updated_at":"2011-10-10T12:50:50Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/209","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/209.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"3bb21afa88f136c18073808852118dedd7e21fbf","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"created_at":"2011-02-04T04:13:50Z","head":{"user":{"name":"Sorin Ionescu","gravatar_id":"54169a64eca05a858bdf95173915ed79","blog":"http://blog.tweefari.com","type":"User","login":"sorin-ionescu","email":"sorin.ionescu@gmail.com"},"ref":"lib-history","sha":"e9dc19988c88f0ff83cb5e8fd9d2f62627f5403d","label":"sorin-ionescu:lib-history","repository":{"has_issues":false,"language":"Shell","watchers":11,"pushed_at":"2011/09/21 05:14:06 -0700","url":"https://github.com/sorin-ionescu/oh-my-zsh","has_downloads":true,"forks":3,"fork":true,"description":"A community-driven framework for managing ZSH.","has_wiki":false,"size":252,"private":false,"name":"oh-my-zsh","owner":"sorin-ionescu","created_at":"2010/12/16 00:07:04 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-02-04T04:13:50Z","labels":[],"state":"open"},{"issue_updated_at":"2011-03-21T15:22:11Z","gravatar_id":"53e3d1467d76485f11f104efa03ceb93","position":200.0,"number":201,"votes":0,"user":{"name":"Alex Satrapa","gravatar_id":"53e3d1467d76485f11f104efa03ceb93","type":"User","login":"AlexSatrapa"},"comments":1,"body":"My theme is based on \"arrow\" and pulls the exit code display trick from \"dieter\".\r\n\r\nThe Mercurial status is very primitive, based on the git status library.","title":"Added Mercurial status, along with a theme to illustrate the usage","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/201.diff","updated_at":"2011-10-10T12:50:50Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/201","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/201.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"01b0366f3e27cf30f3882870100f14625fc267d1","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Alex Satrapa","gravatar_id":"53e3d1467d76485f11f104efa03ceb93","type":"User","login":"AlexSatrapa"},"created_at":"2011-02-03T02:51:37Z","head":{"user":{"name":"Alex Satrapa","gravatar_id":"53e3d1467d76485f11f104efa03ceb93","type":"User","login":"AlexSatrapa"},"ref":"master","sha":"b52a7b74a14f808a93a43524023c78bf73c7a8ca","label":"AlexSatrapa:master","repository":{"has_issues":false,"language":"Shell","watchers":2,"pushed_at":"2011/06/08 21:04:19 -0700","url":"https://github.com/AlexSatrapa/oh-my-zsh","has_downloads":true,"forks":1,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":528,"private":false,"name":"oh-my-zsh","owner":"AlexSatrapa","created_at":"2011/02/02 18:41:58 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-02-03T02:51:37Z","labels":[],"state":"open"},{"issue_updated_at":"2011-02-22T05:58:36Z","gravatar_id":"6b4a65af011809338ec6ac746b48f6c3","position":197.0,"number":198,"votes":0,"user":{"name":"vlad","company":"self","gravatar_id":"6b4a65af011809338ec6ac746b48f6c3","location":"Kyiv","type":"User","login":"sumskyi","email":"sumskyi@gmail.com"},"comments":1,"body":"","title":"cap plugin fix","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/198.diff","updated_at":"2011-10-10T12:50:50Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/198","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/198.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"01b0366f3e27cf30f3882870100f14625fc267d1","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"vlad","company":"self","gravatar_id":"6b4a65af011809338ec6ac746b48f6c3","location":"Kyiv","type":"User","login":"sumskyi","email":"sumskyi@gmail.com"},"created_at":"2011-01-27T11:10:50Z","head":{"user":{"name":"vlad","company":"self","gravatar_id":"6b4a65af011809338ec6ac746b48f6c3","location":"Kyiv","type":"User","login":"sumskyi","email":"sumskyi@gmail.com"},"ref":"master","sha":"955b89388dfae9726bcc73ae1a9edfe3ebc6ad3a","label":"sumskyi:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/01/27 03:03:07 -0800","url":"https://github.com/sumskyi/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":408,"private":false,"name":"oh-my-zsh","owner":"sumskyi","created_at":"2011/01/27 02:37:52 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-01-27T11:10:50Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2011-07-23T16:27:12Z","gravatar_id":"0024a11ba1af1a5e8fa7c48ba50698bc","position":193.0,"number":194,"votes":0,"user":{"name":"Joseph Booker","company":"Neoturbine","gravatar_id":"0024a11ba1af1a5e8fa7c48ba50698bc","location":"Chicago","blog":"","type":"User","login":"sargas","email":"joe@neoturbine.net"},"comments":1,"body":"This change only modifies the upgrade.sh script to see if the origin is still left at robby's repo. If it isn't, it detects if an \"upstream\" remote is already created, and if not adds it. One way or another, the upgrade.sh script now merges the latest upstream code.*\r\n\r\n\r\n\r\n(*well, hopefull)","title":"Extend upgrade script to be useful to people maintaining forks","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/194.diff","updated_at":"2011-10-10T12:50:49Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/194","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/194.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"01b0366f3e27cf30f3882870100f14625fc267d1","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Joseph Booker","company":"Neoturbine","gravatar_id":"0024a11ba1af1a5e8fa7c48ba50698bc","location":"Chicago","blog":"","type":"User","login":"sargas","email":"joe@neoturbine.net"},"created_at":"2011-01-17T20:02:25Z","head":{"user":{"name":"Joseph Booker","company":"Neoturbine","gravatar_id":"0024a11ba1af1a5e8fa7c48ba50698bc","location":"Chicago","blog":"","type":"User","login":"sargas","email":"joe@neoturbine.net"},"ref":"joerc","sha":"fdb53851228da17d7536fc6c036c3a0e7535fd84","label":"sargas:joerc","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/01/17 11:58:14 -0800","url":"https://github.com/sargas/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":132,"private":false,"name":"oh-my-zsh","owner":"sargas","created_at":"2010/11/03 14:13:41 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2011-01-17T20:02:25Z","labels":[],"state":"open"},{"issue_updated_at":"2011-01-10T17:00:14Z","gravatar_id":"aa9576161bb251ce62ead1d545c203fa","position":184.0,"number":185,"votes":0,"user":{"gravatar_id":"aa9576161bb251ce62ead1d545c203fa","type":"User","login":"RobinRamael"},"comments":0,"body":"Hi,\r\n\r\nI took the liberty to create some infrastructure to allow for the prompt to display info of several scms, without the theme having to excplicitly mention each scm. This is how it is used:\r\n\r\nFor users:\r\nthis works the same as plugins: the scms variable is set in ~/.zshrc with a list of SCM for which info should be displayed in the prompt, as simple as that.\r\n\r\nfor theme developers:\r\ninstead of calling the git_prompt_info function, you can call the get_scm_prompt, which will display info for all the scms in the scms variable.\r\nthe following variables can be used in the old git-way:\r\n\r\nZSH_THEME_SCM_PROMPT_PREFIX: before everything but the scm's name (svn, git, ..)\r\nZSH_THEME_SCM_PROMPT_SUFFIX: after everything\r\nZSH_THEME_SCM_PROMPT_DIRTY: displayed when the repo is dirty\r\nZSH_THEME_SCM_PROMPT_CLEAN: displated when the repo is clean\r\nby default, the name of the scm (git, svn, ...) is not displayed before the scm info, but this can be changed by setting the ZSH_THEME_SCM_DISPLAY_NAME to 1.\r\n\r\nfor scm-plugin developers:\r\nto make an scm plugin with the name 'foo':\r\nadd a script called 'foo.scm.zsh' in to the scm folder. this script has to contain two functions:\r\n\r\nscm_in_foo_repo: checks wether we are in a foo repo, usually by checking if a .foo folder is present\r\nscm_foo_prompt_info: returns the prompt which follows the rules outlined above (in the \"for theme developers\"-section)\r\nSuggestions and criticism welcome!\r\n\r\nPS: this branch also includes a small change to the .gitignore file, making it ignore everything in custom/, not only the zshell scripts. I needed this for myself, because I keep other stuff like my pythonrc there, but I think it would be sensible to change this everywhere.\r\n\r\ncheers \r\n\r\nRobin","title":"Implemented scm plugin system and added scmplugins for git and svn","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/185.diff","updated_at":"2011-10-10T12:50:49Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/185","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/185.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"7a9cc198196cb0c935afe96e1de249c3a05ad413","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"gravatar_id":"aa9576161bb251ce62ead1d545c203fa","type":"User","login":"RobinRamael"},"created_at":"2011-01-10T17:00:13Z","head":{"user":{"gravatar_id":"aa9576161bb251ce62ead1d545c203fa","type":"User","login":"RobinRamael"},"ref":"scm","sha":"fe4504cef92440f36b7fdcad9be6e7365bd89878","label":"RobinRamael:scm","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/08/07 04:01:36 -0700","url":"https://github.com/RobinRamael/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":316,"private":false,"name":"oh-my-zsh","owner":"RobinRamael","created_at":"2011/01/10 08:49:30 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2011-01-10T17:00:14Z","labels":[],"state":"open"},{"issue_updated_at":"2011-06-05T03:00:54Z","gravatar_id":"ede5e59165e3efc98c7a8c268b0d8f3d","position":172.0,"number":173,"votes":0,"user":{"name":"Florent Thoumie","company":"Facebook","gravatar_id":"ede5e59165e3efc98c7a8c268b0d8f3d","location":"Dublin, Ireland","blog":"http://blog.xbsd.org/","type":"User","login":"flz","email":"flz@xbsd.org"},"comments":5,"body":"Here are two commits:\r\n- one to support LS_COLORS automatically in zsh completion,\r\n- the other to add vcs_info_prompt(), a more generic version of git_prompt_info().","title":"Merge candidates","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/173.diff","updated_at":"2011-10-10T12:50:49Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/173","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/173.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"4fadc302472f9b02e386da3e7182c1397ee3cd5c","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Florent Thoumie","company":"Facebook","gravatar_id":"ede5e59165e3efc98c7a8c268b0d8f3d","location":"Dublin, Ireland","blog":"http://blog.xbsd.org/","type":"User","login":"flz","email":"flz@xbsd.org"},"created_at":"2010-12-29T14:02:11Z","head":{"user":{"name":"Florent Thoumie","company":"Facebook","gravatar_id":"ede5e59165e3efc98c7a8c268b0d8f3d","location":"Dublin, Ireland","blog":"http://blog.xbsd.org/","type":"User","login":"flz","email":"flz@xbsd.org"},"ref":"merge-candidates","sha":"53411d03d68b93a903300ca14ba9b775450127d2","label":"flz:merge-candidates","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2010/12/29 06:44:47 -0800","url":"https://github.com/flz/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":104,"private":false,"name":"oh-my-zsh","owner":"flz","created_at":"2010/12/29 03:33:38 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2010-12-29T14:02:11Z","labels":[],"state":"open"},{"issue_updated_at":"2010-12-20T09:15:53Z","gravatar_id":"429fa73ee46e8cf341c1a36aa918484f","position":161.0,"number":162,"votes":0,"user":{"name":"Kristaps Kūlis","company":"truevision","gravatar_id":"429fa73ee46e8cf341c1a36aa918484f","location":"Rīga, Latvia","blog":"","type":"User","login":"krikulis","email":"kristaps.kulis@gmail.com"},"comments":0,"body":"new theme, based on arrow with hostname prefixed (to avoid confusion between numerous sshd terminals)","title":"theme","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/162.diff","updated_at":"2011-10-10T12:50:48Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/162","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/162.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"4fadc302472f9b02e386da3e7182c1397ee3cd5c","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Kristaps Kūlis","company":"truevision","gravatar_id":"429fa73ee46e8cf341c1a36aa918484f","location":"Rīga, Latvia","blog":"","type":"User","login":"krikulis","email":"kristaps.kulis@gmail.com"},"created_at":"2010-12-20T09:15:53Z","head":{"user":{"name":"Kristaps Kūlis","company":"truevision","gravatar_id":"429fa73ee46e8cf341c1a36aa918484f","location":"Rīga, Latvia","blog":"","type":"User","login":"krikulis","email":"kristaps.kulis@gmail.com"},"ref":"master","sha":"86b7349ae245a7684028593798f9851bca823cdb","label":"krikulis:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2010/12/20 01:14:09 -0800","url":"https://github.com/krikulis/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":156,"private":false,"name":"oh-my-zsh","owner":"krikulis","created_at":"2010/12/20 01:12:03 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2010-12-20T09:15:53Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2010-12-06T00:56:31Z","gravatar_id":"b05542985d6d1ec0d1824283c614fd80","position":154.0,"number":155,"votes":0,"user":{"name":"Anton Stroganov","gravatar_id":"b05542985d6d1ec0d1824283c614fd80","location":"San Francisco, CA","blog":"http://aeontech.tumblr.com","type":"User","login":"Aeon","email":"stroganov.a@gmail.com"},"comments":0,"body":"Not sure what happened to the old Rake plugin, this fixes the cap plugin problems and adds the rake plugin back in.","title":"Fix Capistrano plugin and add Rake plugin","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/155.diff","updated_at":"2011-10-10T12:50:48Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/155","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/155.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"762b55bb2bc0452ce3f5f2f21bc22b61936ef704","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Anton Stroganov","gravatar_id":"b05542985d6d1ec0d1824283c614fd80","location":"San Francisco, CA","blog":"http://aeontech.tumblr.com","type":"User","login":"Aeon","email":"stroganov.a@gmail.com"},"created_at":"2010-12-06T00:56:30Z","head":{"user":{"name":"Anton Stroganov","gravatar_id":"b05542985d6d1ec0d1824283c614fd80","location":"San Francisco, CA","blog":"http://aeontech.tumblr.com","type":"User","login":"Aeon","email":"stroganov.a@gmail.com"},"ref":"master","sha":"25527d5a4b9fb275c5088eae6c4288308f398538","label":"Aeon:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2011/09/13 13:16:38 -0700","url":"https://github.com/Aeon/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":116,"private":false,"name":"oh-my-zsh","owner":"Aeon","created_at":"2010/12/04 16:17:37 -0800","open_issues":0,"homepage":""}},"issue_created_at":"2010-12-06T00:56:31Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2010-11-30T22:12:11Z","gravatar_id":"b0369eeb7dc9a214418dc59ab0c682d7","position":147.0,"number":148,"votes":0,"user":{"gravatar_id":"b0369eeb7dc9a214418dc59ab0c682d7","type":"User","login":"danbaatar"},"comments":0,"body":"I made a \"new\" theme by modifying the candy theme. It's not revolutionary: I just wanted something informative, but short.\r\n\r\nThe prompt format is:\r\n\r\nname@host:hours.mins.secs:current_dir>\r\n\r\nAdditionally, if the previous shell command failed, a bright red X is added to the end of the prompt.\r\n\r\n--dan","title":"New theme \"compact\" for oh-my-zsh","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/148.diff","updated_at":"2011-10-10T12:50:47Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/148","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/148.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"4fadc302472f9b02e386da3e7182c1397ee3cd5c","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"gravatar_id":"b0369eeb7dc9a214418dc59ab0c682d7","type":"User","login":"danbaatar"},"created_at":"2010-11-30T22:12:11Z","head":{"user":{"gravatar_id":"b0369eeb7dc9a214418dc59ab0c682d7","type":"User","login":"danbaatar"},"ref":"master","sha":"151c6410e086c0b9f0a77723f01b630bd99e52ff","label":"danbaatar:master","repository":null},"issue_created_at":"2010-11-30T22:12:11Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2010-12-02T18:30:26Z","gravatar_id":"609b69cbb09257883a4e32d7d5aff098","position":143.0,"number":144,"votes":0,"user":{"name":"Guillaume Hain","gravatar_id":"609b69cbb09257883a4e32d7d5aff098","location":"France","type":"User","login":"zedtux","email":"zedtux@zedroot.org"},"comments":4,"body":"Hello,\r\n\r\nAs you requested me, here is my pull request that include my own zsh theme, based on eastwood, with rvm, git and bazaar integration.","title":"My own zsh theme","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/144.diff","updated_at":"2011-10-10T12:50:47Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/144","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/144.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"583c984a864969579a0c258528ae93f9529308d4","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Guillaume Hain","gravatar_id":"609b69cbb09257883a4e32d7d5aff098","location":"France","type":"User","login":"zedtux","email":"zedtux@zedroot.org"},"created_at":"2010-11-25T18:10:10Z","head":{"user":{"name":"Guillaume Hain","gravatar_id":"609b69cbb09257883a4e32d7d5aff098","location":"France","type":"User","login":"zedtux","email":"zedtux@zedroot.org"},"ref":"master","sha":"7caa6df18a209aa8259e1cdf3fdc5e0c3f0e5acb","label":"zedtux:master","repository":null},"issue_created_at":"2010-11-25T18:10:10Z","labels":["Themes"],"state":"open"},{"issue_updated_at":"2010-10-28T23:48:03Z","gravatar_id":"9289db62d5c34afb4f277a5215e05c83","position":121.0,"number":122,"votes":0,"user":{"name":"Irakli Gozalishvili","company":"Mozilla","gravatar_id":"9289db62d5c34afb4f277a5215e05c83","location":"Paris, France","blog":"http://jeditoolkit.com/","type":"User","login":"Gozala","email":"rfobic@gmail.com"},"comments":1,"body":"Hi,\r\n\r\nI've added port of `__git_ps1` function that comes with git's bash_completion. It's basically smarter version of already existing `current_branch` function. In contrast to `current_branch` `__git_ps1` can does things like:\r\n\r\n(bb8f98d...) <- if you checkout non branched commit\r\n(master|REBASE) <- if on rebase of your master are run into confilct \r\n(master|MERGING) <- if on merge you got a merge-conflict\r\n","title":"port of __git_ps1 that comes with git's bash_completion","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/122.diff","updated_at":"2011-10-10T12:50:47Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/122","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/122.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"dc12853b0c3e5af9e42f44cb9efdf57d44d20711","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Irakli Gozalishvili","company":"Mozilla","gravatar_id":"9289db62d5c34afb4f277a5215e05c83","location":"Paris, France","blog":"http://jeditoolkit.com/","type":"User","login":"Gozala","email":"rfobic@gmail.com"},"created_at":"2010-10-25T16:21:02Z","head":{"user":{"name":"Irakli Gozalishvili","company":"Mozilla","gravatar_id":"9289db62d5c34afb4f277a5215e05c83","location":"Paris, France","blog":"http://jeditoolkit.com/","type":"User","login":"Gozala","email":"rfobic@gmail.com"},"ref":"master","sha":"79305256b9b9480304233ac01e624151c9409b82","label":"Gozala:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2010/10/25 09:10:13 -0700","url":"https://github.com/Gozala/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":1004,"private":false,"name":"oh-my-zsh","owner":"Gozala","created_at":"2010/10/08 16:24:48 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2010-10-25T16:21:02Z","labels":[],"state":"open"},{"issue_updated_at":"2011-09-16T17:54:20Z","gravatar_id":"9e857848a61366860a1b23ba584817e8","position":120.0,"number":121,"votes":1,"user":{"name":"Ryan Phillips","company":"","gravatar_id":"9e857848a61366860a1b23ba584817e8","location":"Austin, TX","blog":"","type":"User","login":"rphillips","email":""},"comments":26,"body":"Fixes issue 43.\r\n\r\nI believe it would be better to remove the lib/git.zsh support in favor of the vcsinfo plugin. Native zsh has support for bzr, cdv, cvs, darcs, git, hg, mtn, p4, svk, svn, tla, git-p4, and git-svn. This makes for a more flexible SCM solution within oh-my-zsh. \r\n\r\nRegards,\r\nRyan\r\n\r\nhttp://zsh.sourceforge.net/Doc/Release/User-Contributions.html#SEC273","title":"Add vcsinfo plugin","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/121.diff","updated_at":"2011-10-10T12:50:47Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/121","mergeable":false,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/121.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"ab2a7b51a8c3ead55a272fba58232d0823e519a2","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Ryan Phillips","company":"","gravatar_id":"9e857848a61366860a1b23ba584817e8","location":"Austin, TX","blog":"","type":"User","login":"rphillips","email":""},"created_at":"2010-10-19T04:47:04Z","head":{"user":{"name":"Ryan Phillips","company":"","gravatar_id":"9e857848a61366860a1b23ba584817e8","location":"Austin, TX","blog":"","type":"User","login":"rphillips","email":""},"ref":"master","sha":"1e709d00e77d1bfa5342cde142607ff625a726de","label":"rphillips:master","repository":{"has_issues":false,"language":"Shell","watchers":4,"pushed_at":"2011/05/26 08:45:17 -0700","url":"https://github.com/rphillips/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":188,"private":false,"name":"oh-my-zsh","owner":"rphillips","created_at":"2010/10/18 21:11:21 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2010-10-19T04:47:04Z","labels":["Plugins"],"state":"open"},{"issue_updated_at":"2010-10-13T13:02:24Z","gravatar_id":"dcbf676f860477e44b275cae5d6318a4","position":110.0,"number":111,"votes":0,"user":{"name":"Piotr Usewicz","company":"layer|twenty|two","gravatar_id":"dcbf676f860477e44b275cae5d6318a4","location":"London","blog":"www.layer22.com","type":"User","login":"pusewicz","email":"piotr@layer22.com"},"comments":0,"body":"Add ZSH_THEME_RVM_PROMPT_{PREFIX|SUFFIX}\r\nAdd pete theme","title":"Add ZSH_THEME_RVM_PROMPT_{PREFIX|SUFFIX} and new theme","diff_url":"https://github.com/robbyrussell/oh-my-zsh/pull/111.diff","updated_at":"2011-10-10T12:50:47Z","html_url":"https://github.com/robbyrussell/oh-my-zsh/pull/111","mergeable":true,"patch_url":"https://github.com/robbyrussell/oh-my-zsh/pull/111.patch","base":{"user":{"name":"Robby Russell","company":"Planet Argon, LLC","gravatar_id":"a82ba1167f4d4a8d1de63820e576a87f","location":"Paris, France","blog":"http://planetargon.com/who-we-are/robby-russell","type":"User","login":"robbyrussell","email":""},"ref":"master","sha":"dc12853b0c3e5af9e42f44cb9efdf57d44d20711","label":"robbyrussell:master","repository":{"has_issues":true,"language":"Shell","watchers":3035,"pushed_at":"2011/10/18 17:18:37 -0700","url":"https://github.com/robbyrussell/oh-my-zsh","has_downloads":true,"forks":1258,"fork":false,"description":"A community-driven framework for managing your zsh configuration. Includes 40+ optional plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal themes to spice up your morning, and an auto-update tool so that makes it easy to keep up with the latest updates from the community.","has_wiki":true,"size":3080,"private":false,"name":"oh-my-zsh","owner":"robbyrussell","created_at":"2009/08/28 11:15:37 -0700","open_issues":213,"homepage":"http://twitter.com/ohmyzsh"}},"issue_user":{"name":"Piotr Usewicz","company":"layer|twenty|two","gravatar_id":"dcbf676f860477e44b275cae5d6318a4","location":"London","blog":"www.layer22.com","type":"User","login":"pusewicz","email":"piotr@layer22.com"},"created_at":"2010-10-13T13:02:24Z","head":{"user":{"name":"Piotr Usewicz","company":"layer|twenty|two","gravatar_id":"dcbf676f860477e44b275cae5d6318a4","location":"London","blog":"www.layer22.com","type":"User","login":"pusewicz","email":"piotr@layer22.com"},"ref":"master","sha":"bf5a53e2eae35a55c8dc8d88fbd99411153977ad","label":"pusewicz:master","repository":{"has_issues":false,"language":"Shell","watchers":1,"pushed_at":"2010/10/13 05:59:58 -0700","url":"https://github.com/pusewicz/oh-my-zsh","has_downloads":true,"forks":0,"fork":true,"description":"A community-driven framework for managing your zsh configuration. Includes optional plugins for various tools (rails, git, OSX, brew,...), over 40 terminal themes, and an auto-updating tool so that you can keep up with the latest improvements from the community.","has_wiki":true,"size":324,"private":false,"name":"oh-my-zsh","owner":"pusewicz","created_at":"2010/10/13 05:05:02 -0700","open_issues":0,"homepage":""}},"issue_created_at":"2010-10-13T13:02:24Z","labels":["Themes"],"state":"open"}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,show,tekkub,05ca6f8b40fe3e2ecd7da9236cbe8004 b/tests/data/github.com,api,v2,json,repos,show,tekkub,05ca6f8b40fe3e2ecd7da9236cbe8004 new file mode 100644 index 0000000..9651c43 --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,show,tekkub,05ca6f8b40fe3e2ecd7da9236cbe8004 @@ -0,0 +1,16 @@ +status: 200 +x-ratelimit-remaining: 58 +content-location: https://github.com/api/v2/json/repos/show/tekkub?page=2 +-content-encoding: gzip +connection: keep-alive +content-length: 14995 +server: nginx/1.0.4 +date: Wed, 19 Oct 2011 08:39:57 GMT +x-runtime: 330ms +x-ratelimit-limit: 60 +etag: "e0a7a0299440c8e2f32c845e8fec1c0c" +cache-control: private, max-age=0, must-revalidate +x-frame-options: deny +content-type: application/json; charset=utf-8 + +{"repositories":[{"watchers":1,"url":"https://github.com/tekkub/OhSnap","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":0,"private":false,"pushed_at":"2009/07/27 17:49:36 -0700","name":"OhSnap","owner":"tekkub","created_at":"2009/07/27 17:48:23 -0700","homepage":"","has_wiki":true},{"language":"Lua","watchers":13,"url":"https://github.com/tekkub/GoodNewsEveryone","open_issues":6,"forks":7,"has_issues":true,"fork":false,"description":"WoW Addon - I've invented a device that tells you when reactive abilities are available!","has_downloads":true,"size":112,"private":false,"pushed_at":"2011/07/23 23:20:25 -0700","name":"GoodNewsEveryone","owner":"tekkub","created_at":"2009/07/28 18:45:05 -0700","homepage":"http://www.tekkub.net/addons/GoodNewsEveryone","has_wiki":true},{"language":"Lua","watchers":23,"url":"https://github.com/tekkub/GnomishVendorShrinker","open_issues":2,"forks":4,"has_issues":true,"fork":false,"description":"WoW Addon - Compact scrolling vendor frame","has_downloads":true,"size":596,"private":false,"pushed_at":"2011/07/04 15:36:43 -0700","name":"GnomishVendorShrinker","owner":"tekkub","created_at":"2009/08/15 19:56:03 -0700","homepage":"http://www.tekkub.net/addons/GnomishVendorShrinker","has_wiki":true},{"language":"Lua","watchers":6,"url":"https://github.com/tekkub/tekChat","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Misc chat stuff\r","has_downloads":true,"size":780,"private":false,"pushed_at":"2010/06/24 01:09:16 -0700","name":"tekChat","owner":"tekkub","created_at":"2009/08/23 01:46:24 -0700","homepage":"http://www.tekkub.net/addons/tekChat","has_wiki":true},{"language":"C","watchers":2,"url":"https://github.com/tekkub/limechat","open_issues":0,"forks":1,"has_issues":false,"fork":true,"description":"IRC Client for OSX","has_downloads":true,"size":16220,"private":false,"pushed_at":"2010/05/01 17:31:48 -0700","name":"limechat","owner":"tekkub","created_at":"2009/09/03 23:58:49 -0700","homepage":"http://limechat.net/mac/","has_wiki":true},{"language":"Lua","watchers":1,"url":"https://github.com/tekkub/leafLFG","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"My fork of leafLFG","has_downloads":true,"size":540,"private":false,"pushed_at":"2009/09/06 19:14:29 -0700","name":"leafLFG","owner":"tekkub","created_at":"2009/09/06 19:10:51 -0700","homepage":"http://www.wowinterface.com/downloads/fileinfo.php?id=13287","has_wiki":true},{"watchers":2,"url":"https://github.com/tekkub/Warmup","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":0,"private":false,"name":"Warmup","owner":"tekkub","created_at":"2009/10/01 16:09:12 -0700","homepage":"","has_wiki":true},{"language":"Ruby","watchers":4,"url":"https://github.com/tekkub/github-upload","open_issues":0,"forks":5,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":260,"private":false,"pushed_at":"2009/10/24 15:41:42 -0700","name":"github-upload","owner":"tekkub","created_at":"2009/10/02 15:39:42 -0700","homepage":"","has_wiki":true},{"language":"Lua","watchers":2,"url":"https://github.com/tekkub/oUF_HealComm4","open_issues":0,"forks":1,"has_issues":false,"fork":false,"description":"add LibHealComm-4.0 bars to oUF frames","has_downloads":true,"size":0,"private":false,"pushed_at":"2009/11/03 11:15:42 -0800","name":"oUF_HealComm4","owner":"tekkub","created_at":"2009/11/01 22:53:01 -0800","homepage":"","has_wiki":true},{"watchers":16,"url":"https://github.com/tekkub/Mustache.tmbundle","open_issues":0,"forks":5,"has_issues":true,"fork":false,"description":"A little textmate bundle for defunkt/mustache","has_downloads":true,"size":124,"private":false,"pushed_at":"2009/11/11 17:34:38 -0800","name":"Mustache.tmbundle","owner":"tekkub","created_at":"2009/11/11 17:12:46 -0800","homepage":"","has_wiki":true},{"language":"Ruby","watchers":1,"url":"https://github.com/tekkub/mustache-sinatra-example","open_issues":0,"forks":1,"has_issues":false,"fork":true,"description":"An example of using Mustache in a Sinatra app.","has_downloads":false,"size":252,"private":false,"pushed_at":"2009/11/11 22:28:24 -0800","name":"mustache-sinatra-example","owner":"tekkub","created_at":"2009/11/11 22:27:25 -0800","homepage":"","has_wiki":false},{"language":"JavaScript","watchers":8,"url":"https://github.com/tekkub/ihaveissues.github.com","open_issues":1,"forks":2,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":112,"private":false,"pushed_at":"2011/06/26 22:38:27 -0700","name":"ihaveissues.github.com","owner":"tekkub","created_at":"2009/12/04 00:48:18 -0800","master_branch":"gh-pages","homepage":"http://ihaveissues.github.com","has_wiki":true},{"watchers":2,"url":"https://github.com/tekkub/sandbox","open_issues":1,"forks":1,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":0,"private":false,"name":"sandbox","owner":"tekkub","created_at":"2009/12/14 12:06:49 -0800","homepage":"","has_wiki":true},{"language":"JavaScript","watchers":1,"url":"https://github.com/tekkub/wowace-navbar","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"Chrome extension to fix wowace.com forum navbar","has_downloads":true,"size":209,"private":false,"pushed_at":"2009/12/17 01:53:58 -0800","name":"wowace-navbar","owner":"tekkub","created_at":"2009/12/17 01:50:57 -0800","homepage":"","has_wiki":true},{"language":"Lua","watchers":6,"url":"https://github.com/tekkub/tekKrush","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"WoW Addon - Yes, I really want to destroy that item, stop asking","has_downloads":true,"size":100,"private":false,"pushed_at":"2011/07/23 22:13:25 -0700","name":"tekKrush","owner":"tekkub","created_at":"2009/12/29 16:30:57 -0800","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Lua","watchers":5,"url":"https://github.com/tekkub/MediumRare","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"WoW Addon - Scans NPCs around you for rares","has_downloads":true,"size":260,"private":false,"pushed_at":"2010/12/20 22:43:18 -0800","name":"MediumRare","owner":"tekkub","created_at":"2010/01/02 17:40:19 -0800","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Lua","watchers":2,"url":"https://github.com/tekkub/Shrank","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Warn when players cast spells that aren't max rank","has_downloads":true,"size":112,"private":false,"pushed_at":"2010/01/02 17:43:21 -0800","name":"Shrank","owner":"tekkub","created_at":"2010/01/02 17:43:15 -0800","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Lua","watchers":3,"url":"https://github.com/tekkub/erroff","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Simple error message blocker for macros","has_downloads":true,"size":108,"private":false,"pushed_at":"2010/01/03 14:14:52 -0800","name":"erroff","owner":"tekkub","created_at":"2010/01/03 01:37:57 -0800","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"JavaScript","watchers":6,"url":"https://github.com/tekkub/tender-checker","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"Chrome extension - Adds a browser action to track a tenderapp.com inbox","has_downloads":true,"size":560,"private":false,"pushed_at":"2010/01/17 02:10:22 -0800","name":"tender-checker","owner":"tekkub","created_at":"2010/01/16 17:08:37 -0800","homepage":"","has_wiki":true},{"language":"JavaScript","watchers":1,"url":"https://github.com/tekkub/facebook-friend-renamer","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"Chrome extension - Lets you rename facebook friends, because you don't use \"real\" names with these people","has_downloads":true,"size":276,"private":false,"pushed_at":"2010/01/23 11:51:04 -0800","name":"facebook-friend-renamer","owner":"tekkub","created_at":"2010/01/23 11:32:53 -0800","homepage":"","has_wiki":true},{"language":"Lua","watchers":1,"url":"https://github.com/tekkub/tekAutoRepair","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Automatically repair shits","has_downloads":true,"size":100,"private":false,"pushed_at":"2010/04/18 16:30:08 -0700","name":"tekAutoRepair","owner":"tekkub","created_at":"2010/04/18 16:29:56 -0700","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Lua","watchers":5,"url":"https://github.com/tekkub/GnomishInboxShrinker","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"WoW Addon - A simple, scrolling inbox","has_downloads":true,"size":312,"private":false,"pushed_at":"2010/06/06 12:14:09 -0700","name":"GnomishInboxShrinker","owner":"tekkub","created_at":"2010/04/19 11:30:41 -0700","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Lua","watchers":2,"url":"https://github.com/tekkub/ImbaPalas","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - The missing paladin bubble sound effect","has_downloads":true,"size":656,"private":false,"pushed_at":"2010/05/02 21:34:21 -0700","name":"ImbaPalas","owner":"tekkub","created_at":"2010/05/02 21:33:57 -0700","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"JavaScript","watchers":2,"url":"https://github.com/tekkub/goo.gl-QR","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"Chrome extension - Shorten URL with goo.gl and generate a QR code","has_downloads":true,"size":212,"private":false,"pushed_at":"2010/06/06 15:07:50 -0700","name":"goo.gl-QR","owner":"tekkub","created_at":"2010/06/06 14:56:25 -0700","homepage":"","has_wiki":true},{"language":"Lua","watchers":6,"url":"https://github.com/tekkub/UnrealID","open_issues":0,"forks":2,"has_issues":false,"fork":false,"description":"WoW Addon - Make \"real\" names go away","has_downloads":true,"size":124,"private":false,"pushed_at":"2010/07/10 22:01:28 -0700","name":"UnrealID","owner":"tekkub","created_at":"2010/06/29 22:08:32 -0700","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"Ruby","watchers":1,"url":"https://github.com/tekkub/hubahuba","open_issues":0,"forks":1,"has_issues":false,"fork":true,"description":"Ruby and Rails core extensions used by GitHub.","has_downloads":false,"size":0,"private":false,"pushed_at":"2008/05/10 21:52:00 -0700","name":"hubahuba","owner":"tekkub","created_at":"2010/07/19 17:10:40 -0700","homepage":"","has_wiki":false},{"language":"Ruby","watchers":1,"url":"https://github.com/tekkub/scaffolding","open_issues":0,"forks":1,"has_issues":false,"fork":true,"description":"Dynamic Scaffolding plugin","has_downloads":true,"size":0,"private":false,"pushed_at":"2008/05/29 13:55:30 -0700","name":"scaffolding","owner":"tekkub","created_at":"2010/07/19 17:12:00 -0700","homepage":"http://rubyonrails.org","has_wiki":true},{"watchers":4,"url":"https://github.com/tekkub/gmail","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"","has_downloads":true,"size":132,"private":false,"pushed_at":"2010/11/11 02:14:43 -0800","name":"gmail","owner":"tekkub","created_at":"2010/11/11 02:09:38 -0800","master_branch":"gh-pages","homepage":"","has_wiki":true},{"language":"Ruby","watchers":1,"url":"https://github.com/tekkub/zp","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"Zero Punctuation Video RSS feed generator","has_downloads":true,"size":652,"private":false,"pushed_at":"2011/08/17 19:36:07 -0700","name":"zp","owner":"tekkub","created_at":"2010/11/16 01:43:02 -0800","master_branch":"master","homepage":"http://tekkub.net/zp/videos.xml","has_wiki":true},{"language":"Lua","watchers":1,"integrate_branch":"1.4","url":"https://github.com/tekkub/oUF","open_issues":0,"forks":0,"has_issues":false,"fork":true,"description":"WoW AddOn - Unit frame framework.","has_downloads":true,"size":820,"private":false,"pushed_at":"2010/12/01 00:07:08 -0800","name":"oUF","owner":"tekkub","created_at":"2010/12/01 00:04:14 -0800","homepage":"http://www.wowinterface.com/downloads/info9994-oUF.html","has_wiki":true},{"language":"Lua","watchers":3,"url":"https://github.com/tekkub/MillerLite","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Adds a frame to the AH for fast crafting mat lookup","has_downloads":true,"size":192,"private":false,"pushed_at":"2010/12/30 21:15:20 -0800","name":"MillerLite","owner":"tekkub","created_at":"2010/12/17 19:58:28 -0800","homepage":"http://www.tekkub.net/","has_wiki":true},{"language":"JavaScript","watchers":1,"url":"https://github.com/tekkub/doublecaps","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"I'm a terrible typist, true story","has_downloads":true,"size":184,"private":false,"pushed_at":"2010/12/24 16:32:40 -0800","name":"doublecaps","owner":"tekkub","created_at":"2010/12/24 16:26:36 -0800","homepage":"","has_wiki":true},{"language":"JavaScript","watchers":1,"url":"https://github.com/tekkub/rtd","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"Just a little RTD lightrail schedule for my bear","has_downloads":true,"size":616,"private":false,"pushed_at":"2011/07/17 14:18:13 -0700","name":"rtd","owner":"tekkub","created_at":"2011/06/05 00:34:36 -0700","master_branch":"gh-pages","homepage":"http://tekkub.net/rtd","has_wiki":true},{"language":"Lua","watchers":2,"url":"https://github.com/tekkub/Velluminous","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"WoW Addon - Quickly enchant directly to vellum","has_downloads":true,"size":96,"private":false,"pushed_at":"2011/06/26 01:19:45 -0700","name":"Velluminous","owner":"tekkub","created_at":"2011/06/26 01:19:14 -0700","homepage":"http://tekkub.net/","has_wiki":true},{"language":"JavaScript","watchers":5,"url":"https://github.com/tekkub/dotjs","open_issues":0,"forks":2,"has_issues":true,"fork":false,"description":"My dotjs scripts","has_downloads":true,"size":108,"private":false,"pushed_at":"2011/10/13 03:26:02 -0700","name":"dotjs","owner":"tekkub","created_at":"2011/06/30 15:50:38 -0700","homepage":"http://defunkt.io/dotjs/","has_wiki":true},{"language":"JavaScript","watchers":2,"url":"https://github.com/tekkub/gitmarks","open_issues":0,"forks":0,"has_issues":false,"fork":true,"description":"Add project bookmarking to github","has_downloads":true,"size":112,"private":false,"pushed_at":"2011/09/16 14:14:20 -0700","name":"gitmarks","owner":"tekkub","created_at":"2011/07/16 01:07:57 -0700","homepage":"","has_wiki":true},{"language":"Ruby","watchers":6,"url":"https://github.com/tekkub/supportbee","open_issues":0,"forks":1,"has_issues":true,"fork":false,"description":"A little ruby library for talking to supportbee's API","has_downloads":true,"size":100,"private":false,"pushed_at":"2011/09/23 21:35:24 -0700","name":"supportbee","owner":"tekkub","created_at":"2011/09/23 21:28:34 -0700","homepage":"supportbee.com","has_wiki":true}]} \ No newline at end of file diff --git a/tests/data/github.com,api,v2,json,repos,watched,tekkub,ab3eb0c9eb0123839606c57857627b30 b/tests/data/github.com,api,v2,json,repos,watched,tekkub,ab3eb0c9eb0123839606c57857627b30 new file mode 100644 index 0000000..711a2dd --- /dev/null +++ b/tests/data/github.com,api,v2,json,repos,watched,tekkub,ab3eb0c9eb0123839606c57857627b30 @@ -0,0 +1,16 @@ +status: 200 +x-ratelimit-remaining: 57 +content-location: https://github.com/api/v2/json/repos/watched/tekkub?page=2 +-content-encoding: gzip +connection: keep-alive +content-length: 15803 +server: nginx/1.0.4 +date: Wed, 19 Oct 2011 08:40:14 GMT +x-runtime: 313ms +x-ratelimit-limit: 60 +etag: "b189a43b15d26fb7fb5940dcbaf3046c" +cache-control: private, max-age=0, must-revalidate +x-frame-options: deny +content-type: application/json; charset=utf-8 + +{"repositories":[{"open_issues":0,"language":"Lua","watchers":2,"pushed_at":"2009/07/25 20:07:42 -0700","url":"https://github.com/tekkub/Buffoon","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Show who cast what buff via LDB","size":132,"private":false,"name":"Buffoon","owner":"tekkub","has_wiki":true,"created_at":"2009/07/25 20:07:27 -0700","forks":1,"homepage":"http://www.tekkub.net/addons/Buffoon"},{"open_issues":0,"watchers":1,"pushed_at":"2009/07/27 17:49:36 -0700","url":"https://github.com/tekkub/OhSnap","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":0,"private":false,"name":"OhSnap","owner":"tekkub","has_wiki":true,"created_at":"2009/07/27 17:48:23 -0700","forks":2,"homepage":""},{"open_issues":6,"language":"Lua","watchers":13,"pushed_at":"2011/07/23 23:20:25 -0700","url":"https://github.com/tekkub/GoodNewsEveryone","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - I've invented a device that tells you when reactive abilities are available!","size":112,"private":false,"name":"GoodNewsEveryone","owner":"tekkub","has_wiki":true,"created_at":"2009/07/28 18:45:05 -0700","forks":7,"homepage":"http://www.tekkub.net/addons/GoodNewsEveryone"},{"open_issues":2,"language":"Lua","watchers":23,"pushed_at":"2011/07/04 15:36:43 -0700","url":"https://github.com/tekkub/GnomishVendorShrinker","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Compact scrolling vendor frame","size":596,"private":false,"name":"GnomishVendorShrinker","owner":"tekkub","has_wiki":true,"created_at":"2009/08/15 19:56:03 -0700","forks":4,"homepage":"http://www.tekkub.net/addons/GnomishVendorShrinker"},{"open_issues":0,"language":"Lua","watchers":6,"pushed_at":"2010/06/24 01:09:16 -0700","url":"https://github.com/tekkub/tekChat","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Misc chat stuff\r","size":780,"private":false,"name":"tekChat","owner":"tekkub","has_wiki":true,"created_at":"2009/08/23 01:46:24 -0700","forks":1,"homepage":"http://www.tekkub.net/addons/tekChat"},{"open_issues":0,"language":"C","watchers":2,"pushed_at":"2010/05/01 17:31:48 -0700","url":"https://github.com/tekkub/limechat","has_issues":false,"has_downloads":true,"fork":true,"description":"IRC Client for OSX","size":16220,"private":false,"name":"limechat","owner":"tekkub","has_wiki":true,"created_at":"2009/09/03 23:58:49 -0700","forks":1,"homepage":"http://limechat.net/mac/"},{"open_issues":0,"language":"Lua","watchers":1,"pushed_at":"2009/09/06 19:14:29 -0700","url":"https://github.com/tekkub/leafLFG","has_issues":true,"has_downloads":true,"fork":false,"description":"My fork of leafLFG","size":540,"private":false,"name":"leafLFG","owner":"tekkub","has_wiki":true,"created_at":"2009/09/06 19:10:51 -0700","forks":1,"homepage":"http://www.wowinterface.com/downloads/fileinfo.php?id=13287"},{"open_issues":0,"watchers":2,"url":"https://github.com/tekkub/Warmup","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":0,"private":false,"name":"Warmup","owner":"tekkub","has_wiki":true,"created_at":"2009/10/01 16:09:12 -0700","forks":1,"homepage":""},{"open_issues":0,"language":"Ruby","watchers":4,"pushed_at":"2009/10/24 15:41:42 -0700","url":"https://github.com/tekkub/github-upload","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":260,"private":false,"name":"github-upload","owner":"tekkub","has_wiki":true,"created_at":"2009/10/02 15:39:42 -0700","forks":5,"homepage":""},{"open_issues":0,"language":"Lua","watchers":2,"pushed_at":"2009/11/03 11:15:42 -0800","url":"https://github.com/tekkub/oUF_HealComm4","has_issues":false,"has_downloads":true,"fork":false,"description":"add LibHealComm-4.0 bars to oUF frames","size":0,"private":false,"name":"oUF_HealComm4","owner":"tekkub","has_wiki":true,"created_at":"2009/11/01 22:53:01 -0800","forks":1,"homepage":""},{"open_issues":0,"watchers":16,"pushed_at":"2009/11/11 17:34:38 -0800","url":"https://github.com/tekkub/Mustache.tmbundle","has_issues":true,"has_downloads":true,"fork":false,"description":"A little textmate bundle for defunkt/mustache","size":124,"private":false,"name":"Mustache.tmbundle","owner":"tekkub","has_wiki":true,"created_at":"2009/11/11 17:12:46 -0800","forks":5,"homepage":""},{"open_issues":0,"language":"Ruby","watchers":1,"pushed_at":"2009/11/11 22:28:24 -0800","url":"https://github.com/tekkub/mustache-sinatra-example","has_issues":false,"has_downloads":false,"fork":true,"description":"An example of using Mustache in a Sinatra app.","size":252,"private":false,"name":"mustache-sinatra-example","owner":"tekkub","has_wiki":false,"created_at":"2009/11/11 22:27:25 -0800","forks":1,"homepage":""},{"open_issues":1,"language":"JavaScript","watchers":8,"pushed_at":"2011/06/26 22:38:27 -0700","url":"https://github.com/tekkub/ihaveissues.github.com","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":112,"private":false,"name":"ihaveissues.github.com","owner":"tekkub","has_wiki":true,"created_at":"2009/12/04 00:48:18 -0800","forks":2,"master_branch":"gh-pages","homepage":"http://ihaveissues.github.com"},{"open_issues":1,"watchers":2,"url":"https://github.com/tekkub/sandbox","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":0,"private":false,"name":"sandbox","owner":"tekkub","has_wiki":true,"created_at":"2009/12/14 12:06:49 -0800","forks":1,"homepage":""},{"open_issues":0,"language":"JavaScript","watchers":1,"pushed_at":"2009/12/17 01:53:58 -0800","url":"https://github.com/tekkub/wowace-navbar","has_issues":true,"has_downloads":true,"fork":false,"description":"Chrome extension to fix wowace.com forum navbar","size":209,"private":false,"name":"wowace-navbar","owner":"tekkub","has_wiki":true,"created_at":"2009/12/17 01:50:57 -0800","forks":1,"homepage":""},{"open_issues":0,"language":"Lua","watchers":6,"pushed_at":"2011/07/23 22:13:25 -0700","url":"https://github.com/tekkub/tekKrush","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Yes, I really want to destroy that item, stop asking","size":100,"private":false,"name":"tekKrush","owner":"tekkub","has_wiki":true,"created_at":"2009/12/29 16:30:57 -0800","forks":2,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Lua","watchers":5,"pushed_at":"2010/12/20 22:43:18 -0800","url":"https://github.com/tekkub/MediumRare","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Scans NPCs around you for rares","size":260,"private":false,"name":"MediumRare","owner":"tekkub","has_wiki":true,"created_at":"2010/01/02 17:40:19 -0800","forks":2,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Lua","watchers":2,"pushed_at":"2010/01/02 17:43:21 -0800","url":"https://github.com/tekkub/Shrank","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Warn when players cast spells that aren't max rank","size":112,"private":false,"name":"Shrank","owner":"tekkub","has_wiki":true,"created_at":"2010/01/02 17:43:15 -0800","forks":1,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Lua","watchers":3,"pushed_at":"2010/01/03 14:14:52 -0800","url":"https://github.com/tekkub/erroff","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Simple error message blocker for macros","size":108,"private":false,"name":"erroff","owner":"tekkub","has_wiki":true,"created_at":"2010/01/03 01:37:57 -0800","forks":1,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"JavaScript","watchers":6,"pushed_at":"2010/01/17 02:10:22 -0800","url":"https://github.com/tekkub/tender-checker","has_issues":true,"has_downloads":true,"fork":false,"description":"Chrome extension - Adds a browser action to track a tenderapp.com inbox","size":560,"private":false,"name":"tender-checker","owner":"tekkub","has_wiki":true,"created_at":"2010/01/16 17:08:37 -0800","forks":2,"homepage":""},{"open_issues":0,"language":"JavaScript","watchers":1,"pushed_at":"2010/01/23 11:51:04 -0800","url":"https://github.com/tekkub/facebook-friend-renamer","has_issues":true,"has_downloads":true,"fork":false,"description":"Chrome extension - Lets you rename facebook friends, because you don't use \"real\" names with these people","size":276,"private":false,"name":"facebook-friend-renamer","owner":"tekkub","has_wiki":true,"created_at":"2010/01/23 11:32:53 -0800","forks":1,"homepage":""},{"open_issues":0,"language":"Lua","watchers":1,"pushed_at":"2010/04/18 16:30:08 -0700","url":"https://github.com/tekkub/tekAutoRepair","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Automatically repair shits","size":100,"private":false,"name":"tekAutoRepair","owner":"tekkub","has_wiki":true,"created_at":"2010/04/18 16:29:56 -0700","forks":1,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Lua","watchers":5,"pushed_at":"2010/06/06 12:14:09 -0700","url":"https://github.com/tekkub/GnomishInboxShrinker","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - A simple, scrolling inbox","size":312,"private":false,"name":"GnomishInboxShrinker","owner":"tekkub","has_wiki":true,"created_at":"2010/04/19 11:30:41 -0700","forks":2,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Lua","watchers":2,"pushed_at":"2010/05/02 21:34:21 -0700","url":"https://github.com/tekkub/ImbaPalas","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - The missing paladin bubble sound effect","size":656,"private":false,"name":"ImbaPalas","owner":"tekkub","has_wiki":true,"created_at":"2010/05/02 21:33:57 -0700","forks":1,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"JavaScript","watchers":2,"pushed_at":"2010/06/06 15:07:50 -0700","url":"https://github.com/tekkub/goo.gl-QR","has_issues":true,"has_downloads":true,"fork":false,"description":"Chrome extension - Shorten URL with goo.gl and generate a QR code","size":212,"private":false,"name":"goo.gl-QR","owner":"tekkub","has_wiki":true,"created_at":"2010/06/06 14:56:25 -0700","forks":2,"homepage":""},{"open_issues":0,"language":"Lua","watchers":6,"pushed_at":"2010/07/10 22:01:28 -0700","url":"https://github.com/tekkub/UnrealID","has_issues":false,"has_downloads":true,"fork":false,"description":"WoW Addon - Make \"real\" names go away","size":124,"private":false,"name":"UnrealID","owner":"tekkub","has_wiki":true,"created_at":"2010/06/29 22:08:32 -0700","forks":2,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"Ruby","watchers":1,"pushed_at":"2008/05/10 21:52:00 -0700","url":"https://github.com/tekkub/hubahuba","has_issues":false,"has_downloads":false,"fork":true,"description":"Ruby and Rails core extensions used by GitHub.","size":0,"private":false,"name":"hubahuba","owner":"tekkub","has_wiki":false,"created_at":"2010/07/19 17:10:40 -0700","forks":1,"homepage":""},{"open_issues":0,"language":"Ruby","watchers":1,"pushed_at":"2008/05/29 13:55:30 -0700","url":"https://github.com/tekkub/scaffolding","has_issues":false,"has_downloads":true,"fork":true,"description":"Dynamic Scaffolding plugin","size":0,"private":false,"name":"scaffolding","owner":"tekkub","has_wiki":true,"created_at":"2010/07/19 17:12:00 -0700","forks":1,"homepage":"http://rubyonrails.org"},{"open_issues":0,"watchers":4,"pushed_at":"2010/11/11 02:14:43 -0800","url":"https://github.com/tekkub/gmail","has_issues":true,"has_downloads":true,"fork":false,"description":"","size":132,"private":false,"name":"gmail","owner":"tekkub","has_wiki":true,"created_at":"2010/11/11 02:09:38 -0800","forks":2,"master_branch":"gh-pages","homepage":""},{"open_issues":0,"language":"Ruby","watchers":1,"pushed_at":"2011/08/17 19:36:07 -0700","url":"https://github.com/tekkub/zp","has_issues":true,"has_downloads":true,"fork":false,"description":"Zero Punctuation Video RSS feed generator","size":652,"private":false,"name":"zp","owner":"tekkub","has_wiki":true,"created_at":"2010/11/16 01:43:02 -0800","forks":1,"master_branch":"master","homepage":"http://tekkub.net/zp/videos.xml"},{"open_issues":0,"language":"Lua","watchers":1,"pushed_at":"2010/12/01 00:07:08 -0800","url":"https://github.com/tekkub/oUF","has_issues":false,"has_downloads":true,"fork":true,"description":"WoW AddOn - Unit frame framework.","size":820,"private":false,"name":"oUF","owner":"tekkub","has_wiki":true,"created_at":"2010/12/01 00:04:14 -0800","forks":0,"homepage":"http://www.wowinterface.com/downloads/info9994-oUF.html","integrate_branch":"1.4"},{"open_issues":0,"language":"Lua","watchers":3,"pushed_at":"2010/12/30 21:15:20 -0800","url":"https://github.com/tekkub/MillerLite","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Adds a frame to the AH for fast crafting mat lookup","size":192,"private":false,"name":"MillerLite","owner":"tekkub","has_wiki":true,"created_at":"2010/12/17 19:58:28 -0800","forks":1,"homepage":"http://www.tekkub.net/"},{"open_issues":0,"language":"JavaScript","watchers":1,"pushed_at":"2010/12/24 16:32:40 -0800","url":"https://github.com/tekkub/doublecaps","has_issues":true,"has_downloads":true,"fork":false,"description":"I'm a terrible typist, true story","size":184,"private":false,"name":"doublecaps","owner":"tekkub","has_wiki":true,"created_at":"2010/12/24 16:26:36 -0800","forks":1,"homepage":""},{"open_issues":0,"language":"JavaScript","watchers":1,"pushed_at":"2011/07/17 14:18:13 -0700","url":"https://github.com/tekkub/rtd","has_issues":true,"has_downloads":true,"fork":false,"description":"Just a little RTD lightrail schedule for my bear","size":616,"private":false,"name":"rtd","owner":"tekkub","has_wiki":true,"created_at":"2011/06/05 00:34:36 -0700","forks":1,"master_branch":"gh-pages","homepage":"http://tekkub.net/rtd"},{"open_issues":0,"language":"Lua","watchers":2,"pushed_at":"2011/06/26 01:19:45 -0700","url":"https://github.com/tekkub/Velluminous","has_issues":true,"has_downloads":true,"fork":false,"description":"WoW Addon - Quickly enchant directly to vellum","size":96,"private":false,"name":"Velluminous","owner":"tekkub","has_wiki":true,"created_at":"2011/06/26 01:19:14 -0700","forks":1,"homepage":"http://tekkub.net/"},{"open_issues":0,"language":"JavaScript","watchers":5,"pushed_at":"2011/10/13 03:26:02 -0700","url":"https://github.com/tekkub/dotjs","has_issues":true,"has_downloads":true,"fork":false,"description":"My dotjs scripts","size":108,"private":false,"name":"dotjs","owner":"tekkub","has_wiki":true,"created_at":"2011/06/30 15:50:38 -0700","forks":2,"homepage":"http://defunkt.io/dotjs/"},{"open_issues":4,"language":"JavaScript","watchers":12,"pushed_at":"2011/09/19 06:35:53 -0700","url":"https://github.com/jacksonh/gitmarks","has_issues":true,"has_downloads":true,"fork":false,"description":"Add project bookmarking to github","size":188,"private":false,"name":"gitmarks","owner":"jacksonh","has_wiki":true,"created_at":"2011/07/14 07:34:05 -0700","forks":4,"homepage":""},{"open_issues":0,"language":"JavaScript","watchers":2,"pushed_at":"2011/09/16 14:14:20 -0700","url":"https://github.com/tekkub/gitmarks","has_issues":false,"has_downloads":true,"fork":true,"description":"Add project bookmarking to github","size":112,"private":false,"name":"gitmarks","owner":"tekkub","has_wiki":true,"created_at":"2011/07/16 01:07:57 -0700","forks":0,"homepage":""},{"open_issues":0,"language":"Ruby","watchers":6,"pushed_at":"2011/09/23 21:35:24 -0700","url":"https://github.com/tekkub/supportbee","has_issues":true,"has_downloads":true,"fork":false,"description":"A little ruby library for talking to supportbee's API","size":100,"private":false,"name":"supportbee","owner":"tekkub","has_wiki":true,"created_at":"2011/09/23 21:28:34 -0700","forks":1,"homepage":"supportbee.com"}]} \ No newline at end of file diff --git a/tests/test_commits.py b/tests/test_commits.py index 483846c..06f3b1c 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -21,6 +21,12 @@ def test_list(self): assert_equals(commits[0].id, '4de0834d58b37ef3020c49df43c95649217a2def') + def test_list_with_page(self): + commits = self.client.commits.list('JNRowe/jnrowe-misc', page=2) + assert_equals(len(commits), 35) + assert_equals(commits[0].id, + '1f5ad2c3206bafc4aca9e6ce50f5c605befdb3d6') + def test_list_with_branch(self): commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages') assert_equals(len(commits), 35) diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index a5ae228..80cc540 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -18,3 +18,9 @@ def test_list(self): pull_requests = self.client.pull_requests.list('ask/python-github2') assert_equals(len(pull_requests), 1) assert_equals(pull_requests[0].title, 'Pagination support for commits.') + + def test_list_with_page(self): + pull_requests = self.client.pull_requests.list('robbyrussell/oh-my-zsh', + page=2) + assert_equals(len(pull_requests), 52) + assert_equals(pull_requests[1].title, 'Added my own custom theme') diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 1d90bbc..d7f9c07 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -65,11 +65,21 @@ def test_list(self): assert_equals(len(repos), 48) assert_equals(repos[0].name, 'bfm') + def test_list_with_page(self): + repos = self.client.repos.list('tekkub', page=2) + assert_equals(len(repos), 37) + assert_equals(repos[0].name, 'OhSnap') + def test_watching(self): repos = self.client.repos.watching('JNRowe') assert_equals(len(repos), 90) assert_equals(repos[0].name, 'nerdtree') + def test_watching_with_page(self): + repos = self.client.repos.watching('tekkub', page=2) + assert_equals(len(repos), 39) + assert_equals(repos[0].name, 'Buffoon') + def test_contributors(self): contributors = self.client.repos.list_contributors('ask/python-github2') assert_equals(len(contributors), 29) From d13d7691d23828bb100254e84e6ae183da859331 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:52:01 +0000 Subject: [PATCH 351/454] Silly little PEP-8 fixes. --- github2/core.py | 14 ++++++++------ github2/issues.py | 4 ++-- github2/repositories.py | 6 +++--- github2/request.py | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/github2/core.py b/github2/core.py index 4e11ec7..fe0a122 100644 --- a/github2/core.py +++ b/github2/core.py @@ -100,8 +100,8 @@ def requires_auth(f): :param func f: Function to wrap :raises AuthError: If function called without an authenticated session """ - # When Python 2.4 support is dropped move straight to functools.wraps, don't - # pass go and don't collect $200. + # When Python 2.4 support is dropped move straight to functools.wraps, + # don't pass go and don't collect $200. def wrapper(self, *args, **kwargs): if not self.request.access_token and not self.request.api_token: raise AuthError("%r requires an authenticated session" @@ -161,7 +161,8 @@ def get_value(self, *args, **kwargs): # unicode keys are not accepted as kwargs by python, see: #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E # So we make a local dict with the same keys but as strings: - return datatype(**dict((str(k), v) for (k, v) in value.iteritems())) + return datatype(**dict((str(k), v) + for (k, v) in value.iteritems())) return value def get_values(self, *args, **kwargs): @@ -170,7 +171,8 @@ def get_values(self, *args, **kwargs): if datatype: # Same as above, unicode keys will blow up in **args, so we need to # create a new 'values' dict with string keys - return [datatype(**dict((str(k), v) for (k, v) in value.iteritems())) + return [datatype(**dict((str(k), v) + for (k, v) in value.iteritems())) for value in values] else: return values @@ -273,7 +275,7 @@ def __getitem__(self, key): responses to ``BaseData`` derived objects. """ warn("Subscript access on %r is deprecated, use object attributes" - % self.__class__.__name__, DeprecationWarning) + % self.__class__.__name__, DeprecationWarning) if not key in self._meta.keys(): raise KeyError(key) return getattr(self, key) @@ -284,7 +286,7 @@ def __setitem__(self, key, value): :see: ``BaseData.__getitem__`` """ warn("Subscript access on %r is deprecated, use object attributes" - % self.__class__.__name__, DeprecationWarning) + % self.__class__.__name__, DeprecationWarning) if not key in self._meta.keys(): raise KeyError(key) setattr(self, key, value) diff --git a/github2/issues.py b/github2/issues.py index 43111b0..0983b29 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -68,8 +68,8 @@ def list_by_label(self, project, label): :param str project: GitHub project :param str label: a string representing a label (e.g., ``bug``). """ - return self.get_values("list", project, "label", label, filter="issues", - datatype=Issue) + return self.get_values("list", project, "label", label, + filter="issues", datatype=Issue) def list_labels(self, project): """Get all labels for project. diff --git a/github2/repositories.py b/github2/repositories.py index 2724627..cbd9ad4 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -14,7 +14,7 @@ class Repository(BaseData): fork = Attribute("If True, this is a fork of another repository.") owner = Attribute("Username of the user owning this repository.") homepage = Attribute("Homepage for this project.") - master_branch = Attribute("Default branch, if set.") + master_branch = Attribute("Default branch, if set.") integration_branch = Attribute("Integration branch, if set.") open_issues = Attribute("List of open issues for this repository.") created_at = DateAttribute("Datetime the repository was created.") @@ -64,7 +64,6 @@ def pushable(self): return self.get_values("pushable", filter="repositories", datatype=Repository) - def list(self, user=None, page=1): """Return a list of all repositories for a user. @@ -189,7 +188,8 @@ def languages(self, project): :param str project: Github project """ - return self.get_values("show", project, "languages", filter="languages") + return self.get_values("show", project, "languages", + filter="languages") def tags(self, project): """Get tags for project diff --git a/github2/request.py b/github2/request.py index d350d55..aea7405 100644 --- a/github2/request.py +++ b/github2/request.py @@ -90,7 +90,7 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } - digicert_ha_cert = path.join(path.dirname(path.abspath(__file__ )), + digicert_ha_cert = path.join(path.dirname(path.abspath(__file__)), "DigiCert_High_Assurance_EV_Root_CA.crt") if proxy_host is None: self._http = httplib2.Http(cache=cache, ca_certs=digicert_ha_cert) From 162d8eade2ebc7acf0ba67accf4bfd2d9fab4487 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:52:45 +0000 Subject: [PATCH 352/454] Remove invalid cookies from test data. --- ...st,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa | 1 - ...JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 | 1 - ...ges,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 | 1 - ...misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 | 1 - ...t,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 | 1 - ...c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c | 1 - 6 files changed, 6 deletions(-) diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa b/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa index 7128271..b88099b 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,jnrowe-misc,master,a252487bd992cdfc8247b3c41d0cb9fa @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/jnrowe-misc/master?page=2 -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 22608 diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 index 56b04cb..b15f434 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,d0ce7ae70e44f7f396a93485a24b3423 @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 19508 diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 index 3493ec2..a55f85d 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,gh-pages,packages,dev-python.html,8622bc5e052f03439528cc9b7bf3fea2 @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 58 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/gh-pages/packages/dev-python.html -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 19508 diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 index eb2d090..d420f44 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,Makefile,75d9a1e41e76c3b924420d48b56dc756 @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master/Makefile -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 19364 diff --git a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 index 33b6332..e6d80d7 100644 --- a/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 +++ b/tests/data/github.com,api,v2,json,commits,list,JNRowe,misc-overlay,master,bfb4f990e48c87dab73d988a81318d69 @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/list/JNRowe/misc-overlay/master -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 23425 diff --git a/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c index 6340de4..e7cf6dc 100644 --- a/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c +++ b/tests/data/github.com,api,v2,json,commits,show,ask,python-github2,1c83cde9b5a7c396a01af1007fb7b88765b9ae45,a4f58221c8131c4e0975cd806f13d76c @@ -2,7 +2,6 @@ status: 200 x-ratelimit-remaining: 59 content-location: https://github.com/api/v2/json/commits/show/ask/python-github2/1c83cde9b5a7c396a01af1007fb7b88765b9ae45 -content-encoding: gzip -set-cookie: _gh_sess=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--ed7eadd474fd37850b68bd3c08a5c55ad0c3c833; path=/; expires=Fri, 01 Jan 2021 00:00:00 GMT; secure; HttpOnly connection: keep-alive content-length: 1578 From f5c447d35000c46e5daeadaf2052d7c6c1d4c5ee Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:53:09 +0000 Subject: [PATCH 353/454] Use UTF-8 encoding for test_unit. --- tests/test_unit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index 9d6650b..ccadb36 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -1,4 +1,4 @@ -# -*- coding: latin-1 -*- +# -*- coding: utf-8 -*- import _setup From f72a255efed7a3cf5fb21dfc5ba07e6371c785ad Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 14:00:12 +0000 Subject: [PATCH 354/454] Added github-plots to 'in the wild' document. --- doc/wild.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 6ee7751..0603a94 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -40,6 +40,13 @@ listed on this page. :PyPI page: :pypi:`ghmiles` +``github-plots`` +'''''''''''''''' + + Alternative plots from GitHub stats. + +:PyPI page: :pypi:`github-plots` + ``hubugs`` '''''''''' From c2e043c4d6026b76a524e144a8dc0aecd6b52b0f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 14:26:04 +0000 Subject: [PATCH 355/454] Added github-issues to 'in the wild' document. --- doc/wild.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 0603a94..5e20f7f 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -40,6 +40,14 @@ listed on this page. :PyPI page: :pypi:`ghmiles` +``github-issues`` +''''''''''''''''' + + github-issues allows you to create, close, show, list, and comment on + issues on your github project - that's it. + +:Git repository: https://github.com/kashifrazzaqui/github-issues + ``github-plots`` '''''''''''''''' From edb064d577763f4973e933c826b3c45a9addc477 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:43:30 +0000 Subject: [PATCH 356/454] Attempt to import using Python 3 stdlib names first. --- github2/issues.py | 10 ++++++---- github2/request.py | 17 ++++++++++++----- github2/users.py | 10 +++++++--- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index 43111b0..c5adb90 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,4 +1,7 @@ -import urllib +try: + from urllib.parse import quote_plus # For Python 3 +except ImportError: + from urllib import quote_plus from github2.core import (GithubCommand, BaseData, Attribute, DateAttribute, repr_string, requires_auth) @@ -47,9 +50,8 @@ def search(self, project, term, state="open"): :param str term: term to search issues for :param str state: can be either ``open`` or ``closed``. """ - return self.get_values("search", project, state, - urllib.quote_plus(term), filter="issues", - datatype=Issue) + return self.get_values("search", project, state, quote_plus(term), + filter="issues", datatype=Issue) def list(self, project, state="open"): """Get all issues for project with given state. diff --git a/github2/request.py b/github2/request.py index d350d55..d7d2769 100644 --- a/github2/request.py +++ b/github2/request.py @@ -3,18 +3,25 @@ import re import time import httplib2 -from httplib import responses +try: + from http.client import responses # For Python 3 +except ImportError: + from httplib import responses try: import json as simplejson # For Python 2.6 except ImportError: import simplejson from os import path -from urlparse import (urlsplit, urlunsplit) try: - from urlparse import parse_qs + # For Python 3 + from urllib.parse import (parse_qs, quote, urlencode, urlsplit, urlunsplit) except ImportError: - from cgi import parse_qs -from urllib import urlencode, quote + from urlparse import (urlsplit, urlunsplit) + try: + from urlparse import parse_qs + except ImportError: + from cgi import parse_qs + from urllib import urlencode, quote #: Hostname for API access diff --git a/github2/users.py b/github2/users.py index 3a40a8f..7dba3e6 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,6 +1,10 @@ +try: + from urllib.parse import quote_plus # For Python 3 +except ImportError: + from urllib import quote_plus + from github2.core import (BaseData, GithubCommand, DateAttribute, Attribute, enhanced_by_auth, requires_auth) -import urllib class User(BaseData): @@ -48,8 +52,8 @@ def search(self, query): :param str query: term to search for """ - return self.get_values("search", urllib.quote_plus(query), - filter="users", datatype=User) + return self.get_values("search", quote_plus(query), filter="users", + datatype=User) def search_by_email(self, query): """Search for users by email address From 9ea7e4ca60652b9db8d41eacee129d003a28d8dc Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:44:25 +0000 Subject: [PATCH 357/454] Use Python 2 & 3 compatible syntax for metaclass usage. --- github2/core.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/github2/core.py b/github2/core.py index 4e11ec7..a1137c0 100644 --- a/github2/core.py +++ b/github2/core.py @@ -263,9 +263,9 @@ def iterate(self): return result_cls -class BaseData(object): - __metaclass__ = BaseDataType - +# Ugly base class definition for Python 2 and 3 compatibility, where metaclass +# syntax is incompatible +class BaseData(BaseDataType('BaseData', (object, ), {})): def __getitem__(self, key): """Access objects's attribute using subscript notation From 32fe44d25fce6211f665568cfd318cef71d24899 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:45:25 +0000 Subject: [PATCH 358/454] =?UTF-8?q?No=20need=20for=20unicode=E2=86=92str?= =?UTF-8?q?=20kwargs=20hack=20in=20Python=203.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- github2/core.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/github2/core.py b/github2/core.py index a1137c0..36558a0 100644 --- a/github2/core.py +++ b/github2/core.py @@ -158,20 +158,26 @@ def get_value(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) value = self.make_request(*args, **kwargs) if datatype: - # unicode keys are not accepted as kwargs by python, see: - #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E - # So we make a local dict with the same keys but as strings: - return datatype(**dict((str(k), v) for (k, v) in value.iteritems())) + if not PY3K: + # unicode keys are not accepted as kwargs by python, see: + #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E + # So we make a local dict with the same keys but as strings: + return datatype(**dict((str(k), v) for (k, v) in value.items())) + else: + return datatype(**value) return value def get_values(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) values = self.make_request(*args, **kwargs) if datatype: - # Same as above, unicode keys will blow up in **args, so we need to - # create a new 'values' dict with string keys - return [datatype(**dict((str(k), v) for (k, v) in value.iteritems())) - for value in values] + if not PY3K: + # Same as above, unicode keys will blow up in **args, so we need to + # create a new 'values' dict with string keys + return [datatype(**dict((str(k), v) for (k, v) in value.items())) + for value in values] + else: + return [datatype(**value) for value in values] else: return values From dd588f8d28ef1eb931dbe55cdf752a1757499b7e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:47:11 +0000 Subject: [PATCH 359/454] Removed now unused build path hack in tests. --- tests/_setup.py | 6 ------ tests/test_charset_header.py | 2 -- tests/test_commits.py | 2 -- tests/test_date_handling.py | 2 -- tests/test_issues.py | 2 -- tests/test_organizations.py | 2 -- tests/test_pull_requests.py | 2 -- tests/test_regression.py | 2 -- tests/test_repositories.py | 2 -- tests/test_request.py | 2 -- tests/test_tz_aware_date_handling.py | 2 -- tests/test_unit.py | 2 -- tests/test_user.py | 2 -- tests/utils.py | 2 -- 14 files changed, 32 deletions(-) delete mode 100644 tests/_setup.py diff --git a/tests/_setup.py b/tests/_setup.py deleted file mode 100644 index c410274..0000000 --- a/tests/_setup.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys - -# Forcibly insert path for `setup.py build` output, so that we import from the -# ``2to3`` converted sources. This is an ugly hack, but it saves an enormous -# amount of grief in handling Python 2 and 3. -sys.path.insert(0, 'build/lib') diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py index 073e10c..b495bfc 100644 --- a/tests/test_charset_header.py +++ b/tests/test_charset_header.py @@ -1,5 +1,3 @@ -import _setup - from nose.tools import assert_equals from github2.request import charset_from_headers diff --git a/tests/test_commits.py b/tests/test_commits.py index 06f3b1c..b4eab13 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -1,5 +1,3 @@ -import _setup - from nose.tools import assert_equals import utils diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index 591bb2c..dcfea34 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import _setup - from datetime import datetime as dt from nose.tools import assert_equals diff --git a/tests/test_issues.py b/tests/test_issues.py index 83e2822..245b6b9 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -1,5 +1,3 @@ -import _setup - from nose.tools import assert_equals import utils diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 1425a07..f97b905 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -1,5 +1,3 @@ -import _setup - from nose.tools import (assert_equals, assert_true) import utils diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 80cc540..2a453b0 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -1,5 +1,3 @@ -import _setup - from nose.tools import assert_equals import utils diff --git a/tests/test_regression.py b/tests/test_regression.py index 5438888..a2b235c 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1,5 +1,3 @@ -import _setup - import httplib2 from nose.tools import assert_equals diff --git a/tests/test_repositories.py b/tests/test_repositories.py index d7f9c07..103045f 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -1,5 +1,3 @@ -import _setup - import datetime from nose.tools import assert_equals diff --git a/tests/test_request.py b/tests/test_request.py index a36086f..90849dc 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -1,5 +1,3 @@ -import _setup - import unittest from nose.tools import (assert_equals, assert_true) diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index c2e07c6..4e4f6eb 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import _setup - from datetime import datetime as dt from dateutil.tz import tzutc diff --git a/tests/test_unit.py b/tests/test_unit.py index 9d6650b..f4b3452 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -1,7 +1,5 @@ # -*- coding: latin-1 -*- -import _setup - import datetime import unittest diff --git a/tests/test_user.py b/tests/test_user.py index 5fe4c5b..3b0f8c3 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,5 +1,3 @@ -import _setup - import datetime from nose.tools import (assert_equals, assert_false, assert_true) diff --git a/tests/utils.py b/tests/utils.py index d05e258..0657cfa 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,5 +1,3 @@ -import _setup - import os import sys import unittest From 355c17255ced730d5644beab4bf4fd4b81023c80 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 13:54:14 +0000 Subject: [PATCH 360/454] Remove library rebuild hack in tox config. --- tox.ini | 2 -- 1 file changed, 2 deletions(-) diff --git a/tox.ini b/tox.ini index 7a01449..531bac9 100644 --- a/tox.ini +++ b/tox.ini @@ -7,8 +7,6 @@ deps = nose coverage commands = - rm -rf build - {envpython} setup.py build nosetests {posargs:-vv} tests [testenv:rst] deps = From e221921a8e90ffda59c74349b4fc39df3922eafd Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 15:52:06 +0000 Subject: [PATCH 361/454] httplib.responses fix for Python 2.4 compatibility. Thanks to James Elkin for reporting. --- github2/request.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index aea7405..a773f48 100644 --- a/github2/request.py +++ b/github2/request.py @@ -3,7 +3,12 @@ import re import time import httplib2 -from httplib import responses +try: + from httplib import responses +except ImportError: # For Python 2.4 + from BaseHTTPServer import BaseHTTPRequestHandler + responses = dict([(k, v[0]) + for k, v in BaseHTTPRequestHandler.responses.items()]) try: import json as simplejson # For Python 2.6 except ImportError: @@ -55,7 +60,7 @@ def __init__(self, message, content, code): self.message = message self.content = content self.code = code - if code: + if code and responses: self.code_reason = responses[code] else: self.code_reason = "" From d85343f8cc5d374b79191c27274a78b067f4ea19 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 14:11:42 +0000 Subject: [PATCH 362/454] Wrap print statement/function in scripts for compatibility. --- github2/bin/manage_collaborators.py | 23 ++++++++++++++++++++--- github2/bin/search_repos.py | 22 ++++++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index ca59df5..821e89d 100755 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -12,10 +12,27 @@ # BSD licensed import logging +import sys + from optparse import OptionParser + import github2.client +#: Running under Python 3 +PY3K = sys.version_info[0] == 3 and True or False + + +def print_(text): + """Python 2 & 3 compatible print function + + We support <2.6, so can't use __future__.print_function""" + if PY3K: + print(text) + else: + sys.stdout.write(text + '\n') + + def parse_commandline(): """Parse the comandline and return parsed options.""" @@ -72,7 +89,7 @@ def main(): if len(args) == 1: for repos in github.repos.list(options.account): fullreposname = github.project_for_user_repo(options.account, repos.name) - print "%s: %s" % (repos.name, ' '.join(github.repos.list_collaborators(fullreposname))) + print_("%s: %s" % (repos.name, ' '.join(github.repos.list_collaborators(fullreposname)))) elif len(args) == 2: command, collaborator = args for repos in github.repos.list(options.account): @@ -80,11 +97,11 @@ def main(): if collaborator in github.repos.list_collaborators(fullreposname): if command == 'remove': github.repos.remove_collaborator(repos.name, collaborator) - print "removed %r from %r" % (collaborator, repos.name) + print_("removed %r from %r" % (collaborator, repos.name)) else: if command == 'add': github.repos.add_collaborator(repos.name, collaborator) - print "added %r to %r" % (collaborator, repos.name) + print_("added %r to %r" % (collaborator, repos.name)) logging.shutdown() diff --git a/github2/bin/search_repos.py b/github2/bin/search_repos.py index 75b295c..c52be46 100755 --- a/github2/bin/search_repos.py +++ b/github2/bin/search_repos.py @@ -12,6 +12,20 @@ import github2.client +#: Running under Python 3 +PY3K = sys.version_info[0] == 3 and True or False + + +def print_(text): + """Python 2 & 3 compatible print function + + We support <2.6, so can't use __future__.print_function""" + if PY3K: + print(text) + else: + sys.stdout.write(text + '\n') + + def parse_commandline(): """Parse the comandline and return parsed options.""" @@ -47,14 +61,14 @@ def main(): repos = github.repos.search(term) if not repos: - print 'No repos found!' + print_('No repos found!') return_value = 255 else: for repo in repos: - print repo.project + print(repo.project) if repo.description: - print '\n'.join(wrap(repo.description, initial_indent=' ', - subsequent_indent=' ')) + print_('\n'.join(wrap(repo.description, initial_indent=' ', + subsequent_indent=' '))) logging.shutdown() return return_value From d9ba6658a4f6ecc10bf5cb5c73857dfe5914083b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 14:31:24 +0000 Subject: [PATCH 363/454] =?UTF-8?q?Unicode=E2=86=92str=20kwargs=20hack=20o?= =?UTF-8?q?nly=20needed=20for=20Python=20<2.7.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- github2/core.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/github2/core.py b/github2/core.py index 36558a0..7b47d12 100644 --- a/github2/core.py +++ b/github2/core.py @@ -9,6 +9,9 @@ #: Running under Python 3 PY3K = sys.version_info[0] == 3 and True or False +#: Running under Python 2.7, or newer +PY27 = sys.version_info[:2] == 3 and True or False + GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S %z" # We need to manually mangle the timezone for commit date formatting because it # uses -xx:xx format @@ -158,9 +161,9 @@ def get_value(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) value = self.make_request(*args, **kwargs) if datatype: - if not PY3K: - # unicode keys are not accepted as kwargs by python, see: - #http://mail-archives.apache.org/mod_mbox/qpid-dev/200609.mbox/%3C1159389941.4505.10.camel@localhost.localdomain%3E + if not PY27: + # unicode keys are not accepted as kwargs by python, until 2.7: + # http://bugs.python.org/issue2646 # So we make a local dict with the same keys but as strings: return datatype(**dict((str(k), v) for (k, v) in value.items())) else: @@ -171,7 +174,7 @@ def get_values(self, *args, **kwargs): datatype = kwargs.pop("datatype", None) values = self.make_request(*args, **kwargs) if datatype: - if not PY3K: + if not PY27: # Same as above, unicode keys will blow up in **args, so we need to # create a new 'values' dict with string keys return [datatype(**dict((str(k), v) for (k, v) in value.items())) From 6d5f350585e8f340fa4cbc6de4769fbe3d7d7aa5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 14:37:00 +0000 Subject: [PATCH 364/454] Use __name__ instead of func_name for compatibility with Python 3. --- github2/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index 7b47d12..61b6899 100644 --- a/github2/core.py +++ b/github2/core.py @@ -250,7 +250,7 @@ def __new__(cls, name, bases, attrs): for attr_name in attributes])) def _contribute_method(name, func): - func.func_name = name + func.__name__ = name attrs[name] = func def constructor(self, **kwargs): From c6afe2977483dfc598d11a322c9ba27bf5ad4e18 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 13 Dec 2011 20:04:38 +0000 Subject: [PATCH 365/454] No longer need to call 2to3 during build. --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 0abb26b..8613f1f 100755 --- a/setup.py +++ b/setup.py @@ -13,10 +13,8 @@ if sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') -extra = {} if sys.version_info >= (3,): install_requires.append('python-dateutil >= 2.0') - extra['use_2to3'] = True else: install_requires.append('python-dateutil < 2.0') @@ -64,5 +62,4 @@ "Topic :: Software Development", "Topic :: Software Development :: Libraries", ], - **extra ) From ab46a17eb0e4c6b49fe41aa60b232bd95c869e03 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 15 Dec 2011 20:39:02 +0000 Subject: [PATCH 366/454] Activat the Sphinx coverage extension. --- doc/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index 2f2b3bf..e54a0cc 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -28,7 +28,8 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ["sphinx.ext.%s" % ext - for ext in ["autodoc", "todo", "intersphinx", "viewcode"]] + \ + for ext in ["autodoc", "todo", "intersphinx", "viewcode", + "coverage"]] + \ ["sphinxcontrib.%s" % ext for ext in ["cheeseshop", ]] # Add any paths that contain templates here, relative to this directory. From 057e02b886cc3700d7e76ea1a88d0b73797deac4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 15 Dec 2011 20:59:24 +0000 Subject: [PATCH 367/454] Added bugwarrior to 'in the wild' document. --- doc/wild.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 5e20f7f..968358f 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -24,6 +24,14 @@ listed on this page. :PyPI page: :pypi:`bitbucket2github` +``bugwarrior`` +'''''''''''''' + + Pull tickets from github, bitbucket, and trac into `taskwarrior + `__ + +:PyPI page: :pypi:`bugwarrior` + ``forkfeed`` '''''''''''' From 3f476e6fa9f01d827afdb774c45f532c5aeea476 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:39:01 +0000 Subject: [PATCH 368/454] Fixed rate limiting example in problems doc. --- doc/problems.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/problems.rst b/doc/problems.rst index 90021af..5fabddf 100644 --- a/doc/problems.rst +++ b/doc/problems.rst @@ -35,14 +35,14 @@ response from GitHub, here the user data of ``JNRowe``. Rate limiting ''''''''''''' -If rate limiting is enabled, with the ``requests_per_second`` when creating a -:class:`~github2.client.Github` object, then you'll see a ``WARNING`` level -message when a request has been delayed. +If rate limiting is enabled, with the ``requests_per_second`` parameter when +creating a :class:`~github2.client.Github` object, then you'll see a ``WARNING`` +level message when a request has been delayed. - >>> github = Github(requests_per_second=0.2, debug=True) + >>> github = Github(requests_per_second=0.2) >>> user = github.users.show("JNRowe") >>> user = github.users.show("JNRowe") - delaying API call 4.99773 + WARNING:github2.request:delaying API call 4.997032 second(s) Here we have defined a rate limit of one call every five seconds, and doing so has imposed an almost 5 second delay before completing the second request. From 62d95cca4eacfbd089796aaca23397903b14fc73 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:39:43 +0000 Subject: [PATCH 369/454] Simplify testing of Python version. Also fixes an unnoticed stupid copy/paste bug. --- github2/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/core.py b/github2/core.py index 3308044..e2860cb 100644 --- a/github2/core.py +++ b/github2/core.py @@ -7,10 +7,10 @@ #: Running under Python 3 -PY3K = sys.version_info[0] == 3 and True or False +PY3K = sys.version_info[0] == 3 #: Running under Python 2.7, or newer -PY27 = sys.version_info[:2] == 3 and True or False +PY27 = sys.version_info[:2] >= (2, 7) GITHUB_DATE_FORMAT = "%Y/%m/%d %H:%M:%S %z" # We need to manually mangle the timezone for commit date formatting because it From 4b5edf4e349d7123d246c478d301023b1f38c9e6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:40:17 +0000 Subject: [PATCH 370/454] Don't repeatably call str.upper() when testing method name. --- github2/core.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/core.py b/github2/core.py index e2860cb..cb75f9b 100644 --- a/github2/core.py +++ b/github2/core.py @@ -141,14 +141,14 @@ def make_request(self, command, *args, **kwargs): page = kwargs.pop("page", 1) if page and not page == 1: post_data["page"] = page - method = kwargs.get("method", "GET") - if method.upper() == "POST" or method.upper() == "GET" and post_data: + method = kwargs.get("method", "GET").upper() + if method == "POST" or method == "GET" and post_data: response = self.request.post(self.domain, command, *args, **post_data) - elif method.upper() == "PUT": + elif method == "PUT": response = self.request.put(self.domain, command, *args, **post_data) - elif method.upper() == "DELETE": + elif method == "DELETE": response = self.request.delete(self.domain, command, *args, **post_data) else: From 08480073f3e80655a7b97a6367b25389095aea14 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:41:18 +0000 Subject: [PATCH 371/454] Correct docstring for teams.repositories. --- github2/teams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/teams.py b/github2/teams.py index 859a40e..bd8c783 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -33,7 +33,7 @@ def members(self, team_id): datatype=User) def repositories(self, team_id): - """Get list of all team members + """Get list of all team repositories :param int team_id: team to get information for """ From 99a34823a34b63c55ece2ae95daf30145bdf4d54 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:42:33 +0000 Subject: [PATCH 372/454] Added requires_auth decorator to team modifying methods. --- github2/teams.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/github2/teams.py b/github2/teams.py index bd8c783..1c5feda 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import BaseData, GithubCommand, Attribute, requires_auth from github2.repositories import Repository from github2.users import User @@ -40,6 +40,7 @@ def repositories(self, team_id): return self.get_values(str(team_id), "repositories", filter="repositories", datatype=Repository) + @requires_auth def add_project(self, team_id, project): """Add a project to a team @@ -52,6 +53,7 @@ def add_project(self, team_id, project): post_data={'name': project}, filter="repositories", datatype=Repository) + @requires_auth def remove_project(self, team_id, project): """Remove a project to a team From 5a6ff55d7675cbb3e9df6f18875caf848b65fbf7 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 02:44:09 +0000 Subject: [PATCH 373/454] Very minor simplification of encode_authentication_data. --- github2/request.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/github2/request.py b/github2/request.py index d062a97..1b473fe 100644 --- a/github2/request.py +++ b/github2/request.py @@ -113,13 +113,12 @@ def __init__(self, username=None, api_token=None, url_prefix=None, ca_certs=digicert_ha_cert) def encode_authentication_data(self, extra_post_data): + post_data = {} if self.access_token: - post_data = {"access_token": self.access_token} + post_data["access_token"] = self.access_token elif self.username and self.api_token: - post_data = {"login": self.username, - "token": self.api_token} - else: - post_data = {} + post_data["login"] = self.username + post_data["token"] = self.api_token post_data.update(extra_post_data) return urlencode(post_data) From b0c12a731b59155c682aff644c9b3f64f36b3ab1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 04:41:13 +0000 Subject: [PATCH 374/454] Support the use of repeated keys in query strings. --- github2/request.py | 16 +++++--- tests/test_request.py | 85 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 21 deletions(-) diff --git a/github2/request.py b/github2/request.py index d062a97..628aff5 100644 --- a/github2/request.py +++ b/github2/request.py @@ -113,14 +113,18 @@ def __init__(self, username=None, api_token=None, url_prefix=None, ca_certs=digicert_ha_cert) def encode_authentication_data(self, extra_post_data): + post_data = [] if self.access_token: - post_data = {"access_token": self.access_token} + post_data.append(("access_token", self.access_token)) elif self.username and self.api_token: - post_data = {"login": self.username, - "token": self.api_token} - else: - post_data = {} - post_data.update(extra_post_data) + post_data.append(("login", self.username)) + post_data.append(("token", self.api_token)) + for key, value in extra_post_data.items(): + if isinstance(value, list): + for elem in value: + post_data.append((key, elem)) + else: + post_data.append((key, value)) return urlencode(post_data) def get(self, *path_components): diff --git a/tests/test_request.py b/tests/test_request.py index 90849dc..031bc4f 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -1,31 +1,86 @@ import unittest -from nose.tools import (assert_equals, assert_true) +try: + from urllib.parse import parse_qs # For Python 3 +except ImportError: + try: + from urlparse import parse_qs + except ImportError: # For Python <2.6 + from cgi import parse_qs + +try: + from nose.tools import (assert_dict_contains_subset, assert_dict_equal) +except ImportError: # for Python <2.7 + import unittest2 + + _binding = unittest2.TestCase('run') + assert_dict_contains_subset = _binding.assertDictContainsSubset + assert_dict_equal = _binding.assertDictEqual + from github2 import request +def assert_params(first, second): + assert_dict_equal(first, parse_qs(second)) + + +def assert_params_contain(first, second): + assert_dict_contains_subset(first, parse_qs(second)) + + class TestAuthEncode(unittest.TestCase): """Test processing of authentication data""" def setUp(self): self.r = request.GithubRequest() def test_unauthenticated(self): - assert_equals('', self.r.encode_authentication_data({})) + assert_params({}, self.r.encode_authentication_data({})) def test_access_token(self): - self.r.access_token = 'hex string' - assert_equals('access_token=hex+string', - self.r.encode_authentication_data({})) - assert_true('access_token=hex+string' in - self.r.encode_authentication_data({'key': 'value'})) - self.r.access_token = None + try: + self.r.access_token = 'hex string' + assert_params({'access_token': ['hex string', ]}, + self.r.encode_authentication_data({})) + finally: + self.r.access_token = None def test_user_token(self): - self.r.username = 'user' - self.r.api_token = 'hex string' - assert_equals('login=user&token=hex+string', - self.r.encode_authentication_data({})) - assert_true('login=user&token=hex+string' in - self.r.encode_authentication_data({'key': 'value'})) - self.r.username = self.r.api_token = None + try: + self.r.username = 'user' + self.r.api_token = 'hex string' + token_params = {'login': ['user', ], 'token': ['hex string', ]} + assert_params(token_params, self.r.encode_authentication_data({})) + finally: + self.r.username = self.r.api_token = None + + +class TestParameterEncoding(unittest.TestCase): + def setUp(self): + self.r = request.GithubRequest() + self.params = { + 'key1': 'value1', + 'key2': 'value2', + } + + def test_no_parameters(self): + assert_params({}, self.r.encode_authentication_data({})) + + def test_parameters(self): + assert_params({'key1': ['value1', ], 'key2': ['value2', ]}, + self.r.encode_authentication_data(self.params)) + + def test_parameters_with_auth(self): + try: + self.r.username = 'user' + self.r.api_token = 'hex string' + assert_params({'key2': ['value2', ], 'login': ['user', ], + 'token': ['hex string', ], 'key1': ['value1', ]}, + self.r.encode_authentication_data(self.params)) + finally: + self.r.username = '' + self.r.api_token = '' + + def test_multivalue_parameters(self): + multivals = {'key': ['value1', 'value2']} + assert_params(multivals, self.r.encode_authentication_data(multivals)) From 05f4e79c8a48584b33883368a648dc40d67a126d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 19 Dec 2011 20:54:11 +0000 Subject: [PATCH 375/454] Added method to add a new team. Thanks to Clint Savage, refs #69. --- github2/organizations.py | 18 +++++++++++++++++- ...-org,teams,6869b96ae6fbaa7511d92aa73803898b | 14 ++++++++++++++ ..._token=xxx,00192d3a6cc4fc297b5a9cb0742c3663 | 14 ++++++++++++++ tests/test_organizations.py | 17 +++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,organizations,JNRowe-test-org,teams,6869b96ae6fbaa7511d92aa73803898b create mode 100644 tests/data/github.com,api,v2,json,teams,121678,repositories,access_token=xxx,00192d3a6cc4fc297b5a9cb0742c3663 diff --git a/github2/organizations.py b/github2/organizations.py index 25df990..0c8aa00 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -1,4 +1,5 @@ -from github2.core import BaseData, GithubCommand, Attribute, DateAttribute +from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, + requires_auth) from github2.repositories import Repository from github2.teams import Team from github2.users import User @@ -81,3 +82,18 @@ def teams(self, organization): """ return self.get_values(organization, 'teams', filter="teams", datatype=Team) + + @requires_auth + def add_team(self, organization, name, permission='pull', projects=None): + """Add a team to an organization + + :param str organization: organization to add team to + :param str team: name of team to add + :param str permission: permissions for team(push, pull or admin) + :param list projects: optional GitHub projects for this team + """ + team_data = {'team[name]': name, 'team[permission]': permission} + if projects: + team_data['team[repo_names][]'] = projects + return self.get_value(organization, 'teams', post_data=team_data, + method='POST', filter='team', datatype=Team) diff --git a/tests/data/github.com,api,v2,json,organizations,JNRowe-test-org,teams,6869b96ae6fbaa7511d92aa73803898b b/tests/data/github.com,api,v2,json,organizations,JNRowe-test-org,teams,6869b96ae6fbaa7511d92aa73803898b new file mode 100644 index 0000000..969ee88 --- /dev/null +++ b/tests/data/github.com,api,v2,json,organizations,JNRowe-test-org,teams,6869b96ae6fbaa7511d92aa73803898b @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 60 +content-location: https://github.com/api/v2/json/organizations/JNRowe-test-org/teams +x-runtime: 20ms +content-length: 61 +server: nginx/1.0.4 +connection: keep-alive +x-ratelimit-limit: 58 +etag: "0ea8a446a00b4d7894676a34bd8d501f" +cache-control: private, max-age=0, must-revalidate +date: Mon, 19 Dec 2011 20:50:41 GMT +content-type: application/json; charset=utf-8 + +{"team":{"name":"team_pull","id":121678,"permission":"pull"}} diff --git a/tests/data/github.com,api,v2,json,teams,121678,repositories,access_token=xxx,00192d3a6cc4fc297b5a9cb0742c3663 b/tests/data/github.com,api,v2,json,teams,121678,repositories,access_token=xxx,00192d3a6cc4fc297b5a9cb0742c3663 new file mode 100644 index 0000000..c83a9c7 --- /dev/null +++ b/tests/data/github.com,api,v2,json,teams,121678,repositories,access_token=xxx,00192d3a6cc4fc297b5a9cb0742c3663 @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 60 +content-location: https://github.com/api/v2/json/organizations/JNRowe-test-org/teams +x-runtime: 20ms +content-length: 676 +server: nginx/1.0.4 +connection: keep-alive +x-ratelimit-limit: 58 +etag: "397a2fcea970a6391b74eabcb62ed265" +cache-control: private, max-age=0, must-revalidate +date: Thu, 19 Dec 2011 20:50:41 GMT +content-type: application/json; charset=utf-8 + +{"repositories":[{"open_issues":0,"description":"","watchers":1,"forks":1,"has_issues":true,"has_downloads":true,"fork":false,"created_at":"2011/12/18 17:36:08 -0800","homepage":"","size":0,"private":false,"name":"test1","owner":"JNRowe-test-org","has_wiki":true,"url":"https://github.com/JNRowe-test-org/test1","organization":"JNRowe-test-org"},{"open_issues":0,"description":"","watchers":1,"forks":1,"has_issues":true,"has_downloads":true,"fork":false,"created_at":"2011/12/18 17:36:24 -0800","homepage":"","size":0,"private":false,"name":"test2","owner":"JNRowe-test-org","has_wiki":true,"url":"https://github.com/JNRowe-test-org/test2","organization":"JNRowe-test-org"}]} diff --git a/tests/test_organizations.py b/tests/test_organizations.py index f97b905..2f8d43f 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -29,3 +29,20 @@ def test_public_members(self): members = self.client.organizations.public_members('github') assert_equals(len(members), 35) assert_equals(members[2].name, 'Ben Burkert') + + +class OrganizationsEdits(utils.HttpMockAuthenticatedTestCase): + def test_add_team(self): + team = self.client.organizations.add_team('JNRowe-test-org', + 'test_pull', 'pull') + assert_equals(team.name, 'team_pull') + assert_equals(team.permission, 'pull') + + def test_add_team_with_repos(self): + projects = ['JNRowe-test-org/test1', 'JNRowe-test-org/test2'] + team = self.client.organizations.add_team('JNRowe-test-org', + 'test_push', 'push', projects) + + team_repos = self.client.teams.repositories(team.id) + assert_equals(['/'.join([x.organization, x.name]) for x in team_repos], + projects) From b77e3c91bf73b9dec9d69b43d8643f1490dd11b5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 19 Dec 2011 20:55:58 +0000 Subject: [PATCH 376/454] Added method to add a new team member. Thanks to Clint Savage, refs #69. --- github2/teams.py | 13 ++++++++++++- ...121990,members,ef66ad4c5f8c1b21dc9bc8c54c9ec91e | 14 ++++++++++++++ tests/test_teams.py | 9 +++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/data/github.com,api,v2,json,teams,121990,members,ef66ad4c5f8c1b21dc9bc8c54c9ec91e create mode 100644 tests/test_teams.py diff --git a/github2/teams.py b/github2/teams.py index 859a40e..175f1f6 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -1,4 +1,4 @@ -from github2.core import BaseData, GithubCommand, Attribute +from github2.core import BaseData, GithubCommand, Attribute, requires_auth from github2.repositories import Repository from github2.users import User @@ -32,6 +32,17 @@ def members(self, team_id): return self.get_values(str(team_id), "members", filter="users", datatype=User) + @requires_auth + def add_member(self, team_id, username): + """Add a new member to a team + + :param int team_id: team to add new member to + :param str username: GitHub username to add to team + """ + return self.get_values(str(team_id), 'members', method='POST', + post_data={'name': username}, filter='users', + datatype=User) + def repositories(self, team_id): """Get list of all team members diff --git a/tests/data/github.com,api,v2,json,teams,121990,members,ef66ad4c5f8c1b21dc9bc8c54c9ec91e b/tests/data/github.com,api,v2,json,teams,121990,members,ef66ad4c5f8c1b21dc9bc8c54c9ec91e new file mode 100644 index 0000000..10bd256 --- /dev/null +++ b/tests/data/github.com,api,v2,json,teams,121990,members,ef66ad4c5f8c1b21dc9bc8c54c9ec91e @@ -0,0 +1,14 @@ +status: 200 +x-ratelimit-remaining: 60 +content-location: https://github.com/api/v2/json/teams/121990/members +x-runtime: 20ms +content-length: 202 +server: nginx/1.0.4 +connection: keep-alive +x-ratelimit-limit: 58 +etag: "397a2fcea970a6391b74eabcb62ed265" +cache-control: private, max-age=0, must-revalidate +date: Thu, 19 Dec 2011 20:55:34 GMT +content-type: application/json; charset=utf-8 + +{"users":[{"name":"James Rowe","gravatar_id":"e40de1eb6e8a74cb96b3f07f3994f155","location":"Cambridge, UK","blog":"http://jnrowe.github.com/","type":"User","login":"JNRowe","email":"jnrowe@gmail.com"}]} diff --git a/tests/test_teams.py b/tests/test_teams.py new file mode 100644 index 0000000..85689aa --- /dev/null +++ b/tests/test_teams.py @@ -0,0 +1,9 @@ +from nose.tools import assert_equals + +import utils + + +class TeamEdits(utils.HttpMockAuthenticatedTestCase): + def test_add_member(self): + users = self.client.teams.add_member(121990, 'JNRowe') + assert_equals(users[0].login, 'JNRowe') From de1f059f7ff5b5a1f202c68441d748dd9e39baab Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 05:51:50 +0000 Subject: [PATCH 377/454] Use system certificates database, if possible. Closes #68. --- doc/api/request.rst | 2 ++ github2/request.py | 28 ++++++++++++++++++++++++---- tests/utils.py | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/doc/api/request.rst b/doc/api/request.rst index 395f39f..f58fd0a 100644 --- a/doc/api/request.rst +++ b/doc/api/request.rst @@ -10,6 +10,8 @@ Requests .. autodata:: GITHUB_URL +.. autodata:: SYSTEM_CERTS + .. autoexception:: GithubError .. autoclass:: GithubRequest diff --git a/github2/request.py b/github2/request.py index 1b473fe..abe3a11 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,8 +1,9 @@ import datetime import logging import re +import sys import time -import httplib2 + try: # For Python 3 from http.client import responses @@ -28,6 +29,8 @@ from cgi import parse_qs from urllib import urlencode, quote +import httplib2 + #: Hostname for API access GITHUB_URL = "https://github.com" @@ -35,6 +38,24 @@ #: Logger for requests module LOGGER = logging.getLogger('github2.request') +#: Whether github2 is using the system's certificates for SSL connections +SYSTEM_CERTS = not httplib2.CA_CERTS.startswith(path.dirname(httplib2.__file__)) +if not SYSTEM_CERTS and sys.platform.startswith('linux'): + for cert_file in ['/etc/ssl/certs/ca-certificates.crt', + '/etc/pki/tls/certs/ca-bundle.crt']: + if path.exists(cert_file): + httplib2.CA_CERTS = cert_file + SYSTEM_CERTS = True + break +elif not SYSTEM_CERTS and sys.platform.startswith('freebsd'): + if path.exists('/usr/local/share/certs/ca-root-nss.crt'): + httplib2.CA_CERTS = '/usr/local/share/certs/ca-root-nss.crt' + SYSTEM_CERTS = True +if SYSTEM_CERTS: + LOGGER.info('Using system certificates in %r', httplib2.CA_CERTS) +else: + LOGGER.warning('Using bundled certificates for HTTPS connections') + def charset_from_headers(headers): """Parse charset from headers @@ -105,12 +126,11 @@ def __init__(self, username=None, api_token=None, url_prefix=None, digicert_ha_cert = path.join(path.dirname(path.abspath(__file__)), "DigiCert_High_Assurance_EV_Root_CA.crt") if proxy_host is None: - self._http = httplib2.Http(cache=cache, ca_certs=digicert_ha_cert) + self._http = httplib2.Http(cache=cache) else: proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, proxy_host, proxy_port) - self._http = httplib2.Http(proxy_info=proxy_info, cache=cache, - ca_certs=digicert_ha_cert) + self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) def encode_authentication_data(self, extra_post_data): post_data = {} diff --git a/tests/utils.py b/tests/utils.py index 0657cfa..a1c32b4 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -25,7 +25,7 @@ class HttpMock(object): Implementation tests should never span network boundaries """ - def __init__(self, cache=None, timeout=None, proxy_info=None, ca_certs=None): + def __init__(self, cache=None, timeout=None, proxy_info=None): """Create a mock httplib.Http object .. attribute: called_with From d32273af8b67a671bab242c9808a309f07398108 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 20 Dec 2011 20:36:26 +0000 Subject: [PATCH 378/454] Fix for users unable to use system certificates. Regression that snuck in de1f059f7ff5b5a1f202c68441d748dd9e39baab. --- github2/request.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/github2/request.py b/github2/request.py index 3650265..21d73f0 100644 --- a/github2/request.py +++ b/github2/request.py @@ -123,14 +123,15 @@ def __init__(self, username=None, api_token=None, url_prefix=None, "api_version": self.api_version, "api_format": self.api_format, } - digicert_ha_cert = path.join(path.dirname(path.abspath(__file__)), - "DigiCert_High_Assurance_EV_Root_CA.crt") if proxy_host is None: self._http = httplib2.Http(cache=cache) else: proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, proxy_host, proxy_port) self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) + if not SYSTEM_CERTS: + self._http.ca_certs = path.join(path.dirname(path.abspath(__file__)), + "DigiCert_High_Assurance_EV_Root_CA.crt") def encode_authentication_data(self, extra_post_data): post_data = [] From ec5412d5ef15f841888f71676aeea2e1cb7cc206 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 21 Dec 2011 08:03:01 +0000 Subject: [PATCH 379/454] Added a link for finding the full history to NEWS. --- NEWS.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index cebb8ac..2d98764 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,6 +1,11 @@ User-visible changes ==================== +This file lists only the most important changes that may be visible to users, +look at the `git repository`_ for the full project history. + +.. _git repository: https://github.com/ask/python-github2/ + .. contents:: 0.5.2 - 2011-09-02 From 98a96475f060b0a66fb5aa06258b1c8ce4d3c959 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 21 Dec 2011 08:09:26 +0000 Subject: [PATCH 380/454] Bumped version to 0.6.0. --- NEWS.rst | 6 ++++++ README.rst | 2 +- github2/__init__.py | 7 +++++-- github2/_version.py | 9 +++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 github2/_version.py diff --git a/NEWS.rst b/NEWS.rst index 2d98764..54c693b 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -8,6 +8,12 @@ look at the `git repository`_ for the full project history. .. contents:: +0.6.0 - 2011-12-21 +------------------ + +* Now uses system certificates for SSL validation where possible +* Python 3 is supported directly, without a separate ``2to3`` build step + 0.5.2 - 2011-09-02 ------------------ diff --git a/README.rst b/README.rst index 0746644..804dc81 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.5.2 +:Version: 0.6.0 This is a Python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/__init__.py b/github2/__init__.py index ce95e04..30d323e 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,7 +1,10 @@ "Github API v2 library for Python" -VERSION = (0, 5, 2) + +from github2 import _version + +VERSION = _version.tuple __author__ = "Ask Solem" __contact__ = "askh@opera.com" __homepage__ = "http://github.com/ask/python-github2" -__version__ = ".".join(map(str, VERSION)) +__version__ = _version.dotted diff --git a/github2/_version.py b/github2/_version.py new file mode 100644 index 0000000..bf9f4df --- /dev/null +++ b/github2/_version.py @@ -0,0 +1,9 @@ +# This is github2 version 0.6.0 (2011-12-21) +# pylint: disable=C0103, C0111, C0121, W0622 + +dotted = "0.6.0" +libtool = "6:20" +hex = 0x000600 +date = "2011-12-21" +tuple = (0, 6, 0) +web = "github/0.6.0" From 57450e7473303f28d9030e8897ed61f778977883 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 21 Dec 2011 11:56:48 +0000 Subject: [PATCH 381/454] Minor rewording in bugs doc. --- doc/bugs.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/bugs.rst b/doc/bugs.rst index 2226397..6105987 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -24,7 +24,7 @@ or a deficiency in the API. You can check which URLs your code is requesting by enabling :data:`~logging.DEBUG` level output in your logger, see the -:mod:`python:logging` for more information. +:mod:`python:logging` documentation for details. If the bug you've found is outside the reach of this project an issue should be opened in GitHub's `API support forum`_. It doesn't hurt to `report an issue`_ @@ -45,10 +45,10 @@ A good bug report will have the following: * A minimal test-case to reproduce the error * A list of solutions you've already tried -Simon Tatham has an excellent essay titled `How to Report Bugs Effectively`_, +Simon Tatham wrote aa fantastic essay titled `How to Report Bugs Effectively`_, with some excellent tips on filing good bug reports. -.. [#] The content of :data:`github2.__version__` if you're using an official +.. [#] The value of :data:`github2.__version__` if you're using an official release, or the output of :command:`git describe` if you're using the git repository directly. From baa6a04ac6d5d1c207796a8f9eaa0b8c4fbe9332 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 21 Dec 2011 11:57:17 +0000 Subject: [PATCH 382/454] Fixed broken Python 2.4 handling in github2.requests. --- github2/request.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/github2/request.py b/github2/request.py index 21d73f0..d3c25a2 100644 --- a/github2/request.py +++ b/github2/request.py @@ -8,11 +8,12 @@ # For Python 3 from http.client import responses except ImportError: # For Python 2.5-2.7 - from httplib import responses -except ImportError: # For Python 2.4 - from BaseHTTPServer import BaseHTTPRequestHandler - responses = dict([(k, v[0]) - for k, v in BaseHTTPRequestHandler.responses.items()]) + try: + from httplib import responses + except ImportError: # For Python 2.4 + from BaseHTTPServer import BaseHTTPRequestHandler + responses = dict([(k, v[0]) + for k, v in BaseHTTPRequestHandler.responses.items()]) try: import json as simplejson # For Python 2.6+ except ImportError: From 4c2b325f387794be21a6fb30113fcb89b9ddd413 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Jan 2012 12:19:30 +0000 Subject: [PATCH 383/454] Skip unrecognised HTTP status lookups in HttpError. Closes #71, thanks to Ben Olive for the report. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index d3c25a2..297a4f1 100644 --- a/github2/request.py +++ b/github2/request.py @@ -89,7 +89,7 @@ def __init__(self, message, content, code): self.message = message self.content = content self.code = code - if code and responses: + if code in responses: self.code_reason = responses[code] else: self.code_reason = "" From dcd608886996528f6b75a0f80324b9807f08847d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Jan 2012 12:20:06 +0000 Subject: [PATCH 384/454] Converted remaining warnings users to logging. --- github2/core.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/github2/core.py b/github2/core.py index cb75f9b..b15161f 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,11 +1,13 @@ +import logging import sys -from warnings import warn - from datetime import datetime from dateutil import (parser, tz) +#: Logger for core module +LOGGER = logging.getLogger('github2.core') + #: Running under Python 3 PY3K = sys.version_info[0] == 3 @@ -281,8 +283,9 @@ def __getitem__(self, key): This is here purely to maintain compatibility when switching ``dict`` responses to ``BaseData`` derived objects. """ - warn("Subscript access on %r is deprecated, use object attributes" - % self.__class__.__name__, DeprecationWarning) + LOGGER.warning("Subscript access on %r is deprecated, use object " + "attributes" % self.__class__.__name__, + DeprecationWarning) if not key in self._meta.keys(): raise KeyError(key) return getattr(self, key) @@ -292,8 +295,9 @@ def __setitem__(self, key, value): :see: ``BaseData.__getitem__`` """ - warn("Subscript access on %r is deprecated, use object attributes" - % self.__class__.__name__, DeprecationWarning) + LOGGER.warning("Subscript access on %r is deprecated, use object " + "attributes" % self.__class__.__name__, + DeprecationWarning) if not key in self._meta.keys(): raise KeyError(key) setattr(self, key, value) From e3a239a025e992932a2a5d21122f7159ae95e2e0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Jan 2012 12:26:00 +0000 Subject: [PATCH 385/454] Fixed silly DST straddling delay bug. Incredibly unlikely to occur, but annoying as hell if it did ;) --- github2/request.py | 4 ++-- tests/test_unit.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/request.py b/github2/request.py index 297a4f1..3b6ba47 100644 --- a/github2/request.py +++ b/github2/request.py @@ -170,7 +170,7 @@ def delete(self, *path_components, **extra_post_data): def make_request(self, path, extra_post_data=None, method="GET"): if self.delay: - since_last = (datetime.datetime.now() - self.last_request) + since_last = (datetime.datetime.utcnow() - self.last_request) since_last_in_seconds = (since_last.days * 24 * 60 * 60) + since_last.seconds + (since_last.microseconds/1000000.0) if since_last_in_seconds < self.delay: duration = self.delay - since_last_in_seconds @@ -182,7 +182,7 @@ def make_request(self, path, extra_post_data=None, method="GET"): result = self.raw_request(url, extra_post_data, method=method) if self.delay: - self.last_request = datetime.datetime.now() + self.last_request = datetime.datetime.utcnow() return result def raw_request(self, url, extra_post_data, method="GET"): diff --git a/tests/test_unit.py b/tests/test_unit.py index b90a0bc..c72f3ef 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -28,9 +28,9 @@ def test_delays(self): """Test call delay is at least one second""" client = Github(requests_per_second=.5) client.users.show('defunkt') - start = datetime.datetime.now() + start = datetime.datetime.utcnow() client.users.show('mojombo') - end = datetime.datetime.now() + end = datetime.datetime.utcnow() delta = end - start delta_seconds = delta.days * 24 * 60 * 60 + delta.seconds From 61b572e516b2079f1eac12c9732b47bd71b0fc5c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Jan 2012 12:32:34 +0000 Subject: [PATCH 386/454] Scrubbed unused imports in tests. --- tests/test_repositories.py | 1 - tests/test_user.py | 2 -- 2 files changed, 3 deletions(-) diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 001fe61..b55f4d5 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -2,7 +2,6 @@ from nose.tools import assert_equals -from github2.client import Github import utils diff --git a/tests/test_user.py b/tests/test_user.py index 3b0f8c3..d61794b 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -2,8 +2,6 @@ from nose.tools import (assert_equals, assert_false, assert_true) -from github2.client import Github - import utils From 6a4380053566e56d1dfd352a1f6de72f13ba17e5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Jan 2012 12:35:58 +0000 Subject: [PATCH 387/454] Bump copyright years. --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index e54a0cc..1fb7895 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -46,7 +46,7 @@ # General information about the project. project = u'github2' -copyright = u'2011, Ask Solem' +copyright = u'2009-2012, Ask Solem' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From 405dbed3397a856ada37840148f6eee25d757a01 Mon Sep 17 00:00:00 2001 From: modocache Date: Thu, 19 Jan 2012 00:19:56 +0900 Subject: [PATCH 388/454] Added support for Github Enterprise hosts. Allows users to pass a parameter specifying the host to send requests to. Closes #72. --- AUTHORS | 1 + doc/api/client.rst | 8 ++++++++ github2/client.py | 5 +++-- github2/request.py | 10 +++++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 66d4ec9..99f5070 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,3 +28,4 @@ Christopher MacGown Rok Garbas Ionuț Arțăriși Stéphane Angel +modocache diff --git a/doc/api/client.rst b/doc/api/client.rst index 4edc07b..4954148 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -50,4 +50,12 @@ given, is 8080:: >>> github = Github(username="ask", api_token=".......", ... proxy_host="my.proxy.com", proxy_port=9000) +You may specify a GitHub Enterprise URL by passing in the ``github_url`` +setting. If you do not specify ``github_url``, requests will be made to +https://github.com/. + + >>> from github2.client import Github + >>> github = Github(username="modocache", api_token=".......", + ... github_url="http://git.gree-dev.net/") + .. _OAuth service: http://develop.github.com/p/oauth.html diff --git a/github2/client.py b/github2/client.py index a26210d..f761b62 100644 --- a/github2/client.py +++ b/github2/client.py @@ -12,7 +12,7 @@ class Github(object): def __init__(self, username=None, api_token=None, requests_per_second=None, access_token=None, cache=None, proxy_host=None, - proxy_port=8080): + proxy_port=8080, github_url=None): """ An interface to GitHub's API: http://develop.github.com/ @@ -44,7 +44,8 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, requests_per_second=requests_per_second, access_token=access_token, cache=cache, proxy_host=proxy_host, - proxy_port=proxy_port) + proxy_port=proxy_port, + github_url=github_url) self.issues = Issues(self.request) self.users = Users(self.request) self.repos = Repositories(self.request) diff --git a/github2/request.py b/github2/request.py index 3b6ba47..d3d2103 100644 --- a/github2/request.py +++ b/github2/request.py @@ -34,7 +34,7 @@ #: Hostname for API access -GITHUB_URL = "https://github.com" +DEFAULT_GITHUB_URL = "https://github.com" #: Logger for requests module LOGGER = logging.getLogger('github2.request') @@ -96,7 +96,6 @@ def __init__(self, message, content, code): class GithubRequest(object): - github_url = GITHUB_URL url_format = "%(github_url)s/api/%(api_version)s/%(api_format)s" api_version = "v2" api_format = "json" @@ -104,7 +103,8 @@ class GithubRequest(object): def __init__(self, username=None, api_token=None, url_prefix=None, requests_per_second=None, access_token=None, - cache=None, proxy_host=None, proxy_port=None): + cache=None, proxy_host=None, proxy_port=None, + github_url=None): """Make an API request. :see: :class:`github2.client.Github` @@ -113,6 +113,10 @@ def __init__(self, username=None, api_token=None, url_prefix=None, self.api_token = api_token self.access_token = access_token self.url_prefix = url_prefix + if github_url is None: + self.github_url = DEFAULT_GITHUB_URL + else: + self.github_url = github_url if requests_per_second is None: self.delay = 0 else: From 4bb1f50ce0bf7bd16966d0babce67e62194e31fa Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 17:58:59 +0000 Subject: [PATCH 389/454] More silly little PEP-8 fixes. This is what pre-commit hooks supposed to be used for ;) --- github2/bin/manage_collaborators.py | 18 ++++++++++++------ github2/core.py | 10 ++++++---- tests/test_charset_header.py | 1 + tests/test_commits.py | 6 ++++-- tests/test_date_handling.py | 1 + tests/test_organizations.py | 3 ++- tests/test_pull_requests.py | 3 ++- tests/test_repositories.py | 6 ++++-- tests/test_tz_aware_date_handling.py | 2 +- 9 files changed, 33 insertions(+), 17 deletions(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 821e89d..3efafee 100755 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -58,11 +58,14 @@ def parse_commandline(): if len(args) not in [1, 2]: parser.error('wrong number of arguments') if (len(args) == 1 and args[0] in ['add', 'remove']): - parser.error('%r needs a collaborator name as second parameter\n' % args[0]) + parser.error('%r needs a collaborator name as second parameter\n' + % args[0]) elif (len(args) == 1 and args[0] != 'list'): - parser.error('unknown command %r. Try "list", "add" or "remove"\n' % args[0]) + parser.error('unknown command %r. Try "list", "add" or "remove"\n' + % args[0]) if (len(args) == 2 and args[0] not in ['add', 'remove']): - parser.error('unknown command %r. Try "list", "add" or "remove"\n' % args[0]) + parser.error('unknown command %r. Try "list", "add" or "remove"\n' + % args[0]) if not options.login: parser.error('you must provide --login information\n') @@ -88,12 +91,15 @@ def main(): datefmt="%Y-%m-%dT%H:%M:%S") if len(args) == 1: for repos in github.repos.list(options.account): - fullreposname = github.project_for_user_repo(options.account, repos.name) - print_("%s: %s" % (repos.name, ' '.join(github.repos.list_collaborators(fullreposname)))) + fullreposname = github.project_for_user_repo(options.account, + repos.name) + collabs = github.repos.list_collaborators(fullreposname) + print_("%s: %s" % (repos.name, ' '.join(collabs))) elif len(args) == 2: command, collaborator = args for repos in github.repos.list(options.account): - fullreposname = github.project_for_user_repo(options.account, repos.name) + fullreposname = github.project_for_user_repo(options.account, + repos.name) if collaborator in github.repos.list_collaborators(fullreposname): if command == 'remove': github.repos.remove_collaborator(repos.name, collaborator) diff --git a/github2/core.py b/github2/core.py index b15161f..60da833 100644 --- a/github2/core.py +++ b/github2/core.py @@ -167,7 +167,8 @@ def get_value(self, *args, **kwargs): # unicode keys are not accepted as kwargs by python, until 2.7: # http://bugs.python.org/issue2646 # So we make a local dict with the same keys but as strings: - return datatype(**dict((str(k), v) for (k, v) in value.items())) + return datatype(**dict((str(k), v) + for (k, v) in value.items())) else: return datatype(**value) return value @@ -177,9 +178,10 @@ def get_values(self, *args, **kwargs): values = self.make_request(*args, **kwargs) if datatype: if not PY27: - # Same as above, unicode keys will blow up in **args, so we need to - # create a new 'values' dict with string keys - return [datatype(**dict((str(k), v) for (k, v) in value.items())) + # Same as above, unicode keys will blow up in **args, so we + # need to create a new 'values' dict with string keys + return [datatype(**dict((str(k), v) + for (k, v) in value.items())) for value in values] else: return [datatype(**value) for value in values] diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py index b495bfc..40aff70 100644 --- a/tests/test_charset_header.py +++ b/tests/test_charset_header.py @@ -7,6 +7,7 @@ def no_match_test(): d = {} assert_equals("ascii", charset_from_headers(d)) + def utf_test(): d = {'content-type': 'application/json; charset=utf-8'} assert_equals("utf-8", charset_from_headers(d)) diff --git a/tests/test_commits.py b/tests/test_commits.py index 337bffb..5d4ee8e 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -8,6 +8,7 @@ class CommitProperties(utils.HttpMockTestCase): """Test commit property handling""" commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' + def test_commit(self): commit = self.client.commits.show('ask/python-github2', self.commit_id) assert_equals(commit.message, @@ -25,8 +26,8 @@ def test_commit(self): assert_equals(commit.committer['login'], 'JNRowe') assert_equals(commit.added, None) assert_equals(commit.removed, None) - assert_equals(commit.modified[0]['filename'], 'github2/bin/manage_collaborators.py') - + assert_equals(commit.modified[0]['filename'], + 'github2/bin/manage_collaborators.py') def test_repr(self): commit = self.client.commits.show('ask/python-github2', self.commit_id) @@ -36,6 +37,7 @@ def test_repr(self): class CommitsQueries(utils.HttpMockTestCase): """Test commit querying""" + def test_list(self): commits = self.client.commits.list('JNRowe/misc-overlay') assert_equals(len(commits), 35) diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index dcfea34..fabc8d5 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -114,6 +114,7 @@ def test_datetime_to_commitdate(): assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), '2011-04-09T09:53:00-07:00') + def test_isodate_to_datetime(): assert_equals(string_to_datetime('2011-05-22T00:24:15Z'), dt(2011, 5, 22, 0, 24, 15)) diff --git a/tests/test_organizations.py b/tests/test_organizations.py index dee751e..9f4e56b 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -63,7 +63,8 @@ def test_add_team(self): def test_add_team_with_repos(self): projects = ['JNRowe-test-org/test1', 'JNRowe-test-org/test2'] team = self.client.organizations.add_team('JNRowe-test-org', - 'test_push', 'push', projects) + 'test_push', 'push', + projects) team_repos = self.client.teams.repositories(team.id) assert_equals(['/'.join([x.organization, x.name]) for x in team_repos], diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 129e502..50197ce 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -52,7 +52,8 @@ class PullRequestQueries(utils.HttpMockTestCase): def test_list(self): pull_requests = self.client.pull_requests.list('ask/python-github2') assert_equals(len(pull_requests), 1) - assert_equals(pull_requests[0].title, 'Pagination support for commits.') + assert_equals(pull_requests[0].title, + 'Pagination support for commits.') def test_list_with_page(self): pull_requests = self.client.pull_requests.list('robbyrussell/oh-my-zsh', diff --git a/tests/test_repositories.py b/tests/test_repositories.py index b55f4d5..fc5f6f4 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -95,12 +95,14 @@ def test_languages(self): def test_tags(self): tags = self.client.repos.tags('ask/python-github2') assert_equals(len(tags), 7) - assert_equals(tags['0.4.1'], '96b0a41dd249c521323700bc11a0a721a7c9e642') + assert_equals(tags['0.4.1'], + '96b0a41dd249c521323700bc11a0a721a7c9e642') def test_branches(self): branches = self.client.repos.branches('ask/python-github2') assert_equals(len(branches), 1) - assert_equals(branches['master'], '1c83cde9b5a7c396a01af1007fb7b88765b9ae45') + assert_equals(branches['master'], + '1c83cde9b5a7c396a01af1007fb7b88765b9ae45') def test_watchers(self): watchers = self.client.repos.watchers('ask/python-github2') diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index 4e4f6eb..ccc224f 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -16,7 +16,7 @@ def setup_module(): def teardown_module(): - """Disable timezone-aware datetime handling when finished with this module""" + """Disable timezone-aware datetime handling when tests have completed""" core.NAIVE = True From f6c908faa49bb013e529da2305674846e2bc440d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 18:00:09 +0000 Subject: [PATCH 390/454] Simplify delay time calculation. Would still be far easier timedelta.total_seconds(), but Python <2.7 compatibility denies us that luxury. --- github2/request.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/github2/request.py b/github2/request.py index d3d2103..2d4b584 100644 --- a/github2/request.py +++ b/github2/request.py @@ -175,10 +175,9 @@ def delete(self, *path_components, **extra_post_data): def make_request(self, path, extra_post_data=None, method="GET"): if self.delay: since_last = (datetime.datetime.utcnow() - self.last_request) - since_last_in_seconds = (since_last.days * 24 * 60 * 60) + since_last.seconds + (since_last.microseconds/1000000.0) - if since_last_in_seconds < self.delay: - duration = self.delay - since_last_in_seconds - LOGGER.warning("delaying API call %s second(s)", duration) + if since_last.days == 0 and since_last.seconds < self.delay: + duration = self.delay - since_last.seconds + LOGGER.warning("delaying API call %g second(s)", duration) time.sleep(duration) extra_post_data = extra_post_data or {} From 95af393c7ad04a5ef33d2aee29e8c0f504e187c9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 18:01:21 +0000 Subject: [PATCH 391/454] Added test for host URL propagation. --- tests/test_unit.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index c72f3ef..76c637a 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -22,6 +22,16 @@ def test_issue(self): assert_equals(str, type(repr(i))) +class HostSetting(unittest.TestCase): + def test_default_host(self): + client = Github() + assert_equals(client.request.github_url, 'https://github.com') + + def test_non_standard_host(self): + client = Github(github_url="http://git.gree-dev.net/") + assert_equals(client.request.github_url, 'http://git.gree-dev.net/') + + class RateLimits(utils.HttpMockTestCase): """Test API rate-limitting""" def test_delays(self): From 478e2a38ef13956c7902374c77d44c77adbb7168 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 18:54:47 +0000 Subject: [PATCH 392/454] Don't override httplib2 certificates at module level. This creates problems when other parts of a runtime are using httplib2 with custom bundles. --- github2/request.py | 11 ++++++----- tests/utils.py | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/github2/request.py b/github2/request.py index 2d4b584..0019623 100644 --- a/github2/request.py +++ b/github2/request.py @@ -45,17 +45,19 @@ for cert_file in ['/etc/ssl/certs/ca-certificates.crt', '/etc/pki/tls/certs/ca-bundle.crt']: if path.exists(cert_file): - httplib2.CA_CERTS = cert_file + CA_CERTS = cert_file SYSTEM_CERTS = True break elif not SYSTEM_CERTS and sys.platform.startswith('freebsd'): if path.exists('/usr/local/share/certs/ca-root-nss.crt'): - httplib2.CA_CERTS = '/usr/local/share/certs/ca-root-nss.crt' + CA_CERTS = '/usr/local/share/certs/ca-root-nss.crt' SYSTEM_CERTS = True if SYSTEM_CERTS: LOGGER.info('Using system certificates in %r', httplib2.CA_CERTS) else: LOGGER.warning('Using bundled certificates for HTTPS connections') + CA_CERTS = path.join(path.dirname(path.abspath(__file__)), + "DigiCert_High_Assurance_EV_Root_CA.crt") def charset_from_headers(headers): @@ -134,9 +136,8 @@ def __init__(self, username=None, api_token=None, url_prefix=None, proxy_info = httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_HTTP, proxy_host, proxy_port) self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) - if not SYSTEM_CERTS: - self._http.ca_certs = path.join(path.dirname(path.abspath(__file__)), - "DigiCert_High_Assurance_EV_Root_CA.crt") + self._http.ca_certs = CA_CERTS + def encode_authentication_data(self, extra_post_data): post_data = [] diff --git a/tests/utils.py b/tests/utils.py index a1c32b4..cbd41cc 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -25,7 +25,8 @@ class HttpMock(object): Implementation tests should never span network boundaries """ - def __init__(self, cache=None, timeout=None, proxy_info=None): + def __init__(self, cache=None, timeout=None, proxy_info=None, + ca_certs=None): """Create a mock httplib.Http object .. attribute: called_with From a7e495f306fdf69ce81109b92e41f0014e104119 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 18:56:25 +0000 Subject: [PATCH 393/454] Append 422 status to HTTP responses dict. --- github2/request.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/github2/request.py b/github2/request.py index 0019623..3066702 100644 --- a/github2/request.py +++ b/github2/request.py @@ -60,6 +60,11 @@ "DigiCert_High_Assurance_EV_Root_CA.crt") +# Common missing entries from the HTTP status code dict, basically anything +# GitHub reports that isn't basic HTTP/1.1. +responses[422] = 'Unprocessable Entity' + + def charset_from_headers(headers): """Parse charset from headers From 3bd621cddefc55acb34cf8d55ba58d5061b332ed Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 19:05:34 +0000 Subject: [PATCH 394/454] Warn about bundled certs on creation not import. --- github2/request.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/github2/request.py b/github2/request.py index 3066702..5c9f555 100644 --- a/github2/request.py +++ b/github2/request.py @@ -52,10 +52,7 @@ if path.exists('/usr/local/share/certs/ca-root-nss.crt'): CA_CERTS = '/usr/local/share/certs/ca-root-nss.crt' SYSTEM_CERTS = True -if SYSTEM_CERTS: - LOGGER.info('Using system certificates in %r', httplib2.CA_CERTS) else: - LOGGER.warning('Using bundled certificates for HTTPS connections') CA_CERTS = path.join(path.dirname(path.abspath(__file__)), "DigiCert_High_Assurance_EV_Root_CA.crt") @@ -142,7 +139,10 @@ def __init__(self, username=None, api_token=None, url_prefix=None, proxy_host, proxy_port) self._http = httplib2.Http(proxy_info=proxy_info, cache=cache) self._http.ca_certs = CA_CERTS - + if SYSTEM_CERTS: + LOGGER.info('Using system certificates in %r', CA_CERTS) + else: + LOGGER.warning('Using bundled certificate for HTTPS connections') def encode_authentication_data(self, extra_post_data): post_data = [] From b08b9b78664bfbf462ca722f5b5dedca7e441631 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 18 Jan 2012 19:06:30 +0000 Subject: [PATCH 395/454] Added warning for unknown HTTP status. --- github2/request.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 5c9f555..d6190e2 100644 --- a/github2/request.py +++ b/github2/request.py @@ -96,7 +96,8 @@ def __init__(self, message, content, code): if code in responses: self.code_reason = responses[code] else: - self.code_reason = "" + self.code_reason = "" + LOGGER.warning('Unknown HTTP status %r, please file an issue', code) class GithubRequest(object): From 6f8131301bcb36f624f13b09f1b588c4c7cf4b14 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 9 Feb 2012 11:01:20 +0000 Subject: [PATCH 396/454] Ignore .pyo files. Test runner is completing a run with -O too now. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index de35dbe..ea2d6d3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .noseids .ropeproject/ .tox/ -*.pyc +*.py[co] *~ *.sqlite *.sqlite-journal From c22e2be078aefefba8113fc343e371b3d8e30ed4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 9 Feb 2012 11:06:13 +0000 Subject: [PATCH 397/454] Added Repository source attribute. --- github2/repositories.py | 1 + tests/test_repositories.py | 1 + 2 files changed, 2 insertions(+) diff --git a/github2/repositories.py b/github2/repositories.py index cbd9ad4..89f8e57 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -24,6 +24,7 @@ class Repository(BaseData): has_issues = Attribute("If True, this repository has an issue tracker.") language = Attribute("Primary language for the repository.") parent = Attribute("The parent project of this fork.") + source = Attribute("The root project of this fork") def _project(self): return self.owner + "/" + self.name diff --git a/tests/test_repositories.py b/tests/test_repositories.py index fc5f6f4..63f39c0 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -48,6 +48,7 @@ def test_fork_properties(self): assert_equals(repo.forks, 0) assert_equals(repo.fork, True) assert_equals(repo.parent, 'ask/python-github2') + assert_equals(repo.source, 'ask/python-github2') class RepoQueries(utils.HttpMockTestCase): From 95cc0d93cc0b5ff6ba55ce9b1e9a6e647433611e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Thu, 9 Feb 2012 11:07:39 +0000 Subject: [PATCH 398/454] [QA] Silly typo. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index d6190e2..b8588de 100644 --- a/github2/request.py +++ b/github2/request.py @@ -77,7 +77,7 @@ def charset_from_headers(headers): class GithubError(Exception): - """An error occured when making a request to the Github API.""" + """An error occurred when making a request to the Github API.""" class HttpError(RuntimeError): From 0f672e72a1e3e18ba5d843723d77cd2c39d980ff Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 14:18:54 +0000 Subject: [PATCH 399/454] Added support for mangling SSH keys. Refs #73. --- doc/api/users.rst | 2 ++ github2/users.py | 35 +++++++++++++++++++ ...token=xxx,f95947b79ef9d668b2ebac9a591a2a36 | 16 +++++++++ tests/test_user.py | 4 +++ 4 files changed, 57 insertions(+) create mode 100644 tests/data/github.com,api,v2,json,user,keys,access_token=xxx,f95947b79ef9d668b2ebac9a591a2a36 diff --git a/doc/api/users.rst b/doc/api/users.rst index 36f086d..052092a 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -13,6 +13,8 @@ Users .. autoclass:: Users(type) +.. autoclass:: Key(type) + Examples -------- diff --git a/github2/users.py b/github2/users.py index 7dba3e6..f2282b2 100644 --- a/github2/users.py +++ b/github2/users.py @@ -7,6 +7,15 @@ enhanced_by_auth, requires_auth) +class Key(BaseData): + id = Attribute('The key id') + key = Attribute('The SSH key data') + title = Attribute('The title for the SSH key') + + def __repr__(self): + return "" % self.id + + class User(BaseData): id = Attribute("The user id") login = Attribute("The login username") @@ -102,3 +111,29 @@ def unfollow(self, other_user): :param str other_user: Github user name """ return self.get_values("unfollow", other_user, method="POST") + + @requires_auth + def list_keys(self): + """Get list of SSH keys for the authenticated user""" + return self.get_values('keys', filter='public_keys', datatype=Key) + + @requires_auth + def add_key(self, key, title=''): + """Add a SSH key for the authenticated user + + :param str key: SSH key identifier + :param str title: Optional title for the SSH key + """ + return self.get_values("key/add", + post_data={'key': key, 'title': title}, + method="POST", filter='public_keys', + datatype=Key) + + @requires_auth + def remove_key(self, key_id): + """Remove a SSH key for the authenticated user + + :param int key_id: SSH key's GitHub identifier + """ + return self.get_values('key/remove', post_data={'id': str(key_id)}, + filter='public_keys', datatype=Key) diff --git a/tests/data/github.com,api,v2,json,user,keys,access_token=xxx,f95947b79ef9d668b2ebac9a591a2a36 b/tests/data/github.com,api,v2,json,user,keys,access_token=xxx,f95947b79ef9d668b2ebac9a591a2a36 new file mode 100644 index 0000000..ef84a1d --- /dev/null +++ b/tests/data/github.com,api,v2,json,user,keys,access_token=xxx,f95947b79ef9d668b2ebac9a591a2a36 @@ -0,0 +1,16 @@ +status: 200 +x-ratelimit-remaining: 60 +content-location: https://github.com/api/v2/json/user/keys?access_token=xxx +-content-encoding: gzip +connection: keep-alive +content-length: 94 +server: nginx/1.0.4 +x-runtime: 7 +x-ratelimit-limit: 60 +etag: "1df3e8616495dcf01a4fb79fa450c544" +cache-control: private, max-age=0, must-revalidate +date: Fri, 10 Feb 2012 13:53:29 GMT +x-frame-options: deny +content-type: application/json; charset=utf-8 + +{"public_keys":[{"title":"My sekret key","id":1337,"key":"ssh-rsa DoYouSee key@example.com"}]} diff --git a/tests/test_user.py b/tests/test_user.py index d61794b..aff6ad5 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -62,6 +62,10 @@ def test_is_authenticated(self): user = self.client.users.show('') assert_true(user.is_authenticated() is True) + def test_list_keys(self): + keys = self.client.users.list_keys() + assert_equals(keys[0].id, 1337) + class AuthenticatedUserProperties(utils.HttpMockAuthenticatedTestCase): def test_private_data(self): From f2a0671d15a3de611f7df03c20b20bafb83fd0a4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 14:19:56 +0000 Subject: [PATCH 400/454] Fixed GITHUB_URL doc reference. Should have been fixed along with 405dbed3397a856ada37840148f6eee25d757a01, whoops. --- doc/api/request.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/request.rst b/doc/api/request.rst index f58fd0a..eb126ec 100644 --- a/doc/api/request.rst +++ b/doc/api/request.rst @@ -8,7 +8,7 @@ Requests of the :mod:`github2` package, but it is documented to aid contributors to the package. -.. autodata:: GITHUB_URL +.. autodata:: DEFAULT_GITHUB_URL .. autodata:: SYSTEM_CERTS From a8513b44f7db508323e7a6c6ad448646c84de9e0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 14:21:16 +0000 Subject: [PATCH 401/454] [QA] Fix wild spelling of 'authentication'. --- github2/users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/users.py b/github2/users.py index f2282b2..1cd5ac6 100644 --- a/github2/users.py +++ b/github2/users.py @@ -41,7 +41,7 @@ class User(BaseData): format="user") def is_authenticated(self): - """Test for user auththenication + """Test for user authentication :return bool: ``True`` if user is authenticated""" return self.plan is not None From 3221df99b027964d1b631204a49df67e4e48f8b7 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 19:42:39 +0000 Subject: [PATCH 402/454] Correct decorated function signatures in Sphinx output. --- doc/conf.py | 13 +++++++++++++ github2/core.py | 1 + 2 files changed, 14 insertions(+) diff --git a/doc/conf.py b/doc/conf.py index 1fb7895..9675450 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -13,6 +13,8 @@ import sys, os +from sphinx.util import inspect + import cloud_sptheme as csp # If extensions (or modules to document with autodoc) are in another directory, @@ -229,3 +231,14 @@ intersphinx_mapping = { 'python': ('http://docs.python.org/', os.getenv('SPHINX_PYTHON_OBJECTS')) } + + +# Horrific nastiness to generate correct function signature for decorated +# objects. Close your eyes... Now! +orig_getargspec = inspect.getargspec +def getargspec(func): + if hasattr(func, '__orig_func__'): + return orig_getargspec(func.__orig_func__) + else: + return orig_getargspec(func) +inspect.getargspec = getargspec diff --git a/github2/core.py b/github2/core.py index 60da833..9898be0 100644 --- a/github2/core.py +++ b/github2/core.py @@ -113,6 +113,7 @@ def wrapper(self, *args, **kwargs): % f.__name__) return f(self, *args, **kwargs) wrapped = wrapper + wrapped.__orig_func__ = f wrapped.__name__ = f.__name__ wrapped.__doc__ = f.__doc__ + """\n.. warning:: Requires authentication""" wrapped.requires_auth = True From 7162ef26f636b2f1e34242ec619c73ef12c0c2c5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 19:46:04 +0000 Subject: [PATCH 403/454] [QA] Fix PEP-8 compliance in Sphinx config. --- doc/conf.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 9675450..ea950db 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -3,7 +3,8 @@ # python-github2 documentation build configuration file, created by # sphinx-quickstart on Mon Apr 11 16:16:25 2011. # -# This file is execfile()d with the current directory set to its containing dir. +# This file is execfile()d with the current directory set to its containing +# dir. # # Note that not all possible configuration values are present in this # autogenerated file. @@ -11,7 +12,8 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys, os +import os +import sys from sphinx.util import inspect @@ -22,13 +24,13 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) -# -- General configuration ----------------------------------------------------- +# -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' -# Add any Sphinx extension module names here, as strings. They can be extensions -# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ["sphinx.ext.%s" % ext for ext in ["autodoc", "todo", "intersphinx", "viewcode", "coverage"]] + \ @@ -74,7 +76,8 @@ # directories to ignore when looking for source files. exclude_patterns = ['.build'] -# The reST default role (used for this markup: `text`) to use for all documents. +# The reST default role (used for this markup: `text`) to use for all +# documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. @@ -95,7 +98,7 @@ #modindex_common_prefix = [] -# -- Options for HTML output --------------------------------------------------- +# -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. @@ -177,7 +180,7 @@ htmlhelp_basename = 'github2doc' -# -- Options for LaTeX output -------------------------------------------------- +# -- Options for LaTeX output ------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' @@ -186,7 +189,8 @@ #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass [howto/manual]). +# (source start file, target name, title, author, +# documentclass [howto/manual]). latex_documents = [ ('index', 'github2.tex', u'github2 Documentation', u'Ask Solem', 'manual'), @@ -216,7 +220,7 @@ #latex_domain_indices = True -# -- Options for manual page output -------------------------------------------- +# -- Options for manual page output ------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). @@ -236,6 +240,8 @@ # Horrific nastiness to generate correct function signature for decorated # objects. Close your eyes... Now! orig_getargspec = inspect.getargspec + + def getargspec(func): if hasattr(func, '__orig_func__'): return orig_getargspec(func.__orig_func__) From 34c28268c05180059f86a4fe9d523fb2e4efd584 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 19:46:47 +0000 Subject: [PATCH 404/454] Report correct module in funcs decorated by requires_auth. --- github2/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/github2/core.py b/github2/core.py index 9898be0..6ae08bb 100644 --- a/github2/core.py +++ b/github2/core.py @@ -116,6 +116,7 @@ def wrapper(self, *args, **kwargs): wrapped.__orig_func__ = f wrapped.__name__ = f.__name__ wrapped.__doc__ = f.__doc__ + """\n.. warning:: Requires authentication""" + wrapped.__module__ = f.__module__ wrapped.requires_auth = True return wrapped From 6992c53d2cdc0466fa320f575d3344213a96c3f0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 10 Feb 2012 19:57:22 +0000 Subject: [PATCH 405/454] Provide a fall back to CURL_CA_BUNDLE. This is only used if we can't discover a system certs location. --- doc/api/request.rst | 1 + github2/request.py | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/api/request.rst b/doc/api/request.rst index eb126ec..0dd71f2 100644 --- a/doc/api/request.rst +++ b/doc/api/request.rst @@ -11,6 +11,7 @@ Requests .. autodata:: DEFAULT_GITHUB_URL .. autodata:: SYSTEM_CERTS +.. autodata:: CURL_CERTS .. autoexception:: GithubError diff --git a/github2/request.py b/github2/request.py index b8588de..3965415 100644 --- a/github2/request.py +++ b/github2/request.py @@ -18,7 +18,7 @@ import json as simplejson # For Python 2.6+ except ImportError: import simplejson -from os import path +from os import (getenv, path) try: # For Python 3 from urllib.parse import (parse_qs, quote, urlencode, urlsplit, urlunsplit) @@ -41,6 +41,8 @@ #: Whether github2 is using the system's certificates for SSL connections SYSTEM_CERTS = not httplib2.CA_CERTS.startswith(path.dirname(httplib2.__file__)) +#: Whether github2 is using the cert's from the file given in $CURL_CA_BUNDLE +CURL_CERTS = False if not SYSTEM_CERTS and sys.platform.startswith('linux'): for cert_file in ['/etc/ssl/certs/ca-certificates.crt', '/etc/pki/tls/certs/ca-bundle.crt']: @@ -52,6 +54,9 @@ if path.exists('/usr/local/share/certs/ca-root-nss.crt'): CA_CERTS = '/usr/local/share/certs/ca-root-nss.crt' SYSTEM_CERTS = True +elif path.exists(getenv('CURL_CA_BUNDLE', '')): + CA_CERTS = getenv('CURL_CA_BUNDLE') + CURL_CERTS = True else: CA_CERTS = path.join(path.dirname(path.abspath(__file__)), "DigiCert_High_Assurance_EV_Root_CA.crt") @@ -142,6 +147,8 @@ def __init__(self, username=None, api_token=None, url_prefix=None, self._http.ca_certs = CA_CERTS if SYSTEM_CERTS: LOGGER.info('Using system certificates in %r', CA_CERTS) + elif CURL_CERTS: + LOGGER.info("Using cURL's certificates in %r", CA_CERTS) else: LOGGER.warning('Using bundled certificate for HTTPS connections') From 2afb1a566e16195e76cd30273fbfd14235c960f4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 15 Feb 2012 15:23:53 +0000 Subject: [PATCH 406/454] Document the Github github_url parameter. --- github2/client.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/github2/client.py b/github2/client.py index f761b62..c585f3b 100644 --- a/github2/client.py +++ b/github2/client.py @@ -23,6 +23,8 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, The ``cache`` and ``access_token`` parameters .. versionadded:: 0.4.0 The ``proxy_host`` and ``proxy_port`` parameters + .. versionadded:: 0.7.0 + The ``github_url`` parameter :param str username: your own GitHub username. :param str api_token: can be found at https://github.com/account @@ -38,6 +40,8 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, :param str proxy_host: the hostname for the HTTP proxy, if needed. :param str proxy_port: the hostname for the HTTP proxy, if needed (will default to 8080 if a proxy_host is set and no port is set). + :param str github_url: the hostname to connect to, for GitHub + Enterprise support """ self.request = GithubRequest(username=username, api_token=api_token, From 0e768616e38faa5f03ef0dc2decc1bf00f4c9535 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 24 Feb 2012 16:34:06 +0000 Subject: [PATCH 407/454] Added github-issues-export to 'in the wild' document. Refs #74. --- doc/wild.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 968358f..78b2298 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -56,6 +56,14 @@ listed on this page. :Git repository: https://github.com/kashifrazzaqui/github-issues +``github-issues-export`` +'''''''''''''''''''''''' + + Script to liberate issues from github issues in case you would like to have + your data free. + +:Git repository: https://github.com/mcepl/github-issues-export + ``github-plots`` '''''''''''''''' From 0a75e3788cd107178d4d9764d784bd86af0c4aef Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:07:35 +0000 Subject: [PATCH 408/454] Initial documentation for the binding objects. Closes #70. --- doc/api/core.rst | 8 ++++---- github2/core.py | 42 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/doc/api/core.rst b/doc/api/core.rst index bb96daf..9b9e297 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -30,10 +30,10 @@ Core .. autofunction:: repr_string -.. autoclass:: GithubCommand(type) +.. autoclass:: GithubCommand -.. autoclass:: Attribute(type) +.. autoclass:: Attribute -.. autoclass:: DateAttribute(type) +.. autoclass:: DateAttribute(help, format) -.. autoclass:: BaseDataType(type) +.. autoclass:: BaseData() diff --git a/github2/core.py b/github2/core.py index 6ae08bb..ea5afcd 100644 --- a/github2/core.py +++ b/github2/core.py @@ -137,9 +137,24 @@ def enhanced_by_auth(f): class GithubCommand(object): def __init__(self, request): + """Main API binding interface + + :param github2.request.GithubRequest request: HTTP request handler + """ self.request = request def make_request(self, command, *args, **kwargs): + """Make an API request + + Various options are supported if they exist in ``kwargs``: + + * The value of a ``method`` argument will define the HTTP method + to perform for this request, the default is ``GET`` + * The value of a ``filter`` argument will restrict the response to that + data + * The value of a ``page`` argument will be used to fetch a specific + page of results, default of 1 is assumed if not given + """ filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} page = kwargs.pop("page", 1) @@ -162,6 +177,11 @@ def make_request(self, command, *args, **kwargs): return response def get_value(self, *args, **kwargs): + """Process a single-value response from the API + + If a ``datatype`` parameter is given it defines the + :class:`BaseData`-derived class we should build from the provided data + """ datatype = kwargs.pop("datatype", None) value = self.make_request(*args, **kwargs) if datatype: @@ -176,6 +196,10 @@ def get_value(self, *args, **kwargs): return value def get_values(self, *args, **kwargs): + """Process a multi-value response from the API + + :see: :meth:`get_value` + """ datatype = kwargs.pop("datatype", None) values = self.make_request(*args, **kwargs) if datatype: @@ -208,8 +232,11 @@ def bullet(title, text): class Attribute(object): - def __init__(self, help): + """Generic object attribute for use with :class:`BaseData` + + :param str help: Attribute description + """ self.help = help def to_python(self, value): @@ -228,6 +255,11 @@ class DateAttribute(Attribute): } def __init__(self, *args, **kwargs): + """Date handling attribute for use with :class:`BaseData` + + :param str format: The date format to support, see + :data:`convertor_for_format` for supported options + """ self.format = kwargs.pop("format", self.format) super(DateAttribute, self).__init__(*args, **kwargs) @@ -281,6 +313,12 @@ def iterate(self): # Ugly base class definition for Python 2 and 3 compatibility, where metaclass # syntax is incompatible class BaseData(BaseDataType('BaseData', (object, ), {})): + """Wrapper for API responses + + .. warning:: + Supports subscript attribute access purely for backwards compatibility, + you shouldn't rely on that functionality in new code + """ def __getitem__(self, key): """Access objects's attribute using subscript notation @@ -297,7 +335,7 @@ def __getitem__(self, key): def __setitem__(self, key, value): """Update object's attribute using subscript notation - :see: ``BaseData.__getitem__`` + :see: :meth:`BaseData.__getitem__` """ LOGGER.warning("Subscript access on %r is deprecated, use object " "attributes" % self.__class__.__name__, From f5b5440d10fea1b36d9ec8f9b6b8a3c87674a43f Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:08:02 +0000 Subject: [PATCH 409/454] [QA] Missing word in contributing. --- doc/contributing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index ad3f31c..8c3b47a 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -71,9 +71,9 @@ Many assertions, such as :meth:`~unittest.TestCase.assertIn` and The simple workaround is to evaluate an expression to test with :meth:`~unittest.TestCase.assertTrue` -The incredibly functions for skipping tests(:func:`~unittest.skip`) and marking -expected failures(:func:`~unittest.expectedFailure`) were only added in 2.7, and -unfortunately can't be used. +The incredibly useful functions for skipping tests(:func:`~unittest.skip`) and +marking expected failures(:func:`~unittest.expectedFailure`) were only added in +2.7, and unfortunately can't be used. .. todo:: Add topic branches and pull request usage examples, but most git users are From 915165b2a33cf17b25467b7b61f0c9d07ceb7bc4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:08:46 +0000 Subject: [PATCH 410/454] Added basic release building document. If you can't guess why this is here, then I'd be very surprised indeed. --- doc/index.rst | 1 + doc/release.rst | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 doc/release.rst diff --git a/doc/index.rst b/doc/index.rst index 8656174..fffa939 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -41,6 +41,7 @@ Contents bugs contributing wild + release license Indices and tables diff --git a/doc/release.rst b/doc/release.rst new file mode 100644 index 0000000..b7baf79 --- /dev/null +++ b/doc/release.rst @@ -0,0 +1,63 @@ +Release HOWTO +============= + +.. highlight:: sh + +.. + Much of this stuff is automated locally, but I'm describing the process for + other people who will not have access to the same release tools I use. The + first thing I recommend that you do is find/write a tool that allows you to + automate all of this, or you're going to miss important steps at some point. + +Test +---- + +In the general case tests can be run via :pypi:`nose`'s :pypi:`distribute` +integration:: + + $ ./setup.py nosetests + +When preparing a release it is important to check that :mod:`github2` works with +all currently supported Python versions, and that the documentation is correct. +To that end you can use :pypi:`tox` to run the full testsuite:: + + $ tox -v + +This will test :mod:`github2` with Python 2.4 → 3.2, check that the ``reST`` +syntax is valid and also that the :pypi:`sphinx` documentation builds correctly. +You can run a subset of these options too, see the ``tox`` documentation for +more information. + +Prepare release +--------------- + +With the tests passing, perform the following steps + +* Update the version data in :file:`github2/_version.py`, and also the + reference in :file:`README.rst` +* Update :file:`NEWS.rst`, if there are any user visible changes +* Commit the release notes and version changes +* Create a signed tag for the release +* Push the changes, including the new tag, to the GitHub repository + +Update PyPI +----------- + +.. + This is the section you're especially likely to get wrong at some point if you + try to handle all of this manually ;) + +Create and upload the new release tarballs to PyPI:: + + $ ./setup.py sdist --formats=bztar,gztar register upload --sign + +You should also update the hosted documentation too:: + + $ ./setup.py build_sphinx && ./setup.py upload_docs + +Fetch the uploaded tarballs, and check for errors. + +You should also perform test installations from PyPI, to check the experience +:mod:`github2` users will have. + +.. highlight:: python From f6db79af8670d0d5535ca4dd46b9c133285f3b6d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:11:32 +0000 Subject: [PATCH 411/454] [QA] Minor PEP-8 fixes. --- github2/core.py | 7 +++---- github2/organizations.py | 9 ++++++--- github2/pull_requests.py | 12 ++++++------ github2/request.py | 3 ++- tests/test_unit.py | 1 + 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/github2/core.py b/github2/core.py index 6ae08bb..fe171d1 100644 --- a/github2/core.py +++ b/github2/core.py @@ -248,12 +248,11 @@ def __new__(cls, name, bases, attrs): super_new = super(BaseDataType, cls).__new__ _meta = dict([(attr_name, attr_value) - for attr_name, attr_value in attrs.items() - if isinstance(attr_value, Attribute)]) + for attr_name, attr_value in attrs.items() + if isinstance(attr_value, Attribute)]) attrs["_meta"] = _meta attributes = _meta.keys() - attrs.update(dict([(attr_name, None) - for attr_name in attributes])) + attrs.update(dict([(attr_name, None) for attr_name in attributes])) def _contribute_method(name, func): func.__name__ = name diff --git a/github2/organizations.py b/github2/organizations.py index 0c8aa00..38eac83 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -17,10 +17,13 @@ class Organization(BaseData): company = Attribute("The organization's company name.") created_at = DateAttribute("The date the organization was created.", format="commit") - following_count = Attribute("Number of users the organization is following.") + following_count = Attribute("Number of users the organization is " + "following.") followers_count = Attribute("Number of users following this organization.") - public_gist_count = Attribute("Organization's number of active public gists.") - public_repo_count = Attribute("Organization's number of active repositories.") + public_gist_count = Attribute("Organization's number of active public " + "gists.") + public_repo_count = Attribute("Organization's number of active " + "repositories.") permission = Attribute("Permissions within this organization.") plan = Attribute("GitHub plan for this organization.") diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 3573f75..b75d62e 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -22,14 +22,14 @@ class PullRequest(BaseData): patch_url = Attribute("The URL to the downloadable patch.") labels = Attribute("A list of labels attached to the pull request.") html_url = Attribute("The URL to the pull request.") - issue_created_at = DateAttribute("The date the issue for this pull request was opened.", - format='iso') - issue_updated_at = DateAttribute("The date the issue for this pull request was last updated.", - format='iso') + issue_created_at = DateAttribute("The date the issue for this pull " + "request was opened.", format='iso') + issue_updated_at = DateAttribute("The date the issue for this pull " + "request was last updated.", format='iso') created_at = DateAttribute("The date when this pull request was created.", format='iso') - updated_at = DateAttribute("The date when this pull request was last updated.", - format='iso') + updated_at = DateAttribute("The date when this pull request was last " + "updated.", format='iso') closed_at = DateAttribute("The date when this pull request was closed", format='iso') discussion = Attribute("Discussion thread for the pull request.") diff --git a/github2/request.py b/github2/request.py index 3965415..bee5846 100644 --- a/github2/request.py +++ b/github2/request.py @@ -102,7 +102,8 @@ def __init__(self, message, content, code): self.code_reason = responses[code] else: self.code_reason = "" - LOGGER.warning('Unknown HTTP status %r, please file an issue', code) + LOGGER.warning('Unknown HTTP status %r, please file an issue', + code) class GithubRequest(object): diff --git a/tests/test_unit.py b/tests/test_unit.py index 76c637a..2e985a7 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -75,6 +75,7 @@ def test_project_for_user_repo(): assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), 'JNRowe/misc-overlay') + def test_repr_string(): assert_equals(repr_string('test'), 'test') assert_equals(repr_string('abcdefghijklmnopqrst'), 'abcdefghijklmnopqrst') From 18eaf6163192d129ed09bd30b4e96f9c1894b4e0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:12:39 +0000 Subject: [PATCH 412/454] [QA] Added hints for flake8. --- github2/issues.py | 2 +- github2/request.py | 17 ++++++++--------- github2/users.py | 2 +- tests/test_request.py | 8 ++++---- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/github2/issues.py b/github2/issues.py index ae9723b..851f813 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,7 +1,7 @@ try: from urllib.parse import quote_plus # For Python 3 except ImportError: - from urllib import quote_plus + from urllib import quote_plus # NOQA from github2.core import (GithubCommand, BaseData, Attribute, DateAttribute, repr_string, requires_auth) diff --git a/github2/request.py b/github2/request.py index bee5846..c05394a 100644 --- a/github2/request.py +++ b/github2/request.py @@ -9,26 +9,25 @@ from http.client import responses except ImportError: # For Python 2.5-2.7 try: - from httplib import responses + from httplib import responses # NOQA except ImportError: # For Python 2.4 - from BaseHTTPServer import BaseHTTPRequestHandler - responses = dict([(k, v[0]) - for k, v in BaseHTTPRequestHandler.responses.items()]) + from BaseHTTPServer import BaseHTTPRequestHandler as _BHRH + responses = dict([(k, v[0]) for k, v in _BHRH.responses.items()]) # NOQA try: import json as simplejson # For Python 2.6+ except ImportError: - import simplejson + import simplejson # NOQA from os import (getenv, path) try: # For Python 3 from urllib.parse import (parse_qs, quote, urlencode, urlsplit, urlunsplit) except ImportError: - from urlparse import (urlsplit, urlunsplit) + from urlparse import (urlsplit, urlunsplit) # NOQA try: - from urlparse import parse_qs + from urlparse import parse_qs # NOQA except ImportError: - from cgi import parse_qs - from urllib import urlencode, quote + from cgi import parse_qs # NOQA + from urllib import urlencode, quote # NOQA import httplib2 diff --git a/github2/users.py b/github2/users.py index 1cd5ac6..ad40fc1 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,7 +1,7 @@ try: from urllib.parse import quote_plus # For Python 3 except ImportError: - from urllib import quote_plus + from urllib import quote_plus # NOQA from github2.core import (BaseData, GithubCommand, DateAttribute, Attribute, enhanced_by_auth, requires_auth) diff --git a/tests/test_request.py b/tests/test_request.py index 031bc4f..7c7f93b 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -4,9 +4,9 @@ from urllib.parse import parse_qs # For Python 3 except ImportError: try: - from urlparse import parse_qs + from urlparse import parse_qs # NOQA except ImportError: # For Python <2.6 - from cgi import parse_qs + from cgi import parse_qs # NOQA try: from nose.tools import (assert_dict_contains_subset, assert_dict_equal) @@ -14,8 +14,8 @@ import unittest2 _binding = unittest2.TestCase('run') - assert_dict_contains_subset = _binding.assertDictContainsSubset - assert_dict_equal = _binding.assertDictEqual + assert_dict_contains_subset = _binding.assertDictContainsSubset # NOQA + assert_dict_equal = _binding.assertDictEqual # NOQA from github2 import request From 04b24977b4a4aba96dd41a6a092cacd4641351ba Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:14:48 +0000 Subject: [PATCH 413/454] Fixed Sphinx :see: uses to use domain refs. --- tests/test_tz_aware_date_handling.py | 2 +- tests/utils.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index ccc224f..5789593 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -23,7 +23,7 @@ def teardown_module(): def dt_utz(year, month, day, hour, minute, second): """Produce a UTC-anchored datetime object - :see: ``datetime.datetime`` + :see: :class:`datetime.datetime` """ return dt(year, month, day, hour, minute, second, tzinfo=tzutc()) diff --git a/tests/utils.py b/tests/utils.py index cbd41cc..78fb8c4 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -73,7 +73,7 @@ class HttpMockAuthenticatedTestCase(HttpMockTestCase): def setUp(self): """Prepare test fixtures - :see: ``HttpMockTestCase`` + :see: :class:`HttpMockTestCase` :attr:`client` is an authenticated :obj:`Github` object for easy use in tests. From 6724850616fcbb31b0c99b94ec4dfc1fdf470fb0 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:18:09 +0000 Subject: [PATCH 414/454] Added ghsync/humble to 'in the wild' doc. --- doc/wild.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index 78b2298..af21eed 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -48,6 +48,13 @@ listed on this page. :PyPI page: :pypi:`ghmiles` +``ghsync`` +'''''''''' + + GitHub Syncer. Clones or Pulls all GitHub repos. + +:PyPI page: :pypi:`ghsync` + ``github-issues`` ''''''''''''''''' @@ -81,6 +88,13 @@ listed on this page. .. _GitHub's issue tracker: http://github.com/blog/411-github-issue-tracker +``humble`` +'''''''''' + + Shows stats on a given GitHub user. + +:PyPI page: :pypi:`humble` + ``Repos.io`` '''''''''''' From d7b0cccbd67ba99e1f90aeb835014ee564ec6542 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Tue, 28 Feb 2012 20:27:09 +0000 Subject: [PATCH 415/454] Bumped version to 0.6.1. --- NEWS.rst | 11 +++++++++++ README.rst | 2 +- github2/_version.py | 14 +++++++------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 54c693b..1f94908 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -8,6 +8,17 @@ look at the `git repository`_ for the full project history. .. contents:: +0.6.1 - 2012-02-28 +------------------ + +* Support for `GitHub:Enterprise`_ using the ``github_url`` parameter when + creating a client +* Adds SSH key management +* Support reading SSL certificates from the location set in ``CURL_CA_BUNDLE``, + if all else fails + +.. _GitHub:Enterprise: https://enterprise.github.com/ + 0.6.0 - 2011-12-21 ------------------ diff --git a/README.rst b/README.rst index 804dc81..67867b9 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - Github API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.6.0 +:Version: 0.6.1 This is a Python library implementing all of the features available in version 2 of the `Github API`_. diff --git a/github2/_version.py b/github2/_version.py index bf9f4df..0269a27 100644 --- a/github2/_version.py +++ b/github2/_version.py @@ -1,9 +1,9 @@ -# This is github2 version 0.6.0 (2011-12-21) +# This is github2 version 0.6.1 (2012-02-28) # pylint: disable=C0103, C0111, C0121, W0622 -dotted = "0.6.0" -libtool = "6:20" -hex = 0x000600 -date = "2011-12-21" -tuple = (0, 6, 0) -web = "github/0.6.0" +dotted = "0.6.1" +libtool = "6:21" +hex = 0x000601 +date = "2012-02-28" +tuple = (0, 6, 1) +web = "github2/0.6.1" From ddeb4bc60b89311c8e068f31b3e0df77bc27164c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 6 Apr 2012 07:50:51 +0100 Subject: [PATCH 416/454] [QA] Removed contents directive from NEWS file. --- NEWS.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 1f94908..e7092fe 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -6,8 +6,6 @@ look at the `git repository`_ for the full project history. .. _git repository: https://github.com/ask/python-github2/ -.. contents:: - 0.6.1 - 2012-02-28 ------------------ From 3414c22d25a54624e554be5bdb8a6fb327ff27d7 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Fri, 6 Apr 2012 07:48:36 +0100 Subject: [PATCH 417/454] Added a warning to the intro docs for pending API switch-off. Wondering whether this needs an explicit "don't file bug reports" clause ;) --- README.rst | 12 ++++++++++++ doc/index.rst | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/README.rst b/README.rst index 67867b9..3e6ab34 100644 --- a/README.rst +++ b/README.rst @@ -6,12 +6,24 @@ github2 - Github API v2 library for Python. Ask Solem (askh@opera.com) :Version: 0.6.1 +.. warning:: + + GitHub are planning to `switch off API v2`_ on 2012-05-01, you should + be looking to replace ``github2`` as soon as possible. + + Both remoteobjects_ and micromodels_ provide easy-to-use functionality for + creating bindings to remote APIs, and should significantly reduce the amount + of work needed in moving away from GitHub's API v2. + This is a Python library implementing all of the features available in version 2 of the `Github API`_. See the ``doc/`` directory for installation instructions and usage information. If you prefer you can also read the `documentation online`_. +.. _switch off API v2: https://github.com/blog/1090-github-api-moving-on +.. _remoteobjects: https://github.com/saymedia/remoteobjects +.. _micromodels: https://github.com/j4mie/micromodels .. _Github API: http://develop.github.com/ .. _documentation online: http://packages.python.org/github2 diff --git a/doc/index.rst b/doc/index.rst index fffa939..55814bf 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -13,6 +13,19 @@ ``github2`` - Github API v2 library for Python ============================================== +.. warning:: + + GitHub are planning to `switch off API v2`_ on 2012-05-01, you should + be looking to replace ``github2`` as soon as possible. + + Both remoteobjects_ and micromodels_ provide easy-to-use functionality for + creating bindings to remote APIs, and should significantly reduce the amount + of work needed in moving away from GitHub's API v2. + +.. _switch off API v2: https://github.com/blog/1090-github-api-moving-on +.. _remoteobjects: https://github.com/saymedia/remoteobjects +.. _micromodels: https://github.com/j4mie/micromodels + .. pypi-release:: github2 :prefix: Download :class: sidebar From 406dfb9700e33aae1189984d48a314617cb3a046 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Apr 2012 08:56:13 +0100 Subject: [PATCH 418/454] Added cligh to 'in the wild' doc. --- doc/wild.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/wild.rst b/doc/wild.rst index af21eed..c66abab 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -32,6 +32,13 @@ listed on this page. :PyPI page: :pypi:`bugwarrior` +``cligh`` +''''''''' + + A simple command-line interface to the facilities of GitHub. + +:Git repository: https://github.com/CMB/cligh + ``forkfeed`` '''''''''''' From a1d4f6d8812866685ac55754336258563ae79b30 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Apr 2012 08:58:29 +0100 Subject: [PATCH 419/454] Use 'project' for link references in wild doc. Didn't really like the 'Git repository' look. --- doc/wild.rst | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/wild.rst b/doc/wild.rst index c66abab..8a49b96 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -15,14 +15,14 @@ listed on this page. Applause when a bug gets closed. Extra cheering for old bugs. -:PyPI page: :pypi:`applause` +:PyPI project: :pypi:`applause` ``bitbucket2github`` '''''''''''''''''''' Mirrors all public repos of a BitBucket account to GitHub and vice versa. -:PyPI page: :pypi:`bitbucket2github` +:PyPI project: :pypi:`bitbucket2github` ``bugwarrior`` '''''''''''''' @@ -30,14 +30,14 @@ listed on this page. Pull tickets from github, bitbucket, and trac into `taskwarrior `__ -:PyPI page: :pypi:`bugwarrior` +:PyPI project: :pypi:`bugwarrior` ``cligh`` ''''''''' A simple command-line interface to the facilities of GitHub. -:Git repository: https://github.com/CMB/cligh +:GitHub project: https://github.com/CMB/cligh ``forkfeed`` '''''''''''' @@ -45,7 +45,7 @@ listed on this page. Utility to build atom feeds for all commits in all forks of your projects on GitHub. -:PyPI page: :pypi:`forkfeed` +:PyPI project: :pypi:`forkfeed` ``ghmiles`` ''''''''''' @@ -53,14 +53,14 @@ listed on this page. ``ghmiles`` is a Python library that generates a milestone model from the issues in a GitHub repository. -:PyPI page: :pypi:`ghmiles` +:PyPI project: :pypi:`ghmiles` ``ghsync`` '''''''''' GitHub Syncer. Clones or Pulls all GitHub repos. -:PyPI page: :pypi:`ghsync` +:PyPI project: :pypi:`ghsync` ``github-issues`` ''''''''''''''''' @@ -68,7 +68,7 @@ listed on this page. github-issues allows you to create, close, show, list, and comment on issues on your github project - that's it. -:Git repository: https://github.com/kashifrazzaqui/github-issues +:GitHub project: https://github.com/kashifrazzaqui/github-issues ``github-issues-export`` '''''''''''''''''''''''' @@ -76,14 +76,14 @@ listed on this page. Script to liberate issues from github issues in case you would like to have your data free. -:Git repository: https://github.com/mcepl/github-issues-export +:GitHub project: https://github.com/mcepl/github-issues-export ``github-plots`` '''''''''''''''' Alternative plots from GitHub stats. -:PyPI page: :pypi:`github-plots` +:PyPI project: :pypi:`github-plots` ``hubugs`` '''''''''' @@ -91,7 +91,7 @@ listed on this page. ``hubugs`` is a very simple client for working with `GitHub's issue tracker`_. -:PyPI page: :pypi:`hubugs` +:PyPI project: :pypi:`hubugs` .. _GitHub's issue tracker: http://github.com/blog/411-github-issue-tracker @@ -100,7 +100,7 @@ listed on this page. Shows stats on a given GitHub user. -:PyPI page: :pypi:`humble` +:PyPI project: :pypi:`humble` ``Repos.io`` '''''''''''' @@ -109,7 +109,7 @@ listed on this page. repositories (your own, and watched/liked/followed ones) hosted by different providers (github, bitbucket) -:Git repository: https://github.com/twidi/Repos.io +:GitHub project: https://github.com/twidi/Repos.io ``roundabout`` '''''''''''''' @@ -117,7 +117,7 @@ listed on this page. ``Roundabout`` is a tool that automatically prevents code with failing tests from being merged into a github repository. -:Git repository: https://github.com/ChristopherMacGown/roundabout +:GitHub project: https://github.com/ChristopherMacGown/roundabout .. _open an issue: https://github.com/ask/python-github2/issues/ .. _project website: https://github.com/ask/python-github2/blob/master/doc/wild.rst From 7319f330c0bebba89b306f65da8faedeb5be9762 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Sat, 14 Apr 2012 09:04:16 +0100 Subject: [PATCH 420/454] Document automatic proxy config with httplib2-0.7.4. Closes #75. --- doc/api/client.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index 4954148..f1a9e0c 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -42,9 +42,14 @@ API calls are limited by github.com to 1 per second by default. To have the >>> github = Github(username="ask", api_token=".......", ... requests_per_second=1) -If you wish to use a HTTP proxy you can pass in the ``proxy_host`` and -``proxy_port`` settings to enable it. The default for ``proxy_port``, if not -given, is 8080:: +By default, :pypi:`httplib2 (0.7.4)` will use the proxies set in the +:envvar:`http_proxy` andr :envvar:`https_proxy` environment variables. This +means that well configured systems shouldn't need any manual configuration for +proxy support. + +If you wish to manually configure a HTTP proxy you can pass in the +``proxy_host`` and ``proxy_port`` settings to enable it. The default for +``proxy_port``, if not given, is 8080:: >>> from github2.client import Github >>> github = Github(username="ask", api_token=".......", From 4c67559dc0676a0fa7a3ac2044b66f5c33d71da9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 30 Apr 2012 01:42:05 +0100 Subject: [PATCH 421/454] Fixed using bundled certs on supported OS. This would have failed in the case where an OS is supported, but the certs weren't available. --- github2/request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index c05394a..9aea264 100644 --- a/github2/request.py +++ b/github2/request.py @@ -56,7 +56,7 @@ elif path.exists(getenv('CURL_CA_BUNDLE', '')): CA_CERTS = getenv('CURL_CA_BUNDLE') CURL_CERTS = True -else: +if not SYSTEM_CERTS and not CURL_CERTS: CA_CERTS = path.join(path.dirname(path.abspath(__file__)), "DigiCert_High_Assurance_EV_Root_CA.crt") From 6432fe9c638c0bd68d4bc60ff9f6fc169f584148 Mon Sep 17 00:00:00 2001 From: modocache Date: Mon, 30 Apr 2012 20:01:10 +0900 Subject: [PATCH 422/454] Change enterprise URL in docs. Closes #76. --- doc/api/client.rst | 2 +- tests/test_unit.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/api/client.rst b/doc/api/client.rst index f1a9e0c..b11eaa8 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -61,6 +61,6 @@ https://github.com/. >>> from github2.client import Github >>> github = Github(username="modocache", api_token=".......", - ... github_url="http://git.gree-dev.net/") + ... github_url="http://your-github-enterprise-url.com/") .. _OAuth service: http://develop.github.com/p/oauth.html diff --git a/tests/test_unit.py b/tests/test_unit.py index 2e985a7..7cd3113 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -28,8 +28,9 @@ def test_default_host(self): assert_equals(client.request.github_url, 'https://github.com') def test_non_standard_host(self): - client = Github(github_url="http://git.gree-dev.net/") - assert_equals(client.request.github_url, 'http://git.gree-dev.net/') + client = Github(github_url="http://your-github-enterprise-url.com/") + assert_equals(client.request.github_url, + 'http://your-github-enterprise-url.com/') class RateLimits(utils.HttpMockTestCase): From 6eeeef96f877d44a8e54a75846617fa5b225b313 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 11:33:54 +0100 Subject: [PATCH 423/454] Add per-file licensing info. Removes a -10 'packaging smell', and basically for free with ucopy ;) --- .ucopy.cfg | 21 ++++++++++++ AUTHORS | 49 ++++++++++++++++------------ doc/.templates/layout.html | 7 ++++ doc/api/client.rst | 8 +++++ doc/api/commit.rst | 6 ++++ doc/api/core.rst | 6 ++++ doc/api/index.rst | 6 ++++ doc/api/issues.rst | 6 ++++ doc/api/network.rst | 6 ++++ doc/api/object.rst | 6 ++++ doc/api/organizations.rst | 6 ++++ doc/api/pull_requests.rst | 6 ++++ doc/api/repos.rst | 6 ++++ doc/api/request.rst | 6 ++++ doc/api/teams.rst | 6 ++++ doc/api/users.rst | 6 ++++ doc/bugs.rst | 6 ++++ doc/contributing.rst | 6 ++++ doc/index.rst | 9 ++--- doc/install.rst | 7 ++++ doc/license.rst | 6 ++++ doc/problems.rst | 6 ++++ doc/quickstart.rst | 6 ++++ doc/release.rst | 6 ++++ doc/wild.rst | 7 ++++ examples/friend-or-follow.py | 5 +++ github2/__init__.py | 6 ++++ github2/bin/__init__.py | 4 +++ github2/bin/manage_collaborators.py | 7 ++-- github2/bin/search_repos.py | 4 +++ github2/client.py | 15 +++++++++ github2/commits.py | 9 +++++ github2/core.py | 13 ++++++++ github2/issues.py | 10 ++++++ github2/organizations.py | 7 ++++ github2/pull_requests.py | 9 +++++ github2/repositories.py | 17 ++++++++++ github2/request.py | 21 ++++++++++++ github2/teams.py | 6 ++++ github2/users.py | 9 +++++ setup.py | 10 ++++++ tests/test_charset_header.py | 5 +++ tests/test_commits.py | 5 +++ tests/test_date_handling.py | 4 +++ tests/test_issues.py | 5 +++ tests/test_organizations.py | 5 +++ tests/test_pull_requests.py | 5 +++ tests/test_regression.py | 5 +++ tests/test_repositories.py | 7 ++++ tests/test_request.py | 5 +++ tests/test_teams.py | 5 +++ tests/test_tz_aware_date_handling.py | 4 +++ tests/test_unit.py | 7 ++++ tests/test_user.py | 5 +++ tests/utils.py | 5 +++ 55 files changed, 413 insertions(+), 27 deletions(-) create mode 100644 .ucopy.cfg diff --git a/.ucopy.cfg b/.ucopy.cfg new file mode 100644 index 0000000..530185a --- /dev/null +++ b/.ucopy.cfg @@ -0,0 +1,21 @@ +[repo] +name = python-github2 +license-from = bsd-3 +vcs = git + +[files] +ignore-from = git +ignore-glob = COPYING, README.rst, .keep, test/data/github.com,api* + +[patch] +unicode = python + +[author-override] +Ask Solem = +Chris Vale = +Claudio B. = +Daniel Greenfeld = +Donald von Stufft = +Michael Basnight = +Sameer Al-Sakran = +Stéphane Angel = diff --git a/AUTHORS b/AUTHORS index 99f5070..5e14ae3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,31 +1,38 @@ -Ask Solem -Mark Paschal -Donald von Stufft -Maximillian Dornseif +python-github2 was written by: + +Ask Solem + +with contributions from the following people: + +Adam Vandenberg Asheesh Laroia -Rick Harris -Cody Soyland -Fernando Perez -Evan Broder -Scott Torborg -Claudio B. +Barthelemy Dagenais Chris Vale -Adam Vandenberg -Kenneth Reitz +Christopher MacGown +Claudio B. +Cody Soyland Daniel Greenfeld +Donald von Stufft +Evan Broder +Fernando Perez +Ionuț Arțăriși +James Rowe +Jens Ohlig Jeremy Dunck Jonas Obrist -Sameer Al-Sakran -Vincent Driessen -James Rowe Josh Weinberg -Barthelemy Dagenais -Surajram Kumarave -broderboy -Patryk Zawadzki +Justin Quick +Kenneth Reitz +Mark Paschal +Maximillian Dornseif Michael Basnight -Christopher MacGown +Patryk Zawadzki +Rick Harris Rok Garbas -Ionuț Arțăriși +Sameer Al-Sakran +Scott Torborg Stéphane Angel +Surajram Kumaravel +Vincent Driessen +broderboy modocache diff --git a/doc/.templates/layout.html b/doc/.templates/layout.html index 3560b06..b251a03 100644 --- a/doc/.templates/layout.html +++ b/doc/.templates/layout.html @@ -1,3 +1,10 @@ +{# + Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. +#} {% extends "!layout.html" %} {% block extrahead %} diff --git a/doc/api/client.rst b/doc/api/client.rst index b11eaa8..1cf0ea9 100644 --- a/doc/api/client.rst +++ b/doc/api/client.rst @@ -1,3 +1,11 @@ +.. Copyright (C) 2011-2012 James Rowe + Michael Basnight + modocache + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.client Creating a client diff --git a/doc/api/commit.rst b/doc/api/commit.rst index e4a69bf..ffca1a2 100644 --- a/doc/api/commit.rst +++ b/doc/api/commit.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.commits Commit diff --git a/doc/api/core.rst b/doc/api/core.rst index 9b9e297..1e26d09 100644 --- a/doc/api/core.rst +++ b/doc/api/core.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.core Core diff --git a/doc/api/index.rst b/doc/api/index.rst index cbe2c5c..36fa3a0 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + API documentation ================= diff --git a/doc/api/issues.rst b/doc/api/issues.rst index 6ba740c..1f2dcfb 100644 --- a/doc/api/issues.rst +++ b/doc/api/issues.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.issues Issues diff --git a/doc/api/network.rst b/doc/api/network.rst index f07baa9..1d7312d 100644 --- a/doc/api/network.rst +++ b/doc/api/network.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. currentmodule:: github2.client Network diff --git a/doc/api/object.rst b/doc/api/object.rst index 79842c7..106b685 100644 --- a/doc/api/object.rst +++ b/doc/api/object.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. currentmodule:: github2.client Object diff --git a/doc/api/organizations.rst b/doc/api/organizations.rst index fc46950..b4fb0f6 100644 --- a/doc/api/organizations.rst +++ b/doc/api/organizations.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.organizations Organizations diff --git a/doc/api/pull_requests.rst b/doc/api/pull_requests.rst index 140a824..ee6f518 100644 --- a/doc/api/pull_requests.rst +++ b/doc/api/pull_requests.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.pull_requests Pull requests diff --git a/doc/api/repos.rst b/doc/api/repos.rst index 4f777ee..1d96337 100644 --- a/doc/api/repos.rst +++ b/doc/api/repos.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.repositories Repository diff --git a/doc/api/request.rst b/doc/api/request.rst index 0dd71f2..b3ffc49 100644 --- a/doc/api/request.rst +++ b/doc/api/request.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.request Requests diff --git a/doc/api/teams.rst b/doc/api/teams.rst index dc2102b..4e72746 100644 --- a/doc/api/teams.rst +++ b/doc/api/teams.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.teams Teams diff --git a/doc/api/users.rst b/doc/api/users.rst index 052092a..d9ac95d 100644 --- a/doc/api/users.rst +++ b/doc/api/users.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + .. module:: github2.users Users diff --git a/doc/bugs.rst b/doc/bugs.rst index 6105987..1c838a1 100644 --- a/doc/bugs.rst +++ b/doc/bugs.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Reporting bugs ============== diff --git a/doc/contributing.rst b/doc/contributing.rst index 8c3b47a..ad846be 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Contributing ============ diff --git a/doc/index.rst b/doc/index.rst index 55814bf..5b21867 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,7 +1,8 @@ -.. python-github2 documentation master file, created by - sphinx-quickstart on Mon Apr 11 16:16:25 2011. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. .. If you prefer you can also read the pre-built documentation at diff --git a/doc/install.rst b/doc/install.rst index 8d309ee..84b57de 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -1,3 +1,10 @@ +.. Copyright (C) 2011-2012 James Rowe + Michael Basnight + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Installation ------------ diff --git a/doc/license.rst b/doc/license.rst index 7e1c1b4..316b2ae 100644 --- a/doc/license.rst +++ b/doc/license.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + License ======= diff --git a/doc/problems.rst b/doc/problems.rst index 5fabddf..31d3052 100644 --- a/doc/problems.rst +++ b/doc/problems.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Solving problems ================ diff --git a/doc/quickstart.rst b/doc/quickstart.rst index bb41f5e..2d3988f 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2011-2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Quickstart ========== diff --git a/doc/release.rst b/doc/release.rst index b7baf79..745d419 100644 --- a/doc/release.rst +++ b/doc/release.rst @@ -1,3 +1,9 @@ +.. Copyright (C) 2012 James Rowe + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + Release HOWTO ============= diff --git a/doc/wild.rst b/doc/wild.rst index 8a49b96..07bd653 100644 --- a/doc/wild.rst +++ b/doc/wild.rst @@ -1,3 +1,10 @@ +.. Copyright (C) 2011-2012 James Rowe + Stéphane Angel + + This file is part of python-github2, and is licensed under the 3-clause BSD + License. See the LICENSE file in the top distribution directory for the full + license text. + In the wild ----------- diff --git a/examples/friend-or-follow.py b/examples/friend-or-follow.py index ccef96a..9a19b74 100644 --- a/examples/friend-or-follow.py +++ b/examples/friend-or-follow.py @@ -1,3 +1,8 @@ +# Copyright (C) 2010-2012 Ask Solem +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import sys import optparse from subprocess import Popen, PIPE diff --git a/github2/__init__.py b/github2/__init__.py index 30d323e..cf56247 100644 --- a/github2/__init__.py +++ b/github2/__init__.py @@ -1,4 +1,10 @@ "Github API v2 library for Python" +# Copyright (C) 2009-2012 Ask Solem +# James Rowe +# Maximillian Dornseif +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. from github2 import _version diff --git a/github2/bin/__init__.py b/github2/bin/__init__.py index 792d600..6c5b974 100644 --- a/github2/bin/__init__.py +++ b/github2/bin/__init__.py @@ -1 +1,5 @@ # +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 3efafee..6e320fb 100755 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -8,8 +8,11 @@ """ # Created by Maximillian Dornseif on 2009-12-31 for HUDORA. -# Copyright (c) 2009 HUDORA. All rights reserved. -# BSD licensed +# Copyright (C) 2009-2012 James Rowe +# Maximillian Dornseif +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. import logging import sys diff --git a/github2/bin/search_repos.py b/github2/bin/search_repos.py index c52be46..3064ff2 100755 --- a/github2/bin/search_repos.py +++ b/github2/bin/search_repos.py @@ -1,6 +1,10 @@ #! /usr/bin/env python # coding: utf-8 """github_search_repos - search for repositories on GitHub""" +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. import logging diff --git a/github2/client.py b/github2/client.py index c585f3b..122fdfa 100644 --- a/github2/client.py +++ b/github2/client.py @@ -1,3 +1,18 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# Christopher MacGown +# Evan Broder +# James Rowe +# Jeremy Dunck +# Michael Basnight +# Patryk Zawadzki +# Surajram Kumaravel +# Vincent Driessen +# modocache +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.request import GithubRequest from github2.issues import Issues from github2.repositories import Repositories diff --git a/github2/commits.py b/github2/commits.py index 8910937..f33a9e2 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# James Rowe +# Stéphane Angel +# Vincent Driessen +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, repr_string) diff --git a/github2/core.py b/github2/core.py index 856a489..67587f5 100644 --- a/github2/core.py +++ b/github2/core.py @@ -1,3 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# Fernando Perez +# James Rowe +# Mark Paschal +# Patryk Zawadzki +# Sameer Al-Sakran +# Stéphane Angel +# Vincent Driessen +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import logging import sys diff --git a/github2/issues.py b/github2/issues.py index 851f813..217a154 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -1,3 +1,13 @@ +# Copyright (C) 2009-2012 Adam Vandenberg +# Ask Solem +# Barthelemy Dagenais +# Fernando Perez +# James Rowe +# Scott Torborg +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + try: from urllib.parse import quote_plus # For Python 3 except ImportError: diff --git a/github2/organizations.py b/github2/organizations.py index 38eac83..cd99c03 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -1,3 +1,10 @@ +# Copyright (C) 2011-2012 James Rowe +# Patryk Zawadzki +# Rok Garbas +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, requires_auth) from github2.repositories import Repository diff --git a/github2/pull_requests.py b/github2/pull_requests.py index b75d62e..3137002 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2010-2012 Christopher MacGown +# Ionuț Arțăriși +# James Rowe +# Stéphane Angel +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, repr_string) diff --git a/github2/repositories.py b/github2/repositories.py index 89f8e57..6d206bf 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -1,3 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# Claudio B. +# Daniel Greenfeld +# James Rowe +# Jens Ohlig +# Jeremy Dunck +# Jonas Obrist +# Kenneth Reitz +# Mark Paschal +# Maximillian Dornseif +# Sameer Al-Sakran +# Stéphane Angel +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.core import (BaseData, GithubCommand, Attribute, DateAttribute, requires_auth) diff --git a/github2/request.py b/github2/request.py index 9aea264..7b400bf 100644 --- a/github2/request.py +++ b/github2/request.py @@ -1,3 +1,24 @@ +# Copyright (C) 2009-2012 Adam Vandenberg +# Asheesh Laroia +# Ask Solem +# Chris Vale +# Daniel Greenfeld +# Evan Broder +# James Rowe +# Jeremy Dunck +# Josh Weinberg +# Mark Paschal +# Maximillian Dornseif +# Michael Basnight +# Patryk Zawadzki +# Rick Harris +# Sameer Al-Sakran +# Vincent Driessen +# modocache +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import datetime import logging import re diff --git a/github2/teams.py b/github2/teams.py index b46116f..2472cf3 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -1,3 +1,9 @@ +# Copyright (C) 2011-2012 James Rowe +# Patryk Zawadzki +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from github2.core import BaseData, GithubCommand, Attribute, requires_auth from github2.repositories import Repository from github2.users import User diff --git a/github2/users.py b/github2/users.py index ad40fc1..e2c9c58 100644 --- a/github2/users.py +++ b/github2/users.py @@ -1,3 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# James Rowe +# Sameer Al-Sakran +# Stéphane Angel +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + try: from urllib.parse import quote_plus # For Python 3 except ImportError: diff --git a/setup.py b/setup.py index 8613f1f..06c56bb 100755 --- a/setup.py +++ b/setup.py @@ -1,5 +1,15 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +# Copyright (C) 2009-2012 Ask Solem +# Cody Soyland +# Donald von Stufft +# James Rowe +# Maximillian Dornseif +# Michael Basnight +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import codecs import sys diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py index 40aff70..3b29635 100644 --- a/tests/test_charset_header.py +++ b/tests/test_charset_header.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from nose.tools import assert_equals from github2.request import charset_from_headers diff --git a/tests/test_commits.py b/tests/test_commits.py index 5d4ee8e..20ed487 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from datetime import datetime from nose.tools import assert_equals diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index fabc8d5..855ccae 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -1,4 +1,8 @@ # -*- coding: utf-8 -*- +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. from datetime import datetime as dt diff --git a/tests/test_issues.py b/tests/test_issues.py index dfd693e..f82302b 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from datetime import datetime from nose.tools import assert_equals diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 9f4e56b..8571e23 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from datetime import datetime from nose.tools import (assert_equals, assert_true) diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 50197ce..9c2d35e 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from datetime import datetime from nose.tools import assert_equals diff --git a/tests/test_regression.py b/tests/test_regression.py index a2b235c..cad7dc2 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import httplib2 from nose.tools import assert_equals diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 63f39c0..1cdaab9 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -1,3 +1,10 @@ +# coding: utf-8 +# Copyright (C) 2011-2012 James Rowe +# Stéphane Angel +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import datetime from nose.tools import assert_equals diff --git a/tests/test_request.py b/tests/test_request.py index 7c7f93b..0833c00 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import unittest try: diff --git a/tests/test_teams.py b/tests/test_teams.py index 85689aa..7333edd 100644 --- a/tests/test_teams.py +++ b/tests/test_teams.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + from nose.tools import assert_equals import utils diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index 5789593..6a501f0 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -1,4 +1,8 @@ # -*- coding: utf-8 -*- +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. from datetime import datetime as dt diff --git a/tests/test_unit.py b/tests/test_unit.py index 7cd3113..f17f9a0 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -1,4 +1,11 @@ # -*- coding: utf-8 -*- +# Copyright (C) 2010-2012 Adam Vandenberg +# James Rowe +# Jeremy Dunck +# modocache +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. import datetime import unittest diff --git a/tests/test_user.py b/tests/test_user.py index aff6ad5..33929db 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import datetime from nose.tools import (assert_equals, assert_false, assert_true) diff --git a/tests/utils.py b/tests/utils.py index 78fb8c4..598b068 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,3 +1,8 @@ +# Copyright (C) 2011-2012 James Rowe +# +# This file is part of python-github2, and is made available under the 3-clause +# BSD license. See LICENSE for the full details. + import os import sys import unittest From cd436188df09605ad35deef5e80caec0cc9ca6f2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 11:39:18 +0100 Subject: [PATCH 424/454] [QA] Clean up the ignore list. --- .gitignore | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index ea2d6d3..241d83f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,17 @@ -.DS_Store -.coverage -.noseids -.ropeproject/ -.tox/ -*.py[co] -*~ -*.sqlite -*.sqlite-journal -settings_local.py -local_settings.py +*.egg-info/ + .*.sw[po] +*.py[co] + +build/ dist/ -*.egg-info doc/.build/ -build/ -locale/ +.ropeproject/ +.tox/ + +ChangeLog pip-log.txt + +.DS_Store +.coverage +.noseids From f5324acc71fda0792a1e7e54d7d9fb5c5aa1bb7e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:40:41 +0100 Subject: [PATCH 425/454] [QA] Use Git*H*ub for the service name. --- README.rst | 6 +++--- doc/index.rst | 8 ++++---- examples/friend-or-follow.py | 4 ++-- github2/client.py | 8 ++++---- github2/core.py | 6 +++--- github2/issues.py | 16 ++++++++-------- github2/pull_requests.py | 8 ++++---- github2/repositories.py | 24 ++++++++++++------------ github2/request.py | 4 ++-- github2/users.py | 20 ++++++++++---------- 10 files changed, 52 insertions(+), 52 deletions(-) diff --git a/README.rst b/README.rst index 3e6ab34..a266014 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ ================================================================================ -github2 - Github API v2 library for Python. +github2 - GitHub API v2 library for Python. ================================================================================ :Authors: @@ -16,7 +16,7 @@ github2 - Github API v2 library for Python. of work needed in moving away from GitHub's API v2. This is a Python library implementing all of the features available in version 2 -of the `Github API`_. +of the `GitHub API`_. See the ``doc/`` directory for installation instructions and usage information. If you prefer you can also read the `documentation online`_. @@ -24,7 +24,7 @@ If you prefer you can also read the `documentation online`_. .. _switch off API v2: https://github.com/blog/1090-github-api-moving-on .. _remoteobjects: https://github.com/saymedia/remoteobjects .. _micromodels: https://github.com/j4mie/micromodels -.. _Github API: http://develop.github.com/ +.. _GitHub API: http://develop.github.com/ .. _documentation online: http://packages.python.org/github2 License diff --git a/doc/index.rst b/doc/index.rst index 55814bf..93438c9 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -10,7 +10,7 @@ .. module:: github2 :synopsis: GitHub API v2 library for Python -``github2`` - Github API v2 library for Python +``github2`` - GitHub API v2 library for Python ============================================== .. warning:: @@ -31,15 +31,15 @@ :class: sidebar This is a Python library implementing all of the features available in version 2 -of the `Github API`_. +of the `GitHub API`_. -You should read the developer documentation for the `Github API`_ first. +You should read the developer documentation for the `GitHub API`_ first. :Git repository: https://github.com/ask/python-github2/ :Issue tracker: https://github.com/ask/python-github2/issues/ :Contributors: https://github.com/ask/python-github2/contributors/ -.. _Github API: http://develop.github.com/ +.. _GitHub API: http://develop.github.com/ Contents -------- diff --git a/examples/friend-or-follow.py b/examples/friend-or-follow.py index ccef96a..55b6b8d 100644 --- a/examples/friend-or-follow.py +++ b/examples/friend-or-follow.py @@ -10,10 +10,10 @@ OPTION_LIST = ( optparse.make_option('-t', '--api-token', default=None, action="store", dest="api_token", type="str", - help="Github API token. Default is to find this from git config"), + help="GitHub API token. Default is to find this from git config"), optparse.make_option('-u', '--api-user', default=None, action="store", dest="api_user", type="str", - help="Github Username. Default is to find this from git config"), + help="GitHub Username. Default is to find this from git config"), ) BY_LOWER = lambda value: value.lower() diff --git a/github2/client.py b/github2/client.py index c585f3b..a141879 100644 --- a/github2/client.py +++ b/github2/client.py @@ -59,7 +59,7 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, self.pull_requests = PullRequests(self.request) def project_for_user_repo(self, user, repo): - """Return Github identifier for a user's repository + """Return GitHub identifier for a user's repository :param str user: repository owner :param str repo: repository name @@ -97,7 +97,7 @@ def get_tree(self, project, tree_sha): return tree.get("tree", []) def get_network_meta(self, project): - """Get Github metadata associated with a project + """Get GitHub metadata associated with a project :param str project: GitHub project """ @@ -106,10 +106,10 @@ def get_network_meta(self, project): "network_meta"]), {}) def get_network_data(self, project, nethash, start=None, end=None): - """Get chunk of Github network data + """Get chunk of GitHub network data :param str project: GitHub project - :param str nethash: identifier provided by ``get_network_meta`` + :param str nethash: identifier provided by :meth:`get_network_meta` :param int start: optional start point for data :param int stop: optional end point for data """ diff --git a/github2/core.py b/github2/core.py index 856a489..a83dd6d 100644 --- a/github2/core.py +++ b/github2/core.py @@ -59,7 +59,7 @@ def wrapper(datetime_): @_handle_naive_datetimes def datetime_to_ghdate(datetime_): - """Convert Python datetime to Github date string + """Convert Python datetime to GitHub date string :param datetime datetime_: datetime object to convert """ @@ -68,7 +68,7 @@ def datetime_to_ghdate(datetime_): @_handle_naive_datetimes def datetime_to_commitdate(datetime_): - """Convert Python datetime to Github date string + """Convert Python datetime to GitHub date string :param datetime datetime_: datetime object to convert """ @@ -80,7 +80,7 @@ def datetime_to_commitdate(datetime_): def datetime_to_isodate(datetime_): - """Convert Python datetime to Github date string + """Convert Python datetime to GitHub date string :param str datetime_: datetime object to convert diff --git a/github2/issues.py b/github2/issues.py index 851f813..ae6ef48 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -86,7 +86,7 @@ def show(self, project, number): """Get all the data for issue by issue-number. :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database """ return self.get_value("show", project, str(number), filter="issue", datatype=Issue) @@ -108,7 +108,7 @@ def close(self, project, number): """Close an issue :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database """ return self.get_value("close", project, str(number), filter="issue", datatype=Issue, method="POST") @@ -120,7 +120,7 @@ def reopen(self, project, number): .. versionadded:: 0.3.0 :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database """ return self.get_value("reopen", project, str(number), filter="issue", datatype=Issue, method="POST") @@ -132,7 +132,7 @@ def edit(self, project, number, title, body): .. versionadded:: 0.3.0 :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database :param str title: title for issue :param str body: body for issue """ @@ -146,7 +146,7 @@ def add_label(self, project, number, label): """Add a label to an issue :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database :param str label: label to attach to issue """ return self.get_values("label/add", project, label, str(number), @@ -157,7 +157,7 @@ def remove_label(self, project, number, label): """Remove an existing label from an issue :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database :param str label: label to remove from issue """ return self.get_values("label/remove", project, label, str(number), @@ -168,7 +168,7 @@ def comment(self, project, number, comment): """Comment on an issue. :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database :param str comment: comment to attach to issue """ comment_data = {'comment': comment} @@ -180,7 +180,7 @@ def comments(self, project, number): """View comments on an issue. :param str project: GitHub project - :param int number: issue number in the Github database + :param int number: issue number in the GitHub database """ return self.get_values("comments", project, str(number), filter="comments", datatype=Comment) diff --git a/github2/pull_requests.py b/github2/pull_requests.py index b75d62e..fa13b48 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -53,7 +53,7 @@ def create(self, project, base, head, title=None, body=None, issue=None): issue. If an ``issue`` parameter is supplied the pull request is attached to that issue, else a new pull request is created. - :param str project: the Github project to send the pull request to + :param str project: the GitHub project to send the pull request to :param str base: branch changes should be pulled into :param str head: branch of the changes to be pulled :param str title: title for pull request @@ -78,8 +78,8 @@ def create(self, project, base, head, title=None, body=None, issue=None): def show(self, project, number): """Show a single pull request - :param str project: Github project - :param int number: pull request number in the Github database + :param str project: GitHub project + :param int number: pull request number in the GitHub database """ return self.get_value(project, str(number), filter="pull", datatype=PullRequest) @@ -87,7 +87,7 @@ def show(self, project, number): def list(self, project, state="open", page=1): """List all pull requests for a project - :param str project: Github project + :param str project: GitHub project :param str state: can be either ``open`` or ``closed`` :param int page: optional page number """ diff --git a/github2/repositories.py b/github2/repositories.py index 89f8e57..501ffbb 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -73,7 +73,7 @@ def list(self, user=None, page=1): logged-in user when ``user`` wasn't supplied. This functionality is brittle and will be removed in a future release! - :param str user: Github user name to list repositories for + :param str user: GitHub user name to list repositories for :param int page: optional page number """ user = user or self.request.username @@ -160,8 +160,8 @@ def list_collaborators(self, project): def add_collaborator(self, project, username): """Adds an add_collaborator to a repo - :param str project: Github project - :param str username: Github user to add as collaborator + :param str project: GitHub project + :param str username: GitHub user to add as collaborator """ return self.make_request("collaborators", project, "add", username, method="POST") @@ -170,8 +170,8 @@ def add_collaborator(self, project, username): def remove_collaborator(self, project, username): """Removes an add_collaborator from a repo - :param str project: Github project - :param str username: Github user to add as collaborator + :param str project: GitHub project + :param str username: GitHub user to add as collaborator """ return self.make_request("collaborators", project, "remove", username, method="POST") @@ -179,7 +179,7 @@ def remove_collaborator(self, project, username): def network(self, project): """Get network data for project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "network", filter="network", datatype=Repository) @@ -187,7 +187,7 @@ def network(self, project): def languages(self, project): """Get programming language data for project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "languages", filter="languages") @@ -195,28 +195,28 @@ def languages(self, project): def tags(self, project): """Get tags for project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "tags", filter="tags") def branches(self, project): """Get branch names for project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "branches", filter="branches") def watchers(self, project): """Get list of watchers for project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "watchers", filter="watchers") def watching(self, for_user=None, page=None): """Lists all the repos a user is watching - :param str for_user: optional Github user name to list repositories for + :param str for_user: optional GitHub user name to list repositories for :param int page: optional page number """ for_user = for_user or self.request.username @@ -226,7 +226,7 @@ def watching(self, for_user=None, page=None): def list_contributors(self, project): """Lists all the contributors in a project - :param str project: Github project + :param str project: GitHub project """ return self.get_values("show", project, "contributors", filter="contributors", datatype=User) diff --git a/github2/request.py b/github2/request.py index 9aea264..c05ea97 100644 --- a/github2/request.py +++ b/github2/request.py @@ -81,11 +81,11 @@ def charset_from_headers(headers): class GithubError(Exception): - """An error occurred when making a request to the Github API.""" + """An error occurred when making a request to the GitHub API.""" class HttpError(RuntimeError): - """A HTTP error occured when making a request to the Github API.""" + """A HTTP error occured when making a request to the GitHub API.""" def __init__(self, message, content, code): """Create a HttpError exception diff --git a/github2/users.py b/github2/users.py index ad40fc1..d6fd9ac 100644 --- a/github2/users.py +++ b/github2/users.py @@ -73,42 +73,42 @@ def search_by_email(self, query): @enhanced_by_auth def show(self, username): - """Get information on Github user + """Get information on GitHub user if ``username`` is ``None`` or an empty string information for the currently authenticated user is returned. - :param str username: Github user name + :param str username: GitHub user name """ return self.get_value("show", username, filter="user", datatype=User) def followers(self, username): - """Get list of Github user's followers + """Get list of GitHub user's followers - :param str username: Github user name + :param str username: GitHub user name """ return self.get_values("show", username, "followers", filter="users") def following(self, username): - """Get list of users a Github user is following + """Get list of users a GitHub user is following - :param str username: Github user name + :param str username: GitHub user name """ return self.get_values("show", username, "following", filter="users") @requires_auth def follow(self, other_user): - """Follow a Github user + """Follow a GitHub user - :param str other_user: Github user name + :param str other_user: GitHub user name """ return self.get_values("follow", other_user, method="POST") @requires_auth def unfollow(self, other_user): - """Unfollow a Github user + """Unfollow a GitHub user - :param str other_user: Github user name + :param str other_user: GitHub user name """ return self.get_values("unfollow", other_user, method="POST") From 71f17c902f8a90d2aaffa06c9e40cd521941716e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:41:05 +0100 Subject: [PATCH 426/454] [QA] Function notes come before param docs. --- github2/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/github2/core.py b/github2/core.py index a83dd6d..3aed7c1 100644 --- a/github2/core.py +++ b/github2/core.py @@ -82,9 +82,10 @@ def datetime_to_commitdate(datetime_): def datetime_to_isodate(datetime_): """Convert Python datetime to GitHub date string + .. note:: Supports naive and timezone-aware datetimes + :param str datetime_: datetime object to convert - .. note:: Supports naive and timezone-aware datetimes """ if not datetime_.tzinfo: datetime_ = datetime_.replace(tzinfo=tz.tzutc()) From 6dcda6be8047f1672ed598a141ef4e7ac7d3711e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:41:23 +0100 Subject: [PATCH 427/454] Fixed broken deprecated Sphinx directive. --- github2/repositories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github2/repositories.py b/github2/repositories.py index 501ffbb..2d52fed 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -68,7 +68,7 @@ def pushable(self): def list(self, user=None, page=1): """Return a list of all repositories for a user. - .. deprecated: 0.4.0 + .. deprecated:: 0.4.0 Previous releases would attempt to display repositories for the logged-in user when ``user`` wasn't supplied. This functionality is brittle and will be removed in a future release! From 3a820369c94e9c521a7221cd12efca50abaa6ba1 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:47:16 +0100 Subject: [PATCH 428/454] [QA] Minor grammar fix in contributing doc. More fixes always welcome. --- doc/contributing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/contributing.rst b/doc/contributing.rst index 8c3b47a..7c71bb2 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -4,9 +4,9 @@ Contributing Patches for :mod:`github2` are most welcome! Forks on GitHub_ and patches attached to issues are both great ways to -contribute. If you're comfortable with ``git`` using a fork hosted on GitHub is -probably the simpler solution, both for the package maintainers and you as a -contributor. +contribute. If you're comfortable with ``git`` then using a fork hosted on +GitHub is probably the simpler solution, both for the :mod:`github2` maintainers +and for you as a contributor. Following the simple guidelines below makes it easier to review and integrate your changes: From ec36b5772085c908d600f2171d622bfd690d7a2d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:23:44 +0100 Subject: [PATCH 429/454] [QA] Follow PEP 257 whitespace rules. --- github2/bin/manage_collaborators.py | 4 ++- github2/bin/search_repos.py | 4 ++- github2/client.py | 10 +++++-- github2/commits.py | 2 ++ github2/core.py | 21 ++++++++++++++- github2/issues.py | 20 +++++++++++--- github2/organizations.py | 6 +++++ github2/pull_requests.py | 11 ++++++-- github2/repositories.py | 41 ++++++++++++++++++++++------- github2/request.py | 9 +++++-- github2/teams.py | 10 +++++++ github2/users.py | 22 +++++++++++----- 12 files changed, 131 insertions(+), 29 deletions(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 3efafee..5e585d2 100755 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -26,7 +26,9 @@ def print_(text): """Python 2 & 3 compatible print function - We support <2.6, so can't use __future__.print_function""" + We support <2.6, so can't use __future__.print_function + + """ if PY3K: print(text) else: diff --git a/github2/bin/search_repos.py b/github2/bin/search_repos.py index c52be46..737caa2 100755 --- a/github2/bin/search_repos.py +++ b/github2/bin/search_repos.py @@ -19,7 +19,9 @@ def print_(text): """Python 2 & 3 compatible print function - We support <2.6, so can't use __future__.print_function""" + We support <2.6, so can't use __future__.print_function + + """ if PY3K: print(text) else: diff --git a/github2/client.py b/github2/client.py index a141879..7b3d8eb 100644 --- a/github2/client.py +++ b/github2/client.py @@ -13,8 +13,7 @@ class Github(object): def __init__(self, username=None, api_token=None, requests_per_second=None, access_token=None, cache=None, proxy_host=None, proxy_port=8080, github_url=None): - """ - An interface to GitHub's API: + """An interface to GitHub's API: http://develop.github.com/ .. versionadded:: 0.2.0 @@ -42,6 +41,7 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, default to 8080 if a proxy_host is set and no port is set). :param str github_url: the hostname to connect to, for GitHub Enterprise support + """ self.request = GithubRequest(username=username, api_token=api_token, @@ -63,6 +63,7 @@ def project_for_user_repo(self, user, repo): :param str user: repository owner :param str repo: repository name + """ return "/".join([user, repo]) @@ -73,6 +74,7 @@ def get_all_blobs(self, project, tree_sha): :param str project: GitHub project :param str tree_sha: object ID of tree + """ blobs = self.request.get("blob/all", project, tree_sha) return blobs.get("blobs") @@ -83,6 +85,7 @@ def get_blob_info(self, project, tree_sha, path): :param str project: GitHub project :param str tree_sha: object ID of tree :param str path: path within tree to fetch blob for + """ blob = self.request.get("blob/show", project, tree_sha, path) return blob.get("blob") @@ -92,6 +95,7 @@ def get_tree(self, project, tree_sha): :param str project: GitHub project :param str tree_sha: object ID of tree + """ tree = self.request.get("tree/show", project, tree_sha) return tree.get("tree", []) @@ -100,6 +104,7 @@ def get_network_meta(self, project): """Get GitHub metadata associated with a project :param str project: GitHub project + """ return self.request.raw_request("/".join([self.request.github_url, project, @@ -112,6 +117,7 @@ def get_network_data(self, project, nethash, start=None, end=None): :param str nethash: identifier provided by :meth:`get_network_meta` :param int start: optional start point for data :param int stop: optional end point for data + """ data = {"nethash": nethash} if start: diff --git a/github2/commits.py b/github2/commits.py index 8910937..7030a40 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -39,6 +39,7 @@ def list(self, project, branch="master", file=None, page=1): :param str branch: branch name, or ``master`` if not given :param str file: optional file filter :param int page: optional page number + """ return self.get_values("list", project, branch, file, filter="commits", datatype=Commit, page=page) @@ -48,6 +49,7 @@ def show(self, project, sha): :param str project: project name :param str sha: commit id + """ return self.get_value("show", project, sha, filter="commit", datatype=Commit) diff --git a/github2/core.py b/github2/core.py index 3aed7c1..e783456 100644 --- a/github2/core.py +++ b/github2/core.py @@ -30,6 +30,7 @@ def string_to_datetime(string): """Convert a string to Python datetime :param str github_date: date string to parse + """ parsed = parser.parse(string) if NAIVE: @@ -41,6 +42,7 @@ def _handle_naive_datetimes(f): """Decorator to make datetime arguments use GitHub timezone :param func f: Function to wrap + """ def wrapper(datetime_): if not datetime_.tzinfo: @@ -62,6 +64,7 @@ def datetime_to_ghdate(datetime_): """Convert Python datetime to GitHub date string :param datetime datetime_: datetime object to convert + """ return datetime_.strftime(GITHUB_DATE_FORMAT) @@ -71,6 +74,7 @@ def datetime_to_commitdate(datetime_): """Convert Python datetime to GitHub date string :param datetime datetime_: datetime object to convert + """ date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT) utcoffset = GITHUB_TZ.utcoffset(datetime_) @@ -95,7 +99,8 @@ def datetime_to_isodate(datetime_): class AuthError(Exception): - """Requires authentication""" + + """Requires authentication.""" def requires_auth(f): @@ -105,6 +110,7 @@ def requires_auth(f): :param func f: Function to wrap :raises AuthError: If function called without an authenticated session + """ # When Python 2.4 support is dropped move straight to functools.wraps, # don't pass go and don't collect $200. @@ -129,6 +135,7 @@ def enhanced_by_auth(f): introspection. :param func f: Function to wrap + """ f.enhanced_by_auth = True f.__doc__ += """\n.. note:: This call is enhanced with authentication""" @@ -141,6 +148,7 @@ def __init__(self, request): """Main API binding interface :param github2.request.GithubRequest request: HTTP request handler + """ self.request = request @@ -155,6 +163,7 @@ def make_request(self, command, *args, **kwargs): data * The value of a ``page`` argument will be used to fetch a specific page of results, default of 1 is assumed if not given + """ filter = kwargs.get("filter") post_data = kwargs.get("post_data") or {} @@ -182,6 +191,7 @@ def get_value(self, *args, **kwargs): If a ``datatype`` parameter is given it defines the :class:`BaseData`-derived class we should build from the provided data + """ datatype = kwargs.pop("datatype", None) value = self.make_request(*args, **kwargs) @@ -200,6 +210,7 @@ def get_values(self, *args, **kwargs): """Process a multi-value response from the API :see: :meth:`get_value` + """ datatype = kwargs.pop("datatype", None) values = self.make_request(*args, **kwargs) @@ -221,6 +232,7 @@ def doc_generator(docstring, attributes): :param str docstring: docstring to augment :param dict attributes: attributes to add to docstring + """ docstring = docstring or "" @@ -237,6 +249,7 @@ def __init__(self, help): """Generic object attribute for use with :class:`BaseData` :param str help: Attribute description + """ self.help = help @@ -260,6 +273,7 @@ def __init__(self, *args, **kwargs): :param str format: The date format to support, see :data:`convertor_for_format` for supported options + """ self.format = kwargs.pop("format", self.format) super(DateAttribute, self).__init__(*args, **kwargs) @@ -318,12 +332,15 @@ class BaseData(BaseDataType('BaseData', (object, ), {})): .. warning:: Supports subscript attribute access purely for backwards compatibility, you shouldn't rely on that functionality in new code + """ + def __getitem__(self, key): """Access objects's attribute using subscript notation This is here purely to maintain compatibility when switching ``dict`` responses to ``BaseData`` derived objects. + """ LOGGER.warning("Subscript access on %r is deprecated, use object " "attributes" % self.__class__.__name__, @@ -336,6 +353,7 @@ def __setitem__(self, key, value): """Update object's attribute using subscript notation :see: :meth:`BaseData.__getitem__` + """ LOGGER.warning("Subscript access on %r is deprecated, use object " "attributes" % self.__class__.__name__, @@ -350,6 +368,7 @@ def repr_string(string): :param str string: string to operate on :return: string, with maximum length of 20 characters + """ if len(string) > 20: string = string[:17] + '...' diff --git a/github2/issues.py b/github2/issues.py index ae6ef48..ad7aa35 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -49,6 +49,7 @@ def search(self, project, term, state="open"): :param str project: GitHub project :param str term: term to search issues for :param str state: can be either ``open`` or ``closed``. + """ return self.get_values("search", project, state, quote_plus(term), filter="issues", datatype=Issue) @@ -58,6 +59,7 @@ def list(self, project, state="open"): :param str project: GitHub project :param str state: can be either ``open`` or ``closed``. + """ return self.get_values("list", project, state, filter="issues", datatype=Issue) @@ -69,6 +71,7 @@ def list_by_label(self, project, label): :param str project: GitHub project :param str label: a string representing a label (e.g., ``bug``). + """ return self.get_values("list", project, "label", label, filter="issues", datatype=Issue) @@ -79,6 +82,7 @@ def list_labels(self, project): .. versionadded:: 0.3.0 :param str project: GitHub project + """ return self.get_values("labels", project, filter="labels") @@ -86,7 +90,8 @@ def show(self, project, number): """Get all the data for issue by issue-number. :param str project: GitHub project - :param int number: issue number in the GitHub database + :param int number: issue number in the Github database + """ return self.get_value("show", project, str(number), filter="issue", datatype=Issue) @@ -98,6 +103,7 @@ def open(self, project, title, body): :param str project: GitHub project :param str title: title for issue :param str body: body for issue + """ issue_data = {"title": title, "body": body} return self.get_value("open", project, post_data=issue_data, @@ -108,7 +114,8 @@ def close(self, project, number): """Close an issue :param str project: GitHub project - :param int number: issue number in the GitHub database + :param int number: issue number in the Github database + """ return self.get_value("close", project, str(number), filter="issue", datatype=Issue, method="POST") @@ -120,7 +127,8 @@ def reopen(self, project, number): .. versionadded:: 0.3.0 :param str project: GitHub project - :param int number: issue number in the GitHub database + :param int number: issue number in the Github database + """ return self.get_value("reopen", project, str(number), filter="issue", datatype=Issue, method="POST") @@ -135,6 +143,7 @@ def edit(self, project, number, title, body): :param int number: issue number in the GitHub database :param str title: title for issue :param str body: body for issue + """ issue_data = {"title": title, "body": body} return self.get_value("edit", project, str(number), @@ -148,6 +157,7 @@ def add_label(self, project, number, label): :param str project: GitHub project :param int number: issue number in the GitHub database :param str label: label to attach to issue + """ return self.get_values("label/add", project, label, str(number), filter="labels", method="POST") @@ -159,6 +169,7 @@ def remove_label(self, project, number, label): :param str project: GitHub project :param int number: issue number in the GitHub database :param str label: label to remove from issue + """ return self.get_values("label/remove", project, label, str(number), filter="labels", method="POST") @@ -170,6 +181,7 @@ def comment(self, project, number, comment): :param str project: GitHub project :param int number: issue number in the GitHub database :param str comment: comment to attach to issue + """ comment_data = {'comment': comment} return self.get_value("comment", project, str(number), @@ -180,7 +192,7 @@ def comments(self, project, number): """View comments on an issue. :param str project: GitHub project - :param int number: issue number in the GitHub database + """ return self.get_values("comments", project, str(number), filter="comments", datatype=Comment) diff --git a/github2/organizations.py b/github2/organizations.py index 38eac83..8baa328 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -42,6 +42,7 @@ def show(self, organization): """Get information on organization :param str organization: organization to show + """ return self.get_value(organization, filter="organization", datatype=Organization) @@ -58,6 +59,7 @@ def repositories(self, organization=''): repositories for all organizations the authenticated user belongs to. :param: str organization: organization to list repositories for + """ return self.get_values(organization, 'repositories', filter="repositories", datatype=Repository) @@ -66,6 +68,7 @@ def public_repositories(self, organization): """Get list of public repositories in an organization :param str organization: organization to list public repositories for + """ return self.get_values(organization, 'public_repositories', filter="repositories", datatype=Repository) @@ -74,6 +77,7 @@ def public_members(self, organization): """Get list of public members in an organization :param str organization: organization to list members for + """ return self.get_values(organization, 'public_members', filter="users", datatype=User) @@ -82,6 +86,7 @@ def teams(self, organization): """Get list of teams in an organization :param str organization: organization to list teams for + """ return self.get_values(organization, 'teams', filter="teams", datatype=Team) @@ -94,6 +99,7 @@ def add_team(self, organization, name, permission='pull', projects=None): :param str team: name of team to add :param str permission: permissions for team(push, pull or admin) :param list projects: optional GitHub projects for this team + """ team_data = {'team[name]': name, 'team[permission]': permission} if projects: diff --git a/github2/pull_requests.py b/github2/pull_requests.py index fa13b48..9a0ba58 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -6,7 +6,9 @@ class PullRequest(BaseData): """Pull request encapsulation .. versionadded:: 0.5.0 + """ + state = Attribute("The pull request state") base = Attribute("The base repo") head = Attribute("The head of the pull request") @@ -43,7 +45,9 @@ class PullRequests(GithubCommand): """Operations on pull requests .. versionadded:: 0.5.0 + """ + domain = "pulls" def create(self, project, base, head, title=None, body=None, issue=None): @@ -59,6 +63,7 @@ def create(self, project, base, head, title=None, body=None, issue=None): :param str title: title for pull request :param str body: optional body for pull request :param str issue: existing issue to attach pull request to + """ post_data = {"base": base, "head": head} if issue: @@ -78,8 +83,9 @@ def create(self, project, base, head, title=None, body=None, issue=None): def show(self, project, number): """Show a single pull request - :param str project: GitHub project - :param int number: pull request number in the GitHub database + :param str project: Github project + :param int number: pull request number in the Github database + """ return self.get_value(project, str(number), filter="pull", datatype=PullRequest) @@ -90,6 +96,7 @@ def list(self, project, state="open", page=1): :param str project: GitHub project :param str state: can be either ``open`` or ``closed`` :param int page: optional page number + """ return self.get_values(project, state, filter="pulls", datatype=PullRequest, page=page) diff --git a/github2/repositories.py b/github2/repositories.py index 2d52fed..4f9b0cf 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -44,6 +44,7 @@ def search(self, query): Returns at most 100 repositories :param str query: term to search issues for + """ return self.get_values("search", query, filter="repositories", datatype=Repository) @@ -52,6 +53,7 @@ def show(self, project): """Get repository object for project. :param str project: GitHub project + """ return self.get_value("show", project, filter="repository", datatype=Repository) @@ -61,6 +63,7 @@ def pushable(self): """Return a list of repos you can push to that are not your own. .. versionadded:: 0.3.0 + """ return self.get_values("pushable", filter="repositories", datatype=Repository) @@ -75,6 +78,7 @@ def list(self, user=None, page=1): :param str user: GitHub user name to list repositories for :param int page: optional page number + """ user = user or self.request.username return self.get_values("show", user, filter="repositories", @@ -85,6 +89,7 @@ def watch(self, project): """Watch a project :param str project: GitHub project + """ return self.get_value("watch", project, filter='repository', datatype=Repository) @@ -94,6 +99,7 @@ def unwatch(self, project): """Unwatch a project :param str project: GitHub project + """ return self.get_value("unwatch", project, filter='repository', datatype=Repository) @@ -103,6 +109,7 @@ def fork(self, project): """Fork a project :param str project: GitHub project + """ return self.get_value("fork", project, filter="repository", datatype=Repository) @@ -115,6 +122,7 @@ def create(self, project, description=None, homepage=None, public=True): :param str description: optional project description :param str homepage: optional project homepage :param bool public: whether to make a public project + """ repo_data = {"name": project, "description": description, "homepage": homepage, "public": str(int(public))} @@ -126,6 +134,7 @@ def delete(self, project): """Delete a repository :param str project: project name to delete + """ # Two-step delete mechanism. We must echo the delete_token value back # to GitHub to actually delete a repository @@ -137,6 +146,7 @@ def set_private(self, project): """Mark repository as private :param str project: project name to set as private + """ return self.make_request("set/private", project) @@ -145,6 +155,7 @@ def set_public(self, project): """Mark repository as public :param str project: project name to set as public + """ return self.make_request("set/public", project) @@ -152,6 +163,7 @@ def list_collaborators(self, project): """Lists all the collaborators in a project :param str project: GitHub project + """ return self.get_values("show", project, "collaborators", filter="collaborators") @@ -160,8 +172,9 @@ def list_collaborators(self, project): def add_collaborator(self, project, username): """Adds an add_collaborator to a repo - :param str project: GitHub project - :param str username: GitHub user to add as collaborator + :param str project: Github project + :param str username: Github user to add as collaborator + """ return self.make_request("collaborators", project, "add", username, method="POST") @@ -170,8 +183,9 @@ def add_collaborator(self, project, username): def remove_collaborator(self, project, username): """Removes an add_collaborator from a repo - :param str project: GitHub project - :param str username: GitHub user to add as collaborator + :param str project: Github project + :param str username: Github user to add as collaborator + """ return self.make_request("collaborators", project, "remove", username, method="POST") @@ -179,7 +193,8 @@ def remove_collaborator(self, project, username): def network(self, project): """Get network data for project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "network", filter="network", datatype=Repository) @@ -187,7 +202,8 @@ def network(self, project): def languages(self, project): """Get programming language data for project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "languages", filter="languages") @@ -195,21 +211,24 @@ def languages(self, project): def tags(self, project): """Get tags for project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "tags", filter="tags") def branches(self, project): """Get branch names for project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "branches", filter="branches") def watchers(self, project): """Get list of watchers for project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "watchers", filter="watchers") @@ -218,6 +237,7 @@ def watching(self, for_user=None, page=None): :param str for_user: optional GitHub user name to list repositories for :param int page: optional page number + """ for_user = for_user or self.request.username return self.get_values("watched", for_user, filter="repositories", @@ -226,7 +246,8 @@ def watching(self, for_user=None, page=None): def list_contributors(self, project): """Lists all the contributors in a project - :param str project: GitHub project + :param str project: Github project + """ return self.get_values("show", project, "contributors", filter="contributors", datatype=User) diff --git a/github2/request.py b/github2/request.py index c05ea97..12a9363 100644 --- a/github2/request.py +++ b/github2/request.py @@ -71,6 +71,7 @@ def charset_from_headers(headers): :param httplib2.Response headers: Request headers :return: Defined encoding, or default to ASCII + """ match = re.search("charset=([^ ;]+)", headers.get('content-type', "")) if match: @@ -81,17 +82,21 @@ def charset_from_headers(headers): class GithubError(Exception): - """An error occurred when making a request to the GitHub API.""" + + """An error occurred when making a request to the Github API.""" class HttpError(RuntimeError): - """A HTTP error occured when making a request to the GitHub API.""" + + """A HTTP error occured when making a request to the Github API.""" + def __init__(self, message, content, code): """Create a HttpError exception :param str message: Exception string :param str content: Full content of HTTP request :param int code: HTTP status code + """ self.args = (message, content, code) self.message = message diff --git a/github2/teams.py b/github2/teams.py index b46116f..c2c7945 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -4,7 +4,9 @@ class Team(BaseData): + """.. versionadded:: 0.4.0""" + id = Attribute("The team id") name = Attribute("Name of the team") permission = Attribute("Permissions of the team") @@ -14,13 +16,16 @@ def __repr__(self): class Teams(GithubCommand): + """.. versionadded:: 0.4.0""" + domain = "teams" def show(self, team_id): """Get information on team_id :param int team_id: team to get information for + """ return self.get_value(str(team_id), filter="team", datatype=Team) @@ -28,6 +33,7 @@ def members(self, team_id): """Get list of all team members :param int team_id: team to get information for + """ return self.get_values(str(team_id), "members", filter="users", datatype=User) @@ -38,6 +44,7 @@ def add_member(self, team_id, username): :param int team_id: team to add new member to :param str username: GitHub username to add to team + """ return self.get_values(str(team_id), 'members', method='POST', post_data={'name': username}, filter='users', @@ -47,6 +54,7 @@ def repositories(self, team_id): """Get list of all team repositories :param int team_id: team to get information for + """ return self.get_values(str(team_id), "repositories", filter="repositories", datatype=Repository) @@ -57,6 +65,7 @@ def add_project(self, team_id, project): :param int team_id: team to add repository to :param str project: GitHub project + """ if isinstance(project, Repository): project = project.project @@ -70,6 +79,7 @@ def remove_project(self, team_id, project): :param int team_id: team to remove project from :param str project: GitHub project + """ if isinstance(project, Repository): project = project.project diff --git a/github2/users.py b/github2/users.py index d6fd9ac..50b761e 100644 --- a/github2/users.py +++ b/github2/users.py @@ -43,7 +43,9 @@ class User(BaseData): def is_authenticated(self): """Test for user authentication - :return bool: ``True`` if user is authenticated""" + :return bool: ``True`` if user is authenticated + + """ return self.plan is not None def __repr__(self): @@ -60,6 +62,7 @@ def search(self, query): Returns at most 100 users :param str query: term to search for + """ return self.get_values("search", quote_plus(query), filter="users", datatype=User) @@ -68,6 +71,7 @@ def search_by_email(self, query): """Search for users by email address :param str query: email to search for + """ return self.get_value("email", query, filter="user", datatype=User) @@ -78,21 +82,23 @@ def show(self, username): if ``username`` is ``None`` or an empty string information for the currently authenticated user is returned. - :param str username: GitHub user name + """ return self.get_value("show", username, filter="user", datatype=User) def followers(self, username): """Get list of GitHub user's followers - :param str username: GitHub user name + :param str username: Github user name + """ return self.get_values("show", username, "followers", filter="users") def following(self, username): """Get list of users a GitHub user is following - :param str username: GitHub user name + :param str username: Github user name + """ return self.get_values("show", username, "following", filter="users") @@ -100,7 +106,8 @@ def following(self, username): def follow(self, other_user): """Follow a GitHub user - :param str other_user: GitHub user name + :param str other_user: Github user name + """ return self.get_values("follow", other_user, method="POST") @@ -108,7 +115,8 @@ def follow(self, other_user): def unfollow(self, other_user): """Unfollow a GitHub user - :param str other_user: GitHub user name + :param str other_user: Github user name + """ return self.get_values("unfollow", other_user, method="POST") @@ -123,6 +131,7 @@ def add_key(self, key, title=''): :param str key: SSH key identifier :param str title: Optional title for the SSH key + """ return self.get_values("key/add", post_data={'key': key, 'title': title}, @@ -134,6 +143,7 @@ def remove_key(self, key_id): """Remove a SSH key for the authenticated user :param int key_id: SSH key's GitHub identifier + """ return self.get_values('key/remove', post_data={'id': str(key_id)}, filter='public_keys', datatype=Key) From d4441b921c83437bd65cf62df6170224dc6e6fee Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:28:50 +0100 Subject: [PATCH 430/454] [QA] Use PEP 257 punctuation guidelines. --- github2/bin/manage_collaborators.py | 6 ++--- github2/bin/search_repos.py | 6 ++--- github2/client.py | 12 ++++----- github2/commits.py | 4 +-- github2/core.py | 40 ++++++++++++++--------------- github2/issues.py | 16 ++++++------ github2/organizations.py | 14 +++++----- github2/pull_requests.py | 10 ++++---- github2/repositories.py | 34 ++++++++++++------------ github2/request.py | 4 +-- github2/teams.py | 12 ++++----- github2/users.py | 22 ++++++++-------- 12 files changed, 90 insertions(+), 90 deletions(-) diff --git a/github2/bin/manage_collaborators.py b/github2/bin/manage_collaborators.py index 5e585d2..79da700 100755 --- a/github2/bin/manage_collaborators.py +++ b/github2/bin/manage_collaborators.py @@ -24,7 +24,7 @@ def print_(text): - """Python 2 & 3 compatible print function + """Python 2 & 3 compatible print function. We support <2.6, so can't use __future__.print_function @@ -36,7 +36,7 @@ def print_(text): def parse_commandline(): - """Parse the comandline and return parsed options.""" + """Parse the command line and return parsed options.""" parser = OptionParser() parser.description = __doc__ @@ -75,7 +75,7 @@ def parse_commandline(): def main(): - """This implements the actual program functionality""" + """Implement the actual program functionality.""" options, args = parse_commandline() diff --git a/github2/bin/search_repos.py b/github2/bin/search_repos.py index 737caa2..895d874 100755 --- a/github2/bin/search_repos.py +++ b/github2/bin/search_repos.py @@ -17,7 +17,7 @@ def print_(text): - """Python 2 & 3 compatible print function + """Python 2 & 3 compatible print function. We support <2.6, so can't use __future__.print_function @@ -29,7 +29,7 @@ def print_(text): def parse_commandline(): - """Parse the comandline and return parsed options.""" + """Parse the command line and return parsed options.""" parser = OptionParser() parser.description = __doc__ @@ -48,7 +48,7 @@ def parse_commandline(): def main(): - """This implements the actual program functionality""" + """Implement the actual program functionality.""" return_value = 0 options, term = parse_commandline() diff --git a/github2/client.py b/github2/client.py index 7b3d8eb..0296be4 100644 --- a/github2/client.py +++ b/github2/client.py @@ -59,7 +59,7 @@ def __init__(self, username=None, api_token=None, requests_per_second=None, self.pull_requests = PullRequests(self.request) def project_for_user_repo(self, user, repo): - """Return GitHub identifier for a user's repository + """Return Github identifier for a user's repository. :param str user: repository owner :param str repo: repository name @@ -68,7 +68,7 @@ def project_for_user_repo(self, user, repo): return "/".join([user, repo]) def get_all_blobs(self, project, tree_sha): - """Get a list of all blobs for a specific tree + """Get a list of all blobs for a specific tree. .. versionadded:: 0.3.0 @@ -80,7 +80,7 @@ def get_all_blobs(self, project, tree_sha): return blobs.get("blobs") def get_blob_info(self, project, tree_sha, path): - """Get the blob for a file within a specific tree + """Get the blob for a file within a specific tree. :param str project: GitHub project :param str tree_sha: object ID of tree @@ -91,7 +91,7 @@ def get_blob_info(self, project, tree_sha, path): return blob.get("blob") def get_tree(self, project, tree_sha): - """Get tree information for a specifc tree + """Get tree information for a specifc tree. :param str project: GitHub project :param str tree_sha: object ID of tree @@ -101,7 +101,7 @@ def get_tree(self, project, tree_sha): return tree.get("tree", []) def get_network_meta(self, project): - """Get GitHub metadata associated with a project + """Get Github metadata associated with a project. :param str project: GitHub project @@ -111,7 +111,7 @@ def get_network_meta(self, project): "network_meta"]), {}) def get_network_data(self, project, nethash, start=None, end=None): - """Get chunk of GitHub network data + """Get chunk of Github network data. :param str project: GitHub project :param str nethash: identifier provided by :meth:`get_network_meta` diff --git a/github2/commits.py b/github2/commits.py index 7030a40..2bfd152 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -28,7 +28,7 @@ class Commits(GithubCommand): domain = "commits" def list(self, project, branch="master", file=None, page=1): - """List commits on a project + """List commits on a project. .. warning:: Not all projects use ``master`` as their default branch, you can @@ -45,7 +45,7 @@ def list(self, project, branch="master", file=None, page=1): datatype=Commit, page=page) def show(self, project, sha): - """Get a specific commit + """Get a specific commit. :param str project: project name :param str sha: commit id diff --git a/github2/core.py b/github2/core.py index e783456..9329e5e 100644 --- a/github2/core.py +++ b/github2/core.py @@ -27,7 +27,7 @@ def string_to_datetime(string): - """Convert a string to Python datetime + """Convert a string to Python datetime. :param str github_date: date string to parse @@ -39,7 +39,7 @@ def string_to_datetime(string): def _handle_naive_datetimes(f): - """Decorator to make datetime arguments use GitHub timezone + """Decorator to make datetime arguments use GitHub timezone. :param func f: Function to wrap @@ -61,7 +61,7 @@ def wrapper(datetime_): @_handle_naive_datetimes def datetime_to_ghdate(datetime_): - """Convert Python datetime to GitHub date string + """Convert Python datetime to Github date string. :param datetime datetime_: datetime object to convert @@ -71,7 +71,7 @@ def datetime_to_ghdate(datetime_): @_handle_naive_datetimes def datetime_to_commitdate(datetime_): - """Convert Python datetime to GitHub date string + """Convert Python datetime to Github date string. :param datetime datetime_: datetime object to convert @@ -84,12 +84,11 @@ def datetime_to_commitdate(datetime_): def datetime_to_isodate(datetime_): - """Convert Python datetime to GitHub date string - - .. note:: Supports naive and timezone-aware datetimes + """Convert Python datetime to Github date string. :param str datetime_: datetime object to convert + .. note:: Supports naive and timezone-aware datetimes """ if not datetime_.tzinfo: datetime_ = datetime_.replace(tzinfo=tz.tzutc()) @@ -104,7 +103,7 @@ class AuthError(Exception): def requires_auth(f): - """Decorate to check a function call for authentication + """Decorate to check a function call for authentication. Sets a ``requires_auth`` attribute on functions, for use in introspection. @@ -129,7 +128,7 @@ def wrapper(self, *args, **kwargs): def enhanced_by_auth(f): - """Decorator to mark a function as enhanced by authentication + """Decorator to mark a function as enhanced by authentication. Sets a ``enhanced_by_auth`` attribute on functions, for use in introspection. @@ -145,7 +144,7 @@ def enhanced_by_auth(f): class GithubCommand(object): def __init__(self, request): - """Main API binding interface + """Main API binding interface. :param github2.request.GithubRequest request: HTTP request handler @@ -153,7 +152,7 @@ def __init__(self, request): self.request = request def make_request(self, command, *args, **kwargs): - """Make an API request + """Make an API request. Various options are supported if they exist in ``kwargs``: @@ -187,7 +186,7 @@ def make_request(self, command, *args, **kwargs): return response def get_value(self, *args, **kwargs): - """Process a single-value response from the API + """Process a single-value response from the API. If a ``datatype`` parameter is given it defines the :class:`BaseData`-derived class we should build from the provided data @@ -207,7 +206,7 @@ def get_value(self, *args, **kwargs): return value def get_values(self, *args, **kwargs): - """Process a multi-value response from the API + """Process a multi-value response from the API. :see: :meth:`get_value` @@ -228,7 +227,7 @@ def get_values(self, *args, **kwargs): def doc_generator(docstring, attributes): - """Utility function to augment BaseDataType docstring + """Utility function to augment BaseDataType docstring. :param str docstring: docstring to augment :param dict attributes: attributes to add to docstring @@ -246,7 +245,7 @@ def bullet(title, text): class Attribute(object): def __init__(self, help): - """Generic object attribute for use with :class:`BaseData` + """Generic object attribute for use with :class:`BaseData`. :param str help: Attribute description @@ -269,7 +268,7 @@ class DateAttribute(Attribute): } def __init__(self, *args, **kwargs): - """Date handling attribute for use with :class:`BaseData` + """Date handling attribute for use with :class:`BaseData`. :param str format: The date format to support, see :data:`convertor_for_format` for supported options @@ -327,7 +326,8 @@ def iterate(self): # Ugly base class definition for Python 2 and 3 compatibility, where metaclass # syntax is incompatible class BaseData(BaseDataType('BaseData', (object, ), {})): - """Wrapper for API responses + + """Wrapper for API responses. .. warning:: Supports subscript attribute access purely for backwards compatibility, @@ -336,7 +336,7 @@ class BaseData(BaseDataType('BaseData', (object, ), {})): """ def __getitem__(self, key): - """Access objects's attribute using subscript notation + """Access objects's attribute using subscript notation. This is here purely to maintain compatibility when switching ``dict`` responses to ``BaseData`` derived objects. @@ -350,7 +350,7 @@ def __getitem__(self, key): return getattr(self, key) def __setitem__(self, key, value): - """Update object's attribute using subscript notation + """Update object's attribute using subscript notation. :see: :meth:`BaseData.__getitem__` @@ -364,7 +364,7 @@ def __setitem__(self, key, value): def repr_string(string): - """Shorten string for use in repr() output + """Shorten string for use in repr() output. :param str string: string to operate on :return: string, with maximum length of 20 characters diff --git a/github2/issues.py b/github2/issues.py index ad7aa35..0f72908 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -48,7 +48,7 @@ def search(self, project, term, state="open"): :param str project: GitHub project :param str term: term to search issues for - :param str state: can be either ``open`` or ``closed``. + :param str state: can be either ``open`` or ``closed`` """ return self.get_values("search", project, state, quote_plus(term), @@ -58,7 +58,7 @@ def list(self, project, state="open"): """Get all issues for project with given state. :param str project: GitHub project - :param str state: can be either ``open`` or ``closed``. + :param str state: can be either ``open`` or ``closed`` """ return self.get_values("list", project, state, filter="issues", @@ -70,7 +70,7 @@ def list_by_label(self, project, label): .. versionadded:: 0.3.0 :param str project: GitHub project - :param str label: a string representing a label (e.g., ``bug``). + :param str label: a string representing a label (e.g., ``bug``) """ return self.get_values("list", project, "label", label, @@ -111,7 +111,7 @@ def open(self, project, title, body): @requires_auth def close(self, project, number): - """Close an issue + """Close an issue. :param str project: GitHub project :param int number: issue number in the Github database @@ -122,7 +122,7 @@ def close(self, project, number): @requires_auth def reopen(self, project, number): - """Reopen a closed issue + """Reopen a closed issue. .. versionadded:: 0.3.0 @@ -135,7 +135,7 @@ def reopen(self, project, number): @requires_auth def edit(self, project, number, title, body): - """Edit an existing issue + """Edit an existing issue. .. versionadded:: 0.3.0 @@ -152,7 +152,7 @@ def edit(self, project, number, title, body): @requires_auth def add_label(self, project, number, label): - """Add a label to an issue + """Add a label to an issue. :param str project: GitHub project :param int number: issue number in the GitHub database @@ -164,7 +164,7 @@ def add_label(self, project, number, label): @requires_auth def remove_label(self, project, number, label): - """Remove an existing label from an issue + """Remove an existing label from an issue. :param str project: GitHub project :param int number: issue number in the GitHub database diff --git a/github2/organizations.py b/github2/organizations.py index 8baa328..263990b 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -39,7 +39,7 @@ class Organizations(GithubCommand): domain = "organizations" def show(self, organization): - """Get information on organization + """Get information on organization. :param str organization: organization to show @@ -48,12 +48,12 @@ def show(self, organization): datatype=Organization) def list(self): - """Get list of all of your organizations""" + """Get list of all of your organizations.""" return self.get_values('', filter="organizations", datatype=Organization) def repositories(self, organization=''): - """Get list of all repositories in an organization + """Get list of all repositories in an organization. If organization is not given, or is empty, then this will list repositories for all organizations the authenticated user belongs to. @@ -65,7 +65,7 @@ def repositories(self, organization=''): filter="repositories", datatype=Repository) def public_repositories(self, organization): - """Get list of public repositories in an organization + """Get list of public repositories in an organization. :param str organization: organization to list public repositories for @@ -74,7 +74,7 @@ def public_repositories(self, organization): filter="repositories", datatype=Repository) def public_members(self, organization): - """Get list of public members in an organization + """Get list of public members in an organization. :param str organization: organization to list members for @@ -83,7 +83,7 @@ def public_members(self, organization): datatype=User) def teams(self, organization): - """Get list of teams in an organization + """Get list of teams in an organization. :param str organization: organization to list teams for @@ -93,7 +93,7 @@ def teams(self, organization): @requires_auth def add_team(self, organization, name, permission='pull', projects=None): - """Add a team to an organization + """Add a team to an organization. :param str organization: organization to add team to :param str team: name of team to add diff --git a/github2/pull_requests.py b/github2/pull_requests.py index 9a0ba58..bc82814 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -3,7 +3,7 @@ class PullRequest(BaseData): - """Pull request encapsulation + """Pull request encapsulation. .. versionadded:: 0.5.0 @@ -42,7 +42,7 @@ def __repr__(self): class PullRequests(GithubCommand): - """Operations on pull requests + """Operations on pull requests. .. versionadded:: 0.5.0 @@ -51,7 +51,7 @@ class PullRequests(GithubCommand): domain = "pulls" def create(self, project, base, head, title=None, body=None, issue=None): - """Create a new pull request + """Create a new pull request. Pull requests can be created from scratch, or attached to an existing issue. If an ``issue`` parameter is supplied the pull request is @@ -81,7 +81,7 @@ def create(self, project, base, head, title=None, body=None, issue=None): filter="pull", datatype=PullRequest) def show(self, project, number): - """Show a single pull request + """Show a single pull request. :param str project: Github project :param int number: pull request number in the Github database @@ -91,7 +91,7 @@ def show(self, project, number): datatype=PullRequest) def list(self, project, state="open", page=1): - """List all pull requests for a project + """List all pull requests for a project. :param str project: GitHub project :param str state: can be either ``open`` or ``closed`` diff --git a/github2/repositories.py b/github2/repositories.py index 4f9b0cf..8a2b82e 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -86,7 +86,7 @@ def list(self, user=None, page=1): @requires_auth def watch(self, project): - """Watch a project + """Watch a project. :param str project: GitHub project @@ -96,7 +96,7 @@ def watch(self, project): @requires_auth def unwatch(self, project): - """Unwatch a project + """Unwatch a project. :param str project: GitHub project @@ -106,7 +106,7 @@ def unwatch(self, project): @requires_auth def fork(self, project): - """Fork a project + """Fork a project. :param str project: GitHub project @@ -116,7 +116,7 @@ def fork(self, project): @requires_auth def create(self, project, description=None, homepage=None, public=True): - """Create a repository + """Create a repository. :param str project: new project name :param str description: optional project description @@ -131,7 +131,7 @@ def create(self, project, description=None, homepage=None, public=True): @requires_auth def delete(self, project): - """Delete a repository + """Delete a repository. :param str project: project name to delete @@ -143,7 +143,7 @@ def delete(self, project): @requires_auth def set_private(self, project): - """Mark repository as private + """Mark repository as private. :param str project: project name to set as private @@ -152,7 +152,7 @@ def set_private(self, project): @requires_auth def set_public(self, project): - """Mark repository as public + """Mark repository as public. :param str project: project name to set as public @@ -160,7 +160,7 @@ def set_public(self, project): return self.make_request("set/public", project) def list_collaborators(self, project): - """Lists all the collaborators in a project + """Lists all the collaborators in a project. :param str project: GitHub project @@ -170,7 +170,7 @@ def list_collaborators(self, project): @requires_auth def add_collaborator(self, project, username): - """Adds an add_collaborator to a repo + """Adds an add_collaborator to a repo. :param str project: Github project :param str username: Github user to add as collaborator @@ -181,7 +181,7 @@ def add_collaborator(self, project, username): @requires_auth def remove_collaborator(self, project, username): - """Removes an add_collaborator from a repo + """Removes an add_collaborator from a repo. :param str project: Github project :param str username: Github user to add as collaborator @@ -191,7 +191,7 @@ def remove_collaborator(self, project, username): username, method="POST") def network(self, project): - """Get network data for project + """Get network data for project. :param str project: Github project @@ -200,7 +200,7 @@ def network(self, project): datatype=Repository) def languages(self, project): - """Get programming language data for project + """Get programming language data for project. :param str project: Github project @@ -209,7 +209,7 @@ def languages(self, project): filter="languages") def tags(self, project): - """Get tags for project + """Get tags for project. :param str project: Github project @@ -217,7 +217,7 @@ def tags(self, project): return self.get_values("show", project, "tags", filter="tags") def branches(self, project): - """Get branch names for project + """Get branch names for project. :param str project: Github project @@ -225,7 +225,7 @@ def branches(self, project): return self.get_values("show", project, "branches", filter="branches") def watchers(self, project): - """Get list of watchers for project + """Get list of watchers for project. :param str project: Github project @@ -233,7 +233,7 @@ def watchers(self, project): return self.get_values("show", project, "watchers", filter="watchers") def watching(self, for_user=None, page=None): - """Lists all the repos a user is watching + """Lists all the repos a user is watching. :param str for_user: optional GitHub user name to list repositories for :param int page: optional page number @@ -244,7 +244,7 @@ def watching(self, for_user=None, page=None): datatype=Repository, page=page) def list_contributors(self, project): - """Lists all the contributors in a project + """Lists all the contributors in a project. :param str project: Github project diff --git a/github2/request.py b/github2/request.py index 12a9363..8ccfe39 100644 --- a/github2/request.py +++ b/github2/request.py @@ -67,7 +67,7 @@ def charset_from_headers(headers): - """Parse charset from headers + """Parse charset from headers. :param httplib2.Response headers: Request headers :return: Defined encoding, or default to ASCII @@ -91,7 +91,7 @@ class HttpError(RuntimeError): """A HTTP error occured when making a request to the Github API.""" def __init__(self, message, content, code): - """Create a HttpError exception + """Create a HttpError exception. :param str message: Exception string :param str content: Full content of HTTP request diff --git a/github2/teams.py b/github2/teams.py index c2c7945..0feb720 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -22,7 +22,7 @@ class Teams(GithubCommand): domain = "teams" def show(self, team_id): - """Get information on team_id + """Get information on team_id. :param int team_id: team to get information for @@ -30,7 +30,7 @@ def show(self, team_id): return self.get_value(str(team_id), filter="team", datatype=Team) def members(self, team_id): - """Get list of all team members + """Get list of all team members. :param int team_id: team to get information for @@ -40,7 +40,7 @@ def members(self, team_id): @requires_auth def add_member(self, team_id, username): - """Add a new member to a team + """Add a new member to a team. :param int team_id: team to add new member to :param str username: GitHub username to add to team @@ -51,7 +51,7 @@ def add_member(self, team_id, username): datatype=User) def repositories(self, team_id): - """Get list of all team repositories + """Get list of all team repositories. :param int team_id: team to get information for @@ -61,7 +61,7 @@ def repositories(self, team_id): @requires_auth def add_project(self, team_id, project): - """Add a project to a team + """Add a project to a team. :param int team_id: team to add repository to :param str project: GitHub project @@ -75,7 +75,7 @@ def add_project(self, team_id, project): @requires_auth def remove_project(self, team_id, project): - """Remove a project to a team + """Remove a project to a team. :param int team_id: team to remove project from :param str project: GitHub project diff --git a/github2/users.py b/github2/users.py index 50b761e..65d7702 100644 --- a/github2/users.py +++ b/github2/users.py @@ -41,7 +41,7 @@ class User(BaseData): format="user") def is_authenticated(self): - """Test for user authentication + """Test for user authentication. :return bool: ``True`` if user is authenticated @@ -56,7 +56,7 @@ class Users(GithubCommand): domain = "user" def search(self, query): - """Search for users + """Search for users. .. warning: Returns at most 100 users @@ -68,7 +68,7 @@ def search(self, query): datatype=User) def search_by_email(self, query): - """Search for users by email address + """Search for users by email address. :param str query: email to search for @@ -77,7 +77,7 @@ def search_by_email(self, query): @enhanced_by_auth def show(self, username): - """Get information on GitHub user + """Get information on Github user. if ``username`` is ``None`` or an empty string information for the currently authenticated user is returned. @@ -87,7 +87,7 @@ def show(self, username): return self.get_value("show", username, filter="user", datatype=User) def followers(self, username): - """Get list of GitHub user's followers + """Get list of Github user's followers. :param str username: Github user name @@ -95,7 +95,7 @@ def followers(self, username): return self.get_values("show", username, "followers", filter="users") def following(self, username): - """Get list of users a GitHub user is following + """Get list of users a Github user is following. :param str username: Github user name @@ -104,7 +104,7 @@ def following(self, username): @requires_auth def follow(self, other_user): - """Follow a GitHub user + """Follow a Github user. :param str other_user: Github user name @@ -113,7 +113,7 @@ def follow(self, other_user): @requires_auth def unfollow(self, other_user): - """Unfollow a GitHub user + """Unfollow a Github user. :param str other_user: Github user name @@ -122,12 +122,12 @@ def unfollow(self, other_user): @requires_auth def list_keys(self): - """Get list of SSH keys for the authenticated user""" + """Get list of SSH keys for the authenticated user.""" return self.get_values('keys', filter='public_keys', datatype=Key) @requires_auth def add_key(self, key, title=''): - """Add a SSH key for the authenticated user + """Add a SSH key for the authenticated user. :param str key: SSH key identifier :param str title: Optional title for the SSH key @@ -140,7 +140,7 @@ def add_key(self, key, title=''): @requires_auth def remove_key(self, key_id): - """Remove a SSH key for the authenticated user + """Remove a SSH key for the authenticated user. :param int key_id: SSH key's GitHub identifier From 4902ffc5f29675e138e055f6beef8d28bd625430 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:30:24 +0100 Subject: [PATCH 431/454] [QA] Use imperative form as per PEP 257. --- github2/repositories.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/github2/repositories.py b/github2/repositories.py index 8a2b82e..c515955 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -160,7 +160,7 @@ def set_public(self, project): return self.make_request("set/public", project) def list_collaborators(self, project): - """Lists all the collaborators in a project. + """List all the collaborators in a project. :param str project: GitHub project @@ -170,7 +170,7 @@ def list_collaborators(self, project): @requires_auth def add_collaborator(self, project, username): - """Adds an add_collaborator to a repo. + """Add an add_collaborator to a repo. :param str project: Github project :param str username: Github user to add as collaborator @@ -181,7 +181,7 @@ def add_collaborator(self, project, username): @requires_auth def remove_collaborator(self, project, username): - """Removes an add_collaborator from a repo. + """Remove a collaborator from a repo. :param str project: Github project :param str username: Github user to add as collaborator @@ -233,7 +233,7 @@ def watchers(self, project): return self.get_values("show", project, "watchers", filter="watchers") def watching(self, for_user=None, page=None): - """Lists all the repos a user is watching. + """List all the repos a user is watching. :param str for_user: optional GitHub user name to list repositories for :param int page: optional page number @@ -244,7 +244,7 @@ def watching(self, for_user=None, page=None): datatype=Repository, page=page) def list_contributors(self, project): - """Lists all the contributors in a project. + """List all the contributors in a project. :param str project: Github project From e3ef6bc59d77adaaa358aa78d3c9b891852e1bb9 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:31:49 +0100 Subject: [PATCH 432/454] Added some more missing docstrings. --- github2/client.py | 5 +++-- github2/commits.py | 6 ++++++ github2/core.py | 14 +++++++++++--- github2/issues.py | 9 +++++++++ github2/organizations.py | 16 ++++++++++++++-- github2/pull_requests.py | 6 ++++-- github2/repositories.py | 5 +++++ github2/request.py | 11 +++++++---- github2/teams.py | 12 ++++++++++-- github2/users.py | 9 +++++++++ 10 files changed, 78 insertions(+), 15 deletions(-) diff --git a/github2/client.py b/github2/client.py index 0296be4..5cf8d7e 100644 --- a/github2/client.py +++ b/github2/client.py @@ -10,11 +10,12 @@ class Github(object): + """Interface to GitHub's API v2.""" + def __init__(self, username=None, api_token=None, requests_per_second=None, access_token=None, cache=None, proxy_host=None, proxy_port=8080, github_url=None): - """An interface to GitHub's API: - http://develop.github.com/ + """Setup GitHub API object. .. versionadded:: 0.2.0 The ``requests_per_second`` parameter diff --git a/github2/commits.py b/github2/commits.py index 2bfd152..a04892f 100644 --- a/github2/commits.py +++ b/github2/commits.py @@ -3,6 +3,9 @@ class Commit(BaseData): + + """Commit container.""" + message = Attribute("Commit message.") parents = Attribute("List of parents for this commit.") url = Attribute("Canonical URL for this commit.") @@ -25,6 +28,9 @@ def __repr__(self): class Commits(GithubCommand): + + """GitHub API commits functionality.""" + domain = "commits" def list(self, project, branch="master", file=None, page=1): diff --git a/github2/core.py b/github2/core.py index 9329e5e..807aa93 100644 --- a/github2/core.py +++ b/github2/core.py @@ -143,8 +143,10 @@ def enhanced_by_auth(f): class GithubCommand(object): + """Main API binding interface.""" + def __init__(self, request): - """Main API binding interface. + """Setup command object. :param github2.request.GithubRequest request: HTTP request handler @@ -244,8 +246,11 @@ def bullet(title, text): class Attribute(object): + + """Generic object attribute for use with :class:`BaseData`.""" + def __init__(self, help): - """Generic object attribute for use with :class:`BaseData`. + """Setup Attribute object. :param str help: Attribute description @@ -259,6 +264,9 @@ def to_python(self, value): class DateAttribute(Attribute): + + """Date handling attribute for use with :class:`BaseData`.""" + format = "github" converter_for_format = { "github": datetime_to_ghdate, @@ -268,7 +276,7 @@ class DateAttribute(Attribute): } def __init__(self, *args, **kwargs): - """Date handling attribute for use with :class:`BaseData`. + """Setup DateAttribute object. :param str format: The date format to support, see :data:`convertor_for_format` for supported options diff --git a/github2/issues.py b/github2/issues.py index 0f72908..89dcf17 100644 --- a/github2/issues.py +++ b/github2/issues.py @@ -8,6 +8,9 @@ class Issue(BaseData): + + """Issue container.""" + position = Attribute("The position of this issue in a list.") number = Attribute("The issue number (unique for project).") votes = Attribute("Number of votes for this issue.") @@ -28,6 +31,9 @@ def __repr__(self): class Comment(BaseData): + + """Comment container.""" + created_at = DateAttribute("The date this comment was created.") updated_at = DateAttribute("The date when this comment was last updated.") body = Attribute("The full text of this comment.") @@ -39,6 +45,9 @@ def __repr__(self): class Issues(GithubCommand): + + """GitHub API issues functionality.""" + domain = "issues" def search(self, project, term, state="open"): diff --git a/github2/organizations.py b/github2/organizations.py index 263990b..3ac66c1 100644 --- a/github2/organizations.py +++ b/github2/organizations.py @@ -6,7 +6,13 @@ class Organization(BaseData): - """.. versionadded:: 0.4.0""" + + """Organization container. + + .. versionadded:: 0.4.0 + + """ + id = Attribute("The organization id.") name = Attribute("The full name of the organization.") blog = Attribute("The organization's blog.") @@ -35,7 +41,13 @@ def __repr__(self): class Organizations(GithubCommand): - """.. versionadded:: 0.4.0""" + + """GitHub API organizations functionality. + + .. versionadded:: 0.4.0 + + """ + domain = "organizations" def show(self, organization): diff --git a/github2/pull_requests.py b/github2/pull_requests.py index bc82814..b168b66 100644 --- a/github2/pull_requests.py +++ b/github2/pull_requests.py @@ -3,7 +3,8 @@ class PullRequest(BaseData): - """Pull request encapsulation. + + """Pull request container. .. versionadded:: 0.5.0 @@ -42,7 +43,8 @@ def __repr__(self): class PullRequests(GithubCommand): - """Operations on pull requests. + + """GitHub API pull request functionality. .. versionadded:: 0.5.0 diff --git a/github2/repositories.py b/github2/repositories.py index c515955..10f07a0 100644 --- a/github2/repositories.py +++ b/github2/repositories.py @@ -5,6 +5,9 @@ class Repository(BaseData): + + """Repository container.""" + name = Attribute("Name of repository.") description = Attribute("Repository description.") forks = Attribute("Number of forks of this repository.") @@ -35,6 +38,8 @@ def __repr__(self): class Repositories(GithubCommand): + """GitHub API repository functionality.""" + domain = "repos" def search(self, query): diff --git a/github2/request.py b/github2/request.py index 8ccfe39..6dcb371 100644 --- a/github2/request.py +++ b/github2/request.py @@ -111,6 +111,13 @@ def __init__(self, message, content, code): class GithubRequest(object): + + """Make an API request. + + :see: :class:`github2.client.Github` + + """ + url_format = "%(github_url)s/api/%(api_version)s/%(api_format)s" api_version = "v2" api_format = "json" @@ -120,10 +127,6 @@ def __init__(self, username=None, api_token=None, url_prefix=None, requests_per_second=None, access_token=None, cache=None, proxy_host=None, proxy_port=None, github_url=None): - """Make an API request. - - :see: :class:`github2.client.Github` - """ self.username = username self.api_token = api_token self.access_token = access_token diff --git a/github2/teams.py b/github2/teams.py index 0feb720..7c44e86 100644 --- a/github2/teams.py +++ b/github2/teams.py @@ -5,7 +5,11 @@ class Team(BaseData): - """.. versionadded:: 0.4.0""" + """Team container. + + .. versionadded:: 0.4.0 + + """ id = Attribute("The team id") name = Attribute("Name of the team") @@ -17,7 +21,11 @@ def __repr__(self): class Teams(GithubCommand): - """.. versionadded:: 0.4.0""" + """GitHub API teams functionality. + + .. versionadded:: 0.4.0 + + """ domain = "teams" diff --git a/github2/users.py b/github2/users.py index 65d7702..4ea8c2d 100644 --- a/github2/users.py +++ b/github2/users.py @@ -8,6 +8,9 @@ class Key(BaseData): + + """SSH key container.""" + id = Attribute('The key id') key = Attribute('The SSH key data') title = Attribute('The title for the SSH key') @@ -17,6 +20,9 @@ def __repr__(self): class User(BaseData): + + """GitHub user container.""" + id = Attribute("The user id") login = Attribute("The login username") name = Attribute("The users full name") @@ -53,6 +59,9 @@ def __repr__(self): class Users(GithubCommand): + + """GitHub API user functionality.""" + domain = "user" def search(self, query): From 031018edaccd4dcee233f2dcebf7fb6d7e5261ad Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 15:32:46 +0100 Subject: [PATCH 433/454] Use class docstring with autodoc. --- doc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/conf.py b/doc/conf.py index ea950db..d74babe 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -229,7 +229,7 @@ [u'Ask Solem'], 1) ] -autoclass_content = "init" +autoclass_content = "class" autodoc_default_flags = ['members', ] intersphinx_mapping = { From 862d52238f34d614aca939b8d042b8eddd65f321 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 20:39:28 +0100 Subject: [PATCH 434/454] Added pip requirements files. --- extra/requirements-doc.txt | 4 ++++ extra/requirements-py25.txt | 2 ++ extra/requirements-py3.txt | 2 ++ extra/requirements-test.txt | 3 +++ extra/requirements.txt | 2 ++ 5 files changed, 13 insertions(+) create mode 100644 extra/requirements-doc.txt create mode 100644 extra/requirements-py25.txt create mode 100644 extra/requirements-py3.txt create mode 100644 extra/requirements-test.txt create mode 100644 extra/requirements.txt diff --git a/extra/requirements-doc.txt b/extra/requirements-doc.txt new file mode 100644 index 0000000..709ee46 --- /dev/null +++ b/extra/requirements-doc.txt @@ -0,0 +1,4 @@ +-r requirements.txt +cloud_sptheme>=1.2 +sphinx>=1.1 +sphinxcontrib-cheeseshop diff --git a/extra/requirements-py25.txt b/extra/requirements-py25.txt new file mode 100644 index 0000000..33f97ee --- /dev/null +++ b/extra/requirements-py25.txt @@ -0,0 +1,2 @@ +-r requirements.txt +simplejson>=2.0.9 diff --git a/extra/requirements-py3.txt b/extra/requirements-py3.txt new file mode 100644 index 0000000..457b3fb --- /dev/null +++ b/extra/requirements-py3.txt @@ -0,0 +1,2 @@ +httplib2>=0.7.0 +python-dateutil>=2.0 diff --git a/extra/requirements-test.txt b/extra/requirements-test.txt new file mode 100644 index 0000000..c8d6b88 --- /dev/null +++ b/extra/requirements-test.txt @@ -0,0 +1,3 @@ +-r requirements.txt +coverage>=3.5 +nose>=1.1.2 diff --git a/extra/requirements.txt b/extra/requirements.txt new file mode 100644 index 0000000..57c76c4 --- /dev/null +++ b/extra/requirements.txt @@ -0,0 +1,2 @@ +httplib2>=0.7.0 +python-dateutil<2.0 From 3f60faf6f6969b23206b9ee19a46986d1fbd823b Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:34:48 +0100 Subject: [PATCH 435/454] Use nose.tools.eq_ instead of assert_equals. --- tests/test_charset_header.py | 6 +- tests/test_commits.py | 62 +++---- tests/test_date_handling.py | 258 ++++++++++++-------------- tests/test_issues.py | 72 ++++---- tests/test_organizations.py | 52 +++--- tests/test_pull_requests.py | 69 ++++--- tests/test_regression.py | 8 +- tests/test_repositories.py | 103 +++++------ tests/test_teams.py | 4 +- tests/test_tz_aware_date_handling.py | 266 +++++++++++++-------------- tests/test_unit.py | 30 +-- tests/test_user.py | 59 +++--- 12 files changed, 473 insertions(+), 516 deletions(-) diff --git a/tests/test_charset_header.py b/tests/test_charset_header.py index 3b29635..2786673 100644 --- a/tests/test_charset_header.py +++ b/tests/test_charset_header.py @@ -3,16 +3,16 @@ # This file is part of python-github2, and is made available under the 3-clause # BSD license. See LICENSE for the full details. -from nose.tools import assert_equals +from nose.tools import eq_ from github2.request import charset_from_headers def no_match_test(): d = {} - assert_equals("ascii", charset_from_headers(d)) + eq_("ascii", charset_from_headers(d)) def utf_test(): d = {'content-type': 'application/json; charset=utf-8'} - assert_equals("utf-8", charset_from_headers(d)) + eq_("utf-8", charset_from_headers(d)) diff --git a/tests/test_commits.py b/tests/test_commits.py index 20ed487..33f037c 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -5,7 +5,7 @@ from datetime import datetime -from nose.tools import assert_equals +from nose.tools import eq_ import utils @@ -16,28 +16,25 @@ class CommitProperties(utils.HttpMockTestCase): def test_commit(self): commit = self.client.commits.show('ask/python-github2', self.commit_id) - assert_equals(commit.message, - 'Added cache support to manage_collaborators.') - assert_equals(commit.parents, - [{"id": '7d1c855d2f44a55e4b90b40017be697cf70cb4a0'}]) - assert_equals(commit.url, - '/ask/python-github2/commit/%s' % self.commit_id) - assert_equals(commit.author['login'], 'JNRowe') - assert_equals(commit.id, self.commit_id) - assert_equals(commit.committed_date, - datetime(2011, 6, 6, 16, 13, 50)) - assert_equals(commit.authored_date, datetime(2011, 6, 6, 16, 13, 50)) - assert_equals(commit.tree, 'f48fcc1a0b8ea97f3147dc42cf7cdb6683493e94') - assert_equals(commit.committer['login'], 'JNRowe') - assert_equals(commit.added, None) - assert_equals(commit.removed, None) - assert_equals(commit.modified[0]['filename'], - 'github2/bin/manage_collaborators.py') + eq_(commit.message, 'Added cache support to manage_collaborators.') + eq_(commit.parents, + [{"id": '7d1c855d2f44a55e4b90b40017be697cf70cb4a0'}]) + eq_(commit.url, '/ask/python-github2/commit/%s' % self.commit_id) + eq_(commit.author['login'], 'JNRowe') + eq_(commit.id, self.commit_id) + eq_(commit.committed_date, datetime(2011, 6, 6, 16, 13, 50)) + eq_(commit.authored_date, datetime(2011, 6, 6, 16, 13, 50)) + eq_(commit.tree, 'f48fcc1a0b8ea97f3147dc42cf7cdb6683493e94') + eq_(commit.committer['login'], 'JNRowe') + eq_(commit.added, None) + eq_(commit.removed, None) + eq_(commit.modified[0]['filename'], + 'github2/bin/manage_collaborators.py') def test_repr(self): commit = self.client.commits.show('ask/python-github2', self.commit_id) - assert_equals(repr(commit), - '' % self.commit_id[:8]) + eq_(repr(commit), + '' % self.commit_id[:8]) class CommitsQueries(utils.HttpMockTestCase): @@ -45,32 +42,27 @@ class CommitsQueries(utils.HttpMockTestCase): def test_list(self): commits = self.client.commits.list('JNRowe/misc-overlay') - assert_equals(len(commits), 35) - assert_equals(commits[0].id, - '4de0834d58b37ef3020c49df43c95649217a2def') + eq_(len(commits), 35) + eq_(commits[0].id, '4de0834d58b37ef3020c49df43c95649217a2def') def test_list_with_page(self): commits = self.client.commits.list('JNRowe/jnrowe-misc', page=2) - assert_equals(len(commits), 35) - assert_equals(commits[0].id, - '1f5ad2c3206bafc4aca9e6ce50f5c605befdb3d6') + eq_(len(commits), 35) + eq_(commits[0].id, '1f5ad2c3206bafc4aca9e6ce50f5c605befdb3d6') def test_list_with_branch(self): commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages') - assert_equals(len(commits), 35) - assert_equals(commits[0].id, - '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') + eq_(len(commits), 35) + eq_(commits[0].id, '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') def test_list_with_file(self): commits = self.client.commits.list('JNRowe/misc-overlay', file='Makefile') - assert_equals(len(commits), 35) - assert_equals(commits[0].id, - 'fc12b924d34dc38c8ce76d27a866221faa88cb72') + eq_(len(commits), 35) + eq_(commits[0].id, 'fc12b924d34dc38c8ce76d27a866221faa88cb72') def test_list_with_branch_and_file(self): commits = self.client.commits.list('JNRowe/misc-overlay', 'gh-pages', 'packages/dev-python.html') - assert_equals(len(commits), 35) - assert_equals(commits[0].id, - '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') + eq_(len(commits), 35) + eq_(commits[0].id, '025148bdaa6fb6bdac9c3522d481fadf1c0a456f') diff --git a/tests/test_date_handling.py b/tests/test_date_handling.py index 855ccae..b696a74 100644 --- a/tests/test_date_handling.py +++ b/tests/test_date_handling.py @@ -6,7 +6,7 @@ from datetime import datetime as dt -from nose.tools import assert_equals +from nose.tools import eq_ from github2.core import (datetime_to_ghdate, datetime_to_commitdate, datetime_to_isodate, string_to_datetime) @@ -16,154 +16,138 @@ # naïve datetime objects used in the current code base def test_ghdate_to_datetime(): - assert_equals(string_to_datetime('2011/05/22 00:24:15 -0700'), - dt(2011, 5, 22, 0, 24, 15)) - - assert_equals(string_to_datetime('2009/04/18 13:04:09 -0700'), - dt(2009, 4, 18, 13, 4, 9)) - #assert_equals(string_to_datetime('2009/11/12 21:15:17 -0800'), - # dt(2009, 11, 12, 21, 15, 17)) - #assert_equals(string_to_datetime('2009/11/12 21:16:20 -0800'), - # dt(2009, 11, 12, 21, 16, 20)) - assert_equals(string_to_datetime('2010/04/17 17:24:29 -0700'), - dt(2010, 4, 17, 17, 24, 29)) - assert_equals(string_to_datetime('2010/05/18 06:10:36 -0700'), - dt(2010, 5, 18, 6, 10, 36)) - assert_equals(string_to_datetime('2010/05/25 21:59:37 -0700'), - dt(2010, 5, 25, 21, 59, 37)) - assert_equals(string_to_datetime('2010/05/26 17:08:41 -0700'), - dt(2010, 5, 26, 17, 8, 41)) - assert_equals(string_to_datetime('2010/06/20 06:13:37 -0700'), - dt(2010, 6, 20, 6, 13, 37)) - assert_equals(string_to_datetime('2010/07/28 12:56:51 -0700'), - dt(2010, 7, 28, 12, 56, 51)) - assert_equals(string_to_datetime('2010/09/20 21:32:49 -0700'), - dt(2010, 9, 20, 21, 32, 49)) + eq_(string_to_datetime('2011/05/22 00:24:15 -0700'), + dt(2011, 5, 22, 0, 24, 15)) + + eq_(string_to_datetime('2009/04/18 13:04:09 -0700'), + dt(2009, 4, 18, 13, 4, 9)) + #eq_(string_to_datetime('2009/11/12 21:15:17 -0800'), + # dt(2009, 11, 12, 21, 15, 17)) + #eq_(string_to_datetime('2009/11/12 21:16:20 -0800'), + # dt(2009, 11, 12, 21, 16, 20)) + eq_(string_to_datetime('2010/04/17 17:24:29 -0700'), + dt(2010, 4, 17, 17, 24, 29)) + eq_(string_to_datetime('2010/05/18 06:10:36 -0700'), + dt(2010, 5, 18, 6, 10, 36)) + eq_(string_to_datetime('2010/05/25 21:59:37 -0700'), + dt(2010, 5, 25, 21, 59, 37)) + eq_(string_to_datetime('2010/05/26 17:08:41 -0700'), + dt(2010, 5, 26, 17, 8, 41)) + eq_(string_to_datetime('2010/06/20 06:13:37 -0700'), + dt(2010, 6, 20, 6, 13, 37)) + eq_(string_to_datetime('2010/07/28 12:56:51 -0700'), + dt(2010, 7, 28, 12, 56, 51)) + eq_(string_to_datetime('2010/09/20 21:32:49 -0700'), + dt(2010, 9, 20, 21, 32, 49)) def test_datetime_to_ghdate(): - assert_equals(datetime_to_ghdate(dt(2011, 5, 22, 0, 24, 15)), - '2011/05/22 00:24:15 -0700') - - assert_equals(datetime_to_ghdate(dt(2009, 4, 18, 20, 4, 9)), - '2009/04/18 20:04:09 -0700') - #assert_equals(datetime_to_ghdate(dt(2009, 11, 13, 4, 15, 17)), - # '2009/11/13 04:15:17 -0800') - #assert_equals(datetime_to_ghdate(dt(2009, 11, 13, 4, 16, 20)), - # '2009/11/13 04:16:20 -0800') - assert_equals(datetime_to_ghdate(dt(2010, 4, 18, 0, 24, 29)), - '2010/04/18 00:24:29 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 5, 18, 13, 10, 36)), - '2010/05/18 13:10:36 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 5, 26, 5, 59, 37)), - '2010/05/26 05:59:37 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 5, 27, 0, 8, 41)), - '2010/05/27 00:08:41 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 6, 20, 13, 13, 37)), - '2010/06/20 13:13:37 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 7, 28, 19, 56, 51)), - '2010/07/28 19:56:51 -0700') - assert_equals(datetime_to_ghdate(dt(2010, 9, 21, 4, 32, 49)), - '2010/09/21 04:32:49 -0700') + eq_(datetime_to_ghdate(dt(2011, 5, 22, 0, 24, 15)), + '2011/05/22 00:24:15 -0700') + + eq_(datetime_to_ghdate(dt(2009, 4, 18, 20, 4, 9)), + '2009/04/18 20:04:09 -0700') + #eq_(datetime_to_ghdate(dt(2009, 11, 13, 4, 15, 17)), + # '2009/11/13 04:15:17 -0800') + #eq_(datetime_to_ghdate(dt(2009, 11, 13, 4, 16, 20)), + # '2009/11/13 04:16:20 -0800') + eq_(datetime_to_ghdate(dt(2010, 4, 18, 0, 24, 29)), + '2010/04/18 00:24:29 -0700') + eq_(datetime_to_ghdate(dt(2010, 5, 18, 13, 10, 36)), + '2010/05/18 13:10:36 -0700') + eq_(datetime_to_ghdate(dt(2010, 5, 26, 5, 59, 37)), + '2010/05/26 05:59:37 -0700') + eq_(datetime_to_ghdate(dt(2010, 5, 27, 0, 8, 41)), + '2010/05/27 00:08:41 -0700') + eq_(datetime_to_ghdate(dt(2010, 6, 20, 13, 13, 37)), + '2010/06/20 13:13:37 -0700') + eq_(datetime_to_ghdate(dt(2010, 7, 28, 19, 56, 51)), + '2010/07/28 19:56:51 -0700') + eq_(datetime_to_ghdate(dt(2010, 9, 21, 4, 32, 49)), + '2010/09/21 04:32:49 -0700') def test_commitdate_to_datetime(): - assert_equals(string_to_datetime('2011-05-22T00:24:15-07:00'), - dt(2011, 5, 22, 0, 24, 15)) - - assert_equals(string_to_datetime('2011-04-09T10:07:30-07:00'), - dt(2011, 4, 9, 10, 7, 30)) - #assert_equals(string_to_datetime('2011-02-19T07:16:11-08:00'), - # dt(2011, 2, 19, 7, 16, 11)) - #assert_equals(string_to_datetime('2010-12-21T12:34:27-08:00'), - # dt(2010, 12, 21, 12, 34, 27)) - assert_equals(string_to_datetime('2011-04-09T10:20:05-07:00'), - dt(2011, 4, 9, 10, 20, 5)) - assert_equals(string_to_datetime('2011-04-09T10:05:58-07:00'), - dt(2011, 4, 9, 10, 5, 58)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T10:00:21-07:00'), - dt(2011, 4, 9, 10, 0, 21)) - #assert_equals(string_to_datetime('2010-12-16T15:10:59-08:00'), - # dt(2010, 12, 16, 15, 10, 59)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-05-22T00:24:15-07:00'), + dt(2011, 5, 22, 0, 24, 15)) + + eq_(string_to_datetime('2011-04-09T10:07:30-07:00'), + dt(2011, 4, 9, 10, 7, 30)) + #eq_(string_to_datetime('2011-02-19T07:16:11-08:00'), + # dt(2011, 2, 19, 7, 16, 11)) + #eq_(string_to_datetime('2010-12-21T12:34:27-08:00'), + # dt(2010, 12, 21, 12, 34, 27)) + eq_(string_to_datetime('2011-04-09T10:20:05-07:00'), + dt(2011, 4, 9, 10, 20, 5)) + eq_(string_to_datetime('2011-04-09T10:05:58-07:00'), + dt(2011, 4, 9, 10, 5, 58)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T10:00:21-07:00'), + dt(2011, 4, 9, 10, 0, 21)) + #eq_(string_to_datetime('2010-12-16T15:10:59-08:00'), + # dt(2010, 12, 16, 15, 10, 59)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt(2011, 4, 9, 9, 53, 0)) def test_datetime_to_commitdate(): - assert_equals(datetime_to_commitdate(dt(2011, 5, 22, 0, 24, 15)), - '2011-05-22T00:24:15-07:00') - - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 7, 30)), - '2011-04-09T10:07:30-07:00') - #assert_equals(datetime_to_commitdate(dt(2011, 2, 19, 7, 16, 11)), - # '2011-02-19T07:16:11-08:00') - #assert_equals(datetime_to_commitdate(dt(2010, 12, 21, 12, 34, 27)), - # '2010-12-21T12:34:27-08:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 20, 5)), - '2011-04-09T10:20:05-07:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 5, 58)), - '2011-04-09T10:05:58-07:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00-07:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 10, 0, 21)), - '2011-04-09T10:00:21-07:00') - #assert_equals(datetime_to_commitdate(dt(2010, 12, 16, 15, 10, 59)), - # '2010-12-16T15:10:59-08:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00-07:00') - assert_equals(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15-07:00') + + eq_(datetime_to_commitdate(dt(2011, 4, 9, 10, 7, 30)), + '2011-04-09T10:07:30-07:00') + #eq_(datetime_to_commitdate(dt(2011, 2, 19, 7, 16, 11)), + # '2011-02-19T07:16:11-08:00') + #eq_(datetime_to_commitdate(dt(2010, 12, 21, 12, 34, 27)), + # '2010-12-21T12:34:27-08:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 10, 20, 5)), + '2011-04-09T10:20:05-07:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 10, 5, 58)), + '2011-04-09T10:05:58-07:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 10, 0, 21)), + '2011-04-09T10:00:21-07:00') + #eq_(datetime_to_commitdate(dt(2010, 12, 16, 15, 10, 59)), + # '2010-12-16T15:10:59-08:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00-07:00') def test_isodate_to_datetime(): - assert_equals(string_to_datetime('2011-05-22T00:24:15Z'), - dt(2011, 5, 22, 0, 24, 15)) - assert_equals(string_to_datetime('2011-04-09T10:07:30Z'), - dt(2011, 4, 9, 10, 7, 30)) - assert_equals(string_to_datetime('2011-02-19T07:16:11Z'), - dt(2011, 2, 19, 7, 16, 11)) - assert_equals(string_to_datetime('2010-12-21T12:34:27Z'), - dt(2010, 12, 21, 12, 34, 27)) - assert_equals(string_to_datetime('2011-04-09T10:20:05Z'), - dt(2011, 4, 9, 10, 20, 5)) - assert_equals(string_to_datetime('2011-04-09T10:05:58Z'), - dt(2011, 4, 9, 10, 5, 58)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T10:00:21Z'), - dt(2011, 4, 9, 10, 0, 21)) - assert_equals(string_to_datetime('2010-12-16T15:10:59Z'), - dt(2010, 12, 16, 15, 10, 59)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-05-22T00:24:15Z'), dt(2011, 5, 22, 0, 24, 15)) + eq_(string_to_datetime('2011-04-09T10:07:30Z'), dt(2011, 4, 9, 10, 7, 30)) + eq_(string_to_datetime('2011-02-19T07:16:11Z'), dt(2011, 2, 19, 7, 16, 11)) + eq_(string_to_datetime('2010-12-21T12:34:27Z'), + dt(2010, 12, 21, 12, 34, 27)) + eq_(string_to_datetime('2011-04-09T10:20:05Z'), dt(2011, 4, 9, 10, 20, 5)) + eq_(string_to_datetime('2011-04-09T10:05:58Z'), dt(2011, 4, 9, 10, 5, 58)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T10:00:21Z'), dt(2011, 4, 9, 10, 0, 21)) + eq_(string_to_datetime('2010-12-16T15:10:59Z'), + dt(2010, 12, 16, 15, 10, 59)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), dt(2011, 4, 9, 9, 53, 0)) def test_datetime_to_isodate(): - assert_equals(datetime_to_isodate(dt(2011, 5, 22, 0, 24, 15)), - '2011-05-22T00:24:15Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 7, 30)), - '2011-04-09T10:07:30Z') - assert_equals(datetime_to_isodate(dt(2011, 2, 19, 7, 16, 11)), - '2011-02-19T07:16:11Z') - assert_equals(datetime_to_isodate(dt(2010, 12, 21, 12, 34, 27)), - '2010-12-21T12:34:27Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 20, 5)), - '2011-04-09T10:20:05Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 5, 58)), - '2011-04-09T10:05:58Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 10, 0, 21)), - '2011-04-09T10:00:21Z') - assert_equals(datetime_to_isodate(dt(2010, 12, 16, 15, 10, 59)), - '2010-12-16T15:10:59Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') - assert_equals(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 10, 7, 30)), '2011-04-09T10:07:30Z') + eq_(datetime_to_isodate(dt(2011, 2, 19, 7, 16, 11)), + '2011-02-19T07:16:11Z') + eq_(datetime_to_isodate(dt(2010, 12, 21, 12, 34, 27)), + '2010-12-21T12:34:27Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 10, 20, 5)), '2011-04-09T10:20:05Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 10, 5, 58)), '2011-04-09T10:05:58Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 10, 0, 21)), '2011-04-09T10:00:21Z') + eq_(datetime_to_isodate(dt(2010, 12, 16, 15, 10, 59)), + '2010-12-16T15:10:59Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt(2011, 4, 9, 9, 53, 0)), '2011-04-09T09:53:00Z') diff --git a/tests/test_issues.py b/tests/test_issues.py index f82302b..2abf495 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -5,7 +5,7 @@ from datetime import datetime -from nose.tools import assert_equals +from nose.tools import eq_ import utils @@ -13,44 +13,42 @@ class Issue(utils.HttpMockTestCase): def test_properties(self): issue = self.client.issues.show('ask/python-github2', 24) - assert_equals(issue.position, 24.0) - assert_equals(issue.number, 24) - assert_equals(issue.votes, 0) - assert_equals(len(issue.body), 164) - assert_equals(issue.title, 'Pagination support for commits.') - assert_equals(issue.user, 'svetlyak40wt') - assert_equals(issue.state, 'open') - assert_equals(issue.labels, []) - assert_equals(issue.created_at, datetime(2010, 12, 8, 23, 50, 26)) - assert_equals(issue.closed_at, None) - assert_equals(issue.updated_at, datetime(2011, 1, 4, 16, 26, 7)) - assert_equals(issue.diff_url, - 'https://github.com/ask/python-github2/pull/24.diff') - assert_equals(issue.patch_url, - 'https://github.com/ask/python-github2/pull/24.patch') - assert_equals(issue.pull_request_url, - 'https://github.com/ask/python-github2/pull/24') + eq_(issue.position, 24.0) + eq_(issue.number, 24) + eq_(issue.votes, 0) + eq_(len(issue.body), 164) + eq_(issue.title, 'Pagination support for commits.') + eq_(issue.user, 'svetlyak40wt') + eq_(issue.state, 'open') + eq_(issue.labels, []) + eq_(issue.created_at, datetime(2010, 12, 8, 23, 50, 26)) + eq_(issue.closed_at, None) + eq_(issue.updated_at, datetime(2011, 1, 4, 16, 26, 7)) + eq_(issue.diff_url, + 'https://github.com/ask/python-github2/pull/24.diff') + eq_(issue.patch_url, + 'https://github.com/ask/python-github2/pull/24.patch') + eq_(issue.pull_request_url, + 'https://github.com/ask/python-github2/pull/24') def test_issue_repr(self): issue = self.client.issues.show('ask/python-github2', 24) - assert_equals(repr(issue), - '') + eq_(repr(issue), '') class Comment(utils.HttpMockTestCase): def test_properties(self): comments = self.client.issues.comments('ask/python-github2', 24) comment = comments[0] - assert_equals(comment.created_at, datetime(2010, 12, 9, 22, 37, 26)) - assert_equals(comment.updated_at, datetime(2010, 12, 9, 22, 37, 26)) - assert_equals(len(comment.body), 267) - assert_equals(comment.id, 601871) - assert_equals(comment.user, 'nvie') + eq_(comment.created_at, datetime(2010, 12, 9, 22, 37, 26)) + eq_(comment.updated_at, datetime(2010, 12, 9, 22, 37, 26)) + eq_(len(comment.body), 267) + eq_(comment.id, 601871) + eq_(comment.user, 'nvie') def test_comment_repr(self): comments = self.client.issues.comments('ask/python-github2', 24) - assert_equals(repr(comments[1]), - '') + eq_(repr(comments[1]), '') class IssueQueries(utils.HttpMockTestCase): @@ -58,25 +56,25 @@ class IssueQueries(utils.HttpMockTestCase): def test_search(self): issues = self.client.issues.search('ask/python-github2', 'timezone', 'closed') - assert_equals(len(issues), 2) - assert_equals(issues[1].number, 39) + eq_(len(issues), 2) + eq_(issues[1].number, 39) def test_list(self): issues = self.client.issues.list('ask/python-github2') - assert_equals(len(issues), 4) - assert_equals(issues[-1].number, 58) + eq_(len(issues), 4) + eq_(issues[-1].number, 58) def test_list_with_state(self): issues = self.client.issues.list('ask/python-github2', "closed") - assert_equals(len(issues), 55) - assert_equals(issues[0].number, 59) + eq_(len(issues), 55) + eq_(issues[0].number, 59) def test_issue_labels(self): labels = self.client.issues.list_labels('JNRowe/misc-overlay') - assert_equals(len(labels), 4) - assert_equals(labels[0], 'feature') + eq_(len(labels), 4) + eq_(labels[0], 'feature') def test_list_by_label(self): issues = self.client.issues.list_by_label('JNRowe/misc-overlay', 'bug') - assert_equals(len(issues), 30) - assert_equals(issues[-1].number, 328) + eq_(len(issues), 30) + eq_(issues[-1].number, 328) diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 8571e23..399d450 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -5,7 +5,7 @@ from datetime import datetime -from nose.tools import (assert_equals, assert_true) +from nose.tools import (eq_, assert_true) import utils @@ -13,23 +13,21 @@ class OrganizationProperties(utils.HttpMockTestCase): def test_properties(self): organization = self.client.organizations.show('github') - assert_equals(organization.id, 9919) - assert_equals(organization.name, 'GitHub') - assert_equals(organization.blog, 'https://github.com/about') - assert_equals(organization.location, 'San Francisco, CA') - assert_equals(organization.gravatar_id, - '61024896f291303615bcd4f7a0dcfb74') - assert_equals(organization.login, 'github') - assert_equals(organization.email, 'support@github.com') - assert_equals(organization.company, None) - assert_equals(organization.created_at, - datetime(2008, 5, 10, 21, 37, 31)) - assert_equals(organization.following_count, 0) - assert_equals(organization.followers_count, 591) - assert_equals(organization.public_gist_count, 0) - assert_equals(organization.public_repo_count, 31) - assert_equals(organization.permission, None) - assert_equals(organization.plan, None) + eq_(organization.id, 9919) + eq_(organization.name, 'GitHub') + eq_(organization.blog, 'https://github.com/about') + eq_(organization.location, 'San Francisco, CA') + eq_(organization.gravatar_id, '61024896f291303615bcd4f7a0dcfb74') + eq_(organization.login, 'github') + eq_(organization.email, 'support@github.com') + eq_(organization.company, None) + eq_(organization.created_at, datetime(2008, 5, 10, 21, 37, 31)) + eq_(organization.following_count, 0) + eq_(organization.followers_count, 591) + eq_(organization.public_gist_count, 0) + eq_(organization.public_repo_count, 31) + eq_(organization.permission, None) + eq_(organization.plan, None) def test_is_authenticated(self): organization = self.client.organizations.show('github') @@ -41,29 +39,28 @@ def test_is_authenticated(self): class Organization(utils.HttpMockTestCase): def test_repr(self): organization = self.client.organizations.show('github') - assert_equals(repr(organization), - '') + eq_(repr(organization), '') class OrganizationQueries(utils.HttpMockTestCase): """Test organisation querying""" def test_public_repositories(self): repos = self.client.organizations.public_repositories('github') - assert_equals(len(repos), 31) - assert_equals(repos[2].name, 'hubahuba') + eq_(len(repos), 31) + eq_(repos[2].name, 'hubahuba') def test_public_members(self): members = self.client.organizations.public_members('github') - assert_equals(len(members), 35) - assert_equals(members[2].name, 'Ben Burkert') + eq_(len(members), 35) + eq_(members[2].name, 'Ben Burkert') class OrganizationsEdits(utils.HttpMockAuthenticatedTestCase): def test_add_team(self): team = self.client.organizations.add_team('JNRowe-test-org', 'test_pull', 'pull') - assert_equals(team.name, 'team_pull') - assert_equals(team.permission, 'pull') + eq_(team.name, 'team_pull') + eq_(team.permission, 'pull') def test_add_team_with_repos(self): projects = ['JNRowe-test-org/test1', 'JNRowe-test-org/test2'] @@ -72,5 +69,4 @@ def test_add_team_with_repos(self): projects) team_repos = self.client.teams.repositories(team.id) - assert_equals(['/'.join([x.organization, x.name]) for x in team_repos], - projects) + eq_(['/'.join([x.organization, x.name]) for x in team_repos], projects) diff --git a/tests/test_pull_requests.py b/tests/test_pull_requests.py index 9c2d35e..efe486c 100644 --- a/tests/test_pull_requests.py +++ b/tests/test_pull_requests.py @@ -5,7 +5,7 @@ from datetime import datetime -from nose.tools import assert_equals +from nose.tools import eq_ import utils @@ -13,55 +13,48 @@ class PullRequest(utils.HttpMockTestCase): def test_properties(self): pull_request = self.client.pull_requests.show('ask/python-github2', 39) - assert_equals(pull_request.state, 'closed') - assert_equals(pull_request.base['sha'], + eq_(pull_request.state, 'closed') + eq_(pull_request.base['sha'], '0786a96c80afad7bbd0747df590f649eaa46ca04') - assert_equals(pull_request.head['sha'], + eq_(pull_request.head['sha'], '5438e41d9c390f53089ed3fa0842831fafc73d8e') - assert_equals(pull_request.issue_user['login'], 'JNRowe') - assert_equals(pull_request.user['login'], 'JNRowe') - assert_equals(pull_request.title, 'Datetime timezone handling.') - assert_equals(len(pull_request.body), 1442) - assert_equals(pull_request.position, 39.0) - assert_equals(pull_request.number, 39.0) - assert_equals(pull_request.votes, 0) - assert_equals(pull_request.comments, 4) - assert_equals(pull_request.diff_url, - 'https://github.com/ask/python-github2/pull/39.diff') - assert_equals(pull_request.patch_url, - 'https://github.com/ask/python-github2/pull/39.patch') - assert_equals(pull_request.labels, []) - assert_equals(pull_request.html_url, - 'https://github.com/ask/python-github2/pull/39') - assert_equals(pull_request.issue_created_at, - datetime(2011, 4, 18, 15, 25, 47)) - assert_equals(pull_request.issue_updated_at, - datetime(2011, 6, 23, 9, 33, 57)) - assert_equals(pull_request.created_at, - datetime(2011, 6, 20, 16, 51, 24)) - assert_equals(pull_request.updated_at, - datetime(2011, 6, 23, 9, 28, 42)) - assert_equals(pull_request.closed_at, - datetime(2011, 6, 23, 9, 33, 57)) - assert_equals(len(pull_request.discussion), 13) - assert_equals(pull_request.mergeable, True) + eq_(pull_request.issue_user['login'], 'JNRowe') + eq_(pull_request.user['login'], 'JNRowe') + eq_(pull_request.title, 'Datetime timezone handling.') + eq_(len(pull_request.body), 1442) + eq_(pull_request.position, 39.0) + eq_(pull_request.number, 39.0) + eq_(pull_request.votes, 0) + eq_(pull_request.comments, 4) + eq_(pull_request.diff_url, + 'https://github.com/ask/python-github2/pull/39.diff') + eq_(pull_request.patch_url, + 'https://github.com/ask/python-github2/pull/39.patch') + eq_(pull_request.labels, []) + eq_(pull_request.html_url, + 'https://github.com/ask/python-github2/pull/39') + eq_(pull_request.issue_created_at, datetime(2011, 4, 18, 15, 25, 47)) + eq_(pull_request.issue_updated_at, datetime(2011, 6, 23, 9, 33, 57)) + eq_(pull_request.created_at, datetime(2011, 6, 20, 16, 51, 24)) + eq_(pull_request.updated_at, datetime(2011, 6, 23, 9, 28, 42)) + eq_(pull_request.closed_at, datetime(2011, 6, 23, 9, 33, 57)) + eq_(len(pull_request.discussion), 13) + eq_(pull_request.mergeable, True) def test_repr(self): pull_request = self.client.pull_requests.show('ask/python-github2', 39) - assert_equals(repr(pull_request), - '') + eq_(repr(pull_request), '') class PullRequestQueries(utils.HttpMockTestCase): """Test pull request querying""" def test_list(self): pull_requests = self.client.pull_requests.list('ask/python-github2') - assert_equals(len(pull_requests), 1) - assert_equals(pull_requests[0].title, - 'Pagination support for commits.') + eq_(len(pull_requests), 1) + eq_(pull_requests[0].title, 'Pagination support for commits.') def test_list_with_page(self): pull_requests = self.client.pull_requests.list('robbyrussell/oh-my-zsh', page=2) - assert_equals(len(pull_requests), 52) - assert_equals(pull_requests[1].title, 'Added my own custom theme') + eq_(len(pull_requests), 52) + eq_(pull_requests[1].title, 'Added my own custom theme') diff --git a/tests/test_regression.py b/tests/test_regression.py index cad7dc2..d5ff091 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -5,7 +5,7 @@ import httplib2 -from nose.tools import assert_equals +from nose.tools import eq_ from github2.client import Github @@ -21,8 +21,8 @@ def test_issue_50(): client = Github(proxy_host="my.proxy.com", proxy_port=9000) setup_args = client.request._http.called_with - assert_equals(type(setup_args['proxy_info']), httplib2.ProxyInfo) - assert_equals(setup_args['proxy_info'].proxy_host, 'my.proxy.com') - assert_equals(setup_args['proxy_info'].proxy_port, 9000) + eq_(type(setup_args['proxy_info']), httplib2.ProxyInfo) + eq_(setup_args['proxy_info'].proxy_host, 'my.proxy.com') + eq_(setup_args['proxy_info'].proxy_port, 9000) utils.unset_http_mock() diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 1cdaab9..39017df 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -7,7 +7,7 @@ import datetime -from nose.tools import assert_equals +from nose.tools import eq_ import utils @@ -15,7 +15,7 @@ class Repo(utils.HttpMockTestCase): def test_repr(self): repo = self.client.repos.show('JNRowe/misc-overlay') - assert_equals(repr(repo), '') + eq_(repr(repo), '') class RepoProperties(utils.HttpMockTestCase): @@ -23,103 +23,98 @@ class RepoProperties(utils.HttpMockTestCase): def test_repo(self): repo = self.client.repos.show('JNRowe/misc-overlay') - assert_equals(repo.name, 'misc-overlay') - assert_equals(repo.description, - 'Gentoo overlay -- miscellaneous packages') - assert_equals(repo.url, 'https://github.com/JNRowe/misc-overlay') - assert_equals(repo.owner, 'JNRowe') - assert_equals(repo.homepage, 'http://jnrowe.github.com/misc-overlay/') + eq_(repo.name, 'misc-overlay') + eq_(repo.description, 'Gentoo overlay -- miscellaneous packages') + eq_(repo.url, 'https://github.com/JNRowe/misc-overlay') + eq_(repo.owner, 'JNRowe') + eq_(repo.homepage, 'http://jnrowe.github.com/misc-overlay/') - assert_equals(repo.project, 'JNRowe/misc-overlay') + eq_(repo.project, 'JNRowe/misc-overlay') def test_meta(self): repo = self.client.repos.show('JNRowe/misc-overlay') - assert_equals(repo.forks, 0) - assert_equals(repo.watchers, 5) - assert_equals(repo.private, False) - assert_equals(repo.fork, False) - assert_equals(repo.master_branch, None) - assert_equals(repo.integration_branch, None) - assert_equals(repo.open_issues, 13) - assert_equals(repo.created_at, - datetime.datetime(2009, 5, 2, 7, 32, 50)) - assert_equals(repo.pushed_at, - datetime.datetime(2011, 8, 11, 11, 46, 23)) - assert_equals(repo.has_downloads, True) - assert_equals(repo.has_wiki, True) - assert_equals(repo.has_issues, True) - assert_equals(repo.language, 'Python') + eq_(repo.forks, 0) + eq_(repo.watchers, 5) + eq_(repo.private, False) + eq_(repo.fork, False) + eq_(repo.master_branch, None) + eq_(repo.integration_branch, None) + eq_(repo.open_issues, 13) + eq_(repo.created_at, datetime.datetime(2009, 5, 2, 7, 32, 50)) + eq_(repo.pushed_at, datetime.datetime(2011, 8, 11, 11, 46, 23)) + eq_(repo.has_downloads, True) + eq_(repo.has_wiki, True) + eq_(repo.has_issues, True) + eq_(repo.language, 'Python') def test_fork_properties(self): repo = self.client.repos.show('JNRowe/python-github2') - assert_equals(repo.forks, 0) - assert_equals(repo.fork, True) - assert_equals(repo.parent, 'ask/python-github2') - assert_equals(repo.source, 'ask/python-github2') + eq_(repo.forks, 0) + eq_(repo.fork, True) + eq_(repo.parent, 'ask/python-github2') + eq_(repo.source, 'ask/python-github2') class RepoQueries(utils.HttpMockTestCase): """Test repository querying""" def test_search(self): repos = self.client.repos.search('surfraw') - assert_equals(len(repos), 8) - assert_equals(repos[0].owner, 'JNRowe') + eq_(len(repos), 8) + eq_(repos[0].owner, 'JNRowe') def test_list(self): repos = self.client.repos.list('JNRowe') - assert_equals(len(repos), 48) - assert_equals(repos[0].name, 'bfm') + eq_(len(repos), 48) + eq_(repos[0].name, 'bfm') def test_list_with_page(self): repos = self.client.repos.list('tekkub', page=2) - assert_equals(len(repos), 37) - assert_equals(repos[0].name, 'OhSnap') + eq_(len(repos), 37) + eq_(repos[0].name, 'OhSnap') def test_watching(self): repos = self.client.repos.watching('JNRowe') - assert_equals(len(repos), 90) - assert_equals(repos[0].name, 'nerdtree') + eq_(len(repos), 90) + eq_(repos[0].name, 'nerdtree') def test_watching_with_page(self): repos = self.client.repos.watching('tekkub', page=2) - assert_equals(len(repos), 39) - assert_equals(repos[0].name, 'Buffoon') + eq_(len(repos), 39) + eq_(repos[0].name, 'Buffoon') def test_contributors(self): contributors = self.client.repos.list_contributors('ask/python-github2') - assert_equals(len(contributors), 29) - assert_equals(contributors[1].name, 'Ask Solem Hoel') + eq_(len(contributors), 29) + eq_(contributors[1].name, 'Ask Solem Hoel') def test_list_collaborators(self): collaborators = self.client.repos.list_collaborators('ask/python-github2') - assert_equals(len(collaborators), 4) - assert_equals(collaborators[2], 'JNRowe') + eq_(len(collaborators), 4) + eq_(collaborators[2], 'JNRowe') def test_languages(self): languages = self.client.repos.languages('JNRowe/misc-overlay') - assert_equals(len(languages), 2) - assert_equals(languages['Python'], 11194) + eq_(len(languages), 2) + eq_(languages['Python'], 11194) def test_tags(self): tags = self.client.repos.tags('ask/python-github2') - assert_equals(len(tags), 7) - assert_equals(tags['0.4.1'], - '96b0a41dd249c521323700bc11a0a721a7c9e642') + eq_(len(tags), 7) + eq_(tags['0.4.1'], '96b0a41dd249c521323700bc11a0a721a7c9e642') def test_branches(self): branches = self.client.repos.branches('ask/python-github2') - assert_equals(len(branches), 1) - assert_equals(branches['master'], - '1c83cde9b5a7c396a01af1007fb7b88765b9ae45') + eq_(len(branches), 1) + eq_(branches['master'], '1c83cde9b5a7c396a01af1007fb7b88765b9ae45') def test_watchers(self): watchers = self.client.repos.watchers('ask/python-github2') - assert_equals(len(watchers), 143) - assert_equals(watchers[0], 'ask') + eq_(len(watchers), 143) + eq_(watchers[0], 'ask') class AuthenticatedRepoQueries(utils.HttpMockAuthenticatedTestCase): def test_pushable(self): repos = self.client.repos.pushable() - assert_equals(len(repos), 1) - assert_equals(repos[0].name, 'python-github2') + eq_(len(repos), 1) + eq_(repos[0].name, 'python-github2') diff --git a/tests/test_teams.py b/tests/test_teams.py index 7333edd..cd18166 100644 --- a/tests/test_teams.py +++ b/tests/test_teams.py @@ -3,7 +3,7 @@ # This file is part of python-github2, and is made available under the 3-clause # BSD license. See LICENSE for the full details. -from nose.tools import assert_equals +from nose.tools import eq_ import utils @@ -11,4 +11,4 @@ class TeamEdits(utils.HttpMockAuthenticatedTestCase): def test_add_member(self): users = self.client.teams.add_member(121990, 'JNRowe') - assert_equals(users[0].login, 'JNRowe') + eq_(users[0].login, 'JNRowe') diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index 6a501f0..77302ba 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -7,7 +7,7 @@ from datetime import datetime as dt from dateutil.tz import tzutc -from nose.tools import assert_equals +from nose.tools import eq_ from github2 import core from github2.core import (datetime_to_ghdate, datetime_to_commitdate, @@ -33,150 +33,150 @@ def dt_utz(year, month, day, hour, minute, second): def test_ghdate_to_datetime(): - assert_equals(string_to_datetime('2011/05/22 00:24:15 -0700'), - dt_utz(2011, 5, 22, 7, 24, 15)) - assert_equals(string_to_datetime('2009/04/18 13:04:09 -0700'), - dt_utz(2009, 4, 18, 20, 4, 9)) - assert_equals(string_to_datetime('2009/11/12 21:15:17 -0800'), - dt_utz(2009, 11, 13, 5, 15, 17)) - assert_equals(string_to_datetime('2009/11/12 21:16:20 -0800'), - dt_utz(2009, 11, 13, 5, 16, 20)) - assert_equals(string_to_datetime('2010/04/17 17:24:29 -0700'), - dt_utz(2010, 4, 18, 0, 24, 29)) - assert_equals(string_to_datetime('2010/05/18 06:10:36 -0700'), - dt_utz(2010, 5, 18, 13, 10, 36)) - assert_equals(string_to_datetime('2010/05/25 21:59:37 -0700'), - dt_utz(2010, 5, 26, 4, 59, 37)) - assert_equals(string_to_datetime('2010/05/26 17:08:41 -0700'), - dt_utz(2010, 5, 27, 0, 8, 41)) - assert_equals(string_to_datetime('2010/06/20 06:13:37 -0700'), - dt_utz(2010, 6, 20, 13, 13, 37)) - assert_equals(string_to_datetime('2010/07/28 12:56:51 -0700'), - dt_utz(2010, 7, 28, 19, 56, 51)) - assert_equals(string_to_datetime('2010/09/20 21:32:49 -0700'), - dt_utz(2010, 9, 21, 4, 32, 49)) + eq_(string_to_datetime('2011/05/22 00:24:15 -0700'), + dt_utz(2011, 5, 22, 7, 24, 15)) + eq_(string_to_datetime('2009/04/18 13:04:09 -0700'), + dt_utz(2009, 4, 18, 20, 4, 9)) + eq_(string_to_datetime('2009/11/12 21:15:17 -0800'), + dt_utz(2009, 11, 13, 5, 15, 17)) + eq_(string_to_datetime('2009/11/12 21:16:20 -0800'), + dt_utz(2009, 11, 13, 5, 16, 20)) + eq_(string_to_datetime('2010/04/17 17:24:29 -0700'), + dt_utz(2010, 4, 18, 0, 24, 29)) + eq_(string_to_datetime('2010/05/18 06:10:36 -0700'), + dt_utz(2010, 5, 18, 13, 10, 36)) + eq_(string_to_datetime('2010/05/25 21:59:37 -0700'), + dt_utz(2010, 5, 26, 4, 59, 37)) + eq_(string_to_datetime('2010/05/26 17:08:41 -0700'), + dt_utz(2010, 5, 27, 0, 8, 41)) + eq_(string_to_datetime('2010/06/20 06:13:37 -0700'), + dt_utz(2010, 6, 20, 13, 13, 37)) + eq_(string_to_datetime('2010/07/28 12:56:51 -0700'), + dt_utz(2010, 7, 28, 19, 56, 51)) + eq_(string_to_datetime('2010/09/20 21:32:49 -0700'), + dt_utz(2010, 9, 21, 4, 32, 49)) def test_datetime_to_ghdate(): - assert_equals(datetime_to_ghdate(dt_utz(2011, 5, 22, 7, 24, 15)), - '2011/05/22 00:24:15 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2009, 4, 18, 20, 4, 9)), - '2009/04/18 13:04:09 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 15, 17)), - '2009/11/12 20:15:17 -0800') - assert_equals(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 16, 20)), - '2009/11/12 20:16:20 -0800') - assert_equals(datetime_to_ghdate(dt_utz(2010, 4, 18, 0, 24, 29)), - '2010/04/17 17:24:29 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 18, 13, 10, 36)), - '2010/05/18 06:10:36 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 26, 5, 59, 37)), - '2010/05/25 22:59:37 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 5, 27, 0, 8, 41)), - '2010/05/26 17:08:41 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 6, 20, 13, 13, 37)), - '2010/06/20 06:13:37 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 7, 28, 19, 56, 51)), - '2010/07/28 12:56:51 -0700') - assert_equals(datetime_to_ghdate(dt_utz(2010, 9, 21, 4, 32, 49)), - '2010/09/20 21:32:49 -0700') + eq_(datetime_to_ghdate(dt_utz(2011, 5, 22, 7, 24, 15)), + '2011/05/22 00:24:15 -0700') + eq_(datetime_to_ghdate(dt_utz(2009, 4, 18, 20, 4, 9)), + '2009/04/18 13:04:09 -0700') + eq_(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 15, 17)), + '2009/11/12 20:15:17 -0800') + eq_(datetime_to_ghdate(dt_utz(2009, 11, 13, 4, 16, 20)), + '2009/11/12 20:16:20 -0800') + eq_(datetime_to_ghdate(dt_utz(2010, 4, 18, 0, 24, 29)), + '2010/04/17 17:24:29 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 5, 18, 13, 10, 36)), + '2010/05/18 06:10:36 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 5, 26, 5, 59, 37)), + '2010/05/25 22:59:37 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 5, 27, 0, 8, 41)), + '2010/05/26 17:08:41 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 6, 20, 13, 13, 37)), + '2010/06/20 06:13:37 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 7, 28, 19, 56, 51)), + '2010/07/28 12:56:51 -0700') + eq_(datetime_to_ghdate(dt_utz(2010, 9, 21, 4, 32, 49)), + '2010/09/20 21:32:49 -0700') def test_commitdate_to_datetime(): - assert_equals(string_to_datetime('2011-05-22T00:24:15-07:00'), - dt_utz(2011, 5, 22, 7, 24, 15)) - assert_equals(string_to_datetime('2011-04-09T10:07:30-07:00'), - dt_utz(2011, 4, 9, 17, 7, 30)) - assert_equals(string_to_datetime('2011-02-19T07:16:11-08:00'), - dt_utz(2011, 2, 19, 15, 16, 11)) - assert_equals(string_to_datetime('2010-12-21T12:34:27-08:00'), - dt_utz(2010, 12, 21, 20, 34, 27)) - assert_equals(string_to_datetime('2011-04-09T10:20:05-07:00'), - dt_utz(2011, 4, 9, 17, 20, 5)) - assert_equals(string_to_datetime('2011-04-09T10:05:58-07:00'), - dt_utz(2011, 4, 9, 17, 5, 58)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt_utz(2011, 4, 9, 16, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T10:00:21-07:00'), - dt_utz(2011, 4, 9, 17, 0, 21)) - assert_equals(string_to_datetime('2010-12-16T15:10:59-08:00'), - dt_utz(2010, 12, 16, 23, 10, 59)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt_utz(2011, 4, 9, 16, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T09:53:00-07:00'), - dt_utz(2011, 4, 9, 16, 53, 0)) + eq_(string_to_datetime('2011-05-22T00:24:15-07:00'), + dt_utz(2011, 5, 22, 7, 24, 15)) + eq_(string_to_datetime('2011-04-09T10:07:30-07:00'), + dt_utz(2011, 4, 9, 17, 7, 30)) + eq_(string_to_datetime('2011-02-19T07:16:11-08:00'), + dt_utz(2011, 2, 19, 15, 16, 11)) + eq_(string_to_datetime('2010-12-21T12:34:27-08:00'), + dt_utz(2010, 12, 21, 20, 34, 27)) + eq_(string_to_datetime('2011-04-09T10:20:05-07:00'), + dt_utz(2011, 4, 9, 17, 20, 5)) + eq_(string_to_datetime('2011-04-09T10:05:58-07:00'), + dt_utz(2011, 4, 9, 17, 5, 58)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) + eq_(string_to_datetime('2011-04-09T10:00:21-07:00'), + dt_utz(2011, 4, 9, 17, 0, 21)) + eq_(string_to_datetime('2010-12-16T15:10:59-08:00'), + dt_utz(2010, 12, 16, 23, 10, 59)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) + eq_(string_to_datetime('2011-04-09T09:53:00-07:00'), + dt_utz(2011, 4, 9, 16, 53, 0)) def test_datetime_to_commitdate(): - assert_equals(datetime_to_commitdate(dt_utz(2011, 5, 22, 7, 24, 15)), - '2011-05-22T00:24:15-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 7, 30)), - '2011-04-09T10:07:30-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 2, 19, 15, 16, 11)), - '2011-02-19T07:16:11-08:00') - assert_equals(datetime_to_commitdate(dt_utz(2010, 12, 21, 20, 34, 27)), - '2010-12-21T12:34:27-08:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 20, 5)), - '2011-04-09T10:20:05-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 5, 58)), - '2011-04-09T10:05:58-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), - '2011-04-09T09:53:00-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 0, 21)), - '2011-04-09T10:00:21-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2010, 12, 16, 23, 10, 59)), - '2010-12-16T15:10:59-08:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), - '2011-04-09T09:53:00-07:00') - assert_equals(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), - '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 5, 22, 7, 24, 15)), + '2011-05-22T00:24:15-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 7, 30)), + '2011-04-09T10:07:30-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 2, 19, 15, 16, 11)), + '2011-02-19T07:16:11-08:00') + eq_(datetime_to_commitdate(dt_utz(2010, 12, 21, 20, 34, 27)), + '2010-12-21T12:34:27-08:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 20, 5)), + '2011-04-09T10:20:05-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 5, 58)), + '2011-04-09T10:05:58-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 17, 0, 21)), + '2011-04-09T10:00:21-07:00') + eq_(datetime_to_commitdate(dt_utz(2010, 12, 16, 23, 10, 59)), + '2010-12-16T15:10:59-08:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') + eq_(datetime_to_commitdate(dt_utz(2011, 4, 9, 16, 53, 0)), + '2011-04-09T09:53:00-07:00') def test_isodate_to_datetime(): - assert_equals(string_to_datetime('2011-05-22T00:24:15Z'), - dt_utz(2011, 5, 22, 0, 24, 15)) - assert_equals(string_to_datetime('2011-04-09T10:07:30Z'), - dt_utz(2011, 4, 9, 10, 7, 30)) - assert_equals(string_to_datetime('2011-02-19T07:16:11Z'), - dt_utz(2011, 2, 19, 7, 16, 11)) - assert_equals(string_to_datetime('2010-12-21T12:34:27Z'), - dt_utz(2010, 12, 21, 12, 34, 27)) - assert_equals(string_to_datetime('2011-04-09T10:20:05Z'), - dt_utz(2011, 4, 9, 10, 20, 5)) - assert_equals(string_to_datetime('2011-04-09T10:05:58Z'), - dt_utz(2011, 4, 9, 10, 5, 58)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt_utz(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T10:00:21Z'), - dt_utz(2011, 4, 9, 10, 0, 21)) - assert_equals(string_to_datetime('2010-12-16T15:10:59Z'), - dt_utz(2010, 12, 16, 15, 10, 59)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt_utz(2011, 4, 9, 9, 53, 0)) - assert_equals(string_to_datetime('2011-04-09T09:53:00Z'), - dt_utz(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-05-22T00:24:15Z'), + dt_utz(2011, 5, 22, 0, 24, 15)) + eq_(string_to_datetime('2011-04-09T10:07:30Z'), + dt_utz(2011, 4, 9, 10, 7, 30)) + eq_(string_to_datetime('2011-02-19T07:16:11Z'), + dt_utz(2011, 2, 19, 7, 16, 11)) + eq_(string_to_datetime('2010-12-21T12:34:27Z'), + dt_utz(2010, 12, 21, 12, 34, 27)) + eq_(string_to_datetime('2011-04-09T10:20:05Z'), + dt_utz(2011, 4, 9, 10, 20, 5)) + eq_(string_to_datetime('2011-04-09T10:05:58Z'), + dt_utz(2011, 4, 9, 10, 5, 58)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T10:00:21Z'), + dt_utz(2011, 4, 9, 10, 0, 21)) + eq_(string_to_datetime('2010-12-16T15:10:59Z'), + dt_utz(2010, 12, 16, 15, 10, 59)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) + eq_(string_to_datetime('2011-04-09T09:53:00Z'), + dt_utz(2011, 4, 9, 9, 53, 0)) def test_datetime_to_isodate(): - assert_equals(datetime_to_isodate(dt_utz(2011, 5, 22, 0, 24, 15)), - '2011-05-22T00:24:15Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 7, 30)), - '2011-04-09T10:07:30Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 2, 19, 7, 16, 11)), - '2011-02-19T07:16:11Z') - assert_equals(datetime_to_isodate(dt_utz(2010, 12, 21, 12, 34, 27)), - '2010-12-21T12:34:27Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 20, 5)), - '2011-04-09T10:20:05Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 5, 58)), - '2011-04-09T10:05:58Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 0, 21)), - '2011-04-09T10:00:21Z') - assert_equals(datetime_to_isodate(dt_utz(2010, 12, 16, 15, 10, 59)), - '2010-12-16T15:10:59Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') - assert_equals(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), - '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt_utz(2011, 5, 22, 0, 24, 15)), + '2011-05-22T00:24:15Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 7, 30)), + '2011-04-09T10:07:30Z') + eq_(datetime_to_isodate(dt_utz(2011, 2, 19, 7, 16, 11)), + '2011-02-19T07:16:11Z') + eq_(datetime_to_isodate(dt_utz(2010, 12, 21, 12, 34, 27)), + '2010-12-21T12:34:27Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 20, 5)), + '2011-04-09T10:20:05Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 5, 58)), + '2011-04-09T10:05:58Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 10, 0, 21)), + '2011-04-09T10:00:21Z') + eq_(datetime_to_isodate(dt_utz(2010, 12, 16, 15, 10, 59)), + '2010-12-16T15:10:59Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') + eq_(datetime_to_isodate(dt_utz(2011, 4, 9, 9, 53, 0)), + '2011-04-09T09:53:00Z') diff --git a/tests/test_unit.py b/tests/test_unit.py index f17f9a0..1769751 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -10,7 +10,7 @@ import datetime import unittest -from nose.tools import (assert_equals, assert_true) +from nose.tools import (eq_, assert_true) from github2.core import repr_string from github2.issues import Issue @@ -26,18 +26,18 @@ def test_issue(self): """Issues can have non-ASCII characters in the title.""" title = 'abcdé' i = Issue(title=title) - assert_equals(str, type(repr(i))) + eq_(str, type(repr(i))) class HostSetting(unittest.TestCase): def test_default_host(self): client = Github() - assert_equals(client.request.github_url, 'https://github.com') + eq_(client.request.github_url, 'https://github.com') def test_non_standard_host(self): client = Github(github_url="http://your-github-enterprise-url.com/") - assert_equals(client.request.github_url, - 'http://your-github-enterprise-url.com/') + eq_(client.request.github_url, + 'http://your-github-enterprise-url.com/') class RateLimits(utils.HttpMockTestCase): @@ -70,21 +70,21 @@ class BaseDataDict(utils.HttpMockTestCase): """Test __getitem__ availability on objects""" def test_getitem(self): user = self.client.users.show('defunkt') - assert_equals(user['blog'], user.blog) - assert_equals(user['company'], user.company) - assert_equals(user['email'], user.email) - assert_equals(user['location'], user.location) - assert_equals(user['login'], user.login) - assert_equals(user['name'], user.name) + eq_(user['blog'], user.blog) + eq_(user['company'], user.company) + eq_(user['email'], user.email) + eq_(user['location'], user.location) + eq_(user['login'], user.login) + eq_(user['name'], user.name) def test_project_for_user_repo(): client = Github() - assert_equals(client.project_for_user_repo('JNRowe', 'misc-overlay'), + eq_(client.project_for_user_repo('JNRowe', 'misc-overlay'), 'JNRowe/misc-overlay') def test_repr_string(): - assert_equals(repr_string('test'), 'test') - assert_equals(repr_string('abcdefghijklmnopqrst'), 'abcdefghijklmnopqrst') - assert_equals(repr_string('abcdefghijklmnopqrstu'), 'abcdefghijklmnopq...') + eq_(repr_string('test'), 'test') + eq_(repr_string('abcdefghijklmnopqrst'), 'abcdefghijklmnopqrst') + eq_(repr_string('abcdefghijklmnopqrstu'), 'abcdefghijklmnopq...') diff --git a/tests/test_user.py b/tests/test_user.py index 33929db..0d80359 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -5,7 +5,7 @@ import datetime -from nose.tools import (assert_equals, assert_false, assert_true) +from nose.tools import (eq_, assert_false, assert_true) import utils @@ -14,29 +14,28 @@ class UserProperties(utils.HttpMockTestCase): """Test user property handling""" def test_user(self): user = self.client.users.show('defunkt') - assert_equals(user.blog, 'http://chriswanstrath.com/') - assert_equals(user.company, 'GitHub') - assert_equals(user.email, 'chris@wanstrath.com') - assert_equals(user.location, 'San Francisco') - assert_equals(user.login, 'defunkt') - assert_equals(user.name, 'Chris Wanstrath') + eq_(user.blog, 'http://chriswanstrath.com/') + eq_(user.company, 'GitHub') + eq_(user.email, 'chris@wanstrath.com') + eq_(user.location, 'San Francisco') + eq_(user.login, 'defunkt') + eq_(user.name, 'Chris Wanstrath') def test_meta(self): user = self.client.users.show('defunkt') - assert_equals(user.created_at, - datetime.datetime(2007, 10, 19, 22, 24, 19)) - assert_equals(user.followers_count, 3402) - assert_equals(user.following_count, 212) - assert_equals(user.gravatar_id, 'b8dbb1987e8e5318584865f880036796') - assert_equals(user.id, 2) - assert_equals(user.public_gist_count, 278) - assert_equals(user.public_repo_count, 93) + eq_(user.created_at, datetime.datetime(2007, 10, 19, 22, 24, 19)) + eq_(user.followers_count, 3402) + eq_(user.following_count, 212) + eq_(user.gravatar_id, 'b8dbb1987e8e5318584865f880036796') + eq_(user.id, 2) + eq_(user.public_gist_count, 278) + eq_(user.public_repo_count, 93) def test_followers(self): - assert_equals(len(self.client.users.followers('defunkt')), 3402) + eq_(len(self.client.users.followers('defunkt')), 3402) def test_following(self): - assert_equals(len(self.client.users.following('defunkt')), 212) + eq_(len(self.client.users.following('defunkt')), 212) def test_is_not_authenticated(self): user = self.client.users.show('defunkt') @@ -46,12 +45,12 @@ def test_is_not_authenticated(self): class UserQueries(utils.HttpMockTestCase): """Test user querying """ def test_search(self): - assert_equals(repr(self.client.users.search('James Rowe')), - '[, ]') + eq_(repr(self.client.users.search('James Rowe')), + '[, ]') def test_search_by_email(self): user = self.client.users.search_by_email('jnrowe@gmail.com') - assert_equals(repr(user), '') + eq_(repr(user), '') class AuthenticatedUserMethods(utils.HttpMockAuthenticatedTestCase): @@ -69,21 +68,21 @@ def test_is_authenticated(self): def test_list_keys(self): keys = self.client.users.list_keys() - assert_equals(keys[0].id, 1337) + eq_(keys[0].id, 1337) class AuthenticatedUserProperties(utils.HttpMockAuthenticatedTestCase): def test_private_data(self): user = self.client.users.show('') - assert_equals(user.total_private_repo_count, 0) - assert_equals(user.collaborators, 0) - assert_equals(user.disk_usage, 66069) - assert_equals(user.owned_private_repo_count, 0) - assert_equals(user.private_gist_count, 7) + eq_(user.total_private_repo_count, 0) + eq_(user.collaborators, 0) + eq_(user.disk_usage, 66069) + eq_(user.owned_private_repo_count, 0) + eq_(user.private_gist_count, 7) def test_plan_data(self): user = self.client.users.show('') - assert_equals(user.plan['name'], "free") - assert_equals(user.plan['collaborators'], 0) - assert_equals(user.plan['space'], 307200) - assert_equals(user.plan['private_repos'], 0) + eq_(user.plan['name'], "free") + eq_(user.plan['collaborators'], 0) + eq_(user.plan['space'], 307200) + eq_(user.plan['private_repos'], 0) From 01fdd82966c044e17b8f786369197203ec8b8b8a Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:38:26 +0100 Subject: [PATCH 436/454] Use nose.tools.ok_ instead of assert_true. --- tests/test_organizations.py | 6 +++--- tests/test_unit.py | 10 +++++----- tests/test_user.py | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/test_organizations.py b/tests/test_organizations.py index 399d450..e2ddc77 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -5,7 +5,7 @@ from datetime import datetime -from nose.tools import (eq_, assert_true) +from nose.tools import (eq_, ok_) import utils @@ -31,9 +31,9 @@ def test_properties(self): def test_is_authenticated(self): organization = self.client.organizations.show('github') - assert_true(organization.is_authenticated() is False) + ok_(organization.is_authenticated() is False) organization = self.client.organizations.show('fake_org_with_auth') - assert_true(organization.is_authenticated() is True) + ok_(organization.is_authenticated() is True) class Organization(utils.HttpMockTestCase): diff --git a/tests/test_unit.py b/tests/test_unit.py index 1769751..ce93198 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -10,7 +10,7 @@ import datetime import unittest -from nose.tools import (eq_, assert_true) +from nose.tools import (eq_, ok_) from github2.core import repr_string from github2.issues import Issue @@ -53,9 +53,9 @@ def test_delays(self): delta = end - start delta_seconds = delta.days * 24 * 60 * 60 + delta.seconds - assert_true(delta_seconds >= 2, - "Expected .5 reqs per second to require a 2 second delay " - "between calls.") + ok_(delta_seconds >= 2, + "Expected .5 reqs per second to require a 2 second delay between " + "calls.") class BaseDataIter(utils.HttpMockTestCase): @@ -63,7 +63,7 @@ class BaseDataIter(utils.HttpMockTestCase): def test_iter(self): commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' commit = self.client.commits.show('ask/python-github2', commit_id) - assert_true('__iter__' in dir(commit)) + ok_('__iter__' in dir(commit)) class BaseDataDict(utils.HttpMockTestCase): diff --git a/tests/test_user.py b/tests/test_user.py index 0d80359..61fbc5c 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -5,7 +5,7 @@ import datetime -from nose.tools import (eq_, assert_false, assert_true) +from nose.tools import (eq_, assert_false, ok_) import utils @@ -39,7 +39,7 @@ def test_following(self): def test_is_not_authenticated(self): user = self.client.users.show('defunkt') - assert_true(user.is_authenticated() is False) + ok_(user.is_authenticated() is False) class UserQueries(utils.HttpMockTestCase): @@ -56,7 +56,7 @@ def test_search_by_email(self): class AuthenticatedUserMethods(utils.HttpMockAuthenticatedTestCase): def test_follow(self): result = self.client.users.follow('defunkt') - assert_true('defunkt' in result['users']) + ok_('defunkt' in result['users']) def test_unfollow(self): result = self.client.users.unfollow('defunkt') @@ -64,7 +64,7 @@ def test_unfollow(self): def test_is_authenticated(self): user = self.client.users.show('') - assert_true(user.is_authenticated() is True) + ok_(user.is_authenticated() is True) def test_list_keys(self): keys = self.client.users.list_keys() From bb968da0cc90dd60cf1709341a4b760d93a8405c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:42:00 +0100 Subject: [PATCH 437/454] [QA] PEP 257 fixes to tests. --- tests/test_commits.py | 5 ++++- tests/test_issues.py | 4 +++- tests/test_regression.py | 2 +- tests/test_repositories.py | 4 +++- tests/test_request.py | 4 +++- tests/test_tz_aware_date_handling.py | 7 ++++--- tests/test_unit.py | 15 +++++++++++---- tests/test_user.py | 8 ++++++-- tests/utils.py | 14 +++++++++----- 9 files changed, 44 insertions(+), 19 deletions(-) diff --git a/tests/test_commits.py b/tests/test_commits.py index 33f037c..b27fbd3 100644 --- a/tests/test_commits.py +++ b/tests/test_commits.py @@ -11,7 +11,9 @@ class CommitProperties(utils.HttpMockTestCase): - """Test commit property handling""" + + """Test commit property handling.""" + commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' def test_commit(self): @@ -38,6 +40,7 @@ def test_repr(self): class CommitsQueries(utils.HttpMockTestCase): + """Test commit querying""" def test_list(self): diff --git a/tests/test_issues.py b/tests/test_issues.py index 2abf495..67cbff7 100644 --- a/tests/test_issues.py +++ b/tests/test_issues.py @@ -52,7 +52,9 @@ def test_comment_repr(self): class IssueQueries(utils.HttpMockTestCase): - """Test issue querying""" + + """Test issue querying.""" + def test_search(self): issues = self.client.issues.search('ask/python-github2', 'timezone', 'closed') diff --git a/tests/test_regression.py b/tests/test_regression.py index d5ff091..d9de696 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -13,7 +13,7 @@ def test_issue_50(): - """Erroneous init of ``Http`` with proxy setup + """Erroneous init of ``Http`` with proxy setup. See https://github.com/ask/python-github2/pull/50 """ diff --git a/tests/test_repositories.py b/tests/test_repositories.py index 39017df..8abbc30 100644 --- a/tests/test_repositories.py +++ b/tests/test_repositories.py @@ -19,7 +19,9 @@ def test_repr(self): class RepoProperties(utils.HttpMockTestCase): - """Test repository property handling""" + + """Test repository property handling.""" + def test_repo(self): repo = self.client.repos.show('JNRowe/misc-overlay') diff --git a/tests/test_request.py b/tests/test_request.py index 0833c00..529de26 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -35,7 +35,9 @@ def assert_params_contain(first, second): class TestAuthEncode(unittest.TestCase): - """Test processing of authentication data""" + + """Test processing of authentication data.""" + def setUp(self): self.r = request.GithubRequest() diff --git a/tests/test_tz_aware_date_handling.py b/tests/test_tz_aware_date_handling.py index 77302ba..c2b152f 100644 --- a/tests/test_tz_aware_date_handling.py +++ b/tests/test_tz_aware_date_handling.py @@ -15,19 +15,20 @@ def setup_module(): - """Enable timezone-aware datetime handling for this module's tests""" + """Enable timezone-aware datetime handling for this module's tests.""" core.NAIVE = False def teardown_module(): - """Disable timezone-aware datetime handling when tests have completed""" + """Disable timezone-aware datetime handling when tests have completed.""" core.NAIVE = True def dt_utz(year, month, day, hour, minute, second): - """Produce a UTC-anchored datetime object + """Produce a UTC-anchored datetime object. :see: :class:`datetime.datetime` + """ return dt(year, month, day, hour, minute, second, tzinfo=tzutc()) diff --git a/tests/test_unit.py b/tests/test_unit.py index ce93198..2095952 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -20,6 +20,7 @@ class ReprTests(unittest.TestCase): + """__repr__ must return strings, not unicode objects.""" def test_issue(self): @@ -41,9 +42,11 @@ def test_non_standard_host(self): class RateLimits(utils.HttpMockTestCase): - """Test API rate-limitting""" + + """Test API rate-limitting.""" + def test_delays(self): - """Test call delay is at least one second""" + """Test call delay is at least one second.""" client = Github(requests_per_second=.5) client.users.show('defunkt') start = datetime.datetime.utcnow() @@ -59,7 +62,9 @@ def test_delays(self): class BaseDataIter(utils.HttpMockTestCase): - """Test iter availability of objects""" + + """Test iter availability of objects.""" + def test_iter(self): commit_id = '1c83cde9b5a7c396a01af1007fb7b88765b9ae45' commit = self.client.commits.show('ask/python-github2', commit_id) @@ -67,7 +72,9 @@ def test_iter(self): class BaseDataDict(utils.HttpMockTestCase): - """Test __getitem__ availability on objects""" + + """Test __getitem__ availability on objects.""" + def test_getitem(self): user = self.client.users.show('defunkt') eq_(user['blog'], user.blog) diff --git a/tests/test_user.py b/tests/test_user.py index 61fbc5c..c2fab11 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -11,7 +11,9 @@ class UserProperties(utils.HttpMockTestCase): - """Test user property handling""" + + """Test user property handling.""" + def test_user(self): user = self.client.users.show('defunkt') eq_(user.blog, 'http://chriswanstrath.com/') @@ -43,7 +45,9 @@ def test_is_not_authenticated(self): class UserQueries(utils.HttpMockTestCase): - """Test user querying """ + + """Test user querying.""" + def test_search(self): eq_(repr(self.client.users.search('James Rowe')), '[, ]') diff --git a/tests/utils.py b/tests/utils.py index 598b068..1b38949 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -25,9 +25,10 @@ class HttpMock(object): - """Simple Http mock that returns saved entries + """Simple Http mock that returns saved entries. + + Implementation tests should never span network boundaries. - Implementation tests should never span network boundaries """ def __init__(self, cache=None, timeout=None, proxy_info=None, @@ -55,33 +56,36 @@ def request(self, uri, method='GET', body=None, headers=None, class HttpMockTestCase(unittest.TestCase): def setUp(self): - """Prepare test fixtures + """Prepare test fixtures. `httplib2.Http` is patched to return cached entries via :class:`HttpMock`. :attr:`client` is an unauthenticated :obj:`Github` object for easy use in tests. + """ httplib2.Http = HttpMock self.client = Github() def tearDown(self): - """Remove test fixtures + """Remove test fixtures. `httplib2.Http` is returned to its original state. + """ httplib2.Http = ORIG_HTTP_OBJECT class HttpMockAuthenticatedTestCase(HttpMockTestCase): def setUp(self): - """Prepare test fixtures + """Prepare test fixtures. :see: :class:`HttpMockTestCase` :attr:`client` is an authenticated :obj:`Github` object for easy use in tests. + """ httplib2.Http = HttpMock self.client = Github(access_token='xxx') From 0010b09bb1d4b71ef98b55c67bbe8249557df394 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:42:29 +0100 Subject: [PATCH 438/454] Mark rate limit test with 'slow' attribute. --- tests/test_unit.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 2095952..5a5b55c 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -11,6 +11,7 @@ import unittest from nose.tools import (eq_, ok_) +from nose.plugins.attrib import attr from github2.core import repr_string from github2.issues import Issue @@ -45,6 +46,7 @@ class RateLimits(utils.HttpMockTestCase): """Test API rate-limitting.""" + @attr('slow') def test_delays(self): """Test call delay is at least one second.""" client = Github(requests_per_second=.5) From e1b7047a1439346c1d5a83cb497b0c1478cfd73d Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:43:10 +0100 Subject: [PATCH 439/454] Rewrite issue 50 test without using Http mock. --- tests/test_regression.py | 14 ++++---------- tests/utils.py | 11 ++--------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/tests/test_regression.py b/tests/test_regression.py index d9de696..b5fee60 100644 --- a/tests/test_regression.py +++ b/tests/test_regression.py @@ -9,20 +9,14 @@ from github2.client import Github -import utils - def test_issue_50(): """Erroneous init of ``Http`` with proxy setup. See https://github.com/ask/python-github2/pull/50 """ - utils.set_http_mock() - client = Github(proxy_host="my.proxy.com", proxy_port=9000) - setup_args = client.request._http.called_with - eq_(type(setup_args['proxy_info']), httplib2.ProxyInfo) - eq_(setup_args['proxy_info'].proxy_host, 'my.proxy.com') - eq_(setup_args['proxy_info'].proxy_port, 9000) - - utils.unset_http_mock() + proxy_info = client.request._http.proxy_info + eq_(type(proxy_info), httplib2.ProxyInfo) + eq_(proxy_info.proxy_host, 'my.proxy.com') + eq_(proxy_info.proxy_port, 9000) diff --git a/tests/utils.py b/tests/utils.py index 1b38949..e66284b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -31,15 +31,8 @@ class HttpMock(object): """ - def __init__(self, cache=None, timeout=None, proxy_info=None, - ca_certs=None): - """Create a mock httplib.Http object - - .. attribute: called_with - - ``locals()`` during ``__init__``, for testing call spec - """ - self.called_with = locals() + def __init__(self, *args, **kwargs): + pass def request(self, uri, method='GET', body=None, headers=None, redirections=5, connection_type=None): From 6035cc3784543650fa8c9a731908c1b49d327cb4 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 19:45:03 +0100 Subject: [PATCH 440/454] Http mocking switched to use mock.Mock object. --- extra/requirements-test.txt | 1 + tests/utils.py | 58 +++++++++++++------------------------ 2 files changed, 21 insertions(+), 38 deletions(-) diff --git a/extra/requirements-test.txt b/extra/requirements-test.txt index c8d6b88..d271169 100644 --- a/extra/requirements-test.txt +++ b/extra/requirements-test.txt @@ -1,3 +1,4 @@ -r requirements.txt coverage>=3.5 +mock>=0.7.1 nose>=1.1.2 diff --git a/tests/utils.py b/tests/utils.py index e66284b..313836e 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -11,6 +11,8 @@ import httplib2 +from mock import Mock + from github2.client import Github from github2.request import charset_from_headers @@ -19,32 +21,26 @@ bytes = lambda x, enc: x -HTTP_DATA_DIR = "tests/data/" - -ORIG_HTTP_OBJECT = httplib2.Http +ORIG_REQUEST_METHOD = httplib2.Http.request -class HttpMock(object): - """Simple Http mock that returns saved entries. +def request_mock(uri, method='GET', body=None, headers=None, + redirections=5, connection_type=None): + """Http mock side effect that returns saved entries. Implementation tests should never span network boundaries. """ - def __init__(self, *args, **kwargs): - pass - - def request(self, uri, method='GET', body=None, headers=None, - redirections=5, connection_type=None): - file = os.path.join(HTTP_DATA_DIR, httplib2.safename(uri)) - if os.path.exists(file): - response = message_from_file(open(file)) - headers = httplib2.Response(response) - body = bytes(response.get_payload(), charset_from_headers(headers)) - return (headers, body) - else: - return (httplib2.Response({"status": "404"}), - "Resource %r unavailable from test data store" % file) + file = os.path.join("tests/data", httplib2.safename(uri)) + if os.path.exists(file): + response = message_from_file(open(file)) + headers = httplib2.Response(response) + body = bytes(response.get_payload(), charset_from_headers(headers)) + return (headers, body) + else: + return (httplib2.Response({"status": "404"}), + "Resource %r unavailable from test data store" % file) class HttpMockTestCase(unittest.TestCase): @@ -58,7 +54,8 @@ def setUp(self): in tests. """ - httplib2.Http = HttpMock + httplib2.Http.request = Mock(spec_set=httplib2.Http.request, + side_effect=request_mock) self.client = Github() def tearDown(self): @@ -67,7 +64,7 @@ def tearDown(self): `httplib2.Http` is returned to its original state. """ - httplib2.Http = ORIG_HTTP_OBJECT + httplib2.Http.request = ORIG_REQUEST_METHOD class HttpMockAuthenticatedTestCase(HttpMockTestCase): @@ -80,21 +77,6 @@ def setUp(self): in tests. """ - httplib2.Http = HttpMock + httplib2.Http.request = Mock(spec_set=httplib2.Http.request, + side_effect=request_mock) self.client = Github(access_token='xxx') - - -def set_http_mock(): - """Function to enable ``Http`` mock - - This is useful in simple `nose`-compliant test functions - """ - httplib2.Http = HttpMock - - -def unset_http_mock(): - """Function to disable ``Http`` mock - - :see: :func:`set_http_mock` - """ - httplib2.Http = ORIG_HTTP_OBJECT From 62472a34b18636219c286e2b9770ed8b4cfae5c6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 20:48:07 +0100 Subject: [PATCH 441/454] Added test for requires_auth decorator. --- tests/test_unit.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index 5a5b55c..988d8d6 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -10,10 +10,10 @@ import datetime import unittest -from nose.tools import (eq_, ok_) +from nose.tools import (eq_, ok_, raises) from nose.plugins.attrib import attr -from github2.core import repr_string +from github2.core import (AuthError, repr_string, requires_auth) from github2.issues import Issue from github2.client import Github @@ -97,3 +97,12 @@ def test_repr_string(): eq_(repr_string('test'), 'test') eq_(repr_string('abcdefghijklmnopqrst'), 'abcdefghijklmnopqrst') eq_(repr_string('abcdefghijklmnopqrstu'), 'abcdefghijklmnopq...') + + +class RequiresAuth(utils.HttpMockTestCase): + @raises(AuthError) + def test_no_auth(self): + f = lambda: None + f.__doc__ = 'test func' + wrapped = requires_auth(f) + wrapped(self.client) From fd2a2ba8196a7150fa90cb882fd6806265bc8f3e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 20:59:13 +0100 Subject: [PATCH 442/454] Added BaseData dict key failure test. --- tests/test_unit.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_unit.py b/tests/test_unit.py index 988d8d6..50312d0 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -86,6 +86,11 @@ def test_getitem(self): eq_(user['login'], user.login) eq_(user['name'], user.name) + @raises(KeyError) + def test_getitem_failure(self): + user = self.client.users.show('defunkt') + ok_(user['invalid_key']) + def test_project_for_user_repo(): client = Github() From fbe6e453a5d828c9317642f5647ea47e32da4670 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 21:07:25 +0100 Subject: [PATCH 443/454] Added BaseData dict setting tests. --- tests/test_unit.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index 50312d0..d49dc38 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -75,7 +75,7 @@ def test_iter(self): class BaseDataDict(utils.HttpMockTestCase): - """Test __getitem__ availability on objects.""" + """Test dict compatibility on objects.""" def test_getitem(self): user = self.client.users.show('defunkt') @@ -91,6 +91,16 @@ def test_getitem_failure(self): user = self.client.users.show('defunkt') ok_(user['invalid_key']) + def test_setitem(self): + user = self.client.users.show('defunkt') + user['blog'] = 'http://example.com' + eq_(user['blog'], 'http://example.com') + + @raises(KeyError) + def test_setitem_failure(self): + user = self.client.users.show('defunkt') + user['invalid_key'] = 'test' + def test_project_for_user_repo(): client = Github() From 5c60b01d58359da94c11c4e8cd016050185a8fa8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 21:54:45 +0100 Subject: [PATCH 444/454] Use mock for sleep in rate limit tests. --- tests/test_unit.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/tests/test_unit.py b/tests/test_unit.py index d49dc38..104256d 100644 --- a/tests/test_unit.py +++ b/tests/test_unit.py @@ -7,11 +7,10 @@ # This file is part of python-github2, and is made available under the 3-clause # BSD license. See LICENSE for the full details. -import datetime import unittest +from mock import patch from nose.tools import (eq_, ok_, raises) -from nose.plugins.attrib import attr from github2.core import (AuthError, repr_string, requires_auth) from github2.issues import Issue @@ -44,23 +43,17 @@ def test_non_standard_host(self): class RateLimits(utils.HttpMockTestCase): - """Test API rate-limitting.""" + """Test API rate-limiting.""" - @attr('slow') - def test_delays(self): - """Test call delay is at least one second.""" + @patch('github2.request.time.sleep') + def test_delays(self, sleep): + """Test calls in quick succession are delayed.""" client = Github(requests_per_second=.5) client.users.show('defunkt') - start = datetime.datetime.utcnow() client.users.show('mojombo') - end = datetime.datetime.utcnow() - delta = end - start - delta_seconds = delta.days * 24 * 60 * 60 + delta.seconds - - ok_(delta_seconds >= 2, - "Expected .5 reqs per second to require a 2 second delay between " - "calls.") + # 0.5 requests per second, means a two second delay + sleep.assert_called_once_with(2.0) class BaseDataIter(utils.HttpMockTestCase): From 614d8b25f49af6d29ad77aa529a0e7cb09b41bb8 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 21:56:30 +0100 Subject: [PATCH 445/454] Fix BaseData dict compat logging. --- github2/core.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/github2/core.py b/github2/core.py index f1629fd..86d4788 100644 --- a/github2/core.py +++ b/github2/core.py @@ -364,8 +364,7 @@ def __getitem__(self, key): """ LOGGER.warning("Subscript access on %r is deprecated, use object " - "attributes" % self.__class__.__name__, - DeprecationWarning) + "attributes" % self.__class__.__name__) if not key in self._meta.keys(): raise KeyError(key) return getattr(self, key) @@ -377,8 +376,7 @@ def __setitem__(self, key, value): """ LOGGER.warning("Subscript access on %r is deprecated, use object " - "attributes" % self.__class__.__name__, - DeprecationWarning) + "attributes" % self.__class__.__name__) if not key in self._meta.keys(): raise KeyError(key) setattr(self, key, value) From 32a076965d578fb62208939e9b8f5711df1e3e9e Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 16 May 2012 21:57:55 +0100 Subject: [PATCH 446/454] Handle symlinked certificate bundles for httplib2, --- github2/request.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/github2/request.py b/github2/request.py index 31afa78..1314c77 100644 --- a/github2/request.py +++ b/github2/request.py @@ -59,8 +59,12 @@ #: Logger for requests module LOGGER = logging.getLogger('github2.request') +# Fetch actual path for httplib2's default cert bundle, for distributions that +# symlink their system certs +_HTTPLIB2_BUNDLE = path.realpath(path.dirname(httplib2.CA_CERTS)) #: Whether github2 is using the system's certificates for SSL connections -SYSTEM_CERTS = not httplib2.CA_CERTS.startswith(path.dirname(httplib2.__file__)) +SYSTEM_CERTS = not _HTTPLIB2_BUNDLE.startswith(path.dirname(httplib2.__file__)) +CA_CERTS = None #: Whether github2 is using the cert's from the file given in $CURL_CA_BUNDLE CURL_CERTS = False if not SYSTEM_CERTS and sys.platform.startswith('linux'): From 55d92f3268163c3bef902bdb06be706993dd33b5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 23 May 2012 05:52:51 +0100 Subject: [PATCH 447/454] Updated dependency information for dateutil-2.1 support. This has become quite messy, to the point that I had a little look for a hackable replacement. --- doc/install.rst | 5 +++-- extra/requirements-py25.txt | 5 +++-- extra/requirements-py3.txt | 2 -- extra/requirements.txt | 4 ++-- setup.py | 10 +++++++--- 5 files changed, 15 insertions(+), 11 deletions(-) delete mode 100644 extra/requirements-py3.txt diff --git a/doc/install.rst b/doc/install.rst index 84b57de..7eb1aa6 100644 --- a/doc/install.rst +++ b/doc/install.rst @@ -33,5 +33,6 @@ handling [#]_. :pypi:`simplejson` is also required when using :mod:`github2` with Python 2.4 or 2.5. If you install via :pypi:`pip` or :pypi:`easy_install ` the dependencies should be installed automatically for you. -.. [#] You must use :pypi:`python-dateutil` 1.x when working with Python 2.x, - the latest 2.x releases are for Python 3.x installations only. +.. [#] You must use :pypi:`python-dateutil` 1.x when working with Python 2.5 or + earlier, the latest 2.x releases are for Python 2.6 and newer + installations only. diff --git a/extra/requirements-py25.txt b/extra/requirements-py25.txt index 33f97ee..45bfac5 100644 --- a/extra/requirements-py25.txt +++ b/extra/requirements-py25.txt @@ -1,2 +1,3 @@ --r requirements.txt -simplejson>=2.0.9 +httplib2 >= 0.7.0 +python-dateutil < 2.0, >= 2.1 +simplejson >= 2.0.9 diff --git a/extra/requirements-py3.txt b/extra/requirements-py3.txt deleted file mode 100644 index 457b3fb..0000000 --- a/extra/requirements-py3.txt +++ /dev/null @@ -1,2 +0,0 @@ -httplib2>=0.7.0 -python-dateutil>=2.0 diff --git a/extra/requirements.txt b/extra/requirements.txt index 57c76c4..5115300 100644 --- a/extra/requirements.txt +++ b/extra/requirements.txt @@ -1,2 +1,2 @@ -httplib2>=0.7.0 -python-dateutil<2.0 +httplib2 >= 0.7.0 +python-dateutil < 2.0 diff --git a/setup.py b/setup.py index 06c56bb..72073f5 100755 --- a/setup.py +++ b/setup.py @@ -23,10 +23,14 @@ if sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') -if sys.version_info >= (3,): - install_requires.append('python-dateutil >= 2.0') -else: +# dateutil supports python 2.x in dateutil-1, python 3.x in dateutil-2.0 and +# python 2.6+ in dateutil-2.1. Exciting… +if sys.version_info[:2] <= (2, 5): install_requires.append('python-dateutil < 2.0') +elif sys.version_info < (3, ): + install_requires.append('python-dateutil < 2.0, >= 2.1') +else: + install_requires.append('python-dateutil > 2.0') long_description = (codecs.open('README.rst', "r", "utf-8").read() + "\n" + codecs.open('NEWS.rst', "r", "utf-8").read()) From a77c23a85a1f2eacebd0697608bbe510e3ee775c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 23 May 2012 07:52:17 +0100 Subject: [PATCH 448/454] Fixed simplejson dependency for Python 2.4. Recent versions of simplejson no longer support Python 2.4. --- setup.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 72073f5..b72d775 100755 --- a/setup.py +++ b/setup.py @@ -19,8 +19,12 @@ install_requires = ['httplib2 >= 0.7.0', ] -# simplejson is included in the standard library since Python 2.6 as json. -if sys.version_info[:2] < (2, 6): + +# simplejson is included in the standard library since Python 2.6 as json +if sys.version_info < (2, 5): + # 2.1 drops support for 2.4 + install_requires.append('simplejson >= 2.0.9, < 2.1') +elif sys.version_info[:2] < (2, 6): install_requires.append('simplejson >= 2.0.9') # dateutil supports python 2.x in dateutil-1, python 3.x in dateutil-2.0 and From bad4e74bf58ad3d4c964070a54304a67ff8b4b09 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Wed, 23 May 2012 07:52:46 +0100 Subject: [PATCH 449/454] Re-sync dependencies in tox config. --- tox.ini | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tox.ini b/tox.ini index 531bac9..ffb9775 100644 --- a/tox.ini +++ b/tox.ini @@ -6,8 +6,28 @@ envlist = py24, py25, py26, py27, py31, py32, rst, sphinx deps = nose coverage + mock commands = nosetests {posargs:-vv} tests +# When tox 1.4 is released use substitution to remove all the duplication. +[testenv:py24] +deps = + nose + coverage + mock + unittest2 +[testenv:py25] +deps = + nose + coverage + mock + unittest2 +[testenv:py26] +deps = + nose + coverage + mock + unittest2 [testenv:rst] deps = docutils From 46020575a632f1a4b78c878c84d40e1400ccd42c Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Jun 2012 13:08:14 +0100 Subject: [PATCH 450/454] Rewording of the API v3 migration note. There has been a reprieve for the API v2 switch-off, and the note from 3414c22d25a54624e554be5bdb8a6fb327ff27d7 is no longer as urgent. --- README.rst | 5 ++--- doc/index.rst | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index a266014..b3897ef 100644 --- a/README.rst +++ b/README.rst @@ -8,8 +8,8 @@ github2 - GitHub API v2 library for Python. .. warning:: - GitHub are planning to `switch off API v2`_ on 2012-05-01, you should - be looking to replace ``github2`` as soon as possible. + GitHub have marked API v2 as deprecated, you should be looking to replace + your usage of ``github2`` in the near future. Both remoteobjects_ and micromodels_ provide easy-to-use functionality for creating bindings to remote APIs, and should significantly reduce the amount @@ -21,7 +21,6 @@ of the `GitHub API`_. See the ``doc/`` directory for installation instructions and usage information. If you prefer you can also read the `documentation online`_. -.. _switch off API v2: https://github.com/blog/1090-github-api-moving-on .. _remoteobjects: https://github.com/saymedia/remoteobjects .. _micromodels: https://github.com/j4mie/micromodels .. _GitHub API: http://develop.github.com/ diff --git a/doc/index.rst b/doc/index.rst index d909c02..963e6a2 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -16,14 +16,13 @@ .. warning:: - GitHub are planning to `switch off API v2`_ on 2012-05-01, you should - be looking to replace ``github2`` as soon as possible. + GitHub have marked API v2 as deprecated, you should be looking to replace + your usage of ``github2`` in the near future. Both remoteobjects_ and micromodels_ provide easy-to-use functionality for creating bindings to remote APIs, and should significantly reduce the amount of work needed in moving away from GitHub's API v2. -.. _switch off API v2: https://github.com/blog/1090-github-api-moving-on .. _remoteobjects: https://github.com/saymedia/remoteobjects .. _micromodels: https://github.com/j4mie/micromodels From 8647c559ceb9b0ecd3af68e728e36fb2de4b6ab2 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Jun 2012 13:09:34 +0100 Subject: [PATCH 451/454] Minor fixes to quickstart doc. This makes the usage far closer to what a user would expect in an interactive session. --- doc/quickstart.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/quickstart.rst b/doc/quickstart.rst index 2d3988f..ff54b29 100644 --- a/doc/quickstart.rst +++ b/doc/quickstart.rst @@ -13,6 +13,7 @@ package. Create an unauthenticated client object:: + >>> from github2.client import Github >>> github = Github() .. note:: @@ -28,6 +29,7 @@ Read the description of the ``python-github2`` project:: >>> repo = github.repos.show("ask/python-github2") >>> repo.description + u'github client in python, with issues support.' We can take advantage of Python's :func:`dir` to explore the package a little more:: From 698394fa0d5e03ca43a02dccd4ce6a2f553576f5 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Jun 2012 13:22:19 +0100 Subject: [PATCH 452/454] Include ChangeLog in sdist generated tarballs. --- MANIFEST.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MANIFEST.in b/MANIFEST.in index ac52cc3..e77f35d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,6 @@ recursive-include examples * + +include ChangeLog include NEWS.rst include README.rst include AUTHORS From 587f415607426a1eb1ab8e13f8ea0031525d3de6 Mon Sep 17 00:00:00 2001 From: James Rowe Date: Mon, 11 Jun 2012 13:46:39 +0100 Subject: [PATCH 453/454] Bumped version to 0.6.2. --- NEWS.rst | 6 ++++++ README.rst | 2 +- github2/_version.py | 14 +++++++------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index e7092fe..eaa874c 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -6,6 +6,12 @@ look at the `git repository`_ for the full project history. .. _git repository: https://github.com/ask/python-github2/ +0.6.2 - 2012-06-11 +------------------ + +* Updated dependencies to handle recent ``python-dateutil`` releases +* Fixed ``simplejson`` dependencies for Python 2.4 + 0.6.1 - 2012-02-28 ------------------ diff --git a/README.rst b/README.rst index b3897ef..a91633f 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ github2 - GitHub API v2 library for Python. :Authors: Ask Solem (askh@opera.com) -:Version: 0.6.1 +:Version: 0.6.2 .. warning:: diff --git a/github2/_version.py b/github2/_version.py index 0269a27..6e26b1f 100644 --- a/github2/_version.py +++ b/github2/_version.py @@ -1,9 +1,9 @@ -# This is github2 version 0.6.1 (2012-02-28) +# This is github2 version 0.6.2 (2012-06-11) # pylint: disable=C0103, C0111, C0121, W0622 -dotted = "0.6.1" -libtool = "6:21" -hex = 0x000601 -date = "2012-02-28" -tuple = (0, 6, 1) -web = "github2/0.6.1" +dotted = "0.6.2" +libtool = "6:22" +hex = 0x000602 +date = "2012-06-11" +tuple = (0, 6, 2) +web = "github2/0.6.2" From 4287019520643e2fcd46c9c5b3aac439cdc35b88 Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Tue, 20 Jul 2021 07:48:23 +1000 Subject: [PATCH 454/454] docs: Fix a few typos (#82) There are small typos in: - github2/client.py - github2/request.py Fixes: - Should read `specific` rather than `specifc`. - Should read `occurred` rather than `occured`. --- github2/client.py | 2 +- github2/request.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/github2/client.py b/github2/client.py index 56b5dcd..d0a3f2b 100644 --- a/github2/client.py +++ b/github2/client.py @@ -107,7 +107,7 @@ def get_blob_info(self, project, tree_sha, path): return blob.get("blob") def get_tree(self, project, tree_sha): - """Get tree information for a specifc tree. + """Get tree information for a specific tree. :param str project: GitHub project :param str tree_sha: object ID of tree diff --git a/github2/request.py b/github2/request.py index 1314c77..5961471 100644 --- a/github2/request.py +++ b/github2/request.py @@ -113,7 +113,7 @@ class GithubError(Exception): class HttpError(RuntimeError): - """A HTTP error occured when making a request to the GitHub API.""" + """A HTTP error occurred when making a request to the GitHub API.""" def __init__(self, message, content, code): """Create a HttpError exception.