mirror of
https://github.com/RGBCube/GitHubWrapper
synced 2025-07-23 14:37:41 +00:00
commit
a7e6910fcc
30 changed files with 398 additions and 147 deletions
69
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
69
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# Credits to most of this template go to Rapptz (https://github.com/Rapptz)
|
||||||
|
# as this was taken from the discord.py repository (https://github.com/Rapptz/discord.py/blob/868476c99963e72aa529ed6203f86ef529a2c1f1/.github/ISSUE_TEMPLATE/bug_report.yml)
|
||||||
|
name: Bug Report
|
||||||
|
|
||||||
|
description: Report broken or incorrect behaviour
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- bug
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out a bug.
|
||||||
|
If you want real-time support, consider joining our [Discord server](https://discord.gg/pTJfS4TkWe) instead.
|
||||||
|
|
||||||
|
Please note that this form is for bugs only!
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Summary
|
||||||
|
description: A simple summary of your bug report.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Reproduction Steps
|
||||||
|
description: What you do to make it happen?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Minimal Reproducible Code
|
||||||
|
description: A short snippet of code that showcases the bug.
|
||||||
|
render: Python
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Results
|
||||||
|
description: What did you expect to happen?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Actual Results
|
||||||
|
description: What actually happened?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Checklist
|
||||||
|
description: |
|
||||||
|
Let's make sure you've properly done due diligence when reporting this issue!
|
||||||
|
options:
|
||||||
|
- label: I have searched the open issues for duplicates.
|
||||||
|
required: true
|
||||||
|
- label: I have shown the entire traceback, if possible.
|
||||||
|
required: true
|
||||||
|
- label: I have removed my token from display, if visible.
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional Context
|
||||||
|
description: If there is anything else to say, please do so here.
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
4
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
contact_links:
|
||||||
|
- name: Discord Server
|
||||||
|
about: Use our official Discord server to ask for help and questions.
|
||||||
|
url: https://discord.gg/pTJfS4TkWe
|
56
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
56
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Credits to most of this template go to Rapptz (https://github.com/Rapptz)
|
||||||
|
# as this was taken from the discord.py repository (https://github.com/Rapptz/discord.py/blob/868476c99963e72aa529ed6203f86ef529a2c1f1/.github/ISSUE_TEMPLATE/feature_request.yml)
|
||||||
|
name: Feature Request
|
||||||
|
|
||||||
|
description: Suggest a feature for this library
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- enhancement
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: Summary
|
||||||
|
description: A short summary of what your feature request is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
multiple: false
|
||||||
|
label: What is the feature request for?
|
||||||
|
options:
|
||||||
|
- The library
|
||||||
|
- The documentation
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: The Problem
|
||||||
|
description: |
|
||||||
|
What problem is your feature trying to solve?
|
||||||
|
What becomes easier or possible when this feature is implemented?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: The Ideal Solution
|
||||||
|
description: |
|
||||||
|
What is your ideal solution to the problem?
|
||||||
|
What would you like this feature to do?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: The Current Solution
|
||||||
|
description: What is the current solution to the problem, if any?
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional Context
|
||||||
|
description: If there is anything else to say, please do so here.
|
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
14
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
<!-- Summary of your pull request -->
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
<!-- Put an x inside [ ] to check it, like so: [x] -->
|
||||||
|
|
||||||
|
- [ ] If code changes were made then they have been tested.
|
||||||
|
- [ ] I have updated the documentation to reflect the changes.
|
||||||
|
- [ ] This PR fixes an issue.
|
||||||
|
- [ ] This PR adds something new (e.g. new method or parameters).
|
||||||
|
- [ ] This PR is a breaking change (e.g. methods or parameters removed/renamed)
|
||||||
|
- [ ] This PR is **not** a code change (e.g. documentation, README, ...)
|
30
.github/workflows/autoblack.yml
vendored
30
.github/workflows/autoblack.yml
vendored
|
@ -1,30 +0,0 @@
|
||||||
# GitHub Action that uses Black to reformat the Python code in an incoming pull request.
|
|
||||||
# If all Python code in the pull request is compliant with Black then this Action does nothing.
|
|
||||||
# Othewrwise, Black is run and its changes are committed back to the incoming pull request.
|
|
||||||
# https://github.com/cclauss/autoblack
|
|
||||||
|
|
||||||
name: autoblack
|
|
||||||
on: [pull_request]
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- name: Set up Python 3.7
|
|
||||||
uses: actions/setup-python@v1
|
|
||||||
with:
|
|
||||||
python-version: 3.7
|
|
||||||
- name: Install Black
|
|
||||||
run: pip install black
|
|
||||||
- name: Run black --check .
|
|
||||||
run: black --check .
|
|
||||||
- name: If needed, commit black changes to the pull request
|
|
||||||
if: failure()
|
|
||||||
run: |
|
|
||||||
black .
|
|
||||||
git config --global user.name 'autoblack'
|
|
||||||
git config --global user.email 'cclauss@users.noreply.github.com'
|
|
||||||
git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY
|
|
||||||
git checkout $GITHUB_HEAD_REF
|
|
||||||
git commit -am "fixup: Format Python code with Black"
|
|
||||||
git push
|
|
26
.github/workflows/bandit.yml
vendored
Normal file
26
.github/workflows/bandit.yml
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
name: Bandit
|
||||||
|
|
||||||
|
on: [ pull_request, push ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: github.event.pull_request.user.type != 'Bot'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: [ '3.8', '3.9', '3.10' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Install Bandit
|
||||||
|
run: pip install -U pip bandit
|
||||||
|
|
||||||
|
- name: Run Bandit
|
||||||
|
run: bandit --recursive ./
|
47
.github/workflows/lint.yml
vendored
Normal file
47
.github/workflows/lint.yml
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
name: Lint
|
||||||
|
|
||||||
|
on: [ pull_request, push ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: github.event.pull_request.user.type != 'Bot'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: [ '3.8', '3.9', '3.10' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Install Unimport, Isort, Black, and Flynt
|
||||||
|
run: pip install -U pip unimport isort black flynt
|
||||||
|
|
||||||
|
- name: Run Unimport
|
||||||
|
continue-on-error: true
|
||||||
|
run: unimport ./ --ignore-init --gitignore -r
|
||||||
|
|
||||||
|
- name: Run Isort
|
||||||
|
run: isort ./
|
||||||
|
|
||||||
|
- name: Run Black
|
||||||
|
run: black ./
|
||||||
|
|
||||||
|
- name: Run Flynt
|
||||||
|
run: flynt ./ -tc
|
||||||
|
|
||||||
|
- name: Setup Git
|
||||||
|
run: git config user.name "Automated Linter"
|
||||||
|
|
||||||
|
- name: Push To GitHub
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
git pull
|
||||||
|
git add ./
|
||||||
|
git commit --reuse-message=HEAD
|
||||||
|
git push
|
33
.github/workflows/pylint.yml
vendored
33
.github/workflows/pylint.yml
vendored
|
@ -1,23 +1,26 @@
|
||||||
name: Pylint
|
name: PyLint
|
||||||
|
|
||||||
on: [push]
|
on: [ pull_request, push ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
if: github.event.pull_request.user.type != 'Bot'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: ["3.8", "3.9", "3.10"]
|
python-version: [ '3.8', '3.9', '3.10' ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- name: Checkout Repository
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
uses: actions/checkout@v3
|
||||||
uses: actions/setup-python@v3
|
|
||||||
with:
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
python-version: ${{ matrix.python-version }}
|
uses: actions/setup-python@v2
|
||||||
- name: Install dependencies
|
with:
|
||||||
run: |
|
python-version: ${{ matrix.python-version }}
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install pylint
|
- name: Install PyLint
|
||||||
- name: Analysing the code with pylint
|
run: pip install -U pip pylint
|
||||||
run: |
|
|
||||||
pylint $(git ls-files '*.py')
|
- name: Run PyLint
|
||||||
|
run: pylint $(git ls-files '*.py')
|
||||||
|
|
28
.github/workflows/pyright.yml
vendored
Normal file
28
.github/workflows/pyright.yml
vendored
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
name: PyRight
|
||||||
|
|
||||||
|
on: [ pull_request, push ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: github.event.pull_request.user.type != 'Bot'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: [ '3.8', '3.9', '3.10' ]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
|
- name: Install PyRight & Dependencies
|
||||||
|
run: |
|
||||||
|
pip install -U pip pyright
|
||||||
|
pip install -Ur requirements.txt
|
||||||
|
|
||||||
|
- name: Run PyRight
|
||||||
|
run: pyright ./
|
|
@ -1,4 +1,4 @@
|
||||||
version: 1
|
version: 2
|
||||||
|
|
||||||
sphinx:
|
sphinx:
|
||||||
configuration: docs/conf.py
|
configuration: docs/conf.py
|
||||||
|
@ -6,7 +6,7 @@ sphinx:
|
||||||
builder: html
|
builder: html
|
||||||
|
|
||||||
python:
|
python:
|
||||||
version: 3.8
|
version: '3.8'
|
||||||
install:
|
install:
|
||||||
- method: pip
|
- method: pip
|
||||||
path: .
|
path: .
|
||||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2022 - Present VarMonke and sudosnok
|
Copyright (c) 2022-present VarMonke and sudosnok
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
23
README.rst
23
README.rst
|
@ -16,16 +16,16 @@ Key Features
|
||||||
Installing
|
Installing
|
||||||
----------
|
----------
|
||||||
|
|
||||||
**Python 3.8 or higher**
|
**Python 3.8 or higher is required to run the library**
|
||||||
|
|
||||||
To install the library, run the following command
|
To install the library, run the following command:
|
||||||
|
|
||||||
.. code:: sh
|
.. code:: sh
|
||||||
|
|
||||||
#Linux/macOS
|
# On Linux or MacOS
|
||||||
python3 -m pip install -U git+https://github.com/VarMonke/Github-Api-Wrapper
|
python3 -m pip install -U git+https://github.com/VarMonke/Github-Api-Wrapper
|
||||||
|
|
||||||
#Windows
|
# On Windows
|
||||||
py -m pip install -U git+https://github.com/VarMonke/Github-Api-Wrapper
|
py -m pip install -U git+https://github.com/VarMonke/Github-Api-Wrapper
|
||||||
|
|
||||||
Quick Example
|
Quick Example
|
||||||
|
@ -38,18 +38,21 @@ Quick Example
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
client = await github.GHClient()
|
client = await github.GHClient()
|
||||||
return await client.get_user(user='GithubPythonBot')
|
|
||||||
|
|
||||||
user = asyncio.run(main())
|
user = await client.get_user(user='GithubPythonBot')
|
||||||
print(user)
|
|
||||||
print(user.html_url)
|
print(user)
|
||||||
|
print(user.html_url)
|
||||||
|
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
.. code:: sh
|
.. code:: sh
|
||||||
#Output
|
# Output
|
||||||
<User login: 'GithubPythonBot', id: 104489846, created_at: 2022-04-27 07:31:26>
|
<User login: 'GithubPythonBot', id: 104489846, created_at: 2022-04-27 07:31:26>
|
||||||
https://github.com/GithubPythonBot
|
https://github.com/GithubPythonBot
|
||||||
|
|
||||||
|
|
||||||
Links
|
Links
|
||||||
-----
|
-----
|
||||||
`Discord Server <https://discord.gg/DWhwsQ5TsT>`_
|
- `Discord Server <https://discord.gg/DWhwsQ5TsT>`_
|
||||||
|
- `GitHub API Documentation <https://docs.github.com/en/rest>`_
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2022 - Present Jess, VarMonke and sudosnok
|
Copyright (c) 2022-present Jess, VarMonke and sudosnok
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2015-present Rapptz
|
Copyright (c) 2015-2022 Rapptz
|
||||||
Copyright (c) 2022 - Present Rapptz, VarMonke and sudosnok
|
Copyright (c) 2022-present VarMonke and sudosnok
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import logging
|
import logging
|
||||||
import sys
|
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# 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
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
@ -85,7 +85,7 @@ with open('../github/__init__.py') as f:
|
||||||
release = version
|
release = version
|
||||||
|
|
||||||
# This assumes a tag is available for final releases
|
# This assumes a tag is available for final releases
|
||||||
branch = 'master' if version.endswith('a') else 'v' + version
|
branch = 'master' if version.endswith('a') else f"v{version}"
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import inspect
|
||||||
import re
|
import re
|
||||||
from typing import Dict, List, NamedTuple, Optional, Tuple, Sequence, TYPE_CHECKING
|
from typing import TYPE_CHECKING, Dict, List, NamedTuple, Optional, Sequence, Tuple
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
from sphinx import addnodes
|
from sphinx import addnodes
|
||||||
|
|
|
@ -42,7 +42,7 @@ class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder):
|
||||||
self.handle_page('genindex-all', genindexcontext, 'genindex.html')
|
self.handle_page('genindex-all', genindexcontext, 'genindex.html')
|
||||||
for (key, entries), count in zip(genindex, indexcounts):
|
for (key, entries), count in zip(genindex, indexcounts):
|
||||||
ctx = {'key': key, 'entries': entries, 'count': count, 'genindexentries': genindex}
|
ctx = {'key': key, 'entries': entries, 'count': count, 'genindexentries': genindex}
|
||||||
self.handle_page('genindex-' + key, ctx, 'genindex-single.html')
|
self.handle_page(f"genindex-{key}", ctx, 'genindex-single.html')
|
||||||
else:
|
else:
|
||||||
self.handle_page('genindex', genindexcontext, 'genindex.html')
|
self.handle_page('genindex', genindexcontext, 'genindex.html')
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from docutils.parsers.rst import Directive
|
|
||||||
from docutils.parsers.rst import states, directives # type: ignore
|
|
||||||
from docutils.parsers.rst.roles import set_classes
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
from docutils.parsers.rst import directives # type: ignore
|
||||||
|
from docutils.parsers.rst import Directive
|
||||||
|
from docutils.parsers.rst.roles import set_classes
|
||||||
|
|
||||||
|
|
||||||
class details(nodes.General, nodes.Element):
|
class details(nodes.General, nodes.Element):
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
from docutils.parsers.rst import Directive
|
|
||||||
from docutils.parsers.rst import states, directives # type: ignore
|
|
||||||
from docutils.parsers.rst.roles import set_classes
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
from sphinx.locale import _
|
from docutils.parsers.rst import Directive
|
||||||
|
|
||||||
|
|
||||||
class exception_hierarchy(nodes.General, nodes.Element):
|
class exception_hierarchy(nodes.General, nodes.Element):
|
||||||
|
|
|
@ -4,11 +4,10 @@
|
||||||
|
|
||||||
from typing import Any, Dict, List, Tuple
|
from typing import Any, Dict, List, Tuple
|
||||||
|
|
||||||
|
import sphinx
|
||||||
from docutils import nodes, utils
|
from docutils import nodes, utils
|
||||||
from docutils.nodes import Node, system_message
|
from docutils.nodes import Node, system_message
|
||||||
from docutils.parsers.rst.states import Inliner
|
from docutils.parsers.rst.states import Inliner
|
||||||
|
|
||||||
import sphinx
|
|
||||||
from sphinx.application import Sphinx
|
from sphinx.application import Sphinx
|
||||||
from sphinx.util.nodes import split_explicit_title
|
from sphinx.util.nodes import split_explicit_title
|
||||||
from sphinx.util.typing import RoleFunction
|
from sphinx.util.typing import RoleFunction
|
||||||
|
|
|
@ -4,10 +4,10 @@ __title__ = 'Github-Api-Wrapper'
|
||||||
__authors__ = 'VarMonke', 'sudosnok'
|
__authors__ = 'VarMonke', 'sudosnok'
|
||||||
__version__ = '1.2.1'
|
__version__ = '1.2.1'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__copyright__ = 'Copyright (c) 2020 VarMonke & sudosnok'
|
__copyright__ = 'Copyright (c) 2022-present VarMonke & sudosnok'
|
||||||
|
|
||||||
from .client import *
|
from .client import *
|
||||||
from .objects import *
|
|
||||||
from .http import *
|
|
||||||
from .urls import *
|
|
||||||
from .exceptions import *
|
from .exceptions import *
|
||||||
|
from .http import *
|
||||||
|
from .objects import *
|
||||||
|
from .urls import *
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from typing import Any, Deque, Tuple, TypeVar, Dict
|
from typing import Any, Deque, Dict, Tuple, TypeVar
|
||||||
|
|
||||||
__all__: Tuple[str, ...] = ('ObjectCache',)
|
__all__: Tuple[str, ...] = ('ObjectCache',)
|
||||||
|
|
||||||
|
|
|
@ -2,29 +2,29 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import functools
|
import functools
|
||||||
import aiohttp
|
|
||||||
|
|
||||||
from typing import (
|
from typing import (
|
||||||
|
Any,
|
||||||
Awaitable,
|
Awaitable,
|
||||||
Callable,
|
Callable,
|
||||||
Literal,
|
|
||||||
Any,
|
|
||||||
Coroutine,
|
Coroutine,
|
||||||
Dict,
|
Dict,
|
||||||
Generator,
|
Generator,
|
||||||
|
List,
|
||||||
|
Literal,
|
||||||
Optional,
|
Optional,
|
||||||
Tuple,
|
Tuple,
|
||||||
Union,
|
|
||||||
List,
|
|
||||||
overload,
|
|
||||||
TypeVar,
|
TypeVar,
|
||||||
|
Union,
|
||||||
|
overload,
|
||||||
)
|
)
|
||||||
from typing_extensions import Self, ParamSpec, Concatenate
|
|
||||||
|
import aiohttp
|
||||||
|
from typing_extensions import Concatenate, ParamSpec, Self
|
||||||
|
|
||||||
from . import exceptions
|
from . import exceptions
|
||||||
from .cache import ObjectCache
|
from .cache import ObjectCache
|
||||||
from .http import http
|
from .http import http
|
||||||
from .objects import Gist, Issue, Organization, Repository, User, File
|
from .objects import File, Gist, Issue, Organization, Repository, User
|
||||||
|
|
||||||
__all__: Tuple[str, ...] = ('GHClient', 'Client')
|
__all__: Tuple[str, ...] = ('GHClient', 'Client')
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ class Ratelimited(APIError):
|
||||||
|
|
||||||
def __init__(self, reset_time: datetime.datetime):
|
def __init__(self, reset_time: datetime.datetime):
|
||||||
formatted = reset_time.strftime(r"%H:%M:%S %A, %d %b")
|
formatted = reset_time.strftime(r"%H:%M:%S %A, %d %b")
|
||||||
msg = "We're being ratelimited, wait until {}.\nAuthentication raises the ratelimit.".format(formatted)
|
msg = f"We're being ratelimited, wait until {formatted}.\nAuthentication raises the ratelimit."
|
||||||
super().__init__(msg)
|
super().__init__(msg)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,27 +1,21 @@
|
||||||
# == http.py ==#
|
# == http.py ==#
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
from asyncio.base_subprocess import ReadSubprocessPipeProto
|
|
||||||
from base64 import b64encode
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import platform
|
||||||
import re
|
import re
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from types import SimpleNamespace
|
from types import SimpleNamespace
|
||||||
from typing import Any, Dict, Literal, NamedTuple, Optional, Type, Tuple, Union, List
|
from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union
|
||||||
from typing_extensions import TypeAlias, reveal_type
|
|
||||||
import platform
|
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
|
from typing_extensions import TypeAlias
|
||||||
|
|
||||||
from .exceptions import *
|
|
||||||
from .exceptions import GistNotFound, RepositoryAlreadyExists, MissingPermissions
|
|
||||||
from .exceptions import FileAlreadyExists
|
|
||||||
from .exceptions import ResourceAlreadyExists
|
|
||||||
from .exceptions import Ratelimited
|
|
||||||
from .objects import User, Gist, Repository, File, bytes_to_b64
|
|
||||||
from .urls import *
|
|
||||||
from . import __version__
|
from . import __version__
|
||||||
|
from .exceptions import *
|
||||||
|
from .objects import File, Gist, Repository, User, bytes_to_b64
|
||||||
|
from .urls import *
|
||||||
|
|
||||||
__all__: Tuple[str, ...] = (
|
__all__: Tuple[str, ...] = (
|
||||||
'Paginator',
|
'Paginator',
|
||||||
|
@ -73,9 +67,10 @@ APIType: TypeAlias = Union[User, Gist, Repository]
|
||||||
async def make_session(*, headers: Dict[str, str], authorization: Union[aiohttp.BasicAuth, None]) -> aiohttp.ClientSession:
|
async def make_session(*, headers: Dict[str, str], authorization: Union[aiohttp.BasicAuth, None]) -> aiohttp.ClientSession:
|
||||||
"""This makes the ClientSession, attaching the trace config and ensuring a UA header is present."""
|
"""This makes the ClientSession, attaching the trace config and ensuring a UA header is present."""
|
||||||
if not headers.get('User-Agent'):
|
if not headers.get('User-Agent'):
|
||||||
headers[
|
headers['User-Agent'] = (
|
||||||
'User-Agent'
|
f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python'
|
||||||
] = f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python {platform.python_version()} aiohttp {aiohttp.__version__}'
|
f' {platform.python_version()} aiohttp {aiohttp.__version__}'
|
||||||
|
)
|
||||||
|
|
||||||
session = aiohttp.ClientSession(auth=authorization, headers=headers, trace_configs=[trace_config])
|
session = aiohttp.ClientSession(auth=authorization, headers=headers, trace_configs=[trace_config])
|
||||||
session._rates = Rates('', '', '', '', '')
|
session._rates = Rates('', '', '', '', '')
|
||||||
|
@ -140,9 +135,10 @@ class Paginator:
|
||||||
class http:
|
class http:
|
||||||
def __init__(self, headers: Dict[str, Union[str, int]], auth: Union[aiohttp.BasicAuth, None]) -> None:
|
def __init__(self, headers: Dict[str, Union[str, int]], auth: Union[aiohttp.BasicAuth, None]) -> None:
|
||||||
if not headers.get('User-Agent'):
|
if not headers.get('User-Agent'):
|
||||||
headers[
|
headers['User-Agent'] = (
|
||||||
'User-Agent'
|
'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @'
|
||||||
] = f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python/{platform.python_version()} aiohttp/{aiohttp.__version__}'
|
f' {__version__} Python/{platform.python_version()} aiohttp/{aiohttp.__version__}'
|
||||||
|
)
|
||||||
|
|
||||||
self._rates = Rates('', '', '', '', '')
|
self._rates = Rates('', '', '', '', '')
|
||||||
self.headers = headers
|
self.headers = headers
|
||||||
|
|
|
@ -1,18 +1,15 @@
|
||||||
# == objects.py ==#
|
# == objects.py ==#
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
import json
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
|
||||||
|
|
||||||
from typing import TYPE_CHECKING, Any, Literal, Optional, Tuple, Union, Dict, List
|
|
||||||
|
|
||||||
import aiohttp
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .http import http
|
from .http import http
|
||||||
|
|
||||||
from datetime import datetime
|
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
__all__: Tuple[str, ...] = (
|
__all__: Tuple[str, ...] = (
|
||||||
'APIObject',
|
'APIObject',
|
||||||
|
@ -201,7 +198,7 @@ class Repository(APIObject):
|
||||||
'id',
|
'id',
|
||||||
'name',
|
'name',
|
||||||
'owner',
|
'owner',
|
||||||
'size' 'created_at',
|
'sizecreated_at',
|
||||||
'url',
|
'url',
|
||||||
'html_url',
|
'html_url',
|
||||||
'archived',
|
'archived',
|
||||||
|
@ -346,7 +343,10 @@ class Issue(APIObject):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f'<{self.__class__.__name__} id: {self.id}, title: {self.title}, user: {self.user}, created_at: {self.created_at}, state: {self.state}>'
|
return (
|
||||||
|
f'<{self.__class__.__name__} id: {self.id}, title: {self.title}, user: {self.user}, created_at:'
|
||||||
|
f' {self.created_at}, state: {self.state}>'
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def updated_at(self) -> Optional[datetime]:
|
def updated_at(self) -> Optional[datetime]:
|
||||||
|
@ -518,7 +518,10 @@ class Organization(APIObject):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f'<{self.__class__.__name__} login: {self.login!r}, id: {self.id}, is_verified: {self.is_verified}, public_repos: {self.public_repos}, public_gists: {self.public_gists}, created_at: {self.created_at}>'
|
return (
|
||||||
|
f'<{self.__class__.__name__} login: {self.login!r}, id: {self.id}, is_verified: {self.is_verified},'
|
||||||
|
f' public_repos: {self.public_repos}, public_gists: {self.public_gists}, created_at: {self.created_at}>'
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def description(self):
|
def description(self):
|
||||||
|
|
|
@ -4,40 +4,40 @@ BASE_URL = 'https://api.github.com'
|
||||||
|
|
||||||
|
|
||||||
# == user urls ==#
|
# == user urls ==#
|
||||||
USERS_URL = BASE_URL + '/users/{0}'
|
USERS_URL = f"{BASE_URL}/users/{{0}}"
|
||||||
|
|
||||||
USER_HTML_URL = 'https://github.com/users/{0}'
|
USER_HTML_URL = 'https://github.com/users/{0}'
|
||||||
|
|
||||||
SELF_URL = BASE_URL + '/user'
|
SELF_URL = f"{BASE_URL}/user"
|
||||||
|
|
||||||
USER_REPOS_URL = USERS_URL + '/repos'
|
USER_REPOS_URL = f"{USERS_URL}/repos"
|
||||||
|
|
||||||
USER_ORGS_URL = USERS_URL + '/orgs'
|
USER_ORGS_URL = f"{USERS_URL}/orgs"
|
||||||
|
|
||||||
USER_GISTS_URL = USERS_URL + '/gists'
|
USER_GISTS_URL = f"{USERS_URL}/gists"
|
||||||
|
|
||||||
USER_FOLLOWERS_URL = USERS_URL + '/followers'
|
USER_FOLLOWERS_URL = f"{USERS_URL}/followers"
|
||||||
|
|
||||||
USER_FOLLOWING_URL = USERS_URL + '/following'
|
USER_FOLLOWING_URL = f"{USERS_URL}/following"
|
||||||
|
|
||||||
|
|
||||||
# == repo urls ==#
|
# == repo urls ==#
|
||||||
CREATE_REPO_URL = BASE_URL + '/user/repos' # _auth repo create
|
CREATE_REPO_URL = f"{BASE_URL}/user/repos" # _auth repo create
|
||||||
|
|
||||||
REPOS_URL = BASE_URL + '/repos/{0}' # repos of a user
|
REPOS_URL = f"{BASE_URL}/repos/{{0}}" # repos of a user
|
||||||
|
|
||||||
REPO_URL = BASE_URL + '/repos/{0}/{1}' # a specific repo
|
REPO_URL = f"{BASE_URL}/repos/{{0}}/{{1}}" # a specific repo
|
||||||
|
|
||||||
ADD_FILE_URL = BASE_URL + '/repos/{}/{}/contents/{}'
|
ADD_FILE_URL = f"{BASE_URL}/repos/{{}}/{{}}/contents/{{}}"
|
||||||
|
|
||||||
ADD_FILE_BRANCH = BASE_URL + ''
|
ADD_FILE_BRANCH = f"{BASE_URL}"
|
||||||
|
|
||||||
REPO_ISSUE_URL = REPO_URL + '/issues/{2}' # a specific issue
|
REPO_ISSUE_URL = f"{REPO_URL}/issues/{{2}}" # a specific issue
|
||||||
|
|
||||||
# == gist urls ==#
|
# == gist urls ==#
|
||||||
GIST_URL = BASE_URL + '/gists/{0}' # specific gist
|
GIST_URL = f"{BASE_URL}/gists/{{0}}" # specific gist
|
||||||
|
|
||||||
CREATE_GIST_URL = BASE_URL + '/gists' # create a gist
|
CREATE_GIST_URL = f"{BASE_URL}/gists" # create a gist
|
||||||
|
|
||||||
# == org urls ==#
|
# == org urls ==#
|
||||||
ORG_URL = BASE_URL + '/orgs/{0}'
|
ORG_URL = f"{BASE_URL}/orgs/{{0}}"
|
||||||
|
|
|
@ -1,3 +1,47 @@
|
||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 125
|
line-length = 125
|
||||||
skip-string-normalization = true
|
skip-string-normalization = true
|
||||||
|
preview = true # better formatting basically
|
||||||
|
|
||||||
|
[tool.isort]
|
||||||
|
line_length = 125
|
||||||
|
combine_as_imports = true
|
||||||
|
combine_star = true
|
||||||
|
|
||||||
|
[tool.pyright]
|
||||||
|
typeCheckingMode = "basic"
|
||||||
|
strictListInference = true
|
||||||
|
strictDictionaryInference = true
|
||||||
|
strictSetInference = true
|
||||||
|
|
||||||
|
# explicity enabling is better than making it strict and disabling stuff
|
||||||
|
reportMissingModuleSource = "error"
|
||||||
|
reportAssertAlwaysTrue = "error"
|
||||||
|
reportInvalidStringEscapeSequence = "error"
|
||||||
|
reportInvalidTypeVarUse = "error"
|
||||||
|
reportSelfClsParameterName = "error"
|
||||||
|
reportUnsupportedDunderAll = "error"
|
||||||
|
reportUnusedExpression = "error"
|
||||||
|
reportWildcardImportFromLibrary = "error"
|
||||||
|
reportConstantRedefinition = "error"
|
||||||
|
reportDuplicateImport = "error"
|
||||||
|
reportImportCycles = "error"
|
||||||
|
reportIncompatibleVariableOverride = "error"
|
||||||
|
reportIncompleteStub = "error"
|
||||||
|
reportInconsistentConstructor = "error"
|
||||||
|
reportInvalidStubStatement = "error"
|
||||||
|
reportMatchNotExhaustive = "error"
|
||||||
|
reportMissingParameterType = "error"
|
||||||
|
reportTypeCommentUsage = "error"
|
||||||
|
reportUnnecessaryCast = "error"
|
||||||
|
reportUnnecessaryComparison = "error"
|
||||||
|
reportUnnecessaryIsInstance = "error"
|
||||||
|
reportUnusedClass = "error"
|
||||||
|
reportUnusedVariable = "error"
|
||||||
|
reportUntypedBaseClass = "error"
|
||||||
|
reportUntypedClassDecorator = "error"
|
||||||
|
reportUntypedFunctionDecorator = "error"
|
||||||
|
reportUntypedNamedTuple = "error"
|
||||||
|
reportCallInDefaultInitializer = "error"
|
||||||
|
reportPropertyTypeMismatch = "error"
|
||||||
|
reportUnnecessaryTypeIgnoreComment = "error"
|
||||||
|
|
|
@ -17,4 +17,4 @@ project_urls =
|
||||||
packages = find:
|
packages = find:
|
||||||
python_requires = >=3.8
|
python_requires = >=3.8
|
||||||
install_requires =
|
install_requires =
|
||||||
aiohttp == 3.8.1
|
aiohttp == 3.8.1
|
||||||
|
|
17
setup.py
17
setup.py
|
@ -1,21 +1,12 @@
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
|
|
||||||
with open('requirements.txt') as f:
|
|
||||||
requirements = f.read().splitlines()
|
|
||||||
|
|
||||||
path = Path(__file__).parent / "github" / "__init__.py"
|
|
||||||
version = re.search(r'\d[.]\d[.]\d', path.read_text()).group(0) # type: ignore
|
|
||||||
|
|
||||||
packages = [
|
packages = [
|
||||||
'github',
|
'github',
|
||||||
]
|
]
|
||||||
|
|
||||||
readme = ''
|
|
||||||
with open('README.rst') as f:
|
|
||||||
readme = f.read()
|
|
||||||
|
|
||||||
extras_require = {
|
extras_require = {
|
||||||
'docs': [
|
'docs': [
|
||||||
'sphinx==4.4.0',
|
'sphinx==4.4.0',
|
||||||
|
@ -29,11 +20,11 @@ setup(
|
||||||
name='github',
|
name='github',
|
||||||
author='VarMonke & sudosnok',
|
author='VarMonke & sudosnok',
|
||||||
url='https://github.com/VarMonke/Github-Api-Wrapper',
|
url='https://github.com/VarMonke/Github-Api-Wrapper',
|
||||||
version=version,
|
version=re.search(r'\d[.]\d[.]\d', (Path('github') / '__init__.py').read_text())[0],
|
||||||
packages=packages,
|
packages=packages,
|
||||||
license='MIT',
|
license='MIT',
|
||||||
description='An asynchronous python wrapper around the GitHub API',
|
description='An asynchronous python wrapper around the GitHub API',
|
||||||
long_description=readme,
|
long_description=Path('README.rst').read_text(),
|
||||||
install_requires=requirements,
|
install_requires=Path('requirements.txt').read_text().splitlines(),
|
||||||
python_requires='>=3.8.0',
|
python_requires='>=3.8.0',
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue