RefactoringRope/RefactoringClient.py

branch
eric7
changeset 413
a4cba20ad7ab
parent 412
6fa5892b9097
child 426
7592a1c052e8
equal deleted inserted replaced
412:6fa5892b9097 413:a4cba20ad7ab
8 """ 8 """
9 9
10 import contextlib 10 import contextlib
11 import os 11 import os
12 import sys 12 import sys
13 import traceback
13 14
14 modulePath = sys.argv[-1] # it is always the last parameter 15 modulePath = sys.argv[-1] # it is always the last parameter
15 sys.path.append(modulePath) 16 sys.path.append(modulePath)
16 17
17 try: 18 try:
18 import rope.base.libutils 19 import rope.base.libutils
19 import rope.base.project 20 import rope.base.project
21 import rope.contrib.findit
22 import rope.refactor.change_signature
23 import rope.refactor.encapsulate_field
24 import rope.refactor.extract
25 import rope.refactor.inline
26 import rope.refactor.introduce_factory
27 import rope.refactor.introduce_parameter
28 import rope.refactor.localtofield
29 import rope.refactor.method_object
30 import rope.refactor.move
31 import rope.refactor.rename
32 import rope.refactor.restructure
33 import rope.refactor.topackage
34 import rope.refactor.usefunction
35
36 from rope.refactor.importutils import ImportOrganizer
20 except ImportError: 37 except ImportError:
21 sys.exit(42) 38 sys.exit(42)
22 39
23 from ProgressHandle import ProgressHandle 40 from ProgressHandle import ProgressHandle
24 41
39 @param port port of the background service 56 @param port port of the background service
40 @type int 57 @type int
41 @param projectPath path to the project 58 @param projectPath path to the project
42 @type str 59 @type str
43 """ 60 """
61 from FileSystemCommands import RefactoringClientFileSystemCommands # noqa: I102
62
44 super().__init__(host, port) 63 super().__init__(host, port)
45 64
46 self.__methodMapping = { 65 self.__methodMapping = {
47 "AbortAction": self.__abortAction, 66 "AbortAction": self.__abortAction,
48 "CloseProject": self.__closeProject, 67 "CloseProject": self.__closeProject,
85 "CalculateEncapsulateFieldChanges": self.__calculateEncapsulateFieldChanges, 104 "CalculateEncapsulateFieldChanges": self.__calculateEncapsulateFieldChanges,
86 "CalculateLocalToAttributeChanges": self.__calculateLocalToAttributeChanges, 105 "CalculateLocalToAttributeChanges": self.__calculateLocalToAttributeChanges,
87 "CalculateMethodObjectChanges": self.__calculateMethodObjectChanges, 106 "CalculateMethodObjectChanges": self.__calculateMethodObjectChanges,
88 } 107 }
89 108
90 from FileSystemCommands import RefactoringClientFileSystemCommands
91
92 self.__fsCommands = RefactoringClientFileSystemCommands(self) 109 self.__fsCommands = RefactoringClientFileSystemCommands(self)
93 110
94 self.__projectpath = projectPath 111 self.__projectpath = projectPath
95 self.__project = rope.base.project.Project( 112 self.__project = rope.base.project.Project(
96 self.__projectpath, fscommands=self.__fsCommands 113 self.__projectpath, fscommands=self.__fsCommands
119 @param err rope exception object 136 @param err rope exception object
120 @type Exception 137 @type Exception
121 @return dictionary containing the error information 138 @return dictionary containing the error information
122 @rtype dict 139 @rtype dict
123 """ 140 """
124 import traceback
125
126 tb = traceback.format_tb(sys.exc_info()[2]) 141 tb = traceback.format_tb(sys.exc_info()[2])
127 ropeError = str(type(err)).split()[-1] 142 ropeError = str(type(err)).split()[-1]
128 ropeError = ropeError[1:-2].split(".")[-1] 143 ropeError = ropeError[1:-2].split(".")[-1]
129 errorDict = { 144 errorDict = {
130 "Error": ropeError, 145 "Error": ropeError,
135 errorDict["ErrorFile"] = err.filename 150 errorDict["ErrorFile"] = err.filename
136 errorDict["ErrorLine"] = err.lineno 151 errorDict["ErrorLine"] = err.lineno
137 152
138 return errorDict 153 return errorDict
139 154
140 def __abortAction(self, params): 155 def __abortAction(self, params): # noqa: U100
141 """ 156 """
142 Private method to abort the current action. 157 Private method to abort the current action.
143 158
144 @param params dictionary containing the method parameters sent by 159 @param params dictionary containing the method parameters sent by
145 the server 160 the server
146 @type dict 161 @type dict
147 """ 162 """
148 if self.__progressHandle is not None and not self.__progressHandle.is_stopped(): 163 if self.__progressHandle is not None and not self.__progressHandle.is_stopped():
149 self.__progressHandle.stop() 164 self.__progressHandle.stop()
150 165
151 def __validate(self, params): 166 def __validate(self, params): # noqa: U100
152 """ 167 """
153 Private slot to validate the project. 168 Private slot to validate the project.
154 169
155 @param params dictionary containing the method parameters sent by 170 @param params dictionary containing the method parameters sent by
156 the server 171 the server
157 @type dict 172 @type dict
158 """ 173 """
159 self.__project.validate(self.__project.root) 174 self.__project.validate(self.__project.root)
160 175
161 def __closeProject(self, params): 176 def __closeProject(self, params): # noqa: U100
162 """ 177 """
163 Private slot to validate the project. 178 Private slot to validate the project.
164 179
165 @param params dictionary containing the method parameters sent by 180 @param params dictionary containing the method parameters sent by
166 the server 181 the server
167 @type dict 182 @type dict
168 """ 183 """
169 self.__project.close() 184 self.__project.close()
170 185
171 def __getConfig(self, params): 186 def __getConfig(self, params): # noqa: U100
172 """ 187 """
173 Private method to send some configuration data to the server. 188 Private method to send some configuration data to the server.
174 189
175 @param params dictionary containing the method parameters sent by 190 @param params dictionary containing the method parameters sent by
176 the server 191 the server
200 ) as f: 215 ) as f:
201 result["DefaultConfig"] = f.read() 216 result["DefaultConfig"] = f.read()
202 217
203 self.sendJson("Config", result) 218 self.sendJson("Config", result)
204 219
205 def __configChanged(self, params): 220 def __configChanged(self, params): # noqa: U100
206 """ 221 """
207 Private method to handle a change of the configuration file. 222 Private method to handle a change of the configuration file.
208 223
209 @param params dictionary containing the method parameters sent by 224 @param params dictionary containing the method parameters sent by
210 the server 225 the server
227 filename = params["FileName"] 242 filename = params["FileName"]
228 offset = params["Offset"] 243 offset = params["Offset"]
229 244
230 errorDict = {} 245 errorDict = {}
231 occurrences = [] 246 occurrences = []
232
233 import rope.contrib.findit
234 247
235 resource = rope.base.libutils.path_to_resource(self.__project, filename) 248 resource = rope.base.libutils.path_to_resource(self.__project, filename)
236 self.__progressHandle = ProgressHandle(self, title, True) 249 self.__progressHandle = ProgressHandle(self, title, True)
237 try: 250 try:
238 occurrences = rope.contrib.findit.find_occurrences( 251 occurrences = rope.contrib.findit.find_occurrences(
274 source = params["Source"] 287 source = params["Source"]
275 288
276 errorDict = {} 289 errorDict = {}
277 location = None 290 location = None
278 291
279 import rope.contrib.findit
280
281 resource = rope.base.libutils.path_to_resource(self.__project, filename) 292 resource = rope.base.libutils.path_to_resource(self.__project, filename)
282 try: 293 try:
283 location = rope.contrib.findit.find_definition( 294 location = rope.contrib.findit.find_definition(
284 self.__project, source, offset, resource 295 self.__project, source, offset, resource
285 ) 296 )
307 filename = params["FileName"] 318 filename = params["FileName"]
308 offset = params["Offset"] 319 offset = params["Offset"]
309 320
310 errorDict = {} 321 errorDict = {}
311 occurrences = [] 322 occurrences = []
312
313 import rope.contrib.findit
314 323
315 resource = rope.base.libutils.path_to_resource(self.__project, filename) 324 resource = rope.base.libutils.path_to_resource(self.__project, filename)
316 self.__progressHandle = ProgressHandle(self, title, True) 325 self.__progressHandle = ProgressHandle(self, title, True)
317 try: 326 try:
318 occurrences = rope.contrib.findit.find_implementations( 327 occurrences = rope.contrib.findit.find_implementations(
557 result = { 566 result = {
558 "ChangeGroup": changeGroup, 567 "ChangeGroup": changeGroup,
559 "Title": title, 568 "Title": title,
560 } 569 }
561 570
562 import rope.refactor.rename
563
564 resource = rope.base.libutils.path_to_resource(self.__project, filename) 571 resource = rope.base.libutils.path_to_resource(self.__project, filename)
565 572
566 resources = [resource] if isLocal else None 573 resources = [resource] if isLocal else None
567 574
568 self.__progressHandle = ProgressHandle(self, title, True) 575 self.__progressHandle = ProgressHandle(self, title, True)
640 result = { 647 result = {
641 "ChangeGroup": changeGroup, 648 "ChangeGroup": changeGroup,
642 "Title": title, 649 "Title": title,
643 } 650 }
644 651
645 import rope.refactor.rename
646
647 resource = rope.base.libutils.path_to_resource(self.__project, filename) 652 resource = rope.base.libutils.path_to_resource(self.__project, filename)
648 try: 653 try:
649 renamer = rope.refactor.rename.ChangeOccurrences( 654 renamer = rope.refactor.rename.ChangeOccurrences(
650 self.__project, resource, offset 655 self.__project, resource, offset
651 ) 656 )
686 changes = None 691 changes = None
687 result = { 692 result = {
688 "ChangeGroup": changeGroup, 693 "ChangeGroup": changeGroup,
689 "Title": title, 694 "Title": title,
690 } 695 }
691
692 import rope.refactor.extract
693 696
694 resource = rope.base.libutils.path_to_resource(self.__project, filename) 697 resource = rope.base.libutils.path_to_resource(self.__project, filename)
695 try: 698 try:
696 if kind not in ("variable", "method"): 699 if kind not in ("variable", "method"):
697 raise Exception("Invalid extraction kind <{0}>.".format(kind)) 700 raise Exception("Invalid extraction kind <{0}>.".format(kind))
733 "Subcommand": "InlineType", 736 "Subcommand": "InlineType",
734 "ChangeGroup": changeGroup, 737 "ChangeGroup": changeGroup,
735 "Title": title, 738 "Title": title,
736 } 739 }
737 740
738 import rope.refactor.inline
739
740 resource = rope.base.libutils.path_to_resource(self.__project, filename) 741 resource = rope.base.libutils.path_to_resource(self.__project, filename)
741 try: 742 try:
742 inliner = rope.refactor.inline.create_inline( 743 inliner = rope.refactor.inline.create_inline(
743 self.__project, resource, offset 744 self.__project, resource, offset
744 ) 745 )
774 changes = None 775 changes = None
775 result = { 776 result = {
776 "ChangeGroup": changeGroup, 777 "ChangeGroup": changeGroup,
777 "Title": title, 778 "Title": title,
778 } 779 }
779
780 import rope.refactor.extract
781 780
782 resource = rope.base.libutils.path_to_resource(self.__project, filename) 781 resource = rope.base.libutils.path_to_resource(self.__project, filename)
783 self.__progressHandle = ProgressHandle(self, title, True) 782 self.__progressHandle = ProgressHandle(self, title, True)
784 try: 783 try:
785 inliner = rope.refactor.inline.create_inline( 784 inliner = rope.refactor.inline.create_inline(
826 result = { 825 result = {
827 "Subcommand": "MoveType", 826 "Subcommand": "MoveType",
828 "ChangeGroup": changeGroup, 827 "ChangeGroup": changeGroup,
829 "Title": title, 828 "Title": title,
830 } 829 }
831
832 import rope.refactor.move
833 830
834 resource = rope.base.libutils.path_to_resource(self.__project, filename) 831 resource = rope.base.libutils.path_to_resource(self.__project, filename)
835 try: 832 try:
836 mover = rope.refactor.move.create_move(self.__project, resource, offset) 833 mover = rope.refactor.move.create_move(self.__project, resource, offset)
837 if isinstance(mover, rope.refactor.move.MoveGlobal): 834 if isinstance(mover, rope.refactor.move.MoveGlobal):
877 changes = None 874 changes = None
878 result = { 875 result = {
879 "ChangeGroup": changeGroup, 876 "ChangeGroup": changeGroup,
880 "Title": title, 877 "Title": title,
881 } 878 }
882
883 import rope.refactor.move
884 879
885 resource = rope.base.libutils.path_to_resource(self.__project, filename) 880 resource = rope.base.libutils.path_to_resource(self.__project, filename)
886 self.__progressHandle = ProgressHandle(self, title, True) 881 self.__progressHandle = ProgressHandle(self, title, True)
887 try: 882 try:
888 mover = rope.refactor.move.create_move(self.__project, resource, offset) 883 mover = rope.refactor.move.create_move(self.__project, resource, offset)
932 "Subcommand": "UseFunctionName", 927 "Subcommand": "UseFunctionName",
933 "ChangeGroup": changeGroup, 928 "ChangeGroup": changeGroup,
934 "Title": title, 929 "Title": title,
935 } 930 }
936 931
937 import rope.refactor.usefunction
938
939 resource = rope.base.libutils.path_to_resource(self.__project, filename) 932 resource = rope.base.libutils.path_to_resource(self.__project, filename)
940 try: 933 try:
941 user = rope.refactor.usefunction.UseFunction( 934 user = rope.refactor.usefunction.UseFunction(
942 self.__project, resource, offset 935 self.__project, resource, offset
943 ) 936 )
968 result = { 961 result = {
969 "ChangeGroup": changeGroup, 962 "ChangeGroup": changeGroup,
970 "Title": title, 963 "Title": title,
971 } 964 }
972 965
973 import rope.refactor.usefunction
974
975 resource = rope.base.libutils.path_to_resource(self.__project, filename) 966 resource = rope.base.libutils.path_to_resource(self.__project, filename)
976 self.__progressHandle = ProgressHandle(self, title, True) 967 self.__progressHandle = ProgressHandle(self, title, True)
977 try: 968 try:
978 user = rope.refactor.usefunction.UseFunction( 969 user = rope.refactor.usefunction.UseFunction(
979 self.__project, resource, offset 970 self.__project, resource, offset
1011 changes = None 1002 changes = None
1012 result = { 1003 result = {
1013 "ChangeGroup": changeGroup, 1004 "ChangeGroup": changeGroup,
1014 "Title": title, 1005 "Title": title,
1015 } 1006 }
1016
1017 import rope.refactor.introduce_factory
1018 1007
1019 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1008 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1020 self.__progressHandle = ProgressHandle(self, title, True) 1009 self.__progressHandle = ProgressHandle(self, title, True)
1021 try: 1010 try:
1022 introducer = rope.refactor.introduce_factory.IntroduceFactoryRefactoring( 1011 introducer = rope.refactor.introduce_factory.IntroduceFactoryRefactoring(
1059 result = { 1048 result = {
1060 "ChangeGroup": changeGroup, 1049 "ChangeGroup": changeGroup,
1061 "Title": title, 1050 "Title": title,
1062 } 1051 }
1063 1052
1064 import rope.refactor.introduce_parameter
1065
1066 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1053 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1067 try: 1054 try:
1068 introducer = rope.refactor.introduce_parameter.IntroduceParameter( 1055 introducer = rope.refactor.introduce_parameter.IntroduceParameter(
1069 self.__project, resource, offset 1056 self.__project, resource, offset
1070 ) 1057 )
1098 changes = None 1085 changes = None
1099 result = { 1086 result = {
1100 "ChangeGroup": changeGroup, 1087 "ChangeGroup": changeGroup,
1101 "Title": title, 1088 "Title": title,
1102 } 1089 }
1103
1104 from rope.refactor.importutils import ImportOrganizer
1105 1090
1106 method = { 1091 method = {
1107 "organize_imports": ImportOrganizer.organize_imports, 1092 "organize_imports": ImportOrganizer.organize_imports,
1108 "expand_star_imports": ImportOrganizer.expand_star_imports, 1093 "expand_star_imports": ImportOrganizer.expand_star_imports,
1109 "relatives_to_absolutes": ImportOrganizer.relatives_to_absolutes, 1094 "relatives_to_absolutes": ImportOrganizer.relatives_to_absolutes,
1157 result = { 1142 result = {
1158 "ChangeGroup": changeGroup, 1143 "ChangeGroup": changeGroup,
1159 "Title": title, 1144 "Title": title,
1160 } 1145 }
1161 1146
1162 import rope.refactor.restructure
1163
1164 self.__project.validate(self.__project.root) 1147 self.__project.validate(self.__project.root)
1165 self.__progressHandle = ProgressHandle(self, title, True) 1148 self.__progressHandle = ProgressHandle(self, title, True)
1166 try: 1149 try:
1167 restructuring = rope.refactor.restructure.Restructure( 1150 restructuring = rope.refactor.restructure.Restructure(
1168 self.__project, pattern, goal, args=args, imports=imports 1151 self.__project, pattern, goal, args=args, imports=imports
1198 result = { 1181 result = {
1199 "Subcommand": "Signature", 1182 "Subcommand": "Signature",
1200 "ChangeGroup": changeGroup, 1183 "ChangeGroup": changeGroup,
1201 "Title": title, 1184 "Title": title,
1202 } 1185 }
1203
1204 import rope.refactor.change_signature
1205 1186
1206 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1187 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1207 try: 1188 try:
1208 changer = rope.refactor.change_signature.ChangeSignature( 1189 changer = rope.refactor.change_signature.ChangeSignature(
1209 self.__project, resource, offset 1190 self.__project, resource, offset
1241 "ChangeGroup": changeGroup, 1222 "ChangeGroup": changeGroup,
1242 "Title": title, 1223 "Title": title,
1243 } 1224 }
1244 1225
1245 changers = [] 1226 changers = []
1246 import rope.refactor.change_signature
1247 1227
1248 # removals 1228 # removals
1249 for index in removals: 1229 for index in removals:
1250 remover = rope.refactor.change_signature.ArgumentRemover(index) 1230 remover = rope.refactor.change_signature.ArgumentRemover(index)
1251 changers.append(remover) 1231 changers.append(remover)
1344 changes = None 1324 changes = None
1345 result = { 1325 result = {
1346 "ChangeGroup": changeGroup, 1326 "ChangeGroup": changeGroup,
1347 "Title": title, 1327 "Title": title,
1348 } 1328 }
1349
1350 import rope.refactor.topackage
1351 1329
1352 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1330 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1353 try: 1331 try:
1354 changes = rope.refactor.topackage.ModuleToPackage( 1332 changes = rope.refactor.topackage.ModuleToPackage(
1355 self.__project, resource 1333 self.__project, resource
1395 "Subcommand": "FieldName", 1373 "Subcommand": "FieldName",
1396 "ChangeGroup": changeGroup, 1374 "ChangeGroup": changeGroup,
1397 "Title": title, 1375 "Title": title,
1398 } 1376 }
1399 1377
1400 import rope.refactor.encapsulate_field
1401
1402 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1378 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1403 try: 1379 try:
1404 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( 1380 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField(
1405 self.__project, resource, offset 1381 self.__project, resource, offset
1406 ) 1382 )
1433 result = { 1409 result = {
1434 "ChangeGroup": changeGroup, 1410 "ChangeGroup": changeGroup,
1435 "Title": title, 1411 "Title": title,
1436 } 1412 }
1437 1413
1438 import rope.refactor.encapsulate_field
1439
1440 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1414 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1441 self.__progressHandle = ProgressHandle(self, title, True) 1415 self.__progressHandle = ProgressHandle(self, title, True)
1442 try: 1416 try:
1443 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( 1417 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField(
1444 self.__project, resource, offset 1418 self.__project, resource, offset
1476 changes = None 1450 changes = None
1477 result = { 1451 result = {
1478 "ChangeGroup": changeGroup, 1452 "ChangeGroup": changeGroup,
1479 "Title": title, 1453 "Title": title,
1480 } 1454 }
1481
1482 import rope.refactor.localtofield
1483 1455
1484 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1456 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1485 try: 1457 try:
1486 changes = rope.refactor.localtofield.LocalToField( 1458 changes = rope.refactor.localtofield.LocalToField(
1487 self.__project, resource, offset 1459 self.__project, resource, offset
1528 result = { 1500 result = {
1529 "ChangeGroup": changeGroup, 1501 "ChangeGroup": changeGroup,
1530 "Title": title, 1502 "Title": title,
1531 } 1503 }
1532 1504
1533 import rope.refactor.method_object
1534
1535 resource = rope.base.libutils.path_to_resource(self.__project, filename) 1505 resource = rope.base.libutils.path_to_resource(self.__project, filename)
1536 try: 1506 try:
1537 converter = rope.refactor.method_object.MethodObject( 1507 converter = rope.refactor.method_object.MethodObject(
1538 self.__project, resource, offset 1508 self.__project, resource, offset
1539 ) 1509 )
1549 self.sendJson("Changes", result) 1519 self.sendJson("Changes", result)
1550 1520
1551 1521
1552 if __name__ == "__main__": 1522 if __name__ == "__main__":
1553 if len(sys.argv) != 5: 1523 if len(sys.argv) != 5:
1554 print( 1524 print("Host, port, project path and module path parameters are missing. Abort.")
1555 "Host, port, project path and module path parameters are" " missing. Abort."
1556 )
1557 sys.exit(1) 1525 sys.exit(1)
1558 1526
1559 host, port, projectPath = sys.argv[1:-1] 1527 host, port, projectPath = sys.argv[1:-1]
1560 1528
1561 # Create a Qt6 application object in order to allow the processing of 1529 # Create a Qt6 application object in order to allow the processing of

eric ide

mercurial