Skip to content

Commit 23a274c

Browse files
committed
diff: add support for node type changes
Do not blindly assume that changing the node type is the same than removing and creating a new node. It may be useful to know that only the node type has changed. Signed-off-by: Robin Jarry <robin@jarry.cc>
1 parent 935cd65 commit 23a274c

3 files changed

Lines changed: 14 additions & 9 deletions

File tree

libyang/diff.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ class MandatoryRemoved(SNodeAttributeChanged): pass
131131
class MandatoryAdded(SNodeAttributeChanged): pass
132132
class MustRemoved(SNodeAttributeChanged): pass
133133
class MustAdded(SNodeAttributeChanged): pass
134+
class NodeTypeAdded(SNodeAttributeChanged): pass
135+
class NodeTypeRemoved(SNodeAttributeChanged): pass
134136
class RangeRemoved(SNodeAttributeChanged): pass
135137
class RangeAdded(SNodeAttributeChanged): pass
136138
class OrderedByUserRemoved(SNodeAttributeChanged): pass
@@ -151,11 +153,8 @@ class UnitsAdded(SNodeAttributeChanged): pass # noqa: E302, E701
151153
def snode_changes(old, new):
152154

153155
if old.nodetype() != new.nodetype():
154-
# Changing node type is almost the same as removing and creating a new
155-
# node in the schema.
156-
yield SNodeRemoved(old)
157-
yield SNodeAdded(new)
158-
return
156+
yield NodeTypeRemoved(old, new, old.keyword())
157+
yield NodeTypeAdded(old, new, new.keyword())
159158

160159
if old.description() != new.description():
161160
if old.description() is not None:

tests/test_diff.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from libyang import Context
88
from libyang.diff import BaseTypeAdded
99
from libyang.diff import BaseTypeRemoved
10+
from libyang.diff import NodeTypeAdded
11+
from libyang.diff import NodeTypeRemoved
1012
from libyang.diff import StatusAdded
1113
from libyang.diff import StatusRemoved
1214
from libyang.diff import schema_diff
@@ -24,13 +26,17 @@ class DiffTest(unittest.TestCase):
2426
(BaseTypeAdded, '/yolo-system:state/yolo-system:speed'),
2527
(BaseTypeRemoved, '/yolo-system:conf/yolo-system:speed'),
2628
(BaseTypeRemoved, '/yolo-system:state/yolo-system:speed'),
29+
(NodeTypeAdded, '/yolo-system:conf/yolo-system:number'),
30+
(NodeTypeAdded, '/yolo-system:state/yolo-system:number'),
31+
(NodeTypeRemoved, '/yolo-system:conf/yolo-system:number'),
32+
(NodeTypeRemoved, '/yolo-system:state/yolo-system:number'),
2733
(StatusAdded, '/yolo-system:conf/yolo-system:deprecated-leaf'),
28-
(StatusRemoved, '/yolo-system:conf/yolo-system:deprecated-leaf'),
2934
(StatusAdded, '/yolo-system:conf/yolo-system:obsolete-leaf'),
30-
(StatusRemoved, '/yolo-system:conf/yolo-system:obsolete-leaf'),
3135
(StatusAdded, '/yolo-system:state/yolo-system:deprecated-leaf'),
32-
(StatusRemoved, '/yolo-system:state/yolo-system:deprecated-leaf'),
3336
(StatusAdded, '/yolo-system:state/yolo-system:obsolete-leaf'),
37+
(StatusRemoved, '/yolo-system:conf/yolo-system:deprecated-leaf'),
38+
(StatusRemoved, '/yolo-system:conf/yolo-system:obsolete-leaf'),
39+
(StatusRemoved, '/yolo-system:state/yolo-system:deprecated-leaf'),
3440
(StatusRemoved, '/yolo-system:state/yolo-system:obsolete-leaf'),
3541
))
3642

tests/yang-old/yolo/yolo-system.yang

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ module yolo-system {
7070
}
7171
}
7272

73-
leaf-list number {
73+
leaf number {
7474
description
7575
"A number.";
7676
type types:number;

0 commit comments

Comments
 (0)