Coverage for src/robotide/controller/basecontroller.py: 100%
102 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-06 10:40 +0100
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-06 10:40 +0100
1# Copyright 2008-2015 Nokia Networks
2# Copyright 2016- Robot Framework Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
16from ..publish.messages import RideModificationPrevented 1ab
19class _BaseController(object): 1ab
21 @property 1ab
22 def display_name(self): 1ab
23 return self.data.name 2a 1c2c!cUcVc.d/d:d
25 def execute(self, command): 1ab
26 if not command.modifying or self.is_modifiable(): 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' ;dy }cVbWbXbz BbCb( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD ~cfcgchcicjckcT q r adU { | ) * XeYeZe0e1ef cede} ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtbVdWd3clcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 Yct e E Xd2e3e4e5e6e7e8e9eYdeeZd!e#e$e0d%ebd=d3 4 5 ub4c5c6ccddd1dLd2d3dMdNd4d5dGd6dOdPd7dF G H I J l m n o p K L M u N O P g h Q HdfegeheieIdjeke?dlemeneoevbUbwb+ i j k v w x :c;c=c?c@c[c]c!cZc0c@d:d
27 return command.execute(self) 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' ;dy }cVbWbXbz BbCb( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD ~cfcgchcicjckcT q r adU { | ) * XeYeZe0e1ef cede} ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtbVdWd3clcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 Yct e E Xd2e4e5e6e7e8eYdeeZd!e#e0d%ebd=d3 4 5 ub4c5c6ccddd1dLd2d3dMdNd4d5dGd6dOdPd7dF G H I J l m n o p K L M u N O P g h Q HdfegeheieIdjeke?dlemeneoevbUbwb+ i j k v w x :c;c=c?c@c[c]c!cZc0c@d:d
28 else:
29 RideModificationPrevented(controller=self).publish() 2Xd3e9eYdeeZd$e0d
31 def is_modifiable(self): 1ab
32 return True 2a cedei j k v w x
34 def is_excluded(self): 1ab
35 return False 2a UcVc.d/d
38class ControllerWithParent(_BaseController): 1ab
40 @property 1ab
41 def parent(self): 1ab
42 return self._parent 2a tf1c2cy z BbCbJd[dQdRd8dufpevfedKdqe) * VdWd3cfdregd'e(e)ewf*exf+e,e-eyf.e7c8cbd4c5c6cLdMdNdGdOdPd7dl m n o p i j k v w x :c;c=c?c@c[c/e:e;e=e?e]c@e9c^cZc0c]d[e]e@d^d9d!d#d$d%d
44 def set_parent(self, new_parent): 1ab
45 self._parent = new_parent 2_cf 3 4 5 ub
47 def mark_dirty(self): 1ab
48 if self._parent: 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' 1c2chdy VbWbXbz BbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/bR :b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccS dcecD fcgchcicjckcT q r U se^e_ete`eue{evewe|e}exe~eafJd'dSdQdRdyepezebfAeBecfCeedTdDeKdEeFe{ | ) * _cidjdkdf abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtb3cfdgdlcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcTbV W X d Y Z 0 1 2 Yct e E 7c8cGeHe`c{cldIe(d)dbd3 4 5 ub4c5c6cF G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x dfefmdndod:c;c=c?c@c[c]c|cpd9c^cZc0c]dqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc.d/d9d!d#d$d%d
49 self._parent.mark_dirty() 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' 1c2chdy VbWbXbz BbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/bR :b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccS dcecD fcgchcicjckcT q r U se^e_ete`eue{evewe|e}exe~eafJd'dSdQdRdyepezebfAeBecfCeedTdDeKdEeFe{ | ) * _cidjdkdf abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtb3cfdgdlcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcTbV W X d Y Z 0 1 2 Yct e E 7c8cGeHe`c{cldIe(d)dbd3 4 5 ub4c5c6cF G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x dfefmdndod:c;c=c?c@c[c]c|cpd9c^cZc0c]dqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc.d/d9d!d#d$d%d
51 @property 1ab
52 def dirty(self): 1ab
53 return self._parent.dirty 2DbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbA B C sezfteueAfvewexeJdSd_d8dffyeBfzeAeCfBeCeedDeEeFeDfEf{ | GeHeIel m n o p
55 @property 1ab
56 def datafile_controller(self): 1ab
57 return self._parent.datafile_controller 2a *d+d, : xb; = c ? @ Ud,d[ ] ^ ybzb6 7 8 9 ! _ # $ -d- . / Ab` % ' 1c2chd;dy }cVbWbXbz BbCb( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD ~cfcgchcicjckcT q r adU Jd'dSdJe[dFfQdRd_d8dffedTdKd{ | ) * _cidjdkdf abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtb3cfdgdlcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 Yct e E 7c8c`c{cKeld(d)dXdYdZd0dbdLeMe3 4 5 ub4c5c6ccddd1dLd2d3dMdNd4d5dGd6dOdPd7dF G H I J l m n o p K L M u N O P g h Q HdIdvbUbwb+ i j k v w x mdndod:c;c=c?c@c[c/e:e;e=e?e]c@e|cpd9c^c!cZc0cNeOePeQeGfHf]d[e]egfhfifReSeTeIfUeVeWe`d{d|d}d~daebeJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0fqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc@d^d:d9d!d#d$d%d
59 @property 1ab
60 def datafile(self): 1ab
61 return self._parent.datafile 2a , : c ? Ud,dzb_ # $ -d- . / Ab% ' 1c2chdy z BbCb1fedTdKd{ | ) * _cidjdkdf V W X d Y Z 0 1 2 Yct e E 7c8c2f`c{cKeld3 4 5 ub4c5c6cu ?dwbi j k v w x mdndod|cpd9c^c!cgfhfifReSeTeUeVeWe3f4f5f6f7f8f9f!f#f$f%f'f`d(f)f*f+f,f-f.f/f:f;f=f{d|d}d~d?faebeqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc9d!d#d$d%d
63 @property 1ab
64 def datafiles(self): 1ab
65 return self._parent.datafiles 2cddd1dLd2d3dMdNd4d5dGd6dOdPdF G H I J l m n o p K L M u N O P g h Q
67 @property 1ab
68 def language(self): 1ab
69 return self._parent.datafile_controller._language 2a , : xb; = c ? @ Ud[ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' y VbWbXbz BbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/bR :b;b=b?b@b[b]b^b_b`b{b|b}b~bacbcccS dcecD fcgchcicjckcT q r U { | ) * abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcV W X d Y Z 0 1 2 t e 7c8c`c{cKe3 4 5 cdddGdF G H I J l m n o p K L M u N O P g h Q HdIdvbUb+ i j k |c9c!cReSeTeUeVeWe
71 def is_modifiable(self): 1ab
72 return self.datafile_controller.is_modifiable() 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' ;dy }cVbWbXbz BbCb( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD ~cfcgchcicjckcT q r adU { | ) * abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 Yct e E XdYdZd0d3 4 5 ub4c5c6cF G H I J l m n o p K L M u N O P g h Q :c;c=c?c@c[c]cZc0c
75class WithNamespace(object): 1ab
76 namespace = None # Ensure namespace exists 1ab
78 def _set_namespace_from(self, controller): 1ab
79 self._set_namespace(controller.namespace) 2a *d+djfkflfmfqenfVdWd3cfdregdofpfqfrf=di j k v w x
81 def _set_namespace(self, namespace): 1ab
82 self.namespace = namespace 2a *d+djf@fkflfmfqenfVdWd3cfdregdofpfqfrf=di j k v w x [fsf]f^f
84 def get_namespace(self): 1ab
85 return self.namespace 2a _f`f{f|f}f~fagbgcgdgegfgUcVcgghg
87 def update_namespace(self): 1ab
88 if not self.namespace: 2a c 6 7 8 9 ! 1c2chdy z BbCbJd'dSdJe[dQdRd_d8dedTdKd{ | ) * _cidjdkdf 3cfdgdTbV W X d Y Z 0 1 2 Yct e E 7c8c`c{cldbd3 4 5 ub4c5c6cF G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x mdndod:c;c=c?c@c[c]c|cpd9c^cZc0cqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc^d
89 return 21c2chdy z BbCbJd'dSdJe[dQdRd_d8dedTdKd{ | _cidjdkdf TbV W X d Y Z 0 1 2 Yct e E 7c8c`c{cldmdndod:c;c=c?c@c[c]c|cpd9c^cZc0cqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc
90 self.namespace.update() 2a c 6 7 8 9 ! ) * 3cfdgdbd3 4 5 ub4c5c6cF G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x ^d
92 def register_for_namespace_updates(self, listener): 1ab
93 if not self.namespace: 2a *d+dc 1c2chdy z BbCb{ | _cidjdkdf abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbV W X d Y Z 0 1 2 Yct e E 7c8c`c{c(d)dLeMe3 4 5 ubcdddF G H I J l m n o p K L M u N O P g h Q HdId+ i j k v w x mdndod|cpd9c^c!cZc0cNeOePeQe`d{d|d}d~daebeqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc
94 return 2a *d+d1c2chdy z BbCb{ | _cidjdkdf V W X d Y Z 0 1 2 Yct e E 7c8c`c{c(d)dLeMemdndod|cpd9c^cZc0cNeOePeQe`d{d|d}d~daebeqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdUcVc
95 self.namespace.register_update_listener(listener) 2a c abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtb3 4 5 ubcdddF G H I J l m n o p K L M u N O P g h Q HdId+ i j k v w x !c
97 def unregister_namespace_updates(self, listener): 1ab
98 if not self.namespace: 2c d t e E ld3 4 5 ub
99 return 2d t e E ld
100 self.namespace.unregister_update_listener(listener) 2c 3 4 5 ub
102 def clear_namespace_update_listeners(self): 1ab
103 self.namespace.clear_update_listeners()
105 def is_user_keyword(self, datafile, value): 1ab
106 return self.namespace.is_user_keyword(datafile, value) 2, : xb; = c ? @ Ud,d[ ] ^ yb6 7 8 9 ! _ # $ -d- . / ` % ' s 3 4 5 i j k
108 def is_library_keyword(self, datafile, value): 1ab
109 return self.namespace.is_library_keyword(datafile, value) 2; = c @ Ud,d[ ] ^ 6 7 8 9 ! # $ -d- . / ` % ' s i j k
111 def get_all_keywords_from(self, *datafiles): 1ab
112 return self.namespace.get_all_keywords(*datafiles)
114 def get_all_cached_library_names(self): 1ab
115 return self.namespace.get_all_cached_library_names() 2sf
117 def keyword_info(self, datafile, keyword_name): 1ab
118 return self.namespace.find_keyword(datafile, keyword_name) 2, : xb; = c ? @ Ud,d[ ] ^ ybzb6 7 8 9 ! _ # $ -d- . / Ab` % ' s 3 4 5 cddd1dLd2d3dMdNd4d5dGd6dOdPd7dF G H I J l m n o p K L M u N O P g h Q HdfegeheieIdjeke?dlemeneoevbUbwb+ i j k !c
120 def is_library_import_ok(self, imp): 1ab
121 return self.namespace.is_library_import_ok(self.datafile, imp) 2'e(e)e*e,e-e
123 def is_variables_import_ok(self, imp): 1ab
124 return self.namespace.is_variables_import_ok(self.datafile, imp) 2+e.e
127class WithUndoRedoStacks(object): 1ab
129 @property 1ab
130 def _undo(self): 1ab
131 if not hasattr(self, '_undo_stack'): 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' y }cVbWbXbz ( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD fcgchcicjckcT q r adU ) * f } ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 t e E F G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x
132 self._undo_stack = [] 2a , # $ % ' y }cVbWbXbz ( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD fcgchcicjckcT q r adU ) * f } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 t e E F G H I J l m n o p K L M u N O P g h Q vbwb+ i j k v w x
133 return self._undo_stack 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' y }cVbWbXbz ( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD fcgchcicjckcT q r adU ) * f } ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 t e E F G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x
135 @property 1ab
136 def _redo(self): 1ab
137 if not hasattr(self, '_redo_stack'): 2c ( A B C R S D ~cT q r U f } ~ s d e g h
138 self._redo_stack = [] 2~c
139 return self._redo_stack 2c ( A B C R S D ~cT q r U f } ~ s d e g h
141 def clear_undo(self): 1ab
142 self._undo_stack = [] 1{|
144 def is_undo_empty(self): 1ab
145 return self._undo == [] 2c }c( A B C R S D T q r adU f } ~ s d e g h
147 def pop_from_undo(self): 1ab
148 return self._undo.pop() 1c(ABCRSDTqrUf}~sdegh
150 def push_to_undo(self, command): 1ab
151 self._undo.append(command) 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' y VbWbXbz ( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD fcgchcicjckcT q r U ) * f } ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 t e E F G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x
153 def clear_redo(self): 1ab
154 self._redo_stack = [] 2a , : xb; = c ? @ [ ] ^ ybzb6 7 8 9 ! _ # $ - . / Ab` % ' y VbWbXbz ( DbEbFbGbHbIbJbKbLbMbNbObPbQb#cRbSbA B C YbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b$c,b-b.b/bR :b;b=b?b@b[b%c]b^b_b`b{b|b}b~bac'cbcccS dcecD fcgchcicjckcT q r U ) * f } ~ abbbcbdbebfbgbs hbibjbkblbWcmbnbobpbXcqbrbsbtblcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFcGcHcIcJcKcLc(c)c*c+cMcNcOcPcQcRcSc,c-c.c/cTcTbV W X d Y Z 0 1 2 t e E F G H I J l m n o p K L M u N O P g h Q vbUbwb+ i j k v w x
156 def is_redo_empty(self): 1ab
157 return self._redo == [] 2( D ~cq r f } ~
159 def pop_from_redo(self): 1ab
160 return self._redo.pop() 1(qrf}~
162 def push_to_redo(self, command): 1ab
163 self._redo.append(command) 1c(ABCRSDTqrUf}~sdegh