aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3')
-rw-r--r--pygithub3/github.py9
-rw-r--r--pygithub3/requests/git_data/__init__.py0
-rw-r--r--pygithub3/requests/git_data/blobs.py20
-rw-r--r--pygithub3/requests/git_data/commits.py20
-rw-r--r--pygithub3/requests/git_data/references.py33
-rw-r--r--pygithub3/requests/git_data/tags.py16
-rw-r--r--pygithub3/requests/git_data/trees.py20
-rw-r--r--pygithub3/resources/git_data.py27
-rw-r--r--pygithub3/services/git_data/__init__.py20
-rw-r--r--pygithub3/services/git_data/blobs.py24
-rw-r--r--pygithub3/services/git_data/commits.py29
-rw-r--r--pygithub3/services/git_data/references.py67
-rw-r--r--pygithub3/services/git_data/tags.py34
-rw-r--r--pygithub3/services/git_data/trees.py34
-rw-r--r--pygithub3/tests/services/test_git_data.py164
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'))
+ )