Skip to content

Commit 49508a0

Browse files
authored
Add all_requirements only if missing (#426)
* Add all_requirements only if missing * Adapt documentation * Recommend compile_pip_requirements
1 parent 764a4b8 commit 49508a0

5 files changed

Lines changed: 90 additions & 3 deletions

File tree

docs.bzl

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,37 @@ def _merge_sourcelinks(name, sourcelinks):
8989
tools = ["@score_docs_as_code//scripts_bazel:merge_sourcelinks"],
9090
)
9191

92+
def _missing_requirements(deps):
93+
"""Add Python hub dependencies if they are missing."""
94+
found = []
95+
missing = []
96+
def _target_to_packagename(target):
97+
return target.split("/")[-1].split(":")[0]
98+
all_packages = [_target_to_packagename(pkg) for pkg in all_requirements]
99+
def _find(pkg):
100+
for dep in deps:
101+
dep_pkg = _target_to_packagename(dep)
102+
if dep_pkg == pkg:
103+
return True
104+
return False
105+
for pkg in all_packages:
106+
if _find(pkg):
107+
found.append(pkg)
108+
else:
109+
missing.append(pkg)
110+
if len(missing) == len(all_requirements):
111+
#print("All docs-as-code dependencies are missing, adding all of them.")
112+
return all_requirements
113+
if len(missing) == 0:
114+
#print("All docs-as-code dependencies are already included, no need to add any.")
115+
return []
116+
if len(found) > 0:
117+
msg = "Some docs-as-code dependencies are in deps: " + ", ".join(found) + \
118+
"\n ... but others are missing: " + ", ".join(missing) + \
119+
"\nInconsistent deps for docs(): either include all dependencies or none of them."
120+
fail(msg)
121+
fail("This case should be unreachable?!")
122+
92123
def docs(source_dir = "docs", data = [], deps = [], scan_code = []):
93124
"""Creates all targets related to documentation.
94125
@@ -107,7 +138,8 @@ def docs(source_dir = "docs", data = [], deps = [], scan_code = []):
107138
fail("docs() must be called from the root package. Current package: " + call_path)
108139

109140
module_deps = deps
110-
deps = deps + all_requirements + [
141+
deps = deps + _missing_requirements(deps)
142+
deps = deps + [
111143
"@score_docs_as_code//src:plantuml_for_python",
112144
"@score_docs_as_code//src/extensions/score_sphinx_bundle:score_sphinx_bundle",
113145
]

docs/how-to/add_extensions.rst

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
Add Extensions
2+
===================
3+
4+
The docs-as-code module defines its own Python environment in ``MODULE.bazel``
5+
and as a user you cannot extend that.
6+
If you want to add Sphinx extensions,
7+
you must duplicate the Python environment first.
8+
9+
Once you have your own Python environment,
10+
supply all necessary packages to ``docs`` via the ``deps`` attribute.
11+
12+
.. code-block:: starlark
13+
:caption: In your BUILD file
14+
15+
load("@your_python_env//:requirements.bzl", "all_requirements")
16+
17+
docs(
18+
# ...other attributes...
19+
deps = all_requirements
20+
)
21+
22+
Inside ``docs()``, the docs-as-code module will check if you have supplied all necessary dependencies.
23+
24+
How to Create a Python Environment?
25+
-----------------------------------
26+
27+
The general documentation is `in the rules_python documentation <https://rules-python.readthedocs.io/en/latest/toolchains.html>`_.
28+
29+
You can also peek into `this docs-as-code repo's MODULE.bazel file <https://github.com/eclipse-score/docs-as-code/blob/main/MODULE.bazel>`_
30+
how ``docs_as_code_hub_env`` is defined and use it as a template for ``your_python_env``.
31+
32+
Recommendation:
33+
Use `compile_pip_requirements <https://rules-python.readthedocs.io/en/latest/api/rules_python/python/pip.html#compile_pip_requirements>`_
34+
because it is a solid practice anyways.
35+
Next, get ``@score_docs_as_code//src:requirements.in`` as one of the inputs
36+
to ensure you have all the necessary dependencies for docs-as-code.
37+
38+
.. code-block:: starlark
39+
:caption: Example BUILD file snippet
40+
41+
load("@rules_python//python:pip.bzl", "compile_pip_requirements")
42+
43+
compile_pip_requirements(
44+
name = "requirements",
45+
srcs = [
46+
"@score_docs_as_code//src:requirements.in",
47+
"requirements.in",
48+
],
49+
requirements_txt = "requirements_lock.txt",
50+
visibility = ["//visibility:public"],
51+
)

docs/how-to/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ Here you find practical guides on how to use docs-as-code.
1515
other_modules
1616
source_to_doc_links
1717
test_to_doc_links
18+
add_extensions

docs/reference/bazel_macros.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ Minimal example (root ``BUILD``)
4242

4343
- ``deps`` (list of bazel labels)
4444
Additional Bazel dependencies to add to the Python binaries and the virtual environment
45-
target. Use this to add project-specific Python packages or extension libraries the docs
46-
build requires.
45+
target. Use this to add project-specific Python modules.
46+
47+
If you don't provide the necessary Sphinx packages,
48+
this function adds its own (but checks for conflicts).
4749

4850
Edge cases
4951
----------

src/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ load("@score_tooling//:defs.bzl", "dash_license_checker")
2424
exports_files(
2525
[
2626
"requirements.txt",
27+
"requirements.in",
2728
"incremental.py",
2829
"dummy.py",
2930
"generate_sourcelinks_cli.py",

0 commit comments

Comments
 (0)