artiq/artiq/master/repository.py

62 lines
1.8 KiB
Python
Raw Normal View History

import os
import logging
import asyncio
from artiq.protocols.sync_struct import Notifier
from artiq.master.worker import Worker
logger = logging.getLogger(__name__)
@asyncio.coroutine
def _scan_experiments():
r = dict()
for f in os.listdir("repository"):
if f.endswith(".py"):
try:
full_name = os.path.join("repository", f)
worker = Worker()
try:
description = yield from worker.examine(full_name)
finally:
yield from worker.close()
for class_name, class_desc in description.items():
name = class_desc["name"]
arguments = class_desc["arguments"]
if name in r:
logger.warning("Duplicate experiment name: '%s'", name)
basename = name
i = 1
while name in r:
name = basename + str(i)
i += 1
entry = {
"file": full_name,
"class_name": class_name,
"arguments": arguments
}
r[name] = entry
except:
logger.warning("Skipping file '%s'", f, exc_info=True)
return r
def _sync_explist(target, source):
for k in list(target.read.keys()):
if k not in source:
del target[k]
for k in source.keys():
if k not in target.read or target.read[k] != source[k]:
target[k] = source[k]
2015-01-26 23:37:33 +08:00
class Repository:
def __init__(self):
self.explist = Notifier(dict())
@asyncio.coroutine
def scan(self):
new_explist = yield from _scan_experiments()
_sync_explist(self.explist, new_explist)