def focus_node_from_path(self, fullpath, api_target): """ split path, find/create root with the first part, and calls expands_to_node to finish the job args : fullpath, string with dot (iph.core.tree) """ for api_option in self.list_options: if api_option is api_target: api_option.rootnode.IsExpanded = True elif api_option.rootnode: api_option.rootnode.IsExpanded = False try: nodepath = fullpath.split(api_target.path)[1] nodeslist = [node for node in nodepath.split('.') if node][::-1] parent = api_target.rootnode while nodeslist: next_node = nodeslist.pop() for node in parent.members: if node.model.name == next_node: node.IsExpanded = True # triggers members creation parent = node break if node: node.IsSelected = True except Exception as error: logger.error('Error focus_node_from_path :' + str(error))
def save_settings_and_quit(self): """ check if changes in settings and ask for save or cancel window pos is saved anyway """ _exit = True try: self.settings['window']['Left'] = self.main_form.Left self.settings['window']['Top'] = self.main_form.Top self.settings['window']['Width'] = self.main_form.Width self.settings['window']['Height'] = self.main_form.Height new_targets = [api.get_json() for api in self.modelview.treemanager.list_options] if not new_targets == self.settings['api_set']: action_user = ok_no_cancel('Save the targets changes ?') if action_user: self.settings['api_set'] = new_targets elif action_user is None: _exit = False if _exit: save_settings_to_file(self.settings, self.settings_file) except Exception as error: logger.error('save_settings failed :\n' + str(error)) finally: return _exit
def release_option(self, optionitem): """ todo plug in UI """ try: self.list_options.Remove(optionitem) except Exception as error: logger.error('Error release_option' + str(error))
def get_members(self): if self.templ_members: try: for name, ref in self.templ_members(self.ref): yield ModelObject(ref, name) except Exception as error: logger.error(error)
def remove_root_node(self, ref_node): """ delete rootnode from the tree """ try: ref_node.members.Clear() self.list_roots.Remove(ref_node) except Exception as error: logger.error('Error remove_root_node' + str(error))
def on_run_exception(self, sender, event): """ catch runtime exception when running alone """ msg = str(event.Exception.Message) ok_error(msg) logger.error('Runtime exception :\n' + msg) event.Handled = True
def replace_key_in_json(str_key, new_val, file_path): """ arg : str_key as string, new_val, path as string """ try: saved_settings = load_settings_from_file(file_path) saved_settings[str_key] = new_val with open(file_path, 'w') as jfile: json.dump(saved_settings, jfile, indent=4, sort_keys=True) except Exception as error: logger.error('save_key_to_json failed :\n' + str(error))
def update_current_tab(self, sel_tab, sel_node): """ replace details in selected tabview called by ui code-behind (on_node_select event) """ try: if not len(self.tabs_list): self.tabs_list.Add(TabViewItem(sel_node.model)) else: sel_tab.refresh(sel_node.model) except Exception as error: logger.error('update_current_tab for : {} - {}/ {}'.format( sel_tab, sel_node, error))
def close_tab(self, item): """ close selected tab unless it's the last """ try: if len(self.tabs_list) > 1: self.tabs_list.Remove(item) item.datagrid = None item = None gc.collect() except Exception as error: logger.error('Error close_tab : ' + str(error))
def load_json_index(): """ 1st attempt to use index for autocompletion and additional doc """ try: with open(os.path.join(DIR_PATH, 'index_revit.json'), 'r') as jfile: index = json.load(jfile) except Exception as error: logger.error('load_json index :\n' + str(error)) return index
def add_new_tab(self, newmodel): """ display a new tab arg: newmodel , model of the gridrow item given by ui event (works with treeitem too) """ try: new_tab = TabViewItem(newmodel) self.tabs_list.Add(new_tab) self.manager.main_form.ui_tabs_control.SelectedIndex = len( self.tabs_list) - 1 except Exception as error: logger.error('add_new_tab for : ' + str(error))
def save_settings_to_file(settings, file_path): """try to save settings to file arg : settings as dict, path as string """ try: for opt in settings['api_set']: opt['enabled'] = bool( opt['enabled']) # revit saves with uppercase bool ? with open(file_path, 'w') as jfile: json.dump(settings, jfile, indent=4, sort_keys=True) except Exception as error: logger.error('save_settings_to_file failed :\n' + str(error))
def update_grid(self): """ refresh grid rows from new model/new template filters """ self.datagrid = [] gc.collect() try: for model in self.model.get_members(): try: self.datagrid.append(ModelGridRow(model)) except Exception as error: logger.error('update_grid row error : ' + str(error)) except Exception as error: logger.error('update_grid template error : ' + str(error)) self.backup = self.datagrid[:] self.NotifyPropertyChanged("datagrid")
def create_root_node(self, ref_object, name=''): """ add a new root to the tree args : ref_object, reference name, optional, string """ if not name: name = get_member_name(ref_object) try: rootnode = NodeBase(ModelObject(ref_object, name), None) rootnode.expand_node() except Exception as error: rootnode = NodeBase(ModelObject(None, str(error)), None) logger.error('Error create_root_node :' + str(error)) self.list_roots.Add(rootnode) return rootnode
def load_settings_from_file(file_path): """try to read settings from file in directory else return the defaults arg : path as string """ try: with open(file_path, 'r') as jfile: settings = json.load(jfile) except Exception as error: settings = DEFAULT_SETTINGS if ok_or_not( 'Something wrong in the file, restore defaults settings ?'): save_settings_to_file(DEFAULT_SETTINGS, file_path) logger.error('load_settings_from_file failed :\n' + str(error)) return settings
def discover_and_run(verbose=False): """ loads all 'test_*' files and performs all 'test_*' functions """ if verbose: logger.verbose(True) logger.title('Test all components') NB_TESTS = 0 NB_FAILS = 0 NB_CRASH = 0 NB_PASSED = 0 TODO = set() import glob, os os.chdir(os.path.dirname(__file__)) modules_tests = glob.glob('test*.py') NB_MODS = len(modules_tests) checkmod = 0 for file in modules_tests: name_mod = file.split('.')[0] test_cases = [] try: tmodule = importlib.import_module('.' + name_mod, 'iph.tests') test_cases = [ case for case in dir(tmodule) if case.startswith('test_') ] if not test_cases: continue logger.title('\n * * MODULE : ' + name_mod) nb_cases = len(test_cases) NB_TESTS += nb_cases crashs = NB_CRASH fails = NB_FAILS passed = NB_PASSED for case in test_cases: msg = 'Test : ' + case + '.' * (50 - len(case)) try: dbg_timercheck(getattr(tmodule, case))() msg += 'OK' NB_PASSED += 1 except AssertionError as error: msg += 'FAILED {}'.format(error) NB_FAILS += 1 TODO.add(case) except: logger.error(msg) TODO.add(case) NB_CRASH += 1 msg += 'CRASHED ' if verbose: import traceback traceback.print_exc() finally: logger.info(msg) logger.title( '\tEnd ===> {} fails - {} crashed ({} errors raised) - {}/{}\n' .format(NB_FAILS - fails, NB_CRASH - crashs, len(logger.errors), NB_PASSED - passed, nb_cases)) checkmod += 1
TODO.add(case) NB_CRASH += 1 msg += 'CRASHED ' if verbose: import traceback traceback.print_exc() finally: logger.info(msg) logger.title( '\tEnd ===> {} fails - {} crashed ({} errors raised) - {}/{}\n' .format(NB_FAILS - fails, NB_CRASH - crashs, len(logger.errors), NB_PASSED - passed, nb_cases)) checkmod += 1 except Exception as error: break logger.error(name_mod + ' crashed !!!!! : {}'.format(error)) import traceback traceback.print_exc() logger.title( '\n\t\tTESTS END : {} modules test - {}/{} PASSED - {} fails / {} crashed' .format(NB_MODS, NB_PASSED, NB_TESTS, NB_FAILS, NB_CRASH)) logger.info('guilty functions :\n' + '\n'.join(TODO)) if not checkmod == NB_MODS: logger.info('tests CRASHED !!')