Exemple #1
0
    def get_user_info(self, sorted_users):
        """Gets user info from the GitHubAPI.

        For each user in sorted_users, determines whether the user is
        a regular user or an organization.

        :type sorted_users: list
        :param sorted_users: Sorted list of users.

        :rtype: tuple of two lists
        :return: (first list, second list)
            First list: list of [:class:`githubstats.user.User`]
            Second list: list of [:class:`githubstats.repo.Repo`]
        """
        devs = []
        orgs = []
        self.print_rate_limit()
        for item in sorted_users:
            if item.id in self.cached_users:
                user = self.cached_users[item.id]
            else:
                user = self.github.api.user(item.id)
            if user.type == 'User':
                devs.append(
                    User(item.id, user.name, user.type, user.location,
                         item.stars))
            elif user.type == 'Organization':
                orgs.append(
                    User(item.id, user.name, user.type, user.location,
                         item.stars))
            self.print_rate_limit()
        return devs, orgs
Exemple #2
0
    def group_repos_by_user(self, users):
        """Groups repos in the given list by users.

        Example input:
            users[0] -> User(Google, 1000)
            users[1] -> User(Facebook, 2000)
            users[2] -> User(Google, 3000)
            users[3] -> User(Facebook, 4000)

        Example result:
            result[0] -> User(Facebook, 6000)
            result[1] -> User(Google, 4000)

        :type users: list
        :param users: A list of :class:`githubstats.user.User`.

        :rtype: list
        :return: A grouped sorted list of :class:`githubstats.user.User`.
        """
        user_stars_map = {}
        for item in users:
            if item.id in user_stars_map:
                user_stars_map[item.id].stars += item.stars
            else:
                user_stars_map[item.id] = User(item.id, item.name, item.type,
                                               item.location, item.stars)
        result_list_sorted = sorted(user_stars_map.items(),
                                    key=itemgetter(1),
                                    reverse=True)
        result = self.extract_list_column(result_list_sorted, column=1)
        return result
Exemple #3
0
    def search_repos(self,
                     user_id_to_users_map,
                     repos,
                     language,
                     last_searched_repo=None):
        """Searches repos matching a query.

        Uses language and stars_filter to construct the query.

        :type user_id_to_users_map: dict, {str: :class:`githubstats.user.User`}
        :param user_id_to_users_map: Map of user ids to User.

        :type repos: list of :class:`githubstats.repo.Repo`
        :param repos: The list of repos.

        :type language: str
        :param language: The current language.

        :type last_searched_repo: :class:`githubstats.repo.Repo` (optional)
        :param last_searched_repo: The last repo encountered during a search,
            if any.  Used to resume searching if the list of results exceeds
            1000, the GitHub results search limit.

        :rtype: boolean
        :return: Determines if there are more results to search for.
        """
        stars_filter = None
        if last_searched_repo is not None:
            stars_max = last_searched_repo.stars
            stars_filter = ('stars:' + str(self.CFG_MIN_STARS) + '..' +
                            str(stars_max))
        query = self.generate_search_query(language, stars_filter=stars_filter)
        results = self.github.api.search_repositories(query, sort='stars')
        count = 0
        find_resume_point = True if last_searched_repo is not None else False
        try:
            for result in results:
                count += 1
                if find_resume_point and last_searched_repo.full_name != \
                        result.repository.full_name:
                    continue
                if find_resume_point and last_searched_repo.full_name == \
                        result.repository.full_name:
                    find_resume_point = False
                    continue
                if language == 'Unknown':
                    if result.repository.language is not None:
                        continue
                repo = Repo(result.repository.full_name,
                            result.repository.stargazers_count,
                            result.repository.forks_count,
                            result.repository.description,
                            result.repository.language)
                repos.append(repo)
                user_id = result.repository.full_name.split('/')[0]
                if user_id in user_id_to_users_map:
                    user_id_to_users_map[user_id].stars += \
                        result.repository.stargazers_count
                else:
                    user_id_to_users_map[user_id] = User(
                        user_id, stars=result.repository.stargazers_count)
                if user_id in self.user_repos_map:
                    self.user_repos_map[user_id].append(repo)
                else:
                    self.user_repos_map[user_id] = [repo]
        except AttributeError:
            # github3.py sometimes throws the following during iteration:
            # AttributeError: 'NoneType' object has no attribute 'get'
            click.secho('count_stars caught AttributeError', fg='red')
        # The search_repositories call returns a maximum of 1000 elements
        return count == 1000