Skip to content

Commit 25d7de8

Browse files
stewegsamuel-gauthier
authored andcommitted
data: add add_defaults module option
This patch adds ability for user to restrict adding off implicit default values based on specified module. Closes: #110 Signed-off-by: Stefan Gula <[email protected]> Signed-off-by: Samuel Gauthier <[email protected]>
1 parent a3132f8 commit 25d7de8

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

cffi/cdefs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,6 +1189,7 @@ LY_ERR lyd_merge_module(struct lyd_node **, const struct lyd_node *, const struc
11891189
#define LYD_IMPLICIT_NO_DEFAULTS ...
11901190

11911191
LY_ERR lyd_new_implicit_tree(struct lyd_node *, uint32_t, struct lyd_node **);
1192+
LY_ERR lyd_new_implicit_module(struct lyd_node **, const struct lys_module *, uint32_t, struct lyd_node **);
11921193
LY_ERR lyd_new_implicit_all(struct lyd_node **, const struct ly_ctx *, uint32_t, struct lyd_node **);
11931194

11941195
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 **);

libyang/data.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ def add_defaults(
340340
no_state: bool = False,
341341
output: bool = False,
342342
only_node: bool = False,
343+
only_module: Optional[Module] = None,
343344
):
344345
flags = implicit_flags(
345346
no_config=no_config,
@@ -353,7 +354,15 @@ def add_defaults(
353354
else:
354355
node_p = ffi.new("struct lyd_node **")
355356
node_p[0] = self.cdata
356-
ret = lib.lyd_new_implicit_all(node_p, self.context.cdata, flags, ffi.NULL)
357+
if only_module is not None:
358+
ret = lib.lyd_new_implicit_module(
359+
node_p, only_module.cdata, flags, ffi.NULL
360+
)
361+
else:
362+
ret = lib.lyd_new_implicit_all(
363+
node_p, self.context.cdata, flags, ffi.NULL
364+
)
365+
357366
if ret != lib.LY_SUCCESS:
358367
raise self.context.error("cannot get module")
359368

tests/test_data.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ def test_find_all(self):
897897
dnode.free()
898898

899899
def test_add_defaults(self):
900-
JSON = '{"yolo-nodetypes:records": [{"id": "rec1"}]}'
900+
JSON = '{"yolo-nodetypes:records": [{"id": "rec1"}], "yolo-nodetypes:conf": {}}'
901901
dnode = self.ctx.parse_data_mem(
902902
JSON, "json", validate_present=True, parse_only=True
903903
)
@@ -906,12 +906,25 @@ def test_add_defaults(self):
906906
self.assertIsInstance(node, DLeaf)
907907
node = dnode.find_one("name")
908908
self.assertIsNone(node)
909+
node = dnode.find_one("/yolo-system:conf/speed")
910+
self.assertIsNone(node)
911+
909912
dnode.add_defaults(only_node=True)
910913
node = dnode.find_one("name")
911914
self.assertIsInstance(node, DLeaf)
912915
self.assertEqual(node.value(), "ASD")
913-
node = dnode.find_path("/yolo-nodetypes:conf/speed")
916+
node = dnode.find_one("/yolo-nodetypes:conf/percentage")
914917
self.assertIsNone(node)
918+
node = dnode.find_one("/yolo-system:conf/speed")
919+
self.assertIsNone(node)
920+
921+
dnode.add_defaults(only_module=dnode.module())
922+
node = dnode.find_one("/yolo-nodetypes:conf/percentage")
923+
self.assertIsInstance(node, DLeaf)
924+
self.assertEqual(node.value(), 10.2)
925+
node = dnode.find_one("/yolo-system:conf/speed")
926+
self.assertIsNone(node)
927+
915928
dnode.add_defaults(only_node=False)
916929
node = dnode.find_path("/yolo-system:conf/speed")
917930
self.assertIsInstance(node, DLeaf)

0 commit comments

Comments
 (0)