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

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. 

15 

16from ..publish.messages import RideModificationPrevented 1ab

17 

18 

19class _BaseController(object): 1ab

20 

21 @property 1ab

22 def display_name(self): 1ab

23 return self.data.name 2a 1c2c!cUcVc.d/d:d

24 

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

30 

31 def is_modifiable(self): 1ab

32 return True 2a cedei j k v w x

33 

34 def is_excluded(self): 1ab

35 return False 2a UcVc.d/d

36 

37 

38class ControllerWithParent(_BaseController): 1ab

39 

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

43 

44 def set_parent(self, new_parent): 1ab

45 self._parent = new_parent 2_cf 3 4 5 ub

46 

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

50 

51 @property 1ab

52 def dirty(self): 1ab

53 return self._parent.dirty 2DbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbA B C sezfteueAfvewexeJdSd_d8dffyeBfzeAeCfBeCeedDeEeFeDfEf{ | GeHeIel m n o p

54 

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

58 

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

62 

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

66 

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

70 

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

73 

74 

75class WithNamespace(object): 1ab

76 namespace = None # Ensure namespace exists 1ab

77 

78 def _set_namespace_from(self, controller): 1ab

79 self._set_namespace(controller.namespace) 2a *d+djfkflfmfqenfVdWd3cfdregdofpfqfrf=di j k v w x

80 

81 def _set_namespace(self, namespace): 1ab

82 self.namespace = namespace 2a *d+djf@fkflfmfqenfVdWd3cfdregdofpfqfrf=di j k v w x [fsf]f^f

83 

84 def get_namespace(self): 1ab

85 return self.namespace 2a _f`f{f|f}f~fagbgcgdgegfgUcVcgghg

86 

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

91 

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

96 

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

101 

102 def clear_namespace_update_listeners(self): 1ab

103 self.namespace.clear_update_listeners() 

104 

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

107 

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

110 

111 def get_all_keywords_from(self, *datafiles): 1ab

112 return self.namespace.get_all_keywords(*datafiles) 

113 

114 def get_all_cached_library_names(self): 1ab

115 return self.namespace.get_all_cached_library_names() 2sf

116 

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

119 

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

122 

123 def is_variables_import_ok(self, imp): 1ab

124 return self.namespace.is_variables_import_ok(self.datafile, imp) 2+e.e

125 

126 

127class WithUndoRedoStacks(object): 1ab

128 

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

134 

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

140 

141 def clear_undo(self): 1ab

142 self._undo_stack = [] 1{|

143 

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

146 

147 def pop_from_undo(self): 1ab

148 return self._undo.pop() 1c(ABCRSDTqrUf}~sdegh

149 

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

152 

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

155 

156 def is_redo_empty(self): 1ab

157 return self._redo == [] 2( D ~cq r f } ~

158 

159 def pop_from_redo(self): 1ab

160 return self._redo.pop() 1(qrf}~

161 

162 def push_to_redo(self, command): 1ab

163 self._redo.append(command) 1c(ABCRSDTqrUf}~sdegh