diff options
Diffstat (limited to 'pygithub3')
-rw-r--r-- | pygithub3/github.py | 9 | ||||
-rw-r--r-- | pygithub3/requests/git_data/__init__.py | 0 | ||||
-rw-r--r-- | pygithub3/requests/git_data/blobs.py | 20 | ||||
-rw-r--r-- | pygithub3/requests/git_data/commits.py | 20 | ||||
-rw-r--r-- | pygithub3/requests/git_data/references.py | 33 | ||||
-rw-r--r-- | pygithub3/requests/git_data/tags.py | 16 | ||||
-rw-r--r-- | pygithub3/requests/git_data/trees.py | 20 | ||||
-rw-r--r-- | pygithub3/resources/git_data.py | 27 | ||||
-rw-r--r-- | pygithub3/services/git_data/__init__.py | 20 | ||||
-rw-r--r-- | pygithub3/services/git_data/blobs.py | 24 | ||||
-rw-r--r-- | pygithub3/services/git_data/commits.py | 29 | ||||
-rw-r--r-- | pygithub3/services/git_data/references.py | 67 | ||||
-rw-r--r-- | pygithub3/services/git_data/tags.py | 34 | ||||
-rw-r--r-- | pygithub3/services/git_data/trees.py | 34 | ||||
-rw-r--r-- | pygithub3/tests/services/test_git_data.py | 164 |
15 files changed, 517 insertions, 0 deletions
diff --git a/pygithub3/github.py b/pygithub3/github.py index 0b302a1..13829a0 100644 --- a/pygithub3/github.py +++ b/pygithub3/github.py @@ -17,9 +17,11 @@ class Github(object): from pygithub3.services.users import User from pygithub3.services.repos import Repo from pygithub3.services.gists import Gist + from pygithub3.services.git_data import GitData self._users = User(**config) self._repos = Repo(**config) self._gists = Gist(**config) + self._git_data = GitData(**config) @property def remaining_requests(self): @@ -47,3 +49,10 @@ class Github(object): :ref:`Gists service <Gists service>` """ return self._gists + + @property + def git_data(self): + """ + :ref:`Git Data service <Git Data service>` + """ + return self._git_data diff --git a/pygithub3/requests/git_data/__init__.py b/pygithub3/requests/git_data/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/pygithub3/requests/git_data/__init__.py diff --git a/pygithub3/requests/git_data/blobs.py b/pygithub3/requests/git_data/blobs.py new file mode 100644 index 0000000..4a49c6b --- /dev/null +++ b/pygithub3/requests/git_data/blobs.py @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- + +from pygithub3.requests.base import Request +from pygithub3.resources.git_data import Blob + + +class Get(Request): + + uri = 'repos/{user}/{repo}/git/blobs/{sha}' + resource = Blob + + +class Create(Request): + + uri = 'repos/{user}/{repo}/git/blobs' + resource = Blob + body_schema = { + 'schema': ('content', 'encoding'), + 'required': ('content', 'encoding'), #TODO: is enc really required? + } diff --git a/pygithub3/requests/git_data/commits.py b/pygithub3/requests/git_data/commits.py new file mode 100644 index 0000000..936d3c7 --- /dev/null +++ b/pygithub3/requests/git_data/commits.py @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- + +from pygithub3.requests.base import Request +from pygithub3.resources.git_data import Commit + + +class Get(Request): + uri = 'repos/{user}/{repo}/git/commits/{sha}' + resource = Commit + + +class Create(Request): + uri = 'repos/{user}/{repo}/git/commits' + resource = Commit + body_schema = { + 'schema': ('message', 'tree', 'parents', 'author', 'committer'), + 'required': ('message', 'tree', 'parents'), + } + + diff --git a/pygithub3/requests/git_data/references.py b/pygithub3/requests/git_data/references.py new file mode 100644 index 0000000..99cf41a --- /dev/null +++ b/pygithub3/requests/git_data/references.py @@ -0,0 +1,33 @@ +from pygithub3.requests.base import Request +from pygithub3.resources.git_data import Reference + + +class Get(Request): + uri = 'repos/{user}/{repo}/git/refs/{ref}' + resource = Reference + + +class List(Request): + uri = 'repos/{user}/{repo}/git/refs' + resource = Reference + + +class Create(Request): + uri = 'repos/{user}/{repo}/git/refs' + resource = Reference + body_schema = { + 'schema': ('ref', 'sha'), + 'required': ('ref', 'sha'), + } + +class Update(Request): + uri = 'repos/{user}/{repo}/git/refs/{ref}' + resource = Reference + body_schema = { + 'schema': ('sha', 'force'), + 'required': ('sha',), + } + + +class Delete(Request): + uri = 'repos/{user}/{repo}/git/refs/{ref}' diff --git a/pygithub3/requests/git_data/tags.py b/pygithub3/requests/git_data/tags.py new file mode 100644 index 0000000..8b37f0e --- /dev/null +++ b/pygithub3/requests/git_data/tags.py @@ -0,0 +1,16 @@ +from pygithub3.requests.base import Request +from pygithub3.resources.git_data import Tag + + +class Get(Request): + uri = 'repos/{user}/{repo}/git/tags/{sha}' + resource = Tag + +class Create(Request): + uri = 'repos/{user}/{repo}/git/tags' + resource = Tag + body_schema = { + 'schema': ('tag', 'message', 'object', 'type', 'tagger'), + 'required': ('type',), + } + diff --git a/pygithub3/requests/git_data/trees.py b/pygithub3/requests/git_data/trees.py new file mode 100644 index 0000000..bd1593f --- /dev/null +++ b/pygithub3/requests/git_data/trees.py @@ -0,0 +1,20 @@ +from pygithub3.requests.base import Request +from pygithub3.resources.git_data import Tree + + +class Get(Request): + uri = 'repos/{user}/{repo}/git/trees/{sha}' + resource = Tree + + def clean_uri(self): + if self.recursive: + return self.uri + '?recursive=1' + + +class Create(Request): + uri = 'repos/{user}/{repo}/git/trees' + resource = Tree + body_schema = { + 'schema': ('tree',), + 'required': ('tree',), + } diff --git a/pygithub3/resources/git_data.py b/pygithub3/resources/git_data.py new file mode 100644 index 0000000..4adcf5d --- /dev/null +++ b/pygithub3/resources/git_data.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from .base import Resource +from .repos import Author, Commit + + +class Blob(Resource): + def __str__(self): + return "<Blob (%s)>" % getattr(self, 'content', '') + + +class Reference(Resource): + def __str__(self): + return '<Reference (%s)>' % getattr(self, 'ref', '') + + +class Tag(Resource): + _maps = {'object': Commit, + 'tagger': Author,} # committer? tagger? + def __str__(self): + return '<Tag (%s)>' % getattr(self, 'tag', '') + + +class Tree(Resource): + def __str__(self): + return '<Tree (%s)>' % getattr(self, 'sha', '') diff --git a/pygithub3/services/git_data/__init__.py b/pygithub3/services/git_data/__init__.py new file mode 100644 index 0000000..a12ddea --- /dev/null +++ b/pygithub3/services/git_data/__init__.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service +from .blobs import Blobs +from .commits import Commits +from .references import References +from .tags import Tags +from .trees import Trees + +def GitData(Service): + """Consume `Git Data API <http://developer.github.com/v3/git/>`_""" + + def __init__(self, **config): + self.blobs = Blobs(**config) + self.commits = Commits(**config) + self.references = References(**config) + self.tags = Tags(**config) + self.trees = Trees(**config) + super(GitData, self).__init__(**config) diff --git a/pygithub3/services/git_data/blobs.py b/pygithub3/services/git_data/blobs.py new file mode 100644 index 0000000..d5baa2d --- /dev/null +++ b/pygithub3/services/git_data/blobs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service + + +class Blobs(Service): + """Consume `Blobs API <http://developer.github.com/v3/git/blobs/>`_""" + + def get(self, sha, user=None, repo=None): + """Get a particular blob + + :param str sha: The sha of the blob to get + + """ + request = self.make_request('git_data.blobs.get', sha=sha, + user=user, repo=repo) + return self._get(request) + + def create(self, data, user=None, repo=None): + """Create a blob""" + request = self.make_request('git_data.blobs.create', body=data, + user=user, repo=repo) + return self._post(request) diff --git a/pygithub3/services/git_data/commits.py b/pygithub3/services/git_data/commits.py new file mode 100644 index 0000000..cdca300 --- /dev/null +++ b/pygithub3/services/git_data/commits.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service + + +class Commits(Service): + """Consume `Commits API <http://developer.github.com/v3/git/commits/>`_""" + + def get(self, sha, user=None, repo=None): + """get a commit from the current repo""" + request = self.make_request('git_data.commits.get', sha=sha, + user=user, repo=repo) + return self._get(request) + + def create(self, data, user=None, repo=None): + """create a commit on a repo + + :param dict data: Input. See `github commits doc`_ + :param str user: username + :param str repo: repository name + + """ + return self._post( + self.make_request('git_data.commits.create', user=user, repo=repo, + body=data) + ) + + diff --git a/pygithub3/services/git_data/references.py b/pygithub3/services/git_data/references.py new file mode 100644 index 0000000..8ae0865 --- /dev/null +++ b/pygithub3/services/git_data/references.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service + + +class References(Service): + """Consume `References API <http://developer.github.com/v3/git/refs/>`_""" + + def get(self, ref, user=None, repo=None): + """Get a reference. + + .. note:: + Remember that branch references look like "heads/<branch_name>" + + """ + return self._get( + self.make_request('git_data.references.get', ref=ref, user=user, + repo=repo) + ) + + def list(self, namespace='', user=None, repo=None): + """List all the references + + :param str namespace: Limit the request to a particular type of + reference. For example, ``heads`` or ``tags``. + + """ + return self._get( + self.make_request('git_data.references.list', user=user, repo=repo) + ) + + def create(self, body, user=None, repo=None): + """Create a reference + + :param dict body: Data describing the reference to create + :param str user: username + :param str repo: repository name + + """ + return self._post( + self.make_request('git_data.references.create', body=body, + user=user, repo=repo) + ) + + def update(self, ref, body, user=None, repo=None): + """Update an existing reference + + :param str ref: The SHA of the reference to update + :param dict body: data + + """ + return self._patch( + self.make_request('git_data.references.update', ref=ref, body=body, + user=user, repo=repo) + ) + + def delete(self, ref, user=None, repo=None): + """Delete a reference + + :param str ref: The SHA of the reference to delete + + """ + return self._delete( + self.make_request('git_data.references.delete', ref=ref, user=user, + repo=repo) + ) diff --git a/pygithub3/services/git_data/tags.py b/pygithub3/services/git_data/tags.py new file mode 100644 index 0000000..03d38ac --- /dev/null +++ b/pygithub3/services/git_data/tags.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service + + +class Tags(Service): + """Consume `Tags API <http://developer.github.com/v3/git/tags/>`_""" + + def get(self, sha, user=None, repo=None): + """Get a tag + + :param str sha: The sha of the tag to get. + :param str user: Username + :param str repo: Repository + + """ + return self._get( + self.make_request('git_data.tags.get', sha=sha, user=user, + repo=repo) + ) + + def create(self, body, user=None, repo=None): + """Create a tag + + :param dict body: Data describing the tag to create + :param str user: Username + :param str repo: Repository + + """ + return self._post( + self.make_request('git_data.tags.create', body=body, user=user, + repo=repo) + ) diff --git a/pygithub3/services/git_data/trees.py b/pygithub3/services/git_data/trees.py new file mode 100644 index 0000000..00e010b --- /dev/null +++ b/pygithub3/services/git_data/trees.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +from pygithub3.services.base import Service + + +class Trees(Service): + """Consume `Trees API <http://developer.github.com/v3/git/trees/>`_""" + + def get(self, sha, recursive=False, user=None, repo=None): + """Get a tree object + + :param str sha: The SHA of the tree you want. + :param bool recursive: Whether to resolve each sub-tree belonging to + this tree + :param str user: Username + :param str repo: Repository + + """ + return self._get( + self.make_request('git_data.trees.get', sha=sha, + recursive=recursive, user=user, repo=repo) + ) + + def create(self, body, user=None, repo=None): + """Create a tree object + + :param dict body: Data describing the tree to create + + """ + return self._post( + self.make_request('git_data.trees.create', body=body, user=user, + repo=repo) + ) diff --git a/pygithub3/tests/services/test_git_data.py b/pygithub3/tests/services/test_git_data.py new file mode 100644 index 0000000..45ef6d1 --- /dev/null +++ b/pygithub3/tests/services/test_git_data.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- + +import requests +from mock import patch, Mock + +from pygithub3.tests.utils.core import TestCase +from pygithub3.services.git_data import (Blobs, Commits, References, Tags, + Trees) +from pygithub3.resources.base import json +from pygithub3.tests.utils.base import (mock_response, mock_response_result, + mock_json) +from pygithub3.tests.utils.services import _ + + +json.dumps = Mock(side_effect=mock_json) +json.loads = Mock(side_effect=mock_json) + + +@patch.object(requests.sessions.Session, 'request') +class TestBlobsService(TestCase): + def setUp(self): + self.service = Blobs(user='octocat', repo='repo') + + def test_GET(self, reqm): + reqm.return_value = mock_response() + self.service.get('abc123') + self.assertEqual(reqm.call_args[0], + ('get', _('repos/octocat/repo/git/blobs/abc123'))) + + def test_CREATE(self, reqm): + reqm.return_value = mock_response('post') + self.service.create({'content': 'hello, friends', 'encoding': + 'utf-8'}) + self.assertEqual(reqm.call_args[0], + ('post', _('repos/octocat/repo/git/blobs'))) + + +@patch.object(requests.sessions.Session, 'request') +class TestCommitsService(TestCase): + def setUp(self): + self.service = Commits(user='octocat', repo='repo') + + def test_GET(self, reqm): + reqm.return_value = mock_response() + self.service.get('abc123') + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/octocat/repo/git/commits/abc123')) + ) + + def test_CREATE(self, reqm): + reqm.return_value = mock_response('post') + self.service.create({ + 'message': 'hello', + 'tree': 'abc123', + 'parents': ['mom', 'dad'], + }) + self.assertEqual( + reqm.call_args[0], + ('post', _('repos/octocat/repo/git/commits')) + ) + +@patch.object(requests.sessions.Session, 'request') +class TestReferencesService(TestCase): + def setUp(self): + self.service = References(user='user', repo='repo') + + def test_GET(self, reqm): + reqm.return_value = mock_response() + self.service.get('heads/fnord') + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/user/repo/git/refs/heads/fnord')) + ) + + def test_LIST(self, reqm): + reqm.return_value = mock_response() + self.service.list() + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/user/repo/git/refs')) + ) + + def test_create(self, reqm): + reqm.return_value = mock_response('post') + self.service.create({'sha': 'hello', 'ref': 'something'}) + self.assertEqual( + reqm.call_args[0], + ('post', _('repos/user/repo/git/refs')) + ) + + def test_update(self, reqm): + reqm.return_value = mock_response('patch') + self.service.update('master', {'sha': 'abc123'}) + self.assertEqual( + reqm.call_args[0], + ('patch', _('repos/user/repo/git/refs/master')) + ) + + def test_delete(self, reqm): + reqm.return_value = mock_response('delete') + self.service.delete('branch') + self.assertEqual( + reqm.call_args[0], + ('delete', _('repos/user/repo/git/refs/branch')) + ) + +@patch.object(requests.sessions.Session, 'request') +class TestTagsService(TestCase): + def setUp(self): + self.service = Tags(user='user', repo='repo') + + def test_GET(self, reqm): + reqm.return_value = mock_response() + self.service.get('abc123') + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/user/repo/git/tags/abc123')) + ) + + def test_CREATE(self, reqm): + reqm.return_value = mock_response('post') + self.service.create({'tag': 'v1.2.3', 'message': 'a tag', + 'object': 'abc123', 'type': 'commit'}) + self.assertEqual( + reqm.call_args[0], + ('post', _('repos/user/repo/git/tags')) + ) + + +@patch.object(requests.sessions.Session, 'request') +class TestTreesService(TestCase): + def setUp(self): + self.service = Trees(user='user', repo='repo') + + def test_GET(self, reqm): + reqm.return_value = mock_response() + self.service.get('abc123') + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/user/repo/git/trees/abc123')) + ) + + def test_GET_recursive(self, reqm): + reqm.return_value = mock_response() + self.service.get('abc123', recursive=True) + self.assertEqual( + reqm.call_args[0], + ('get', _('repos/user/repo/git/trees/abc123?recursive=1')) + ) + + def test_CREATE(self, reqm): + reqm.return_value = mock_response('post') + self.service.create({ + 'tree': [ + {'path': 'foo.txt', 'mode': '100644', 'type': 'blob', + 'sha': 'abc123'}, + ], + }) + self.assertEqual( + reqm.call_args[0], + ('post', _('repos/user/repo/git/trees')) + ) |