Esempio n. 1
0
def test_version_to_install():
    repository = dummy_repository_base()
    repository.status.selected_tag = "master"
    assert version_to_install(repository) == "master"

    repository = dummy_repository_base()
    repository.data.default_branch = None
    repository.versions.available = None
    repository.status.selected_tag = None
    assert version_to_install(repository) == "master"

    repository = dummy_repository_base()
    repository.status.selected_tag = "2"
    assert version_to_install(repository) == "2"

    repository = dummy_repository_base()
    repository.status.selected_tag = None
    assert version_to_install(repository) == "3"

    repository = dummy_repository_base()
    repository.status.selected_tag = None
    repository.versions.available = None
    assert version_to_install(repository) == "master"

    repository = dummy_repository_base()
    repository.status.selected_tag = "2"
    repository.versions.available = None
    assert version_to_install(repository) == "2"

    repository = dummy_repository_base()
    repository.status.selected_tag = "master"
    repository.versions.available = None
    assert version_to_install(repository) == "master"

    repository = dummy_repository_base()
    repository.status.selected_tag = "3"
    repository.versions.available = "3"
    version_to_install(repository)
    assert repository.status.selected_tag is None

    repository = dummy_repository_base()
    repository.data.default_branch = "dev"
    repository.versions.available = None
    repository.status.selected_tag = None
    assert version_to_install(repository) == "dev"
Esempio n. 2
0
def dummy_repository_base(repository=None):
    if repository is None:
        repository = HacsRepository()
    repository.hacs.hass = HomeAssistant()
    repository.hacs.hass.data = {"custom_components": []}
    repository.logger = Logger("hacs.test.test")
    repository.data.full_name = "test/test"
    repository.versions.available = "3"
    repository.status.selected_tag = "3"
    repository.ref = version_to_install(repository)
    repository.integration_manifest = {"config_flow": False, "domain": "test"}
    repository.releases.published_tags = ["1", "2", "3"]
    repository.data.update_data(repository_data)
    return repository
Esempio n. 3
0
async def common_update_data(repository):
    """Common update data."""
    hacs = get_hacs()
    try:
        repository_object = await get_repository(hacs.session,
                                                 hacs.configuration.token,
                                                 repository.data.full_name)
        repository.repository_object = repository_object
        repository.data.update_data(repository_object.attributes)
    except (AIOGitHubException, HacsException) as exception:
        if not hacs.system.status.startup:
            repository.logger.error(exception)
        repository.validate.errors.append("Repository does not exist.")
        raise HacsException(exception)

    # Make sure the repository is not archived.
    if repository.data.archived:
        repository.validate.errors.append("Repository is archived.")
        raise HacsException("Repository is archived.")

    # Make sure the repository is not in the blacklist.
    if is_removed(repository.data.full_name):
        repository.validate.errors.append("Repository is in the blacklist.")
        raise HacsException("Repository is in the blacklist.")

    # Get releases.
    try:
        releases = await get_releases(
            repository.repository_object,
            repository.status.show_beta,
            hacs.configuration.release_limit,
        )
        if releases:
            repository.releases.releases = True
            repository.releases.objects = releases
            repository.releases.published_tags = [
                x.tag_name for x in releases if not x.draft
            ]
            repository.versions.available = next(iter(releases)).tag_name
            for release in releases:
                if release.tag_name == repository.ref:
                    assets = release.assets
                    if assets:
                        downloads = next(
                            iter(assets)).attributes.get("download_count")
                        repository.releases.downloads = downloads

    except (AIOGitHubException, HacsException):
        repository.releases.releases = False

    repository.ref = version_to_install(repository)

    repository.logger.debug(
        f"Running checks against {repository.ref.replace('tags/', '')}")

    try:
        repository.tree = await get_tree(repository.repository_object,
                                         repository.ref)
        if not repository.tree:
            raise HacsException("No files in tree")
        repository.treefiles = []
        for treefile in repository.tree:
            repository.treefiles.append(treefile.full_path)
    except (AIOGitHubException, HacsException) as exception:
        if not hacs.system.status.startup:
            repository.logger.error(exception)
        raise HacsException(exception)
Esempio n. 4
0
async def common_validate(repository):
    """Common validation steps of the repository."""
    hacs = get_hacs()
    repository.validate.errors = []

    # Make sure the repository exist.
    repository.logger.debug("Checking repository.")
    try:
        repository_object = await get_repository(
            hacs.session, hacs.configuration.token,
            repository.information.full_name)
        repository.repository_object = repository_object
        repository.data = repository.data.create_from_dict(
            repository_object.attributes)
    except (AIOGitHubException, HacsException) as exception:
        if not hacs.system.status.startup:
            repository.logger.error(exception)
        repository.validate.errors.append("Repository does not exist.")
        raise HacsException(exception)

    # Make sure the repository is not archived.
    if repository.data.archived:
        repository.validate.errors.append("Repository is archived.")
        raise HacsException("Repository is archived.")

    # Make sure the repository is not in the blacklist.
    if repository.data.full_name in hacs.common.blacklist:
        repository.validate.errors.append("Repository is in the blacklist.")
        raise HacsException("Repository is in the blacklist.")

    # Get releases.
    try:
        releases = await get_releases(
            repository.repository_object,
            repository.status.show_beta,
            hacs.configuration.release_limit,
        )
        if releases:
            repository.releases.releases = True
            repository.releases.published_tags = [x.tag_name for x in releases]
            repository.versions.available = next(iter(releases)).tag_name
            assets = next(iter(releases)).assets
            if assets:
                downloads = next(iter(assets)).attributes.get("download_count")
                repository.releases.downloads = downloads

    except (AIOGitHubException, HacsException):
        repository.releases.releases = False

    repository.ref = version_to_install(repository)

    repository.logger.debug(
        f"Running checks against {repository.ref.replace('tags/', '')}")

    try:
        repository.tree = await get_tree(repository.repository_object,
                                         repository.ref)
        if not repository.tree:
            raise HacsException("No files in tree")
        repository.treefiles = []
        for treefile in repository.tree:
            repository.treefiles.append(treefile.full_path)
    except (AIOGitHubException, HacsException) as exception:
        if not hacs.system.status.startup:
            repository.logger.error(exception)
        raise HacsException(exception)

    # Step 6: Get the content of hacs.json
    await repository.get_repository_manifest_content()

    # Set repository name
    repository.information.name = repository.information.full_name.split(
        "/")[1]