diff --git a/scone/head/dependency_tracking.py b/scone/head/dependency_tracking.py index 9de2e7f..1227f56 100644 --- a/scone/head/dependency_tracking.py +++ b/scone/head/dependency_tracking.py @@ -100,7 +100,7 @@ class DependencyBook: } @staticmethod - def _structure(dictionary: dict) -> "DependencyBook": + def _structure(dictionary: dict, _class: Any) -> "DependencyBook": provided = {cattr.structure(k, Resource): v for k, v in dictionary["provided"]} watching = {cattr.structure(k, Resource): v for k, v in dictionary["watching"]} diff --git a/scone/head/kitchen.py b/scone/head/kitchen.py index 91cdcc3..ecf6879 100644 --- a/scone/head/kitchen.py +++ b/scone/head/kitchen.py @@ -17,10 +17,12 @@ import asyncio import logging +import os import time from asyncio import Future, Queue from collections import deque from contextvars import ContextVar +from pathlib import Path from typing import Any, Deque, Dict, Optional, Tuple, Type, TypeVar import cattr @@ -168,7 +170,7 @@ class Kitchen: return await self._chanproheads[hostuser] async def cook_all(self): - # TODO fridge emitter + await self._emit_fridge_resources() num_workers = 8 @@ -393,6 +395,25 @@ class Kitchen: context = recipe.recipe_context return Resource(kind, id, context.sous, extra_params) + async def _emit_fridge_resources(self): + from scone.default.steps.fridge_steps import get_fridge_dirs + + for fridge_dir in get_fridge_dirs(self.head): + num_prefix_parts = len(fridge_dir.parts) + for root, _dirs, files in os.walk(fridge_dir): + for file in files: + full_path = Path(root, file) + parts = full_path.parts + if parts[0:num_prefix_parts] != fridge_dir.parts: + raise RuntimeError( + f"{parts[0:num_prefix_parts]!r} != {fridge_dir.parts!r}" + ) + fridge_relative_path = "/".join(parts[num_prefix_parts:]) + fridge_res = Resource("fridge", fridge_relative_path, None) + stat = os.stat(full_path) + mtime = int(stat.st_mtime_ns // 1e6) + self.head.dag.resource_time[fridge_res] = mtime + # # @attr.s(auto_attribs=True)