Skip to content

Commit 737ac8e

Browse files
committed
Add index generation
1 parent b27ac8c commit 737ac8e

15 files changed

+280
-11
lines changed

Diff for: .editorconfig

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
root=true
2+
3+
[*]
4+
indent_style=space
5+
indent_size=4
6+
insert_final_newline=true
7+
charset=utf8
8+
trim_trailing_whitespace=true

Diff for: .github/workflows/publish.yml

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Publish JD
2+
on: ["pull_request", "push"]
3+
4+
env:
5+
DEST_DIR: _out
6+
PYTHON_VERSION: 3.9
7+
8+
jobs:
9+
build:
10+
# Only run on PRs if the source branch is on someone else's repo
11+
if: "${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}"
12+
runs-on: "ubuntu-20.04"
13+
steps:
14+
- name: "checkout repository"
15+
uses: "actions/checkout@v2"
16+
- name: "setup python ${{ env.PYTHON_VERSION }}"
17+
uses: "actions/setup-python@v2"
18+
with:
19+
python-version: "${{ env.PYTHON_VERSION }}"
20+
- name: "install dependencies"
21+
run: |
22+
python -m pip install --upgrade pip
23+
python -m pip install -r _generator/requirements.txt
24+
- name: "generate site"
25+
run: |
26+
python _generator/generate.py $DEST_DIR
27+
- name: "publish"
28+
if: "${{ github.event_name == 'push' && github.ref == 'refs/heads/data' }}"
29+
uses: "JamesIves/[email protected]"
30+
with:
31+
branch: "gh-pages"
32+
folder: "${{ env.DEST_DIR }}"
33+
single-commit: true
34+
35+

Diff for: .gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/_out/
2+
__pycache__/
3+
.vscode/

Diff for: CNAME

-1
This file was deleted.

Diff for: README.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Sponge Javadocs
2+
3+
This repository manages the publication of Javadoc for SpongeProjects.
4+
5+
The current (`data`) branch holds a basic static generator and the raw javadoc data. Any new javadoc is published here.
6+
7+
Github Actions runs the generator (in `_generator/`) on a push to this repository, which publishes the javadocs to the `gh-pages` branch, which is visible at https://jd.spongepowered.org.

Diff for: _generator/.flake8

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[flake8]
2+
extend-ignore = E501

Diff for: _generator/generate.py

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#!/usr/bin/env python
2+
3+
import argparse
4+
from collections.abc import Sequence
5+
import jinja2
6+
import os
7+
from pathlib import Path
8+
from ruamel.yaml import YAML
9+
from semver import VersionInfo
10+
import shutil
11+
import sys
12+
from typing import NamedTuple
13+
14+
15+
class ModuleMetadata(NamedTuple):
16+
name: str
17+
versions: list[VersionInfo]
18+
display_name: str = None
19+
url: str = None
20+
21+
22+
def _generate_versions(jd_root: Path, metadata_file: Path) -> list[ModuleMetadata]: # module -> list[version]
23+
"""
24+
Generate a mapping of project to module version.
25+
"""
26+
loader = YAML()
27+
data = loader.load(metadata_file)
28+
29+
result = []
30+
31+
for module in jd_root.iterdir():
32+
dirname = module.name
33+
if dirname.startswith(".") or dirname.startswith("_") or not module.is_dir():
34+
continue
35+
36+
versions = [VersionInfo.parse(x.name) for x in module.iterdir() if x.is_dir and not x.name.startswith(".")]
37+
versions.sort()
38+
39+
extra_metadata = data.get(dirname, {})
40+
result.append(ModuleMetadata(
41+
dirname,
42+
versions,
43+
extra_metadata.get("name", None),
44+
extra_metadata.get("url", None)
45+
))
46+
47+
print(result)
48+
49+
return result
50+
51+
52+
def _create_parser() -> argparse.ArgumentParser:
53+
parser = argparse.ArgumentParser(description="Generate static content for JD site")
54+
parser.add_argument('dest', type=Path, help="Directory to generate to")
55+
parser.add_argument('--jd-root', type=Path, help="Directory to search for module Javadoc in", default='.')
56+
parser.add_argument('--metadata', type=Path, help="YAML file containing extra component metadata", default="components.yaml")
57+
58+
script_dir = Path(__file__).parent
59+
60+
parser.add_argument("--template-root", type=Path, help="Directory to read templates from", default = script_dir / 'tmpl')
61+
parser.add_argument("--static-root", type=Path, help="Static root, for files copied directly", default = script_dir / 'static')
62+
return parser
63+
64+
65+
def _do_generate(dest: Path, jd_root: Path, metadata_file: Path, template_root: Path, static_root: Path):
66+
print(f"Generating from jd={jd_root}, metadata_file={metadata_file}, tmpl={template_root}, static={static_root} -> {dest}")
67+
68+
# Setup, generate metadata
69+
module_versions = _generate_versions(jd_root, metadata_file)
70+
if dest.exists():
71+
shutil.rmtree(dest)
72+
dest.mkdir(exist_ok=True)
73+
74+
# Generate templates
75+
tmpl_env = jinja2.Environment(
76+
loader=jinja2.FileSystemLoader(template_root),
77+
undefined=jinja2.StrictUndefined,
78+
autoescape=True,
79+
keep_trailing_newline=True
80+
)
81+
tmpl_env.globals["module_versions"] = module_versions
82+
83+
for tmpl in template_root.glob('**/*'):
84+
tmpl_out = dest / tmpl.relative_to(template_root)
85+
print(f"Writing {tmpl} to {tmpl_out}")
86+
template = tmpl_env.get_template(str(tmpl.relative_to(template_root)))
87+
with tmpl_out.open(mode = 'wt') as fp:
88+
fp.write(template.render())
89+
90+
# Copy static content
91+
for static in static_root.glob('**/*'):
92+
static_out = dest / static.relative_to(static_root)
93+
print(f"Writing {static} to {static_out}")
94+
shutil.copy2(static, static_out)
95+
96+
# link JD directories into the output dir
97+
for module in module_versions:
98+
module_out = dest / module.name
99+
print(f"Copying {module.name} to {module_out}")
100+
shutil.copytree(jd_root / module.name, module_out, copy_function=os.link,symlinks=True)
101+
print(f"Generating 'latest' symlink for {module.name}")
102+
(module_out / 'latest/').symlink_to(Path(str(max(module.versions))))
103+
104+
# SpongeAPI legacy path support (it's ugly but it works)
105+
if module.name == "spongeapi":
106+
newest_legacy = VersionInfo(7, 3, 0)
107+
for version in module.versions:
108+
if version <= newest_legacy:
109+
(dest / str(version)).symlink_to(module.name + '/' + str(version))
110+
111+
print(f"Generated successfully to {dest}")
112+
113+
114+
def main(args: Sequence[str]):
115+
parser = _create_parser()
116+
parsed = parser.parse_args(args)
117+
_do_generate(parsed.dest, parsed.jd_root, parsed.metadata, parsed.template_root, parsed.static_root)
118+
119+
120+
if __name__ == "__main__":
121+
main(sys.argv[1:])

