Files
noteflow/docs/sprints/phase-ongoing/deduplication/.archive/sprint_02_proto_converters.md
2026-01-02 04:22:40 +00:00

4.0 KiB

Sprint 02: Proto Converter Consolidation

Field Value
Sprint Size M (Medium)
Status Complete
Prerequisites Sprint 01 (completed)
Phase Deduplication Phase 1
Pattern Reduction 12 inline converters consolidated

Summary

Consolidated 12+ inline converter functions from 6 mixin files into a centralized converters/ package. The original converters.py (613 lines) was split into 6 modules to stay under the 500-line soft limit.

Completed Work

Package Structure Created

grpc/_mixins/converters/
├── __init__.py          (96 lines)  - Re-exports all public functions
├── _id_parsing.py       (80 lines)  - ID parsing helpers
├── _timestamps.py       (84 lines)  - Timestamp utilities
├── _domain.py          (244 lines)  - Core converters (meeting, segment, summary, annotation)
├── _external.py        (113 lines)  - External service converters (webhooks, sync, entity, metrics)
└── _oidc.py            (93 lines)   - OIDC provider converters

Converters Consolidated

Source File Functions Moved
entities.py entity_to_proto
webhooks.py webhook_config_to_proto, webhook_delivery_to_proto
sync.py sync_run_to_proto
oidc.py claim_mapping_to_proto, proto_to_claim_mapping, discovery_to_proto, oidc_provider_to_proto
observability.py metrics_to_proto
project/_converters.py export_format_to_proto (imported from main converters)

Files Updated

File Change
grpc/_mixins/entities.py Import entity_to_proto from converters
grpc/_mixins/webhooks.py Import webhook converters from converters
grpc/_mixins/sync.py Import sync_run_to_proto from converters
grpc/_mixins/oidc.py Import OIDC converters from converters
grpc/_mixins/observability.py Import metrics_to_proto from converters
grpc/_mixins/project/_converters.py Import export_format_to_proto from main converters

Pre-existing Issues Fixed

Issue Fix
Unused fixture memory_servicer in test_stream_lifecycle.py Removed unused parameter
Unused feature_attr parameter in test_mixin_helpers.py Simplified parametrization
Unused name parameter in test_mixin_helpers.py Simplified parametrization

Baselines Updated

  • Updated thin_wrapper baselines to reflect new package paths
  • Updated errors.py module size baseline (570 lines)

Test Results

Test Suite Result
gRPC tests 490 passed
Quality tests 90 passed
Type checking 0 errors
Ruff linting All checks passed

Key Decisions

Decision Rationale
Split into package Original 613 lines exceeded soft limit; package structure provides clear organization
Keep client converters separate Different signatures (client uses primitives from Rust)
Keep project's proto_to_export_format Returns None for unset values vs main's default to MARKDOWN
Use __all__ for exports Clear public API, sorted alphabetically

Verification

# All modules under soft limit
wc -l src/noteflow/grpc/_mixins/converters/*.py
#  244 _domain.py
#  113 _external.py
#   80 _id_parsing.py
#  101 __init__.py
#   93 _oidc.py
#   84 _timestamps.py

# No inline converters remain in mixins (except project-specific ones)
grep -r "def \w*_to_proto" src/noteflow/grpc/_mixins/*.py | grep -v __pycache__ | wc -l
# Only project/_converters.py entries (legitimate project-specific converters)

# Tests pass
pytest tests/grpc/ -q  # 490 passed
pytest tests/quality/ -q  # 90 passed

Architecture Note

The converters package maintains backward compatibility - all imports still work via:

from .converters import meeting_to_proto, entity_to_proto, oidc_provider_to_proto

The __init__.py re-exports all 31 public functions from the submodules.