You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
motief/docs/plans/2026-04-24-003-consolidate-...

136 lines
3.6 KiB

---
title: "refactor: Consolidate duplicate config sources"
type: refactor
status: active
date: 2026-04-24
---
# Consolidate Duplicate Config Sources
## Overview
There are two config files: `config.py` (51 lines at repo root) and `analysis/config.py` (13K). The root config defines base `Config` dataclass with env vars; analysis/config.py contains SVD themes, party lists, colors, and explorer constants. This divergence is confusing and risks stale data.
## Problem Frame
- Two sources of truth for configuration
- `config.py` is small and may be overlooked
- `analysis/config.py` is large and contains both constants and dynamic config
- Risk of updating one but not the other
## Requirements Trace
- R1. Single canonical config module
- R2. All existing imports continue to work (backward compatibility)
- R3. No behavior changes
- R4. Tests pass after consolidation
## Scope Boundaries
**Included:**
- Audit both config files
- Decide on canonical location
- Migrate root config into analysis/config.py or re-export
- Update imports
**Excluded:**
- Changing config values
- Adding new config options
- Refactoring analysis/config.py beyond import consolidation
## Key Technical Decisions
- **Canonical location: analysis/config.py** — it already contains most config and is imported by many modules
- **Backward compatibility:** Root `config.py` becomes a thin re-export shim: `from analysis.config import Config`
## Implementation Units
- [ ] U1. **Audit config usage**
**Goal:** Map which modules import from which config file.
**Requirements:** R1
**Dependencies:** None
**Files:**
- Read: `config.py`, `analysis/config.py`
**Approach:**
- `grep -rn "from config import\|import config" --include="*.py"`
- `grep -rn "from analysis.config import\|import analysis.config" --include="*.py"`
- Document findings
**Test expectation:** none — research unit.
**Verification:**
- Complete list of import sites
---
- [ ] U2. **Migrate root config into analysis/config.py**
**Goal:** Move Config dataclass and env var logic to analysis/config.py.
**Requirements:** R1, R2, R3
**Dependencies:** U1
**Files:**
- Modify: `analysis/config.py`
- Modify: `config.py` (re-export shim)
**Approach:**
- Move `Config` dataclass to analysis/config.py
- Keep root `config.py` as: `from analysis.config import Config`
- Ensure no circular imports
**Execution note:** Test-first — write a test that imports both `config` and `analysis.config` and verifies they expose the same `Config` class.
**Test scenarios:**
- Happy path: `from config import Config` still works
- Happy path: `from analysis.config import Config` works
- Integration: Both paths return the same object
**Verification:**
- `uv run python -c "from config import Config; from analysis.config import Config as AC; assert Config is AC"`
- All tests pass
---
- [ ] U3. **Update import sites**
**Goal:** Standardize imports to use analysis/config.py directly.
**Requirements:** R1
**Dependencies:** U2
**Files:**
- Modify: Files that import from root config.py
**Approach:**
- Replace `from config import Config` with `from analysis.config import Config`
- Mechanical change, one file at a time
**Test scenarios:**
- Integration: All modified files import successfully
- Regression: All tests pass
**Verification:**
- `grep -rn "from config import" --include="*.py"` returns nothing (except shim)
- Full test suite passes
---
## Risks & Dependencies
| Risk | Mitigation |
|------|------------|
| Circular imports | analysis/config.py must not import from modules that import it |
| Hidden dynamic imports | Search thoroughly; test all import paths |
## Sources & References
- `config.py`
- `analysis/config.py`