Diff for: _generator/requirements.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Jinja2>=3.0.0,<4.0.0
2+
semver>=2.13.0,<3.0.0
3+
ruamel.yaml>=0.17

Diff for: _generator/static/.nojekyll

Whitespace-only changes.

Diff for: _generator/static/404.html

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<title>Not Found | Sponge Javadocs</title>
6+
<link rel="stylesheet" type="text/css" href="/style.css">
7+
</head>
8+
<body>
9+
<div class="title">Not Found | Sponge Javadocs</div>
10+
<div id="listContainer">
11+
<div style="text-align: center; padding: 20px;">
12+
<div class="header" style="padding-bottom: 20px;">The page you are looking for could not be found.</div>
13+
<a href="/">Go to the index</a>
14+
</div>
15+
</div>
16+
</body>
17+
</html>

Diff for: _generator/static/CNAME

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
jd.spongepowered.org

Diff for: _generator/static/style.css

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
body {
2+
margin: 0;
3+
background-color: #2b2b2b;
4+
color: white;
5+
/* this list is copypasted straight from bootstrap kek */
6+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
7+
font-size: 24px;
8+
}
9+
10+
.title {
11+
margin: 0;
12+
background-color: #383838;
13+
text-align: center;
14+
padding: 15px;
15+
}
16+
17+
.header {
18+
font-weight: bold;
19+
text-align: center;
20+
width: 100%;
21+
padding-top: 20px;
22+
}
23+
24+
#listContainer {
25+
display: flex;
26+
justify-content: center;
27+
flex-wrap: wrap;
28+
margin: 15px;
29+
30+
}
31+
32+
#listContainer > div {
33+
width: 300px;
34+
background-color: #383838;
35+
border-radius: 5px;
36+
margin: 20px 10px;
37+
}
38+
39+
a {
40+
color: #99b8ff;
41+
}
42+

Diff for: _generator/tmpl/index.html

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<title>Sponge Javadocs</title>
6+
<link rel="stylesheet" type="text/css" href="style.css">
7+
</head>
8+
<body>
9+
<div class="title">Sponge Javadocs</div>
10+
<div id="listContainer">
11+
{% for module in module_versions %}
12+
<div>
13+
{% set module_title = module.display_name if module.display_name else module.name %}
14+
{% if module.url %}
15+
<div class="header"><a href="{{ module.url }}">{{ module_title }}</a></div>
16+
{% else %}
17+
<div class="header">{{ module_title }}</div>
18+
{% endif %}
19+
<ul>
20+
{% for version in module.versions | reverse %}
21+
<li><a href="/{{ module.name }}/{{ version }}/">{{ version }}</a></li>
22+
{% endfor %}
23+
</ul>
24+
</div>
25+
{% endfor %}
26+
</div>
27+
</body>
28+
</html>

Diff for: components.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Extra component metadata
2+
# Format:
3+
#
4+
# directoryname:
5+
# name: User-readable Name
6+
# url: A URL to link to in the module info
7+
# group: Module group for display -- empty string to display at top level
8+
# snapshot-regex: (optional): regex to use to determine if a version should be considered a snapshot. Default `-SNAPSHOT$`
9+
10+
spongeapi:
11+
name: SpongeAPI
12+
url: https://github.com/SpongePowered/SpongeAPI
13+
group: ""

Diff for: index.html

-10
This file was deleted.

0 commit comments

Comments
 (0)