diff --git a/Github/http.py b/Github/http.py index 3d8d990..eba65bf 100644 --- a/Github/http.py +++ b/Github/http.py @@ -15,6 +15,7 @@ __all__ = ( 'make_session', 'Paginator', 'get_user', + 'get_repo_from_name', ) @@ -117,4 +118,14 @@ async def get_user(session: aiohttp.ClientSession, username: str) -> GitHubUserD result = await session.get(USERS_URL.format(username)) if result.status == 200: return await result.json() - raise UserNotFound \ No newline at end of file + raise UserNotFound + + +# repo-related functions / utils + +async def get_repo_from_name(session: aiohttp.ClientSession, owner: str, repo_name: str): + """Returns a Repo object from the given owner and repo name.""" + result = await session.get(REPO_URL.format(owner, repo_name)) + if result.status == 200: + return await result.json() + raise RepositoryNotFound \ No newline at end of file diff --git a/Github/main.py b/Github/main.py index 150d76e..3e64811 100644 --- a/Github/main.py +++ b/Github/main.py @@ -79,9 +79,9 @@ class GHClient: """Fetch a Github user from their username.""" return User(await http.get_user(self.session, username), self.session) - async def get_repo(self, repo_name: str) -> Repository: + async def get_repo(self, owner: str, repo_name: str) -> Repository: """Fetch a Github repository from it's name.""" - pass + return Repository(await http.get_repo_from_name(self.session, owner, repo_name), self.session) async def get_org(self, org_name: str) -> 'Org': """Fetch a Github organization from it's name""" diff --git a/Github/objects/repo.py b/Github/objects/repo.py index 965585b..c896543 100644 --- a/Github/objects/repo.py +++ b/Github/objects/repo.py @@ -3,7 +3,7 @@ import aiohttp from .objects import APIOBJECT, dt_formatter -from . import PartialUser +from . import PartialUser, User from .. import http __all__ = ( @@ -33,17 +33,31 @@ class Repository(APIOBJECT): def __init__(self, response: dict, session: aiohttp.ClientSession) -> None: super().__init__(response, session) tmp = self.__slots__ + APIOBJECT.__slots__ - keys = {key: value for key,value in self.response.items() if key in tmp} - for key, value in key.items(): + keys = {key: value for key,value in self._response.items() if key in tmp} + for key, value in keys.items(): if key == 'owner': - self.owner = PartialUser(value, self.session) + setattr(self, key, PartialUser(value, session)) + return + + if key == 'name': + setattr(self, key, value) return if '_at' in key and value is not None: setattr(self, key, dt_formatter(value)) return + + else: + setattr(self, key, value) + continue setattr(self, key, value) def __repr__(self) -> str: return f'' + + @classmethod + async def repo_from_name(cls, session: aiohttp.ClientSession,owner: str, repo_name: str) -> 'Repository': + """Fetch a repository from its name.""" + response = await http.get_repo_from_name(session, owner, repo_name) + return Repository(response, session) diff --git a/Github/objects/user.py b/Github/objects/user.py index 6aaf26d..4877ed0 100644 --- a/Github/objects/user.py +++ b/Github/objects/user.py @@ -38,7 +38,7 @@ class User(_BaseUser): def __init__(self, response: dict, session: aiohttp.ClientSession) -> None: super().__init__(response, session) tmp = self.__slots__ + _BaseUser.__slots__ - keys = {key: value for key,value in self._response.items() if key in tmp} + keys = {key: value for key,value in self.items() if key in tmp} for key, value in keys.items(): if '_at' in key and value is not None: setattr(self, key, dt_formatter(value)) diff --git a/Github/urls.py b/Github/urls.py index 9b4a433..e66d083 100644 --- a/Github/urls.py +++ b/Github/urls.py @@ -18,4 +18,12 @@ USER_GISTS_URL = USERS_URL + '/gists' USER_FOLLOWERS_URL = USERS_URL + '/followers' -USER_FOLLOWING_URL = USERS_URL + '/following' \ No newline at end of file +USER_FOLLOWING_URL = USERS_URL + '/following' + + +#== repo urls ==# +REPOS_URL = BASE_URL + '/repos/{0}' # repos of a user + +#REPO_URL = REPOS_URL + '/{1}' # a specific repo + +REPO_URL = BASE_URL + '/repos/{0}/{1}' # a specific repo \ No newline at end of file