From 00fb04f9059d6adecf73ee3c1d634964be695c3b Mon Sep 17 00:00:00 2001 From: Roman Mogylatov Date: Thu, 9 Jul 2020 20:02:17 -0400 Subject: [PATCH] Do more refactoring for ghnav-flask --- .../githubnavigator/application.py | 16 +++-- .../ghnav-flask/githubnavigator/github.py | 67 ------------------- .../ghnav-flask/githubnavigator/services.py | 41 ++++++++++++ .../githubnavigator/templates/index.html | 12 ++-- .../ghnav-flask/githubnavigator/views.py | 8 +-- .../applications/ghnav-flask/requirements.txt | 2 +- 6 files changed, 63 insertions(+), 83 deletions(-) delete mode 100644 examples/applications/ghnav-flask/githubnavigator/github.py create mode 100644 examples/applications/ghnav-flask/githubnavigator/services.py diff --git a/examples/applications/ghnav-flask/githubnavigator/application.py b/examples/applications/ghnav-flask/githubnavigator/application.py index a29072e4..5eb27354 100644 --- a/examples/applications/ghnav-flask/githubnavigator/application.py +++ b/examples/applications/ghnav-flask/githubnavigator/application.py @@ -1,8 +1,9 @@ """Application module.""" from dependency_injector import containers, providers +import github -from . import github, views, webapp +from . import services, views, webapp class Application(containers.DeclarativeContainer): @@ -11,14 +12,19 @@ class Application(containers.DeclarativeContainer): config = providers.Configuration() github_client = providers.Factory( - github.GitHubApiClient, - auth_token=config.github.auth_token, - request_timeout=config.github.request_timeout, + github.Github, + login_or_token=config.github.auth_token, + timeout=config.github.request_timeout, + ) + + search_service = providers.Factory( + services.SearchService, + github_client=github_client, ) index_view = providers.Callable( views.index, - github_client=github_client, + search_service=search_service, default_search_term=config.search.default_term, default_search_limit=config.search.default_limit, ) diff --git a/examples/applications/ghnav-flask/githubnavigator/github.py b/examples/applications/ghnav-flask/githubnavigator/github.py deleted file mode 100644 index 18593347..00000000 --- a/examples/applications/ghnav-flask/githubnavigator/github.py +++ /dev/null @@ -1,67 +0,0 @@ -"""Github API module.""" - -import requests - - -class GitHubApiClient: - """GitHub API client performs operations with Github API.""" - - API_URL = 'https://api.github.com/' - DEFAULT_LIMIT = 5 - - def __init__(self, auth_token, request_timeout): - """Initialize search.""" - self._auth_token = auth_token - self._request_timeout = request_timeout - - def search_repositories(self, search_term, limit): - """Search repositories.""" - if not search_term: - return [] - - repositories = self._make_search('repositories', search_term, limit) - latest_commits = [ - self._get_latest_commit(repository, search_term) - for repository in repositories - ] - return list(zip(repositories, latest_commits)) - - def _make_search(self, entity, search_term, limit): - headers = {} - if self._auth_token: - headers['authorization'] = f'token {self._auth_token}' - - response = requests.get( - url=f'{self.API_URL}search/{entity}', - params={ - 'q': f'{search_term} in:name', - 'sort': 'updated', - 'order': 'desc', - 'page': 1, - 'per_page': limit, - }, - headers=headers, - timeout=self._request_timeout, - ) - data = response.json() - return data['items'] - - def _get_latest_commit(self, repository, search_term): - headers = {} - if self._auth_token: - headers['authorization'] = f'token {self._auth_token}' - - response = requests.get( - url=repository['commits_url'].replace('{/sha}', ''), - params={ - 'q': f'{search_term} in:name', - 'sort': 'updated', - 'order': 'desc', - 'page': 1, - 'per_page': 1, - }, - headers=headers, - timeout=self._request_timeout, - ) - data = response.json() - return data[0] diff --git a/examples/applications/ghnav-flask/githubnavigator/services.py b/examples/applications/ghnav-flask/githubnavigator/services.py new file mode 100644 index 00000000..d167404e --- /dev/null +++ b/examples/applications/ghnav-flask/githubnavigator/services.py @@ -0,0 +1,41 @@ +"""Services module.""" + +from github import Github +from github.Repository import Repository +from github.Commit import Commit + + +class SearchService: + """Search service performs search on Github.""" + + def __init__(self, github_client: Github): + self._github_client = github_client + + def search_repositories(self, term, limit): + """Search for repositories and return formatted data.""" + repositories = self._github_client.search_repositories(term, **{'in': 'name'}) + return [ + self._format_repo(repository) + for repository in repositories[:limit] + ] + + def _format_repo(self, repository: Repository): + return { + 'url': repository.html_url, + 'name': repository.name, + 'owner': { + 'login': repository.owner.login, + 'url': repository.owner.html_url, + 'avatar_url': repository.owner.avatar_url, + }, + 'created_at': repository.created_at, + 'latest_commit': self._format_commit(repository.get_commits()[0]), + } + + def _format_commit(self, commit: Commit): + return { + 'sha': commit.sha, + 'url': commit.html_url, + 'message': commit.commit.message, + 'author_name': commit.commit.author.name, + } diff --git a/examples/applications/ghnav-flask/githubnavigator/templates/index.html b/examples/applications/ghnav-flask/githubnavigator/templates/index.html index c7e878ba..ecb7d266 100644 --- a/examples/applications/ghnav-flask/githubnavigator/templates/index.html +++ b/examples/applications/ghnav-flask/githubnavigator/templates/index.html @@ -16,23 +16,23 @@ {% if repositories|length == 0 %} No search results {% endif %} -{% for repository, latest_commit in repositories %} {{n}} +{% for repository in repositories %} {{n}}

Search result # {{ loop.index }} from {{ repositories|length }}

- Repository: {{ repository['name'] }} + Repository: {{ repository.name }}

Repository owner: - avatar - {{ repository['owner']['login'] }} + avatar + {{ repository.owner.login }}

- Created at: {{ repository['created_at'] }} + Created at: {{ repository.created_at }}

- LastCommit: {{ latest_commit['sha'] }} {{ latest_commit['commit']['message'] }} {{ latest_commit['commit']['author']['name'] }} + LastCommit: {{ repository.latest_commit.sha }} {{ repository.latest_commit['message'] }} {{ repository.latest_commit.author_name }}


{% endfor %} diff --git a/examples/applications/ghnav-flask/githubnavigator/views.py b/examples/applications/ghnav-flask/githubnavigator/views.py index b3fdf06a..f444c559 100644 --- a/examples/applications/ghnav-flask/githubnavigator/views.py +++ b/examples/applications/ghnav-flask/githubnavigator/views.py @@ -2,14 +2,14 @@ from flask import request, render_template -from .github import GitHubApiClient +from .services import SearchService -def index(github_client: GitHubApiClient, default_search_term, default_search_limit): +def index(search_service: SearchService, default_search_term, default_search_limit): search_term = request.args.get('search_term', default_search_term) - limit = request.args.get('limit', default_search_limit) + limit = request.args.get('limit', default_search_limit, int) - repositories = github_client.search_repositories(search_term, limit) + repositories = search_service.search_repositories(search_term, limit) return render_template( 'index.html', diff --git a/examples/applications/ghnav-flask/requirements.txt b/examples/applications/ghnav-flask/requirements.txt index a430e9e9..d3277598 100644 --- a/examples/applications/ghnav-flask/requirements.txt +++ b/examples/applications/ghnav-flask/requirements.txt @@ -1,3 +1,3 @@ dependency-injector flask -requests +pygithub