Skip to content
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
16 changes: 16 additions & 0 deletions bazel/rules/rules_score/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,22 @@ compile_pip_requirements(
],
)

# RST-to-TRLC converter: converts RST requirement directives to TRLC format
py_library(
name = "rst_to_trlc_lib",
srcs = ["src/rst_to_trlc.py"],
imports = ["src"],
visibility = ["//visibility:public"],
)

py_binary(
name = "rst_to_trlc",
srcs = ["src/rst_to_trlc.py"],
imports = ["src"],
main = "src/rst_to_trlc.py",
visibility = ["//visibility:public"],
)

# Arch-to-reqs-from-lobster tool: extracts requirements from component requirement .lobster files
# and generates an architecture.lobster item representing the component's allocation
py_binary(
Expand Down
6 changes: 6 additions & 0 deletions bazel/rules/rules_score/lobster/config/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ filegroup(
visibility = ["//visibility:public"],
)

filegroup(
name = "assumed_system_requirement",
srcs = ["lobster_assumed_system_req.yaml"],
visibility = ["//visibility:public"],
)

filegroup(
name = "failuremodes_config",
srcs = ["lobster_failuremodes.yaml"],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# *******************************************************************************
# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
#
# This program and the accompanying materials are made available under the
# terms of the Apache License Version 2.0 which is available at
# https://www.apache.org/licenses/LICENSE-2.0
#
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************
inputs:
- .
conversion-rules:
- package: ScoreReq
record-type: AssumedSystemReq
namespace: req
version-field: version
description-fields: description
37 changes: 30 additions & 7 deletions bazel/rules/rules_score/private/assumptions_of_use.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ following S-CORE process guidelines. Assumptions of Use define the safety-releva
operating conditions and constraints for a Safety Element out of Context (SEooC).
"""

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

# ============================================================================
# Private Rule Implementation
Expand Down Expand Up @@ -79,9 +81,9 @@ _assumptions_of_use = rule(
doc = "Collects Assumptions of Use documents with traceability to feature requirements",
attrs = {
"srcs": attr.label_list(
allow_files = [".rst", ".md", ".trlc"],
providers = [TrlcProviderInfo],
mandatory = True,
doc = "Source files containing Assumptions of Use specifications",
doc = "trlc_requirements targets containing Assumptions of Use specifications",
),
"requirements": attr.label_list(
providers = [[FeatureRequirementsInfo], [ComponentRequirementsInfo]],
Expand All @@ -99,6 +101,7 @@ def assumptions_of_use(
name,
srcs,
requirements = [],
ref_package = None,
visibility = None):
"""Define Assumptions of Use following S-CORE process guidelines.

Expand All @@ -110,29 +113,49 @@ def assumptions_of_use(
Args:
name: The name of the assumptions of use target. Used as the base
name for all generated targets.
srcs: List of labels to .rst, .md, or .trlc files containing the
srcs: List of labels to trlc_requirements targets containing the
Assumptions of Use specifications as defined in the S-CORE
process.
process. RST files containing ``aou_req`` directives are also
accepted and will be converted to TRLC automatically.
requirements: Optional list of labels to feature or component requirements
targets that these Assumptions of Use trace to. Establishes
traceability as defined in the S-CORE process.
ref_package: Optional TRLC package prefix used for ``derived_from``
cross-references when converting RST sources.
visibility: Bazel visibility specification for the generated targets.

Generated Targets:
<name>: Main assumptions of use target providing AssumptionsOfUseInfo
<name>_test: TRLC validation test for the assumptions of use sources

Example:
Example using trlc_requirements targets:
```starlark
assumptions_of_use(
name = "my_assumptions_of_use",
srcs = ["assumptions_of_use.rst"],
srcs = [":my_aous_trlc"],
requirements = [":my_feature_requirements"],
)
```

Example using RST sources directly:
```starlark
assumptions_of_use(
name = "my_assumptions_of_use",
srcs = ["docs/assumptions_of_use.rst"],
requirements = [":my_feature_requirements"],
)
```
"""
trlc_srcs = rst_srcs_to_trlc(name, srcs, ref_package = ref_package or "")

_assumptions_of_use(
name = name,
srcs = srcs,
srcs = trlc_srcs,
requirements = requirements,
visibility = visibility,
)
trlc_requirements_test(
name = name + "_test",
reqs = trlc_srcs,
visibility = visibility,
)
138 changes: 107 additions & 31 deletions bazel/rules/rules_score/private/requirements.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ This module provides macros and rules for defining requirements at any level
"""

load("@lobster//:lobster.bzl", "subrule_lobster_trlc")
load("@trlc//:trlc.bzl", "TrlcProviderInfo", "trlc_requirements_test")
load("//bazel/rules/rules_score:providers.bzl", "ComponentRequirementsInfo", "FeatureRequirementsInfo", "SphinxSourcesInfo")
load("@trlc//:trlc.bzl", "TrlcProviderInfo", "trlc_requirements", "trlc_requirements_test")
load("//bazel/rules/rules_score:providers.bzl", "AssumedSystemRequirementsInfo", "ComponentRequirementsInfo", "FeatureRequirementsInfo", "SphinxSourcesInfo")
load("//bazel/rules/rules_score/private:rst_to_trlc.bzl", "rst_srcs_to_trlc")

# ============================================================================
# Private Rule Implementation
Expand Down Expand Up @@ -68,11 +69,16 @@ def _requirements_impl(ctx):
srcs = depset([lobster_trlc_file]),
name = ctx.label.name,
)
else:
elif ctx.attr.req_kind == "component":
req_provider = ComponentRequirementsInfo(
srcs = depset([lobster_trlc_file]),
name = ctx.label.name,
)
else: # assumed_system
req_provider = AssumedSystemRequirementsInfo(
srcs = depset([lobster_trlc_file]),
name = ctx.label.name,
)

return [
DefaultInfo(files = all_srcs),
Expand Down Expand Up @@ -102,9 +108,9 @@ _requirements = rule(
doc = "Lobster YAML configuration file for traceability extraction",
),
"req_kind": attr.string(
values = ["feature", "component"],
values = ["feature", "component", "assumed_system"],
mandatory = True,
doc = "Kind of requirements: 'feature' or 'component'",
doc = "Kind of requirements: 'feature', 'component', or 'assumed_system'.",
),
"_renderer": attr.label(
default = Label("@trlc//tools/trlc_rst:trlc_rst"),
Expand All @@ -119,53 +125,123 @@ _requirements = rule(
# ============================================================================
# Public Macros
# ============================================================================
def _create_trlc_aliases(name, srcs, visibility):
"""Expose stable public aliases for generated trlc_requirements targets.

def feature_requirements(
name,
srcs,
visibility = None):
"""Define feature requirements following S-CORE process guidelines.
For each RST file in *srcs*, a named alias is created so that downstream
requirement macros can reference the generated trlc_requirements target via
``deps`` for cross-package TRLC validation without knowing internal names.
When a single RST file is given the alias is ``<name>_trlc``; for multiple
RST files the per-source index is appended (``<name>_trlc_0``, …).

Args:
name: The name of the target.
srcs: List of labels to trlc_requirements targets providing TrlcProviderInfo.
name: Base name used by the enclosing macro (same as passed to
rst_srcs_to_trlc).
srcs: Original srcs list passed to the enclosing macro.
visibility: Bazel visibility to apply to the generated aliases.
"""
rst_count = len([s for s in srcs if s.endswith(".rst")])
rst_index = 0
for i, src in enumerate(srcs):
if src.endswith(".rst"):
alias_name = name + "_trlc" if rst_count == 1 else "{}_trlc_{}".format(name, rst_index)
native.alias(
name = alias_name,
actual = ":_{}_trlc_{}".format(name, i),
visibility = visibility,
)
rst_index += 1

def _score_requirements(name, srcs, deps, ref_package, visibility, req_kind):
"""Shared implementation for feature_requirements and component_requirements.

Args:
name: Target name.
srcs: Mixed list of trlc_requirements labels or RST file paths.
deps: trlc_requirements labels used as parsing dependencies for RST files.
ref_package: TRLC package prefix for derived_from cross-references.
visibility: Bazel visibility specification.
req_kind: Either "feature" or "component".
"""
trlc_srcs = rst_srcs_to_trlc(name, srcs, deps = deps, ref_package = ref_package or "")
_requirements(
name = name,
srcs = srcs,
lobster_config = Label("//bazel/rules/rules_score/lobster/config:feature_requirement"),
req_kind = "feature",
srcs = trlc_srcs,
lobster_config = Label("//bazel/rules/rules_score/lobster/config:{}_requirement".format(req_kind)),
req_kind = req_kind,
visibility = visibility,
)

trlc_requirements_test(
name = name + "_test",
reqs = srcs,
reqs = trlc_srcs,
visibility = visibility,
)
_create_trlc_aliases(name, srcs, visibility)

def assumed_system_requirements(
name,
srcs,
deps = [],
ref_package = None,
visibility = None):
"""Define Assumed System Requirements following S-CORE process guidelines.

Creates an assumed_system_requirements target (providing AssumedSystemRequirementsInfo
and SphinxSourcesInfo) and a validation test target named *name*_test.

Args:
name: The name of the target.
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
or RST file paths containing ``asr_req`` directives.
RST files are converted to TRLC automatically.
deps: Optional list of trlc_requirements labels to include as
parsing dependencies. Only used when RST files are present in *srcs*.
ref_package: TRLC package prefix for derived_from cross-references
when converting RST sources.
visibility: Bazel visibility specification.
"""
_score_requirements(name, srcs, deps, ref_package, visibility, "assumed_system")

def feature_requirements(
name,
srcs,
deps = [],
ref_package = None,
visibility = None):
"""Define feature requirements following S-CORE process guidelines.

Args:
name: The name of the target.
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
or RST file paths containing ``feat_req`` directives.
RST files are converted to TRLC automatically.
deps: Optional list of trlc_requirements labels to include as
parsing dependencies (e.g. the assumed system requirements
target). Only used when RST files are present in *srcs*.
ref_package: TRLC package prefix for derived_from cross-references
when converting RST sources.
visibility: Bazel visibility specification.
"""
_score_requirements(name, srcs, deps, ref_package, visibility, "feature")

def component_requirements(
name,
srcs = [],
deps = [],
ref_package = None,
visibility = None):
"""Define component requirements following S-CORE process guidelines.

Args:
name: The name of the target.
srcs: List of labels to trlc_requirements targets providing TrlcProviderInfo.
srcs: List of trlc_requirements labels (providing TrlcProviderInfo)
or RST file paths containing ``comp_req`` directives.
RST files are converted to TRLC automatically.
deps: Optional list of trlc_requirements labels to include as
parsing dependencies (e.g. assumed system or feature requirement
targets). Only used when RST files are present in *srcs*.
ref_package: TRLC package prefix for derived_from cross-references
when converting RST sources.
visibility: Bazel visibility specification.
"""
_requirements(
name = name,
srcs = srcs,
lobster_config = Label("//bazel/rules/rules_score/lobster/config:component_requirement"),
req_kind = "component",
visibility = visibility,
)

trlc_requirements_test(
name = name + "_test",
reqs = srcs,
visibility = visibility,
)
_score_requirements(name, srcs, deps, ref_package, visibility, "component")
Loading
Loading