1*9bb1b549SSpandan Dasload("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") 2*9bb1b549SSpandan Dasload("@bazel_skylib//rules:write_file.bzl", "write_file") 3*9bb1b549SSpandan Dasload("@bazel_skylib//rules:diff_test.bzl", "diff_test") 4*9bb1b549SSpandan Das 5*9bb1b549SSpandan Dasdef stardoc_with_diff_test( 6*9bb1b549SSpandan Das bzl_library_target, 7*9bb1b549SSpandan Das out_label, 8*9bb1b549SSpandan Das rule_template = "@io_bazel_stardoc//stardoc:templates/markdown_tables/rule.vm"): 9*9bb1b549SSpandan Das """Creates a stardoc target coupled with a diff_test for a given bzl_library. 10*9bb1b549SSpandan Das 11*9bb1b549SSpandan Das This is helpful for minimizing boilerplate when lots of stardoc targets are to be generated. 12*9bb1b549SSpandan Das 13*9bb1b549SSpandan Das Args: 14*9bb1b549SSpandan Das bzl_library_target: the label of the bzl_library target to generate documentation for 15*9bb1b549SSpandan Das out_label: the label of the output MD file 16*9bb1b549SSpandan Das rule_template: the label or path to the Velocity rule template to use with stardoc 17*9bb1b549SSpandan Das """ 18*9bb1b549SSpandan Das 19*9bb1b549SSpandan Das out_file = out_label.replace("//", "").replace(":", "/") 20*9bb1b549SSpandan Das 21*9bb1b549SSpandan Das # Generate MD from .bzl 22*9bb1b549SSpandan Das stardoc( 23*9bb1b549SSpandan Das name = out_file.replace("/", "_").replace(".md", "-docgen"), 24*9bb1b549SSpandan Das out = out_file.replace(".md", "-docgen.md"), 25*9bb1b549SSpandan Das input = bzl_library_target + ".bzl", 26*9bb1b549SSpandan Das rule_template = rule_template, 27*9bb1b549SSpandan Das deps = [bzl_library_target], 28*9bb1b549SSpandan Das ) 29*9bb1b549SSpandan Das 30*9bb1b549SSpandan Das # Ensure that the generated MD has been updated in the local source tree 31*9bb1b549SSpandan Das diff_test( 32*9bb1b549SSpandan Das name = out_file.replace("/", "_").replace(".md", "-difftest"), 33*9bb1b549SSpandan Das failure_message = "Please run \"bazel run //docs:update\"", 34*9bb1b549SSpandan Das # Source file 35*9bb1b549SSpandan Das file1 = out_label, 36*9bb1b549SSpandan Das # Output from stardoc rule above 37*9bb1b549SSpandan Das file2 = out_file.replace(".md", "-docgen.md"), 38*9bb1b549SSpandan Das ) 39*9bb1b549SSpandan Das 40*9bb1b549SSpandan Dasdef update_docs( 41*9bb1b549SSpandan Das name = "update", 42*9bb1b549SSpandan Das docs_folder = "docs"): 43*9bb1b549SSpandan Das """Creates a sh_binary target which copies over generated doc files to the local source tree. 44*9bb1b549SSpandan Das 45*9bb1b549SSpandan Das This is to be used in tandem with `stardoc_with_diff_test()` to produce a convenient workflow 46*9bb1b549SSpandan Das for generating, testing, and updating all doc files as follows: 47*9bb1b549SSpandan Das 48*9bb1b549SSpandan Das ``` bash 49*9bb1b549SSpandan Das bazel build //{docs_folder}/... && bazel test //{docs_folder}/... && bazel run //{docs_folder}:update 50*9bb1b549SSpandan Das ``` 51*9bb1b549SSpandan Das 52*9bb1b549SSpandan Das eg. 53*9bb1b549SSpandan Das 54*9bb1b549SSpandan Das ``` bash 55*9bb1b549SSpandan Das bazel build //docs/... && bazel test //docs/... && bazel run //docs:update 56*9bb1b549SSpandan Das ``` 57*9bb1b549SSpandan Das 58*9bb1b549SSpandan Das Args: 59*9bb1b549SSpandan Das name: the name of the sh_binary target 60*9bb1b549SSpandan Das docs_folder: the name of the folder containing the doc files in the local source tree 61*9bb1b549SSpandan Das """ 62*9bb1b549SSpandan Das content = ["#!/usr/bin/env bash", "cd ${BUILD_WORKSPACE_DIRECTORY}"] 63*9bb1b549SSpandan Das data = [] 64*9bb1b549SSpandan Das for r in native.existing_rules().values(): 65*9bb1b549SSpandan Das if r["kind"] == "stardoc": 66*9bb1b549SSpandan Das doc_gen = r["out"] 67*9bb1b549SSpandan Das if doc_gen.startswith(":"): 68*9bb1b549SSpandan Das doc_gen = doc_gen[1:] 69*9bb1b549SSpandan Das doc_dest = doc_gen.replace("-docgen.md", ".md") 70*9bb1b549SSpandan Das data.append(doc_gen) 71*9bb1b549SSpandan Das content.append("cp -fv bazel-bin/{0}/{1} {2}".format(docs_folder, doc_gen, doc_dest)) 72*9bb1b549SSpandan Das 73*9bb1b549SSpandan Das update_script = name + ".sh" 74*9bb1b549SSpandan Das write_file( 75*9bb1b549SSpandan Das name = "gen_" + name, 76*9bb1b549SSpandan Das out = update_script, 77*9bb1b549SSpandan Das content = content, 78*9bb1b549SSpandan Das ) 79*9bb1b549SSpandan Das 80*9bb1b549SSpandan Das native.sh_binary( 81*9bb1b549SSpandan Das name = name, 82*9bb1b549SSpandan Das srcs = [update_script], 83*9bb1b549SSpandan Das data = data, 84*9bb1b549SSpandan Das ) 85