[REF] script: rename variables to follow naming conventions

Replace Hungarian notation, French variable names, and
lowercase constants with clear English names across 5
scripts: config_file, execute, kill_process_by_port,
todo, and git_tool. Remove unused find_in_private
variable. All 142 tests pass.

Generated by Claude Code 2.1.72 model claude-sonnet-4-6

Co-Authored-By: Mathieu Benoit <mathben@technolibre.ca>
This commit is contained in:
Mathieu Benoit 2026-03-10 03:06:07 -04:00
parent 054c12af6d
commit e27c544f02
7 changed files with 101 additions and 101 deletions

View file

@ -26,27 +26,27 @@ _logger = logging.getLogger(__name__)
class ConfigFile:
def get_config(self, key_param: str):
# Open file and update dct_data
dct_data_init = {}
dct_data_second = {}
dct_data_final = {}
config_base = {}
config_override = {}
config_private = {}
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE) as cfg:
dct_data_init = json.load(cfg)
config_base = json.load(cfg)
if os.path.exists(CONFIG_OVERRIDE_FILE):
with open(CONFIG_OVERRIDE_FILE) as cfg:
dct_data_second = json.load(cfg)
config_override = json.load(cfg)
if os.path.exists(CONFIG_OVERRIDE_PRIVATE_FILE):
with open(CONFIG_OVERRIDE_PRIVATE_FILE) as cfg:
dct_data_final = json.load(cfg)
config_private = json.load(cfg)
dct_data_first_merge = self.deep_merge_with_lists(
dct_data_init, dct_data_final, list_strategy="extend"
merged_base_private = self.deep_merge_with_lists(
config_base, config_private, list_strategy="extend"
)
dct_data = self.deep_merge_with_lists(
dct_data_first_merge, dct_data_second, list_strategy="extend"
merged_base_private, config_override, list_strategy="extend"
)
return dct_data.get(key_param)
@ -55,7 +55,6 @@ class ConfigFile:
dct_data = self.get_config(lst_params[0])
for param in lst_params[1:]:
if param in dct_data.keys():
find_in_private = True
dct_data = dct_data.get(param)
return dct_data

View file

@ -15,7 +15,7 @@ try:
except ModuleNotFoundError as e:
humanize = None
cst_venv_erplibre = ".venv.erplibre"
VENV_ERPLIBRE = ".venv.erplibre"
new_path = os.path.normpath(
os.path.join(os.path.dirname(__file__), "..", "..")
@ -42,7 +42,7 @@ class Execute:
if exec_path_gnome_terminal:
self.cmd_source_erplibre = (
f"gnome-terminal -- bash -c 'source"
f" ./{cst_venv_erplibre}/bin/activate;%s'"
f" ./{VENV_ERPLIBRE}/bin/activate;%s'"
)
self.cmd_source_default = "gnome-terminal -- bash -c '" f"%s'"
else:
@ -52,16 +52,16 @@ class Execute:
"osascript -e 'tell application \"Terminal\"'"
)
self.cmd_source_erplibre += " -e 'tell application \"System Events\" to keystroke \"t\" using {command down}' -e 'delay 0.1' -e 'do script \""
self.cmd_source_erplibre += f"cd {os.getcwd()}; source ./{cst_venv_erplibre}/bin/activate; %s\" in front window'"
self.cmd_source_erplibre += f"cd {os.getcwd()}; source ./{VENV_ERPLIBRE}/bin/activate; %s\" in front window'"
self.cmd_source_erplibre += " -e 'end tell'"
else:
self.cmd_source_erplibre = (
f"source ./{cst_venv_erplibre}/bin/activate;%s"
f"source ./{VENV_ERPLIBRE}/bin/activate;%s"
)
def exec_command_live(
self,
commande,
command,
source_erplibre=True,
quiet=False,
single_source_erplibre=False,
@ -74,10 +74,10 @@ class Execute:
return_status_and_output_and_command=False,
):
"""
Exécute une commande et affiche la sortie en direct.
Exécute une command et affiche la sortie en direct.
Args:
commande (str): La commande à exécuter (sous forme de chaîne de caractères).
command (str): La command à exécuter (sous forme de chaîne de caractères).
"""
my_env = os.environ.copy()
@ -85,18 +85,18 @@ class Execute:
my_env.update(new_env)
process_start_time = time.time()
return_status = None
exit_code = None
if source_erplibre:
# commande = f"source ./{cst_venv_erplibre}/bin/activate && " + commande
# command = f"source ./{VENV_ERPLIBRE}/bin/activate && " + command
# cmd = (
# f"gnome-terminal --tab -- bash -c 'source"
# f" ./{cst_venv_erplibre}/bin/activate;{commande}'"
# f" ./{VENV_ERPLIBRE}/bin/activate;{command}'"
# )
commande = self.cmd_source_erplibre % commande
# os.system(f"./script/terminal/open_terminal.sh {commande}")
command = self.cmd_source_erplibre % command
# os.system(f"./script/terminal/open_terminal.sh {command}")
elif single_source_erplibre:
commande = (
f"source ./{cst_venv_erplibre}/bin/activate && %s" % commande
command = (
f"source ./{VENV_ERPLIBRE}/bin/activate && %s" % command
)
elif single_source_odoo:
if not source_odoo and os.path.exists("./.erplibre-version"):
@ -104,68 +104,68 @@ class Execute:
source_odoo = f.read()
if not source_odoo:
_logger.error(
f"You cannot execute Odoo command if no version is installed. Command : {commande}"
f"You cannot execute Odoo command if no version is installed. Command : {command}"
)
return -1
commande = (
f"source ./.venv.{source_odoo}/bin/activate && {commande}"
command = (
f"source ./.venv.{source_odoo}/bin/activate && {command}"
)
if new_window and self.cmd_source_default:
commande = self.cmd_source_default % commande
command = self.cmd_source_default % command
if not quiet:
print("🏠 ⬇ Execute command :")
print(commande)
lst_output = []
print(command)
output_lines = []
try:
process = subprocess.Popen(
commande,
command,
shell=True,
executable="/bin/bash",
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 lignes correctement
universal_newlines=True, # Pour traiter les sauts de lines correctement
env=my_env,
)
while True:
ligne = process.stdout.readline()
if not ligne:
line = process.stdout.readline()
if not line:
break
if not quiet:
print(ligne, end="")
print(line, end="")
if (
return_status_and_output
or return_status_and_output_and_command
):
# Remove last \n char
lst_output.append(
ligne.removesuffix("\r\n")
output_lines.append(
line.removesuffix("\r\n")
.removesuffix("\n")
.removesuffix("\r")
)
process.wait() # Attendre la fin du process
return_status = process.returncode
exit_code = process.returncode
if process.returncode != 0 and not quiet:
print(
"La commande a retourné un code d'erreur :"
"La command a retourné un code d'erreur :"
f" {process.returncode}"
)
except FileNotFoundError:
if not quiet:
if "password" in commande:
if "password" in command:
print(
f"Erreur : La commande '{commande.split(' ')[0]}'[...] n'a"
f"Erreur : La command '{command.split(' ')[0]}'[...] n'a"
" pas été trouvée."
)
else:
print(
f"Erreur : La commande '{commande}' n'a pas été trouvée."
f"Erreur : La command '{command}' n'a pas été trouvée."
)
except Exception as e:
if not quiet:
@ -181,12 +181,12 @@ class Execute:
if not quiet:
print(f"🏠 ⬆ Executed ({duration_sec:.2f} sec.) :")
if not quiet:
print(commande)
print(command)
print()
if return_status_and_output_and_command:
return return_status, commande, lst_output
return exit_code, command, output_lines
if return_status_and_command:
return return_status, commande
return exit_code, command
if return_status_and_output:
return return_status, lst_output
return return_status
return exit_code, output_lines
return exit_code

View file

@ -16,14 +16,14 @@ from git import Repo
from giturlparse import parse # pip install giturlparse
from retrying import retry # pip install retrying
CST_FILE_SOURCE_REPO_ADDONS = "source_repo_addons.csv"
CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
SOURCE_REPO_ADDONS_FILE = "source_repo_addons.csv"
EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
DEFAULT_PROJECT_NAME = "ERPLibre"
DEFAULT_WEBSITE = "erplibre.ca"
DEFAULT_REMOTE_URL = "https://github.com/ERPLibre/ERPLibre.git"
class Struct(object):
class RepoAttrs(object):
def __init__(self, **entries):
self.__dict__.update(entries)
@ -146,7 +146,7 @@ class GitTool:
"sub_path": sub_path,
}
if get_obj:
return Struct(**d)
return RepoAttrs(**d)
return d
def get_repo_info(
@ -190,10 +190,10 @@ class GitTool:
name = ""
url = ""
no_line = 0
line_number = 0
first_execution = True
for line in txt:
no_line += 1
line_number += 1
if line[:12] == '[submodule "':
if not first_execution:
data = {
@ -395,7 +395,7 @@ class GitTool:
:param repo_path: path of repo to get information env_var.sh
:return:
{
CST_EL_GITHUB_TOKEN: TOKEN,
EL_GITHUB_TOKEN: TOKEN,
}
"""
filename = os.path.join(repo_path, "env_var.sh")
@ -403,7 +403,7 @@ class GitTool:
txt = file.readlines()
txt = [a[:-1] for a in txt if "=" in a]
lst_filter = [CST_EL_GITHUB_TOKEN]
lst_filter = [EL_GITHUB_TOKEN]
dct_config = {}
# Take filtered value and get bash string values
for f in lst_filter:
@ -411,7 +411,7 @@ class GitTool:
if f in v:
lst_v = v.split("=")
if len(lst_v) > 1:
dct_config[CST_EL_GITHUB_TOKEN] = v.split("=")[1][1:-1]
dct_config[EL_GITHUB_TOKEN] = v.split("=")[1][1:-1]
return dct_config
@staticmethod
@ -531,7 +531,7 @@ class GitTool:
def generate_repo_manifest(
self,
lst_repo: List[Struct] = [],
lst_repo: List[RepoAttrs] = [],
output: str = "",
dct_remote={},
dct_project={},
@ -730,7 +730,7 @@ class GitTool:
print(str_xml_text + "\n")
def generate_git_modules(
self, lst_repo: List[Struct], repo_path: str = "."
self, lst_repo: List[RepoAttrs], repo_path: str = "."
):
lst_modules = []
for repo in lst_repo:
@ -747,8 +747,8 @@ class GitTool:
def get_source_repo_addons(self, repo_path=".", add_repo_root=False):
"""
Read file CST_FILE_SOURCE_REPO_ADDONS and return structure of data
:param repo_path: path to find file CST_FILE_SOURCE_REPO_ADDONS
Read file SOURCE_REPO_ADDONS_FILE and return structure of data
:param repo_path: path to find file SOURCE_REPO_ADDONS_FILE
:param add_repo_root: force adding repo root in the list
:return:
[{
@ -760,7 +760,7 @@ class GitTool:
"name": name of the submodule
}]
"""
file_name = os.path.join(repo_path, CST_FILE_SOURCE_REPO_ADDONS)
file_name = os.path.join(repo_path, SOURCE_REPO_ADDONS_FILE)
lst_result = []
if add_repo_root:
# TODO what to do if origin not exist?
@ -959,7 +959,7 @@ class GitTool:
@staticmethod
def add_and_fetch_remote(
repo_info: Struct, root_repo: Repo = None, branch_name: str = ""
repo_info: RepoAttrs, root_repo: Repo = None, branch_name: str = ""
):
"""
Deprecated function, not use anymore git submodule

View file

@ -69,7 +69,7 @@ def get_ancestry(pid: int):
return chain
def choose_target(chain, nb_parent):
def choose_target(chain, parent_depth):
"""
Decide which process to kill.
Default: kill the highest ancestor before PID 1 (so not systemd).
@ -77,13 +77,13 @@ def choose_target(chain, nb_parent):
if not chain:
return None
lst_chain_parent = []
parent_chain = []
for pid in chain:
lst_chain_parent.append(pid)
parent_chain.append(pid)
for str_to_stop in STOP_PARENT_KILL:
if str_to_stop in pid.cmdline():
return pid, lst_chain_parent
return chain[nb_parent - 1], [chain[nb_parent - 1]]
return pid, parent_chain
return chain[parent_depth - 1], [chain[parent_depth - 1]]
def kill_process(p: psutil.Process, force: bool):
@ -151,6 +151,7 @@ def main():
)
ap.add_argument(
"--nb_parent",
dest="parent_depth",
type=int,
default=1,
help="Kill parent too",
@ -176,7 +177,7 @@ def main():
if not chain:
continue
target, lst_target = choose_target(chain, args.nb_parent)
target, lst_target = choose_target(chain, args.parent_depth)
print(f"\nListener PID {pid} ancestry:")
for i, p in enumerate(chain):
@ -207,7 +208,7 @@ def main():
while not has_response and not ignore_kill:
confirm = (
input(
f"Tuer ce processus index {args.nb_parent} (enter) ou mettre "
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"
)

View file

@ -24,8 +24,8 @@ from script.config import config_file
from script.execute import execute
from script.todo.todo_i18n import get_lang, lang_is_configured, set_lang, t
file_error_path = ".erplibre.error.txt"
cst_venv_erplibre = ".venv.erplibre"
ERROR_LOG_PATH = ".erplibre.error.txt"
VENV_ERPLIBRE = ".venv.erplibre"
VERSION_DATA_FILE = os.path.join("conf", "supported_version_erplibre.json")
INSTALLED_ODOO_VERSION_FILE = os.path.join(
".repo", "installed_odoo_version.txt"
@ -137,11 +137,11 @@ class TODO:
status = click.prompt(help_info)
except NameError:
print("Do")
print(f"source ./{cst_venv_erplibre}/bin/activate && make")
print(f"source ./{VENV_ERPLIBRE}/bin/activate && make")
sys.exit(1)
except ImportError:
print("Do")
print(f"source ./{cst_venv_erplibre}/bin/activate && make")
print(f"source ./{VENV_ERPLIBRE}/bin/activate && make")
sys.exit(1)
except click.exceptions.Abort:
sys.exit(0)
@ -157,7 +157,7 @@ class TODO:
elif status == "4":
# cmd = (
# f"gnome-terminal --tab -- bash -c 'source"
# f" ./{cst_venv_erplibre}/bin/activate;make todo'"
# f" ./{VENV_ERPLIBRE}/bin/activate;make todo'"
# )
cmd = "make todo"
self.execute.exec_command_live(cmd, source_erplibre=True)
@ -1461,15 +1461,15 @@ class TODO:
self.execute.exec_command_live(new_cmd)
def crash_diagnostic(self, e):
# TODO show message at start if os.path.exists(file_error_path)
if os.path.exists(file_error_path) and not os.path.exists(
cst_venv_erplibre
# TODO show message at start if os.path.exists(ERROR_LOG_PATH)
if os.path.exists(ERROR_LOG_PATH) and not os.path.exists(
VENV_ERPLIBRE
):
print("Got error : ")
print(e)
print("Got error at first execution.", file_error_path)
print("Got error at first execution.", ERROR_LOG_PATH)
try:
file = open(file_error_path, "r")
file = open(ERROR_LOG_PATH, "r")
content = file.read()
# TODO si vide, ajouter notre erreur
print(content)
@ -1485,7 +1485,7 @@ class TODO:
# self.restart_script(e)
self.execute.exec_command_live(cmd, source_erplibre=True)
sys.exit(1)
if os.path.exists(cst_venv_erplibre):
if os.path.exists(VENV_ERPLIBRE):
print("Import error : ")
print(e)
# TODO auto-detect gnome-terminal, or choose another. Is it done already?
@ -1493,13 +1493,13 @@ class TODO:
# self.prompt_install()
# print(
# f"You forgot to activate source \nsource ./{cst_venv_erplibre}/bin/activate"
# f"You forgot to activate source \nsource ./{VENV_ERPLIBRE}/bin/activate"
# )
# time.sleep(0.5)
# cmd = "./script/todo/source_todo.sh"
print("Re-execute TODO 🤖 or execute :")
print()
print(f"source {cst_venv_erplibre}/bin/activate;make")
print(f"source {VENV_ERPLIBRE}/bin/activate;make")
print()
cmd = "./script/todo/todo.py"
# # self.restart_script(e)
@ -1763,16 +1763,16 @@ class TODO:
print(f"🤖 {t('reboot_todo')}")
# os.execv(sys.executable, ['python'] + sys.argv)
# TODO mettre check que le répertoire est créé, s'il existe, auto-loop à corriger
if os.path.exists(cst_venv_erplibre) and not os.path.exists(
file_error_path
if os.path.exists(VENV_ERPLIBRE) and not os.path.exists(
ERROR_LOG_PATH
):
# TODO mettre check import suivant ne vont pas planter
try:
with open(file_error_path, "w") as f_file:
with open(ERROR_LOG_PATH, "w") as f_file:
f_file.write(str(last_error))
pass # The file is created and closed here, no content is written
print(
f"Try to reopen process with before :\nsource ./{cst_venv_erplibre}/bin/activate && exec python "
f"Try to reopen process with before :\nsource ./{VENV_ERPLIBRE}/bin/activate && exec python "
+ " ".join(sys.argv)
)
os.execv(
@ -1780,7 +1780,7 @@ class TODO:
[
"/bin/bash",
"-c",
f"source ./{cst_venv_erplibre}/bin/activate && exec python "
f"source ./{VENV_ERPLIBRE}/bin/activate && exec python "
+ " ".join(sys.argv),
],
)

View file

@ -9,28 +9,28 @@ from collections import OrderedDict
from unittest.mock import MagicMock, mock_open, patch
from script.git.git_tool import (
CST_EL_GITHUB_TOKEN,
CST_FILE_SOURCE_REPO_ADDONS,
DEFAULT_PROJECT_NAME,
DEFAULT_REMOTE_URL,
DEFAULT_WEBSITE,
EL_GITHUB_TOKEN,
GitTool,
Struct,
RepoAttrs,
SOURCE_REPO_ADDONS_FILE,
)
class TestStruct(unittest.TestCase):
class TestRepoAttrs(unittest.TestCase):
def test_basic_attributes(self):
s = Struct(a=1, b="hello")
s = RepoAttrs(a=1, b="hello")
self.assertEqual(s.a, 1)
self.assertEqual(s.b, "hello")
def test_empty_struct(self):
s = Struct()
s = RepoAttrs()
self.assertEqual(s.__dict__, {})
def test_override_existing(self):
s = Struct(x=10)
s = RepoAttrs(x=10)
self.assertEqual(s.x, 10)
@ -98,7 +98,7 @@ class TestGetTransformedRepoInfo(unittest.TestCase):
"https://github.com/OCA/web.git",
get_obj=True,
)
self.assertIsInstance(result, Struct)
self.assertIsInstance(result, RepoAttrs)
self.assertEqual(result.organization, "OCA")
def test_organization_force(self):
@ -216,7 +216,7 @@ class TestGetProjectConfig(unittest.TestCase):
env_var_path = os.path.join(tmpdir, "env_var.sh")
os.rename(f.name, env_var_path)
result = GitTool.get_project_config(repo_path=tmpdir)
self.assertEqual(result[CST_EL_GITHUB_TOKEN], "my_token_123")
self.assertEqual(result[EL_GITHUB_TOKEN], "my_token_123")
finally:
if os.path.exists(env_var_path):
os.unlink(env_var_path)
@ -314,7 +314,7 @@ class TestGetManifestXmlInfo(unittest.TestCase):
class TestConstants(unittest.TestCase):
def test_file_source_repo_addons(self):
self.assertEqual(CST_FILE_SOURCE_REPO_ADDONS, "source_repo_addons.csv")
self.assertEqual(SOURCE_REPO_ADDONS_FILE, "source_repo_addons.csv")
def test_default_project_name(self):
self.assertEqual(DEFAULT_PROJECT_NAME, "ERPLibre")

View file

@ -13,6 +13,7 @@ from script.todo.todo import (
CONFIG_FILE,
CONFIG_OVERRIDE_FILE,
ENABLE_CRASH,
ERROR_LOG_PATH,
GRADLE_FILE,
INSTALLED_ODOO_VERSION_FILE,
LOGO_ASCII_FILE,
@ -20,9 +21,8 @@ from script.todo.todo import (
ODOO_VERSION_FILE,
STRINGS_FILE,
TODO,
VENV_ERPLIBRE,
VERSION_DATA_FILE,
cst_venv_erplibre,
file_error_path,
)
@ -237,10 +237,10 @@ class TestConstants(unittest.TestCase):
self.assertEqual(LOGO_ASCII_FILE, "./script/todo/logo_ascii.txt")
def test_venv_erplibre(self):
self.assertEqual(cst_venv_erplibre, ".venv.erplibre")
self.assertEqual(VENV_ERPLIBRE, ".venv.erplibre")
def test_file_error_path(self):
self.assertEqual(file_error_path, ".erplibre.error.txt")
self.assertEqual(ERROR_LOG_PATH, ".erplibre.error.txt")
def test_version_data_file(self):
self.assertEqual(