def get(self): # load all the plugin information from the backend modules = get_gquant_config_modules() client_info = {} client_info['validation'] = {} client_info['display'] = {} for key in modules.keys(): if os.path.isdir(modules[key]): mod = load_modules(modules[key]) # if hasattr(mod.mod, 'client'): client_mod = mod.mod if hasattr(client_mod, 'validation'): val_dict = getattr(client_mod, 'validation') client_info['validation'].update(val_dict) else: print(client_mod, 'no validation') if hasattr(client_mod, 'display'): val_dict = getattr(client_mod, 'display') client_info['display'].update(val_dict) else: print(client_mod, 'no display') # else: # print(key, mod.mod, 'no client') self.finish(json.dumps(client_info))
python -m unittest discover <test_directory> python -m unittest discover -s <directory> -p 'test_*.py' # Using pytest # "conda install pytest" or "pip install pytest" pytest -v tests pytest -v tests/unit/test_nodes.py ''' import warnings import unittest import cudf import os from gquant.dataframe_flow.task import load_modules load_modules(os.getenv('MODULEPATH') + '/rapids_modules/') from rapids_modules.transform.returnFeatureNode import ReturnFeatureNode from rapids_modules.transform.indicatorNode import IndicatorNode from rapids_modules.transform.assetIndicatorNode import AssetIndicatorNode from gquant.dataframe_flow.task import Task from .utils import make_orderer, error_function_index import numpy as np import pandas as pd ordered, compare = make_orderer() unittest.defaultTestLoader.sortTestMethodsUsing = compare # gt for return ground_truth = b'\x92\x01\xef3\xec \x02@\xa3\xd5\xc0\xd96\xdd\xc0\xbf\xe2\xe1\xa7f\xab\xc0\xaa?\x8e\x9cySv\x9b\xca?vA\xc5\xd9\x8e\xd6\xd8\xbf\xbf){\x92=p\xc3\xbf\xd7\x06\xda\xca\x98\n\xd0?\xcf\xbf\xe8C\xb8\xb5\xc6?\x03\xa9\xf2H1\xcf\xca?V{\xc3\x9c\xda\xd5\xc0?\x1f\xed\xc6p\x14\xea\xe4\xbf\x84*\x911\x07\xf6\xe1\xbfQ\xdbQON&\x12@b\\H\xceZ\x19\xd3\xbfsxy\xfe\x9aT\xdf?\xc08\x16\xc2\xe0\xef\xdc\xbflI\xa2\xf0\xbfo\xee?\xc7\x0f\xffY\xa0\x00\xd7\xbf\x04l\xf3\xfcD\x16\xe1\xbf\xb9j]\x90my\xe8\xbf[\xc0B\x82\xe6\xf5\xe1?h$\xf1\x99\xec\x9f\xec?\xf1#\xdb\xb9GX\xf8?\xcd\xaf\xe4\x1b\xc0\x13\xeb?\xa8`\xa6\x8d\x8af\xbf?m\'\x07\x92j\x80\xd7\xbf<\xa4\x04\xfb\x93\xa7\xdf\xbf\xd3\xdd\xbcGk\xd1\xf3?\xf9"\xc8w\xad\xc8\x95\xbf:3\xe3\x05\xef\xf4\xca\xbf\nU\xd1\tQ[\xed?\xd3\x8f\xc0\x87J\x0f\xc5\xbf\r6\n[\xb1T\xc3?\xd5I\x83\xa6\xee\xae\xd5\xbf]\xc3\x1f\xc6L/\xe3?I\xe3K\x1b\xf6f\xd1\xbf\xaf+ =\xc9\x9c\xef\xbf{\xd6\x94\xb3R#@@\t\xe8\xe6D\x83\xb8\xfe?\xc2\x01\'3NJ\xde\xbf\xea\x98j\xdc9\x81\xe3\xbf\xb2.\xf1\x9e\xcd\xa4\xd5\xbf\xf2Q\xbf\x0c\xf1\xdd\x17@\xf4\x05\xf44>\xe6\xc7\xbf$\xfc\xee?&\x07\xcd\xbf\r\x1d\x0eg\xb6\x90\xdb\xbfu\xbe\x9d\xde\t\xaa\xf3?\x18\xa0\xb6\x11\x83\xf9\xda\xbf\x97X=\xaa\xe5\xbe\xdd?\xca\xf6\xcb_re\xda?\xdc\xc3\x92tf$\xba?\xc5\xd6{8G\x00\xec\xbf\xddo\xd4\x8c\xc8\xeb\x0e@\x06\xd7\xfe\x9c\x00\xe7\xd0?\xca\x90F\x90gi\xe8\xbf F\x85<\xd3\xa1\xef\xbf\xd6A\x15\x00\x8a$\x81@/\xfbQ$\xbb\x11\xc5\xbf\xaf\xfeh\x1f\xe0$\xe5\xbf?o\x97\x9b\x87\xc3\x92?\xc4{\xe6\xbd\xbd)\xe2\xbf\\\x16\x0fp\x8b\xdd\x07@y\xa0,;\x81\x10\xee?-\x94\xe8C]\x15\x93\xbf\xd4b\xc0gix\xe7\xbf\x9bm\x8c\xe8\xab\xcf\xe3?m\xa9\x12H\xa0P\xf7?\xbf\xc3\x11\x0e\xde\xe8\xe6\xbfT*=\xf3\xb78\x03@\x8aY"\x8c\x17\x0b\xc7\xbfOy\xe8sPB\xc3?\x98j\xe1\xbd\xcd\xbe\x8f\xbf\xb0W\xa1Dh\x9e\xea\xbf\xc0\xa3\xb1\xb4U\x8d\x11@4\xfc\xaaY\xecw\xc3?\x90\xde):Y\x01\xb4\xbf\xc5\x15\xfdg`C\xc3\xbf\xae\xa3\x88\x92\x90/\xe2\xbf\xce{^\xef\xfdR\xc3?\xb4\xbeN\xd5P>\xd5\xbf\x97\xd9e\xc3!\xd7\xe3\xbf\xd7+#\x11{\xa5\xf2?1\x1b\xc6^\xeaT\x01@\xe8\x1eV\xa0^o\xe0?\xfb\xc7\x92\x02@\x8c\xd0\xbfm\xfa\x9fef\xc0\xc7\xbf\xc7\xf0\xf4r%\x01\xe1\xbf\r\rv&\xac\xf4\xef?vh\xd4\xfcQ\xd4\xe0?\xde\xa3\xab\x04\xe3B\xe4\xbf\xfd\x03)\xaa.<\xd8\xbf\x89.\x8c\x9aN\x8e\xec\xbf\x0b2M\xb3\xc1UB@\x16\x80^\xcc\xf9Y\xee\xbf[\xb63\xe7}\xa6$@|\x0eb$\xaee\xed?%Y(\x9b\x7f{\xef\xbf\xb10[\xd1\x1flB@\x06\xaf\'\x19I\xf1\xad\xbf\xea_\xa2\x15\xf0\xaa\xe3\xbf=\xd9q\xa9U\t<@>\xef\x06{~\x13\xea\xbf\xce!\xaf\xce\x80y!@\x17*T\x8ae\xc9\xde?\xcc\xe4\xa01\x0c\x1d\xe1\xbf\x18\x9c\xc1\rC\x07\xed\xbf"k\x95 \xfc\xcb\xf1?\xc9e\xf6b&)\x8b?\xe6^\xd1\x03\xe2\xc2!@P",%^\xf2\x85\xbfV\x06\x94]\xfeR\xef\xbf\x9d\xfa\x88\xad\xa0\xf7H@\xf5\x84\x17;\xe9\xb9\xad?$|\xa9\xb1`\xec\xe1\xbfW\x8fd\xd3\xa72\xd2\xbf\xe9\xf3\xd8!U\x04\xff?\x8d\xec7d)(\xd1\xbf\xde\x06C\x7fb\xb5\xe8\xbf\xccF$ux\x10\xe4?E\xc2\xcbD\xc0m\x05@\xceS\x8c1\xd8\xd8k?\x18\xce\xa7z"\xa8\xe7\xbf<s8M\xf2y\x05@\x0e\x1aK\xe8b\xb6\xd5\xbf_O\xb0_^\xc9\xc1?{\x92*\x07~&\xc2\xbf\xcf\xac\xcc\x80\xbaH\xcc?\xe3G\xe6\xe1\xf5\xbd\xef\xbf\x7f\x82\x84\x12\xc2a\x0e@\xa7G^\x88z\xe4:@\x9c\xd1\xf3\x92\xd8\n\xe8\xbf\x8b@\xa2\xa66Z\x08@2&@\xd9`\xd8\xe2\xbfj\x08\x1f\x9e\x84\xd1\xe9\xbf\x8f5\xc9L\x8c!#@UX\xa0\x07\x89{\xdf\xbf\\]\x89\xfe\x08]\xb7?\xe7\x92B\xcb|\xed\xff?\xe2b\xe0\xb3\x94\x8c\xe9\xbf\x80H\xbf\x93\x1b\x07\xe9?2\xf6u@;k\xe6\xbf\x97.e%\xf1\xe6\x06@\x8f\xf9\x91\xc9\xe9\x9a\xe8\xbfU7\xa1\xe7\xd4\xbf\x11@L\xadA\x91\xbe#\xde?\xcf\xba\xfc\x0f\xa3\xc5\xef\xbf\x7f+\'_\xc4\n0@1=;4M\x1e\xd8\xbf\x060E~\xc9z-@3y\x08I<P\xbd?\x8d\x02\xbd\xf2\xd08\xde\xbf\x8dU\xc4I6\xcb\xe3\xbf\x0bc"\x89\xb7\xa1\r@\xc8\x17\xf79.\x1d\xd3\xbf\x8cyq\x04\xa9\xd3\xca?`\xb2\xb5R\xc4\xad\xd6\xbf\xfcF\xc90\xbdV\xe1?\x14\x94D\xc3hh\xe2\xbf\x8e|\x0cY\xdb,\xe5\xbf?\xe7\xcf\xb3\x0c\xf5\x1b@\xb9|\x12\xef\xc1\xd9\xef\xbf\xdd\xf1U2\xdff0@\x88\xff\x1e\xe9\xdb\x97\xe9?\xab\xdc\x95\xc1\xb3|\x18@\xba_\xc38\x06\xb6\xe5\xbfK\x05\xd9\x0c\xee\xee\xd2\xbf\xaf\x0c\x85|\x80i\xc9?\xcc\xd0\x90\xab\x81\xfe\xe3\xbf\xadEW\xcb\xd4\x82\t@\x10\xd2\xeett8\xea?\x91\xc9R?\x89\x00\xbd\xbf\xf7R\xb0\xe9\xd7\x9d\xe3\xbf%\x1eK\xcc;\xe3\xb7\xbf\x1ce\x80\x92D\xe1\xf2?XO\xaf\x94\xdd\xcf\xe7?iB \x9e\xe8\x12\xd1\xbf\xd5B\xf0t\xadO\xc8?>\x89x\xa3\xc1\xeb\xda\xbf\r\x1c\xf50\xec\x9d\xb5\xbf\x95FF\xe8z\xcd\xe9?}^\xbd\x94\xba\x08\xdf\xbf\xdd\xf3I\x96\xfd\xf9\xde?\xdcl-c*W\xeb\xbf\x86\xd4\xfe\x0b\xe6\x8a\x19@n\x9f\xf5\x1c\x8a\xdf\xe0\xbf`\xa2JiRI\xfa?\x88\xfb\x95\xcb\xce\x1e\xe3\xbf\x01q\xf5V~\x8f\xf8?;\xd6\x8dX$p\xe6\xbf\xec*\xb9\x9f|`\xef\xbfI\xbd\xbd\xa5\x90\xb6>@\xc4\x92\\\x81\xcd\xda\xf1?\x9c\xcdf\xe3\xf7\xac\xd5\xbfH\xc6\x8d\xbbU\xe6\xfc?=i\xb19\xe4\xc1\xe3\xbf\xa5b\xc3oo\xa8\x05@\x97\x17\x10\x8e\x84\'\xd8\xbf\x8f=z\xe6\x1al\xd4?' # noqa #E501 # gt for indicators
def add_nodes(): """ It will load all the nodes for the UI client so user can add new node to the graph. The nodes are from two sources: default gQuant nodes and customized node modules. The output is a dictionary whose keys are module names and values are a list of the nodes inside that module. Arguments ------- Returns ------- dict dictionary of all the nodes that can be added in the client """ all_modules = get_gquant_config_modules() print(all_modules) all_nodes = {} # not implemented yet for gQuant for item in inspect.getmembers(plugin_nodes): if inspect.ismodule(item[1]): print(item) all_nodes[item[0]] = [] for node in inspect.getmembers(item[1]): if inspect.isclass(node[1]): task = { 'id': 'random', 'type': node[0], 'conf': {}, 'inputs': [] } t = Task(task) n = node[1](t) if issubclass(node[1], Node): nodeObj = get_node_obj(n) all_nodes[item[0]].append(nodeObj) for module in all_modules: loaded = load_modules(all_modules[module], module) mod = loaded.mod modulename = module all_nodes[modulename] = [] for node in inspect.getmembers(mod): if node[1] == Node: continue if inspect.isclass(node[1]): if issubclass(node[1], Node): task = { 'id': 'node_' + str(uuid.uuid4())[:8], 'type': node[0], 'conf': {}, 'inputs': [], 'module': module } t = Task(task) n = node[1](t) nodeObj = get_node_obj(n) all_nodes[modulename].append(nodeObj) return all_nodes
def add_nodes(): """ It will load all the nodes for the UI client so user can add new node to the graph. The nodes are from two sources: default gQuant nodes and customized node modules. The output is a dictionary whose keys are module names and values are a list of the nodes inside that module. Arguments ------- Returns ------- dict dictionary of all the nodes that can be added in the client """ loaded_node_classes = [] all_modules = get_gquant_config_modules() print(all_modules) all_nodes = {} # not implemented yet for gQuant for item in inspect.getmembers(plugin_nodes): if inspect.ismodule(item[1]): print(item) labmod_pkg = 'gquant.{}'.format(item[0]) all_nodes[labmod_pkg] = [] for node in inspect.getmembers(item[1]): nodecls = node[1] if not inspect.isclass(nodecls): continue if not issubclass(nodecls, Node): continue if nodecls in loaded_node_classes: continue task = { 'id': 'node_' + str(uuid.uuid4()), 'type': node[0], 'conf': {}, 'inputs': [] } t = Task(task) n = nodecls(t) nodeObj = get_node_obj(n, False) all_nodes[labmod_pkg].append(nodeObj) loaded_node_classes.append(nodecls) for module in all_modules: module_file_or_path = Path(all_modules[module]) loaded = load_modules(all_modules[module], module) mod = loaded.mod modulename = module # all_nodes[modulename] = [] for node in inspect.getmembers(mod): nodecls = node[1] if not inspect.isclass(nodecls): continue if nodecls == Node: continue if not issubclass(nodecls, Node): continue if nodecls in loaded_node_classes: continue task = { 'id': 'node_' + str(uuid.uuid4()), 'type': node[0], 'conf': {}, 'inputs': [], 'module': module } t = Task(task) n = nodecls(t) nodeObj = get_node_obj(n, False) if module_file_or_path.is_dir(): # submod = nodecls.__module__.split('.')[1:] # flatten out the namespace hierarchy submod = nodecls.__module__.split('.')[1:2] modulename_ = '.'.join([modulename, '.'.join(submod)]) \ if submod else modulename all_nodes.setdefault(modulename_, []).append(nodeObj) else: all_nodes.setdefault(modulename, []).append(nodeObj) loaded_node_classes.append(nodecls) for module in dynamic_modules.keys(): modulename = module node_lists = [] all_nodes[modulename] = node_lists for class_name in dynamic_modules[module].keys(): classObj = dynamic_modules[module][class_name] if issubclass(classObj, Node): task = { 'id': 'node_' + str(uuid.uuid4()), 'type': classObj.__name__, 'conf': {}, 'inputs': [], 'module': module } t = Task(task) n = classObj(t) nodeObj = get_node_obj(n, False) node_lists.append(nodeObj) # load all the plugins from entry points for entry_point in importlib_metadata.entry_points().get( 'gquant.plugin', ()): mod = entry_point.load() modulename = entry_point.name for node in inspect.getmembers(mod): nodecls = node[1] if not inspect.isclass(nodecls): continue if nodecls == Node: continue if not issubclass(nodecls, Node): continue if nodecls in loaded_node_classes: continue task = { 'id': 'node_' + str(uuid.uuid4()), 'type': node[0], 'conf': {}, 'inputs': [], 'module': modulename } t = Task(task) n = nodecls(t) nodeObj = get_node_obj(n, False) all_nodes.setdefault(modulename, []).append(nodeObj) loaded_node_classes.append(nodecls) return all_nodes