Skip to content

Commit bea8dd1

Browse files
committed
component class validator
1 parent 4ebd661 commit bea8dd1

11 files changed

Lines changed: 513 additions & 275 deletions

File tree

bazel/rules/rules_score/examples/seooc/unit_2/docs/unit_2_class_diagram.puml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,20 @@
1515

1616
namespace unit_1 {
1717
class Foo {
18+
{final}
19+
--
1820
+ GetNumber() : uint8_t
1921
+ SetNumber(value : uint8_t) : void
2022
}
2123
}
2224

2325
namespace unit_2 {
2426
class Bar {
27+
{final}
28+
--
29+
- foo_ : unique_ptr<unit_1::Foo>
30+
--
31+
+ Bar(foo : unique_ptr<unit_1::Foo>)
2532
+ AssertNumber() : bool
2633
}
2734
}

bazel/rules/rules_score/private/dependable_element.bzl

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -629,13 +629,14 @@ def _collect_architecture_components(ctx):
629629

630630
return all_components
631631

632-
def _run_validation(ctx, arch_json, static_fbs_files):
632+
def _run_validation(ctx, arch_json, static_fbs_files, unit_static_fbs_files):
633633
"""Run the architecture verifier tool against a pre-built JSON file.
634634
635635
Args:
636636
ctx: Rule context
637637
arch_json: The architecture JSON File object (already declared and written)
638-
static_fbs_files: List of static FlatBuffer files to verify against
638+
static_fbs_files: List of static component-diagram FlatBuffer files
639+
unit_static_fbs_files: List of static class-diagram FlatBuffer files
639640
640641
Returns:
641642
validation_log File object
@@ -646,14 +647,15 @@ def _run_validation(ctx, arch_json, static_fbs_files):
646647
validation_args = ctx.actions.args()
647648
validation_args.add("--architecture-json", arch_json)
648649
validation_args.add_all("--component-fbs", static_fbs_files)
650+
validation_args.add_all("--class-fbs", unit_static_fbs_files)
649651
validation_args.add("--output", validation_log)
650652
validation_args.add("--log-level", get_log_level(ctx))
651653
if ctx.attr.maturity == "development":
652654
validation_args.add("--warn-on-errors")
653655

654656
# ctx.actions.run will fail the build if validation_cli returns non-zero exit code
655657
ctx.actions.run(
656-
inputs = [arch_json] + static_fbs_files,
658+
inputs = [arch_json] + static_fbs_files + unit_static_fbs_files,
657659
outputs = [validation_log],
658660
executable = ctx.executable._validation_cli,
659661
arguments = [validation_args],
@@ -819,8 +821,14 @@ def _dependable_element_index_impl(ctx):
819821
if ArchitecturalDesignInfo in ad:
820822
static_fbs_files.extend(ad[ArchitecturalDesignInfo].static.to_list())
821823

824+
# Collect class-diagram FBS files produced by unit_design targets.
825+
unit_static_fbs_files = []
826+
for unit_target in all_units.values():
827+
unit_info = unit_target[UnitInfo]
828+
unit_static_fbs_files.extend(unit_info.unit_design_static_fbs.to_list())
829+
822830
# Run validation; build fails automatically on non-zero exit
823-
validation_log = _run_validation(ctx, arch_json, static_fbs_files)
831+
validation_log = _run_validation(ctx, arch_json, static_fbs_files, unit_static_fbs_files)
824832

825833
# Both outputs are included so validation always runs in a default build.
826834
# validation_log is also exposed in the debug output group for explicit access.

validation/core/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ rust_library(
3636
deps = [
3737
"//plantuml/parser/puml_serializer/src/fbs:class_fbs",
3838
"//plantuml/parser/puml_serializer/src/fbs:component_fbs",
39+
"//tools/metamodel:class_diagram",
3940
"@crates//:flatbuffers",
4041
"@crates//:serde",
4142
"@crates//:serde_json",

validation/core/src/lib.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@
1616
//! This crate contains the shared models, readers, and validators used by the
1717
//! CLI entrypoints for architecture and design verification.
1818
19-
pub mod models;
20-
pub mod readers;
21-
pub mod validators;
19+
mod models;
20+
mod readers;
21+
mod validators;
2222

2323
pub use models::{
24-
BazelArchitecture, BazelInput, BazelInputEntry, ClassDiagramEntityInput, ClassDiagramIndex,
25-
ClassDiagramInput, ClassDiagramInputs, ClassDiagramRelationshipInput,
26-
ComponentDiagramArchitecture, ComponentDiagramInput, ComponentDiagramInputs, EntityKey, Errors,
24+
BazelArchitecture, BazelInput, ClassDiagramIndex, ClassDiagramInputs,
25+
ComponentDiagramArchitecture, ComponentDiagramInputs, Errors,
2726
};
2827

2928
pub use readers::{BazelReader, ClassDiagramReader, ComponentDiagramReader, Reader};
3029

3130
pub use validators::{
32-
validate_bazel_component, validate_component_class, validate_component_sequence,
33-
BazelComponentValidator, ComponentClassValidator, RequiredInput, SelectedValidator,
34-
ValidatorSpec, ALL_VALIDATORS,
31+
validate_bazel_component, validate_component_class, validate_component_sequence, RequiredInput,
32+
SelectedValidator, ValidatorSpec, ALL_VALIDATORS,
3533
};

validation/core/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ fn build_validation_context(inputs: ValidationCliInputs) -> Result<ValidationCon
200200
let class = read_and_convert::<ClassDiagramReader, ClassDiagramIndex>(
201201
inputs.class_fbs.as_slice(),
202202
&mut errors,
203-
|raw: ClassDiagramInputs, errs| raw.to_class_diagram_index(errs),
203+
|raw: ClassDiagramInputs, errs| ClassDiagramIndex::build_index(&raw, errs),
204204
)?;
205205

206206
Ok(ValidationContext {

validation/core/src/models/class_diagram_models.rs

Lines changed: 17 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,72 +15,34 @@
1515
1616
use std::collections::BTreeSet;
1717

18-
use super::Errors;
19-
20-
/// A single class-diagram entity such as a class, struct, enum, or interface.
21-
#[derive(Debug, Clone, PartialEq)]
22-
pub struct ClassDiagramEntityInput {
23-
pub id: String,
24-
pub name: Option<String>,
25-
pub alias: Option<String>,
26-
pub parent_id: Option<String>,
27-
pub entity_type: String,
28-
pub stereotypes: Vec<String>,
29-
pub template_params: Vec<String>,
30-
pub source_file: Option<String>,
31-
pub source_line: u32,
32-
}
18+
use class_diagram::ClassDiagram as ClassDiagramInput;
3319

34-
/// A relationship edge between two class-diagram entities.
35-
#[derive(Debug, Clone, PartialEq)]
36-
pub struct ClassDiagramRelationshipInput {
37-
pub source: String,
38-
pub target: String,
39-
pub relation_type: String,
40-
pub label: Option<String>,
41-
pub stereotype: Option<String>,
42-
pub source_multiplicity: Option<String>,
43-
pub target_multiplicity: Option<String>,
44-
pub source_role: Option<String>,
45-
pub target_role: Option<String>,
46-
}
47-
48-
/// One parsed class diagram, including entities, containers, and
49-
/// relationships.
50-
#[derive(Debug, Clone, PartialEq)]
51-
pub struct ClassDiagramInput {
52-
pub name: String,
53-
pub entities: Vec<ClassDiagramEntityInput>,
54-
pub relationships: Vec<ClassDiagramRelationshipInput>,
55-
pub source_files: Vec<String>,
56-
pub version: Option<String>,
57-
}
20+
use super::Errors;
5821

5922
/// Collection of class diagrams loaded from one or more FlatBuffer files.
60-
#[derive(Debug, Clone, PartialEq)]
61-
pub struct ClassDiagramInputs {
62-
pub diagrams: Vec<ClassDiagramInput>,
23+
pub type ClassDiagramInputs = Vec<ClassDiagramInput>;
24+
25+
/// Indexed class-diagram data prepared for validators.
26+
pub struct ClassDiagramIndex {
27+
observed_enclosing_namespace_ids: BTreeSet<String>,
6328
}
6429

65-
impl ClassDiagramInputs {
30+
impl ClassDiagramIndex {
6631
/// Build a [`ClassDiagramIndex`] from class diagram inputs.
67-
pub fn to_class_diagram_index(&self, _errors: &mut Errors) -> ClassDiagramIndex {
68-
let observed_namespace_names = self
69-
.diagrams
32+
pub fn build_index(diagrams: &[ClassDiagramInput], _errors: &mut Errors) -> Self {
33+
let observed_enclosing_namespace_ids = diagrams
7034
.iter()
7135
.flat_map(|diagram| diagram.entities.iter())
72-
.filter_map(|entity| entity.parent_id.clone())
73-
.filter(|parent_id| !parent_id.is_empty())
36+
.filter_map(|entity| entity.enclosing_namespace_id.clone())
37+
.filter(|namespace_id| !namespace_id.is_empty())
7438
.collect();
7539

76-
ClassDiagramIndex {
77-
observed_namespace_names,
40+
Self {
41+
observed_enclosing_namespace_ids,
7842
}
7943
}
80-
}
8144

82-
/// Indexed names derived from class-diagram entities.
83-
#[derive(Clone)]
84-
pub struct ClassDiagramIndex {
85-
pub observed_namespace_names: BTreeSet<String>,
45+
pub fn enclosing_namespace_ids(&self) -> &BTreeSet<String> {
46+
&self.observed_enclosing_namespace_ids
47+
}
8648
}

validation/core/src/models/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ mod component_diagram_models;
2020
mod error_models;
2121
mod shared;
2222

23-
pub use bazel_models::{BazelArchitecture, BazelInput, BazelInputEntry};
24-
pub use class_diagram_models::{
25-
ClassDiagramEntityInput, ClassDiagramIndex, ClassDiagramInput, ClassDiagramInputs,
26-
ClassDiagramRelationshipInput,
27-
};
23+
use shared::EntityKey;
24+
25+
#[cfg(test)]
26+
pub use bazel_models::BazelInputEntry;
27+
pub use bazel_models::{BazelArchitecture, BazelInput};
28+
pub use class_diagram_models::{ClassDiagramIndex, ClassDiagramInputs};
2829
pub use component_diagram_models::{
2930
ComponentDiagramArchitecture, ComponentDiagramInput, ComponentDiagramInputs,
3031
};
3132
pub use error_models::Errors;
32-
pub use shared::EntityKey;

0 commit comments

Comments
 (0)