diff --git a/starred/githubgql.py b/starred/githubgql.py index b301917..b5160ca 100644 --- a/starred/githubgql.py +++ b/starred/githubgql.py @@ -6,29 +6,32 @@ user(login: $username) { starredRepositories(first: 100, after: $after, orderBy: {direction: DESC, field: STARRED_AT}) { totalCount - nodes { - name - nameWithOwner - description - url - stargazerCount - forkCount - isPrivate - pushedAt - updatedAt - languages(first: 1, orderBy: {field: SIZE, direction: DESC}) { - edges { - node { - id - name + edges { + starredAt + node { + name + nameWithOwner + description + url + stargazerCount + forkCount + isPrivate + pushedAt + updatedAt + languages(first: 1, orderBy: {field: SIZE, direction: DESC}) { + edges { + node { + id + name + } } } - } - repositoryTopics(first: 100) { - nodes { - topic { - name - stargazerCount + repositoryTopics(first: 100) { + nodes { + topic { + name + stargazerCount + } } } } @@ -45,7 +48,7 @@ class Repository: - def __init__(self, name, description, language, url, stargazer_count, is_private, topics): + def __init__(self, name, description, language, url, stargazer_count, is_private, topics, starred_at): self.name = name self.description = description self.language = language @@ -53,6 +56,7 @@ def __init__(self, name, description, language, url, stargazer_count, is_private self.stargazer_count = stargazer_count self.is_private = is_private self.topics = topics + self.starred_at = starred_at class GitHubGQL: @@ -71,7 +75,9 @@ def get_user_starred_by_username(self, username: str, after: str = '', topic_sta has_next = result['user']['starredRepositories']['pageInfo']['hasNextPage'] end_cursor = result['user']['starredRepositories']['pageInfo']['endCursor'] # total_count = result['user']['starredRepositories']['totalCount'] - for repo in result['user']['starredRepositories']['nodes']: + for edge in result['user']['starredRepositories']['edges']: + repo = edge['node'] + starred_at = edge['starredAt'] name = repo['nameWithOwner'] description = repo['description'] if repo['description'] else '' language = repo['languages']['edges'][0]['node']['name'] if repo['languages']['edges'] else '' @@ -79,7 +85,7 @@ def get_user_starred_by_username(self, username: str, after: str = '', topic_sta stargazer_count = repo['stargazerCount'] is_private = repo['isPrivate'] topics = [tag['topic']['name'] for tag in repo['repositoryTopics']['nodes'] if tag['topic']['stargazerCount'] > topic_stargazer_count_limit] - items.append(Repository(name, description, language, url, stargazer_count, is_private, topics)) + items.append(Repository(name, description, language, url, stargazer_count, is_private, topics, starred_at)) if has_next: items.extend(self.get_user_starred_by_username(username, end_cursor, topic_stargazer_count_limit)) diff --git a/starred/starred.py b/starred/starred.py index 56adc99..71e32f8 100644 --- a/starred/starred.py +++ b/starred/starred.py @@ -46,7 +46,7 @@ def html_escape(text): @click.command() @click.option('--username', envvar='USER', required=True, help='GitHub username') @click.option('--token', envvar='GITHUB_TOKEN', required=True, help='GitHub token') -@click.option('--sort', is_flag=True, show_default=True, help='sort by category[language/topic] name alphabetically') +@click.option('--sort', type=click.Choice(['alphabetical', 'time']), help='sort repos: "alphabetical" sorts categories by name, "time" sorts repos within each category by star time (newest first)') @click.option('--topic', is_flag=True, show_default=True, help='category by topic, default is category by language') @click.option('--topic_limit', default=500, show_default=True, type=int, help='topic stargazer_count gt number, set bigger to reduce topics number') @click.option('--repository', default='', show_default=True, help='repository name') @@ -60,7 +60,7 @@ def starred(username, token, sort, topic, repository, filename, message, private creating your own Awesome List by GitHub stars! example: - starred --username maguowei --token=xxxxxxxx --sort > README.md + starred --username maguowei --token=xxxxxxxx --sort alphabetical > README.md """ gh = GitHubGQL(token) @@ -90,16 +90,19 @@ def starred(username, token, sort, topic, repository, filename, message, private for category in s.topics or [DEFAULT_CATEGORY.lower()]: if category not in repo_dict: repo_dict[category] = [] - repo_dict[category].append([s.name, s.url, description]) + repo_dict[category].append([s.name, s.url, description, s.starred_at]) else: category = s.language or DEFAULT_CATEGORY if category not in repo_dict: repo_dict[category] = [] - repo_dict[category].append([s.name, s.url, description]) + repo_dict[category].append([s.name, s.url, description, s.starred_at]) - if sort: + if sort == 'alphabetical': repo_dict = OrderedDict(sorted(repo_dict.items(), key=lambda cate: cate[0])) + elif sort == 'time': + for category in repo_dict: + repo_dict[category].sort(key=lambda repo: repo[3], reverse=True) for category in repo_dict.keys(): data = u'- [{}](#{})'.format(category, '-'.join(category.lower().split())) @@ -109,7 +112,7 @@ def starred(username, token, sort, topic, repository, filename, message, private for category in repo_dict: click.echo('## {} \n'.format(category.replace('#', '# #'))) for repo in repo_dict[category]: - data = u'- [{}]({}) - {}'.format(*repo) + data = u'- [{}]({}) - {}'.format(repo[0], repo[1], repo[2]) click.echo(data) click.echo('')