blob: 2f5b22e60b0e04cd8aeb838a039f8700afcb25eb [file] [log] [blame]
# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# 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 io
import re
from absl.testing import absltest
from google.protobuf import text_format
from stardoc.proto import stardoc_output_pb2
from sphinxdocs.private import proto_to_markdown
_EVERYTHING_MODULE = """\
module_docstring: "MODULE_DOC_STRING"
file: "@repo//pkg:foo.bzl"
rule_info: {
rule_name: "rule_1"
doc_string: "RULE_1_DOC_STRING"
attribute: {
name: "rule_1_attr_1",
doc_string: "RULE_1_ATTR_1_DOC_STRING"
type: STRING
default_value: "RULE_1_ATTR_1_DEFAULT_VALUE"
}
}
provider_info: {
provider_name: "ProviderAlpha"
doc_string: "PROVIDER_ALPHA_DOC_STRING"
field_info: {
name: "ProviderAlpha_field_a"
doc_string: "PROVIDER_ALPHA_FIELD_A_DOC_STRING"
}
}
func_info: {
function_name: "function_1"
doc_string: "FUNCTION_1_DOC_STRING"
parameter: {
name: "function_1_param_a"
doc_string: "FUNCTION_1_PARAM_A_DOC_STRING"
default_value: "FUNCTION_1_PARAM_A_DEFAULT_VALUE"
}
return: {
doc_string: "FUNCTION_1_RETURN_DOC_STRING"
}
deprecated: {
doc_string: "FUNCTION_1_DEPRECATED_DOC_STRING"
}
}
aspect_info: {
aspect_name: "aspect_1"
doc_string: "ASPECT_1_DOC_STRING"
aspect_attribute: "aspect_1_aspect_attribute_a"
attribute: {
name: "aspect_1_attribute_a",
doc_string: "ASPECT_1_ATTRIBUTE_A_DOC_STRING"
type: INT
default_value: "694638"
}
}
module_extension_info: {
extension_name: "bzlmod_ext"
doc_string: "BZLMOD_EXT_DOC_STRING"
tag_class: {
tag_name: "bzlmod_ext_tag_a"
doc_string: "BZLMOD_EXT_TAG_A_DOC_STRING"
attribute: {
name: "bzlmod_ext_tag_a_attribute_1",
doc_string: "BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DOC_STRING"
type: STRING_LIST
default_value: "[BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DEFAULT_VALUE]"
}
}
}
repository_rule_info: {
rule_name: "repository_rule",
doc_string: "REPOSITORY_RULE_DOC_STRING"
attribute: {
name: "repository_rule_attribute_a",
doc_string: "REPOSITORY_RULE_ATTRIBUTE_A_DOC_STRING"
type: BOOLEAN
default_value: "True"
}
environ: "ENV_VAR_A"
}
"""
class ProtoToMarkdownTest(absltest.TestCase):
def setUp(self):
super().setUp()
self.stream = io.StringIO()
def _render(self, module_text):
renderer = proto_to_markdown._MySTRenderer(
module=text_format.Parse(module_text, stardoc_output_pb2.ModuleInfo()),
out_stream=self.stream,
public_load_path="",
)
renderer.render()
return self.stream.getvalue()
def test_basic_rendering_everything(self):
actual = self._render(_EVERYTHING_MODULE)
self.assertRegex(actual, "# //pkg:foo.bzl")
self.assertRegex(actual, "MODULE_DOC_STRING")
self.assertRegex(actual, "## rule_1.*")
self.assertRegex(actual, "RULE_1_DOC_STRING")
self.assertRegex(actual, "rule_1_attr_1")
self.assertRegex(actual, "RULE_1_ATTR_1_DOC_STRING")
self.assertRegex(actual, "RULE_1_ATTR_1_DEFAULT_VALUE")
self.assertRegex(actual, "## ProviderAlpha")
self.assertRegex(actual, "PROVIDER_ALPHA_DOC_STRING")
self.assertRegex(actual, "ProviderAlpha_field_a")
self.assertRegex(actual, "PROVIDER_ALPHA_FIELD_A_DOC_STRING")
self.assertRegex(actual, "## function_1")
self.assertRegex(actual, "FUNCTION_1_DOC_STRING")
self.assertRegex(actual, "function_1_param_a")
self.assertRegex(actual, "FUNCTION_1_PARAM_A_DOC_STRING")
self.assertRegex(actual, "FUNCTION_1_PARAM_A_DEFAULT_VALUE")
self.assertRegex(actual, "FUNCTION_1_RETURN_DOC_STRING")
self.assertRegex(actual, "FUNCTION_1_DEPRECATED_DOC_STRING")
self.assertRegex(actual, "## aspect_1")
self.assertRegex(actual, "ASPECT_1_DOC_STRING")
self.assertRegex(actual, "aspect_1_aspect_attribute_a")
self.assertRegex(actual, "aspect_1_attribute_a")
self.assertRegex(actual, "ASPECT_1_ATTRIBUTE_A_DOC_STRING")
self.assertRegex(actual, "694638")
self.assertRegex(actual, "## bzlmod_ext")
self.assertRegex(actual, "BZLMOD_EXT_DOC_STRING")
self.assertRegex(actual, "### bzlmod_ext.bzlmod_ext_tag_a")
self.assertRegex(actual, "BZLMOD_EXT_TAG_A_DOC_STRING")
self.assertRegex(actual, "bzlmod_ext_tag_a_attribute_1")
self.assertRegex(actual, "BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DOC_STRING")
self.assertRegex(actual, "BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DEFAULT_VALUE")
self.assertRegex(actual, "## repository_rule")
self.assertRegex(actual, "REPOSITORY_RULE_DOC_STRING")
self.assertRegex(actual, "repository_rule_attribute_a")
self.assertRegex(actual, "REPOSITORY_RULE_ATTRIBUTE_A_DOC_STRING")
self.assertRegex(actual, "repository_rule_attribute_a.*=.*True")
self.assertRegex(actual, "ENV_VAR_A")
def test_render_signature(self):
actual = self._render(
"""\
file: "@repo//pkg:foo.bzl"
func_info: {
function_name: "func"
parameter: {
name: "param_with_default"
default_value: "DEFAULT"
}
parameter: {
name: "param_without_default"
}
parameter: {
name: "last_param"
}
}
"""
)
self.assertIn("[param_with_default](#func_param_with_default)=DEFAULT,", actual)
self.assertIn("[param_without_default](#func_param_without_default),", actual)
def test_render_field_list(self):
actual = self._render(
"""\
file: "@repo//pkg:foo.bzl"
func_info: {
function_name: "func"
parameter: {
name: "param"
default_value: "DEFAULT"
}
}
"""
)
self.assertRegex(
actual, re.compile("^:.*param.*ΒΆ.*headerlink.*:\n", re.MULTILINE)
)
self.assertRegex(actual, re.compile("^ .*#func_param", re.MULTILINE))
if __name__ == "__main__":
absltest.main()