Example #1
0
class GithubSearch:
	def __init__(self, query, language, user, password):
		self.query = query
		self.language = language
		self.user = user
		self.password = password
		self.g = GitHub(self.user, self.password)

	def search(self, num_results = 2):
		return self.g.search_repositories(self.query + " language:" + self.language, number=num_results)
Example #2
0
def clone_repositories():
    gh = GitHub()
    folderpath = "gitrepos"
    repos = gh.search_repositories("cs188 language:python")
    repo_count = 50
    for r in repos:
        if repo_count == 0: break
        repo_json = r.to_json()
        repo_path = os.path.join(folderpath, repo_json["full_name"])
        if not mkdir(repo_path): continue
        Repo.clone_from(repo_json["clone_url"], repo_path)
        repo_count -= 1
    return None
Example #3
0
def get_gh_repos(user, repo_count):
    """
    Get a user's repositories with a limit
    :param user:
    :param repo_count:
    :return:
    """
    repos = None
    if user and repo_count:
        try:
            gh = GitHub()
            repo_limit = int(repo_count) if repo_count else 5
            repos = list(map(lambda r: r.repository, list(gh.search_repositories(
                'user:'******'updated'))[:repo_limit]))
        except GitHubError:
            repos = None

    return repos
Example #4
0
def generate():
    settings = json.load(open('settings.json'))

    # Get all filenames
    pages = _sorted_list_dir(os.path.join('content', 'pages'))
    articles = _sorted_list_dir(os.path.join('content', 'articles'))

    files = pages + articles

    # BEGIN: Parse files
    loader = jn.FileSystemLoader(os.path.join(os.getcwd(), 'templates'))
    env = jn.Environment(loader=loader)

    # Add GitHub repos
    repos = None
    if settings.get('github_user') and settings.get('github_repo_count'):
        try:
            gh = GitHub()
            repo_limit_maybe = settings.get('github_repo_count')
            repo_limit = int(repo_limit_maybe) if repo_limit_maybe else 5
            repos = list(map(lambda r: r.repository, list(gh.search_repositories(
                'user:'******'github_user'], sort='updated'))[:repo_limit]))
        except GitHubError:
            repos = None
            print(
                'GitHub search repositories error. Check "github_user" in settings.json')

    print(' - Parsing articles and pages')
    for f in files:
        fp = f.open()
        file_no_ext = f.name.split('.')[0]
        rest, data = parse_metadata(fp)
        html = markdown.markdown(''.join(rest))

        target = data.get('layout') + 's'
        target_dir = os.path.join('output', target)
        if not os.path.exists(target_dir):
            os.makedirs(target_dir)

        # Create file in output direction
        layout = data.get('layout')
        template = env.get_template(layout + '.html')

        data['content'] = html
        data['url'] = target + '/' + file_no_ext + '.html'
        data['site'] = settings
        data['site']['recent_articles'] = get_recent_articles(articles)
        if repos:
            data['gh_repos'] = repos
        page = template.render(data)  # Date and other things

        file_out = open(
            os.path.join('output', target, file_no_ext + '.html'), 'w')
        file_out.write(page)
        file_out.close()

    # Copy index
    print(' - Parsing index page')
    parse_index(os.path.join('content', 'index.md'), {
        'env': env,
        'settings': settings,
        'articles': articles,
        'repos': repos
    })

    # END: Parse files

    # Copy static directory
    print(' - Generating static directory')
    static = os.path.join('output', 'static')
    if os.path.exists(static):
        shutil.rmtree(static)
    _copy_directory('static', os.path.join('output', 'static'))
Example #5
0
class GitHubClient:
    def __init__(self, config):
        self.config = config
        self._client = GitHub(login=self.login, password=self.secret, token=self.token)
        self.found_project = None

        printer_config = self.config.copy()
        printer_config['formatter'] = _Formatter
        printer_config['writer'] = StdoutWriter

        self.printer = Printer(printer_config)

    def find_project(self):
        if self.project_owner:
            project = repository(repository=self.project_name, owner=self.project_owner)
            if project:
                self.found_project = project
                return
            self._error_nothing_found(True)

        search_result = list(self._client.search_repositories(
            'language:python {}'.format(self.project_name), number=10))

        repositories_count = len(search_result)

        if repositories_count == 1:
            self.found_project = search_result[0].repository
            self.printer.print('Found {}'.format(self.found_project))
            return

        if repositories_count == 0:
            self._error_nothing_found()

        repos = '\n'.join(['[{}]{}/{}'.format(i, r.repository.owner.login, r.repository.name)
                           for i, r in enumerate(search_result, start=1)])
        message = 'Found {count} projects:\n{repos}\n'.format(count=repositories_count, repos=repos)

        self.printer.print(message)
        self.found_project = search_result[self._ask(repos)].repository

    def _error_nothing_found(self, with_owner=False):
        msg = 'Nothing was found! Check project name '
        if with_owner:
            msg += 'and repository owner '
        msg += 'you are looking for!'

        self.printer.print(msg)
        exit(5)

    def _ask(self, repos):
        repositories_count = len(repos)

        answer = None
        while not answer:
            tmp = input('Choose one of them or write "NO" to stop: ')
            if tmp == 'NO':
                exit(3)

            try:
                answer = int(tmp)
            except ValueError:
                self.printer.print('Write only "NO" or repo number!')
                continue

            if not (0 < answer <= repositories_count):
                self.printer.print('Incorrect number!')
                continue

            return answer - 1

    def download_project(self, archive_fd):
        url = self.found_project.archive_urlt.expand(archive_format='zipball')
        response = requests.get(url, stream=True)
        shutil.copyfileobj(response.raw, archive_fd)

    def unzip_project(self, archive_fd, project_folder):
        with ZipFile(archive_fd) as zip:
            zip.extractall(path=project_folder)

    @property
    def project_name(self):
        return self.config['project-name']

    @property
    def project_owner(self):
        return self.config.get('user')

    @property
    def login(self):
        return self.config.get('login')

    @property
    def secret(self):
        return self.config.get('secret')

    @property
    def token(self):
        return self.config.get('token')
Example #6
0
from github3 import GitHub
from git import Repo
from constants import REPOS_BASE_PATH
import os

gh = GitHub()
search_results = gh.search_repositories("dotfiles")

import itertools
for r in search_results:

    repo_path = REPOS_BASE_PATH + r.repository.full_name
    git_url = r.repository.clone_url
    if not os.path.exists(repo_path):
        os.makedirs(repo_path)
        Repo.clone_from(git_url, repo_path)
        print "Cloning into %s" % repo_path

    else:
        print "Already have %s" % repo_path