Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add diff_test asserting that docs are up-to-date #321

Merged
merged 4 commits into from
Mar 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .bazelci/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ tasks:
# TODO(laszlocsomor): remove "--test_env=LOCALAPPDATA" after
# https://github.com/bazelbuild/bazel/issues/7761 is fixed
- "--test_env=LOCALAPPDATA"
- "--test_tag_filters=-no_windows"

ubuntu1804_last_green:
name: "Last Green Bazel"
Expand Down Expand Up @@ -93,5 +94,6 @@ tasks:
# TODO(laszlocsomor): remove "--test_env=LOCALAPPDATA" after
# https://github.com/bazelbuild/bazel/issues/7761 is fixed
- "--test_env=LOCALAPPDATA"
- "--test_tag_filters=-no_windows"

buildifier: latest
161 changes: 64 additions & 97 deletions docs/BUILD
Original file line number Diff line number Diff line change
@@ -1,137 +1,104 @@
load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
load("//docs/private:stardoc_with_diff_test.bzl", "stardoc_with_diff_test", "update_docs")

licenses(["notice"])

# Note that due to a bug in Bazel 0.22.0, these targets cannot be built without
# the --incompatible_remap_main_repo flag.
stardoc(
name = "build_test_docs",
out = "build_test_doc_gen.md",
input = "//rules:build_test.bzl",
deps = ["//rules:build_test"],
stardoc_with_diff_test(
bzl_library_target = "//rules:analysis_test",
out_label = "//docs:analysis_test_doc.md",
)

stardoc(
name = "analysis_test_docs",
out = "analysis_test_doc_gen.md",
input = "//rules:analysis_test.bzl",
stardoc_with_diff_test(
bzl_library_target = "//rules:build_test",
out_label = "//docs:build_test_doc.md",
)

stardoc(
name = "collections_docs",
out = "collections_doc_gen.md",
input = "//lib:collections.bzl",
deps = ["//lib:collections"],
stardoc_with_diff_test(
bzl_library_target = "//lib:collections",
out_label = "//docs:collections_doc.md",
)

stardoc(
name = "dicts_docs",
out = "dicts_doc_gen.md",
input = "//lib:dicts.bzl",
deps = ["//lib:dicts"],
stardoc_with_diff_test(
bzl_library_target = "//rules:common_settings",
out_label = "//docs:common_settings_doc.md",
)

stardoc(
name = "partial_docs",
out = "partial_doc_gen.md",
input = "//lib:partial.bzl",
deps = ["//lib:partial"],
stardoc_with_diff_test(
bzl_library_target = "//rules:copy_file",
out_label = "//docs:copy_file_doc.md",
)

stardoc(
name = "paths_docs",
out = "paths_doc_gen.md",
input = "//lib:paths.bzl",
deps = ["//lib:paths"],
stardoc_with_diff_test(
bzl_library_target = "//lib:dicts",
out_label = "//docs:dicts_doc.md",
)

stardoc(
name = "selects_docs",
out = "selects_doc_gen.md",
input = "//lib:selects.bzl",
deps = ["//lib:selects"],
stardoc_with_diff_test(
bzl_library_target = "//rules:diff_test",
out_label = "//docs:diff_test_doc.md",
)

stardoc(
name = "new_sets_docs",
out = "new_sets_doc_gen.md",
input = "//lib:new_sets.bzl",
deps = ["//lib:new_sets"],
stardoc_with_diff_test(
bzl_library_target = "//rules:native_binary",
out_label = "//docs:native_binary_doc.md",
)

stardoc(
name = "shell_docs",
out = "shell_doc_gen.md",
input = "//lib:shell.bzl",
deps = ["//lib:shell"],
stardoc_with_diff_test(
bzl_library_target = "//lib:new_sets",
out_label = "//docs:new_sets_doc.md",
)

stardoc(
name = "structs_docs",
out = "structs_doc_gen.md",
input = "//lib:structs.bzl",
deps = ["//lib:structs"],
stardoc_with_diff_test(
bzl_library_target = "//lib:partial",
out_label = "//docs:partial_doc.md",
)

stardoc(
name = "types_docs",
out = "types_doc_gen.md",
input = "//lib:types.bzl",
deps = ["//lib:types"],
stardoc_with_diff_test(
bzl_library_target = "//lib:paths",
out_label = "//docs:paths_doc.md",
)

stardoc(
name = "unittest_docs",
out = "unittest_doc_gen.md",
input = "//lib:unittest.bzl",
deps = ["//lib:unittest"],
stardoc_with_diff_test(
bzl_library_target = "//rules:run_binary",
out_label = "//docs:run_binary_doc.md",
)

stardoc(
name = "versions_docs",
out = "versions_doc_gen.md",
input = "//lib:versions.bzl",
deps = ["//lib:versions"],
stardoc_with_diff_test(
bzl_library_target = "//lib:selects",
out_label = "//docs:selects_doc.md",
)

stardoc(
name = "copy_file_docs",
out = "copy_file_doc_gen.md",
input = "//rules:copy_file.bzl",
deps = ["//rules:copy_file"],
stardoc_with_diff_test(
bzl_library_target = "//lib:shell",
out_label = "//docs:shell_doc.md",
)

stardoc(
name = "write_file_docs",
out = "write_file_doc_gen.md",
input = "//rules:write_file.bzl",
deps = ["//rules:write_file"],
stardoc_with_diff_test(
bzl_library_target = "//lib:structs",
out_label = "//docs:structs_doc.md",
)

stardoc(
name = "diff_test_docs",
out = "diff_test_doc_gen.md",
input = "//rules:diff_test.bzl",
deps = ["//rules:diff_test"],
stardoc_with_diff_test(
bzl_library_target = "//lib:types",
out_label = "//docs:types_doc.md",
)

stardoc(
name = "native_binary_docs",
out = "native_binary_doc_gen.md",
input = "//rules:native_binary.bzl",
deps = ["//rules:native_binary"],
stardoc_with_diff_test(
bzl_library_target = "//lib:unittest",
out_label = "//docs:unittest_doc.md",
)

stardoc(
name = "run_binary_docs",
out = "run_binary_doc_gen.md",
input = "//rules:run_binary.bzl",
deps = ["//rules:run_binary"],
stardoc_with_diff_test(
bzl_library_target = "//lib:versions",
out_label = "//docs:versions_doc.md",
)

stardoc(
name = "common_settings_docs",
out = "common_settings_doc_gen.md",
input = "//rules:common_settings.bzl",
deps = ["//rules:common_settings"],
stardoc_with_diff_test(
bzl_library_target = "//rules:write_file",
out_label = "//docs:write_file_doc.md",
)

# update_docs must be at the bottom of the BUILD file
update_docs(
name = "update",
docs_folder = "docs",
)
1 change: 1 addition & 0 deletions docs/private/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# No targets in this package
96 changes: 96 additions & 0 deletions docs/private/stardoc_with_diff_test.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
"""Helpers for keeping stardoc documentation up-to-date.

These are currently a private API in bazel-skylib.
See discussion:
https://github.com/bazelbuild/bazel-skylib/pull/321#issuecomment-1081166216

If you need a similar feature, you can consider using a similar rule
available from a third-party:
https://github.com/aspect-build/bazel-lib/blob/main/docs/docs.md
"""

load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@bazel_skylib//rules:diff_test.bzl", "diff_test")

def stardoc_with_diff_test(
bzl_library_target,
out_label):
"""Creates a stardoc target coupled with a `diff_test` for a given `bzl_library`.

This is helpful for minimizing boilerplate in repos wih lots of stardoc targets.

Args:
bzl_library_target: the label of the `bzl_library` target to generate documentation for
out_label: the label of the output MD file
"""

out_file = out_label.replace("//", "").replace(":", "/")

# Generate MD from .bzl
stardoc(
name = out_file.replace("/", "_").replace(".md", "-docgen"),
out = out_file.replace(".md", "-docgen.md"),
input = bzl_library_target + ".bzl",
deps = [bzl_library_target],
)

# Ensure that the generated MD has been updated in the local source tree
diff_test(
name = out_file.replace("/", "_").replace(".md", "-difftest"),
failure_message = "Please run \"bazel run //docs:update\"",
# Source file
file1 = out_label,
# Output from stardoc rule above
file2 = out_file.replace(".md", "-docgen.md"),
tags = ["no_windows"],
)

def update_docs(
name = "update",
docs_folder = "docs"):
"""Creates a `sh_binary` target which copies over generated doc files to the local source tree.

This is to be used in tandem with `stardoc_with_diff_test()` to produce a convenient workflow
for generating, testing, and updating all doc files as follows:

``` bash
bazel build //{docs_folder}/... && bazel test //{docs_folder}/... && bazel run //{docs_folder}:update
```

eg.

``` bash
bazel build //docs/... && bazel test //docs/... && bazel run //docs:update
```

The `update_docs()` invocation must come after/below any `stardoc_with_diff_test()` invocations
in the BUILD file.

Args:
name: the name of the `sh_binary` target
docs_folder: the name of the folder containing the doc files in the local source tree
"""
content = ["#!/usr/bin/env bash", "cd ${BUILD_WORKSPACE_DIRECTORY}"]
data = []
for r in native.existing_rules().values():
if r["kind"] == "stardoc":
doc_gen = r["out"]
if doc_gen.startswith(":"):
doc_gen = doc_gen[1:]
doc_dest = doc_gen.replace("-docgen.md", ".md")
data.append(doc_gen)
content.append("cp -fv bazel-bin/{0}/{1} {2}".format(docs_folder, doc_gen, doc_dest))

update_script = name + ".sh"
write_file(
name = "gen_" + name,
out = update_script,
content = content,
)

native.sh_binary(
name = name,
srcs = [update_script],
data = data,
)
27 changes: 0 additions & 27 deletions docs/regenerate_docs.sh

This file was deleted.