def test_can_import_from_same_level(self): m1_name, m2_name = "mod1", "mod2" with create_modules(m1_name, m2_name) as mods: with mods[m2_name].open("a") as fp: print(f"from {m1_name} import _MODULE_NAME as _M1_NAME", file=fp) mod1 = tools.file_import(str(mods[m1_name])) mod2 = tools.file_import(str(mods[m2_name])) self.assertEqual(mod2._M1_NAME, mod1._MODULE_NAME)
def examine(device_mgr, dataset_mgr, file): previous_keys = set(sys.modules.keys()) try: module = tools.file_import(file) for class_name, exp_class in inspect.getmembers( module, is_public_experiment): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.strip().splitlines()[0].strip() if name[-1] == ".": name = name[:-1] argument_mgr = TraceArgumentManager() scheduler_defaults = {} cls = exp_class( # noqa: F841 (fill argument_mgr) (device_mgr, dataset_mgr, argument_mgr, scheduler_defaults)) arginfo = OrderedDict( (k, (proc.describe(), group, tooltip)) for k, (proc, group, tooltip) in argument_mgr.requested_args.items()) argument_ui = None if hasattr(exp_class, "argument_ui"): argument_ui = exp_class.argument_ui register_experiment(class_name, name, arginfo, argument_ui, scheduler_defaults) finally: new_keys = set(sys.modules.keys()) for key in new_keys - previous_keys: del sys.modules[key]
def examine(device_mgr, dataset_mgr, file): previous_keys = set(sys.modules.keys()) try: module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.strip().splitlines()[0].strip() if name[-1] == ".": name = name[:-1] argument_mgr = TraceArgumentManager() scheduler_defaults = {} cls = exp_class((device_mgr, dataset_mgr, argument_mgr, scheduler_defaults)) arginfo = OrderedDict( (k, (proc.describe(), group, tooltip)) for k, (proc, group, tooltip) in argument_mgr.requested_args.items()) register_experiment(class_name, name, arginfo, scheduler_defaults) finally: new_keys = set(sys.modules.keys()) for key in new_keys - previous_keys: del sys.modules[key]
def examine(device_mgr, dataset_mgr, file): previous_keys = set(sys.modules.keys()) try: module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.splitlines()[0].strip() if name[-1] == ".": name = name[:-1] argument_mgr = TraceArgumentManager() scheduler_defaults = {} cls = exp_class((device_mgr, dataset_mgr, argument_mgr, scheduler_defaults)) arginfo = OrderedDict( (k, (proc.describe(), group, tooltip)) for k, (proc, group, tooltip) in argument_mgr.requested_args.items()) register_experiment(class_name, name, arginfo, scheduler_defaults) finally: new_keys = set(sys.modules.keys()) for key in new_keys - previous_keys: del sys.modules[key]
def device_db_from_file(filename): mod = file_import(filename) # use __dict__ instead of direct attribute access # for backwards compatibility of the exception interface # (raise KeyError and not AttributeError if device_db is missing) return mod.__dict__["device_db"]
def test_multiple_experiments(self): with create_modules(MODNAME) as mods: with mods[MODNAME].open("a") as fp: print( """ from artiq.experiment import * class Exp1(EnvExperiment): pass class Exp2(EnvExperiment): pass """, file=fp, ) mod = tools.file_import(str(mods[MODNAME])) # by class name self.assertIs(mod.Exp1, tools.get_experiment(mod, "Exp1")) self.assertIs(mod.Exp2, tools.get_experiment(mod, "Exp2")) # by elimination should fail with self.assertRaises(ValueError): tools.get_experiment(mod)
def get_exp(file, class_name): module = file_import(file) if class_name is None: exps = [v for k, v in module.__dict__.items() if is_experiment(v)] if len(exps) != 1: raise ValueError("Found {} experiments in module".format( len(exps))) return exps[0] else: return getattr(module, class_name)
def get_exp(file, class_name): module = file_import(file, prefix="artiq_worker_") if class_name is None: exps = [v for k, v in module.__dict__.items() if is_experiment(v)] if len(exps) != 1: raise ValueError("Found {} experiments in module" .format(len(exps))) return exps[0] else: return getattr(module, class_name)
def get_unit(file, unit): module = file_import(file) if unit is None: units = [ v for k, v in module.__dict__.items() if k[0] != "_" and isclass(v) and issubclass(v, AutoDB) and v is not AutoDB ] if len(units) != 1: raise ValueError("Found {} units in module".format(len(units))) return units[0] else: return getattr(module, unit)
def main(): args = get_argparser().parse_args() ddb = FlatFileDB(args.ddb) pdb = FlatFileDB(args.pdb) pdb.hooks.append(SimpleParamLogger()) rdb = ResultDB(set()) dbh = DBHub(ddb, pdb, rdb) try: if args.elf: if args.arguments: print("Run arguments are not supported in ELF mode") sys.exit(1) unit_inst = ELFRunner(dps) unit_inst.run(args.file) else: module = file_import(args.file) if args.unit is None: units = [(k, v) for k, v in module.__dict__.items() if k[0] != "_" and isclass(v) and issubclass(v, AutoDB) and v is not AutoDB] l = len(units) if l == 0: print("No units found in module") sys.exit(1) elif l > 1: print("More than one unit found in module:") for k, v in sorted(units, key=itemgetter(0)): print(" " + k) print("Use -u to specify which unit to use.") sys.exit(1) else: unit = units[0][1] else: unit = getattr(module, args.unit) try: arguments = _parse_arguments(args.arguments) except: print("Failed to parse run arguments") sys.exit(1) unit_inst = unit(dbh, **arguments) unit_inst.run() if rdb.data.read or rdb.realtime_data.read: print("Results:") for k, v in chain(rdb.realtime_data.read.items(), rdb.data.read.items()): print("{}: {}".format(k, v)) finally: dbh.close()
def test_fail_hidden_experiment(self): with create_modules(MODNAME) as mods: with mods[MODNAME].open("a") as fp: print( """ from artiq.experiment import * class _Exp1(EnvExperiment): pass """, file=fp, ) mod = tools.file_import(str(mods[MODNAME])) with self.assertRaises(ValueError): tools.get_experiment(mod)
def examine(device_mgr, dataset_mgr, file): module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.splitlines()[0].strip() if name[-1] == ".": name = name[:-1] exp_inst = exp_class(device_mgr, dataset_mgr, default_arg_none=True) arguments = [(k, (proc.describe(), group)) for k, (proc, group) in exp_inst.requested_args.items()] register_experiment(class_name, name, arguments)
def examine(dmgr, pdb, rdb, file): module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.splitlines()[0].strip() if name[-1] == ".": name = name[:-1] exp_inst = exp_class(dmgr, pdb, rdb, default_arg_none=True) arguments = [(k, (proc.describe(), group)) for k, (proc, group) in exp_inst.requested_args.items()] register_experiment(class_name, name, arguments)
def examine(device_mgr, dataset_mgr, file): module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.splitlines()[0].strip() if name[-1] == ".": name = name[:-1] argument_mgr = TraceArgumentManager() exp_inst = exp_class((device_mgr, dataset_mgr, argument_mgr)) arginfo = OrderedDict( (k, (proc.describe(), group)) for k, (proc, group) in argument_mgr.requested_args.items()) register_experiment(class_name, name, arginfo)
def examine(device_mgr, dataset_mgr, file): module = file_import(file) for class_name, exp_class in module.__dict__.items(): if class_name[0] == "_": continue if is_experiment(exp_class): if exp_class.__doc__ is None: name = class_name else: name = exp_class.__doc__.splitlines()[0].strip() if name[-1] == ".": name = name[:-1] argument_mgr = TraceArgumentManager() exp_class((device_mgr, dataset_mgr, argument_mgr)) arginfo = OrderedDict( (k, (proc.describe(), group, tooltip)) for k, (proc, group, tooltip) in argument_mgr.requested_args.items()) register_experiment(class_name, name, arginfo)
def test_single_experiment(self): with create_modules(MODNAME) as mods: with mods[MODNAME].open("a") as fp: print( """ from artiq.experiment import * class Exp1(EnvExperiment): pass """, file=fp, ) mod = tools.file_import(str(mods[MODNAME])) # by class name self.assertIs(mod.Exp1, tools.get_experiment(mod, "Exp1")) # by elimination self.assertIs(mod.Exp1, tools.get_experiment(mod))
def test_fail_no_experiments(self): with create_modules(MODNAME) as mods: mod = tools.file_import(str(mods[MODNAME])) with self.assertRaises(ValueError): tools.get_experiment(mod)
def test_get_ddb(self): ddb = self.ddb.get_device_db() raw = file_import(self.ddb_file.name).device_db self.assertEqual(ddb, raw)
def get_experiment_from_file(file, class_name): module = tools.file_import(file, prefix="artiq_worker_") return tools.get_experiment(module, class_name)
def test_can_import_not_in_source_suffixes(self): for extension in ["", ".something"]: self.assertNotIn(extension, importlib.machinery.SOURCE_SUFFIXES) with create_modules(MODNAME, extension=extension) as mods: mod = tools.file_import(str(mods[MODNAME])) self.assertEqual(Path(mod.__file__).name, f"{MODNAME}{extension}")
def test_import_and_prefix_is_present(self): prefix = "prefix_" with create_modules(MODNAME) as mods: mod = tools.file_import(str(mods[MODNAME]), prefix=prefix) self.assertEqual(prefix + MODNAME, mod.__name__)