From c259492205465784654443de2889296717b4cd3d Mon Sep 17 00:00:00 2001 From: Alexis Date: Thu, 12 Dec 2024 18:08:32 +0100 Subject: [PATCH] Update documentation Signed-off-by: Alexis --- .github/workflows/docs.yml | 4 +-- Makefile | 5 +-- docs/API/index.md | 6 ++++ docs/assets/images/favicon.png | Bin 0 -> 16133 bytes docs/assets/images/logo.png | Bin 0 -> 15933 bytes docs/index.md | 6 ++-- docs/stylesheets/custom.css | 5 +++ docs/verify.md | 2 +- mkdocs.yml | 33 +++++++++++++++++-- scripts/gen_ref_pages.py | 58 ++++++++++++++++++++++++++++++--- 10 files changed, 103 insertions(+), 16 deletions(-) create mode 100644 docs/API/index.md create mode 100644 docs/assets/images/favicon.png create mode 100644 docs/assets/images/logo.png create mode 100644 docs/stylesheets/custom.css diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 10e555a86..3308498a0 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -15,9 +15,7 @@ jobs: - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: - # NOTE: We use 3.10+ typing syntax via future, which pdoc only - # understands if it's actually run with Python 3.10 or newer. - python-version: ">= 3.10" + python-version: "3.x" cache: "pip" cache-dependency-path: pyproject.toml diff --git a/Makefile b/Makefile index 61032b67c..bff67d64b 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,8 @@ SHELL := /bin/bash PY_MODULE := sigstore ALL_PY_SRCS := $(shell find $(PY_MODULE) -name '*.py') \ - $(shell find test -name '*.py') + $(shell find test -name '*.py') \ + $(shell find scripts -name '*.py') \ # Optionally overriden by the user, if they're using a virtual environment manager. VENV ?= env @@ -97,7 +98,7 @@ gen-x509-testcases: $(VENV)/pyvenv.cfg .PHONY: doc doc: $(VENV)/pyvenv.cfg . $(VENV_BIN)/activate && \ - pdoc --output-directory html $(PY_MODULE) + mkdocs --site-dir html .PHONY: package package: $(VENV)/pyvenv.cfg diff --git a/docs/API/index.md b/docs/API/index.md new file mode 100644 index 000000000..122945b15 --- /dev/null +++ b/docs/API/index.md @@ -0,0 +1,6 @@ +!!! note + + The API reference is automatically generated from the docstrings + +:::sigstore + \ No newline at end of file diff --git a/docs/assets/images/favicon.png b/docs/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f05e42a2d8abf19a61c07bfd0807a26f5b0bfa GIT binary patch literal 16133 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/logo.png b/docs/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5519b417cfd70bc97b2c8106e4e0258b467bb67b GIT binary patch literal 15933 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 b2?SL~#IWVFLXF9-|0~tgHqxrb+C}{z{k-fS literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 17d6cb23c..46aee70c7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -9,9 +9,9 @@ else! ## Features * Support for keyless signature generation and verification with [Sigstore](https://www.sigstore.dev/) -* Support for signing with ["ambient" OpenID Connect identities](https://github.com/sigstore/sigstore-python#signing-with-ambient-credentials) -* A comprehensive [CLI](https://github.com/sigstore/sigstore-python#usage) and corresponding - [importable Python API](https://sigstore.github.io/sigstore-python) +* Support for signing with ["ambient" OpenID Connect identities](./signing.md#signing-with-ambient-credentials) +* A comprehensive [CLI](#using-sigstore) and corresponding + [importable Python API](./API/index.md) ## Installing `sigstore` diff --git a/docs/stylesheets/custom.css b/docs/stylesheets/custom.css new file mode 100644 index 000000000..a06a30ccd --- /dev/null +++ b/docs/stylesheets/custom.css @@ -0,0 +1,5 @@ +/* From https://github.com/sigstore/community/blob/main/artwork/Sigstore_BrandGuide_March2023.pdf */ +:root { + --md-primary-fg-color: #2e2f71; + --md-primary-bg-color: #f9f7ef; +} \ No newline at end of file diff --git a/docs/verify.md b/docs/verify.md index aa14182e1..d256a3911 100644 --- a/docs/verify.md +++ b/docs/verify.md @@ -20,7 +20,7 @@ $ sigstore --staging verify identity --cert-identity "a@tny.town" --cert-oidc-is ## Verifying from GitHub Actions -If your signatures are coming from GitHub Actions (e.g., a workflow that uses its [ambient credentials](#signing-with-ambient-credentials)), +If your signatures are coming from GitHub Actions (e.g., a workflow that uses its [ambient credentials](./signing.md#signing-with-ambient-credentials)), then you can use the `sigstore verify github` subcommand to verify claims more precisely than `sigstore verify identity` allows. diff --git a/mkdocs.yml b/mkdocs.yml index bd3a122dc..a00ef7777 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -9,13 +9,40 @@ theme: name: material icon: repo: fontawesome/brands/github + logo: assets/images/logo.png features: - content.action.edit - header.autohide - navigation.instant - navigation.instant.progress - navigation.footer - + palette: + primary: custom + font: + text: Inter +extra_css: + - stylesheets/custom.css +nav: + - Home: index.md + - Installation: installation.md + - Signing: signing.md + - Verifying: verify.md + - Policy: policy.md + - Advanced: + - Custom Root of Trust: advanced/custom_trust.md + - Offline Verification: advanced/offline.md + # begin-api-section + - API: + - API/index.md + - Models: API/models.md + - Errors: API/errors.md + - Hashes: API/hashes.md + - OIDC: API/oidc.md + - Sign: API/sign.md + - Verify: + - Policy: API/verify/policy.md + - Verifier: API/verify/verifier.md + # end-api-section markdown_extensions: - admonition - pymdownx.details @@ -37,4 +64,6 @@ extra: generator: false social: - icon: fontawesome/brands/slack - link: https://sigstore.slack.com \ No newline at end of file + link: https://sigstore.slack.com + - icon: fontawesome/brands/x-twitter + link: https://twitter.com/projectsigstore \ No newline at end of file diff --git a/scripts/gen_ref_pages.py b/scripts/gen_ref_pages.py index 0c5f8f5a9..744e30783 100644 --- a/scripts/gen_ref_pages.py +++ b/scripts/gen_ref_pages.py @@ -11,25 +11,73 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import argparse +import shutil +import sys from pathlib import Path root = Path(__file__).parent.parent src = root / "sigstore" +api_root = root / "docs" / "API" + -def main(): +def main(args: argparse.Namespace) -> None: + """Main script""" + if args.overwrite: + shutil.rmtree(api_root, ignore_errors=True) + elif not args.check and api_root.exists(): + print(f"API root {api_root} already exists, skipping.") + sys.exit(0) + + seen = set() for path in src.rglob("*.py"): module_path = path.relative_to(src).with_suffix("") doc_path = path.relative_to(src).with_suffix(".md") - full_doc_path = root / "docs" / "API" / doc_path.with_suffix(".md") + full_doc_path = api_root / doc_path.with_suffix(".md") parts = tuple(module_path.parts) if any(part.startswith("_") for part in parts): continue + if args.check: + if not full_doc_path.is_file(): + sys.exit(1) + full_doc_path.parent.mkdir(parents=True, exist_ok=True) - with open(full_doc_path, "w") as f: + with full_doc_path.open("w") as f: f.write(f":::sigstore.{str(module_path).replace('/', '.')}\n ") + seen.add(full_doc_path) + + # Add the root + with (api_root / "index.md").open("w") as f: + f.write("""!!! note + + The API reference is automatically generated from the docstrings + +:::sigstore + """) + + seen.add(api_root / "index.md") + + if args.check: + if diff := set(api_root.rglob("*.md")).symmetric_difference(seen): + print(f"Found leftover documentation file: {diff}", file=sys.stderr) + sys.exit(1) + else: + print(f"API doc generated - don't forget to update the nav section." ) + if __name__ == "__main__": - main() \ No newline at end of file + parser = argparse.ArgumentParser( + description="Generate the structure for the API documentation." + ) + parser.add_argument("--overwrite", action="store_true", default=False) + parser.add_argument("--check", action="store_true", default=False) + + arguments = parser.parse_args() + + if arguments.check and arguments.overwrite: + print("You can't specify both --check and --overwrite.", file=sys.stderr) + sys.exit(1) + + main(arguments)