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
2 changes: 1 addition & 1 deletion MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ use_repo(pip, "manual_analysis_deps")
bazel_dep(name = "trlc", version = "0.0.0")
git_override(
module_name = "trlc",
commit = "1872957ae981ae632a0ec6eafb5b8d3aa44bdb86",
commit = "8bdcb1fe6d5af97b69a293673815592371bdbb20",
remote = "https://github.com/bmw-software-engineering/trlc.git",
)

Expand Down
61 changes: 11 additions & 50 deletions bazel/rules/rules_score/examples/seooc/docs/requirements/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -11,99 +11,60 @@
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

load("@trlc//:trlc.bzl", "trlc_requirements", "trlc_requirements_test")
load("//bazel/rules/rules_score:rules_score.bzl", "component_requirements", "feature_requirements")
load("//bazel/rules/rules_score:rules_score.bzl", "assumed_system_requirements", "component_requirements", "feature_requirements")
load("//validation/ai_checker:ai_checker.bzl", "trlc_requirements_ai_test")

trlc_requirements(
assumed_system_requirements(
name = "assumed_system_requirements",
srcs = [
"assumed_system_requirements.trlc",
],
spec = [
"//bazel/rules/rules_score/trlc/config:score_requirements_model",
],
visibility = ["//visibility:public"],
)

trlc_requirements_test(
name = "assumed_system_requirements_test",
reqs = [
":assumed_system_requirements",
],
visibility = ["//visibility:public"],
)

trlc_requirements(
name = "feature_requirements_trlc",
feature_requirements(
name = "feature_requirements",
srcs = [
"feature_requirements.trlc",
],
spec = [
"//bazel/rules/rules_score/trlc/config:score_requirements_model",
],
visibility = ["//visibility:public"],
deps = [
":assumed_system_requirements",
],
)

feature_requirements(
name = "feature_requirements",
srcs = [":feature_requirements_trlc"],
visibility = ["//visibility:public"],
)

trlc_requirements_ai_test(
name = "feature_requirements_ai_test",
reqs = [":feature_requirements_trlc"],
reqs = [":feature_requirements"],
tags = ["manual"],
)

trlc_requirements(
name = "component_requirements_trlc",
component_requirements(
name = "component_requirements",
srcs = [
"component_requirements.trlc",
],
spec = [
"//bazel/rules/rules_score/trlc/config:score_requirements_model",
],
visibility = ["//visibility:public"],
deps = [
":assumed_system_requirements",
":feature_requirements_trlc",
":feature_requirements",
],
)

component_requirements(
name = "component_requirements",
srcs = [":component_requirements_trlc"],
visibility = ["//visibility:public"],
)

trlc_requirements(
name = "component_requirements_extra_trlc",
name = "component_requirements_extra",
srcs = [
"component_requirements_extra.trlc",
],
spec = [
"//bazel/rules/rules_score/trlc/config:score_requirements_model",
],
visibility = ["//visibility:public"],
deps = [
":assumed_system_requirements",
":feature_requirements_trlc",
":feature_requirements",
],
)

component_requirements(
name = "component_requirements_extra",
srcs = [":component_requirements_extra_trlc"],
visibility = ["//visibility:public"],
)

trlc_requirements_ai_test(
name = "component_requirements_ai_test",
reqs = [":component_requirements_trlc"],
reqs = [":component_requirements"],
tags = ["manual"],
)
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ conversion-rules:
- package: ScoreReq
record-type: CompReq
namespace: req
version-field: version
description-fields: description
tags:
- derived_from
91 changes: 91 additions & 0 deletions bazel/rules/rules_score/private/assumed_system_requirements.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# *******************************************************************************
# Copyright (c) 2025 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
# *******************************************************************************

"""
Assumed System Requirements build rules for S-CORE projects.

Assumed System Requirements (ASR) are system-level requirements that represent
the assumptions a Safety Element out of Context (SEooC) makes about the system
it will be integrated into. Feature requirements are derived from them.
"""

load("@trlc//:trlc.bzl", "trlc_requirements_test")
load("//bazel/rules/rules_score/private:requirements.bzl", "score_requirements_rule")

# ============================================================================
# Public Macro
# ============================================================================

def assumed_system_requirements(
name,
srcs,
deps = [],
spec = Label("//bazel/rules/rules_score/trlc/config:score_requirements_model"),
ref_package = "",
visibility = None):
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should use **kwargs for these things...

"""Define Assumed System Requirements following S-CORE process guidelines.

Creates a target providing AssumedSystemRequirementsInfo, TrlcProviderInfo,
and SphinxSourcesInfo, plus a validation test target ``<name>_test``.

Because this target emits TrlcProviderInfo, downstream requirement targets
(e.g. feature_requirements) can reference it directly in their ``deps``
without any intermediate trlc_requirements wrapper.

Args:
name: The name of the target.
srcs: List of .trlc source files containing AssumedSystemReq records as
defined in the S-CORE requirements model.
deps: Optional list of requirement targets whose TRLC records are needed
for cross-reference parsing. These targets must provide
TrlcProviderInfo. Typically empty for top-level system requirements.
spec: Optional TRLC specification target providing RSL type definitions.
Defaults to the S-CORE requirements model
(``@score_tooling//bazel/rules/rules_score/trlc/config:score_requirements_model``).
Override this when using a custom requirements model.
visibility: Bazel visibility specification for the generated targets.

Generated Targets:
<name>: Main target providing AssumedSystemRequirementsInfo,
TrlcProviderInfo, and SphinxSourcesInfo.
<name>_test: TRLC validation test (runs ``trlc --verify``).

Example:
```starlark
assumed_system_requirements(
name = "asr",
srcs = ["assumed_system_requirements.trlc"],
)

feature_requirements(
name = "feat_req",
srcs = ["feature_requirements.trlc"],
deps = [":asr"],
)
```
"""
score_requirements_rule(
name = name,
srcs = srcs,
deps = deps,
req_kind = "assumed_system",
lobster_config = Label("//bazel/rules/rules_score/lobster/config:assumed_system_requirement"),
spec = spec,
ref_package = ref_package,
visibility = visibility,
)
trlc_requirements_test(
name = name + "_test",
reqs = [":" + name],
visibility = visibility,
)
112 changes: 40 additions & 72 deletions bazel/rules/rules_score/private/component_requirements.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -14,67 +14,12 @@
"""
Component Requirements build rules for S-CORE projects.

This module provides macros and rules for defining component requirements
following S-CORE process guidelines. Component requirements are derived from
feature requirements and define the specific requirements for a software component.
Component requirements are derived from feature requirements and define the
specific requirements for a software component.
"""

load("//bazel/rules/rules_score:providers.bzl", "ComponentRequirementsInfo", "SphinxSourcesInfo")

# ComponentRequirementsInfo and FeatureRequirementsInfo are re-exported from providers.bzl for backward compatibility.

# ============================================================================
# Private Rule Implementation
# ============================================================================

def _component_requirements_impl(ctx):
"""Implementation for component_requirements rule.

Collects component requirements source files and links them to their
parent feature requirements through providers.

Args:
ctx: Rule context

Returns:
List of providers including DefaultInfo and ComponentRequirementsInfo
"""
srcs = depset(ctx.files.srcs)

# Collect feature requirements providers
feature_reqs = []

# Collect transitive sphinx sources from feature requirements
transitive = [srcs]

return [
DefaultInfo(files = srcs),
ComponentRequirementsInfo(
srcs = srcs,
name = ctx.label.name,
),
SphinxSourcesInfo(
srcs = srcs,
deps = depset(transitive = transitive),
ancillary = depset(),
),
]

# ============================================================================
# Rule Definition
# ============================================================================

_component_requirements = rule(
implementation = _component_requirements_impl,
doc = "Collects component requirements documents with traceability to feature requirements",
attrs = {
"srcs": attr.label_list(
allow_files = [".rst", ".md", ".trlc"],
mandatory = True,
doc = "Source files containing component requirements specifications",
),
},
)
load("@trlc//:trlc.bzl", "trlc_requirements_test")
load("//bazel/rules/rules_score/private:requirements.bzl", "score_requirements_rule")

# ============================================================================
# Public Macro
Expand All @@ -83,35 +28,58 @@ _component_requirements = rule(
def component_requirements(
name,
srcs,
deps = [],
spec = Label("//bazel/rules/rules_score/trlc/config:score_requirements_model"),
ref_package = "",
visibility = None):
"""Define component requirements following S-CORE process guidelines.

Component requirements are derived from feature requirements and define
the specific functional and safety requirements for a software component.
They establish traceability from high-level features to component-level
specifications.
Creates a target providing ComponentRequirementsInfo, TrlcProviderInfo,
and SphinxSourcesInfo, plus a validation test target ``<name>_test``.

Because this target emits TrlcProviderInfo, downstream targets can
reference it directly in their ``deps`` without any intermediate
trlc_requirements wrapper.

Args:
name: The name of the component requirements target. Used as the base
name for all generated targets.
srcs: List of labels to .rst, .md, or .trlc files containing the
component requirements specifications as defined in the S-CORE
process.
name: The name of the target.
srcs: List of .trlc source files containing CompReq records as defined
in the S-CORE requirements model.
deps: Optional list of requirement targets (e.g. assumed_system_requirements,
feature_requirements) whose TRLC records are needed for cross-reference
parsing. These targets must provide TrlcProviderInfo.
spec: Optional TRLC specification target providing RSL type definitions.
Defaults to the S-CORE requirements model
(``@score_tooling//bazel/rules/rules_score/trlc/config:score_requirements_model``).
Override this when using a custom requirements model.
visibility: Bazel visibility specification for the generated targets.

Generated Targets:
<name>: Main component requirements target providing ComponentRequirementsInfo
<name>: Main target providing ComponentRequirementsInfo, TrlcProviderInfo,
and SphinxSourcesInfo.
<name>_test: TRLC validation test (runs ``trlc --verify``).

Example:
```starlark
component_requirements(
name = "my_component_requirements",
srcs = ["component_requirements.rst"],
name = "comp_req",
srcs = ["component_requirements.trlc"],
deps = [":asr", ":feat_req"],
)
```
"""
_component_requirements(
score_requirements_rule(
name = name,
srcs = srcs,
deps = deps,
req_kind = "component",
lobster_config = Label("//bazel/rules/rules_score/lobster/config:component_requirement"),
spec = spec,
ref_package = ref_package,
visibility = visibility,
)
trlc_requirements_test(
name = name + "_test",
reqs = [":" + name],
visibility = visibility,
)
Loading
Loading