Skip to content

Commit 6b99d22

Browse files
authored
Add CODEOWNERS file in cookiecutter (frequenz-floss#49)
We'll have more filters that need this. - Add a function to get a key from the JSON file - Emphasize that TODOs need to be FIXED - Add CODEOWNERS file Fix frequenz-floss#2.
2 parents 16d1fb9 + e47f27e commit 6b99d22

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

cookiecutter/cookiecutter.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
"python_package": "{{cookiecutter | python_package}}",
2020
"pypi_package_name": "{{cookiecutter | pypi_package_name}}",
2121
"github_repo_name": "{{cookiecutter | github_repo_name}}",
22+
"default_codeowners": "(like @some-org/some-team; defaults to a team based on the repo type)",
2223
"_extensions": [
2324
"jinja2_time.TimeExtension",
25+
"local_extensions.default_codeowners",
2426
"local_extensions.github_repo_name",
2527
"local_extensions.keywords",
2628
"local_extensions.pypi_package_name",

cookiecutter/hooks/post_gen_project.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def main() -> None:
4747
success(f"Your 🍪 {cookiecutter.github_repo_name} has been cut!")
4848
print()
4949
print_generated_tree()
50-
print("Here is a list of things that should be reviewed and fixed:")
50+
print("Here is a list of things that should be reviewed and FIXED:")
5151
print_todos()
5252
print()
5353
print(

cookiecutter/local_extensions.py

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ def _build_identifier(repo_type: str, name: str, separator: str) -> str:
2727
return f"frequenz{separator}{middle}{name}"
2828

2929

30+
def _get_from_json(key: str) -> str:
31+
"""Get a string from the cookiecutter.json file.
32+
33+
Args:
34+
key: The key to get the string for.
35+
36+
Returns:
37+
The string from the cookiecutter.json file.
38+
"""
39+
with open("../cookiecutter.json", encoding="utf8") as cookiecutter_json_file:
40+
return _json.load(cookiecutter_json_file)[key]
41+
42+
3043
# Ignoring because cookiecutter simple_filter decorator is not typed.
3144
@_simple_filter # type: ignore[misc]
3245
def python_package(cookiecutter: dict[str, str]) -> str:
@@ -80,14 +93,55 @@ def keywords(cookiecutter: dict[str, str]) -> str:
8093
The extended keywords.
8194
"""
8295
repo_type = cookiecutter["type"]
83-
extended_keywords = ["frequenz", repo_type]
96+
extended_keywords = ["frequenz", "python", repo_type]
8497
if repo_type == "api":
85-
extended_keywords.append("grpc")
98+
extended_keywords.extend(["grpc", "protobuf", "rpc"])
8699
extended_keywords.append(cookiecutter["name"])
87-
with open("../cookiecutter.json", encoding="utf8") as cookiecutter_json_file:
88-
no_input = _json.load(cookiecutter_json_file)["keywords"]
100+
default = _get_from_json("keywords")
89101
cookiecutter_keywords = cookiecutter["keywords"]
90-
if cookiecutter_keywords == no_input:
102+
if cookiecutter_keywords == default:
91103
cookiecutter_keywords = ""
92104
extended_keywords.extend(k.strip() for k in cookiecutter_keywords.split(","))
93105
return _json.dumps(extended_keywords)
106+
107+
108+
@_simple_filter # type: ignore[misc]
109+
def default_codeowners(cookiecutter: dict[str, str]) -> str:
110+
"""Build a default description for the project.
111+
112+
Args:
113+
cookiecutter: The cookiecutter context.
114+
115+
Returns:
116+
The default description.
117+
"""
118+
repo_type = cookiecutter["type"]
119+
120+
codeowners = cookiecutter["default_codeowners"]
121+
default = _get_from_json("default_codeowners")
122+
if codeowners != default:
123+
return codeowners
124+
125+
github_org = _get_from_json("github_org")
126+
if github_org != "frequenz-floss":
127+
return f"TODO(cookiecutter): Add codeowners (like @{github_org}/some-team)"
128+
129+
match repo_type:
130+
case "actor":
131+
return (
132+
"TODO(cookiecutter): Add codeowners (like @{github_org}/some-team)"
133+
"# Temporary, should probably change"
134+
)
135+
case "api":
136+
return "@freqenz-floss/api-team"
137+
case "lib":
138+
return "@freqenz-floss/python-sdk-team"
139+
case "app":
140+
return (
141+
"@freqenz-floss/python-sdk-team @frequenz-floss/datasci-team "
142+
"# Temporary, should probably change"
143+
)
144+
case "model":
145+
return "@freqenz-floss/datasci-team"
146+
case _:
147+
assert False, f"Unhandled repository type {repo_type!r}"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Each line is a file pattern followed by one or more owners.
2+
# Owners will be requested for review when someone opens a pull request.
3+
4+
# Fallback owner.
5+
# These are the default owners for everything in the repo, unless a later match
6+
# takes precedence.
7+
# TODO(cookiecutter): Add more specific code-owners, check if the default is correct
8+
* {{ cookiecutter | default_codeowners }}

0 commit comments

Comments
 (0)