Stage 3 of the modularization plan outlined in Daily Backlog Burner discussion #493. The plan sequences extractions as config.py (#473) → api_client.py (#516) → validation.py → cache.py. This issue tracks stage 3.
main.py is ~3,200 lines. Grouping all validation logic into a dedicated module makes it easier to test validators in isolation and prevents them from becoming entangled with HTTP or config concerns.
Suggested Changes
Extract the following functions from main.py into a new validation.py:
| Function |
Line (approx.) |
Purpose |
get_validated_input() |
~495 |
Prompt + validate user input |
_validate_config() |
~608 |
Validate loaded config dict |
validate_hostname() |
~1008 |
Validate DNS hostname format |
validate_folder_url() |
~1051 |
Validate block-list URL |
is_valid_profile_id_format() |
~1093 |
Check profile ID pattern |
validate_profile_id() |
~1110 |
Full profile ID validation |
validate_folder_id() |
~1129 |
Full folder ID validation |
is_valid_rule() |
~1149 |
Validate a DNS rule entry |
is_valid_folder_name() |
~1168 |
Validate folder name |
validate_folder_data() |
~1202 |
Validate fetched folder JSON |
Implementation steps:
- Create
validation.py with all listed functions
- Update
main.py to from validation import ...
- Update any test mocks that patch
main.validate_hostname etc. to point to the new module
- Run
uv run pytest tests/ -v to confirm no regressions
Files Affected
main.py — remove extracted functions, add import
validation.py — new file
tests/test_folder_validation.py, tests/test_fix_broken_validation.py — update patch() targets if needed
Success Criteria
- ✅ All validation functions moved to
validation.py
- ✅
main.py imports from validation.py
- ✅ All 30 test modules pass:
uv run pytest tests/ -v
- ✅
main.py line count reduced by ~200 lines
Source
Extracted from Daily Backlog Burner discussion #493 — modularization roadmap stage 3.
Priority
Medium — Builds directly on config (#473) and api_client (#516) extraction. Improves testability of individual validators and keeps main.py focused on orchestration logic.
🔍 Task mining by Discussion Task Miner - Code Quality Improvement Agent
To install this agentic workflow, run
gh aw add github/gh-aw/.github/workflows/discussion-task-miner.md@94662b1dee8ce96c876ba9f33b3ab8be32de82a4
Stage 3 of the modularization plan outlined in Daily Backlog Burner discussion #493. The plan sequences extractions as
config.py(#473) →api_client.py(#516) →validation.py→cache.py. This issue tracks stage 3.main.pyis ~3,200 lines. Grouping all validation logic into a dedicated module makes it easier to test validators in isolation and prevents them from becoming entangled with HTTP or config concerns.Suggested Changes
Extract the following functions from
main.pyinto a newvalidation.py:get_validated_input()_validate_config()validate_hostname()validate_folder_url()is_valid_profile_id_format()validate_profile_id()validate_folder_id()is_valid_rule()is_valid_folder_name()validate_folder_data()Implementation steps:
validation.pywith all listed functionsmain.pytofrom validation import ...main.validate_hostnameetc. to point to the new moduleuv run pytest tests/ -vto confirm no regressionsFiles Affected
main.py— remove extracted functions, add importvalidation.py— new filetests/test_folder_validation.py,tests/test_fix_broken_validation.py— updatepatch()targets if neededSuccess Criteria
validation.pymain.pyimports fromvalidation.pyuv run pytest tests/ -vmain.pyline count reduced by ~200 linesSource
Extracted from Daily Backlog Burner discussion #493 — modularization roadmap stage 3.
Priority
Medium — Builds directly on config (#473) and api_client (#516) extraction. Improves testability of individual validators and keeps
main.pyfocused on orchestration logic.