Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 30 additions & 24 deletions starred/githubgql.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}
}
Expand All @@ -45,14 +48,15 @@


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
self.url = url
self.stargazer_count = stargazer_count
self.is_private = is_private
self.topics = topics
self.starred_at = starred_at


class GitHubGQL:
Expand All @@ -71,15 +75,17 @@ 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 ''
url = repo['url']
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))
Expand Down
15 changes: 9 additions & 6 deletions starred/starred.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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)
Expand Down Expand Up @@ -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()))
Expand All @@ -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('')

Expand Down