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
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
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