Allow selecting own repositories (#65695)

This commit is contained in:
Joakim Sørensen 2022-02-04 19:33:10 +01:00 committed by GitHub
parent a6caf3f579
commit 8021b05448
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 22 deletions

View file

@ -10,7 +10,6 @@ from aiogithubapi import (
GitHubException, GitHubException,
GitHubLoginDeviceModel, GitHubLoginDeviceModel,
GitHubLoginOauthModel, GitHubLoginOauthModel,
GitHubRepositoryModel,
) )
from aiogithubapi.const import OAUTH_USER_LOGIN from aiogithubapi.const import OAUTH_USER_LOGIN
import voluptuous as vol import voluptuous as vol
@ -34,11 +33,12 @@ from .const import (
) )
async def starred_repositories(hass: HomeAssistant, access_token: str) -> list[str]: async def get_repositories(hass: HomeAssistant, access_token: str) -> list[str]:
"""Return a list of repositories that the user has starred.""" """Return a list of repositories that the user owns or has starred."""
client = GitHubAPI(token=access_token, session=async_get_clientsession(hass)) client = GitHubAPI(token=access_token, session=async_get_clientsession(hass))
repositories = set()
async def _get_starred() -> list[GitHubRepositoryModel] | None: async def _get_starred_repositories() -> None:
response = await client.user.starred(**{"params": {"per_page": 100}}) response = await client.user.starred(**{"params": {"per_page": 100}})
if not response.is_last_page: if not response.is_last_page:
results = await asyncio.gather( results = await asyncio.gather(
@ -54,16 +54,44 @@ async def starred_repositories(hass: HomeAssistant, access_token: str) -> list[s
for result in results: for result in results:
response.data.extend(result.data) response.data.extend(result.data)
return response.data repositories.update(response.data)
async def _get_personal_repositories() -> None:
response = await client.user.repos(**{"params": {"per_page": 100}})
if not response.is_last_page:
results = await asyncio.gather(
*(
client.user.repos(
**{"params": {"per_page": 100, "page": page_number}},
)
for page_number in range(
response.next_page_number, response.last_page_number + 1
)
)
)
for result in results:
response.data.extend(result.data)
repositories.update(response.data)
try: try:
result = await _get_starred() await asyncio.gather(
*(
_get_starred_repositories(),
_get_personal_repositories(),
)
)
except GitHubException: except GitHubException:
return DEFAULT_REPOSITORIES return DEFAULT_REPOSITORIES
if not result or len(result) == 0: if len(repositories) == 0:
return DEFAULT_REPOSITORIES return DEFAULT_REPOSITORIES
return sorted((repo.full_name for repo in result), key=str.casefold)
return sorted(
(repo.full_name for repo in repositories),
key=str.casefold,
)
class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
@ -153,9 +181,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
assert self._login is not None assert self._login is not None
if not user_input: if not user_input:
repositories = await starred_repositories( repositories = await get_repositories(self.hass, self._login.access_token)
self.hass, self._login.access_token
)
return self.async_show_form( return self.async_show_form(
step_id="repositories", step_id="repositories",
data_schema=vol.Schema( data_schema=vol.Schema(
@ -205,7 +231,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
configured_repositories: list[str] = self.config_entry.options[ configured_repositories: list[str] = self.config_entry.options[
CONF_REPOSITORIES CONF_REPOSITORIES
] ]
repositories = await starred_repositories( repositories = await get_repositories(
self.hass, self.config_entry.data[CONF_ACCESS_TOKEN] self.hass, self.config_entry.data[CONF_ACCESS_TOKEN]
) )

View file

@ -3,7 +3,7 @@
"name": "GitHub", "name": "GitHub",
"documentation": "https://www.home-assistant.io/integrations/github", "documentation": "https://www.home-assistant.io/integrations/github",
"requirements": [ "requirements": [
"aiogithubapi==22.1.0" "aiogithubapi==22.2.0"
], ],
"codeowners": [ "codeowners": [
"@timmo001", "@timmo001",
@ -11,5 +11,7 @@
], ],
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"config_flow": true, "config_flow": true,
"loggers": ["aiogithubapi"] "loggers": [
"aiogithubapi"
]
} }

View file

@ -175,7 +175,7 @@ aioflo==2021.11.0
aioftp==0.12.0 aioftp==0.12.0
# homeassistant.components.github # homeassistant.components.github
aiogithubapi==22.1.0 aiogithubapi==22.2.0
# homeassistant.components.guardian # homeassistant.components.guardian
aioguardian==2021.11.0 aioguardian==2021.11.0

View file

@ -125,7 +125,7 @@ aioesphomeapi==10.8.1
aioflo==2021.11.0 aioflo==2021.11.0
# homeassistant.components.github # homeassistant.components.github
aiogithubapi==22.1.0 aiogithubapi==22.2.0
# homeassistant.components.guardian # homeassistant.components.guardian
aioguardian==2021.11.0 aioguardian==2021.11.0

View file

@ -4,7 +4,7 @@ from unittest.mock import AsyncMock, MagicMock, patch
from aiogithubapi import GitHubException from aiogithubapi import GitHubException
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.github.config_flow import starred_repositories from homeassistant.components.github.config_flow import get_repositories
from homeassistant.components.github.const import ( from homeassistant.components.github.const import (
CONF_ACCESS_TOKEN, CONF_ACCESS_TOKEN,
CONF_REPOSITORIES, CONF_REPOSITORIES,
@ -161,11 +161,19 @@ async def test_starred_pagination_with_paginated_result(hass: HomeAssistant) ->
last_page_number=2, last_page_number=2,
data=[MagicMock(full_name="home-assistant/core")], data=[MagicMock(full_name="home-assistant/core")],
) )
) ),
repos=AsyncMock(
return_value=MagicMock(
is_last_page=False,
next_page_number=2,
last_page_number=2,
data=[MagicMock(full_name="awesome/reposiotry")],
)
),
) )
), ),
): ):
repos = await starred_repositories(hass, MOCK_ACCESS_TOKEN) repos = await get_repositories(hass, MOCK_ACCESS_TOKEN)
assert len(repos) == 2 assert len(repos) == 2
assert repos[-1] == DEFAULT_REPOSITORIES[0] assert repos[-1] == DEFAULT_REPOSITORIES[0]
@ -182,11 +190,17 @@ async def test_starred_pagination_with_no_starred(hass: HomeAssistant) -> None:
is_last_page=True, is_last_page=True,
data=[], data=[],
) )
) ),
repos=AsyncMock(
return_value=MagicMock(
is_last_page=True,
data=[],
)
),
) )
), ),
): ):
repos = await starred_repositories(hass, MOCK_ACCESS_TOKEN) repos = await get_repositories(hass, MOCK_ACCESS_TOKEN)
assert len(repos) == 2 assert len(repos) == 2
assert repos == DEFAULT_REPOSITORIES assert repos == DEFAULT_REPOSITORIES
@ -200,7 +214,7 @@ async def test_starred_pagination_with_exception(hass: HomeAssistant) -> None:
user=MagicMock(starred=AsyncMock(side_effect=GitHubException("Error"))) user=MagicMock(starred=AsyncMock(side_effect=GitHubException("Error")))
), ),
): ):
repos = await starred_repositories(hass, MOCK_ACCESS_TOKEN) repos = await get_repositories(hass, MOCK_ACCESS_TOKEN)
assert len(repos) == 2 assert len(repos) == 2
assert repos == DEFAULT_REPOSITORIES assert repos == DEFAULT_REPOSITORIES