项目作者: babygame0ver

项目描述 :
Python Interface to GitHub developer's API V3
高级语言: Python
项目地址: git://github.com/babygame0ver/gitpy.git
创建时间: 2020-06-14T04:30:24Z
项目社区:https://github.com/babygame0ver/gitpy

开源协议:MIT License

下载


GitPy

Python Interface to GitHub’s developer API

name
name
name

Dependencies

name
name
name

Installation

  1. git clone https://github.com/akk29/gitpy.git
  2. python setup.py install

Features

  • GitPy provide response based object for the GitHub Developer’s API with the help of methods.

  • Response based approach helps other Developers to write their own logic after performing the action.

  • To write your own application interacting with GitHub API you need to store the end-point urls & mock them using request library. GitPy takes care it for you.

Development Setup

  1. Running Tests & Development Setup
  1. # creating and setting up environment
  2. python -m venv .venv
  3. .venv\scripts\activate # windows
  4. .venv/bin/activate
  5. # installing dependencies
  6. pip install -r requirements.txt
  7. # running tests
  8. python -m unittest discover
  9. python -m unittest tests.unit.test_repos # run specific module
  10. python -m unittest tests.unit.test_repos.test_create_private_repository # run specific function
  11. # generate and convert coverage report
  12. coverage run -m unittest discover
  13. coverage html -d coverage_html

Getting Started

Gitpy works with username & token of a given account. Please obtain a personal access token with all permissions & save it somewhere securely. Refer to
Github Personal Token Guide for more information.

Usage Docs

Gitpy provides modules to interact with GitHub Developer API. These modules contain functions to return the response object which can be used to write your custom logic.

Funtions are defined as per the operations.

Use exception handling provided by library in your code. See Authentication example for more details

Table of Contents

Authentication

  1. from gitpy.core.auth import GitPy
  2. from gitpy.exceptions import UnauthorizedError, ForbiddenError, ValidationError, ResourceNotFoundError
  3. def basic_authentication():
  4. # bad practice use env file or environment variables to secure your credentials.
  5. username = 'myusername'
  6. token = 'myrandomtoken'
  7. g = GitPy(username,token)
  8. # custom error handling for all errors from github API
  9. try:
  10. result = g.authenticate()
  11. print(result.json())
  12. except UnauthorizedError:
  13. print('UnauthorizedError') # putting wrong token value
  14. # token = 'wrong token'
  15. # output for UnauthorizedError
  16. except ForbiddenError:
  17. print('ForbiddenError')
  18. except ResourceNotFoundError:
  19. print('ResourceNotFoundError')
  20. except ValidationError:
  21. print('ValidationError')
  22. except Exception as err:
  23. print('error occured',err)
  24. if __name__ == '__main__':
  25. basic_authentication()
  1. # output for UnauthorizedError
  2. 2025-05-05 17:20:10,865 - gitpy.service.loggerService - ERROR --- gitpy\service\networkService.py , get(), line no : 31 , raised UnauthorizedError() ----- api_response : {'message': 'Bad credentials', 'documentation_url': 'https://docs.github.com/rest', 'status': '401'}
  3. UnauthorizedError

