refactor: replace inspect-based class retrieval with AST parsing for improved class order handling
This commit is contained in:
parent
6ff179aca2
commit
a7cbf6f8b2
|
@ -24,7 +24,7 @@ import platform
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import ast
|
||||||
import toml
|
import toml
|
||||||
|
|
||||||
from frame.log import *
|
from frame.log import *
|
||||||
|
@ -56,11 +56,11 @@ def checkRunTimeError():
|
||||||
if hwnd:
|
if hwnd:
|
||||||
os.system("TASKKILL /F /IM taosd.exe")
|
os.system("TASKKILL /F /IM taosd.exe")
|
||||||
|
|
||||||
def get_local_classes(module):
|
def get_local_classes_in_order(file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
def dynamicLoadModule(fileName):
|
def dynamicLoadModule(fileName):
|
||||||
|
@ -77,8 +77,10 @@ def runOnPreviousCluster(host, config, fileName):
|
||||||
sep = "/"
|
sep = "/"
|
||||||
if platform.system().lower() == 'windows':
|
if platform.system().lower() == 'windows':
|
||||||
sep = os.sep
|
sep = os.sep
|
||||||
|
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
|
|
||||||
# create conn
|
# create conn
|
||||||
|
@ -371,7 +373,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
@ -543,7 +546,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if (json.dumps(updateCfgDict) == '{}'):
|
if (json.dumps(updateCfgDict) == '{}'):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
|
|
@ -22,7 +22,7 @@ import json
|
||||||
import platform
|
import platform
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
import inspect
|
import ast
|
||||||
import importlib
|
import importlib
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -59,11 +59,11 @@ def checkRunTimeError():
|
||||||
if hwnd:
|
if hwnd:
|
||||||
os.system("TASKKILL /F /IM taosd.exe")
|
os.system("TASKKILL /F /IM taosd.exe")
|
||||||
|
|
||||||
def get_local_classes(module):
|
def get_local_classes_in_order(file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
def dynamicLoadModule(fileName):
|
def dynamicLoadModule(fileName):
|
||||||
|
@ -311,7 +311,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if (json.dumps(updateCfgDict) == "{}") and hasattr(
|
if (json.dumps(updateCfgDict) == "{}") and hasattr(
|
||||||
ucase, "updatecfgDict"
|
ucase, "updatecfgDict"
|
||||||
|
@ -450,7 +451,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if json.dumps(updateCfgDict) == "{}":
|
if json.dumps(updateCfgDict) == "{}":
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
|
|
@ -19,6 +19,7 @@ import subprocess
|
||||||
import time
|
import time
|
||||||
from distutils.log import warn as printf
|
from distutils.log import warn as printf
|
||||||
import platform
|
import platform
|
||||||
|
import ast
|
||||||
|
|
||||||
from util.log import *
|
from util.log import *
|
||||||
from util.dnodes import *
|
from util.dnodes import *
|
||||||
|
@ -26,11 +27,11 @@ from util.cases import *
|
||||||
|
|
||||||
import taos
|
import taos
|
||||||
|
|
||||||
def get_local_classes(module):
|
def get_local_classes_in_order(file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
def dynamicLoadModule(fileName):
|
def dynamicLoadModule(fileName):
|
||||||
|
@ -149,7 +150,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
tdDnodes.deploy(1,ucase.updatecfgDict)
|
tdDnodes.deploy(1,ucase.updatecfgDict)
|
||||||
except :
|
except :
|
||||||
|
@ -183,7 +185,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
tdDnodes.deploy(1,ucase.updatecfgDict)
|
tdDnodes.deploy(1,ucase.updatecfgDict)
|
||||||
except :
|
except :
|
||||||
|
|
|
@ -20,7 +20,7 @@ import importlib
|
||||||
import traceback
|
import traceback
|
||||||
from util.log import *
|
from util.log import *
|
||||||
import platform
|
import platform
|
||||||
|
import ast
|
||||||
|
|
||||||
class TDCase:
|
class TDCase:
|
||||||
def __init__(self, name, case):
|
def __init__(self, name, case):
|
||||||
|
@ -51,11 +51,11 @@ class TDCases:
|
||||||
def addCluster(self, name, case):
|
def addCluster(self, name, case):
|
||||||
self.clusterCases.append(TDCase(name, case))
|
self.clusterCases.append(TDCase(name, case))
|
||||||
|
|
||||||
def get_local_classes(self, module):
|
def get_local_classes_in_order(self, file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
def runAllLinux(self, conn):
|
def runAllLinux(self, conn):
|
||||||
|
@ -64,7 +64,8 @@ class TDCases:
|
||||||
for tmp in self.linuxCases:
|
for tmp in self.linuxCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[0])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init(conn)
|
case.init(conn)
|
||||||
case.run()
|
case.run()
|
||||||
|
@ -81,8 +82,8 @@ class TDCases:
|
||||||
for tmp in self.linuxCases:
|
for tmp in self.linuxCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[-1])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
print(case_class)
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init(conn, self._logSql, replicaVar)
|
case.init(conn, self._logSql, replicaVar)
|
||||||
try:
|
try:
|
||||||
|
@ -101,7 +102,8 @@ class TDCases:
|
||||||
for tmp in self.windowsCases:
|
for tmp in self.windowsCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[-1])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init(conn)
|
case.init(conn)
|
||||||
case.run()
|
case.run()
|
||||||
|
@ -118,7 +120,8 @@ class TDCases:
|
||||||
for tmp in self.windowsCases:
|
for tmp in self.windowsCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[-1])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init(conn, self._logSql,replicaVar)
|
case.init(conn, self._logSql,replicaVar)
|
||||||
try:
|
try:
|
||||||
|
@ -140,7 +143,8 @@ class TDCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
tdLog.notice("run cases like %s" % (fileName))
|
tdLog.notice("run cases like %s" % (fileName))
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[-1])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init()
|
case.init()
|
||||||
case.run()
|
case.run()
|
||||||
|
@ -158,7 +162,8 @@ class TDCases:
|
||||||
if tmp.name.find(fileName) != -1:
|
if tmp.name.find(fileName) != -1:
|
||||||
tdLog.notice("run cases like %s" % (fileName))
|
tdLog.notice("run cases like %s" % (fileName))
|
||||||
# get the last class name as the test case class name
|
# get the last class name as the test case class name
|
||||||
case_class = getattr(testModule, self.get_local_classes(testModule)[-1])
|
class_names = self.get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(testModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
case.init()
|
case.init()
|
||||||
case.run()
|
case.run()
|
||||||
|
|
|
@ -24,7 +24,7 @@ import platform
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import ast
|
||||||
print(f"Python version: {sys.version}")
|
print(f"Python version: {sys.version}")
|
||||||
print(f"Version info: {sys.version_info}")
|
print(f"Version info: {sys.version_info}")
|
||||||
|
|
||||||
|
@ -59,13 +59,14 @@ def checkRunTimeError():
|
||||||
if hwnd:
|
if hwnd:
|
||||||
os.system("TASKKILL /F /IM taosd.exe")
|
os.system("TASKKILL /F /IM taosd.exe")
|
||||||
|
|
||||||
def get_local_classes(module):
|
def get_local_classes_in_order(file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
|
|
||||||
def dynamicLoadModule(fileName):
|
def dynamicLoadModule(fileName):
|
||||||
moduleName = fileName.replace(".py", "").replace(os.sep, ".")
|
moduleName = fileName.replace(".py", "").replace(os.sep, ".")
|
||||||
return importlib.import_module(moduleName, package='..')
|
return importlib.import_module(moduleName, package='..')
|
||||||
|
@ -80,8 +81,10 @@ def runOnPreviousCluster(host, config, fileName):
|
||||||
sep = "/"
|
sep = "/"
|
||||||
if platform.system().lower() == 'windows':
|
if platform.system().lower() == 'windows':
|
||||||
sep = os.sep
|
sep = os.sep
|
||||||
|
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
|
|
||||||
# create conn
|
# create conn
|
||||||
|
@ -364,7 +367,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
@ -536,7 +540,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if (json.dumps(updateCfgDict) == '{}'):
|
if (json.dumps(updateCfgDict) == '{}'):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
|
|
@ -24,7 +24,7 @@ import platform
|
||||||
import socket
|
import socket
|
||||||
import threading
|
import threading
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import ast
|
||||||
print(f"Python version: {sys.version}")
|
print(f"Python version: {sys.version}")
|
||||||
print(f"Version info: {sys.version_info}")
|
print(f"Version info: {sys.version_info}")
|
||||||
|
|
||||||
|
@ -59,13 +59,14 @@ def checkRunTimeError():
|
||||||
if hwnd:
|
if hwnd:
|
||||||
os.system("TASKKILL /F /IM taosd.exe")
|
os.system("TASKKILL /F /IM taosd.exe")
|
||||||
|
|
||||||
def get_local_classes(module):
|
def get_local_classes_in_order(file_path):
|
||||||
classes = []
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
for name, obj in inspect.getmembers(module, inspect.isclass):
|
tree = ast.parse(file.read(), filename=file_path)
|
||||||
if inspect.getmodule(obj) == module:
|
|
||||||
classes.append(name)
|
classes = [node.name for node in ast.walk(tree) if isinstance(node, ast.ClassDef)]
|
||||||
return classes
|
return classes
|
||||||
|
|
||||||
|
|
||||||
def dynamicLoadModule(fileName):
|
def dynamicLoadModule(fileName):
|
||||||
moduleName = fileName.replace(".py", "").replace(os.sep, ".")
|
moduleName = fileName.replace(".py", "").replace(os.sep, ".")
|
||||||
return importlib.import_module(moduleName, package='..')
|
return importlib.import_module(moduleName, package='..')
|
||||||
|
@ -80,8 +81,10 @@ def runOnPreviousCluster(host, config, fileName):
|
||||||
sep = "/"
|
sep = "/"
|
||||||
if platform.system().lower() == 'windows':
|
if platform.system().lower() == 'windows':
|
||||||
sep = os.sep
|
sep = os.sep
|
||||||
|
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
case = case_class()
|
case = case_class()
|
||||||
|
|
||||||
# create conn
|
# create conn
|
||||||
|
@ -364,7 +367,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
if ((json.dumps(updateCfgDict) == '{}') and hasattr(ucase, 'updatecfgDict')):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
@ -536,7 +540,8 @@ if __name__ == "__main__":
|
||||||
if is_test_framework:
|
if is_test_framework:
|
||||||
uModule = dynamicLoadModule(fileName)
|
uModule = dynamicLoadModule(fileName)
|
||||||
try:
|
try:
|
||||||
case_class = getattr(uModule, get_local_classes(uModule)[-1])
|
class_names = get_local_classes_in_order(fileName)
|
||||||
|
case_class = getattr(uModule, class_names[-1])
|
||||||
ucase = case_class()
|
ucase = case_class()
|
||||||
if (json.dumps(updateCfgDict) == '{}'):
|
if (json.dumps(updateCfgDict) == '{}'):
|
||||||
updateCfgDict = ucase.updatecfgDict
|
updateCfgDict = ucase.updatecfgDict
|
||||||
|
|
Loading…
Reference in New Issue