Skip to content

Commit

Permalink
data: add add_defaults module option
Browse files Browse the repository at this point in the history
This patch adds ability for user to restrict adding off implicit default
values based on specified module

Signed-off-by: Stefan Gula <steweg@gmail.com>
  • Loading branch information
steweg committed Mar 8, 2024
1 parent ec6b19d commit 84cbef5
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
1 change: 1 addition & 0 deletions cffi/cdefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,7 @@ LY_ERR lyd_merge_module(struct lyd_node **, const struct lyd_node *, const struc
#define LYD_IMPLICIT_NO_DEFAULTS ...

LY_ERR lyd_new_implicit_tree(struct lyd_node *, uint32_t, struct lyd_node **);
LY_ERR lyd_new_implicit_module(struct lyd_node **, const struct lys_module *, uint32_t, struct lyd_node **);
LY_ERR lyd_new_implicit_all(struct lyd_node **, const struct ly_ctx *, uint32_t, struct lyd_node **);

LY_ERR lyd_new_meta(const struct ly_ctx *, struct lyd_node *, const struct lys_module *, const char *, const char *, uint32_t, struct lyd_meta **);
Expand Down
11 changes: 10 additions & 1 deletion libyang/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ def add_defaults(
no_state: bool = False,
output: bool = False,
only_node: bool = False,
module: Optional[Module] = None,
):
flags = implicit_flags(
no_config=no_config,
Expand All @@ -412,7 +413,15 @@ def add_defaults(
else:
node_p = ffi.new("struct lyd_node **")
node_p[0] = self.cdata
ret = lib.lyd_new_implicit_all(node_p, self.context.cdata, flags, ffi.NULL)
if module is not None:
ret = lib.lyd_new_implicit_module(
node_p, module.cdata, flags, ffi.NULL
)
else:
ret = lib.lyd_new_implicit_all(
node_p, self.context.cdata, flags, ffi.NULL
)

if ret != lib.LY_SUCCESS:
raise self.context.error("cannot get module")

Expand Down
22 changes: 18 additions & 4 deletions tests/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -897,7 +897,8 @@ def test_find_all(self):
dnode.free()

def test_add_defaults(self):
JSON = '{"yolo-nodetypes:records": [{"id": "rec1"}]}'
JSON = """{"yolo-nodetypes:records": [{"id": "rec1"}],
"yolo-nodetypes:conf": {}}"""
dnode = self.ctx.parse_data_mem(
JSON, "json", validate_present=True, parse_only=True
)
Expand All @@ -906,14 +907,27 @@ def test_add_defaults(self):
self.assertIsInstance(node, DLeaf)
node = dnode.find_one("name")
self.assertIsNone(node)
node = dnode.find_one("/yolo-system:conf/speed")
self.assertIsNone(node)

dnode.add_defaults(only_node=True)
node = dnode.find_one("name")
self.assertIsInstance(node, DLeaf)
self.assertEqual(node.value(), "ASD")
node = dnode.find_path("/yolo-nodetypes:conf/speed")
node = dnode.find_one("/yolo-nodetypes:conf/percentage")
self.assertIsNone(node)
dnode.add_defaults(only_node=False)
node = dnode.find_path("/yolo-system:conf/speed")
node = dnode.find_one("/yolo-system:conf/speed")
self.assertIsNone(node)

dnode.add_defaults(module=dnode.module())
node = dnode.find_one("/yolo-nodetypes:conf/percentage")
self.assertIsInstance(node, DLeaf)
self.assertEqual(node.value(), 10.2)
node = dnode.find_one("/yolo-system:conf/speed")
self.assertIsNone(node)

dnode.add_defaults()
node = dnode.find_one("/yolo-system:conf/speed")
self.assertIsInstance(node, DLeaf)
self.assertEqual(node.value(), 4321)

Expand Down

0 comments on commit 84cbef5

Please sign in to comment.