[FIX] script test: async adapt python 3.12, support test odoo 18 erplibre
This commit is contained in:
parent
aac9815414
commit
526205f7ae
5 changed files with 228 additions and 36 deletions
|
|
@ -242,6 +242,15 @@ test_code_generator_code_template_demo_portal:
|
||||||
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_portal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal --with_inherit
|
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_portal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal --with_inherit
|
||||||
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_portal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_portal
|
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_portal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_portal
|
||||||
|
|
||||||
|
.PHONY: test_code_generator_code_template_demo_internal
|
||||||
|
test_code_generator_code_template_demo_internal:
|
||||||
|
#./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
|
||||||
|
./script/database/db_restore.py --database test_template
|
||||||
|
./script/addons/install_addons_dev.sh test_template demo_internal
|
||||||
|
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_internal
|
||||||
|
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_internal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal
|
||||||
|
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_internal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_internal
|
||||||
|
|
||||||
.PHONY: test_code_generator_code_template_demo_internal_inherit
|
.PHONY: test_code_generator_code_template_demo_internal_inherit
|
||||||
test_code_generator_code_template_demo_internal_inherit:
|
test_code_generator_code_template_demo_internal_inherit:
|
||||||
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
|
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
|
||||||
|
|
|
||||||
|
|
@ -311,16 +311,11 @@ def main():
|
||||||
lst_model_inherit_name.remove(ignored_inherit)
|
lst_model_inherit_name.remove(ignored_inherit)
|
||||||
models_inherit_name = "; ".join(lst_model_inherit_name)
|
models_inherit_name = "; ".join(lst_model_inherit_name)
|
||||||
if not config.json:
|
if not config.json:
|
||||||
if not models_name:
|
if not config.quiet:
|
||||||
_logger.warning(f"Missing models class in {config.directory}")
|
|
||||||
elif not config.quiet:
|
|
||||||
# _logger.info(models_name)
|
# _logger.info(models_name)
|
||||||
print(models_name)
|
print(models_name)
|
||||||
print(models_inherit_name)
|
print(models_inherit_name)
|
||||||
else:
|
else:
|
||||||
if config.show_error_json and not models_name:
|
|
||||||
_logger.warning(f"Missing models class in {config.directory}")
|
|
||||||
|
|
||||||
if config.format_json:
|
if config.format_json:
|
||||||
output = json.dumps(dct_model, indent=4, sort_keys=True)
|
output = json.dumps(dct_model, indent=4, sort_keys=True)
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,10 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
import uvloop
|
try:
|
||||||
|
import uvloop
|
||||||
|
except ImportError:
|
||||||
|
uvloop = None
|
||||||
|
|
||||||
|
|
||||||
async def run_in_serial(task_list):
|
async def run_in_serial(task_list):
|
||||||
|
|
@ -95,40 +98,54 @@ def print_summary_task(task_list, lst_task_name=None):
|
||||||
def execute(config, lst_task, use_uvloop=False):
|
def execute(config, lst_task, use_uvloop=False):
|
||||||
error_detected = False
|
error_detected = False
|
||||||
return_value = None
|
return_value = None
|
||||||
if not config.no_parallel and asyncio.get_event_loop().is_closed():
|
|
||||||
asyncio.set_event_loop(asyncio.new_event_loop())
|
|
||||||
|
|
||||||
|
# --- Mode 1 : pas de parallélisme → déjà OK avec asyncio.run ---
|
||||||
if config.no_parallel:
|
if config.no_parallel:
|
||||||
return_value = asyncio.run(run_in_serial(lst_task))
|
# run_in_serial doit être une coroutine (async def)
|
||||||
elif config.max_process:
|
try:
|
||||||
|
if use_uvloop and uvloop is not None:
|
||||||
|
# À faire AVANT la création de la loop
|
||||||
|
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
|
||||||
|
return_value = asyncio.run(run_in_serial(lst_task))
|
||||||
|
except Exception as e:
|
||||||
|
error_detected = True
|
||||||
|
print(e)
|
||||||
|
return return_value, error_detected
|
||||||
|
|
||||||
|
# --- Mode 2 : AsyncioPool (on suppose qu'il gère sa loop lui-même) ---
|
||||||
|
if config.max_process:
|
||||||
pool = AsyncioPool(config.max_process)
|
pool = AsyncioPool(config.max_process)
|
||||||
for task in lst_task:
|
for task in lst_task:
|
||||||
pool.add_coro(task)
|
pool.add_coro(task)
|
||||||
try:
|
try:
|
||||||
|
# API existante, on ne touche pas
|
||||||
return_value = pool.run_until_complete()
|
return_value = pool.run_until_complete()
|
||||||
finally:
|
except Exception as e:
|
||||||
pool.close()
|
|
||||||
else:
|
|
||||||
# Use maximal resource
|
|
||||||
if use_uvloop:
|
|
||||||
uvloop.install()
|
|
||||||
loop = asyncio.get_event_loop()
|
|
||||||
# Can fix when cannot attach child to loop
|
|
||||||
# if sys.platform != "win32":
|
|
||||||
# policy = asyncio.get_event_loop_policy()
|
|
||||||
# watcher = asyncio.SafeChildWatcher()
|
|
||||||
# watcher.attach_loop(loop)
|
|
||||||
# policy.set_child_watcher(watcher)
|
|
||||||
if config.debug:
|
|
||||||
loop.set_debug(True)
|
|
||||||
try:
|
|
||||||
commands = asyncio.gather(*lst_task)
|
|
||||||
return_value = loop.run_until_complete(commands)
|
|
||||||
except RuntimeError as e:
|
|
||||||
error_detected = True
|
error_detected = True
|
||||||
print(e)
|
print(e)
|
||||||
finally:
|
finally:
|
||||||
loop.close()
|
pool.close()
|
||||||
|
return return_value, error_detected
|
||||||
|
|
||||||
|
# --- Mode 3 : utilisation maximale des ressources avec asyncio.gather ---
|
||||||
|
async def _run_max_resources(tasks, debug: bool):
|
||||||
|
if debug:
|
||||||
|
loop = asyncio.get_running_loop()
|
||||||
|
loop.set_debug(True)
|
||||||
|
# tasks doit être une liste de coroutines
|
||||||
|
results = await asyncio.gather(*tasks)
|
||||||
|
return results
|
||||||
|
|
||||||
|
try:
|
||||||
|
if use_uvloop and uvloop is not None:
|
||||||
|
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
|
||||||
|
return_value = asyncio.run(_run_max_resources(lst_task, config.debug))
|
||||||
|
except RuntimeError as e:
|
||||||
|
# par ex. si tu appelles ça depuis un environnement où il y a
|
||||||
|
# déjà une loop (Jupyter, certains frameworks)
|
||||||
|
error_detected = True
|
||||||
|
print(e)
|
||||||
|
|
||||||
return return_value, error_detected
|
return return_value, error_detected
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
173
script/test/config_testcase.odoo18.0.json
Normal file
173
script/test/config_testcase.odoo18.0.json
Normal file
|
|
@ -0,0 +1,173 @@
|
||||||
|
{
|
||||||
|
"lst_test": [
|
||||||
|
{
|
||||||
|
"run_command": true,
|
||||||
|
"test_name": "helloworld_test",
|
||||||
|
"sequence": 10,
|
||||||
|
"script": "./test/code_generator/hello_world.sh",
|
||||||
|
"restore_db_image_name": "odoo18.0_base",
|
||||||
|
"note": "Test helloword_test Will cause conflict with the other because write in code_generator_demo/hooks.py"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_theme_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "theme_website_demo_code_generator",
|
||||||
|
"tested_module": "code_generator_demo_theme_website",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "code_generator_demo_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "code_generator_demo",
|
||||||
|
"tested_module": "code_generator_demo",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_data_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_helpdesk_data",
|
||||||
|
"tested_module": "code_generator_demo_export_helpdesk",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_data_part_2_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_website_data",
|
||||||
|
"tested_module": "code_generator_demo_export_website",
|
||||||
|
"restore_db_image_name": "odoo18.0_base",
|
||||||
|
"note": "Merge to code_generator_data_test when fix double export data."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_inherit_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_internal_inherit",
|
||||||
|
"tested_module": "code_generator_demo_internal_inherit",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_template_demo_internal",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "code_generator_demo_internal",
|
||||||
|
"tested_module": "code_generator_template_demo_internal",
|
||||||
|
"search_class_module": "demo_internal",
|
||||||
|
"init_module_name": "demo_internal",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_template_demo_portal",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "code_generator_demo_portal",
|
||||||
|
"tested_module": "code_generator_template_demo_portal",
|
||||||
|
"search_class_module": "demo_portal",
|
||||||
|
"init_module_name": "demo_portal",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "mariadb_test_template",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "code_generator_demo_mariadb_sql_example_1",
|
||||||
|
"tested_module": "code_generator_template_demo_mariadb_sql_example_1",
|
||||||
|
"search_class_module": "demo_mariadb_sql_example_1",
|
||||||
|
"init_module_name": "code_generator_portal,demo_mariadb_sql_example_1",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "mariadb_test_migrator",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_mariadb_sql_example_1",
|
||||||
|
"tested_module": "code_generator_migrator_demo_mariadb_sql_example_1",
|
||||||
|
"script_after_init_check": "./script/database/restore_mariadb_sql_example_1.sh",
|
||||||
|
"init_module_name": "code_generator_portal",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "mariadb_test_code_generator",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_mariadb_sql_example_1",
|
||||||
|
"tested_module": "code_generator_demo_mariadb_sql_example_1",
|
||||||
|
"init_module_name": "code_generator_portal",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_template_demo_internal_inherit",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "code_generator_demo_internal_inherit",
|
||||||
|
"tested_module": "code_generator_template_demo_internal_inherit",
|
||||||
|
"search_class_module": "demo_internal_inherit",
|
||||||
|
"init_module_name": "demo_internal_inherit",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "code_generator_template_demo_sysadmin_cron",
|
||||||
|
"path_module_check": "./odoo18.0/addons/OCA_server-tools",
|
||||||
|
"generated_module": "code_generator_auto_backup",
|
||||||
|
"generated_path": "./odoo18.0/addons/OCA_server-tools/",
|
||||||
|
"tested_module": "code_generator_template_demo_sysadmin_cron",
|
||||||
|
"search_class_module": "auto_backup",
|
||||||
|
"init_module_name": "auto_backup",
|
||||||
|
"install_path": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "code_generator_export_website_attachments_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_website_attachments_data",
|
||||||
|
"tested_module": "code_generator_demo_export_website_attachments",
|
||||||
|
"restore_db_image_name": "test_website_attachments"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"disable": true,
|
||||||
|
"test_name": "code_generator_demo_generic_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_internal,demo_portal",
|
||||||
|
"tested_module": "code_generator_demo_internal,code_generator_demo_portal",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_website_snippet_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"generated_module": "demo_website_leaflet,demo_website_snippet,demo_website_multiple_snippet",
|
||||||
|
"tested_module": "code_generator_demo_website_leaflet,code_generator_demo_website_snippet,code_generator_demo_website_multiple_snippet",
|
||||||
|
"file_to_restore": "demo_portal/i18n/demo_portal.pot,demo_portal/i18n/fr_CA.po",
|
||||||
|
"file_to_restore_origin": true,
|
||||||
|
"restore_db_image_name": "odoo18.0_base",
|
||||||
|
"note": "Because code_generator_demo_website_multiple_snippet depend on code_generator_demo_portal, it will execute it and this delete file demo_portal/i18n/demo_portal.pot and demo_portal/i18n/fr_CA.po"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "demo_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
|
||||||
|
"init_module_name": "demo_helpdesk_data,demo_internal,demo_internal_inherit,demo_mariadb_sql_example_1,demo_portal,demo_website_data,demo_website_leaflet,demo_website_snippet",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"run_test_exec": true,
|
||||||
|
"test_name": "code_generator_auto_backup_test",
|
||||||
|
"path_module_check": "./odoo18.0/addons/OCA_server-tools/auto_backup",
|
||||||
|
"generated_module": "auto_backup",
|
||||||
|
"tested_module": "code_generator_auto_backup",
|
||||||
|
"restore_db_image_name": "odoo18.0_base"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -790,7 +790,7 @@ async def test_exec(
|
||||||
return test_result, test_status, test_name, total_time
|
return test_result, test_status, test_name, total_time
|
||||||
|
|
||||||
|
|
||||||
def check_git_change():
|
async def check_git_change():
|
||||||
"""
|
"""
|
||||||
return True if success
|
return True if success
|
||||||
"""
|
"""
|
||||||
|
|
@ -810,10 +810,8 @@ def check_git_change():
|
||||||
test_name="Init check_git_change OCA_server-tools",
|
test_name="Init check_git_change OCA_server-tools",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
commands = asyncio.gather(*task_list)
|
tpl_result = await asyncio.gather(*task_list)
|
||||||
tpl_result = loop.run_until_complete(commands)
|
|
||||||
status = any([a[1] for a in tpl_result])
|
status = any([a[1] for a in tpl_result])
|
||||||
loop.close()
|
|
||||||
return not status
|
return not status
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -962,7 +960,7 @@ def main():
|
||||||
config = get_config()
|
config = get_config()
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
if not config.ignore_init_check_git:
|
if not config.ignore_init_check_git:
|
||||||
success = check_git_change()
|
success = asyncio.run(check_git_change())
|
||||||
else:
|
else:
|
||||||
success = True
|
success = True
|
||||||
status = False
|
status = False
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue