1
Fork 0
mirror of https://github.com/RGBCube/GitHubWrapper synced 2025-05-30 20:48:12 +00:00

Merge pull request #13 from RGBCube/main

Alot of non-code changes
This commit is contained in:
Var 2022-06-21 21:53:19 +05:30 committed by GitHub
commit a7e6910fcc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 398 additions and 147 deletions

69
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View 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
View 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

View 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
View 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, ...)

View file

@ -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
View 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
View 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

View file

@ -1,23 +1,26 @@
name: Pylint
name: PyLint
on: [push]
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"]
python-version: [ '3.8', '3.9', '3.10' ]
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pylint
- name: Analysing the code with pylint
run: |
pylint $(git ls-files '*.py')
- 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 PyLint
run: pip install -U pip pylint
- name: Run PyLint
run: pylint $(git ls-files '*.py')

28
.github/workflows/pyright.yml vendored Normal file
View 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 ./

View file

@ -1,4 +1,4 @@
version: 1
version: 2
sphinx:
configuration: docs/conf.py
@ -6,7 +6,7 @@ sphinx:
builder: html
python:
version: 3.8
version: '3.8'
install:
- method: pip
path: .

View file

@ -1,6 +1,6 @@
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
of this software and associated documentation files (the "Software"), to deal

View file

@ -16,16 +16,16 @@ Key Features
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
#Linux/macOS
# On Linux or MacOS
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
Quick Example
@ -38,18 +38,21 @@ Quick Example
async def main():
client = await github.GHClient()
return await client.get_user(user='GithubPythonBot')
user = asyncio.run(main())
print(user)
print(user.html_url)
user = await client.get_user(user='GithubPythonBot')
print(user)
print(user.html_url)
asyncio.run(main())
.. code:: sh
#Output
# Output
<User login: 'GithubPythonBot', id: 104489846, created_at: 2022-04-27 07:31:26>
https://github.com/GithubPythonBot
Links
-----
`Discord Server <https://discord.gg/DWhwsQ5TsT>`_
- `Discord Server <https://discord.gg/DWhwsQ5TsT>`_
- `GitHub API Documentation <https://docs.github.com/en/rest>`_

View file

@ -1,6 +1,6 @@
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
of this software and associated documentation files (the "Software"), to deal

View file

@ -1,7 +1,7 @@
MIT License
Copyright (c) 2015-present Rapptz
Copyright (c) 2022 - Present Rapptz, VarMonke and sudosnok
Copyright (c) 2015-2022 Rapptz
Copyright (c) 2022-present VarMonke and sudosnok
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View file

@ -1,7 +1,7 @@
import logging
import sys
import os
import re
import sys
# 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
@ -85,7 +85,7 @@ with open('../github/__init__.py') as f:
release = version
# 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
# for a list of supported languages.

View file

@ -1,8 +1,9 @@
from __future__ import annotations
import importlib
import inspect
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 sphinx import addnodes

View file

@ -42,7 +42,7 @@ class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder):
self.handle_page('genindex-all', genindexcontext, 'genindex.html')
for (key, entries), count in zip(genindex, indexcounts):
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:
self.handle_page('genindex', genindexcontext, 'genindex.html')

View file

@ -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.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):

View file

@ -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 sphinx.locale import _
from docutils.parsers.rst import Directive
class exception_hierarchy(nodes.General, nodes.Element):

View file

@ -4,11 +4,10 @@
from typing import Any, Dict, List, Tuple
import sphinx
from docutils import nodes, utils
from docutils.nodes import Node, system_message
from docutils.parsers.rst.states import Inliner
import sphinx
from sphinx.application import Sphinx
from sphinx.util.nodes import split_explicit_title
from sphinx.util.typing import RoleFunction

View file

@ -4,10 +4,10 @@ __title__ = 'Github-Api-Wrapper'
__authors__ = 'VarMonke', 'sudosnok'
__version__ = '1.2.1'
__license__ = 'MIT'
__copyright__ = 'Copyright (c) 2020 VarMonke & sudosnok'
__copyright__ = 'Copyright (c) 2022-present VarMonke & sudosnok'
from .client import *
from .objects import *
from .http import *
from .urls import *
from .exceptions import *
from .http import *
from .objects import *
from .urls import *

View file

@ -3,7 +3,7 @@
from __future__ import annotations
from collections import deque
from typing import Any, Deque, Tuple, TypeVar, Dict
from typing import Any, Deque, Dict, Tuple, TypeVar
__all__: Tuple[str, ...] = ('ObjectCache',)

