initial commit
This commit is contained in:
commit
92a5620abf
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
env/
|
||||
__pycache__/
|
48
cli.py
Normal file
48
cli.py
Normal file
@ -0,0 +1,48 @@
|
||||
import httpx
|
||||
from pprint import pprint
|
||||
|
||||
|
||||
class GHub:
|
||||
headers = {"Accept": "application/vnd.github.v3+json"}
|
||||
|
||||
def __init__(self, user_name: str, repo_name: str):
|
||||
self.user_name = user_name
|
||||
self.repo_name = repo_name
|
||||
|
||||
def get(self, url: str) -> dict:
|
||||
"""Uses httpx.Client().get to send the appropriate github headers, and return the url"""
|
||||
with httpx.Client(headers=self.headers) as client:
|
||||
return client.get(url).json()
|
||||
|
||||
def schema(self) -> dict:
|
||||
"""Show all the schema that are available"""
|
||||
return self.get("https://api.github.com")
|
||||
|
||||
def set_user(self):
|
||||
self.user = self.get_user()
|
||||
|
||||
def get_user(self) -> dict:
|
||||
"""Get the user object"""
|
||||
return self.get(f"https://api.github.com/users/{self.user_name}")
|
||||
|
||||
def set_repo(self):
|
||||
self.repo = self.get_repo()
|
||||
|
||||
def get_repo(self) -> dict:
|
||||
"""Get the repo object"""
|
||||
return self.get(f"https://api.github.com/repos/{self.user_name}/{self.repo_name}")
|
||||
|
||||
|
||||
def main():
|
||||
gh = GHub(user_name="mkb79", repo_name="audible-cli")
|
||||
# pprint(gh.schema())
|
||||
pprint(
|
||||
(
|
||||
gh.get_user(),
|
||||
gh.get_repo(),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
6
requirements.in
Normal file
6
requirements.in
Normal file
@ -0,0 +1,6 @@
|
||||
httpx
|
||||
pip-tools
|
||||
black
|
||||
invoke
|
||||
pytest
|
||||
pytest-httpx
|
83
requirements.txt
Normal file
83
requirements.txt
Normal file
@ -0,0 +1,83 @@
|
||||
#
|
||||
# This file is autogenerated by pip-compile with python 3.9
|
||||
# To update, run:
|
||||
#
|
||||
# pip-compile
|
||||
#
|
||||
anyio==3.3.4
|
||||
# via httpcore
|
||||
attrs==21.2.0
|
||||
# via pytest
|
||||
black==21.10b0
|
||||
# via -r requirements.in
|
||||
certifi==2021.10.8
|
||||
# via httpx
|
||||
charset-normalizer==2.0.7
|
||||
# via httpx
|
||||
click==8.0.3
|
||||
# via
|
||||
# black
|
||||
# pip-tools
|
||||
h11==0.12.0
|
||||
# via httpcore
|
||||
httpcore==0.13.7
|
||||
# via httpx
|
||||
httpx==0.20.0
|
||||
# via
|
||||
# -r requirements.in
|
||||
# pytest-httpx
|
||||
idna==3.3
|
||||
# via
|
||||
# anyio
|
||||
# rfc3986
|
||||
iniconfig==1.1.1
|
||||
# via pytest
|
||||
invoke==1.6.0
|
||||
# via -r requirements.in
|
||||
mypy-extensions==0.4.3
|
||||
# via black
|
||||
packaging==21.2
|
||||
# via pytest
|
||||
pathspec==0.9.0
|
||||
# via black
|
||||
pep517==0.12.0
|
||||
# via pip-tools
|
||||
pip-tools==6.4.0
|
||||
# via -r requirements.in
|
||||
platformdirs==2.4.0
|
||||
# via black
|
||||
pluggy==1.0.0
|
||||
# via pytest
|
||||
py==1.10.0
|
||||
# via pytest
|
||||
pyparsing==2.4.7
|
||||
# via packaging
|
||||
pytest==6.2.5
|
||||
# via
|
||||
# -r requirements.in
|
||||
# pytest-httpx
|
||||
pytest-httpx==0.14.0
|
||||
# via -r requirements.in
|
||||
regex==2021.11.2
|
||||
# via black
|
||||
rfc3986[idna2008]==1.5.0
|
||||
# via httpx
|
||||
sniffio==1.2.0
|
||||
# via
|
||||
# anyio
|
||||
# httpcore
|
||||
# httpx
|
||||
toml==0.10.2
|
||||
# via pytest
|
||||
tomli==1.2.2
|
||||
# via
|
||||
# black
|
||||
# pep517
|
||||
typing-extensions==3.10.0.2
|
||||
# via black
|
||||
wheel==0.37.0
|
||||
# via pip-tools
|
||||
|
||||
# The following packages are considered to be unsafe in a requirements file:
|
||||
# pip
|
||||
# setuptools
|
12
tasks.py
Normal file
12
tasks.py
Normal file
@ -0,0 +1,12 @@
|
||||
from invoke import task
|
||||
|
||||
@task
|
||||
def test(c):
|
||||
c.run("pytest tests.py --pdb")
|
||||
|
||||
@task
|
||||
def black(c):
|
||||
"""
|
||||
Runs The uncompromising Python code formatter on specific python files.
|
||||
"""
|
||||
c.run("black *.py")
|
29
tests.py
Normal file
29
tests.py
Normal file
@ -0,0 +1,29 @@
|
||||
import json
|
||||
import pytest
|
||||
from cli import GHub
|
||||
from pytest_httpx import HTTPXMock
|
||||
|
||||
def _load_user():
|
||||
with open("tests/user.json", "r") as f:
|
||||
return json.loads(f.read())
|
||||
|
||||
def _load_repo():
|
||||
with open("tests/repo.json", "r") as f:
|
||||
return json.loads(f.read())
|
||||
|
||||
def test_user(httpx_mock: HTTPXMock):
|
||||
httpx_mock.add_response(method="GET", json=_load_user())
|
||||
|
||||
gh = GHub(user_name="tyrelsouza", repo_name="work_sample")
|
||||
gh.set_user()
|
||||
assert(gh.user["login"] == "tyrelsouza")
|
||||
|
||||
def test_repo(httpx_mock: HTTPXMock):
|
||||
httpx_mock.add_response(method="GET", json=_load_repo())
|
||||
|
||||
gh = GHub(user_name="tyrelsouza", repo_name="work_sample")
|
||||
gh.set_repo()
|
||||
breakpoint()
|
||||
assert(gh.repo["login"] == "tyrelsouza2")
|
||||
|
||||
|
1
tests/repo.json
Normal file
1
tests/repo.json
Normal file
File diff suppressed because one or more lines are too long
1
tests/user.json
Normal file
1
tests/user.json
Normal file
@ -0,0 +1 @@
|
||||
{"login": "tyrelsouza", "id": 923113, "node_id": "MDQ6VXNlcjkyMzExMw==", "avatar_url": "https://avatars.githubusercontent.com/u/923113?v=4", "gravatar_id": "", "url": "https://api.github.com/users/tyrelsouza", "html_url": "https://github.com/tyrelsouza", "followers_url": "https://api.github.com/users/tyrelsouza/followers", "following_url": "https://api.github.com/users/tyrelsouza/following{/other_user}", "gists_url": "https://api.github.com/users/tyrelsouza/gists{/gist_id}", "starred_url": "https://api.github.com/users/tyrelsouza/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/tyrelsouza/subscriptions", "organizations_url": "https://api.github.com/users/tyrelsouza/orgs", "repos_url": "https://api.github.com/users/tyrelsouza/repos", "events_url": "https://api.github.com/users/tyrelsouza/events{/privacy}", "received_events_url": "https://api.github.com/users/tyrelsouza/received_events", "type": "User", "site_admin": false, "name": "Tyrel Souza", "company": "@tidelift @librariesio", "blog": "https://tidelift.com", "location": "Chapel Hill, NC", "email": null, "hireable": null, "bio": "I have a job. I write code for it. Any sponsorships are my own, and not endorsed by my employer. I disagree with Badges and Achievements.", "twitter_username": "tyrelsouza", "public_repos": 10, "public_gists": 34, "followers": 43, "following": 30, "created_at": "2011-07-18T15:04:40Z", "updated_at": "2021-10-12T05:33:35Z"}
|
Loading…
Reference in New Issue
Block a user