Skip to content

Commit d5de491

Browse files
committed
Refactor requirement macros to accept RST sources via rst_srcs_to_trlc
Wire RST-to-TRLC conversion into all requirement macros so users can pass .rst files directly instead of pre-built trlc_requirements targets: - Add assumed_system_requirements() public macro with stable _trlc alias generation for downstream cross-package references - Add _score_requirements() shared helper to deduplicate feature/component macro logic - Extend feature_requirements() and component_requirements() with deps and ref_package parameters for RST source support - Update assumptions_of_use() to accept RST sources and change srcs attribute to require TrlcProviderInfo providers - Export assumed_system_requirements from rules_score.bzl - Add comprehensive Bazel analysis tests (requirements_rst_test.bzl) for all RST-based requirement macros with provider and SphinxSourcesInfo verification
1 parent 3e2e8c2 commit d5de491

5 files changed

Lines changed: 481 additions & 33 deletions

File tree

bazel/rules/rules_score/private/assumptions_of_use.bzl

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ following S-CORE process guidelines. Assumptions of Use define the safety-releva
1919
operating conditions and constraints for a Safety Element out of Context (SEooC).
2020
"""
2121

22+
load("@trlc//:trlc.bzl", "TrlcProviderInfo", "trlc_requirements_test")
2223
load("//bazel/rules/rules_score:providers.bzl", "AssumptionsOfUseInfo", "ComponentRequirementsInfo", "FeatureRequirementsInfo", "SphinxSourcesInfo")
24+
load("//bazel/rules/rules_score/private:rst_to_trlc.bzl", "rst_srcs_to_trlc")
2325

2426
# ============================================================================
2527
# Private Rule Implementation
@@ -79,9 +81,9 @@ _assumptions_of_use = rule(
7981
doc = "Collects Assumptions of Use documents with traceability to feature requirements",
8082
attrs = {
8183
"srcs": attr.label_list(
82-
allow_files = [".rst", ".md", ".trlc"],
84+
providers = [TrlcProviderInfo],
8385
mandatory = True,
84-
doc = "Source files containing Assumptions of Use specifications",
86+
doc = "trlc_requirements targets containing Assumptions of Use specifications",
8587
),
8688
"requirements": attr.label_list(
8789
providers = [[FeatureRequirementsInfo], [ComponentRequirementsInfo]],
@@ -99,6 +101,7 @@ def assumptions_of_use(
99101
name,
100102
srcs,
101103
requirements = [],
104+
ref_package = None,
102105
visibility = None):
103106
"""Define Assumptions of Use following S-CORE process guidelines.
104107
@@ -110,29 +113,49 @@ def assumptions_of_use(
110113
Args:
111114
name: The name of the assumptions of use target. Used as the base
112115
name for all generated targets.
113-
srcs: List of labels to .rst, .md, or .trlc files containing the
116+
srcs: List of labels to trlc_requirements targets containing the
114117
Assumptions of Use specifications as defined in the S-CORE
115-
process.
118+
process. RST files containing ``aou_req`` directives are also
119+
accepted and will be converted to TRLC automatically.
116120
requirements: Optional list of labels to feature or component requirements
117121
targets that these Assumptions of Use trace to. Establishes
118122
traceability as defined in the S-CORE process.
123+
ref_package: Optional TRLC package prefix used for ``derived_from``
124+
cross-references when converting RST sources.
119125
visibility: Bazel visibility specification for the generated targets.
120126
121127
Generated Targets:
122128
<name>: Main assumptions of use target providing AssumptionsOfUseInfo
129+
<name>_test: TRLC validation test for the assumptions of use sources
123130
124-
Example:
131+
Example using trlc_requirements targets:
125132
```starlark
126133
assumptions_of_use(
127134
name = "my_assumptions_of_use",
128-
srcs = ["assumptions_of_use.rst"],
135+
srcs = [":my_aous_trlc"],
136+
requirements = [":my_feature_requirements"],
137+
)
138+
```
139+
140+
Example using RST sources directly:
141+
```starlark
142+
assumptions_of_use(
143+
name = "my_assumptions_of_use",
144+
srcs = ["docs/assumptions_of_use.rst"],
129145
requirements = [":my_feature_requirements"],
130146
)
131147
```
132148
"""
149+
trlc_srcs = rst_srcs_to_trlc(name, srcs, ref_package = ref_package or "")
150+
133151
_assumptions_of_use(
134152
name = name,
135-
srcs = srcs,
153+
srcs = trlc_srcs,
136154
requirements = requirements,
137155
visibility = visibility,
138156
)
157+
trlc_requirements_test(
158+
name = name + "_test",
159+
reqs = trlc_srcs,
160+
visibility = visibility,
161+
)

bazel/rules/rules_score/private/requirements.bzl

Lines changed: 96 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -125,53 +125,123 @@ _requirements = rule(
125125
# ============================================================================
126126
# Public Macros
127127
# ============================================================================
128+
def _create_trlc_aliases(name, srcs, visibility):
129+
"""Expose stable public aliases for generated trlc_requirements targets.
128130
129-
def feature_requirements(
130-
name,
131-
srcs,
132-
visibility = None):
133-
"""Define feature requirements following S-CORE process guidelines.
131+
For each RST file in *srcs*, a named alias is created so that downstream
132+
requirement macros can reference the generated trlc_requirements target via
133+
``deps`` for cross-package TRLC validation without knowing internal names.
134+
When a single RST file is given the alias is ``<name>_trlc``; for multiple
135+
RST files the per-source index is appended (``<name>_trlc_0``, …).
134136
135137
Args:
136-
name: The name of the target.
137-
srcs: List of labels to trlc_requirements targets providing TrlcProviderInfo.
138+
name: Base name used by the enclosing macro (same as passed to
139+
rst_srcs_to_trlc).
140+
srcs: Original srcs list passed to the enclosing macro.
141+
visibility: Bazel visibility to apply to the generated aliases.
142+
"""
143+
rst_count = len([s for s in srcs if s.endswith(".rst")])
144+
rst_index = 0
145+
for i, src in enumerate(srcs):
146+
if src.endswith(".rst"):
147+
alias_name = name + "_trlc" if rst_count == 1 else "{}_trlc_{}".format(name, rst_index)
148+
native.alias(
149+
name = alias_name,
150+
actual = ":_{}_trlc_{}".format(name, i),
151+
visibility = visibility,
152+
)
153+
rst_index += 1
154+
155+
def _score_requirements(name, srcs, deps, ref_package, visibility, req_kind):
156+
"""Shared implementation for feature_requirements and component_requirements.
157+
158+
Args:
159+
name: Target name.
160+
srcs: Mixed list of trlc_requirements labels or RST file paths.
161+
deps: trlc_requirements labels used as parsing dependencies for RST files.
162+
ref_package: TRLC package prefix for derived_from cross-references.
138163
visibility: Bazel visibility specification.
164+
req_kind: Either "feature" or "component".
139165
"""
166+
trlc_srcs = rst_srcs_to_trlc(name, srcs, deps = deps, ref_package = ref_package or "")
140167
_requirements(
141168
name = name,
142-
srcs = srcs,
143-
lobster_config = Label("//bazel/rules/rules_score/lobster/config:feature_requirement"),
144-
req_kind = "feature",
169+
srcs = trlc_srcs,
170+
lobster_config = Label("//bazel/rules/rules_score/lobster/config:{}_requirement".format(req_kind)),
171+
req_kind = req_kind,
145172
visibility = visibility,
146173
)
147-
148174
trlc_requirements_test(
149175
name = name + "_test",
150-
reqs = srcs,
176+
reqs = trlc_srcs,
151177
visibility = visibility,
152178
)
179+
_create_trlc_aliases(name, srcs, visibility)
180+
181+
def assumed_system_requirements(
182+
name,
183+
srcs,
184+
deps = [],
185+
ref_package = None,
186+
visibility = None):
187+
"""Define Assumed System Requirements following S-CORE process guidelines.
188+
189+
Creates an assumed_system_requirements target (providing AssumedSystemRequirementsInfo
190+
and SphinxSourcesInfo) and a validation test target named *name*_test.
191+
192+
Args:
193+
name: The name of the target.
194+
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
195+
or RST file paths containing ``asr_req`` directives.
196+
RST files are converted to TRLC automatically.
197+
deps: Optional list of trlc_requirements labels to include as
198+
parsing dependencies. Only used when RST files are present in *srcs*.
199+
ref_package: TRLC package prefix for derived_from cross-references
200+
when converting RST sources.
201+
visibility: Bazel visibility specification.
202+
"""
203+
_score_requirements(name, srcs, deps, ref_package, visibility, "assumed_system")
204+
205+
def feature_requirements(
206+
name,
207+
srcs,
208+
deps = [],
209+
ref_package = None,
210+
visibility = None):
211+
"""Define feature requirements following S-CORE process guidelines.
212+
213+
Args:
214+
name: The name of the target.
215+
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
216+
or RST file paths containing ``feat_req`` directives.
217+
RST files are converted to TRLC automatically.
218+
deps: Optional list of trlc_requirements labels to include as
219+
parsing dependencies (e.g. the assumed system requirements
220+
target). Only used when RST files are present in *srcs*.
221+
ref_package: TRLC package prefix for derived_from cross-references
222+
when converting RST sources.
223+
visibility: Bazel visibility specification.
224+
"""
225+
_score_requirements(name, srcs, deps, ref_package, visibility, "feature")
153226

154227
def component_requirements(
155228
name,
156229
srcs = [],
230+
deps = [],
231+
ref_package = None,
157232
visibility = None):
158233
"""Define component requirements following S-CORE process guidelines.
159234
160235
Args:
161236
name: The name of the target.
162-
srcs: List of labels to trlc_requirements targets providing TrlcProviderInfo.
237+
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
238+
or RST file paths containing ``comp_req`` directives.
239+
RST files are converted to TRLC automatically.
240+
deps: Optional list of trlc_requirements labels to include as
241+
parsing dependencies (e.g. assumed system or feature requirement
242+
targets). Only used when RST files are present in *srcs*.
243+
ref_package: TRLC package prefix for derived_from cross-references
244+
when converting RST sources.
163245
visibility: Bazel visibility specification.
164246
"""
165-
_requirements(
166-
name = name,
167-
srcs = srcs,
168-
lobster_config = Label("//bazel/rules/rules_score/lobster/config:component_requirement"),
169-
req_kind = "component",
170-
visibility = visibility,
171-
)
172-
173-
trlc_requirements_test(
174-
name = name + "_test",
175-
reqs = srcs,
176-
visibility = visibility,
177-
)
247+
_score_requirements(name, srcs, deps, ref_package, visibility, "component")

bazel/rules/rules_score/rules_score.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ load(
4343
)
4444
load(
4545
"//bazel/rules/rules_score/private:requirements.bzl",
46+
_assumed_system_requirements = "assumed_system_requirements",
4647
_component_requirements = "component_requirements",
4748
_feature_requirements = "feature_requirements",
4849
)
@@ -61,6 +62,7 @@ load(
6162

6263
architectural_design = _architectural_design
6364
assumptions_of_use = _assumptions_of_use
65+
assumed_system_requirements = _assumed_system_requirements
6466
component_requirements = _component_requirements
6567
dependability_analysis = _dependability_analysis
6668
feature_requirements = _feature_requirements

bazel/rules/rules_score/test/BUILD

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
1414
load(
1515
"@score_tooling//bazel/rules/rules_score:rules_score.bzl",
1616
"architectural_design",
17+
"assumed_system_requirements",
1718
"assumptions_of_use",
1819
"component",
1920
"component_requirements",
@@ -68,6 +69,19 @@ load(
6869
"unit_provider_test",
6970
"unit_sphinx_sources_test",
7071
)
72+
load(
73+
":requirements_rst_test.bzl",
74+
"aous_rst_provider_test",
75+
"aous_rst_sphinx_test",
76+
"asr_rst_output_test",
77+
"asr_rst_provider_test",
78+
"asr_rst_sphinx_test",
79+
"comp_req_rst_provider_test",
80+
"comp_req_rst_sphinx_test",
81+
"feat_req_rst_provider_test",
82+
"feat_req_rst_sphinx_test",
83+
"requirements_rst_test_suite",
84+
)
7185

7286
package(default_visibility = ["//visibility:public"])
7387

@@ -593,6 +607,84 @@ component_sphinx_sources_test(
593607
# Unit, Component, and Dependable Element test suite
594608
unit_component_test_suite(name = "unit_component_tests")
595609

610+
# ============================================================================
611+
# RST-based Requirements Tests
612+
# ============================================================================
613+
614+
# Fixture: assumed_system_requirements from RST
615+
assumed_system_requirements(
616+
name = "asr_rst",
617+
srcs = ["fixtures/rst_requirements/assumed_system_requirements.rst"],
618+
)
619+
620+
# Fixture: feature_requirements from RST (depends on asr_rst for derived_from resolution)
621+
feature_requirements(
622+
name = "feat_req_rst",
623+
srcs = ["fixtures/rst_requirements/feature_requirements.rst"],
624+
deps = [":asr_rst_trlc"],
625+
ref_package = "AssumedSystemRequirements",
626+
)
627+
628+
# Fixture: component_requirements from RST
629+
component_requirements(
630+
name = "comp_req_rst",
631+
srcs = ["fixtures/rst_requirements/component_requirements.rst"],
632+
)
633+
634+
# Fixture: assumptions_of_use from RST
635+
assumptions_of_use(
636+
name = "aous_rst",
637+
srcs = ["fixtures/rst_requirements/assumptions_of_use.rst"],
638+
requirements = [":feat_req_rst"],
639+
)
640+
641+
asr_rst_output_test(
642+
name = "asr_rst_output_test",
643+
target_under_test = ":asr_rst",
644+
)
645+
646+
asr_rst_provider_test(
647+
name = "asr_rst_provider_test",
648+
target_under_test = ":asr_rst",
649+
)
650+
651+
asr_rst_sphinx_test(
652+
name = "asr_rst_sphinx_test",
653+
target_under_test = ":asr_rst",
654+
)
655+
656+
feat_req_rst_provider_test(
657+
name = "feat_req_rst_provider_test",
658+
target_under_test = ":feat_req_rst",
659+
)
660+
661+
feat_req_rst_sphinx_test(
662+
name = "feat_req_rst_sphinx_test",
663+
target_under_test = ":feat_req_rst",
664+
)
665+
666+
comp_req_rst_provider_test(
667+
name = "comp_req_rst_provider_test",
668+
target_under_test = ":comp_req_rst",
669+
)
670+
671+
comp_req_rst_sphinx_test(
672+
name = "comp_req_rst_sphinx_test",
673+
target_under_test = ":comp_req_rst",
674+
)
675+
676+
aous_rst_provider_test(
677+
name = "aous_rst_provider_test",
678+
target_under_test = ":aous_rst",
679+
)
680+
681+
aous_rst_sphinx_test(
682+
name = "aous_rst_sphinx_test",
683+
target_under_test = ":aous_rst",
684+
)
685+
686+
requirements_rst_test_suite(name = "requirements_rst_tests")
687+
596688
# ============================================================================
597689
# Combined Test Suite
598690
# ============================================================================
@@ -635,8 +727,10 @@ py_test(
635727
test_suite(
636728
name = "all_tests",
637729
tests = [
730+
":requirements_rst_tests",
638731
":seooc_tests",
639732
":sphinx_module_tests",
733+
":test_rst_to_trlc",
640734
":test_safety_analysis_tools",
641735
":unit_component_tests",
642736
],

0 commit comments

Comments
 (0)