View file

@ -2,29 +2,29 @@
from __future__ import annotations
import functools
import aiohttp
from typing import (
Any,
Awaitable,
Callable,
Literal,
Any,
Coroutine,
Dict,
Generator,
List,
Literal,
Optional,
Tuple,
Union,
List,
overload,
TypeVar,
Union,
overload,
)
from typing_extensions import Self, ParamSpec, Concatenate
import aiohttp
from typing_extensions import Concatenate, ParamSpec, Self
from . import exceptions
from .cache import ObjectCache
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')

View file

@ -65,7 +65,7 @@ class Ratelimited(APIError):
def __init__(self, reset_time: datetime.datetime):
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)

View file

@ -1,27 +1,21 @@
# == http.py ==#
from __future__ import annotations
from asyncio.base_subprocess import ReadSubprocessPipeProto
from base64 import b64encode
import json
import platform
import re
from datetime import datetime
from types import SimpleNamespace
from typing import Any, Dict, Literal, NamedTuple, Optional, Type, Tuple, Union, List
from typing_extensions import TypeAlias, reveal_type
import platform
from typing import Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union
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 .exceptions import *
from .objects import File, Gist, Repository, User, bytes_to_b64
from .urls import *
__all__: Tuple[str, ...] = (
'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:
"""This makes the ClientSession, attaching the trace config and ensuring a UA header is present."""
if not headers.get('User-Agent'):
headers[
'User-Agent'
] = f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python {platform.python_version()} aiohttp {aiohttp.__version__}'
headers['User-Agent'] = (
f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python'
f' {platform.python_version()} aiohttp {aiohttp.__version__}'
)
session = aiohttp.ClientSession(auth=authorization, headers=headers, trace_configs=[trace_config])
session._rates = Rates('', '', '', '', '')
@ -140,9 +135,10 @@ class Paginator:
class http:
def __init__(self, headers: Dict[str, Union[str, int]], auth: Union[aiohttp.BasicAuth, None]) -> None:
if not headers.get('User-Agent'):
headers[
'User-Agent'
] = f'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @ {__version__} Python/{platform.python_version()} aiohttp/{aiohttp.__version__}'
headers['User-Agent'] = (
'Github-API-Wrapper (https://github.com/VarMonke/Github-Api-Wrapper) @'
f' {__version__} Python/{platform.python_version()} aiohttp/{aiohttp.__version__}'
)
self._rates = Rates('', '', '', '', '')
self.headers = headers

View file

@ -1,18 +1,15 @@
# == objects.py ==#
from __future__ import annotations
from base64 import b64encode
import json
from typing import TYPE_CHECKING, Any, Literal, Optional, Tuple, Union, Dict, List
import aiohttp
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
if TYPE_CHECKING:
from .http import http
from datetime import datetime
import io
import os
from datetime import datetime
__all__: Tuple[str, ...] = (
'APIObject',
@ -201,7 +198,7 @@ class Repository(APIObject):
'id',
'name',
'owner',
'size' 'created_at',
'sizecreated_at',
'url',
'html_url',
'archived',
@ -346,7 +343,10 @@ class Issue(APIObject):
continue
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
def updated_at(self) -> Optional[datetime]:
@ -518,7 +518,10 @@ class Organization(APIObject):
continue
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
def description(self):

View file

@ -4,40 +4,40 @@ BASE_URL = 'https://api.github.com'
# == user urls ==#
USERS_URL = BASE_URL + '/users/{0}'
USERS_URL = f"{BASE_URL}/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 ==#
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_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_URL = BASE_URL + '/orgs/{0}'
ORG_URL = f"{BASE_URL}/orgs/{{0}}"

View file

@ -1,3 +1,47 @@
[tool.black]
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"

View file

@ -17,4 +17,4 @@ project_urls =
packages = find:
python_requires = >=3.8
install_requires =
aiohttp == 3.8.1
aiohttp == 3.8.1

View file

@ -1,21 +1,12 @@
import re
from pathlib import Path
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 = [
'github',
]
readme = ''
with open('README.rst') as f:
readme = f.read()
extras_require = {
'docs': [
'sphinx==4.4.0',
@ -29,11 +20,11 @@ setup(
name='github',
author='VarMonke & sudosnok',
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,
license='MIT',
description='An asynchronous python wrapper around the GitHub API',
long_description=readme,
install_requires=requirements,
long_description=Path('README.rst').read_text(),
install_requires=Path('requirements.txt').read_text().splitlines(),
python_requires='>=3.8.0',
)