Milestone: #83
Depends on: nothing
Context
src/tycoon/project.py defines TycoonProject. Current fields: name, version, stack, database, sources, ask, sync, transform, notify. No runtimes: or metadata: section exists.
Goal
Add to src/tycoon/project.py:
from typing import Literal
class RuntimeEntry(BaseModel):
type: Literal["dlt-managed", "dlt-project", "fivetran", "airbyte", "estuary"]
path: str | None = None # only used by dlt-project runtimes
class MetadataConfig(BaseModel):
backend: str = "duckdb_file"
path: str = ".tycoon/metadata.duckdb"
Add to TycoonProject:
runtimes: dict[str, RuntimeEntry] = Field(default_factory=dict)
metadata: MetadataConfig = Field(default_factory=MetadataConfig)
Both fields have defaults so all existing tycoon.yml files load without error or migration.
Acceptance
- A
tycoon.yml without runtimes: or metadata: keys loads and returns project.runtimes == {} and project.metadata.backend == "duckdb_file"
- A
tycoon.yml with runtimes: {dlt-managed: {type: dlt-managed}} loads and project.runtimes["dlt-managed"].type == "dlt-managed"
pytest tests/test_project.py passes with no changes to existing tests
Milestone: #83
Depends on: nothing
Context
src/tycoon/project.pydefinesTycoonProject. Current fields:name,version,stack,database,sources,ask,sync,transform,notify. Noruntimes:ormetadata:section exists.Goal
Add to
src/tycoon/project.py:Add to
TycoonProject:Both fields have defaults so all existing
tycoon.ymlfiles load without error or migration.Acceptance
tycoon.ymlwithoutruntimes:ormetadata:keys loads and returnsproject.runtimes == {}andproject.metadata.backend == "duckdb_file"tycoon.ymlwithruntimes: {dlt-managed: {type: dlt-managed}}loads andproject.runtimes["dlt-managed"].type == "dlt-managed"pytest tests/test_project.pypasses with no changes to existing tests