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.
136 lines
3.6 KiB
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`
|
|
|