Working with a Python-based code processing system, the validation logic enforced a hardcoded minimum line requirement for code snippets, which created inflexibility across use cases like tutorials, production, and testing.
Issue
The validation logic used a fixed threshold of 3 lines, preventing adjustments for different environments. This led to:
- Tutorial systems needing fewer lines (2) being rejected.
- Production environments requiring stricter thresholds (5+) needing code modifications.
- Testing scenarios unable to dynamically adjust thresholds without altering source files.
Culprit
The validation logic contained hardcoded values that:
- Violated the 12-factor app principle of environment-based configuration.
- Introduced technical debt by mixing configuration with implementation.
- Required code changes for what should have been configurable parameters.
- Included complex fallback logic that led to silent failures when handling URLs and version strings.
Solution
1. Environment Variable Configuration
Introduced a configurable threshold via environment variables, stored in .env and .env.example, allowing dynamic adjustments without modifying code.
2. Centralized Configuration Management
Centralized the configuration in a dedicated module to load settings from environment variables, ensuring consistency and visibility.
3. Simplified Validation Logic
Refactored the validation logic to:
- Use the configurable threshold instead of hardcoded values.
- Remove redundant and complex conditional checks.
- Implement strict validation rules based on the configurable threshold.
4. Validation Simplification
Removed problematic fallback conditions that created ambiguity and potential silent failures, streamlining the validation process.
Impact:
- The line count threshold is now adjustable via environment variables, eliminating the need for code changes.
- Configuration is explicitly documented in
.env.examplefor new deployments. - Validation logic is simplified, reducing complexity and improving maintainability.
- Early detection of missing configuration values during startup ensures robustness.