Example #1
0
    def config(self, context: Dict[str, Resolver]) -> Dict[Any, Any]:
        """
        Return the contents of config.yml.

        All disabled modules are removed from the configuration dictionary.
        """
        if hasattr(self, '_config'):
            return self._config

        # The repository already exists, so it is assumed that the user wants
        # the repository cloned
        if not self.directory.is_dir():
            clone_repo(
                user=self.github_user,
                repository=self.github_repo,
                modules_directory=self.modules_directory,
            )
        elif self.autoupdate:
            clone_or_pull_repo(
                user=self.github_user,
                repository=self.github_repo,
                modules_directory=self.modules_directory,
            )

        self._config = filter_config_file(
            config_file=self.config_file,
            context=context,
            enabled_module_name=self.enabled_module_name,
            prepend=f'github::{self.github_user}/{self.github_repo}::',
        )

        return self._config
Example #2
0
    def __init__(
        self,
        enabling_statement: EnablingStatement,
        modules_directory: Path,
    ) -> None:
        """
        Initialize enabled module defined in Github repository.

        A GitHub module is enabled with the name syntax:
        github::<github_user>/<github_repo>[::<enabled_module>]

        If <enabled_module> is skipped, all modules are enabled, i.e.
        github::<github_user>/<github_repo>::*
        """
        assert self.represented_by(
            module_name=enabling_statement['name'],
        )
        assert modules_directory.is_absolute()

        specified_module = enabling_statement['name']
        self.autoupdate = enabling_statement.get('autoupdate', False)

        github_path, *enabled_modules = specified_module[8:].split('::')
        if len(enabled_modules) > 0:
            self.enabled_module = enabled_modules[0]
        else:
            self.enabled_module = '*'

        self.github_user, self.github_repo = github_path.split('/')
        self.prepend = f'github::{self.github_user}/{self.github_repo}::'

        self.directory = modules_directory \
            / self.github_user \
            / self.github_repo
        self.modules_file = self.directory / 'modules.yml'
        self.context_file = self.directory / 'context.yml'

        if not self.directory.is_dir():
            clone_repo(
                user=self.github_user,
                repository=self.github_repo,
                modules_directory=modules_directory,
            )
        elif self.autoupdate:
            clone_or_pull_repo(
                user=self.github_user,
                repository=self.github_repo,
                modules_directory=modules_directory,
            )
Example #3
0
def test_cloning_two_repositories(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))
    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )
    repo_dir = clone_repo(
        user='******',
        repository='solar-desktop.astrality',
        modules_directory=modules_directory,
    )

    github_user_directory = modules_directory / 'jakobgm'
    assert len(tuple(github_user_directory.iterdir())) == 2
Example #4
0
def test_cloning_non_existent_github_repository(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))

    with pytest.raises(GithubModuleError):
        clone_repo(
            user='******',
            repository='i-will-never-create-this-repository',
            modules_directory=modules_directory,
        )

    github_user_directory = modules_directory / 'jakobgm'
    assert not github_user_directory.is_dir()

    repository_directory = github_user_directory / 'i-will-never-create-this-repository'
    assert not repository_directory.is_dir()
Example #5
0
def test_clone_or_pull_repository_by_updating_outdated_repository(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))
    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )

    # Move master to first commit in repository
    result = run_shell(
        command='git reset --hard 2b8941a',
        timeout=5,
        fallback=False,
        working_directory=repo_dir,
    )
    assert result is not False

    # The readme does not exist in this commit
    readme = repo_dir / 'README.rst'
    assert not readme.is_file()

    # The following pull should reintroduce the README into the directory
    updated_repo_dir = clone_or_pull_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )
    assert updated_repo_dir == repo_dir
    assert readme.is_file()
Example #6
0
def test_cloning_one_existent_and_one_non_existent_repo(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))
    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )

    with pytest.raises(GithubModuleError):
        repo_dir = clone_repo(
            user='******',
            repository='i-will-never-create-this-repository',
            modules_directory=modules_directory,
        )

    github_user_directory = modules_directory / 'jakobgm'
    assert len(tuple(github_user_directory.iterdir())) == 1
Example #7
0
def test_cloning_the_same_repo_twice(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))
    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )

    config_file = modules_directory / 'jakobgm' / 'color-schemes.astrality' / 'config.yml'
    config_file.write_text('user edited')

    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )

    with open(config_file) as file:
        assert file.read() == 'user edited'
Example #8
0
def test_clone_github_repo(tmpdir):
    modules_directory = Path(tmpdir.mkdir('modules'))
    repo_dir = clone_repo(
        user='******',
        repository='color-schemes.astrality',
        modules_directory=modules_directory,
    )
    assert repo_dir.is_dir()

    module_config = repo_dir / 'config.yml'
    assert module_config.is_file()

    assert repo_dir.name == 'color-schemes.astrality'
    assert repo_dir.parent.name == 'jakobgm'