def test_resolve_path_empty_path(): doc = {} path = "" assert resolve_path(doc, path) == doc doc = {"foo": 1} assert resolve_path(doc, path) == doc
def test_update_paths_df_concat(axis): df = pd.DataFrame({"A": [1, 2]}) _orig_doc = { # for when debugging "a": { "aa": df, "ab": 2, "ac": {"aca": df}, }, } doc = { "a": { "aa": df, "ab": 2, "ac": {"aca": df}, }, } val1 = _mutate_df(df) val2 = _mutate_df(val1) path_values = [ ("a/aa/H", val1), ("a/ac/aca/.", val2), ("a/aa/H", val2), # double setting ("a/ab", val2), ] exp_aa = pd.concat((df, val1), axis=axis) exp_aa = pd.concat((exp_aa, val2), axis=axis) exp_aca = pd.concat((df, val2), axis=axis) update_paths(doc, path_values, concat_axis=axis) print(doc) check_dfs_eq(resolve_path(doc, "a/ab"), val2) check_dfs_eq(resolve_path(doc, "/a/ac/aca"), exp_aca) check_dfs_eq(resolve_path(doc, "a/aa"), exp_aa)
def test_set_path_sequence_insert_end(): doc = [0, 1] path = "/2" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert resolve_path(doc, "/0") == 0 assert resolve_path(doc, "/1") == 1
def test_set_path_append_path_preserves_intermediate(): doc = {"foo": {"bar": 1}, 1: 2} path = "/foo/foo2" value = "value" set_path_value(doc, path, value) print(doc) assert resolve_path(doc, path) == value assert doc[1] == 2 assert resolve_path(doc, "/foo/bar") == 1
def test_resolve_root_path_only(): doc = {} path = "/" assert resolve_path(doc, path) == doc doc = {"foo": 1} assert resolve_path(doc, path) == doc doc = {"": 1} assert resolve_path(doc, path) == doc
def test_set_path_deepen_sequence_scalar_item(): doc = [1, 2] path = "/1" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value doc = [1, 2] path = "/1/foo/bar" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value
def test_set_path_empty_doc(): doc = {} path = "/foo" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc == {"foo": "value"} doc = {} path = "/foo/bar" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value
def test_resolve_path_sequence(): doc = [1, [22, 33]] path = "/0" assert resolve_path(doc, path) == 1 path = "/1" assert resolve_path(doc, path) == [22, 33] path = "/1/0" assert resolve_path(doc, path) == 22 path = "/1/1" assert resolve_path(doc, path) == 33
def test_set_path_deepen_map_int_value(): doc = {"foo": 1, 1: 2} path = "/foo/bar" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc[1] == 2 doc = {"foo": 1, 1: 2} path = "/foo/bar/some/other" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc[1] == 2
def test_update_paths_df_concat(axis): df = pd.DataFrame({"A": [1, 2]}) df_ax_named = df.copy() axis_names = ["l1"] df_ax_named.axes[axis].names = axis_names _orig_doc = { # for when debugging "a": { "aa": df, "ab": 2, "ac": {"aca": df_ax_named}, }, } doc = { "a": { "aa": df, "ab": 2, "ac": { "aca": df_ax_named }, }, } val1 = _mutate_df(df) val2 = _mutate_df(val1) val1.axes[axis].names = axis_names path_values = [ ("a/aa/H", val1), ("a/ac/aca/.", val2), ("a/aa/H", val2), # double setting ("a/ab", val2), ] exp_aa = pd.concat((df, val1, val2), axis=axis) exp_aa.axes[axis].names = axis_names exp_aca = pd.concat((df, val2), axis=axis) exp_aca.axes[axis].names = axis_names update_paths(doc, path_values, concat_axis=axis) print(doc) check_dfs_eq(resolve_path(doc, "a/ab"), val2) check_dfs_eq(resolve_path(doc, "/a/ac/aca"), exp_aca) check_dfs_eq(resolve_path(doc, "a/aa"), exp_aa)
def test_set_path_replace_value(): doc = {"foo": "bar", 1: 2} path = "/foo" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc[1] == 2 doc = {"foo": 1, 1: 2} path = "/foo" value = "value" set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc[1] == 2 doc = {"foo": {"bar": 1}, 1: 2} path = "/foo" value = 2 set_path_value(doc, path, value) assert resolve_path(doc, path) == value assert doc[1] == 2
def test_resolve_path_re_root(inp, exp): doc = {"foo": 1, "bar": [11, {"a": 222}]} assert resolve_path(doc, inp) == doc if exp is ... else exp
def test_resolve_path_examples_from_spec(std_doc, std_case): path, exp = std_case assert resolve_path(std_doc, path) == exp
def test_resolve_path_missing_screams(): doc = {} path = "/foo" with pytest.raises(ResolveError): resolve_path(doc, path)
def test_resolve_simple(inp, exp): doc = {"foo": 1, "bar": [11, {"a": 222}]} assert resolve_path(doc, inp) == exp