def _interpret(self, op, evaluator, element, is_evaluating): parts = op.split('.') if len(parts) == 1: cmd = 'function' else: cmd = parts.pop(0) name, _ = GetPrefix.get_prefix(self.table, cmd) name = getattr(Names, name.upper()) if name == Names.CONFIGURATION: from echomesh.base import Config # TODO: Why can't this import be at the top? Does it even work?! return is_evaluating and Config.get(*parts) if name == Names.FUNCTION: return (is_evaluating and self.functions.get('.'.join(parts))(evaluator())) if name == Names.SYSTEM: func, is_constant = self.system.get('.'.join(parts)) if not is_evaluating: return is_constant elif name in ELEMENT_NAMES: func = Locator.get_variable(element, Names.reverse(name).lower(), parts) else: raise Exception("Shouldn't get here.") return Call.call(func) if is_evaluating else func.is_constant()
def entry(self, name): try: entry = GetPrefix.get_prefix( self._registry, name, allow_prefixes=self.allow_prefixes)[1] entry.resolve_function() return entry except: add_exception_suffix(' in registry "%s"' % self.name)
def _assignment_to_config(self, args, error): args = ' '.join(args) config = {} base_config = self.file_configs[0][1][0] assert isinstance(base_config, dict) try: split_args = Args.split(args) except Exception as e: e.arg = '%s %s' % (error, args) raise for addr, value in split_args: try: GetPrefix.set_assignment(addr, value, base_config, config, unmapped_names=Merge.CONFIG_EXCEPTIONS) except GetPrefix.PrefixException: raise Exception('Can\'t understand configuration address "%s"' % addr) except Exception: raise Exception('Can\'t understand configuration value "%s" in %s=%s' % (value, addr, value)) return config
def _args_to_settings(self, args, error): args = ' '.join(args) settings = {} base_settings = self.file_settings[0][1][0] assert isinstance(base_settings, dict) try: split_args = Args.split(args) except Exception as e: e.arg = '%s %s' % (error, args) raise for addr, value in split_args: try: GetPrefix.set_assignment( addr, value, base_settings, settings, unmapped_keys=Merge.SETTINGS_EXCEPTIONS) except GetPrefix.PrefixException: raise Exception('Can\'t understand settings address "%s"' % addr) except Exception: raise Exception( 'Can\'t understand settings value "%s" in %s=%s' % (value, addr, value)) return settings
def merge_assignments(config, assignments): results = [] for address, value in assignments: try: cfg, changes = config, LOCAL_CHANGES path = [] for i, field in enumerate(address): k, v = GetPrefix.get_prefix(cfg, field) path.append(k) if i < len(address) - 1: cfg = v changes = changes.setdefault(k, {}) else: cfg[k] = changes[k] = value results.append([path, value]) except GetPrefix.PrefixException: raise Exception('Configuration variable "%s" doesn\'t exist' % '.'.join(address)) return results
def test_assignment_prefix(self): GetPrefix.set_assignment('f.b.b', 19, MASTER, self.slave) self.assertEqual(self.slave, {'foo': {'bar': {'baz': 19}}})
def test_many_prefixes(self): try: GetPrefix.get_prefix(TABLE, 't') except Exception as e: self.assertEqual(str(e), '"t" matches more than one: three and two')
def test_no_prefix(self): self.assertEqual(GetPrefix.get_prefix(TABLE, 'one', allow_prefixes=False), ('one', 1))
def test_prefix_dict(self): pdict = GetPrefix.PrefixDict(TABLE) self.assertEqual(pdict['o'], 1) with self.assertRaises(GetPrefix.PrefixException) as cm: GetPrefix.get_prefix(TABLE, 'x') self.assertEqual(str(cm.exception), '"x" is not valid')
def test_assignment(self): GetPrefix.set_assignment('foo.bar.baz', 32, MASTER, self.slave) self.assertEqual(self.slave, {'foo': {'bar': {'baz': 32}}})
def test_prefix(self): self.assertEqual(GetPrefix.get_prefix(TABLE, 'o'), ('one', 1))
def get_prefix(self, name): return GetPrefix.get_prefix(self.elements, name)
def get_prefix(self, *args): try: return GetPrefix.get_prefix(self, *args) except GetPrefix.PrefixException: return None
def get(self, name, allow_prefixes=True): return GetPrefix.get_prefix(self.__dict__, name.upper(), allow_prefixes=allow_prefixes)
def get_prefix(self, *args): return GetPrefix.get(self, *args)
def assertException(self, key, message, allow_prefixes=True): with self.assertRaises(GetPrefix.PrefixException) as cm: GetPrefix.get_prefix(TABLE, key, allow_prefixes=allow_prefixes) self.assertEqual(str(cm.exception), message)
def _get(self, name): return GetPrefix.get_prefix(self.registry, name, allow_prefixes=self.allow_prefixes)
def test_no_prefix(self): self.assertEqual( GetPrefix.get_prefix(TABLE, 'one', allow_prefixes=False), ('one', 1))
def get_or_none(self, name, allow_prefixes=None): if allow_prefixes is None: allow_prefixes = self.allow_prefixes return GetPrefix.get(self.registry, name, allow_prefixes)
def test_no_prefix2(self): try: GetPrefix.get_prefix(TABLE, 'x', allow_prefixes=False) except Exception as e: self.assertEqual(str(e), '"x" is not valid')
def test_assignment_unmapped(self): GetPrefix.set_assignment('new.foo', 23, MASTER, self.slave, unmapped_names=set(['new'])) self.assertEqual(self.slave, {'new': {'foo': 23}})
def entry(self, name): try: return GetPrefix.get_prefix(self._registry, name, allow_prefixes=self.allow_prefixes)[1] except: add_exception_suffix(' in registry "%s"' % self.name)