Repository

  • create repository
  1. """
  2. Repository Class deals with repository (public/private) creation/deletion.
  3. Response based function support.
  4. See create_repository(gitpy_object) for more information.
  5. """
  6. from gitpy.core.auth import GitPy
  7. from gitpy.core.repos import Repository
  8. def basic_authentication():
  9. # bad practice use env file or environment variables
  10. username = 'myusername'
  11. token = 'myrandomtoken'
  12. g = GitPy(username,token)
  13. return g
  14. def create_repository(gitpy_object):
  15. repo = Repository(gitpy_object)
  16. response = repo.create_public_repository('my-public-repo')
  17. print(response.json())
  18. ''' or directy accessing underlying function '''
  19. response = repo.create_repository('my-public-repo-2',False) # False for Public
  20. print(response.json())
  21. response = repo.create_private_repository('my-private-repo')
  22. print(response.json())
  23. ''' or directy accessing underlying function '''
  24. response = repo.create_repository('my-private-repo-2',True) # True for Private
  25. print(response.json())
  26. if __name__ == '__main__':
  27. gitpy_object = basic_authentication()
  28. create_repository(gitpy_object)
  • delete repository
  1. '''
  2. Repository class deals with repository (public/private) creation/deletion.
  3. Response based function support.
  4. See repo_deletion(gitpy_object,repo_name) for more information.
  5. '''
  6. from gitpy.core.auth import GitPy
  7. from gitpy.core.repos import Repository
  8. def basic_authentication():
  9. # bad practice use env file or environment variables
  10. username = 'myusername'
  11. token = 'myrandomtoken'
  12. g = GitPy(username,token)
  13. return g
  14. def repo_deletion(gitpy_object,repo_name):
  15. repo = Repository(gitpy_object)
  16. response = repo.delete_repository(repo_name)
  17. print(response.status_code) # 204 -> Success , 401 -> Not Allowed , 404 -> Repo not found
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. repo_deletion(gitpy_object,'my-public-repo')
  • list repositories
  1. '''
  2. Repository class deals with repository (public/private) creation/deletion/listing.
  3. Response based function support.
  4. See list_all_repos(gitpy_object) for more information.
  5. '''
  6. from gitpy.core.auth import GitPy
  7. from gitpy.core.repos import Repository
  8. import json
  9. def basic_authentication():
  10. # bad practice use env file or environment variables
  11. username = 'myusername'
  12. token = 'myrandomtoken'
  13. g = GitPy(username,token)
  14. return g
  15. def list_all_repos(gitpy_object):
  16. repo = Repository(gitpy_object)
  17. response = repo.list_repositories()
  18. if(response.status_code == 200):
  19. print(json.dumps(response.json(),indent=2)) # all repo & meta-data
  20. else if (response.status_code == 401):
  21. print('Bad credentials')
  22. if __name__ == '__main__':
  23. gitpy_object = basic_authentication()
  24. list_all_repos(gitpy_object)
  • create file
  1. from gitpy.core.auth import GitPy
  2. from gitpy.core.repos import Repository
  3. import json
  4. def basic_authentication():
  5. # bad practice use env file or environment variables
  6. username = 'myusername'
  7. token = 'myrandomtoken'
  8. g = GitPy(username,token)
  9. return g
  10. def create_file(gitpy_object):
  11. repo = Repository(gitpy_object)
  12. repo.select_repository("test-user")
  13. response = repo.create_file('main4.py','import os','first file python')
  14. if(response.status_code == 201):
  15. print(json.dumps(response.json(),indent=2))
  16. else if (response.status_code == 422):
  17. print('validation failed')
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. create_file(gitpy_object)
  • get file details
  1. from gitpy.core.auth import GitPy
  2. from gitpy.core.repos import Repository
  3. import json
  4. def basic_authentication():
  5. # bad practice use env file or environment variables
  6. username = 'myusername'
  7. token = 'myrandomtoken'
  8. g = GitPy(username,token)
  9. return g
  10. def get_file_details(gitpy_object):
  11. repo = Repository(gitpy_object)
  12. repo.select_repository("test-user")
  13. response = repo.get_file('notes/main.py')
  14. if(response.status_code == 200):
  15. print(json.dumps(response.json(),indent=2))
  16. else if (response.status_code == 404):
  17. print('file not found')
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. get_file_details(gitpy_object)
  • update file
  1. from gitpy.core.auth import GitPy
  2. from gitpy.core.repos import Repository
  3. import json
  4. def basic_authentication():
  5. # bad practice use env file or environment variables
  6. username = 'myusername'
  7. token = 'myrandomtoken'
  8. g = GitPy(username,token)
  9. return g
  10. def udpate_file(gitpy_object):
  11. repo = Repository(gitpy_object)
  12. repo.select_repository("test-user")
  13. response = repo.update_file('main4.py','import os','changed file content')
  14. if(response.status_code == 200):
  15. print(json.dumps(response.json(),indent=2))
  16. else if (response.status_code == 404):
  17. print('file not found')
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. update_file(gitpy_object)
  • rename file
  1. from gitpy.core.auth import GitPy
  2. from gitpy.core.repos import Repository
  3. import json
  4. def basic_authentication():
  5. # bad practice use env file or environment variables
  6. username = 'myusername'
  7. token = 'myrandomtoken'
  8. g = GitPy(username,token)
  9. return g
  10. def rename_file(gitpy_object):
  11. repo = Repository(gitpy_object)
  12. repo.select_repository("test-user")
  13. response = repo.rename_file('main4.py','main5.py')
  14. if(response.status_code == 201):
  15. print(json.dumps(response.json(),indent=2))
  16. else if (response.status_code == 409): # Conflict
  17. print('File already present')
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. rename_file(gitpy_object)
  • delete file
  1. from gitpy.core.auth import GitPy
  2. from gitpy.core.repos import Repository
  3. import json
  4. def basic_authentication():
  5. # bad practice use env file or environment variables
  6. username = 'myusername'
  7. token = 'myrandomtoken'
  8. g = GitPy(username,token)
  9. return g
  10. def delete_file(gitpy_object):
  11. repo = Repository(gitpy_object)
  12. repo.select_repository("test-user")
  13. response = repo.delete_file('main4.py','deleted file')
  14. if(response.status_code == 200):
  15. print(json.dumps(response.json(),indent=2))
  16. else if (response.status_code == 404):
  17. print('Resource not found')
  18. if __name__ == '__main__':
  19. gitpy_object = basic_authentication()
  20. delete_file(gitpy_object)

Support & Contribution

If you are facing issues related to bugs, code documentation, development setup or any other general issue.
Feel free to open an issue to reproduce the bug by providing sample code with proper label.

Contributions are always welcome. You can do any of these following:

  • Improve code readability, maintainability, any implemetation that makes current project better, suggest new ideas for the project.

  • To make contributions : Fork the repository, implement new features by creating a seprate branch & sending PR to master branch, with writting proper unit tests.