3.5 KiB
3.5 KiB
Nopy Refactoring Plan
This document tracks the major refactoring of the nopy package.
Refactoring Items
1. Remove parallel execution
- Status: ✅ Completed
- Goal: Remove all logic supporting parallel execution of cubes to simplify the execution flow and improve reliability.
- Rationale: The feature never shipped. Concurrent pyinfra processes interleave their output, which made deployment logs unreadable — a cost that outweighed the wall-clock saving. Do not reintroduce it without first solving per-cube output buffering.
- Context:
- Parallelism removed from
NopyConfig,NopyOptions, andexecuteDeployCalls. buildExecutionStagesdeleted.- CLI flags
--paralleland--concurrencyremoved. - Documentation caught up later:
README.md,docs/API.md, anddocs/HOOKS.mdhad all continued to describe the feature as if it existed.
- Parallelism removed from
- Proposed Solution: (Done)
2. Rework cube building process & Dependency Resolution
- Status: ✅ Completed
- Goal: Allow dependencies to be defined as a function of the collected variables.
- New Signature:
dependencies?: (variables: CubeVariables) => DependencySpec[] - Architectural Change: Implement a clean, step-based resolution mechanism using a
BuildContext. - Context:
- Introduced
BuildContextincubes/dependencies.tswhich handles recursive resolution, variable collection, and hook execution. - Resolution is now dynamic: variables are collected for a cube before its dependencies are resolved.
- Introduced
- Proposed Solution: (Done)
3. Remove env property from cube Manifest
- Status: ✅ Completed
- Goal: Remove the
envproperty from the cube manifest. - Context:
envremoved fromManifestandEnvtypes.- Responsibility for defaults shifted entirely to Zod schema defaults and
getDefaults().
- Proposed Solution: (Done)
4. Redesign Manifest and Cube types
- Status: ✅ Completed
- Goal: Transition from
Env -> Manifest -> Cubeinheritance to a cleanerManifest(specification) andCube(runtime) separation. - Context:
Manifestis now a clean interface with a factory namespace.Cubeis a class encapsulating aManifestand runtime info (dir,deployScript).
- Proposed Solution: (Done)
5. Make --use-defaults operational
- Status: ✅ Completed
- Goal: Turn
-Dfrom a flag that was parsed and threaded through three layers but never read into a working non-interactive mode. - Rationale: Unattended runs — CI, or provisioning a fresh box from a checked-in
.nopyrc.json— are the reason the flag exists. It prompted anyway. - Context:
BuildContext.resolveCubebranches onoptions.useDefaultsand skipsVariableAssignment.Variables.get()merge order corrected to defaults → globalenv→ prompts → params.envused to lose to the schema default, which left a non-interactive run with no way to be configured at all.- Replayed session values moved from the
defaultsscope toprompts, so they keep outrankingenvnow thatenvsits higher. Cube.getDefaults()no longer discards every default when one field lacks.default(); it falls back to a per-field read.Cube.requiredKeys()added, and a-Drun fails naming the unfillable variables instead of deploying a cube with them absent from--data.VariableAssignmentoffers every schema key, not only the ones carrying a default, and shows the value the run would actually use as the initial.
- Proposed Solution: (Done)