From 94c8f454684edaf4720d26c7840b195ac1922b7f Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Tue, 24 Mar 2026 10:17:19 +0800 Subject: [PATCH] Stage 4.1: remove remaining Japanese delivery field keys --- navsea_mapping_registry.py | 42 +++++++++++++++++++ .../mappings/navsea_field_name_rules_v1.yaml | 35 ++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/navsea_mapping_registry.py b/navsea_mapping_registry.py index 2b03c11..5170457 100644 --- a/navsea_mapping_registry.py +++ b/navsea_mapping_registry.py @@ -2,6 +2,7 @@ from __future__ import annotations import json from dataclasses import dataclass +from pathlib import Path from typing import Any import pymysql @@ -90,6 +91,46 @@ def evaluate_match_expr(match_expr: dict[str, Any], context: dict[str, Any]) -> return True +def load_local_field_name_rules() -> dict[str, FieldNameRule]: + mapping_path = Path(__file__).resolve().parent / "tasks" / "pbf" / "mappings" / "navsea_field_name_rules_v1.yaml" + if not mapping_path.exists(): + return {} + + rules: dict[str, FieldNameRule] = {} + current: dict[str, str] = {} + for raw_line in mapping_path.read_text(encoding="utf-8").splitlines(): + line = raw_line.strip() + if not line or line.startswith("#") or line in {"ruleset: navsea_field_name_rules_v1", "rules:"}: + continue + if line.startswith("- field_name_jp:"): + if current.get("field_name_jp") and current.get("field_name_std"): + rules[current["field_name_jp"]] = FieldNameRule( + field_name_jp=current["field_name_jp"], + field_name_std=current["field_name_std"], + field_group_name=current.get("field_group", ""), + keep_in_delivery=current.get("keep_in_delivery", "true").lower() == "true", + keep_in_engineering=current.get("keep_in_engineering", "true").lower() == "true", + normalization_class=current.get("normalization_class", ""), + ) + current = {"field_name_jp": line.split(":", 1)[1].strip()} + continue + if not current or ":" not in line: + continue + key, value = line.split(":", 1) + current[key.strip()] = value.strip() + + if current.get("field_name_jp") and current.get("field_name_std"): + rules[current["field_name_jp"]] = FieldNameRule( + field_name_jp=current["field_name_jp"], + field_name_std=current["field_name_std"], + field_group_name=current.get("field_group", ""), + keep_in_delivery=current.get("keep_in_delivery", "true").lower() == "true", + keep_in_engineering=current.get("keep_in_engineering", "true").lower() == "true", + normalization_class=current.get("normalization_class", ""), + ) + return rules + + class NavSeaMappingRegistry: def __init__( self, @@ -182,6 +223,7 @@ class NavSeaMappingRegistry: ) for row in cur.fetchall() } + field_name_rules.update(load_local_field_name_rules()) cur.execute( """ diff --git a/tasks/pbf/mappings/navsea_field_name_rules_v1.yaml b/tasks/pbf/mappings/navsea_field_name_rules_v1.yaml index ff49ca9..2fa7681 100644 --- a/tasks/pbf/mappings/navsea_field_name_rules_v1.yaml +++ b/tasks/pbf/mappings/navsea_field_name_rules_v1.yaml @@ -121,3 +121,38 @@ rules: keep_in_engineering: true normalization_class: numeric_normalization notes: Legacy angle string is normalized into bearing_deg. + - field_name_jp: ローマ字名称 + field_name_std: name_romaji + field_group: labels + keep_in_delivery: true + keep_in_engineering: true + normalization_class: content_text + notes: Romaji place or object name remains available as normalized content text. + - field_name_jp: 目的分類番号 + field_name_std: purpose_class_code + field_group: source_legacy + keep_in_delivery: true + keep_in_engineering: true + normalization_class: legacy_render_code + notes: Legacy purpose code is preserved under a standardized key. + - field_name_jp: 縮尺選択コード + field_name_std: scale_selection_code + field_group: source_legacy + keep_in_delivery: true + keep_in_engineering: true + normalization_class: legacy_render_code + notes: Legacy scale-selection code is preserved under a standardized key. + - field_name_jp: 表示重要度 + field_name_std: display_priority_code + field_group: source_legacy + keep_in_delivery: true + keep_in_engineering: true + normalization_class: legacy_render_code + notes: Legacy display-priority code is preserved under a standardized key. + - field_name_jp: Sガイドページ + field_name_std: guide_page_ref + field_group: source_legacy + keep_in_delivery: true + keep_in_engineering: true + normalization_class: content_text + notes: Legacy guide-page reference is preserved under a standardized key.