Implemented Support to allow project's to reference gems via the gem name (#7109)
* Implemented Support to allow project's to reference gems via the gem name Updated the enable-gem command to add the name of the enabled gem to the "gem_names" array in the project.json Updated the enable-gem test to validate this functionality Centralized the CMake logic for locating external subdirectories to the Subdirectories.cmake script Added an option to the edit-project-properties and edit-engine-properties o3de.py commands to add/remove/replace the "gem_names" field in the project.json and engine.json respectively Added a CMake function to determine the root CMake "subdirectory" of any input path which is a parent of it. This logic has been used to improve the installation of external gems to the <install-root>/External directory. Tested out the install layout before submitting PR fixes #7108 Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed the enable-gem test on Linux to resolve the mock path. Renamed all of the o3de python test from "unit_test*.py" to "test*.py" to faciliate the python unittest module picking up the test automatically. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Adding test for the disable_gem command. Fixed some typos in engine_properties.py scrip. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
d605b5636d
commit
62775add6d
@@ -150,7 +150,10 @@ def remove_gem_dependency(cmake_file: pathlib.Path,
|
||||
# If the in_gem_list was flipped to false, that means the currently parsed line contained the
|
||||
# line end marker, so append that to the result_line
|
||||
result_line += enable_gem_end_marker if not in_gem_list else ''
|
||||
t_data.append(result_line + '\n')
|
||||
# Strip of trailing whitespace. This also strips result lines which are empty of the indent
|
||||
result_line = result_line.rstrip()
|
||||
if result_line:
|
||||
t_data.append(result_line + '\n')
|
||||
else:
|
||||
t_data.append(line)
|
||||
|
||||
@@ -165,11 +168,6 @@ def remove_gem_dependency(cmake_file: pathlib.Path,
|
||||
return 0
|
||||
|
||||
|
||||
def get_project_gems(project_path: pathlib.Path,
|
||||
platform: str = 'Common') -> set:
|
||||
return get_gems_from_cmake_file(get_enabled_gem_cmake_file(project_path=project_path, platform=platform))
|
||||
|
||||
|
||||
def get_enabled_gems(cmake_file: pathlib.Path) -> set:
|
||||
"""
|
||||
Gets a list of enabled gems from the cmake file
|
||||
@@ -206,15 +204,6 @@ def get_enabled_gems(cmake_file: pathlib.Path) -> set:
|
||||
return gem_target_set
|
||||
|
||||
|
||||
def get_project_gem_paths(project_path: pathlib.Path,
|
||||
platform: str = 'Common') -> set:
|
||||
gem_names = get_project_gems(project_path, platform)
|
||||
gem_paths = set()
|
||||
for gem_name in gem_names:
|
||||
gem_paths.add(manifest.get_registered(gem_name=gem_name, project_path=project_path))
|
||||
return gem_paths
|
||||
|
||||
|
||||
def get_enabled_gem_cmake_file(project_name: str = None,
|
||||
project_path: str or pathlib.Path = None,
|
||||
platform: str = 'Common') -> pathlib.Path or None:
|
||||
|
||||
@@ -15,7 +15,7 @@ import os
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
from o3de import cmake, manifest, utils
|
||||
from o3de import cmake, manifest, project_properties, utils
|
||||
|
||||
logger = logging.getLogger('o3de.disable_gem')
|
||||
logging.basicConfig(format=utils.LOG_FORMAT)
|
||||
@@ -68,8 +68,8 @@ def disable_gem_in_project(gem_name: str = None,
|
||||
f' {project_path / "project.json"}, engine.json')
|
||||
return 1
|
||||
gem_path = pathlib.Path(gem_path).resolve()
|
||||
# make sure this gem already exists if we're adding. We can always remove a gem.
|
||||
if not gem_path.exists():
|
||||
# make sure the gem path is a directory
|
||||
if not gem_path.is_dir():
|
||||
logger.error(f'Gem Path {gem_path} does not exist.')
|
||||
return 1
|
||||
|
||||
@@ -79,9 +79,6 @@ def disable_gem_in_project(gem_name: str = None,
|
||||
logger.error(f'Could not read gem.json content under {gem_path}.')
|
||||
return 1
|
||||
|
||||
# when removing we will try to do as much as possible even with failures so ret_val will be the last error code
|
||||
ret_val = 0
|
||||
|
||||
if not enabled_gem_file:
|
||||
enabled_gem_file = cmake.get_enabled_gem_cmake_file(project_path=project_path)
|
||||
|
||||
@@ -89,10 +86,14 @@ def disable_gem_in_project(gem_name: str = None,
|
||||
if not enabled_gem_file.is_file():
|
||||
logger.error(f'Enabled gem file {enabled_gem_file} is not present.')
|
||||
return 1
|
||||
|
||||
# remove the gem
|
||||
error_code = cmake.remove_gem_dependency(enabled_gem_file, gem_json_data['gem_name'])
|
||||
if error_code:
|
||||
ret_val = error_code
|
||||
|
||||
# Remove the name of the gem from the project.json "gem_names" field if the gem is neither
|
||||
# registered with the project.json nor engine.json
|
||||
ret_val = project_properties.edit_project_props(project_path,
|
||||
delete_gem_names=gem_json_data['gem_name']) or error_code
|
||||
|
||||
return ret_val
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ import os
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
from o3de import cmake, manifest, register, validation, utils
|
||||
from o3de import cmake, manifest, project_properties, register, validation, utils
|
||||
|
||||
logger = logging.getLogger('o3de.enable_gem')
|
||||
logging.basicConfig(format=utils.LOG_FORMAT)
|
||||
@@ -33,7 +33,7 @@ def enable_gem_in_project(gem_name: str = None,
|
||||
:param gem_path: path to the gem to add
|
||||
:param project_name: name of to the project to add the gem to
|
||||
:param project_path: path to the project to add the gem to
|
||||
:param enabled_gem_file_file: if this dependency goes/is in a specific file
|
||||
:param enabled_gem_file: if this dependency goes/is in a specific file
|
||||
:return: 0 for success or non 0 failure code
|
||||
"""
|
||||
# we need either a project name or path
|
||||
@@ -80,8 +80,6 @@ def enable_gem_in_project(gem_name: str = None,
|
||||
logger.error(f'Could not read gem.json content under {gem_path}.')
|
||||
return 1
|
||||
|
||||
|
||||
ret_val = 0
|
||||
if enabled_gem_file:
|
||||
# make sure this is a project has an enabled gems file
|
||||
if not enabled_gem_file.is_file():
|
||||
@@ -96,17 +94,16 @@ def enable_gem_in_project(gem_name: str = None,
|
||||
if not project_enabled_gem_file.is_file():
|
||||
project_enabled_gem_file.touch()
|
||||
|
||||
# Before adding the gem_dependency check if the project is registered in either the project or engine
|
||||
# manifest
|
||||
# Before adding the gem_dependency check if the project is registered in either the project or engine manifest
|
||||
buildable_gems = manifest.get_engine_gems()
|
||||
buildable_gems.extend(manifest.get_project_gems(project_path))
|
||||
# Convert each path to pathlib.Path object and filter out duplictes using dict.fromkeys
|
||||
# Convert each path to pathlib.Path object and filter out duplicates using dict.fromkeys
|
||||
buildable_gems = list(dict.fromkeys(map(lambda gem_path_string: pathlib.Path(gem_path_string), buildable_gems)))
|
||||
|
||||
ret_val = 0
|
||||
# If the gem is not part of buildable set, it needs to be registered
|
||||
if not gem_path in buildable_gems:
|
||||
ret_val = register.register(gem_path=gem_path, external_subdir_project_path=project_path)
|
||||
# If the gem is not part of buildable set, it's gem_name should be registered to the "gem_names" field
|
||||
if gem_path not in buildable_gems:
|
||||
ret_val = project_properties.edit_project_props(project_path, new_gem_names=gem_json_data['gem_name'])
|
||||
|
||||
# add the gem if it is registered in either the project.json or engine.json
|
||||
ret_val = ret_val or cmake.add_gem_dependency(project_enabled_gem_file, gem_json_data['gem_name'])
|
||||
|
||||
@@ -18,11 +18,35 @@ from o3de import manifest, utils
|
||||
logger = logging.getLogger('o3de.engine_properties')
|
||||
logging.basicConfig(format=utils.LOG_FORMAT)
|
||||
|
||||
def _edit_gem_names(engine_json: dict,
|
||||
new_gem_names: str or list = None,
|
||||
delete_gem_names: str or list = None,
|
||||
replace_gem_names: str or list = None):
|
||||
if new_gem_names:
|
||||
tag_list = new_gem_names.split() if isinstance(new_gem_names, str) else new_gem_names
|
||||
engine_json.setdefault('gem_names', []).extend(tag_list)
|
||||
if delete_gem_names:
|
||||
removal_list = delete_gem_names.split() if isinstance(delete_gem_names, str) else delete_gem_names
|
||||
if 'gem_names' in engine_json:
|
||||
for tag in removal_list:
|
||||
if tag in engine_json['gem_names']:
|
||||
engine_json['gem_names'].remove(tag)
|
||||
if replace_gem_names:
|
||||
tag_list = replace_gem_names.split() if isinstance(replace_gem_names, str) else replace_gem_names
|
||||
engine_json['gem_names'] = tag_list
|
||||
|
||||
# Remove duplicates from list
|
||||
engine_json['gem_names'] = list(dict.fromkeys(engine_json.get('gem_names', [])))
|
||||
|
||||
|
||||
def edit_engine_props(engine_path: pathlib.Path = None,
|
||||
engine_name: str = None,
|
||||
new_name: str = None,
|
||||
new_version: str = None) -> int:
|
||||
new_version: str = None,
|
||||
new_gem_names: str or list = None,
|
||||
delete_gem_names: str or list = None,
|
||||
replace_gem_names: str or list = None
|
||||
) -> int:
|
||||
if not engine_path and not engine_name:
|
||||
logger.error(f'Either a engine path or a engine name must be supplied to lookup engine.json')
|
||||
return 1
|
||||
@@ -51,13 +75,20 @@ def edit_engine_props(engine_path: pathlib.Path = None,
|
||||
if new_version:
|
||||
engine_json_data['O3DEVersion'] = new_version
|
||||
|
||||
# Update the gem_names field in the engine.json
|
||||
_edit_gem_names(engine_json_data, new_gem_names, delete_gem_names, replace_gem_names)
|
||||
|
||||
return 0 if manifest.save_o3de_manifest(engine_json_data, pathlib.Path(engine_path) / 'engine.json') else 1
|
||||
|
||||
def _edit_engine_props(args: argparse) -> int:
|
||||
return edit_engine_props(args.engine_path,
|
||||
args.engine_name,
|
||||
args.engine_new_name,
|
||||
args.engine_version)
|
||||
args.engine_name,
|
||||
args.engine_new_name,
|
||||
args.engine_version,
|
||||
args.add_gem_names,
|
||||
args.delete_gem_names,
|
||||
args.replace_gem_names
|
||||
)
|
||||
|
||||
def add_parser_args(parser):
|
||||
group = parser.add_mutually_exclusive_group(required=True)
|
||||
@@ -70,6 +101,13 @@ def add_parser_args(parser):
|
||||
help='Sets the name for the engine.')
|
||||
group.add_argument('-ev', '--engine-version', type=str, required=False,
|
||||
help='Sets the version for the engine.')
|
||||
group = parser.add_mutually_exclusive_group(required=False)
|
||||
group.add_argument('-agn', '--add-gem-names', type=str, nargs='*', required=False,
|
||||
help='Adds gem name(s) to gem_names field. Space delimited list (ex. -at A B C)')
|
||||
group.add_argument('-dgn', '--delete-gem-names', type=str, nargs='*', required=False,
|
||||
help='Removes gem name(s) from the gem_names field. Space delimited list (ex. -dt A B C')
|
||||
group.add_argument('-rgn', '--replace-gem-names', type=str, nargs='*', required=False,
|
||||
help='Replace entirety of gem_names field with space delimited list of values')
|
||||
parser.set_defaults(func=_edit_engine_props)
|
||||
|
||||
def add_args(subparsers) -> None:
|
||||
|
||||
@@ -28,6 +28,27 @@ def get_project_props(name: str = None, path: pathlib.Path = None) -> dict:
|
||||
return proj_json
|
||||
|
||||
|
||||
def _edit_gem_names(proj_json: dict,
|
||||
new_gem_names: str or list = None,
|
||||
delete_gem_names: str or list = None,
|
||||
replace_gem_names: str or list = None):
|
||||
if new_gem_names:
|
||||
tag_list = new_gem_names.split() if isinstance(new_gem_names, str) else new_gem_names
|
||||
proj_json.setdefault('gem_names', []).extend(tag_list)
|
||||
if delete_gem_names:
|
||||
removal_list = delete_gem_names.split() if isinstance(delete_gem_names, str) else delete_gem_names
|
||||
if 'gem_names' in proj_json:
|
||||
for tag in removal_list:
|
||||
if tag in proj_json['gem_names']:
|
||||
proj_json['gem_names'].remove(tag)
|
||||
if replace_gem_names:
|
||||
tag_list = replace_gem_names.split() if isinstance(replace_gem_names, str) else replace_gem_names
|
||||
proj_json['gem_names'] = tag_list
|
||||
|
||||
# Remove duplicates from list
|
||||
proj_json['gem_names'] = list(dict.fromkeys(proj_json.get('gem_names', [])))
|
||||
|
||||
|
||||
def edit_project_props(proj_path: pathlib.Path = None,
|
||||
proj_name: str = None,
|
||||
new_name: str = None,
|
||||
@@ -38,7 +59,11 @@ def edit_project_props(proj_path: pathlib.Path = None,
|
||||
new_icon: str = None,
|
||||
new_tags: str or list = None,
|
||||
delete_tags: str or list = None,
|
||||
replace_tags: str or list = None) -> int:
|
||||
replace_tags: str or list = None,
|
||||
new_gem_names: str or list = None,
|
||||
delete_gem_names: str or list = None,
|
||||
replace_gem_names: str or list = None
|
||||
) -> int:
|
||||
proj_json = get_project_props(proj_name, proj_path)
|
||||
|
||||
if not proj_json:
|
||||
@@ -74,6 +99,8 @@ def edit_project_props(proj_path: pathlib.Path = None,
|
||||
if replace_tags:
|
||||
tag_list = replace_tags.split() if isinstance(replace_tags, str) else replace_tags
|
||||
proj_json['user_tags'] = tag_list
|
||||
# Update the gem_names field in the project.json
|
||||
_edit_gem_names(proj_json, new_gem_names, delete_gem_names, replace_gem_names)
|
||||
|
||||
return 0 if manifest.save_o3de_manifest(proj_json, pathlib.Path(proj_path) / 'project.json') else 1
|
||||
|
||||
@@ -89,7 +116,10 @@ def _edit_project_props(args: argparse) -> int:
|
||||
args.project_icon,
|
||||
args.add_tags,
|
||||
args.delete_tags,
|
||||
args.replace_tags)
|
||||
args.replace_tags,
|
||||
args.add_gem_names,
|
||||
args.delete_gem_names,
|
||||
args.replace_gem_names)
|
||||
|
||||
|
||||
def add_parser_args(parser):
|
||||
@@ -118,6 +148,13 @@ def add_parser_args(parser):
|
||||
help='Removes tag(s) from the user_tags property. Space delimited list (ex. -dt A B C')
|
||||
group.add_argument('-rt', '--replace-tags', type=str, nargs ='*', required=False,
|
||||
help='Replace entirety of user_tags property with space delimited list of values')
|
||||
group = parser.add_mutually_exclusive_group(required=False)
|
||||
group.add_argument('-agn', '--add-gem-names', type=str, nargs='*', required=False,
|
||||
help='Adds gem name(s) to gem_names field. Space delimited list (ex. -at A B C)')
|
||||
group.add_argument('-dgn', '--delete-gem-names', type=str, nargs='*', required=False,
|
||||
help='Removes gem name(s) from the gem_names field. Space delimited list (ex. -dt A B C')
|
||||
group.add_argument('-rgn', '--replace-gem-names', type=str, nargs='*', required=False,
|
||||
help='Replace entirety of gem_names field with space delimited list of values')
|
||||
parser.set_defaults(func=_edit_project_props)
|
||||
|
||||
|
||||
|
||||
@@ -13,70 +13,77 @@ endif()
|
||||
# Add a test to test out the o3de package `o3de.py register` command
|
||||
ly_add_pytest(
|
||||
NAME o3de_register
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_register.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_register.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_cmake
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_cmake.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_cmake.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_disable_gem
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_disable_gem.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_enable_gem
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_enable_gem.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_enable_gem.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_global_project
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_global_project.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_global_project.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_manifest
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_manifest.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_manifest.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_engine_properties
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_engine_properties.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_engine_properties.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_project_properties
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_project_properties.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_project_properties.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_gem_properties
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_gem_properties.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_gem_properties.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_template
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_engine_template.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_engine_template.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
ly_add_pytest(
|
||||
NAME o3de_register_show
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/unit_test_print_registration.py
|
||||
PATH ${CMAKE_CURRENT_LIST_DIR}/test_print_registration.py
|
||||
TEST_SUITE smoke
|
||||
EXCLUDE_TEST_RUN_TARGET_FROM_IDE
|
||||
)
|
||||
|
||||
@@ -0,0 +1,200 @@
|
||||
#
|
||||
# Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
#
|
||||
#
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
import pathlib
|
||||
from unittest.mock import patch
|
||||
|
||||
from o3de import cmake, disable_gem, enable_gem
|
||||
|
||||
|
||||
TEST_PROJECT_JSON_PAYLOAD = '''
|
||||
{
|
||||
"project_name": "TestProject",
|
||||
"origin": "The primary repo for TestProject goes here: i.e. http://www.mydomain.com",
|
||||
"license": "What license TestProject uses goes here: i.e. https://opensource.org/licenses/MIT",
|
||||
"display_name": "TestProject",
|
||||
"summary": "A short description of TestProject.",
|
||||
"canonical_tags": [
|
||||
"Project"
|
||||
],
|
||||
"user_tags": [
|
||||
"TestProject"
|
||||
],
|
||||
"icon_path": "preview.png",
|
||||
"engine": "o3de-install",
|
||||
"restricted_name": "projects",
|
||||
"external_subdirectories": [
|
||||
]
|
||||
}
|
||||
'''
|
||||
|
||||
TEST_GEM_JSON_PAYLOAD = '''
|
||||
{
|
||||
"gem_name": "TestGem",
|
||||
"display_name": "TestGem",
|
||||
"license": "Apache-2.0 Or MIT",
|
||||
"license_url": "https://github.com/o3de/o3de/blob/development/LICENSE.txt",
|
||||
"origin": "Open 3D Engine - o3de.org",
|
||||
"origin_url": "https://github.com/o3de/o3de",
|
||||
"type": "Code",
|
||||
"summary": "A short description of TestGem.",
|
||||
"canonical_tags": [
|
||||
"Gem"
|
||||
],
|
||||
"user_tags": [
|
||||
"TestGem"
|
||||
],
|
||||
"icon_path": "preview.png",
|
||||
"requirements": "Any requirement goes here.",
|
||||
"documentation_url": "The link to the documentation goes here.",
|
||||
"dependencies": [
|
||||
]
|
||||
}
|
||||
'''
|
||||
|
||||
TEST_O3DE_MANIFEST_JSON_PAYLOAD = '''
|
||||
{
|
||||
"o3de_manifest_name": "testuser",
|
||||
"origin": "C:/Users/testuser/.o3de",
|
||||
"default_engines_folder": "C:/Users/testuser/.o3de/Engines",
|
||||
"default_projects_folder": "C:/Users/testuser/.o3de/Projects",
|
||||
"default_gems_folder": "C:/Users/testuser/.o3de/Gems",
|
||||
"default_templates_folder": "C:/Users/testuser/.o3de/Templates",
|
||||
"default_restricted_folder": "C:/Users/testuser/.o3de/Restricted",
|
||||
"default_third_party_folder": "C:/Users/testuser/.o3de/3rdParty",
|
||||
"projects": [
|
||||
"D:/MinimalProject"
|
||||
],
|
||||
"external_subdirectories": [],
|
||||
"templates": [],
|
||||
"restricted": [],
|
||||
"repos": [],
|
||||
"engines": [
|
||||
"D:/o3de/o3de"
|
||||
],
|
||||
"engines_path": {
|
||||
"o3de": "D:/o3de/o3de"
|
||||
}
|
||||
}
|
||||
'''
|
||||
|
||||
@pytest.fixture(scope='class')
|
||||
def init_disable_gem_data(request):
|
||||
class DisableGemData:
|
||||
def __init__(self):
|
||||
self.project_data = json.loads(TEST_PROJECT_JSON_PAYLOAD)
|
||||
self.gem_data = json.loads(TEST_GEM_JSON_PAYLOAD)
|
||||
request.cls.disable_gem = DisableGemData()
|
||||
|
||||
|
||||
@pytest.mark.usefixtures('init_disable_gem_data')
|
||||
class TestDisableGemCommand:
|
||||
@pytest.mark.parametrize("gem_path, project_path, gem_registered_with_project, gem_registered_with_engine,"
|
||||
"expected_result", [
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), False, True, 0),
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), False, False, 0),
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), True, False, 0),
|
||||
pytest.param(pathlib.PurePath('TestGem'), pathlib.PurePath('TestProject'), False, False, 0),
|
||||
]
|
||||
)
|
||||
def test_disable_gem_registers_gem_name_with_project_json(self, gem_path, project_path, gem_registered_with_project,
|
||||
gem_registered_with_engine, expected_result):
|
||||
|
||||
project_gem_dependencies = []
|
||||
|
||||
def get_registered_path(project_name: str = None, gem_name: str = None) -> pathlib.Path or None:
|
||||
if project_name:
|
||||
return project_path
|
||||
elif gem_name:
|
||||
return gem_path
|
||||
return None
|
||||
|
||||
def save_o3de_manifest(new_project_data: dict, manifest_path: pathlib.Path = None) -> bool:
|
||||
if manifest_path == project_path / 'project.json':
|
||||
self.disable_gem.project_data = new_project_data
|
||||
return True
|
||||
|
||||
def load_o3de_manifest(manifest_path: pathlib.Path = None) -> dict or None:
|
||||
if not manifest_path:
|
||||
return json.loads(TEST_O3DE_MANIFEST_JSON_PAYLOAD)
|
||||
return None
|
||||
|
||||
def get_project_json_data(project_name: str = None, project_path: pathlib.Path = None):
|
||||
return self.disable_gem.project_data
|
||||
|
||||
def get_gem_json_data(gem_path: pathlib.Path, project_path: pathlib.Path):
|
||||
return self.disable_gem.gem_data
|
||||
|
||||
def get_project_gems(project_path: pathlib.Path):
|
||||
return [pathlib.Path(gem_path).resolve()] if gem_registered_with_project else []
|
||||
|
||||
def get_engine_gems():
|
||||
return [pathlib.Path(gem_path).resolve()] if gem_registered_with_engine else []
|
||||
|
||||
def add_gem_dependency(enable_gem_cmake_file: pathlib.Path, gem_name: str):
|
||||
project_gem_dependencies.append(gem_name)
|
||||
return 0
|
||||
|
||||
def remove_gem_dependency(enable_gem_cmake_file: pathlib.Path, gem_name: str):
|
||||
project_gem_dependencies.remove(gem_name)
|
||||
return 0
|
||||
|
||||
def get_enabled_gems(enable_gem_cmake_file: pathlib.Path) -> list:
|
||||
return project_gem_dependencies
|
||||
|
||||
|
||||
with patch('pathlib.Path.is_dir', return_value=True) as pathlib_is_dir_patch,\
|
||||
patch('pathlib.Path.is_file', return_value=True) as pathlib_is_file_patch, \
|
||||
patch('o3de.manifest.load_o3de_manifest', side_effect=load_o3de_manifest) as load_o3de_manifest_patch, \
|
||||
patch('o3de.manifest.save_o3de_manifest', side_effect=save_o3de_manifest) as save_o3de_manifest_patch,\
|
||||
patch('o3de.manifest.get_registered', side_effect=get_registered_path) as get_registered_patch,\
|
||||
patch('o3de.manifest.get_gem_json_data', side_effect=get_gem_json_data) as get_gem_json_data_patch,\
|
||||
patch('o3de.manifest.get_project_json_data', side_effect=get_project_json_data) as get_gem_json_data_patch,\
|
||||
patch('o3de.manifest.get_project_gems', side_effect=get_project_gems) as get_project_gems_patch,\
|
||||
patch('o3de.manifest.get_engine_gems', side_effect=get_engine_gems) as get_engine_gems_patch,\
|
||||
patch('o3de.cmake.add_gem_dependency', side_effect=add_gem_dependency) as add_gem_dependency_patch, \
|
||||
patch('o3de.cmake.remove_gem_dependency',
|
||||
side_effect=remove_gem_dependency) as remove_gem_dependency_patch, \
|
||||
patch('o3de.cmake.get_enabled_gems',
|
||||
side_effect=get_enabled_gems) as get_enabled_gems, \
|
||||
patch('o3de.validation.valid_o3de_gem_json', return_value=True) as valid_gem_json_patch:
|
||||
|
||||
# Clear out any "gem_names" from the previous iterations
|
||||
self.disable_gem.project_data.pop('gem_names', None)
|
||||
|
||||
# First enable the gem
|
||||
assert enable_gem.enable_gem_in_project(gem_path=gem_path, project_path=project_path) == 0
|
||||
|
||||
# Check that the gem is enabled
|
||||
gem_json = get_gem_json_data(gem_path, project_path)
|
||||
project_json = get_project_json_data(project_path=project_path)
|
||||
enabled_gems_list = cmake.get_enabled_gems(project_path / "Gem/enabled_gems.cmake")
|
||||
assert gem_json.get('gem_name', '') in enabled_gems_list
|
||||
|
||||
# If the gem that is neither registered in the project.json nor engine.json,
|
||||
# then it must appear in the "gem_names" field.
|
||||
if not gem_registered_with_engine and not gem_registered_with_project:
|
||||
assert gem_json.get('gem_name', '') in project_json.get('gem_names', [])
|
||||
else:
|
||||
assert gem_json.get('gem_name', '') not in project_json.get('gem_names', [])
|
||||
|
||||
# Now disable the gem
|
||||
result = disable_gem.disable_gem_in_project(gem_path=gem_path, project_path=project_path)
|
||||
assert result == expected_result
|
||||
|
||||
# Refresh the enabled_gems list and check for removal of the gem
|
||||
gem_json = get_gem_json_data(gem_path, project_path)
|
||||
project_json = get_project_json_data(project_path=project_path)
|
||||
enabled_gems_list = cmake.get_enabled_gems(project_path / "Gem/enabled_gems.cmake")
|
||||
assert gem_json.get('gem_name', '') not in enabled_gems_list
|
||||
|
||||
# If gem name should no longer appear in the "gem_names" field
|
||||
assert gem_json.get('gem_name', '') not in project_json.get('gem_names', [])
|
||||
+16
-15
@@ -104,10 +104,11 @@ class TestEnableGemCommand:
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), False, True, 0),
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), False, False, 0),
|
||||
pytest.param(pathlib.PurePath('TestProject/TestGem'), pathlib.PurePath('TestProject'), True, False, 0),
|
||||
pytest.param(pathlib.PurePath('TestGem'), pathlib.PurePath('TestProject'), False, False, 0),
|
||||
]
|
||||
)
|
||||
def test_enable_gem_registers_gem_as_well(self, gem_path, project_path, gem_registered_with_project, gem_registered_with_engine,
|
||||
expected_result):
|
||||
def test_enable_gem_registers_gem_name_with_project_json(self, gem_path, project_path, gem_registered_with_project,
|
||||
gem_registered_with_engine, expected_result):
|
||||
|
||||
def get_registered_path(project_name: str = None, gem_name: str = None) -> pathlib.Path:
|
||||
if project_name:
|
||||
@@ -116,11 +117,8 @@ class TestEnableGemCommand:
|
||||
return gem_path
|
||||
return None
|
||||
|
||||
def get_registered_gem_path(gem_name: str) -> pathlib.Path:
|
||||
return gem_path
|
||||
|
||||
def save_o3de_manifest(new_project_data: dict, manifest_path: pathlib.Path = None) -> bool:
|
||||
if manifest_path == project_path:
|
||||
if manifest_path == project_path / 'project.json':
|
||||
self.enable_gem.project_data = new_project_data
|
||||
return True
|
||||
|
||||
@@ -129,17 +127,17 @@ class TestEnableGemCommand:
|
||||
return json.loads(TEST_O3DE_MANIFEST_JSON_PAYLOAD)
|
||||
return None
|
||||
|
||||
def get_project_json_data(project_path: pathlib.Path):
|
||||
def get_project_json_data(project_name: str = None, project_path: pathlib.Path = None):
|
||||
return self.enable_gem.project_data
|
||||
|
||||
def get_gem_json_data(gem_path: pathlib.Path, project_path: pathlib.Path):
|
||||
return self.enable_gem.gem_data
|
||||
|
||||
def get_project_gems(project_path: pathlib.Path):
|
||||
return [gem_path] if gem_registered_with_project else []
|
||||
return [pathlib.Path(gem_path).resolve()] if gem_registered_with_project else []
|
||||
|
||||
def get_engine_gems():
|
||||
return [gem_path] if gem_registered_with_engine else []
|
||||
return [pathlib.Path(gem_path).resolve()] if gem_registered_with_engine else []
|
||||
|
||||
def add_gem_dependency(enable_gem_cmake_file: pathlib.Path, gem_name: str):
|
||||
return 0
|
||||
@@ -155,11 +153,14 @@ class TestEnableGemCommand:
|
||||
patch('o3de.manifest.get_engine_gems', side_effect=get_engine_gems) as get_engine_gems_patch,\
|
||||
patch('o3de.cmake.add_gem_dependency', side_effect=add_gem_dependency) as add_gem_dependency_patch,\
|
||||
patch('o3de.validation.valid_o3de_gem_json', return_value=True) as valid_gem_json_patch:
|
||||
|
||||
self.enable_gem.project_data.pop('gem_names', None)
|
||||
result = enable_gem.enable_gem_in_project(gem_path=gem_path, project_path=project_path)
|
||||
assert result == expected_result
|
||||
# If the gem isn't registered with the engine or project already it should now be registered with the project
|
||||
if not gem_registered_with_engine and gem_registered_with_project:
|
||||
# Prepend the project path to each external subdirectory
|
||||
project_relative_subdirs = map(lambda subdir: (pathlib.Path(project_path) / subdir).as_posix(),
|
||||
self.enable_gem.project_data.get('external_subdirectories', []))
|
||||
assert gem_path.as_posix() in project_relative_subdirs
|
||||
|
||||
gem_json = get_gem_json_data(gem_path, project_path)
|
||||
project_json = get_project_json_data(project_path=project_path)
|
||||
if not gem_registered_with_engine and not gem_registered_with_project:
|
||||
assert gem_json.get('gem_name', '') in project_json.get('gem_names', [])
|
||||
else:
|
||||
assert gem_json.get('gem_name', '') not in project_json.get('gem_names', [])
|
||||
Reference in New Issue
Block a user