Change bin/projects.py to only write the first 10 projects to the readme
This commit is contained in:
+69
-28
@@ -5,7 +5,7 @@ Convert a yaml project list into a nice table.
|
||||
|
||||
Suggested usage:
|
||||
|
||||
./bin/projects.py docs/data/projects.yml --online --auth $GITHUB_API_TOKEN --readme README.md
|
||||
./bin/projects.py docs/data/projects.yml --online --auth $GITHUB_API_TOKEN
|
||||
git diff
|
||||
"""
|
||||
|
||||
@@ -139,28 +139,38 @@ def fetch_icon(icon_name: str) -> None:
|
||||
f.write(svgElement.toxml())
|
||||
|
||||
|
||||
def path_for_icon(icon_name: str) -> Path:
|
||||
return Path(".") / "docs" / "data" / "readme_icons" / f"{icon_name}.svg"
|
||||
def path_for_icon(icon_name: str, relative_to: Path | None = None) -> Path:
|
||||
if relative_to is None:
|
||||
from_path = Path.cwd()
|
||||
else:
|
||||
from_path = relative_to.parent
|
||||
|
||||
absolute_path = PROJECT_ROOT / "docs" / "data" / "readme_icons" / f"{icon_name}.svg"
|
||||
|
||||
return absolute_path.resolve().relative_to(from_path.resolve())
|
||||
|
||||
|
||||
def str_projects(
|
||||
def get_projects(
|
||||
config: list[dict[str, Any]],
|
||||
*,
|
||||
online: bool = True,
|
||||
auth: str | None = None,
|
||||
) -> str:
|
||||
io = StringIO()
|
||||
print = functools.partial(builtins.print, file=io)
|
||||
|
||||
) -> list[Project]:
|
||||
if online:
|
||||
for icon in ICONS:
|
||||
fetch_icon(icon)
|
||||
|
||||
github = Github(auth) if online else None
|
||||
|
||||
projects = sorted((Project(item, github) for item in config), reverse=online)
|
||||
return sorted((Project(item, github) for item in config), reverse=online)
|
||||
|
||||
|
||||
def render_projects(projects: list[Project], *, include_info: bool = True, dest_path: Path):
|
||||
io = StringIO()
|
||||
print = functools.partial(builtins.print, file=io)
|
||||
|
||||
print(Project.header())
|
||||
|
||||
for project in projects:
|
||||
print(project.table_row())
|
||||
|
||||
@@ -170,42 +180,73 @@ def str_projects(
|
||||
|
||||
print()
|
||||
for icon in ICONS:
|
||||
print(f"[{icon} icon]: {path_for_icon(icon).as_posix()}")
|
||||
print(f"[{icon} icon]: {path_for_icon(icon, relative_to=dest_path).as_posix()}")
|
||||
|
||||
print()
|
||||
for project in projects:
|
||||
print(project.info())
|
||||
if include_info:
|
||||
print()
|
||||
for project in projects:
|
||||
print(project.info())
|
||||
|
||||
return io.getvalue()
|
||||
|
||||
|
||||
@click.command(help="Try ./bin/projects.py docs/data/projects.yml --readme README.md")
|
||||
def insert_projects_table(
|
||||
file: Path,
|
||||
*,
|
||||
projects: list[Project],
|
||||
input_filename: str,
|
||||
include_info: bool = True,
|
||||
):
|
||||
text = file.read_text()
|
||||
projects_table = render_projects(projects, include_info=include_info, dest_path=file)
|
||||
|
||||
start_str = "<!-- START bin/projects.py -->\n"
|
||||
|
||||
start = text.find(start_str)
|
||||
assert start != -1
|
||||
|
||||
end = text.find("<!-- END bin/projects.py -->\n")
|
||||
assert end != -1
|
||||
|
||||
generated_note = f"<!-- this section is generated by bin/projects.py. Don't edit it directly, instead, edit {input_filename} -->"
|
||||
new_text = (
|
||||
f"{text[:start + len(start_str)]}\n{generated_note}\n\n{projects_table}\n{text[end:]}"
|
||||
)
|
||||
|
||||
file.write_text(new_text)
|
||||
|
||||
|
||||
PROJECT_ROOT = Path(__file__).parent / ".."
|
||||
README_FILE = PROJECT_ROOT / "README.md"
|
||||
DOCS_PAGE = PROJECT_ROOT / "docs" / "working-examples.md"
|
||||
|
||||
|
||||
@click.command(help="Try ./bin/projects.py docs/data/projects.yml")
|
||||
@click.argument("input", type=click.File("r"))
|
||||
@click.option("--online/--no-online", default=True, help="Get info from GitHub")
|
||||
@click.option("--auth", help="GitHub authentication token")
|
||||
@click.option("--readme", type=click.File("r+"), help="Modify a readme file if given")
|
||||
@click.option(
|
||||
"--dry-run", default=False, help="Print the output, rather than writing it to files in the repo"
|
||||
)
|
||||
def projects(
|
||||
input: TextIO,
|
||||
online: bool,
|
||||
auth: str | None,
|
||||
readme: TextIO | None,
|
||||
dry_run: bool,
|
||||
) -> None:
|
||||
config = yaml.safe_load(input)
|
||||
output = str_projects(config, online=online, auth=auth)
|
||||
projects = get_projects(config, online=online, auth=auth)
|
||||
|
||||
if readme is None:
|
||||
if dry_run:
|
||||
output = render_projects(projects, dest_path=README_FILE)
|
||||
print(output)
|
||||
else:
|
||||
text = readme.read()
|
||||
start_str = "<!-- START bin/projects.py -->\n"
|
||||
start = text.find(start_str)
|
||||
end = text.find("<!-- END bin/projects.py -->\n")
|
||||
generated_note = f"<!-- this section is generated by bin/projects.py. Don't edit it directly, instead, edit {input.name} -->"
|
||||
new_text = f"{text[:start + len(start_str)]}\n{generated_note}\n\n{output}\n{text[end:]}"
|
||||
|
||||
readme.seek(0)
|
||||
readme.write(new_text)
|
||||
readme.truncate()
|
||||
insert_projects_table(
|
||||
README_FILE, projects=projects[:10], input_filename=input.name, include_info=False
|
||||
)
|
||||
insert_projects_table(
|
||||
DOCS_PAGE, projects=projects, input_filename=input.name, include_info=True
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user