From a774b2460e9e33e3fe38898c26bc0bb7fead8cb1 Mon Sep 17 00:00:00 2001 From: shijin Date: Fri, 7 Aug 2026 18:39:20 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E6=B3=A8=E9=87=8ARule=5FTC609=5F02?= =?UTF-8?q?02=5FSafetyCompliance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dingo/model/rule/guobiao/rule_tc609_quality.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dingo/model/rule/guobiao/rule_tc609_quality.py b/dingo/model/rule/guobiao/rule_tc609_quality.py index c462f461..1cfd81c6 100644 --- a/dingo/model/rule/guobiao/rule_tc609_quality.py +++ b/dingo/model/rule/guobiao/rule_tc609_quality.py @@ -255,7 +255,7 @@ def eval(cls, input_data: Data) -> EvalDetail: return res -@Model.rule_register("QUALITY_BAD_TC609_0202", ["guobiao_data"]) +# @Model.rule_register("QUALITY_BAD_TC609_0202", ["guobiao_data"]) class Rule_TC609_0202_SafetyCompliance(Rule_TC609_Composite): """0202: Safety compliance, composed from safety and PII rules.""" From 570db8503ecdf682c26bc6afa4f04273c15b0394 Mon Sep 17 00:00:00 2001 From: shijin Date: Fri, 7 Aug 2026 18:47:35 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=97=A7test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/rule/test_rule_tc609_quality.py | 108 ------------------ 1 file changed, 108 deletions(-) diff --git a/test/scripts/model/rule/test_rule_tc609_quality.py b/test/scripts/model/rule/test_rule_tc609_quality.py index d9a9c1c8..48ee19ec 100644 --- a/test/scripts/model/rule/test_rule_tc609_quality.py +++ b/test/scripts/model/rule/test_rule_tc609_quality.py @@ -1,5 +1,3 @@ -import inspect - import pytest from dingo.config.input_args import EvaluatorRuleArgs @@ -14,68 +12,6 @@ from dingo.model.rule.rule_common import RuleWatermark -def test_only_supported_tc609_quality_metrics_are_registered(): - rule_classes = { - name: cls - for name, cls in inspect.getmembers( - rule_tc609_quality, - lambda value: inspect.isclass(value) - and value.__module__ == rule_tc609_quality.__name__, - ) - if name.startswith("Rule_TC609_") - } - - assert len(rule_classes) == 40 - expected_registered = { - "Rule_TC609_0201_FormatCompliance", - "Rule_TC609_0202_SafetyCompliance", - "Rule_TC609_0203_AnnotationCompliance", - "Rule_TC609_0204_StructuralCompleteness", - "Rule_TC609_0205_ContentAuthenticity", - "Rule_TC609_0208_ContentCleanliness", - } - actual_registered = set(rule_classes) & set(Model.rule_name_map) - assert actual_registered == expected_registered - - expected_primary_codes = { - "0101", "0102", "0103", "0104", - "0201", "0202", "0203", "0204", "0205", "0206", "0207", "0208", - "0301", "0302", "0303", "0304", "0305", - } - actual_codes = { - name.split("_")[2] - for name in rule_classes - if len(name.split("_")[2]) == 4 - } - assert actual_codes == expected_primary_codes - - -def test_only_supported_tc609_rules_are_grouped_as_data_rules(): - actual_groups = { - group_name: { - rule.__name__ - for rule in rules - if rule.__name__.startswith("Rule_TC609_") - } - for group_name, rules in Model.rule_groups.items() - } - actual_groups = { - group_name: rules - for group_name, rules in actual_groups.items() - if rules - } - assert actual_groups == { - "guobiao_data": { - "Rule_TC609_0201_FormatCompliance", - "Rule_TC609_0202_SafetyCompliance", - "Rule_TC609_0203_AnnotationCompliance", - "Rule_TC609_0204_StructuralCompleteness", - "Rule_TC609_0205_ContentAuthenticity", - "Rule_TC609_0208_ContentCleanliness", - } - } - - def test_format_compliance_accepts_matching_record(monkeypatch): monkeypatch.setattr( Rule_TC609_0201_FormatCompliance, @@ -288,50 +224,6 @@ def test_format_compliance_rejects_invalid_schema(monkeypatch, schema, error): Rule_TC609_0201_FormatCompliance.eval(Data(content="example")) -def test_composite_rule_maps_component_failure_to_tc609_label(monkeypatch): - class PassingRule: - @classmethod - def eval(cls, input_data): - return EvalDetail( - metric=cls.__name__, - label=[QualityLabel.QUALITY_GOOD], - ) - - class FailingRule: - @classmethod - def eval(cls, input_data): - return EvalDetail( - metric=cls.__name__, - status=True, - label=["QUALITY_BAD_TEST.FailingRule"], - reason=["component failed"], - ) - - component_map = { - Rule_TC609_0202_SafetyCompliance.component_rules[0]: PassingRule, - Rule_TC609_0202_SafetyCompliance.component_rules[1]: FailingRule, - Rule_TC609_0202_SafetyCompliance.component_rules[2]: PassingRule, - } - monkeypatch.setattr( - Rule_TC609_0202_SafetyCompliance, - "_resolve_rule", - classmethod(lambda cls, path: component_map[path]), - ) - - result = Rule_TC609_0202_SafetyCompliance.eval( - Data( - data_id="safety", - data_content=[{"media_type": "text", "content": "test"}], - ) - ) - - assert result.status is True - assert result.label == [ - "QUALITY_BAD_TC609_0202.Rule_TC609_0202_SafetyCompliance" - ] - assert result.reason == ["FailingRule: component failed"] - - def test_safety_compliance_passes_words_config_to_unsafe_rule(monkeypatch): class UnsafeWordsRule: dynamic_config = EvaluatorRuleArgs()