This commit is contained in:
Ben Toews 2013-09-05 12:41:48 -06:00
Коммит 6206d8f947
8 изменённых файлов: 177 добавлений и 0 удалений

2
.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,2 @@
*.pyc
.test_config.sh

3
octokit/__init__.py Normal file
Просмотреть файл

@ -0,0 +1,3 @@
from .client import Client
from .exceptions import Error, NotFound, Unauthorized

35
octokit/client.py Normal file
Просмотреть файл

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
"""
octokit.client
~~~~~~~~~~~~~~
This module contains the main Client class for octokit.py
"""
# https://code.google.com/p/uri-templates/wiki/Implementations
from .resources import Resource
import requests
class Client(Resource):
"""The main class for using octokit.py.
This class accepts as arguments any attributes that can be set on a
Requests.Session() object. After instantiation, the session may be modified
by accessing the `session` attribute.
Example usage:
>>> client = octokit.Client(auth = ('mastahyeti', 'oauth-token'))
>>> client.session.proxies = {'http': 'foo.bar:3128'}
>>> client.current_user.login
'mastahyeti'
"""
def __init__(self, **kwargs):
self.session = requests.sessions.Session()
self.root_url = 'https://api.github.com'
self.schema = {}
[setattr(self.session, key, kwargs[key]) for key in kwargs]

31
octokit/exceptions.py Normal file
Просмотреть файл

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
"""
octokit.exceptions
~~~~~~~~~~~~~~~~~~
This module contains octokit.py exceptions.
"""
class Error(Exception):
""" Something went wrong. """
class NotFound(Error):
""" Status 404: The resource wasn't found. """
class Unauthorized(Error):
""" Status 401/403: Not authorized to view the resource """
# Mapping of status code to Exception
STATUS_ERRORS = {
404: NotFound,
401: Unauthorized,
403: Unauthorized
}
def handle_status(status):
""" Raise the appropriate error given a status code. """
if status == 200:
return
raise STATUS_ERRORS.get(status, Error)

55
octokit/resources.py Normal file
Просмотреть файл

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
"""
octokit.resources
~~~~~~~~~~~~~~~~~
This module contains the workhorse of octokit.py, the Resources.
"""
from .exceptions import handle_status
class Resource(object):
"""The workhorse of octokit.py, this class makes the API calls and interprets
them into an accessible schema. The API calls and schema parsing are lazy and
only happen when an attribute of the resource is requested.
"""
def __init__(self, root_url, session):
self.session = session
self.root_url = root_url
self.schema = {}
def __getattr__(self, name):
self.ensure_schema_loaded()
if name in self.schema:
return self.schema[name]
else:
raise handle_status(404)
def keys(self):
self.ensure_schema_loaded()
return self.schema.keys()
def ensure_schema_loaded(self):
if not self.schema:
self.load_schema()
def load_schema(self):
data = self.fetch_resource(self.root_url)
self.schema = self.parse_schema(data)
def fetch_resource(self, url):
response = self.session.get(url)
handle_status(response.status_code)
return response.json()
def parse_schema(self, data):
schema = {}
for key in data:
name = key.split('_url')[0]
if key.endswith('_url'):
schema[name] = Resource(data[key], self.session)
else:
schema[name] = data[key]
return schema

19
test.py Normal file
Просмотреть файл

@ -0,0 +1,19 @@
from __future__ import print_function
import unittest
import os
import octokit
class OctokitTestCase(unittest.TestCase):
def setUp(self):
username = os.environ['OCTOKIT_TEST_USER']
token = os.environ['OCTOKIT_TEST_TOKEN']
auth = (username, token)
self.client = octokit.Client(auth=auth)
def test_authentication(self):
assert self.client.current_user.login == 'mastahyeti'
if __name__ == '__main__':
unittest.main()

28
test.sh Executable file
Просмотреть файл

@ -0,0 +1,28 @@
#!/bin/sh
echo "**************************"
echo "Loading test configuration"
echo "**************************"
config_file="test_config.sh"
if [ -e .${config_file} ]
then
source .${config_file}
echo Config loaded.
else
echo You need to configure $config_file and move it to .${config_file}
exit
fi
echo ""
echo ""
echo "*************************"
echo "Running tests in python 2"
echo "*************************"
python2 ./test.py
echo ""
echo ""
echo "*************************"
echo "Running tests in python 3"
echo "*************************"
python3 ./test.py

4
test_config.sh Normal file
Просмотреть файл

@ -0,0 +1,4 @@
# Move this to .test_config.sh once configured avoid it ending up in the repo
export OCTOKIT_TEST_USER="username"
export OCTOKIT_TEST_TOKEN="oauth token"