Skip to content

Commit adab39c

Browse files
stewegsamuel-gauthier
authored andcommitted
schema: adding parent_node API to extensions
This patch adds parent_node API, which allows caller to get parent PNode from PExtension or SNode from Extension instance. Signed-off-by: Stefan Gula <[email protected]> Signed-off-by: Samuel Gauthier <[email protected]>
1 parent 8d64c70 commit adab39c

File tree

4 files changed

+26
-0
lines changed

4 files changed

+26
-0
lines changed

cffi/cdefs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ enum ly_stmt {
174174
LY_STMT_ARG_VALUE
175175
};
176176

177+
#define LY_STMT_NODE_MASK ...
178+
177179
#define LY_LOLOG ...
178180
#define LY_LOSTORE ...
179181
#define LY_LOSTORE_LAST ...

libyang/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
from .log import configure_logging
6868
from .schema import (
6969
Extension,
70+
ExtensionParsed,
7071
Feature,
7172
IfAndFeatures,
7273
IfFeature,

libyang/schema.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,14 @@ def name(self) -> str:
411411
def module(self) -> Module:
412412
return self._module_from_parsed()
413413

414+
def parent_node(self) -> Optional["PNode"]:
415+
if not bool(self.cdata.parent_stmt & lib.LY_STMT_NODE_MASK):
416+
return None
417+
try:
418+
return PNode.new(self.context, self.cdata.parent, self.module())
419+
except LibyangError:
420+
return None
421+
414422

415423
# -------------------------------------------------------------------------------------
416424
class ExtensionCompiled(Extension):
@@ -428,6 +436,14 @@ def module(self) -> Module:
428436
raise self.context.error("cannot get module")
429437
return Module(self.context, self.cdata_def.module)
430438

439+
def parent_node(self) -> Optional["SNode"]:
440+
if not bool(self.cdata.parent_stmt & lib.LY_STMT_NODE_MASK):
441+
return None
442+
try:
443+
return SNode.new(self.context, self.cdata.parent)
444+
except LibyangError:
445+
return None
446+
431447

432448
# -------------------------------------------------------------------------------------
433449
class _EnumBit:

tests/test_schema.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from libyang import (
88
Context,
99
Extension,
10+
ExtensionParsed,
1011
IfFeature,
1112
IfOrFeatures,
1213
IOType,
@@ -496,6 +497,11 @@ def test_rpc_extensions(self):
496497
self.assertEqual(len(ext), 1)
497498
ext = self.rpc.get_extension("require-admin", prefix="omg-extensions")
498499
self.assertIsInstance(ext, Extension)
500+
self.assertIsInstance(ext.parent_node(), SRpc)
501+
parsed = self.rpc.parsed()
502+
ext = parsed.get_extension("require-admin", prefix="omg-extensions")
503+
self.assertIsInstance(ext, ExtensionParsed)
504+
self.assertIsInstance(ext.parent_node(), PAction)
499505

500506
def test_rpc_params(self):
501507
leaf = next(self.rpc.children())
@@ -609,6 +615,7 @@ def test_leaf_type_extensions(self):
609615
"type-desc", prefix="omg-extensions", arg_value="<protocol>"
610616
)
611617
self.assertIsInstance(ext, Extension)
618+
self.assertIsNone(ext.parent_node())
612619

613620
def test_leaf_type_enum(self):
614621
leaf = next(

0 commit comments

Comments
 (0)