def test_unregistered_assign(): # test with bare target registry glommer = Glommer(register_default_types=False) with pytest.raises(UnregisteredTarget, match='assign'): glommer.glom({}, Assign('a', 'b')) # test for unassignable tuple with pytest.raises(UnregisteredTarget, match='assign'): glom({'a': ()}, Assign('a.0', 'b'))
def update_inplace(_conf: Dict, path: _Path_t) -> Dict: """Invoke the bound function to reassign matching items FIXME: possibly this can be simplified using functools.partial """ glom_spec = _path_to_glom_spec(path) _config_t = Spec(Invoke(func).constants(path[-1]).specs(glom_spec)) return glom(_conf, Assign(_path_to_glom_spec(path), _config_t))
def set_data(obj: Dict, value: Union[Dict, List, str], *path: str) -> None: """ Update data from the object with given value. e.g: dependencies.cuda."11.3.1" """ try: _ = glom(obj, Assign(Path(*path), value)) except PathAssignError: log.exception("Exception occurred in " "update_data, unable to update " f"{Path(*path)} with {value}") exit(1)
def from_yaml(cls, yaml_path: Union[str, Path]) -> _ConfigIO: # FIXME: type checking is ignored for the return statement because mypy # doesn't seem to know this is an abstract base class, and the argument # unpacking makes sense when instantiating any of the derived classes. # read in the config conf = read_yaml(yaml_path) # apply all transformations as stored in the cls for path, trans in cls.trans_dict.items(): glom(conf, Assign(path, Spec((path, trans)))) return cls(**conf) # type: ignore
def test_bad_assign_target(): class BadTarget(object): def __setattr__(self, name, val): raise Exception("and you trusted me?") # sanity check spec = Assign('a', 'b') ok_target = lambda: None glom(ok_target, spec) assert ok_target.a == 'b' with pytest.raises(PathAssignError, match='could not assign'): glom(BadTarget(), spec) with pytest.raises(PathAccessError, match='could not access'): assign({}, 'a.b.c', 'moot') return
def test_assign(): class Foo(object): pass assert glom({}, Assign(T['a'], 1)) == {'a': 1} assert glom({'a': {}}, Assign(T['a']['a'], 1)) == {'a': {'a': 1}} assert glom({'a': {}}, Assign('a.a', 1)) == {'a': {'a': 1}} assert glom(Foo(), Assign(T.a, 1)).a == 1 assert glom({}, Assign('a', 1)) == {'a': 1} assert glom(Foo(), Assign('a', 1)).a == 1 assert glom({'a': Foo()}, Assign('a.a', 1))['a'].a == 1 def r(): r = {} r['r'] = r return r assert glom(r(), Assign('r.r.r.r.r.r.r.r.r', 1)) == {'r': 1} assert glom(r(), Assign(T['r']['r']['r']['r'], 1)) == {'r': 1} assert glom(r(), Assign(Path('r', 'r', T['r']), 1)) == {'r': 1} assert assign(r(), Path('r', 'r', T['r']), 1) == {'r': 1} with pytest.raises(TypeError, match='path argument must be'): Assign(1, 'a') with pytest.raises(ValueError, match='path must have at least one element'): Assign(T, 1) assert repr(Assign(T.a, 1)) == 'Assign(T.a, 1)' assign_spec = Assign(T.a, 1, missing=dict) assert repr(assign_spec) == "Assign(T.a, 1, missing=dict)" assert repr(assign_spec) == repr(eval(repr(assign_spec)))
def test_assign_spec_val(): output = glom({'b': 'c'}, Assign('a', Spec('b'))) assert output['a'] == output['b'] == 'c'
def test_s_assign(): ''' check that assign works when storing things into S ''' glom({}, (Assign(S['foo'], 'bar'), S['foo'])) == 'bar'