diff --git a/script/config/config_file.py b/script/config/config_file.py index 78f9baf..a850bef 100644 --- a/script/config/config_file.py +++ b/script/config/config_file.py @@ -25,7 +25,6 @@ _logger = logging.getLogger(__name__) class ConfigFile: def get_config(self, key_param: str): - # Open file and update dct_data config_base = {} config_override = {} config_private = {} @@ -45,18 +44,18 @@ class ConfigFile: merged_base_private = self.deep_merge_with_lists( config_base, config_private, list_strategy="extend" ) - dct_data = self.deep_merge_with_lists( + merged_config = self.deep_merge_with_lists( merged_base_private, config_override, list_strategy="extend" ) - return dct_data.get(key_param) + return merged_config.get(key_param) - def get_config_value(self, lst_params: list): - dct_data = self.get_config(lst_params[0]) - for param in lst_params[1:]: - if param in dct_data.keys(): - dct_data = dct_data.get(param) - return dct_data + def get_config_value(self, params: list): + config_data = self.get_config(params[0]) + for param in params[1:]: + if param in config_data: + config_data = config_data.get(param) + return config_data def get_logo_ascii_file_path(self): return LOGO_ASCII_FILE @@ -86,7 +85,7 @@ class ConfigFile: and isinstance(v, list) and list_strategy == "extend" ): - # on étend : dest_list + src_list + # Extend: dest_list + src_list result[k] = result[k] + v elif k in result and isinstance(result[k], str): if v: diff --git a/script/execute/execute.py b/script/execute/execute.py index 8fa9f8e..e7842ee 100644 --- a/script/execute/execute.py +++ b/script/execute/execute.py @@ -74,10 +74,10 @@ class Execute: return_status_and_output_and_command=False, ): """ - Exécute une command et affiche la sortie en direct. + Execute a command and display its output live. Args: - command (str): La command à exécuter (sous forme de chaîne de caractères). + command (str): The command to execute. """ my_env = os.environ.copy() @@ -126,8 +126,8 @@ class Execute: stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, - bufsize=1, # Désactive la mise en tampon pour la sortie en direct - universal_newlines=True, # Pour traiter les sauts de lines correctement + bufsize=1, # Disable buffering for live output + universal_newlines=True, # Handle line breaks correctly env=my_env, ) @@ -148,11 +148,11 @@ class Execute: .removesuffix("\r") ) - process.wait() # Attendre la fin du process + process.wait() exit_code = process.returncode if process.returncode != 0 and not quiet: print( - "La command a retourné un code d'erreur :" + "Command returned error code:" f" {process.returncode}" ) @@ -160,23 +160,23 @@ class Execute: if not quiet: if "password" in command: print( - f"Erreur : La command '{command.split(' ')[0]}'[...] n'a" - " pas été trouvée." + f"Error: Command '{command.split(' ')[0]}'[...]" + " not found." ) else: print( - f"Erreur : La command '{command}' n'a pas été trouvée." + f"Error: Command '{command}' not found." ) except Exception as e: if not quiet: - print(f"Une erreur s'est produite : {e}") + print(f"An error occurred: {e}") process_end_time = time.time() duration_sec = process_end_time - process_start_time if humanize: duration_delta = datetime.timedelta(seconds=duration_sec) - humain_time = humanize.precisedelta(duration_delta) + human_time = humanize.precisedelta(duration_delta) if not quiet: - print(f"🏠 ⬆ Executed ({humain_time}) :") + print(f"🏠 ⬆ Executed ({human_time}) :") else: if not quiet: print(f"🏠 ⬆ Executed ({duration_sec:.2f} sec.) :") diff --git a/script/git/git_merge_repo_manifest.py b/script/git/git_merge_repo_manifest.py index 7d60ca9..d70d2c2 100755 --- a/script/git/git_merge_repo_manifest.py +++ b/script/git/git_merge_repo_manifest.py @@ -184,8 +184,8 @@ def main(): dct_remote_total[key] = copy.deepcopy(value) git_tool.generate_repo_manifest( - dct_remote=dct_remote_total, - dct_project=dct_project_total, + remotes_config=dct_remote_total, + projects_config=dct_project_total, output=config.output, default_remote=default_remote_total, ) diff --git a/script/git/git_repo_manifest.py b/script/git/git_repo_manifest.py index 2a08ead..47f030a 100755 --- a/script/git/git_repo_manifest.py +++ b/script/git/git_repo_manifest.py @@ -97,8 +97,8 @@ def main(): git_tool.generate_repo_manifest( lst_repo_organization, output=f"{config.dir}{config.manifest}", - dct_remote=dct_remote, - dct_project=dct_project, + remotes_config=dct_remote, + projects_config=dct_project, keep_original=config.keep_origin, **kwargs, ) diff --git a/script/git/git_repo_update_group.py b/script/git/git_repo_update_group.py index 1b64cf9..f3faa0f 100755 --- a/script/git/git_repo_update_group.py +++ b/script/git/git_repo_update_group.py @@ -125,8 +125,8 @@ def main(): filter_group=filter_group, extra_path=config.extra_addons_path, ignore_odoo_path=config.ignore_odoo_path, - lst_add_repo=lst_add_repo, - lst_whitelist=lst_whitelist, + add_repos=lst_add_repo, + whitelist=lst_whitelist, ) diff --git a/script/git/git_tool.py b/script/git/git_tool.py index 9ff7b7d..0eb6956 100644 --- a/script/git/git_tool.py +++ b/script/git/git_tool.py @@ -128,7 +128,7 @@ class GitTool: url, _, url_git = self.get_url(url_https) url_https_organization = url_https[: url_https.rfind("/")] - d = { + repo_data = { "url": url, "url_git": url_git, "url_https": url_https, @@ -146,8 +146,8 @@ class GitTool: "sub_path": sub_path, } if get_obj: - return RepoAttrs(**d) - return d + return RepoAttrs(**repo_data) + return repo_data def get_repo_info( self, @@ -184,7 +184,7 @@ class GitTool: }] """ filename = os.path.join(repo_path, ".gitmodules") - lst_repo = [] + repos = [] with open(filename) as file: txt = file.readlines() @@ -204,7 +204,7 @@ class GitTool: "relative_path": os.path.join(repo_path, path), "name": name, } - lst_repo.append(data) + repos.append(data) name = line[12:-3] first_execution = False continue @@ -229,7 +229,7 @@ class GitTool: "relative_path": os.path.join(repo_path, path), "name": name, } - lst_repo.append(data) + repos.append(data) if add_root: repo_root = Repo(repo_path) @@ -243,10 +243,10 @@ class GitTool: "path": repo_path, "name": "", } - lst_repo.insert(0, data) + repos.insert(0, data) # Sort - lst_repo = sorted(lst_repo, key=lambda k: k.get("name")) - return lst_repo + repos = sorted(repos, key=lambda k: k.get("name")) + return repos def get_repo_info_manifest_xml( self, repo_path: str = ".", add_root: bool = False, filter_group=None @@ -266,7 +266,7 @@ class GitTool: "name": name of the submodule }] """ - lst_filter_group = filter_group.split(",") if filter_group else [] + filter_groups = filter_group.split(",") if filter_group else [] manifest_file = self.get_manifest_file(repo_path=repo_path) if not manifest_file: return [] @@ -275,30 +275,29 @@ class GitTool: filename = manifest_file else: filename = os.path.normpath(os.path.join(repo_path, manifest_file)) - lst_repo = [] + repos = [] with open(filename) as xml: xml_as_string = xml.read() xml_dict = xmltodict.parse(xml_as_string) - dct_manifest = xml_dict.get("manifest") - if not dct_manifest: + manifest_data = xml_dict.get("manifest") + if not manifest_data: return [] - if dct_manifest.get("default"): - default_remote = dct_manifest.get("default").get("@remote") + if manifest_data.get("default"): + default_remote = manifest_data.get("default").get("@remote") else: default_remote = None - lst_remote = dct_manifest.get("remote") - if type(lst_remote) is dict: - lst_remote = [lst_remote] - lst_project = dct_manifest.get("project") - if type(lst_project) is dict: - lst_project = [lst_project] - dct_remote = {a.get("@name"): a.get("@fetch") for a in lst_remote} - for project in lst_project: + remotes = manifest_data.get("remote") + if type(remotes) is dict: + remotes = [remotes] + projects = manifest_data.get("project") + if type(projects) is dict: + projects = [projects] + remotes_by_name = {a.get("@name"): a.get("@fetch") for a in remotes} + for project in projects: groups = project.get("@groups") - lst_group = groups.split(",") if groups else [] - # Continue if lst_filter exist and group in filter - for group in lst_group: - if lst_filter_group and group not in lst_filter_group: + project_groups = groups.split(",") if groups else [] + for group in project_groups: + if filter_groups and group not in filter_groups: continue else: break @@ -308,10 +307,10 @@ class GitTool: # get name and remote .git path = project.get("@path") name = path - url_prefix = dct_remote.get(project.get("@remote")) + url_prefix = remotes_by_name.get(project.get("@remote")) if not url_prefix: # get default remote - url_prefix = dct_remote.get(default_remote) + url_prefix = remotes_by_name.get(default_remote) url = f"{url_prefix}{project.get('@name')}" url, url_https, url_git = self.get_url(url) data = { @@ -323,7 +322,7 @@ class GitTool: "name": name, "group": groups, } - lst_repo.append(data) + repos.append(data) if add_root: repo_root = Repo(repo_path) @@ -346,10 +345,10 @@ class GitTool: "path": repo_path, "name": "", } - lst_repo.insert(0, data) + repos.insert(0, data) # Sort - lst_repo = sorted(lst_repo, key=lambda k: k.get("name")) - return lst_repo + repos = sorted(repos, key=lambda k: k.get("name")) + return repos def get_manifest_xml_info( self, repo_path: str = ".", filename=None, add_root: bool = False @@ -368,25 +367,25 @@ class GitTool: with open(filename) as xml: xml_as_string = xml.read() xml_dict = xmltodict.parse(xml_as_string) - dct_manifest = xml_dict.get("manifest") - if not dct_manifest: + manifest_data = xml_dict.get("manifest") + if not manifest_data: return {}, {}, None - default_remote = dct_manifest.get("default") - lst_remote = dct_manifest.get("remote") - if type(lst_remote) is dict: - lst_remote = [lst_remote] - lst_project = dct_manifest.get("project") - if type(lst_project) is dict: - lst_project = [lst_project] - if lst_remote: - dct_remote = {a.get("@name"): a for a in lst_remote} + default_remote = manifest_data.get("default") + remotes = manifest_data.get("remote") + if type(remotes) is dict: + remotes = [remotes] + projects = manifest_data.get("project") + if type(projects) is dict: + projects = [projects] + if remotes: + remotes_by_name = {a.get("@name"): a for a in remotes} else: - dct_remote = {} - if lst_project: - dct_project = {a.get("@name"): a for a in lst_project} + remotes_by_name = {} + if projects: + projects_by_name = {a.get("@name"): a for a in projects} else: - dct_project = {} - return dct_remote, dct_project, default_remote + projects_by_name = {} + return remotes_by_name, projects_by_name, default_remote @staticmethod def get_project_config(repo_path="."): @@ -403,20 +402,20 @@ class GitTool: txt = file.readlines() txt = [a[:-1] for a in txt if "=" in a] - lst_filter = [EL_GITHUB_TOKEN] - dct_config = {} + filter_keys = [EL_GITHUB_TOKEN] + config = {} # Take filtered value and get bash string values - for f in lst_filter: - for v in txt: - if f in v: - lst_v = v.split("=") - if len(lst_v) > 1: - dct_config[EL_GITHUB_TOKEN] = v.split("=")[1][1:-1] - return dct_config + for key in filter_keys: + for line in txt: + if key in line: + parts = line.split("=") + if len(parts) > 1: + config[EL_GITHUB_TOKEN] = line.split("=")[1][1:-1] + return config @staticmethod - def open_repo_web_browser(dct_repo): - url = dct_repo.get("url_https") + def open_repo_web_browser(repo_info): + url = repo_info.get("url_https") if url: webbrowser.open_new_tab(url) @@ -426,31 +425,31 @@ class GitTool: filter_group=None, extra_path=None, ignore_odoo_path=None, - lst_add_repo=None, - lst_whitelist=None, + add_repos=None, + whitelist=None, ): filename_locally = os.path.join(repo_path, "script/generate_config.sh") if not filter_group: filter_group = self.odoo_version_long - lst_repo_origin = self.get_repo_info( + all_repos = self.get_repo_info( repo_path=repo_path, filter_group=filter_group ) - if lst_whitelist: - lst_repo = [] - for repo in lst_repo_origin: + if whitelist: + repos = [] + for repo in all_repos: if ( - repo.get("path") in lst_whitelist - or repo.get("path") in lst_add_repo + repo.get("path") in whitelist + or repo.get("path") in add_repos ): - lst_repo.append(repo) + repos.append(repo) else: - lst_repo = lst_repo_origin - lst_result = [] - if not lst_repo: + repos = all_repos + results = [] + if not repos: print( f"{Fore.YELLOW}WARNING{Style.RESET_ALL}: List of repo is empty when write generate_config." ) - for repo in lst_repo: + for repo in repos: update_repo = repo.get("path") # Exception, ignore addons/OCA_web and root if update_repo in ["addons/OCA_web", "odoo", "image_db"]: @@ -472,14 +471,14 @@ class GitTool: # Ignore repo if not starting by addons # if update_repo.startswith("addons"): # lst_result.append(str_repo) - lst_result.append(str_repo) + results.append(str_repo) if extra_path: for each_extra_path in extra_path.strip().split(","): str_repo = ( f' printf "{each_extra_path}," >> ' '"${EL_CONFIG_FILE}"\n' ) - lst_result.append(str_repo) + results.append(str_repo) with open(filename_locally) as file: all_lines = file.readlines() # search place to add/replace lines @@ -501,10 +500,10 @@ class GitTool: and 'if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then\n' == line ): index_find = index + 1 - for insert_line in lst_result: + for insert_line in results: all_lines.insert(index_find, insert_line) index_find += 1 - if not lst_result: + if not results: all_lines.insert(index_find, '\tprintf ""\n') index_find += 1 find_index = True @@ -531,37 +530,37 @@ class GitTool: def generate_repo_manifest( self, - lst_repo: List[RepoAttrs] = [], + repo_list: List[RepoAttrs] = [], output: str = "", - dct_remote={}, - dct_project={}, + remotes_config={}, + projects_config={}, default_remote=None, keep_original=False, default_branch=None, ): """ Generate repo manifest - :param lst_repo: optional, update manifest with list_repo + :param repo_list: optional, update manifest with list_repo :param output: filename to write output - :param dct_remote: dict of remote information - :param dct_project: dict of project information + :param remotes_config: dict of remote information + :param projects_config: dict of project information :param default_remote: dict of default remote :param keep_original: if True, can manage multiple organization with same name, but with different fetch url :param default_branch: default branch name :return: """ - lst_remote = [] - lst_remote_name = [] - lst_project = [] - lst_project_name = [] - lst_default = [] + remote_entries = [] + remote_names = [] + project_entries = [] + project_names = [] + default_entries = [] # Fill with configuration - for dct_value in dct_remote.values(): + for dct_value in remotes_config.values(): remote_name = dct_value.get("@name") - if remote_name not in lst_remote_name: - lst_remote.append( + if remote_name not in remote_names: + remote_entries.append( OrderedDict( [ ("@name", remote_name), @@ -569,45 +568,45 @@ class GitTool: ] ) ) - lst_remote_name.append(remote_name) - for dct_value in dct_project.values(): + remote_names.append(remote_name) + for dct_value in projects_config.values(): lst_project_info = [ ("@name", dct_value.get("@name")), ("@path", dct_value.get("@path")), ] - if "@remote" in dct_value.keys(): + if "@remote" in dct_value: lst_project_info.append(("@remote", dct_value.get("@remote"))) - if "@revision" in dct_value.keys(): + if "@revision" in dct_value: lst_project_info.append( ("@revision", dct_value.get("@revision")) ) - if "@clone-depth" in dct_value.keys(): + if "@clone-depth" in dct_value: lst_project_info.append( ("@clone-depth", dct_value.get("@clone-depth")) ) - if "@groups" in dct_value.keys(): + if "@groups" in dct_value: lst_project_info.append(("@groups", dct_value.get("@groups"))) - if "@upstream" in dct_value.keys(): + if "@upstream" in dct_value: lst_project_info.append( ("@upstream", dct_value.get("@upstream")) ) - if "@dest-branch" in dct_value.keys(): + if "@dest-branch" in dct_value: lst_project_info.append( ("@dest-branch", dct_value.get("@dest-branch")) ) - lst_project.append(OrderedDict(lst_project_info)) - lst_project_name.append(dct_value.get("@name")) + project_entries.append(OrderedDict(lst_project_info)) + project_names.append(dct_value.get("@name")) - for repo in lst_repo: + for repo in repo_list: if not repo.is_submodule: # Default - if lst_default: + if default_entries: raise Exception( "Cannot have many root repo. " "Validate why 2 or more is not submodule." ) - lst_default.append( + default_entries.append( OrderedDict( [ ("@remote", repo.original_organization), @@ -620,7 +619,7 @@ class GitTool: else: if ( keep_original - and repo.project_name not in dct_project.keys() + and repo.project_name not in projects_config ): # Exception, create a new remote to keep tracking on original original_organization = ( @@ -629,8 +628,8 @@ class GitTool: else: original_organization = repo.original_organization # Add remote, only unique remote - if original_organization not in lst_remote_name: - lst_remote.append( + if original_organization not in remote_names: + remote_entries.append( OrderedDict( [ ("@name", original_organization), @@ -638,10 +637,10 @@ class GitTool: ] ) ) - lst_remote_name.append(repo.original_organization) + remote_names.append(repo.original_organization) # Add project, only unique project - if repo.project_name not in lst_project_name: - lst_project_name.append(repo.project_name) + if repo.project_name not in project_names: + project_names.append(repo.project_name) lst_project_info = [ ("@name", repo.project_name), ("@path", repo.path), @@ -657,10 +656,10 @@ class GitTool: lst_project_info.append(("@groups", "addons")) else: lst_project_info.append(("@groups", "odoo")) - lst_project.append(OrderedDict(lst_project_info)) + project_entries.append(OrderedDict(lst_project_info)) - if default_remote and not lst_default: - lst_default.append( + if default_remote and not default_entries: + default_entries.append( OrderedDict( [ ("@remote", default_remote.get("@remote")), @@ -672,29 +671,29 @@ class GitTool: ) # Order in alphabetic - lst_order_remote = sorted(lst_remote, key=lambda key: key.get("@name")) - lst_order_default = sorted( - lst_default, key=lambda key: key.get("@remote") + sorted_remotes = sorted(remote_entries, key=lambda key: key.get("@name")) + sorted_defaults = sorted( + default_entries, key=lambda key: key.get("@remote") ) - lst_order_project = sorted( - lst_project, key=lambda key: key.get("@name") + key.get("@path") + sorted_projects = sorted( + project_entries, key=lambda key: key.get("@name") + key.get("@path") ) - dct_repo = OrderedDict( + manifest_dict = OrderedDict( [ ( "manifest", OrderedDict( [ - ("remote", lst_order_remote), - ("default", lst_order_default), - ("project", lst_order_project), + ("remote", sorted_remotes), + ("default", sorted_defaults), + ("project", sorted_projects), ] ), ) ] ) - str_xml_text = xmltodict.unparse(dct_repo, pretty=True) + str_xml_text = xmltodict.unparse(manifest_dict, pretty=True) pos_insert = str_xml_text.rfind("") if pos_insert >= 0: @@ -730,12 +729,12 @@ class GitTool: print(str_xml_text + "\n") def generate_git_modules( - self, lst_repo: List[RepoAttrs], repo_path: str = "." + self, repo_list: List[RepoAttrs], repo_path: str = "." ): - lst_modules = [] - for repo in lst_repo: + modules = [] + for repo in repo_list: if repo.is_submodule: - lst_modules.append( + modules.append( f'[submodule "{repo.path}"]\n' f"\turl = {repo.url_https}\n" f"\tpath = {repo.path}\n" @@ -743,7 +742,7 @@ class GitTool: # create file with open(os.path.join(repo_path, ".gitmodules"), mode="w") as file: - file.writelines(lst_modules) + file.writelines(modules) def get_source_repo_addons(self, repo_path=".", add_repo_root=False): """ @@ -761,7 +760,7 @@ class GitTool: }] """ file_name = os.path.join(repo_path, SOURCE_REPO_ADDONS_FILE) - lst_result = [] + results = [] if add_repo_root: # TODO what to do if origin not exist? repo = Repo(repo_path) @@ -769,7 +768,7 @@ class GitTool: repo_info = self.get_transformed_repo_info_from_url( url, repo_path=repo_path, get_obj=False, is_submodule=False ) - lst_result.append(repo_info) + results.append(repo_info) with open(file_name) as file: all_lines = file.readlines() if all_lines: @@ -812,8 +811,8 @@ class GitTool: revision=revision, clone_depth=clone_depth, ) - lst_result.append(repo_info) - return lst_result + results.append(repo_info) + return results def get_manifest_file(self, repo_path: str = "."): """ @@ -852,23 +851,20 @@ class GitTool: :param sync_with_submodule: force use submodule with repo_compare_to :return: (list of matches, list of missing, list of more) """ - lst_repo_info_actual = self.get_repo_info_manifest_xml(actual_repo) - dct_repo_info_actual = {a.get("name"): a for a in lst_repo_info_actual} - # set_actual = set(dct_repo_info_actual.keys()) - # set_actual_repo = set( - # [a[a.find("_") + 1:] for a in dct_repo_info_actual.keys()]) + actual_repos = self.get_repo_info_manifest_xml(actual_repo) + actual_by_name = {a.get("name"): a for a in actual_repos} - dct_repo_info_actual_adapted = { + actual_adapted = { key[key.find("_") + 1 :]: item - for key, item in dct_repo_info_actual.items() + for key, item in actual_by_name.items() } - set_actual_repo = set(dct_repo_info_actual_adapted.keys()) + set_actual_repo = set(actual_adapted.keys()) - lst_repo_info_compare = self.get_repo_info( + compare_repos = self.get_repo_info( repo_compare_to, is_manifest=not sync_with_submodule ) if force_normalize_compare: - for repo_info in lst_repo_info_compare: + for repo_info in compare_repos: url_https = repo_info.get("url_https") url_split = url_https.split("/") organization = url_split[3] @@ -879,59 +875,55 @@ class GitTool: name = f"{repo_name}" repo_info["name"] = name - dct_repo_info_compare = { - a.get("name"): a for a in lst_repo_info_compare + compare_by_name = { + a.get("name"): a for a in compare_repos } - set_compare = set(dct_repo_info_compare.keys()) + set_compare = set(compare_by_name.keys()) - # TODO finish the match - # lst_same_name = set_actual.intersection(set_compare) - # lst_missing_name = set_compare.difference(set_actual) - - lst_same_name_normalize = set_actual_repo.intersection(set_compare) - lst_missing_name_normalize = set_compare.difference(set_actual_repo) - lst_over_name_normalize = set_actual_repo.difference(set_compare) + same_names = set_actual_repo.intersection(set_compare) + missing_names = set_compare.difference(set_actual_repo) + extra_names = set_actual_repo.difference(set_compare) print( - f"Has {len(lst_same_name_normalize)} sames, " - f"{len(lst_missing_name_normalize)} missing, " - f"{len(lst_over_name_normalize)} more." + f"Has {len(same_names)} sames, " + f"{len(missing_names)} missing, " + f"{len(extra_names)} more." ) - lst_match = [] - for key in lst_same_name_normalize: - lst_match.append( - (dct_repo_info_actual_adapted[key], dct_repo_info_compare[key]) + matches = [] + for key in same_names: + matches.append( + (actual_adapted[key], compare_by_name[key]) ) - return lst_match, lst_missing_name_normalize, lst_over_name_normalize + return matches, missing_names, extra_names @staticmethod def sync_to(result, checkout_when_diff=False): - lst_compare_repo_info, lst_missing_info, lst_over_info = result - total = len(lst_missing_info) + compared_repos, missing_repos, extra_repos = result + total = len(missing_repos) if total: print(f"\nList of missing : {total}") i = 0 - for info in lst_missing_info: + for info in missing_repos: i += 1 print(f"Nb element {i}/{total}") print(f"Missing '{info}'") - total = len(lst_over_info) + total = len(extra_repos) if total: print(f"\nList of over : {total}") i = 0 - for info in lst_over_info: + for info in extra_repos: i += 1 print(f"Nb element {i}/{total}") print(f"Missing '{info}'") - total = len(lst_compare_repo_info) + total = len(compared_repos) print(f"\nList of normalize : {total}") - lst_same = [] - lst_diff = [] + same = [] + diffs = [] i = 0 - for original, compare_to in lst_compare_repo_info: + for original, compare_to in compared_repos: i += 1 print(f"Nb element {i}/{total}") repo_original = Repo(original.get("relative_path")) @@ -943,7 +935,7 @@ class GitTool: f"DIFF - {original.get('name')} - O {commit_original} - " f"R {commit_compare}" ) - lst_diff.append((original, compare_to)) + diffs.append((original, compare_to)) if checkout_when_diff: # Update all remote for remote in repo_original.remotes: @@ -954,8 +946,8 @@ class GitTool: repo_original.git.checkout(commit_compare) else: print(f"SAME - {original.get('name')}") - lst_same.append((original, compare_to)) - print(f"finish same {len(lst_same)}, diff {len(lst_diff)}") + same.append((original, compare_to)) + print(f"finish same {len(same)}, diff {len(diffs)}") @staticmethod def add_and_fetch_remote( diff --git a/script/process/kill_process_by_port.py b/script/process/kill_process_by_port.py index c34289e..b448fa5 100755 --- a/script/process/kill_process_by_port.py +++ b/script/process/kill_process_by_port.py @@ -6,7 +6,7 @@ import sys import psutil -STOP_PARENT_KILL = ["./odoo_bin.sh", "./run.sh"] +WRAPPER_SCRIPT_NAMES = ["./odoo_bin.sh", "./run.sh"] # Processes that must never be killed — killing these # can crash the desktop session or the system. @@ -77,12 +77,12 @@ def choose_target(chain, parent_depth): if not chain: return None - parent_chain = [] - for pid in chain: - parent_chain.append(pid) - for str_to_stop in STOP_PARENT_KILL: - if str_to_stop in pid.cmdline(): - return pid, parent_chain + ancestors = [] + for proc in chain: + ancestors.append(proc) + for wrapper in WRAPPER_SCRIPT_NAMES: + if wrapper in proc.cmdline(): + return proc, ancestors return chain[parent_depth - 1], [chain[parent_depth - 1]] @@ -164,12 +164,12 @@ def main(): args = ap.parse_args() if not (1 <= args.port <= 65535): - print("Port invalide (1-65535).", file=sys.stderr) + print("Invalid port (1-65535).", file=sys.stderr) return 2 pids = find_listeners(args.port) if not pids: - print(f"Aucun process en LISTEN sur {args.port}.") + print(f"No process listening on port {args.port}.") return 1 for pid in pids: @@ -177,7 +177,7 @@ def main(): if not chain: continue - target, lst_target = choose_target(chain, args.parent_depth) + target, target_chain = choose_target(chain, args.parent_depth) print(f"\nListener PID {pid} ancestry:") for i, p in enumerate(chain): @@ -189,14 +189,14 @@ def main(): if target.pid == 1: print( - "Refus: la cible est PID 1 (systemd)." - " Utilise plutôt systemctl pour arrêter" - " le service.", + "Refused: target is PID 1 (systemd)." + " Use systemctl to stop the service" + " instead.", ) continue if target.name() in PROTECTED_NAMES: print( - f"Refus: le process '{target.name()}' semble être protégé et dangereux à être arrêter.", + f"Refused: process '{target.name()}' is protected and dangerous to kill.", ) continue @@ -208,9 +208,9 @@ def main(): while not has_response and not ignore_kill: confirm = ( input( - f"Tuer ce processus index {args.parent_depth} (enter) ou mettre " - f"l'index [0 to {len(chain) - 1}] du " - f"process à tuer, (c/C) pour annuler : \n" + f"Kill process at index {args.parent_depth} (enter) or enter " + f"index [0 to {len(chain) - 1}] of " + f"process to kill, (c/C) to cancel: \n" ) .strip() .lower() @@ -234,7 +234,7 @@ def main(): alive = kill_tree(target, force=args.force) if alive: print( - "Toujours vivants:", + "Still alive:", ", ".join(str(p.pid) for p in alive), ) else: @@ -244,7 +244,7 @@ def main(): kill_process(target, force=args.force) except psutil.AccessDenied as e: print( - f"AccessDenied: {e} (lance le script avec sudo).", + f"AccessDenied: {e} (run the script with sudo).", file=sys.stderr, ) diff --git a/script/todo/todo.py b/script/todo/todo.py index dcdda93..28339c0 100755 --- a/script/todo/todo.py +++ b/script/todo/todo.py @@ -84,7 +84,7 @@ class TODO: def __init__(self): self.dir_path = None self.kdbx = None - self.file_path = None + self.selected_file_path = None self.config_file = config_file.ConfigFile() self.execute = execute.Execute() @@ -173,29 +173,29 @@ class TODO: if self.kdbx: return self.kdbx # Open file - chemin_fichier_kdbx = self.config_file.get_config_value( + kdbx_file_path = self.config_file.get_config_value( ["kdbx", "path"] ) - if not chemin_fichier_kdbx: + if not kdbx_file_path: root = tk.Tk() root.withdraw() # Hide the main window - chemin_fichier_kdbx = filedialog.askopenfilename( + kdbx_file_path = filedialog.askopenfilename( title="Select a File", filetypes=(("KeepassX files", "*.kdbx"),), ) - if not chemin_fichier_kdbx: + if not kdbx_file_path: _logger.error( f"KDBX is not configured, please fill {self.config_file.CONFIG_FILE}" ) return - mot_de_passe_kdbx = self.config_file.get_config_value( + kdbx_password = self.config_file.get_config_value( ["kdbx", "password"] ) - if not mot_de_passe_kdbx: - mot_de_passe_kdbx = getpass.getpass(prompt=t("enter_password")) + if not kdbx_password: + kdbx_password = getpass.getpass(prompt=t("enter_password")) - kp = PyKeePass(chemin_fichier_kdbx, password=mot_de_passe_kdbx) + kp = PyKeePass(kdbx_file_path, password=kdbx_password) if kp: self.kdbx = kp @@ -213,10 +213,10 @@ class TODO: kp = self.get_kdbx() if not kp: return - nom_configuration = self.config_file.get_config_value( + config_name = self.config_file.get_config_value( ["kdbx_config", "openai", "kdbx_key"] ) - entry = kp.find_entries_by_title(nom_configuration, first=True) + entry = kp.find_entries_by_title(config_name, first=True) client = openai.OpenAI(api_key=entry.password) prompt_update = status @@ -256,7 +256,7 @@ class TODO: if status is not False: return elif status == "2": - status = self.prompt_execute_fonction() + status = self.prompt_execute_function() if status is not False: return elif status == "3": @@ -370,7 +370,7 @@ class TODO: # TODO maybe update q to only install erplibre from install_locally # TODO problem installing with q, the script depend on odoo key_i = 0 - dct_cmd_intern_begin = { + commands_begin = { "q": ( "q", "q: ERPLibre only with system python without Odoo", @@ -391,43 +391,43 @@ class TODO: f"0: {t('menu_quit')}", ), } - dct_final_cmd_intern = {} - lst_version, lst_version_installed, odoo_installed_version = ( + commands_end = {} + versions, installed_versions, odoo_installed_version = ( self.get_odoo_version() ) - for dct_version in lst_version[::-1]: + for version_info in versions[::-1]: key_i += 1 key_s = str(key_i) - label = f"{key_s}: Odoo {dct_version.get('odoo_version')}" + label = f"{key_s}: Odoo {version_info.get('odoo_version')}" - odoo_version = f"odoo{dct_version.get('odoo_version')}" - if odoo_version in lst_version_installed: + odoo_version = f"odoo{version_info.get('odoo_version')}" + if odoo_version in installed_versions: label += " - Installed" if odoo_version == odoo_installed_version: label += " - Actual" - if dct_version.get("default"): + if version_info.get("default"): label += " - Default" - if dct_version.get("is_deprecated"): + if version_info.get("is_deprecated"): label += " - Deprecated" - erplibre_version = dct_version.get("erplibre_version") - dct_cmd_intern_begin[key_s] = ( + erplibre_version = version_info.get("erplibre_version") + commands_begin[key_s] = ( key_s, label, f"./script/version/update_env_version.py --erplibre_version {erplibre_version} --install_dev", ) # Add final command - dct_cmd_intern = {**dct_cmd_intern_begin, **dct_final_cmd_intern} + install_commands = {**commands_begin, **commands_end} # Show command odoo_version_input = "" - while odoo_version_input not in dct_cmd_intern.keys(): + while odoo_version_input not in install_commands: if odoo_version_input: print(f"{t('error_value')} '{odoo_version_input}'") str_input_dyn_odoo_version = ( f"💬 {t('choose_version')}\n\t" - + "\n\t".join([a[1] for a in dct_cmd_intern.values()]) + + "\n\t".join([a[1] for a in install_commands.values()]) + f"\n{t('selection')}" ) odoo_version_input = ( @@ -437,7 +437,7 @@ class TODO: if odoo_version_input == "0": return - cmd_intern = dct_cmd_intern.get(odoo_version_input)[2] + cmd_intern = install_commands.get(odoo_version_input)[2] print(f"{t('will_execute')}\n{cmd_intern}") # TODO use external script to detect terminal to use on system @@ -454,12 +454,12 @@ class TODO: self.restart_script(str(e)) def execute_from_configuration( - self, dct_instance, exec_run_db=False, ignore_makefile=False + self, instance, exec_run_db=False, ignore_makefile=False ): # exec_run_db need argument database - kdbx_key = dct_instance.get("kdbx_key") - odoo_user = dct_instance.get("user") - odoo_password = dct_instance.get("password") + kdbx_key = instance.get("kdbx_key") + odoo_user = instance.get("user") + odoo_password = instance.get("password") if kdbx_key: extra_cmd_web_login = self.kdbx_get_extra_command_user(kdbx_key) @@ -471,7 +471,7 @@ class TODO: else: extra_cmd_web_login = "" - makefile_cmd = dct_instance.get("makefile_cmd") + makefile_cmd = instance.get("makefile_cmd") if makefile_cmd and not ignore_makefile: status = self.execute.exec_command_live( f"make {makefile_cmd}", @@ -485,30 +485,30 @@ class TODO: return if exec_run_db: - db_name = dct_instance.get("database") + db_name = instance.get("database") self.prompt_execute_selenium_and_run_db( db_name, extra_cmd_web_login=extra_cmd_web_login ) - command = dct_instance.get("command") + command = instance.get("command") if command: self.prompt_execute_selenium( command=command, extra_cmd_web_login=extra_cmd_web_login ) - callback = dct_instance.get("callback") + callback = instance.get("callback") if callback: - callback(dct_instance) + callback(instance) - def fill_help_info(self, lst_choice): + def fill_help_info(self, choices): help_info = t("command") + "\n" help_end = f"[0] {t('back')}\n" - for i, dct_instance in enumerate(lst_choice): - desc_key = dct_instance.get("prompt_description_key") + for i, instance in enumerate(choices): + desc_key = instance.get("prompt_description_key") if desc_key: desc = t(desc_key) else: - desc = dct_instance["prompt_description"] + desc = instance["prompt_description"] help_info += f"[{i + 1}] " + desc + "\n" help_info += help_end return help_info @@ -517,24 +517,24 @@ class TODO: # TODO proposer le déploiement à distance # TODO proposer l'exécution de docker # TODO proposer la création de docker - lst_choice = self.config_file.get_config("instance") - init_len = len(lst_choice) + choices = self.config_file.get_config("instance") + init_len = len(choices) # Support mobile ERPLibre if os.path.exists(MOBILE_HOME_PATH): - dct_upgrade_odoo_database = { + menu_entry = { "prompt_description": t("mobile_compile_run"), "callback": self.callback_make_mobile_home, } - lst_choice.append(dct_upgrade_odoo_database) + choices.append(menu_entry) # Support custom database to execute - dct_upgrade_odoo_database = { + menu_entry = { "prompt_description": t("choose_database"), "callback": self.callback_execute_custom_database, } - lst_choice.insert(0, dct_upgrade_odoo_database) - help_info = self.fill_help_info(lst_choice) + choices.insert(0, menu_entry) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -548,27 +548,27 @@ class TODO: if 1 < int_cmd <= init_len: cmd_no_found = False status = click.confirm(t("new_instance_confirm")) - dct_instance = lst_choice[int_cmd - 1] + instance = choices[int_cmd - 1] self.execute_from_configuration( - dct_instance, + instance, exec_run_db=True, ignore_makefile=not bool(status), ) - elif int_cmd <= len(lst_choice) or 1 == int_cmd: + elif int_cmd <= len(choices) or 1 == int_cmd: cmd_no_found = False # Execute dynamic instance - dct_instance = lst_choice[int_cmd - 1] + instance = choices[int_cmd - 1] self.execute_from_configuration( - dct_instance, + instance, ) except ValueError: pass if cmd_no_found: print(t("cmd_not_found")) - def prompt_execute_fonction(self): - lst_choice = self.config_file.get_config("function") - help_info = self.fill_help_info(lst_choice) + def prompt_execute_function(self): + choices = self.config_file.get_config("function") + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -579,10 +579,10 @@ class TODO: cmd_no_found = True try: int_cmd = int(status) - if 0 < int_cmd <= len(lst_choice): + if 0 < int_cmd <= len(choices): cmd_no_found = False - dct_instance = lst_choice[int_cmd - 1] - self.execute_from_configuration(dct_instance) + instance = choices[int_cmd - 1] + self.execute_from_configuration(instance) except ValueError: pass if cmd_no_found: @@ -599,35 +599,35 @@ class TODO: # TODO faire la mise à jour de ERPLibre # TODO faire l'upgrade d'un odoo vers un autre - lst_choice = self.config_file.get_config("update_from_makefile") - dct_upgrade_odoo_database = { + choices = self.config_file.get_config("update_from_makefile") + menu_entry = { "prompt_description": t("upgrade_odoo_migration"), } - lst_choice.append(dct_upgrade_odoo_database) - dct_upgrade_poetry = { + choices.append(menu_entry) + poetry_entry = { "prompt_description": t("upgrade_poetry_dependency"), } - lst_choice.append(dct_upgrade_poetry) - help_info = self.fill_help_info(lst_choice) + choices.append(poetry_entry) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) print() if status == "0": return False - elif status == str(len(lst_choice) - 1): + elif status == str(len(choices) - 1): upgrade = todo_upgrade.TodoUpgrade(self) upgrade.execute_odoo_upgrade() - elif status == str(len(lst_choice)): + elif status == str(len(choices)): self.upgrade_poetry() else: cmd_no_found = True try: int_cmd = int(status) - 1 - if 0 < int_cmd <= len(lst_choice): + if 0 < int_cmd <= len(choices): cmd_no_found = False - dct_instance = lst_choice[int_cmd - 1] - self.execute_from_configuration(dct_instance) + instance = choices[int_cmd - 1] + self.execute_from_configuration(instance) except ValueError: pass if cmd_no_found: @@ -647,45 +647,45 @@ class TODO: # [0] Retour # """ - lst_choice = self.config_file.get_config("code_from_makefile") + choices = self.config_file.get_config("code_from_makefile") - dct_upgrade_odoo_database = { + menu_entry = { "prompt_description": t("open_shell"), } - lst_choice.append(dct_upgrade_odoo_database) + choices.append(menu_entry) - dct_upgrade_odoo_database = { + menu_entry = { "prompt_description": t("upgrade_module"), } - lst_choice.append(dct_upgrade_odoo_database) + choices.append(menu_entry) - lst_choice.append( + choices.append( { "prompt_description": t("debug"), } ) - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) print() if status == "0": return False - elif status == str(len(lst_choice)): + elif status == str(len(choices)): self.debug_ide() - elif status == str(len(lst_choice) - 1): + elif status == str(len(choices) - 1): self.upgrade_module() - elif status == str(len(lst_choice) - 2): + elif status == str(len(choices) - 2): self.open_shell_on_database() else: cmd_no_found = True try: int_cmd = int(status) - if 0 < int_cmd <= len(lst_choice): + if 0 < int_cmd <= len(choices): cmd_no_found = False - dct_instance = lst_choice[int_cmd - 1] - self.execute_from_configuration(dct_instance) + instance = choices[int_cmd - 1] + self.execute_from_configuration(instance) except ValueError: pass if cmd_no_found: @@ -693,16 +693,16 @@ class TODO: def prompt_execute_git(self): print(f"🤖 {t('git_manage')}") - lst_choice = [ + choices = [ {"prompt_description": t("git_local_server")}, ] # Append config-driven entries - lst_config = self.config_file.get_config("git_from_makefile") - if lst_config: - lst_choice.extend(lst_config) + config_entries = self.config_file.get_config("git_from_makefile") + if config_entries: + choices.extend(config_entries) - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -715,10 +715,10 @@ class TODO: cmd_no_found = True try: int_cmd = int(status) - if 0 < int_cmd <= len(lst_choice): + if 0 < int_cmd <= len(choices): cmd_no_found = False - dct_instance = lst_choice[int_cmd - 1] - self.execute_from_configuration(dct_instance) + instance = choices[int_cmd - 1] + self.execute_from_configuration(instance) except ValueError: pass if cmd_no_found: @@ -726,11 +726,11 @@ class TODO: def prompt_execute_git_local_server(self): print(f"🤖 {t('git_repo_manage')}") - lst_choice = [ + choices = [ {"prompt_description": t("git_repo_deploy_local")}, {"prompt_description": t("git_repo_deploy_production")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -751,14 +751,14 @@ class TODO: else t("git_mode_local") ) print(f"🤖 {mode}") - lst_choice = [ + choices = [ {"prompt_description": t("git_action_all")}, {"prompt_description": t("git_action_init")}, {"prompt_description": t("git_action_remote")}, {"prompt_description": t("git_action_push")}, {"prompt_description": t("git_action_serve")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -807,10 +807,10 @@ class TODO: def prompt_execute_gpt_code(self): print(f"🤖 {t('gpt_code_manage')}") - lst_choice = [ + choices = [ {"prompt_description": t("gpt_code_claude_commit")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -863,13 +863,13 @@ class TODO: def prompt_execute_doc(self): print(f"🤖 {t('doc_search')}") - lst_choice = [ + choices = [ {"prompt_description": t("migration_module_coverage")}, {"prompt_description": t("what_change_between_version")}, {"prompt_description": t("oca_guidelines")}, {"prompt_description": t("oca_migration_odoo_19")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -912,12 +912,12 @@ class TODO: def prompt_execute_database(self): print(f"🤖 {t('db_modify')}") - lst_choice = [ + choices = [ {"prompt_description": t("download_db_backup")}, {"prompt_description": t("restore_from_backup")}, {"prompt_description": t("create_backup")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -935,11 +935,11 @@ class TODO: def prompt_execute_process(self): print(f"🤖 {t('process_manage')}") - lst_choice = [ + choices = [ {"prompt_description": t("kill_process_port")}, {"prompt_description": t("kill_git_daemon")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -962,14 +962,14 @@ class TODO: def prompt_execute_config(self): print(f"🤖 {t('config_manage')}") - lst_choice = [ + choices = [ {"prompt_description": t("generate_all_config")}, {"prompt_description": t("generate_from_preconfig")}, {"prompt_description": t("generate_from_backup")}, {"prompt_description": t("generate_from_database")}, {"prompt_description": t("setup_queue_job_for_parallelism")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -991,7 +991,7 @@ class TODO: def prompt_execute_network(self): print(f"🤖 {t('network_tools')}") - lst_choice = [ + choices = [ {"prompt_description": t("ssh_port_forwarding")}, { "prompt_description": t( @@ -999,7 +999,7 @@ class TODO: ) }, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -1039,10 +1039,10 @@ class TODO: def prompt_execute_security(self): print(f"🤖 {t('security_audit')}") - lst_choice = [ + choices = [ {"prompt_description": t("pip_audit_desc")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -1056,12 +1056,12 @@ class TODO: def prompt_execute_test(self): print(f"🤖 {t('test_description')}") - lst_choice = [ + choices = [ {"prompt_description": t("test_run_module")}, {"prompt_description": t("test_run_module_coverage")}, {"prompt_description": t("test_run_unit_tests")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -1180,18 +1180,18 @@ class TODO: print(f"\n❌ {t('test_unit_failed')}: {status_code}") def execute_pip_audit(self): - lst_version, lst_version_installed, odoo_installed_version = ( + versions, installed_versions, odoo_installed_version = ( self.get_odoo_version() ) # Build list of installed environments - dct_env = {} + environments = {} key_i = 0 - for dct_version in lst_version[::-1]: - erplibre_version = dct_version.get("erplibre_version") + for version_info in versions[::-1]: + erplibre_version = version_info.get("erplibre_version") venv_path = f".venv.{erplibre_version}" req_path = f"requirement/requirements.{erplibre_version}.txt" - odoo_version = f"odoo{dct_version.get('odoo_version')}" + odoo_version = f"odoo{version_info.get('odoo_version')}" if not os.path.isdir(venv_path): continue @@ -1201,29 +1201,29 @@ class TODO: label = f"{key_s}: {erplibre_version}" if odoo_version == odoo_installed_version: label += f" - {t('current')}" - if dct_version.get("default"): + if version_info.get("default"): label += f" - {t('default')}" - dct_env[key_s] = { + environments[key_s] = { "label": label, "venv_path": venv_path, "req_path": req_path, "erplibre_version": erplibre_version, } - if not dct_env: + if not environments: print(t("no_env_installed")) return # Show selection menu str_input = ( f"💬 {t('choose_env_audit')}\n\t" - + "\n\t".join([v["label"] for v in dct_env.values()]) + + "\n\t".join([v["label"] for v in environments.values()]) + f"\n\t0: {t('back')}" + f"\n{t('selection')}" ) env_input = "" - while env_input not in dct_env.keys() and env_input != "0": + while env_input not in environments and env_input != "0": if env_input: print(f"{t('error_value')}" f" '{env_input}'") env_input = input(str_input).strip() @@ -1231,7 +1231,7 @@ class TODO: if env_input == "0": return - selected = dct_env[env_input] + selected = environments[env_input] venv_path = selected["venv_path"] req_path = selected["req_path"] @@ -1267,14 +1267,14 @@ class TODO: ) def generate_config_from_preconfiguration(self): - lst_choice = [ + choices = [ {"prompt_description": t("preconfig_base")}, {"prompt_description": t("preconfig_base_code_generator")}, {"prompt_description": t("preconfig_base_image_db")}, {"prompt_description": t("preconfig_all")}, # {"prompt_description": "base + migration"}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -1303,10 +1303,10 @@ class TODO: print(t("cmd_not_found")) def debug_ide(self): - lst_choice = [ + choices = [ {"prompt_description": t("debug_todo_py")}, ] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) while True: status = click.prompt(help_info) @@ -1342,25 +1342,25 @@ class TODO: def select_database(self): cmd_server = f"./odoo_bin.sh db --list" - status, lst_database = self.execute.exec_command_live( + status, databases = self.execute.exec_command_live( cmd_server, return_status_and_output=True, source_erplibre=False, single_source_erplibre=True, ) - lst_choice = [{"prompt_description": a.strip()} for a in lst_database] + choices = [{"prompt_description": a.strip()} for a in databases] - help_info = self.fill_help_info(lst_choice) + help_info = self.fill_help_info(choices) - lst_str_choice = [str(a) for a in range(len(lst_choice) + 1) if a] + valid_choices = [str(a) for a in range(len(choices) + 1) if a] while True: status = click.prompt(help_info) print() if status == "0": return False - elif status in lst_str_choice: - database_name = lst_database[int(status) - 1].strip() + elif status in valid_choices: + database_name = databases[int(status) - 1].strip() print(database_name) return database_name else: @@ -1374,15 +1374,15 @@ class TODO: raise Exception( f"Internal error, no Odoo version is supported, please valide file '{VERSION_DATA_FILE}'" ) - lst_version_transform = [] + version_entries = [] for key, value in data_version.items(): - lst_version_transform.append(value) + version_entries.append(value) value["erplibre_version"] = key - lst_version_installed = [] + installed_versions = [] if os.path.exists(INSTALLED_ODOO_VERSION_FILE): with open(INSTALLED_ODOO_VERSION_FILE) as txt: - lst_version_installed = sorted(txt.read().splitlines()) + installed_versions = sorted(txt.read().splitlines()) odoo_installed_version = None if os.path.exists(ODOO_VERSION_FILE): @@ -1390,23 +1390,23 @@ class TODO: odoo_installed_version = f"odoo{txt.read().strip()}" # Add odoo version installation on command - lst_version = sorted( - lst_version_transform, key=lambda k: k.get("erplibre_version") + versions = sorted( + version_entries, key=lambda k: k.get("erplibre_version") ) - return lst_version, lst_version_installed, odoo_installed_version + return versions, installed_versions, odoo_installed_version def kdbx_get_extra_command_user(self, kdbx_key): - lst_value = [] + values = [] if kdbx_key: kp = self.get_kdbx() if not kp: return "" if type(kdbx_key) is not list: - lst_kdbx_key = [kdbx_key] + kdbx_keys = [kdbx_key] else: - lst_kdbx_key = kdbx_key - for key in lst_kdbx_key: + kdbx_keys = kdbx_key + for key in kdbx_keys: entry = kp.find_entries_by_title(key, first=True) try: odoo_user = entry.username @@ -1416,23 +1416,18 @@ class TODO: odoo_password = entry.password except AttributeError: _logger.error(f"Cannot find password from keys {key}") - lst_value.append( + values.append( " --default_email_auth" f" {odoo_user} --default_password_auth '{odoo_password}'" ) - if len(lst_value) == 0: + if len(values) == 0: return "" - elif len(lst_value) == 1: - return lst_value[0] - return lst_value + elif len(values) == 1: + return values[0] + return values - def prompt_execute_selenium_and_run_db(self, bd, extra_cmd_web_login=""): - # cmd = ( - # f'parallel ::: "./run.sh -d {bd}" "sleep' - # f' 3;./script/selenium/web_login.py{extra_cmd_web_login}"' - # ) - # self.execute.exec_command_live(cmd) - cmd_server = f"./run.sh -d {bd};bash" + def prompt_execute_selenium_and_run_db(self, db_name, extra_cmd_web_login=""): + cmd_server = f"./run.sh -d {db_name};bash" self.execute.exec_command_live(cmd_server) cmd_client = ( f"sleep 3;./script/selenium/web_login.py{extra_cmd_web_login};bash" @@ -1440,7 +1435,7 @@ class TODO: self.execute.exec_command_live(cmd_client) def prompt_execute_selenium(self, command=None, extra_cmd_web_login=""): - lst_cmd = [] + commands = [] if not command: cmd = "./script/selenium/web_login.py" else: @@ -1448,15 +1443,15 @@ class TODO: if type(extra_cmd_web_login) is list: for item in extra_cmd_web_login: - lst_cmd.append(cmd + item) + commands.append(cmd + item) else: - lst_cmd.append(cmd + extra_cmd_web_login) + commands.append(cmd + extra_cmd_web_login) - if len(lst_cmd) == 1: - self.execute.exec_command_live(lst_cmd[0]) - elif len(lst_cmd) > 1: + if len(commands) == 1: + self.execute.exec_command_live(commands[0]) + elif len(commands) > 1: new_cmd = "parallel ::: " - for i, cmd in enumerate(lst_cmd): + for i, cmd in enumerate(commands): new_cmd += f' "sleep {1 * i};{cmd}"' self.execute.exec_command_live(new_cmd) @@ -1525,7 +1520,7 @@ class TODO: database = self.select_database() if database: cmd_server = f"./odoo_bin.sh shell -d {database}" - status, lst_database = self.execute.exec_command_live( + status, databases = self.execute.exec_command_live( cmd_server, return_status_and_output=True, source_erplibre=False, @@ -1592,7 +1587,7 @@ class TODO: if os.path.exists(poetry_lock): shutil.copy2(poetry_lock, path_file_odoo_lock) - def callback_execute_custom_database(self, dct_config): + def callback_execute_custom_database(self, config): database_name = self.select_database() self.prompt_execute_selenium_and_run_db(database_name) @@ -1627,14 +1622,14 @@ class TODO: more_arg = "--neutralize " is_neutralize = True database_name += "_neutralize" - status, lst_output = self.execute.exec_command_live( + status, output_lines = self.execute.exec_command_live( f"python3 ./script/database/db_restore.py -d {database_name} {more_arg}--ignore_cache --image {file_name}", return_status_and_output=True, single_source_erplibre=True, source_erplibre=False, ) if is_neutralize: - status, lst_output = self.execute.exec_command_live( + status, output_lines = self.execute.exec_command_live( f"./script/addons/update_prod_to_dev.sh {database_name}", return_status_and_output=True, single_source_erplibre=True, @@ -1646,7 +1641,7 @@ class TODO: .lower() ) if status == "y": - status, lst_output = self.execute.exec_command_live( + status, output_lines = self.execute.exec_command_live( f"./script/addons/update_addons_all.sh {database_name}", return_status_and_output=True, single_source_erplibre=True, @@ -1672,7 +1667,7 @@ class TODO: print(backup_name) cmd = f"./odoo_bin.sh db --backup --database {database_name} --restore_image {backup_name}" - status, lst_output = self.execute.exec_command_live( + status, output_lines = self.execute.exec_command_live( cmd, return_status_and_output=True, single_source_erplibre=True, @@ -1705,18 +1700,18 @@ class TODO: def download_database_backup_cli(self, show_remote_list=True): database_domain = input("Domain Odoo (ex. https://mondomain.com) : ") if show_remote_list: - status, lst_output = self.execute.exec_command_live( + status, output_lines = self.execute.exec_command_live( f"python3 ./script/database/list_remote.py --raw --odoo-url {database_domain}", return_status_and_output=True, single_source_erplibre=True, source_erplibre=False, ) - if len(lst_output) > 1: - for index, output in enumerate(lst_output): + if len(output_lines) > 1: + for index, output in enumerate(output_lines): print(f"{index + 1} - {output}") database_name = input("Select id of database :").strip() - elif len(lst_output) == 1: - database_name = lst_output[0].strip() + elif len(output_lines) == 1: + database_name = output_lines[0].strip() else: database_name = input( "Cannot read remote database, Database name :\n" diff --git a/script/todo/todo_i18n.py b/script/todo/todo_i18n.py index fcce6bc..cf4553c 100644 --- a/script/todo/todo_i18n.py +++ b/script/todo/todo_i18n.py @@ -5,7 +5,7 @@ import os import re -CONFIG_OVERRIDE_PRIVATE_FILE = "./env_var.sh" +ENV_VAR_FILE = "./env_var.sh" _current_lang = None @@ -560,9 +560,9 @@ def get_lang(): return _current_lang # 1. Check env_var.sh file - if os.path.exists(CONFIG_OVERRIDE_PRIVATE_FILE): + if os.path.exists(ENV_VAR_FILE): try: - with open(CONFIG_OVERRIDE_PRIVATE_FILE) as f: + with open(ENV_VAR_FILE) as f: content = f.read() match = re.search( r'^EL_LANG=["\']?(\w+)["\']?', content, re.MULTILINE @@ -591,9 +591,9 @@ def set_lang(lang): _current_lang = lang # Persist to env_var.sh - if os.path.exists(CONFIG_OVERRIDE_PRIVATE_FILE): + if os.path.exists(ENV_VAR_FILE): try: - with open(CONFIG_OVERRIDE_PRIVATE_FILE) as f: + with open(ENV_VAR_FILE) as f: content = f.read() except OSError: return @@ -610,15 +610,15 @@ def set_lang(lang): else: content = content.rstrip("\n") + "\n" + new_line + "\n" - with open(CONFIG_OVERRIDE_PRIVATE_FILE, "w") as f: + with open(ENV_VAR_FILE, "w") as f: f.write(content) def lang_is_configured(): """Check if a language has been explicitly set.""" - if os.path.exists(CONFIG_OVERRIDE_PRIVATE_FILE): + if os.path.exists(ENV_VAR_FILE): try: - with open(CONFIG_OVERRIDE_PRIVATE_FILE) as f: + with open(ENV_VAR_FILE) as f: content = f.read() return bool(re.search(r"^EL_LANG=", content, re.MULTILINE)) except OSError: diff --git a/test/test_kill_process_by_port.py b/test/test_kill_process_by_port.py index d6e991f..a377d32 100644 --- a/test/test_kill_process_by_port.py +++ b/test/test_kill_process_by_port.py @@ -9,7 +9,7 @@ import psutil from script.process.kill_process_by_port import ( PROTECTED_NAMES, - STOP_PARENT_KILL, + WRAPPER_SCRIPT_NAMES, choose_target, find_listeners, get_ancestry, @@ -241,10 +241,10 @@ class TestProtectedNames(unittest.TestCase): class TestStopParentKill(unittest.TestCase): def test_contains_run_sh(self): - self.assertIn("./run.sh", STOP_PARENT_KILL) + self.assertIn("./run.sh", WRAPPER_SCRIPT_NAMES) def test_contains_odoo_bin_sh(self): - self.assertIn("./odoo_bin.sh", STOP_PARENT_KILL) + self.assertIn("./odoo_bin.sh", WRAPPER_SCRIPT_NAMES) if __name__ == "__main__": diff --git a/test/test_todo.py b/test/test_todo.py index 859b820..92a2186 100644 --- a/test/test_todo.py +++ b/test/test_todo.py @@ -31,7 +31,7 @@ class TestTODOInit(unittest.TestCase): todo = TODO() self.assertIsNone(todo.dir_path) self.assertIsNone(todo.kdbx) - self.assertIsNone(todo.file_path) + self.assertIsNone(todo.selected_file_path) self.assertIsNotNone(todo.config_file) self.assertIsNotNone(todo.execute) diff --git a/test/test_todo_i18n.py b/test/test_todo_i18n.py index 64ff1ee..5d0d400 100644 --- a/test/test_todo_i18n.py +++ b/test/test_todo_i18n.py @@ -82,7 +82,7 @@ class TestGetLang(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): result = todo_i18n.get_lang() self.assertEqual(result, "en") @@ -97,7 +97,7 @@ class TestGetLang(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): result = todo_i18n.get_lang() self.assertEqual(result, "fr") @@ -107,7 +107,7 @@ class TestGetLang(unittest.TestCase): def test_env_variable_fallback(self): with patch.object( todo_i18n, - "CONFIG_OVERRIDE_PRIVATE_FILE", + "ENV_VAR_FILE", "/nonexistent/path", ), patch.dict(os.environ, {"EL_LANG": "en"}): result = todo_i18n.get_lang() @@ -116,7 +116,7 @@ class TestGetLang(unittest.TestCase): def test_default_is_fr(self): with patch.object( todo_i18n, - "CONFIG_OVERRIDE_PRIVATE_FILE", + "ENV_VAR_FILE", "/nonexistent/path", ), patch.dict(os.environ, {}, clear=True): result = todo_i18n.get_lang() @@ -130,7 +130,7 @@ class TestGetLang(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ), patch.dict(os.environ, {}, clear=True): result = todo_i18n.get_lang() self.assertEqual(result, "fr") @@ -159,7 +159,7 @@ class TestSetLang(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): todo_i18n.set_lang("en") with open(f.name) as rf: @@ -177,7 +177,7 @@ class TestSetLang(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): todo_i18n.set_lang("en") with open(f.name) as rf: @@ -190,7 +190,7 @@ class TestSetLang(unittest.TestCase): def test_nonexistent_file_no_crash(self): with patch.object( todo_i18n, - "CONFIG_OVERRIDE_PRIVATE_FILE", + "ENV_VAR_FILE", "/nonexistent/path", ): todo_i18n.set_lang("en") @@ -208,7 +208,7 @@ class TestLangIsConfigured(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): result = todo_i18n.lang_is_configured() self.assertTrue(result) @@ -223,7 +223,7 @@ class TestLangIsConfigured(unittest.TestCase): f.flush() try: with patch.object( - todo_i18n, "CONFIG_OVERRIDE_PRIVATE_FILE", f.name + todo_i18n, "ENV_VAR_FILE", f.name ): result = todo_i18n.lang_is_configured() self.assertFalse(result) @@ -233,7 +233,7 @@ class TestLangIsConfigured(unittest.TestCase): def test_returns_false_when_file_missing(self): with patch.object( todo_i18n, - "CONFIG_OVERRIDE_PRIVATE_FILE", + "ENV_VAR_FILE", "/nonexistent/path", ): result = todo_i18n.lang_is_configured()