mirror of https://github.com/tiangolo/fastapi.git
♻️ Refactor computing FastAPI People, include 3 months, 6 months, 1 year, based on comment date, not discussion date (#11304)
This commit is contained in:
parent
7fa85d5ebd
commit
f0becc4452
|
|
@ -58,38 +58,6 @@ query Q($after: String, $category_id: ID) {
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
issues_query = """
|
|
||||||
query Q($after: String) {
|
|
||||||
repository(name: "fastapi", owner: "tiangolo") {
|
|
||||||
issues(first: 100, after: $after) {
|
|
||||||
edges {
|
|
||||||
cursor
|
|
||||||
node {
|
|
||||||
number
|
|
||||||
author {
|
|
||||||
login
|
|
||||||
avatarUrl
|
|
||||||
url
|
|
||||||
}
|
|
||||||
title
|
|
||||||
createdAt
|
|
||||||
state
|
|
||||||
comments(first: 100) {
|
|
||||||
nodes {
|
|
||||||
createdAt
|
|
||||||
author {
|
|
||||||
login
|
|
||||||
avatarUrl
|
|
||||||
url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
|
|
||||||
prs_query = """
|
prs_query = """
|
||||||
query Q($after: String) {
|
query Q($after: String) {
|
||||||
|
|
@ -176,7 +144,7 @@ class Author(BaseModel):
|
||||||
url: str
|
url: str
|
||||||
|
|
||||||
|
|
||||||
# Issues and Discussions
|
# Discussions
|
||||||
|
|
||||||
|
|
||||||
class CommentsNode(BaseModel):
|
class CommentsNode(BaseModel):
|
||||||
|
|
@ -200,15 +168,6 @@ class DiscussionsComments(BaseModel):
|
||||||
nodes: List[DiscussionsCommentsNode]
|
nodes: List[DiscussionsCommentsNode]
|
||||||
|
|
||||||
|
|
||||||
class IssuesNode(BaseModel):
|
|
||||||
number: int
|
|
||||||
author: Union[Author, None] = None
|
|
||||||
title: str
|
|
||||||
createdAt: datetime
|
|
||||||
state: str
|
|
||||||
comments: Comments
|
|
||||||
|
|
||||||
|
|
||||||
class DiscussionsNode(BaseModel):
|
class DiscussionsNode(BaseModel):
|
||||||
number: int
|
number: int
|
||||||
author: Union[Author, None] = None
|
author: Union[Author, None] = None
|
||||||
|
|
@ -217,44 +176,23 @@ class DiscussionsNode(BaseModel):
|
||||||
comments: DiscussionsComments
|
comments: DiscussionsComments
|
||||||
|
|
||||||
|
|
||||||
class IssuesEdge(BaseModel):
|
|
||||||
cursor: str
|
|
||||||
node: IssuesNode
|
|
||||||
|
|
||||||
|
|
||||||
class DiscussionsEdge(BaseModel):
|
class DiscussionsEdge(BaseModel):
|
||||||
cursor: str
|
cursor: str
|
||||||
node: DiscussionsNode
|
node: DiscussionsNode
|
||||||
|
|
||||||
|
|
||||||
class Issues(BaseModel):
|
|
||||||
edges: List[IssuesEdge]
|
|
||||||
|
|
||||||
|
|
||||||
class Discussions(BaseModel):
|
class Discussions(BaseModel):
|
||||||
edges: List[DiscussionsEdge]
|
edges: List[DiscussionsEdge]
|
||||||
|
|
||||||
|
|
||||||
class IssuesRepository(BaseModel):
|
|
||||||
issues: Issues
|
|
||||||
|
|
||||||
|
|
||||||
class DiscussionsRepository(BaseModel):
|
class DiscussionsRepository(BaseModel):
|
||||||
discussions: Discussions
|
discussions: Discussions
|
||||||
|
|
||||||
|
|
||||||
class IssuesResponseData(BaseModel):
|
|
||||||
repository: IssuesRepository
|
|
||||||
|
|
||||||
|
|
||||||
class DiscussionsResponseData(BaseModel):
|
class DiscussionsResponseData(BaseModel):
|
||||||
repository: DiscussionsRepository
|
repository: DiscussionsRepository
|
||||||
|
|
||||||
|
|
||||||
class IssuesResponse(BaseModel):
|
|
||||||
data: IssuesResponseData
|
|
||||||
|
|
||||||
|
|
||||||
class DiscussionsResponse(BaseModel):
|
class DiscussionsResponse(BaseModel):
|
||||||
data: DiscussionsResponseData
|
data: DiscussionsResponseData
|
||||||
|
|
||||||
|
|
@ -389,12 +327,6 @@ def get_graphql_response(
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def get_graphql_issue_edges(*, settings: Settings, after: Union[str, None] = None):
|
|
||||||
data = get_graphql_response(settings=settings, query=issues_query, after=after)
|
|
||||||
graphql_response = IssuesResponse.model_validate(data)
|
|
||||||
return graphql_response.data.repository.issues.edges
|
|
||||||
|
|
||||||
|
|
||||||
def get_graphql_question_discussion_edges(
|
def get_graphql_question_discussion_edges(
|
||||||
*,
|
*,
|
||||||
settings: Settings,
|
settings: Settings,
|
||||||
|
|
@ -422,43 +354,16 @@ def get_graphql_sponsor_edges(*, settings: Settings, after: Union[str, None] = N
|
||||||
return graphql_response.data.user.sponsorshipsAsMaintainer.edges
|
return graphql_response.data.user.sponsorshipsAsMaintainer.edges
|
||||||
|
|
||||||
|
|
||||||
def get_issues_experts(settings: Settings):
|
class DiscussionExpertsResults(BaseModel):
|
||||||
issue_nodes: List[IssuesNode] = []
|
commenters: Counter
|
||||||
issue_edges = get_graphql_issue_edges(settings=settings)
|
last_month_commenters: Counter
|
||||||
|
three_months_commenters: Counter
|
||||||
while issue_edges:
|
six_months_commenters: Counter
|
||||||
for edge in issue_edges:
|
one_year_commenters: Counter
|
||||||
issue_nodes.append(edge.node)
|
authors: Dict[str, Author]
|
||||||
last_edge = issue_edges[-1]
|
|
||||||
issue_edges = get_graphql_issue_edges(settings=settings, after=last_edge.cursor)
|
|
||||||
|
|
||||||
commentors = Counter()
|
|
||||||
last_month_commentors = Counter()
|
|
||||||
authors: Dict[str, Author] = {}
|
|
||||||
|
|
||||||
now = datetime.now(tz=timezone.utc)
|
|
||||||
one_month_ago = now - timedelta(days=30)
|
|
||||||
|
|
||||||
for issue in issue_nodes:
|
|
||||||
issue_author_name = None
|
|
||||||
if issue.author:
|
|
||||||
authors[issue.author.login] = issue.author
|
|
||||||
issue_author_name = issue.author.login
|
|
||||||
issue_commentors = set()
|
|
||||||
for comment in issue.comments.nodes:
|
|
||||||
if comment.author:
|
|
||||||
authors[comment.author.login] = comment.author
|
|
||||||
if comment.author.login != issue_author_name:
|
|
||||||
issue_commentors.add(comment.author.login)
|
|
||||||
for author_name in issue_commentors:
|
|
||||||
commentors[author_name] += 1
|
|
||||||
if issue.createdAt > one_month_ago:
|
|
||||||
last_month_commentors[author_name] += 1
|
|
||||||
|
|
||||||
return commentors, last_month_commentors, authors
|
|
||||||
|
|
||||||
|
|
||||||
def get_discussions_experts(settings: Settings):
|
def get_discussion_nodes(settings: Settings) -> List[DiscussionsNode]:
|
||||||
discussion_nodes: List[DiscussionsNode] = []
|
discussion_nodes: List[DiscussionsNode] = []
|
||||||
discussion_edges = get_graphql_question_discussion_edges(settings=settings)
|
discussion_edges = get_graphql_question_discussion_edges(settings=settings)
|
||||||
|
|
||||||
|
|
@ -469,61 +374,73 @@ def get_discussions_experts(settings: Settings):
|
||||||
discussion_edges = get_graphql_question_discussion_edges(
|
discussion_edges = get_graphql_question_discussion_edges(
|
||||||
settings=settings, after=last_edge.cursor
|
settings=settings, after=last_edge.cursor
|
||||||
)
|
)
|
||||||
|
return discussion_nodes
|
||||||
|
|
||||||
commentors = Counter()
|
|
||||||
last_month_commentors = Counter()
|
def get_discussions_experts(
|
||||||
|
discussion_nodes: List[DiscussionsNode]
|
||||||
|
) -> DiscussionExpertsResults:
|
||||||
|
commenters = Counter()
|
||||||
|
last_month_commenters = Counter()
|
||||||
|
three_months_commenters = Counter()
|
||||||
|
six_months_commenters = Counter()
|
||||||
|
one_year_commenters = Counter()
|
||||||
authors: Dict[str, Author] = {}
|
authors: Dict[str, Author] = {}
|
||||||
|
|
||||||
now = datetime.now(tz=timezone.utc)
|
now = datetime.now(tz=timezone.utc)
|
||||||
one_month_ago = now - timedelta(days=30)
|
one_month_ago = now - timedelta(days=30)
|
||||||
|
three_months_ago = now - timedelta(days=90)
|
||||||
|
six_months_ago = now - timedelta(days=180)
|
||||||
|
one_year_ago = now - timedelta(days=365)
|
||||||
|
|
||||||
for discussion in discussion_nodes:
|
for discussion in discussion_nodes:
|
||||||
discussion_author_name = None
|
discussion_author_name = None
|
||||||
if discussion.author:
|
if discussion.author:
|
||||||
authors[discussion.author.login] = discussion.author
|
authors[discussion.author.login] = discussion.author
|
||||||
discussion_author_name = discussion.author.login
|
discussion_author_name = discussion.author.login
|
||||||
discussion_commentors = set()
|
discussion_commentors: dict[str, datetime] = {}
|
||||||
for comment in discussion.comments.nodes:
|
for comment in discussion.comments.nodes:
|
||||||
if comment.author:
|
if comment.author:
|
||||||
authors[comment.author.login] = comment.author
|
authors[comment.author.login] = comment.author
|
||||||
if comment.author.login != discussion_author_name:
|
if comment.author.login != discussion_author_name:
|
||||||
discussion_commentors.add(comment.author.login)
|
author_time = discussion_commentors.get(
|
||||||
|
comment.author.login, comment.createdAt
|
||||||
|
)
|
||||||
|
discussion_commentors[comment.author.login] = max(
|
||||||
|
author_time, comment.createdAt
|
||||||
|
)
|
||||||
for reply in comment.replies.nodes:
|
for reply in comment.replies.nodes:
|
||||||
if reply.author:
|
if reply.author:
|
||||||
authors[reply.author.login] = reply.author
|
authors[reply.author.login] = reply.author
|
||||||
if reply.author.login != discussion_author_name:
|
if reply.author.login != discussion_author_name:
|
||||||
discussion_commentors.add(reply.author.login)
|
author_time = discussion_commentors.get(
|
||||||
for author_name in discussion_commentors:
|
reply.author.login, reply.createdAt
|
||||||
commentors[author_name] += 1
|
)
|
||||||
if discussion.createdAt > one_month_ago:
|
discussion_commentors[reply.author.login] = max(
|
||||||
last_month_commentors[author_name] += 1
|
author_time, reply.createdAt
|
||||||
return commentors, last_month_commentors, authors
|
)
|
||||||
|
for author_name, author_time in discussion_commentors.items():
|
||||||
|
commenters[author_name] += 1
|
||||||
|
if author_time > one_month_ago:
|
||||||
|
last_month_commenters[author_name] += 1
|
||||||
|
if author_time > three_months_ago:
|
||||||
|
three_months_commenters[author_name] += 1
|
||||||
|
if author_time > six_months_ago:
|
||||||
|
six_months_commenters[author_name] += 1
|
||||||
|
if author_time > one_year_ago:
|
||||||
|
one_year_commenters[author_name] += 1
|
||||||
|
discussion_experts_results = DiscussionExpertsResults(
|
||||||
|
authors=authors,
|
||||||
|
commenters=commenters,
|
||||||
|
last_month_commenters=last_month_commenters,
|
||||||
|
three_months_commenters=three_months_commenters,
|
||||||
|
six_months_commenters=six_months_commenters,
|
||||||
|
one_year_commenters=one_year_commenters,
|
||||||
|
)
|
||||||
|
return discussion_experts_results
|
||||||
|
|
||||||
|
|
||||||
def get_experts(settings: Settings):
|
def get_pr_nodes(settings: Settings) -> List[PullRequestNode]:
|
||||||
# Migrated to only use GitHub Discussions
|
|
||||||
# (
|
|
||||||
# issues_commentors,
|
|
||||||
# issues_last_month_commentors,
|
|
||||||
# issues_authors,
|
|
||||||
# ) = get_issues_experts(settings=settings)
|
|
||||||
(
|
|
||||||
discussions_commentors,
|
|
||||||
discussions_last_month_commentors,
|
|
||||||
discussions_authors,
|
|
||||||
) = get_discussions_experts(settings=settings)
|
|
||||||
# commentors = issues_commentors + discussions_commentors
|
|
||||||
commentors = discussions_commentors
|
|
||||||
# last_month_commentors = (
|
|
||||||
# issues_last_month_commentors + discussions_last_month_commentors
|
|
||||||
# )
|
|
||||||
last_month_commentors = discussions_last_month_commentors
|
|
||||||
# authors = {**issues_authors, **discussions_authors}
|
|
||||||
authors = {**discussions_authors}
|
|
||||||
return commentors, last_month_commentors, authors
|
|
||||||
|
|
||||||
|
|
||||||
def get_contributors(settings: Settings):
|
|
||||||
pr_nodes: List[PullRequestNode] = []
|
pr_nodes: List[PullRequestNode] = []
|
||||||
pr_edges = get_graphql_pr_edges(settings=settings)
|
pr_edges = get_graphql_pr_edges(settings=settings)
|
||||||
|
|
||||||
|
|
@ -532,10 +449,22 @@ def get_contributors(settings: Settings):
|
||||||
pr_nodes.append(edge.node)
|
pr_nodes.append(edge.node)
|
||||||
last_edge = pr_edges[-1]
|
last_edge = pr_edges[-1]
|
||||||
pr_edges = get_graphql_pr_edges(settings=settings, after=last_edge.cursor)
|
pr_edges = get_graphql_pr_edges(settings=settings, after=last_edge.cursor)
|
||||||
|
return pr_nodes
|
||||||
|
|
||||||
|
|
||||||
|
class ContributorsResults(BaseModel):
|
||||||
|
contributors: Counter
|
||||||
|
commenters: Counter
|
||||||
|
reviewers: Counter
|
||||||
|
translation_reviewers: Counter
|
||||||
|
authors: Dict[str, Author]
|
||||||
|
|
||||||
|
|
||||||
|
def get_contributors(pr_nodes: List[PullRequestNode]) -> ContributorsResults:
|
||||||
contributors = Counter()
|
contributors = Counter()
|
||||||
commentors = Counter()
|
commenters = Counter()
|
||||||
reviewers = Counter()
|
reviewers = Counter()
|
||||||
|
translation_reviewers = Counter()
|
||||||
authors: Dict[str, Author] = {}
|
authors: Dict[str, Author] = {}
|
||||||
|
|
||||||
for pr in pr_nodes:
|
for pr in pr_nodes:
|
||||||
|
|
@ -552,16 +481,26 @@ def get_contributors(settings: Settings):
|
||||||
continue
|
continue
|
||||||
pr_commentors.add(comment.author.login)
|
pr_commentors.add(comment.author.login)
|
||||||
for author_name in pr_commentors:
|
for author_name in pr_commentors:
|
||||||
commentors[author_name] += 1
|
commenters[author_name] += 1
|
||||||
for review in pr.reviews.nodes:
|
for review in pr.reviews.nodes:
|
||||||
if review.author:
|
if review.author:
|
||||||
authors[review.author.login] = review.author
|
authors[review.author.login] = review.author
|
||||||
pr_reviewers.add(review.author.login)
|
pr_reviewers.add(review.author.login)
|
||||||
|
for label in pr.labels.nodes:
|
||||||
|
if label.name == "lang-all":
|
||||||
|
translation_reviewers[review.author.login] += 1
|
||||||
|
break
|
||||||
for reviewer in pr_reviewers:
|
for reviewer in pr_reviewers:
|
||||||
reviewers[reviewer] += 1
|
reviewers[reviewer] += 1
|
||||||
if pr.state == "MERGED" and pr.author:
|
if pr.state == "MERGED" and pr.author:
|
||||||
contributors[pr.author.login] += 1
|
contributors[pr.author.login] += 1
|
||||||
return contributors, commentors, reviewers, authors
|
return ContributorsResults(
|
||||||
|
contributors=contributors,
|
||||||
|
commenters=commenters,
|
||||||
|
reviewers=reviewers,
|
||||||
|
translation_reviewers=translation_reviewers,
|
||||||
|
authors=authors,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_individual_sponsors(settings: Settings):
|
def get_individual_sponsors(settings: Settings):
|
||||||
|
|
@ -585,19 +524,19 @@ def get_individual_sponsors(settings: Settings):
|
||||||
def get_top_users(
|
def get_top_users(
|
||||||
*,
|
*,
|
||||||
counter: Counter,
|
counter: Counter,
|
||||||
min_count: int,
|
|
||||||
authors: Dict[str, Author],
|
authors: Dict[str, Author],
|
||||||
skip_users: Container[str],
|
skip_users: Container[str],
|
||||||
|
min_count: int = 2,
|
||||||
):
|
):
|
||||||
users = []
|
users = []
|
||||||
for commentor, count in counter.most_common(50):
|
for commenter, count in counter.most_common(50):
|
||||||
if commentor in skip_users:
|
if commenter in skip_users:
|
||||||
continue
|
continue
|
||||||
if count >= min_count:
|
if count >= min_count:
|
||||||
author = authors[commentor]
|
author = authors[commenter]
|
||||||
users.append(
|
users.append(
|
||||||
{
|
{
|
||||||
"login": commentor,
|
"login": commenter,
|
||||||
"count": count,
|
"count": count,
|
||||||
"avatarUrl": author.avatarUrl,
|
"avatarUrl": author.avatarUrl,
|
||||||
"url": author.url,
|
"url": author.url,
|
||||||
|
|
@ -612,13 +551,11 @@ if __name__ == "__main__":
|
||||||
logging.info(f"Using config: {settings.model_dump_json()}")
|
logging.info(f"Using config: {settings.model_dump_json()}")
|
||||||
g = Github(settings.input_token.get_secret_value())
|
g = Github(settings.input_token.get_secret_value())
|
||||||
repo = g.get_repo(settings.github_repository)
|
repo = g.get_repo(settings.github_repository)
|
||||||
question_commentors, question_last_month_commentors, question_authors = get_experts(
|
discussion_nodes = get_discussion_nodes(settings=settings)
|
||||||
settings=settings
|
experts_results = get_discussions_experts(discussion_nodes=discussion_nodes)
|
||||||
)
|
pr_nodes = get_pr_nodes(settings=settings)
|
||||||
contributors, pr_commentors, reviewers, pr_authors = get_contributors(
|
contributors_results = get_contributors(pr_nodes=pr_nodes)
|
||||||
settings=settings
|
authors = {**experts_results.authors, **contributors_results.authors}
|
||||||
)
|
|
||||||
authors = {**question_authors, **pr_authors}
|
|
||||||
maintainers_logins = {"tiangolo"}
|
maintainers_logins = {"tiangolo"}
|
||||||
bot_names = {"codecov", "github-actions", "pre-commit-ci", "dependabot"}
|
bot_names = {"codecov", "github-actions", "pre-commit-ci", "dependabot"}
|
||||||
maintainers = []
|
maintainers = []
|
||||||
|
|
@ -627,39 +564,51 @@ if __name__ == "__main__":
|
||||||
maintainers.append(
|
maintainers.append(
|
||||||
{
|
{
|
||||||
"login": login,
|
"login": login,
|
||||||
"answers": question_commentors[login],
|
"answers": experts_results.commenters[login],
|
||||||
"prs": contributors[login],
|
"prs": contributors_results.contributors[login],
|
||||||
"avatarUrl": user.avatarUrl,
|
"avatarUrl": user.avatarUrl,
|
||||||
"url": user.url,
|
"url": user.url,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
min_count_expert = 10
|
|
||||||
min_count_last_month = 3
|
|
||||||
min_count_contributor = 4
|
|
||||||
min_count_reviewer = 4
|
|
||||||
skip_users = maintainers_logins | bot_names
|
skip_users = maintainers_logins | bot_names
|
||||||
experts = get_top_users(
|
experts = get_top_users(
|
||||||
counter=question_commentors,
|
counter=experts_results.commenters,
|
||||||
min_count=min_count_expert,
|
|
||||||
authors=authors,
|
authors=authors,
|
||||||
skip_users=skip_users,
|
skip_users=skip_users,
|
||||||
)
|
)
|
||||||
last_month_active = get_top_users(
|
last_month_experts = get_top_users(
|
||||||
counter=question_last_month_commentors,
|
counter=experts_results.last_month_commenters,
|
||||||
min_count=min_count_last_month,
|
authors=authors,
|
||||||
|
skip_users=skip_users,
|
||||||
|
)
|
||||||
|
three_months_experts = get_top_users(
|
||||||
|
counter=experts_results.three_months_commenters,
|
||||||
|
authors=authors,
|
||||||
|
skip_users=skip_users,
|
||||||
|
)
|
||||||
|
six_months_experts = get_top_users(
|
||||||
|
counter=experts_results.six_months_commenters,
|
||||||
|
authors=authors,
|
||||||
|
skip_users=skip_users,
|
||||||
|
)
|
||||||
|
one_year_experts = get_top_users(
|
||||||
|
counter=experts_results.one_year_commenters,
|
||||||
authors=authors,
|
authors=authors,
|
||||||
skip_users=skip_users,
|
skip_users=skip_users,
|
||||||
)
|
)
|
||||||
top_contributors = get_top_users(
|
top_contributors = get_top_users(
|
||||||
counter=contributors,
|
counter=contributors_results.contributors,
|
||||||
min_count=min_count_contributor,
|
|
||||||
authors=authors,
|
authors=authors,
|
||||||
skip_users=skip_users,
|
skip_users=skip_users,
|
||||||
)
|
)
|
||||||
top_reviewers = get_top_users(
|
top_reviewers = get_top_users(
|
||||||
counter=reviewers,
|
counter=contributors_results.reviewers,
|
||||||
min_count=min_count_reviewer,
|
authors=authors,
|
||||||
|
skip_users=skip_users,
|
||||||
|
)
|
||||||
|
top_translations_reviewers = get_top_users(
|
||||||
|
counter=contributors_results.translation_reviewers,
|
||||||
authors=authors,
|
authors=authors,
|
||||||
skip_users=skip_users,
|
skip_users=skip_users,
|
||||||
)
|
)
|
||||||
|
|
@ -679,13 +628,19 @@ if __name__ == "__main__":
|
||||||
people = {
|
people = {
|
||||||
"maintainers": maintainers,
|
"maintainers": maintainers,
|
||||||
"experts": experts,
|
"experts": experts,
|
||||||
"last_month_active": last_month_active,
|
"last_month_experts": last_month_experts,
|
||||||
|
"three_months_experts": three_months_experts,
|
||||||
|
"six_months_experts": six_months_experts,
|
||||||
|
"one_year_experts": one_year_experts,
|
||||||
"top_contributors": top_contributors,
|
"top_contributors": top_contributors,
|
||||||
"top_reviewers": top_reviewers,
|
"top_reviewers": top_reviewers,
|
||||||
|
"top_translations_reviewers": top_translations_reviewers,
|
||||||
}
|
}
|
||||||
github_sponsors = {
|
github_sponsors = {
|
||||||
"sponsors": sponsors,
|
"sponsors": sponsors,
|
||||||
}
|
}
|
||||||
|
# For local development
|
||||||
|
# people_path = Path("../../../../docs/en/data/people.yml")
|
||||||
people_path = Path("./docs/en/data/people.yml")
|
people_path = Path("./docs/en/data/people.yml")
|
||||||
github_sponsors_path = Path("./docs/en/data/github_sponsors.yml")
|
github_sponsors_path = Path("./docs/en/data/github_sponsors.yml")
|
||||||
people_old_content = people_path.read_text(encoding="utf-8")
|
people_old_content = people_path.read_text(encoding="utf-8")
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ Bu istifadəçilər keçən ay [GitHub-da başqalarının suallarına](help-fast
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -65,7 +65,7 @@ Onlar bir çox insanlara kömək edərək mütəxəssis olduqlarını sübut edi
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -83,7 +83,7 @@ Onlar mənbə kodu, sənədləmə, tərcümələr və s. barədə əmək göstə
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request-lər: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request-lər: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -107,7 +107,7 @@ Başqalarının Pull Request-lərinə **Ən çox rəy verənlər** 🕵️ kodun
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Rəylər: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Rəylər: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ FastAPI ✔️ 🎆 👪 👈 🙋 👫👫 ⚪️➡️ 🌐 🖥.
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">❔ 📨: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">❔ 📨: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -58,7 +58,7 @@ FastAPI ✔️ 🎆 👪 👈 🙋 👫👫 ⚪️➡️ 🌐 🖥.
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">❔ 📨: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">❔ 📨: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -76,7 +76,7 @@ FastAPI ✔️ 🎆 👪 👈 🙋 👫👫 ⚪️➡️ 🌐 🖥.
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">🚲 📨: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">🚲 📨: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -100,7 +100,7 @@ FastAPI ✔️ 🎆 👪 👈 🙋 👫👫 ⚪️➡️ 🌐 🖥.
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">📄: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">📄: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -7,7 +7,7 @@ hide:
|
||||||
|
|
||||||
FastAPI has an amazing community that welcomes people from all backgrounds.
|
FastAPI has an amazing community that welcomes people from all backgrounds.
|
||||||
|
|
||||||
## Creator - Maintainer
|
## Creator
|
||||||
|
|
||||||
Hey! 👋
|
Hey! 👋
|
||||||
|
|
||||||
|
|
@ -23,7 +23,7 @@ This is me:
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
I'm the creator and maintainer of **FastAPI**. You can read more about that in [Help FastAPI - Get Help - Connect with the author](help-fastapi.md#connect-with-the-author){.internal-link target=_blank}.
|
I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Get Help - Connect with the author](help-fastapi.md#connect-with-the-author){.internal-link target=_blank}.
|
||||||
|
|
||||||
...But here I want to show you the community.
|
...But here I want to show you the community.
|
||||||
|
|
||||||
|
|
@ -39,13 +39,32 @@ These are the people that:
|
||||||
|
|
||||||
A round of applause to them. 👏 🙇
|
A round of applause to them. 👏 🙇
|
||||||
|
|
||||||
## Most active users last month
|
## FastAPI Experts
|
||||||
|
|
||||||
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last month. ☕
|
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. 🙇
|
||||||
|
|
||||||
|
They have proven to be **FastAPI Experts** by helping many others. ✨
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
You could become an official FastAPI Expert too!
|
||||||
|
|
||||||
|
Just [help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. 🤓
|
||||||
|
|
||||||
|
You can see the **FastAPI Experts** for:
|
||||||
|
|
||||||
|
* [Last Month](#fastapi-experts-last-month) 🤓
|
||||||
|
* [3 Months](#fastapi-experts-3-months) 😎
|
||||||
|
* [6 Months](#fastapi-experts-6-months) 🧐
|
||||||
|
* [1 Year](#fastapi-experts-1-year) 🧑🔬
|
||||||
|
* [**All Time**](#fastapi-experts-all-time) 🧙
|
||||||
|
|
||||||
|
### FastAPI Experts - Last Month
|
||||||
|
|
||||||
|
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last month. 🤓
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -53,17 +72,57 @@ These are the users that have been [helping others the most with questions in Gi
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
## Experts
|
### FastAPI Experts - 3 Months
|
||||||
|
|
||||||
Here are the **FastAPI Experts**. 🤓
|
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last 3 months. 😎
|
||||||
|
|
||||||
These are the users that have [helped others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} through *all time*.
|
|
||||||
|
|
||||||
They have proven to be experts by helping many others. ✨
|
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.three_months_experts[:10] %}
|
||||||
|
|
||||||
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
### FastAPI Experts - 6 Months
|
||||||
|
|
||||||
|
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last 6 months. 🧐
|
||||||
|
|
||||||
|
{% if people %}
|
||||||
|
<div class="user-list user-list-center">
|
||||||
|
{% for user in people.six_months_experts[:10] %}
|
||||||
|
|
||||||
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
### FastAPI Experts - 1 Year
|
||||||
|
|
||||||
|
These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last year. 🧑🔬
|
||||||
|
|
||||||
|
{% if people %}
|
||||||
|
<div class="user-list user-list-center">
|
||||||
|
{% for user in people.one_year_experts[:20] %}
|
||||||
|
|
||||||
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
### FastAPI Experts - All Time
|
||||||
|
|
||||||
|
Here are the all time **FastAPI Experts**. 🤓🤯
|
||||||
|
|
||||||
|
These are the users that have [helped others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} through *all time*. 🧙
|
||||||
|
|
||||||
|
{% if people %}
|
||||||
|
<div class="user-list user-list-center">
|
||||||
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -81,7 +140,7 @@ They have contributed source code, documentation, translations, etc. 📦
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -91,21 +150,15 @@ They have contributed source code, documentation, translations, etc. 📦
|
||||||
|
|
||||||
There are many other contributors (more than a hundred), you can see them all in the <a href="https://github.com/tiangolo/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Contributors page</a>. 👷
|
There are many other contributors (more than a hundred), you can see them all in the <a href="https://github.com/tiangolo/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Contributors page</a>. 👷
|
||||||
|
|
||||||
## Top Reviewers
|
## Top Translation Reviewers
|
||||||
|
|
||||||
These users are the **Top Reviewers**. 🕵️
|
These users are the **Top Translation Reviewers**. 🕵️
|
||||||
|
|
||||||
### Reviews for Translations
|
|
||||||
|
|
||||||
I only speak a few languages (and not very well 😅). So, the reviewers are the ones that have the [**power to approve translations**](contributing.md#translations){.internal-link target=_blank} of the documentation. Without them, there wouldn't be documentation in several other languages.
|
I only speak a few languages (and not very well 😅). So, the reviewers are the ones that have the [**power to approve translations**](contributing.md#translations){.internal-link target=_blank} of the documentation. Without them, there wouldn't be documentation in several other languages.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
The **Top Reviewers** 🕵️ have reviewed the most Pull Requests from others, ensuring the quality of the code, documentation, and especially, the **translations**.
|
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ Ce sont les utilisateurs qui ont [aidé le plus les autres avec des problèmes (
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions répondues: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions répondues: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -58,7 +58,7 @@ Ils ont prouvé qu'ils étaient des experts en aidant beaucoup d'autres personne
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions répondues: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Questions répondues: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -76,7 +76,7 @@ Ils ont contribué au code source, à la documentation, aux traductions, etc.
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -100,7 +100,7 @@ Les **Principaux Reviewers** 🕵️ ont examiné le plus grand nombre de demand
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ FastAPIには、様々なバックグラウンドの人々を歓迎する素晴
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -59,7 +59,7 @@ FastAPIには、様々なバックグラウンドの人々を歓迎する素晴
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -77,7 +77,7 @@ FastAPIには、様々なバックグラウンドの人々を歓迎する素晴
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -101,7 +101,7 @@ FastAPIには、様々なバックグラウンドの人々を歓迎する素晴
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ Estes são os usuários que estão [helping others the most with issues (questio
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues respondidas: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues respondidas: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -59,7 +59,7 @@ Eles provaram ser especialistas ajudando muitos outros. ✨
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues respondidas: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues respondidas: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -77,7 +77,7 @@ Eles contribuíram com o código-fonte, documentação, traduções, etc. 📦
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -101,7 +101,7 @@ Os **Top Revisores** 🕵️ revisaram a maior parte de Pull Requests de outros,
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Revisões: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Revisões: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -59,7 +59,7 @@
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -102,7 +102,7 @@
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ Geçtiğimiz ay boyunca [GitHub'da diğerlerine en çok yardımcı olan](help-fa
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cevaplanan soru sayısı: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cevaplanan soru sayısı: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -63,7 +63,7 @@ Bir çok kullanıcıya yardım ederek uzman olduklarını kanıtladılar! ✨
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cevaplanan soru sayısı: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cevaplanan soru sayısı: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -81,7 +81,7 @@ Kaynak koduna, dökümantasyona, çevirilere ve bir sürü şeye katkıda bulund
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request sayısı: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request sayısı: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -105,7 +105,7 @@ Yalnızca birkaç dil konuşabiliyorum (ve çok da iyi değilim 😅). Bu yüzde
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Değerlendirme sayısı: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Değerlendirme sayısı: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ FastAPI має дивовижну спільноту, яка вітає люде
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -58,7 +58,7 @@ FastAPI має дивовижну спільноту, яка вітає люде
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -76,7 +76,7 @@ FastAPI має дивовижну спільноту, яка вітає люде
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -100,7 +100,7 @@ FastAPI має дивовижну спільноту, яка вітає люде
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ FastAPI 有一个非常棒的社区,它欢迎来自各个领域和背景的朋
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.last_month_active %}
|
{% for user in people.last_month_experts[:10] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -58,7 +58,7 @@ FastAPI 有一个非常棒的社区,它欢迎来自各个领域和背景的朋
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.experts %}
|
{% for user in people.experts[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Issues replied: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -76,7 +76,7 @@ FastAPI 有一个非常棒的社区,它欢迎来自各个领域和背景的朋
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_contributors %}
|
{% for user in people.top_contributors[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
@ -100,7 +100,7 @@ FastAPI 有一个非常棒的社区,它欢迎来自各个领域和背景的朋
|
||||||
|
|
||||||
{% if people %}
|
{% if people %}
|
||||||
<div class="user-list user-list-center">
|
<div class="user-list user-list-center">
|
||||||
{% for user in people.top_reviewers %}
|
{% for user in people.top_translations_reviewers[:50] %}
|
||||||
|
|
||||||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue