Templates restricted (#6498)

* Templates/Restricted upgrade/fixes:
Fixed template storage format: templates now only store true relative paths and no longer save "origin" paths and "optional" has been removed, it was never used.
Upgraded all templates to new standard
Template system now correctly handles child objects: Child objects no longer have to specify restricted they inherit from parent
Restricted now operates at the object level and makes no assumptions about parent
Restricted templates can now be combined and seperated on creation
ly_get_list_relative_filename has been deprecated for o3de_pal_dir
All Gems/Projects/Templates updated to use new code

Signed-off-by: byrcolin <byrcolin@amazon.com>
This commit is contained in:
AMZN-byrcolin
2022-01-14 10:27:20 -08:00
committed by GitHub
parent f87e1f6906
commit c778606c89
324 changed files with 2471 additions and 2548 deletions
+1 -1
View File
@@ -8,7 +8,7 @@
add_subdirectory(tests)
ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME})
o3de_pal_dir(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME} ${O3DE_ENGINE_RESTRICTED_PATH} ${LY_ROOT_FOLDER})
include(${pal_dir}/o3de_install_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
ly_install_files(FILES ../o3de.py
-6
View File
@@ -98,9 +98,6 @@ def disable_gem_in_project(gem_name: str = None,
def _run_disable_gem_in_project(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
return disable_gem_in_project(args.gem_name,
args.gem_path,
args.project_name,
@@ -133,9 +130,6 @@ def add_parser_args(parser):
help='The cmake enabled gem file in which gem names are to be removed from.'
'If not specified it will assume ')
parser.add_argument('-ohf', '--override-home-folder', type=pathlib.Path, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.set_defaults(func=_run_disable_gem_in_project)
-5
View File
@@ -277,9 +277,6 @@ def is_o3de_restricted_update_available(restricted_name: str, local_last_updated
return is_o3de_object_update_available(restricted_name, 'restricted_name', local_last_updated)
def _run_download(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
if args.engine_name:
return download_engine(args.engine_name,
args.dest_path,
@@ -331,8 +328,6 @@ def add_parser_args(parser):
parser.add_argument('-f', '--force', action='store_true', required=False,
default=False,
help = 'Force overwrite the current object')
parser.add_argument('-ohf', '--override-home-folder', type=str, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.set_defaults(func=_run_download)
-6
View File
@@ -115,9 +115,6 @@ def enable_gem_in_project(gem_name: str = None,
def _run_enable_gem_in_project(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
return enable_gem_in_project(args.gem_name,
args.gem_path,
args.project_name,
@@ -150,9 +147,6 @@ def add_parser_args(parser):
help='The cmake enabled_gem file in which the gem names are specified.'
'If not specified it will assume enabled_gems.cmake')
parser.add_argument('-ohf', '--override-home-folder', type=pathlib.Path, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.set_defaults(func=_run_enable_gem_in_project)
File diff suppressed because it is too large Load Diff
-6
View File
@@ -14,9 +14,6 @@ from o3de import manifest
def _run_get_registered(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
registered_path = manifest.get_registered(args.engine_name,
args.project_name,
args.gem_name,
@@ -55,9 +52,6 @@ def add_parser_args(parser):
group.add_argument('-rsn', '--restricted-name', type=str, required=False,
help='Restricted name.')
parser.add_argument('-ohf', '--override-home-folder', type=str, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.set_defaults(func=_run_get_registered)
+247 -234
View File
@@ -22,18 +22,13 @@ logger = logging.getLogger('o3de.manifest')
logging.basicConfig(format=utils.LOG_FORMAT)
# Directory methods
override_home_folder = None
def get_this_engine_path() -> pathlib.Path:
return pathlib.Path(os.path.realpath(__file__)).parents[3].resolve()
def get_home_folder() -> pathlib.Path:
if override_home_folder:
return pathlib.Path(override_home_folder).resolve()
else:
return pathlib.Path(os.path.expanduser("~")).resolve()
return pathlib.Path(os.path.expanduser("~")).resolve()
def get_o3de_folder() -> pathlib.Path:
@@ -42,12 +37,6 @@ def get_o3de_folder() -> pathlib.Path:
return o3de_folder
def get_o3de_user_folder() -> pathlib.Path:
o3de_user_folder = get_home_folder() / 'O3DE'
o3de_user_folder.mkdir(parents=True, exist_ok=True)
return o3de_user_folder
def get_o3de_registry_folder() -> pathlib.Path:
registry_folder = get_o3de_folder() / 'Registry'
registry_folder.mkdir(parents=True, exist_ok=True)
@@ -73,19 +62,19 @@ def get_o3de_engines_folder() -> pathlib.Path:
def get_o3de_projects_folder() -> pathlib.Path:
projects_folder = get_o3de_user_folder() / 'Projects'
projects_folder = get_o3de_folder() / 'Projects'
projects_folder.mkdir(parents=True, exist_ok=True)
return projects_folder
def get_o3de_gems_folder() -> pathlib.Path:
gems_folder = get_o3de_user_folder() / 'Gems'
gems_folder = get_o3de_folder() / 'Gems'
gems_folder.mkdir(parents=True, exist_ok=True)
return gems_folder
def get_o3de_templates_folder() -> pathlib.Path:
templates_folder = get_o3de_user_folder() / 'Templates'
templates_folder = get_o3de_folder() / 'Templates'
templates_folder.mkdir(parents=True, exist_ok=True)
return templates_folder
@@ -117,6 +106,10 @@ def get_default_o3de_manifest_json_data() -> dict:
username = os.path.split(get_home_folder())[-1]
o3de_folder = get_o3de_folder()
default_registry_folder = get_o3de_registry_folder()
default_cache_folder = get_o3de_cache_folder()
default_downloads_folder = get_o3de_download_folder()
default_logs_folder = get_o3de_logs_folder()
default_engines_folder = get_o3de_engines_folder()
default_projects_folder = get_o3de_projects_folder()
default_gems_folder = get_o3de_gems_folder()
@@ -124,12 +117,20 @@ def get_default_o3de_manifest_json_data() -> dict:
default_restricted_folder = get_o3de_restricted_folder()
default_third_party_folder = get_o3de_third_party_folder()
default_projects_restricted_folder = default_projects_folder / 'Restricted'
default_projects_restricted_folder.mkdir(parents=True, exist_ok=True)
default_gems_restricted_folder = default_gems_folder / 'Restricted'
default_gems_restricted_folder.mkdir(parents=True, exist_ok=True)
default_templates_restricted_folder = default_templates_folder / 'Restricted'
default_templates_restricted_folder.mkdir(parents=True, exist_ok=True)
default_restricted_projects_folder = default_restricted_folder / 'Projects'
default_restricted_projects_folder.mkdir(parents=True, exist_ok=True)
default_restricted_gems_folder = default_restricted_folder / 'Gems'
default_restricted_gems_folder.mkdir(parents=True, exist_ok=True)
default_restricted_engine_folder = default_restricted_folder / 'Engines' / 'o3de'
default_restricted_engine_folder.mkdir(parents=True, exist_ok=True)
default_restricted_templates_folder = default_restricted_folder / 'Templates'
default_restricted_templates_folder.mkdir(parents=True, exist_ok=True)
default_restricted_engine_folder_json = default_restricted_engine_folder / 'restricted.json'
if not default_restricted_engine_folder_json.is_file():
with default_restricted_engine_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'o3de'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
json_data = {}
json_data.update({'o3de_manifest_name': f'{username}'})
@@ -140,45 +141,14 @@ def get_default_o3de_manifest_json_data() -> dict:
json_data.update({'default_templates_folder': default_templates_folder.as_posix()})
json_data.update({'default_restricted_folder': default_restricted_folder.as_posix()})
json_data.update({'default_third_party_folder': default_third_party_folder.as_posix()})
json_data.update({'engines': []})
json_data.update({'projects': []})
json_data.update({'external_subdirectories': []})
json_data.update({'templates': []})
json_data.update({'restricted': []})
json_data.update({'restricted': [default_restricted_engine_folder.as_posix()]})
json_data.update({'repos': []})
default_restricted_folder_json = default_restricted_folder / 'restricted.json'
if not default_restricted_folder_json.is_file():
with default_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'o3de'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_projects_restricted_folder_json = default_projects_restricted_folder / 'restricted.json'
if not default_projects_restricted_folder_json.is_file():
with default_projects_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'projects'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_gems_restricted_folder_json = default_gems_restricted_folder / 'restricted.json'
if not default_gems_restricted_folder_json.is_file():
with default_gems_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'gems'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
default_templates_restricted_folder_json = default_templates_restricted_folder / 'restricted.json'
if not default_templates_restricted_folder_json.is_file():
with default_templates_restricted_folder_json.open('w') as s:
restricted_json_data = {}
restricted_json_data.update({'restricted_name': 'templates'})
s.write(json.dumps(restricted_json_data, indent=4) + '\n')
json_data.update({'engines': []})
return json_data
def get_o3de_manifest() -> pathlib.Path:
manifest_path = get_o3de_folder() / 'o3de_manifest.json'
if not manifest_path.is_file():
@@ -229,12 +199,12 @@ def save_o3de_manifest(json_data: dict, manifest_path: pathlib.Path = None) -> b
return False
def get_gems_from_subdirectories(external_subdirs: list) -> list:
"""
def get_gems_from_external_subdirectories(external_subdirs: list) -> list:
'''
Helper Method for scanning a set of external subdirectories for gem.json files
"""
'''
def is_gem_subdirectory(subdir_files):
for name in subdir_files:
for name in files:
if name == 'gem.json':
return True
return False
@@ -250,7 +220,8 @@ def get_gems_from_subdirectories(external_subdirs: list) -> list:
return gem_directories
def get_engines() -> list:
# Data query methods
def get_manifest_engines() -> list:
json_data = load_o3de_manifest()
engine_list = json_data['engines'] if 'engines' in json_data else []
# Convert each engine dict entry into a string entry
@@ -259,31 +230,31 @@ def get_engines() -> list:
engine_list))
def get_projects() -> list:
def get_manifest_projects() -> list:
json_data = load_o3de_manifest()
return json_data['projects'] if 'projects' in json_data else []
def get_gems() -> list:
return get_gems_from_subdirectories(get_external_subdirectories())
def get_manifest_gems() -> list:
return get_gems_from_external_subdirectories(get_manifest_external_subdirectories())
def get_external_subdirectories() -> list:
def get_manifest_external_subdirectories() -> list:
json_data = load_o3de_manifest()
return json_data['external_subdirectories'] if 'external_subdirectories' in json_data else []
def get_templates() -> list:
def get_manifest_templates() -> list:
json_data = load_o3de_manifest()
return json_data['templates'] if 'templates' in json_data else []
def get_restricted() -> list:
def get_manifest_restricted() -> list:
json_data = load_o3de_manifest()
return json_data['restricted'] if 'restricted' in json_data else []
def get_repos() -> list:
def get_manifest_repos() -> list:
json_data = load_o3de_manifest()
return json_data['repos'] if 'repos' in json_data else []
@@ -299,7 +270,7 @@ def get_engine_projects() -> list:
def get_engine_gems() -> list:
return get_gems_from_subdirectories(get_engine_external_subdirectories())
return get_gems_from_external_subdirectories(get_engine_external_subdirectories())
def get_engine_external_subdirectories() -> list:
@@ -320,23 +291,9 @@ def get_engine_templates() -> list:
return []
def get_engine_restricted() -> list:
engine_path = get_this_engine_path()
engine_object = get_engine_json_data(engine_path=engine_path)
if engine_object:
return list(map(lambda rel_path: (pathlib.Path(engine_path) / rel_path).as_posix(),
engine_object['restricted'])) if 'restricted' in engine_object else []
return []
# project.json queries
def get_project_engine_name(project_path: pathlib.Path) -> str or None:
project_object = get_project_json_data(project_path=project_path)
return project_object.get('engine', None) if project_object else None
def get_project_gems(project_path: pathlib.Path) -> list:
return get_gems_from_subdirectories(get_project_external_subdirectories(project_path))
return get_gems_from_external_subdirectories(get_project_external_subdirectories(project_path))
def get_project_external_subdirectories(project_path: pathlib.Path) -> list:
@@ -355,74 +312,95 @@ def get_project_templates(project_path: pathlib.Path) -> list:
return []
def get_project_restricted(project_path: pathlib.Path) -> list:
project_object = get_project_json_data(project_path=project_path)
if project_object:
return list(map(lambda rel_path: (pathlib.Path(project_path) / rel_path).as_posix(),
project_object['restricted'])) if 'restricted' in project_object else []
# gem.json queries
def get_gem_gems(gem_path: pathlib.Path) -> list:
return get_gems_from_external_subdirectories(get_gem_external_subdirectories(gem_path))
def get_gem_external_subdirectories(gem_path: pathlib.Path) -> list:
gem_object = get_gem_json_data(gem_path=gem_path)
if gem_object:
return list(map(lambda rel_path: (pathlib.Path(gem_path) / rel_path).as_posix(),
gem_object[
'external_subdirectories'])) if 'external_subdirectories' in gem_object else []
return []
def get_gem_templates(gem_path: pathlib.Path) -> list:
gem_object = get_gem_json_data(gem_path=gem_path)
if gem_object:
return list(map(lambda rel_path: (pathlib.Path(gem_path) / rel_path).as_posix(),
gem_object['templates'])) if 'templates' in gem_object else []
return []
# Combined manifest queries
def get_all_projects() -> list:
projects_data = get_projects()
projects_data = get_manifest_projects()
projects_data.extend(get_engine_projects())
# Remove duplicates from the list
return list(dict.fromkeys(projects_data))
def get_all_gems(project_path: pathlib.Path = None) -> list:
gems_data = get_gems()
gems_data.extend(get_engine_gems())
if project_path:
gems_data.extend(get_project_gems(project_path))
return list(dict.fromkeys(gems_data))
return get_gems_from_external_subdirectories(get_all_external_subdirectories(project_path))
def get_all_external_subdirectories(project_path: pathlib.Path = None) -> list:
external_subdirectories_data = get_external_subdirectories()
external_subdirectories_data = get_manifest_external_subdirectories()
external_subdirectories_data.extend(get_engine_external_subdirectories())
if project_path:
external_subdirectories_data.extend(get_project_external_subdirectories(project_path))
def descend_gems(gem_path: pathlib.Path):
new_external_subdirectories_data = get_gem_external_subdirectories(gem_path)
external_subdirectories_data.extend(new_external_subdirectories_data)
new_gems_data = get_gems_from_external_subdirectories(new_external_subdirectories_data)
for new_gem in new_gems_data:
descend_gems(new_gem)
gems_data = get_gems_from_external_subdirectories(external_subdirectories_data)
for gem in gems_data:
descend_gems(gem)
# Remove duplicates from the list
return list(dict.fromkeys(external_subdirectories_data))
def get_all_templates(project_path: pathlib.Path = None) -> list:
templates_data = get_templates()
templates_data = get_manifest_templates()
templates_data.extend(get_engine_templates())
if project_path:
templates_data.extend(get_project_templates(project_path))
gems_data = get_all_gems(project_path)
for gem_path in gems_data:
templates_data.extend(get_gem_templates(gem_path))
# Remove duplicates from the list
return list(dict.fromkeys(templates_data))
def get_all_restricted(project_path: pathlib.Path = None) -> list:
restricted_data = get_restricted()
restricted_data.extend(get_engine_restricted())
if project_path:
restricted_data.extend(get_project_restricted(project_path))
return list(dict.fromkeys(restricted_data))
# Template functions
def get_templates_for_project_creation():
def get_templates_for_project_creation(project_path: pathlib.Path = None) -> list:
project_templates = []
for template_path in get_all_templates():
for template_path in get_all_templates(project_path):
template_path = pathlib.Path(template_path)
template_json_path = pathlib.Path(template_path) / 'template.json'
template_json_path = template_path / 'template.json'
if not validation.valid_o3de_template_json(template_json_path):
continue
project_json_path = template_path / 'Template' / 'project.json'
if validation.valid_o3de_project_json(project_json_path):
project_templates.append(template_path)
return project_templates
def get_templates_for_gem_creation():
def get_templates_for_gem_creation(project_path: pathlib.Path = None) -> list:
gem_templates = []
for template_path in get_all_templates():
for template_path in get_all_templates(project_path):
template_path = pathlib.Path(template_path)
template_json_path = pathlib.Path(template_path) / 'template.json'
template_json_path = template_path / 'template.json'
if not validation.valid_o3de_template_json(template_json_path):
continue
@@ -432,58 +410,20 @@ def get_templates_for_gem_creation():
return gem_templates
def get_templates_for_generic_creation(): # temporary until we have a better way to do this... maybe template_type element
def filter_project_and_gem_templates_out(template_path,
templates_for_project_creation = get_templates_for_project_creation(),
templates_for_gem_creation = get_templates_for_gem_creation()):
def get_templates_for_generic_creation(project_path: pathlib.Path = None) -> list:
generic_templates = []
for template_path in get_all_templates(project_path):
template_path = pathlib.Path(template_path)
return template_path not in templates_for_project_creation and template_path not in templates_for_gem_creation
template_json_path = template_path / 'template.json'
if not validation.valid_o3de_template_json(template_json_path):
continue
gem_json_path = template_path / 'Template' / 'gem.json'
project_json_path = template_path / 'Template' / 'project.json'
if not validation.valid_o3de_gem_json(gem_json_path) and\
not validation.valid_o3de_project_json(project_json_path):
generic_templates.append(template_path)
return list(filter(filter_project_and_gem_templates_out, get_all_templates()))
def get_json_file_path(object_typename: str,
object_path: str or pathlib.Path) -> pathlib.Path:
if not object_typename or not object_path:
logger.error('Must specify an object typename and object path.')
return None
object_path = pathlib.Path(object_path).resolve()
return object_path / f'{object_typename}.json'
def get_json_data_file(object_json: pathlib.Path,
object_typename: str,
object_validator: callable) -> dict or None:
if not object_typename:
logger.error('Missing object typename.')
return None
if not object_json or not object_json.is_file():
logger.error(f'Invalid {object_typename} json {object_json} supplied or file missing.')
return None
if not object_validator or not object_validator(object_json):
logger.error(f'{object_typename} json {object_json} is not valid or could not be validated.')
return None
with object_json.open('r') as f:
try:
object_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{object_json} failed to load: {e}')
else:
return object_json_data
return None
def get_json_data(object_typename: str,
object_path: str or pathlib.Path,
object_validator: callable) -> dict or None:
object_json = get_json_file_path(object_typename, object_path)
return get_json_data_file(object_json, object_typename, object_validator)
return generic_templates
def get_engine_json_data(engine_name: str = None,
@@ -495,7 +435,28 @@ def get_engine_json_data(engine_name: str = None,
if engine_name and not engine_path:
engine_path = get_registered(engine_name=engine_name)
return get_json_data('engine', engine_path, validation.valid_o3de_engine_json)
if not engine_path:
logger.error(f'Engine Path {engine_path} has not been registered.')
return None
engine_path = pathlib.Path(engine_path).resolve()
engine_json = engine_path / 'engine.json'
if not engine_json.is_file():
logger.error(f'Engine json {engine_json} is not present.')
return None
if not validation.valid_o3de_engine_json(engine_json):
logger.error(f'Engine json {engine_json} is not valid.')
return None
with engine_json.open('r') as f:
try:
engine_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{engine_json} failed to load: {str(e)}')
else:
return engine_json_data
return None
def get_project_json_data(project_name: str = None,
@@ -507,7 +468,28 @@ def get_project_json_data(project_name: str = None,
if project_name and not project_path:
project_path = get_registered(project_name=project_name)
return get_json_data('project', project_path, validation.valid_o3de_project_json)
if not project_path:
logger.error(f'Project Path {project_path} has not been registered.')
return None
project_path = pathlib.Path(project_path).resolve()
project_json = project_path / 'project.json'
if not project_json.is_file():
logger.error(f'Project json {project_json} is not present.')
return None
if not validation.valid_o3de_project_json(project_json):
logger.error(f'Project json {project_json} is not valid.')
return None
with project_json.open('r') as f:
try:
project_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{project_json} failed to load: {str(e)}')
else:
return project_json_data
return None
def get_gem_json_data(gem_name: str = None, gem_path: str or pathlib.Path = None,
@@ -519,10 +501,28 @@ def get_gem_json_data(gem_name: str = None, gem_path: str or pathlib.Path = None
if gem_name and not gem_path:
gem_path = get_registered(gem_name=gem_name, project_path=project_path)
if pathlib.Path(gem_path).is_file():
return get_json_data_file(gem_path, 'gem', validation.valid_o3de_gem_json)
else:
return get_json_data('gem', gem_path, validation.valid_o3de_gem_json)
if not gem_path:
logger.error(f'Gem Path {gem_path} has not been registered.')
return None
gem_path = pathlib.Path(gem_path).resolve()
gem_json = gem_path / 'gem.json'
if not gem_json.is_file():
logger.error(f'Gem json {gem_json} is not present.')
return None
if not validation.valid_o3de_gem_json(gem_json):
logger.error(f'Gem json {gem_json} is not valid.')
return None
with gem_json.open('r') as f:
try:
gem_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{gem_json} failed to load: {str(e)}')
else:
return gem_json_data
return None
def get_template_json_data(template_name: str = None, template_path: str or pathlib.Path = None,
@@ -534,7 +534,28 @@ def get_template_json_data(template_name: str = None, template_path: str or path
if template_name and not template_path:
template_path = get_registered(template_name=template_name, project_path=project_path)
return get_json_data('template', template_path, validation.valid_o3de_template_json)
if not template_path:
logger.error(f'Template Path {template_path} has not been registered.')
return None
template_path = pathlib.Path(template_path).resolve()
template_json = template_path / 'template.json'
if not template_json.is_file():
logger.error(f'Template json {template_json} is not present.')
return None
if not validation.valid_o3de_template_json(template_json):
logger.error(f'Template json {template_json} is not valid.')
return None
with template_json.open('r') as f:
try:
template_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{template_json} failed to load: {str(e)}')
else:
return template_json_data
return None
def get_restricted_json_data(restricted_name: str = None, restricted_path: str or pathlib.Path = None,
@@ -546,26 +567,28 @@ def get_restricted_json_data(restricted_name: str = None, restricted_path: str o
if restricted_name and not restricted_path:
restricted_path = get_registered(restricted_name=restricted_name, project_path=project_path)
return get_json_data('restricted', restricted_path, validation.valid_o3de_restricted_json)
def get_repo_json_data(repo_uri: str) -> dict or None:
if not repo_uri:
logger.error('Must specify a Repo Uri.')
if not restricted_path:
logger.error(f'Restricted Path {restricted_path} has not been registered.')
return None
repo_json = get_repo_path(repo_uri=repo_uri)
restricted_path = pathlib.Path(restricted_path).resolve()
restricted_json = restricted_path / 'restricted.json'
if not restricted_json.is_file():
logger.error(f'Restricted json {restricted_json} is not present.')
return None
if not validation.valid_o3de_restricted_json(restricted_json):
logger.error(f'Restricted json {restricted_json} is not valid.')
return None
return get_json_data_file(repo_json, "Repo", validation.valid_o3de_repo_json)
with restricted_json.open('r') as f:
try:
restricted_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{restricted_json} failed to load: {str(e)}')
else:
return restricted_json_data
def get_repo_path(repo_uri: str, cache_folder: str or pathlib.Path = None) -> pathlib.Path:
if not cache_folder:
cache_folder = get_o3de_cache_folder()
repo_manifest = f'{repo_uri}/repo.json'
repo_sha256 = hashlib.sha256(repo_manifest.encode())
return cache_folder / str(repo_sha256.hexdigest() + '.json')
return None
def get_registered(engine_name: str = None,
@@ -604,7 +627,7 @@ def get_registered(engine_name: str = None,
# check global first then this engine
if isinstance(engine_name, str):
engines = get_engines()
engines = get_manifest_engines()
for engine in engines:
if isinstance(engine, dict):
engine_path = pathlib.Path(engine['path']).resolve()
@@ -633,72 +656,60 @@ def get_registered(engine_name: str = None,
for project_path in projects:
project_path = pathlib.Path(project_path).resolve()
project_json = project_path / 'project.json'
if not pathlib.Path(project_json).is_file():
logger.warning(f'{project_json} does not exist')
else:
with project_json.open('r') as f:
try:
project_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{project_json} failed to load: {str(e)}')
else:
this_projects_name = project_json_data['project_name']
if this_projects_name == project_name:
return project_path
with project_json.open('r') as f:
try:
project_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{project_json} failed to load: {str(e)}')
else:
this_projects_name = project_json_data['project_name']
if this_projects_name == project_name:
return project_path
elif isinstance(gem_name, str):
gems = get_all_gems(project_path)
for gem_path in gems:
gem_path = pathlib.Path(gem_path).resolve()
gem_json = gem_path / 'gem.json'
if not pathlib.Path(gem_json).is_file():
logger.warning(f'{gem_json} does not exist')
else:
with gem_json.open('r') as f:
try:
gem_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{gem_json} failed to load: {str(e)}')
else:
this_gems_name = gem_json_data['gem_name']
if this_gems_name == gem_name:
return gem_path
with gem_json.open('r') as f:
try:
gem_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{gem_json} failed to load: {str(e)}')
else:
this_gems_name = gem_json_data['gem_name']
if this_gems_name == gem_name:
return gem_path
elif isinstance(template_name, str):
templates = get_all_templates(project_path)
for template_path in templates:
template_path = pathlib.Path(template_path).resolve()
template_json = template_path / 'template.json'
if not pathlib.Path(template_json).is_file():
logger.warning(f'{template_json} does not exist')
else:
with template_json.open('r') as f:
try:
template_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{template_path} failed to load: {str(e)}')
else:
this_templates_name = template_json_data['template_name']
if this_templates_name == template_name:
return template_path
with template_json.open('r') as f:
try:
template_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{template_path} failed to load: {str(e)}')
else:
this_templates_name = template_json_data['template_name']
if this_templates_name == template_name:
return template_path
elif isinstance(restricted_name, str):
restricted = get_all_restricted(project_path)
restricted = get_manifest_restricted()
for restricted_path in restricted:
restricted_path = pathlib.Path(restricted_path).resolve()
restricted_json = restricted_path / 'restricted.json'
if not pathlib.Path(restricted_json).is_file():
logger.warning(f'{restricted_json} does not exist')
else:
with restricted_json.open('r') as f:
try:
restricted_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{restricted_json} failed to load: {str(e)}')
else:
this_restricted_name = restricted_json_data['restricted_name']
if this_restricted_name == restricted_name:
return restricted_path
with restricted_json.open('r') as f:
try:
restricted_json_data = json.load(f)
except json.JSONDecodeError as e:
logger.warning(f'{restricted_json} failed to load: {str(e)}')
else:
this_restricted_name = restricted_json_data['restricted_name']
if this_restricted_name == restricted_name:
return restricted_path
elif isinstance(default_folder, str):
if default_folder == 'engines':
@@ -720,7 +731,9 @@ def get_registered(engine_name: str = None,
elif isinstance(repo_name, str):
cache_folder = get_o3de_cache_folder()
for repo_uri in json_data['repos']:
cache_file = get_repo_path(repo_uri=repo_uri, cache_folder=cache_folder)
repo_uri = pathlib.Path(repo_uri).resolve()
repo_sha256 = hashlib.sha256(repo_uri.encode())
cache_file = cache_folder / str(repo_sha256.hexdigest() + '.json')
if cache_file.is_file():
repo = pathlib.Path(cache_file).resolve()
with repo.open('r') as f:
+31 -104
View File
@@ -39,69 +39,68 @@ def get_project_path(project_path: pathlib.Path, project_name: str) -> pathlib.P
return project_path
def print_this_engine(verbose: int) -> int:
def print_this_engine(verbose: int = 0) -> int:
this_engine_path = manifest.get_this_engine_path()
print(f'This Engine:\n{json.dumps(str(this_engine_path), indent=4)}')
if verbose > 0:
return print_manifest_json_data([this_engine_path], 'This Engine',
manifest.get_engine_json_data, 'engine_path')
manifest.get_engine_json_data, 'engine_path')
return 0
def print_engines(verbose: int) -> None:
engines_data = manifest.get_engines()
def print_engines(verbose: int = 0) -> int:
engines_data = manifest.get_manifest_engines()
print(f'Engine Paths:\n{json.dumps(engines_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(engines_data, 'Engine Jsons',
manifest.get_engine_json_data, 'engine_path')
manifest.get_engine_json_data, 'engine_path')
return 0
def print_projects(verbose: int) -> int:
projects_data = manifest.get_projects()
def print_projects(verbose: int = 0) -> int:
projects_data = manifest.get_all_projects()
print(f'Project Paths:\n{json.dumps(projects_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(projects_data, 'Project Jsons',
manifest.get_project_json_data, 'project_path')
manifest.get_project_json_data, 'project_path')
return 0
def print_gems(verbose: int) -> int:
gems_data = manifest.get_gems()
def print_gems(verbose: int = 0) -> int:
gems_data = manifest.get_all_gems()
print(f'Gem Paths:\n{json.dumps(gems_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(gems_data, 'Gem Jsons',
manifest.get_gem_json_data, 'gem_path')
manifest.get_gem_json_data, 'gem_path')
return 0
def print_external_subdirectories(verbose: int) -> int:
external_subdirs_data = manifest.get_external_subdirectories()
def print_external_subdirectories(verbose: int = 0) -> int:
external_subdirs_data = manifest.get_all_external_subdirectories()
print(f'External Subdirectories:\n{json.dumps(external_subdirs_data, indent=4)}')
return 0
def print_templates(verbose: int) -> int:
templates_data = manifest.get_templates()
templates_data = manifest.get_all_templates()
print(f'Template Paths:\n{json.dumps(templates_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(templates_data, 'Template Jsons',
manifest.get_template_json_data, 'template_path')
manifest.get_template_json_data, 'template_path')
return 0
def print_restricted(verbose: int) -> int:
restricted_data = manifest.get_restricted()
restricted_data = manifest.get_manifest_restricted()
print(f'Restricted Paths:\n{json.dumps(restricted_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(restricted_data, 'Restricted Jsons',
manifest.get_restricted_json_data, 'restricted_path')
manifest.get_restricted_json_data, 'restricted_path')
return 0
@@ -112,7 +111,7 @@ def print_engine_projects(verbose: int) -> int:
if verbose > 0:
return print_manifest_json_data(engine_projects_data, 'Project Jsons',
manifest.get_project_json_data, 'project_path')
manifest.get_project_json_data, 'project_path')
return 0
@@ -122,7 +121,7 @@ def print_engine_gems(verbose: int) -> int:
if verbose > 0:
return print_manifest_json_data(engine_gems_data, 'Gem Jsons',
manifest.get_gem_json_data, 'gem_path')
manifest.get_gem_json_data, 'gem_path')
return 0
@@ -132,17 +131,7 @@ def print_engine_templates(verbose: int) -> int:
if verbose > 0:
return print_manifest_json_data(engine_templates_data, 'Template Jsons',
manifest.get_template_json_data, 'template_path')
return 0
def print_engine_restricted(verbose: int) -> int:
engine_restricted_data = manifest.get_engine_restricted()
print(f'Restricted Paths:\n{json.dumps(engine_restricted_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(engine_restricted_data, 'Restricted Jsons',
manifest.get_restricted_json_data, 'restricted_path')
manifest.get_template_json_data, 'template_path')
return 0
@@ -153,21 +142,6 @@ def print_engine_external_subdirectories(verbose: int) -> int:
# Project output methods
def print_project_engine_name(verbose: int, project_path: pathlib.Path, project_name: str) -> int:
project_path = get_project_path(project_path, project_name)
if not project_path:
return 1
engine_name = manifest.get_project_engine_name(project_path)
if engine_name:
print(f'Project\'s engine name:\n{engine_name}')
return 0
if verbose > 0:
logger.info(f'project.json at path "{project_path}" contains no registered "engine" field')
return 1
def print_project_gems(verbose: int, project_path: pathlib.Path, project_name: str) -> int:
project_path = get_project_path(project_path, project_name)
if not project_path:
@@ -178,7 +152,7 @@ def print_project_gems(verbose: int, project_path: pathlib.Path, project_name: s
if verbose > 0:
return print_manifest_json_data(project_gems_data, 'Gems Jsons',
manifest.get_gem_json_data, 'gem_path')
manifest.get_gem_json_data, 'gem_path')
return 0
@@ -201,20 +175,7 @@ def print_project_templates(verbose: int, project_path: pathlib.Path, project_na
print(f'Template Paths:\n{json.dumps(project_templates_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(project_templates_data, 'Template Jsons',
manifest.get_template_json_data, 'template_path')
return 0
def print_project_restricted(verbose: int, project_path: pathlib.Path, project_name: str) -> int:
project_path = get_project_path(project_path, project_name)
if not project_path:
return 1
project_restricted_data = manifest.get_project_restricted(project_path)
print(f'Restricted Paths:\n{json.dumps(project_restricted_data, indent=4)}')
if verbose > 0:
return print_manifest_json_data(project_restricted_data, 'Restricted Jsons',
manifest.get_restricted_json_data, 'restricted_path')
manifest.get_template_json_data, 'template_path')
return 0
@@ -224,12 +185,12 @@ def print_all_projects(verbose: int) -> int:
if verbose > 0:
return print_manifest_json_data(all_projects_data, 'Project Jsons',
manifest.get_project_json_data, 'project_path')
manifest.get_project_json_data, 'project_path')
return 0
def print_all_gems(verbose: int, project_path: pathlib.Path = None, project_name: str = None) -> int:
all_gems = manifest.get_gems()
all_gems = manifest.get_manifest_gems()
all_gems.extend(manifest.get_engine_gems())
# If a project path or project name is supplied query the gems from that project, otherwise query the gems from
@@ -245,12 +206,12 @@ def print_all_gems(verbose: int, project_path: pathlib.Path = None, project_name
if verbose > 0:
return print_manifest_json_data(all_gems, 'Gem Jsons',
manifest.get_gem_json_data, 'gem_path')
manifest.get_gem_json_data, 'gem_path')
return 0
def print_all_external_subdirectories(verbose: int, project_path: pathlib.Path = None, project_name: str = None) -> int:
all_external_subdirectories = manifest.get_external_subdirectories()
all_external_subdirectories = manifest.get_manifest_external_subdirectories()
all_external_subdirectories.extend(manifest.get_engine_external_subdirectories())
# If a project path or project name is supplied query the external subdirectories from that project,
@@ -267,7 +228,7 @@ def print_all_external_subdirectories(verbose: int, project_path: pathlib.Path =
def print_all_templates(verbose: int, project_path: pathlib.Path = None, project_name: str = None) -> int:
all_templates = manifest.get_templates()
all_templates = manifest.get_manifest_templates()
all_templates.extend(manifest.get_engine_templates())
# If a project path or project name is supplied query the templates from that project,
@@ -283,31 +244,9 @@ def print_all_templates(verbose: int, project_path: pathlib.Path = None, project
if verbose > 0:
return print_manifest_json_data(all_templates, 'Template Jsons',
manifest.get_template_json_data, 'template_path')
manifest.get_template_json_data, 'template_path')
return 0
def print_all_restricted(verbose: int, project_path: pathlib.Path = None, project_name: str = None) -> int:
all_restricted = manifest.get_restricted()
all_restricted.extend(manifest.get_engine_restricted())
# If a project path or project name is supplied query the restricted from that project,
# otherwise query the restricted from all projects
project_path = get_project_path(project_path, project_name) if project_path or project_name else None
projects = [project_path] if project_path else manifest.get_all_projects()
for project in projects:
all_restricted.extend(manifest.get_project_restricted(project))
# Filter out duplicates
all_restricted = list(dict.fromkeys(all_restricted))
print(f'Restricted Paths:\n{json.dumps(all_restricted, indent=4)}')
if verbose > 0:
return print_manifest_json_data(all_restricted, 'Restricted Jsons',
manifest.get_restricted_json_data, 'restricted_path')
return 0
def print_manifest_json_data(uri_json_data: list,
print_prefix: str, get_json_func: callable, get_json_data_kw: str) -> int:
print('\n')
@@ -351,7 +290,7 @@ def print_repos_data(repos_data: dict) -> int:
def print_repos(verbose: int) -> int:
repos_data = manifest.get_repos()
repos_data = manifest.get_manifest_repos()
print(json.dumps(repos_data, indent=4))
if verbose > 0:
@@ -370,16 +309,13 @@ def register_show(verbose: int, project_path: pathlib.Path = None, project_name:
result = print_all_projects(verbose) or result
result = print_all_gems(verbose, project_path, project_name) or result
result = print_all_templates(verbose, project_path, project_name) or result
result = print_all_restricted(verbose, project_path, project_name) or result
result = print_restricted(verbose) or result
result = print_repos(verbose) or result
return result
def _run_register_show(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
if args.this_engine:
return print_this_engine(args.verbose)
elif args.engines:
@@ -393,7 +329,7 @@ def _run_register_show(args: argparse) -> int:
elif args.templates:
return print_templates(args.verbose)
elif args.repos:
return register_show_repos(args.verbose)
return print_repos(args.verbose)
elif args.restricted:
return print_restricted(args.verbose)
@@ -405,8 +341,6 @@ def _run_register_show(args: argparse) -> int:
return print_engine_external_subdirectories(args.verbose)
elif args.engine_templates:
return print_engine_templates(args.verbose)
elif args.engine_restricted:
return print_engine_restricted(args.verbose)
elif args.project_gems:
return print_project_gems(args.verbose, args.project_path, args.project_name)
@@ -414,8 +348,6 @@ def _run_register_show(args: argparse) -> int:
return print_project_external_subdirectories(args.verbose, args.project_path, args.project_name)
elif args.project_templates:
return print_project_templates(args.verbose, args.project_path, args.project_name)
elif args.project_restricted:
return print_project_restricted(args.verbose, args.project_path, args.project_name)
elif args.project_engine_name:
return print_project_engine_name(args.verbose, args.project_path, args.project_name)
@@ -427,8 +359,6 @@ def _run_register_show(args: argparse) -> int:
return print_all_external_subdirectories(args.verbose, args.project_path, args.project_name)
elif args.all_templates:
return print_all_templates(args.verbose, args.project_path, args.project_name)
elif args.all_restricted:
return print_all_restricted(args.verbose, args.project_path, args.project_name)
else:
return register_show(args.verbose, args.project_path, args.project_name)
@@ -538,9 +468,6 @@ def add_parser_args(parser):
project_group.add_argument('-pn', '--project-name', type=str,
help='The name of a project.')
parser.add_argument('-ohf', '--override-home-folder', type=str, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.set_defaults(func=_run_register_show)
+1 -6
View File
@@ -490,7 +490,7 @@ def register_repo(json_data: dict,
repo_sha256 = hashlib.sha256(url.encode())
cache_file = manifest.get_o3de_cache_folder() / str(repo_sha256.hexdigest() + '.json')
result = utils.download_file(parsed_uri, cache_file, True)
result = utils.download_file(url, cache_file, True)
if result == 0:
json_data.setdefault('repos', []).insert(0, repo_uri)
@@ -793,9 +793,6 @@ def register(engine_path: pathlib.Path = None,
def _run_register(args: argparse) -> int:
if args.override_home_folder:
manifest.override_home_folder = args.override_home_folder
if args.update:
remove_invalid_o3de_objects()
return repo.refresh_repos()
@@ -891,8 +888,6 @@ def add_parser_args(parser):
default=False,
help='Refresh the repo cache.')
parser.add_argument('-ohf', '--override-home-folder', type=pathlib.Path, required=False,
help='By default the home folder is the user folder, override it to this folder.')
parser.add_argument('-r', '--remove', action='store_true', required=False,
default=False,
help='Remove entry.')
+8 -3
View File
@@ -42,8 +42,10 @@ TEST_GEM_JSON_PAYLOAD = '''
{
"gem_name": "TestGem",
"display_name": "TestGem",
"license": "What license TestGem uses goes here: i.e. https://opensource.org/licenses/MIT",
"origin": "The primary repo for TestGem goes here: i.e. http://www.mydomain.com",
"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": [
@@ -53,7 +55,10 @@ TEST_GEM_JSON_PAYLOAD = '''
"TestGem"
],
"icon_path": "preview.png",
"requirements": ""
"requirements": "Any requirement goes here.",
"documentation_url": "The link to the documentation goes here.",
"dependencies": [
]
}
'''
+23 -33
View File
@@ -93,37 +93,28 @@ TEST_TEMPLATE_JSON_CONTENTS = """\
"copyFiles": [
{
"file": "Code/Include/${Name}/${Name}Bus.h",
"origin": "Code/Include/${Name}/${Name}Bus.h",
"isTemplated": true,
"isOptional": false
"isTemplated": true
},
{
"file": "Code/Include/Platform/Salem/${Name}Bus.h",
"origin": "Code/Include/Platform/Salem/${Name}Bus.h",
"isTemplated": true,
"isOptional": false
"file": "Code/Include/Platform/Windows/${Name}Bus.h",
"isTemplated": true
}
],
"createDirectories": [
{
"dir": "Code",
"origin": "Code"
"dir": "Code"
},
{
"dir": "Code/Include",
"origin": "Code/Include"
"dir": "Code/Include"
},
{
"dir": "Code/Include/${Name}",
"origin": "Code/Include/${Name}"
"dir": "Code/Include/${Name}"
},
{
"dir": "Code/Include/Platform",
"origin": "Code/Include/Platform"
"dir": "Code/Include/Platform"
},
{
"dir": "Code/Include/Platform/Salem",
"origin": "Code/Include/Platform/Salem"
"dir": "Code/Include/Platform/Windows"
}
]
}
@@ -174,10 +165,10 @@ def test_create_template(tmpdir,
with gem_bus_file.open('w') as s:
s.write(concrete_contents)
engine_gem_code_include_platform_salem = template_source_path / 'Code/Include/Platform/Salem'
engine_gem_code_include_platform_salem.mkdir(parents=True, exist_ok=True)
engine_gem_code_include_platform_windows = template_source_path / 'Code/Include/Platform/Windows'
engine_gem_code_include_platform_windows.mkdir(parents=True, exist_ok=True)
restricted_gem_bus_file = engine_gem_code_include_platform_salem / 'TestTemplateBus.h'
restricted_gem_bus_file = engine_gem_code_include_platform_windows / 'TestTemplateBus.h'
with restricted_gem_bus_file.open('w') as s:
s.write(concrete_contents)
@@ -209,9 +200,9 @@ def test_create_template(tmpdir,
else:
assert s_data == templated_contents_without_license
platform_template_folder = engine_root / 'Salem/Templates'
platform_template_folder = engine_root / 'Windows/Templates'
new_platform_default_name_bus_file = template_content_folder / 'Code/Include/Platform/Salem/${Name}Bus.h'
new_platform_default_name_bus_file = template_content_folder / 'Code/Include/Platform/Windows/${Name}Bus.h'
assert new_platform_default_name_bus_file.is_file()
with new_platform_default_name_bus_file.open('r') as s:
s_data = s.read()
@@ -255,7 +246,7 @@ class TestCreateTemplate:
s.write(templated_contents)
template_content_folder = template_default_folder / 'Template'
platform_default_name_bus_dir = template_content_folder / 'Code/Include/Platform/Salem'
platform_default_name_bus_dir = template_content_folder / 'Code/Include/Platform/Windows'
platform_default_name_bus_dir.mkdir(parents=True, exist_ok=True)
platform_default_name_bus_file = platform_default_name_bus_dir / '${Name}Bus.h'
@@ -263,10 +254,13 @@ class TestCreateTemplate:
s.write(templated_contents)
template_dest_path = engine_root / instantiated_name
# Skip registeration in test
# Skip registration in test
with patch('uuid.uuid4', return_value=uuid.uuid5(uuid.NAMESPACE_DNS, instantiated_name)) as uuid4_mock:
result = create_from_template_func(template_dest_path, template_path=template_default_folder, force=True,
keep_license_text=keep_license_text, **create_from_template_kwargs)
result = create_from_template_func(template_dest_path,
template_path=template_default_folder,
keep_license_text=keep_license_text,
force=True,
**create_from_template_kwargs)
if expect_failure:
assert result != 0
else:
@@ -281,7 +275,7 @@ class TestCreateTemplate:
s_data = s.read()
assert s_data == concrete_contents
platform_test_bus_folder = test_folder / 'Code/Include/Platform/Salem'
platform_test_bus_folder = test_folder / 'Code/Include/Platform/Windows'
assert platform_test_bus_folder.is_dir()
platform_default_name_bus_file = platform_test_bus_folder / f'{instantiated_name}Bus.h'
@@ -338,9 +332,7 @@ class TestCreateTemplate:
template_json_dict.setdefault('copyFiles', []).append(
{
"file": "project.json",
"origin": "project.json",
"isTemplated": True,
"isOptional": False
"isTemplated": True
})
# Convert the python dictionary back into a json string
template_json_contents = json.dumps(template_json_dict, indent=4)
@@ -376,9 +368,7 @@ class TestCreateTemplate:
template_json_dict.setdefault('copyFiles', []).append(
{
"file": "gem.json",
"origin": "gem.json",
"isTemplated": True,
"isOptional": False
"isTemplated": True
})
#Convert dict back to string
template_json_contents = json.dumps(template_json_dict, indent=4)
@@ -18,10 +18,9 @@ TEST_GEM_JSON_PAYLOAD = '''
{
"gem_name": "TestGem",
"display_name": "TestGem",
"license": "MIT",
"license_url": "https://opensource.org/licenses/MIT",
"license": "Apache-2.0 or MIT",
"license_url": "https://github.com/o3de/o3de/blob/development/LICENSE.txt",
"origin": "The primary repo for TestGem goes here: i.e. http://www.mydomain.com",
"type": "Code",
"summary": "A short description of TestGem.",
"canonical_tags": [
"Gem"
@@ -31,7 +30,9 @@ TEST_GEM_JSON_PAYLOAD = '''
],
"icon_path": "preview.png",
"requirements": "",
"documentation_url": "https://o3de.org/docs/"
"documentation_url": "https://o3de.org/docs/",
"dependencies": [
]
}
'''
+37 -27
View File
@@ -22,7 +22,7 @@ from o3de import manifest
])
class TestGetTemplatesForCreation:
@staticmethod
def get_templates() -> list:
def get_manifest_templates() -> list:
return []
@staticmethod
@@ -40,20 +40,24 @@ class TestGetTemplatesForCreation:
)
def test_get_templates_for_generic_creation(self, valid_project_json_paths, valid_gem_json_paths,
expected_template_paths):
def validate_project_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_project_json_paths
def validate_project_json(project_json_path) -> bool:
return pathlib.Path(project_json_path) in valid_project_json_paths
def validate_gem_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_gem_json_paths
def validate_gem_json(gem_json_path) -> bool:
return pathlib.Path(gem_json_path) in valid_gem_json_paths
with patch('o3de.manifest.get_templates', side_effect=self.get_templates) as get_templates_patch, \
with patch('o3de.manifest.get_manifest_templates', side_effect=self.get_manifest_templates)\
as get_manifest_templates_patch, \
patch('o3de.manifest.get_project_templates', side_effect=self.get_project_templates)\
as get_project_templates_patch, \
patch('o3de.manifest.get_engine_templates', side_effect=self.get_engine_templates)\
as get_engine_templates_patch, \
patch('o3de.validation.valid_o3de_template_json', return_value=True) as validate_template_json,\
patch('o3de.validation.valid_o3de_project_json', side_effect=validate_project_json) as validate_project_json,\
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) as validate_gem_json:
patch('o3de.validation.valid_o3de_template_json', return_value=True) \
as validate_template_json,\
patch('o3de.validation.valid_o3de_project_json', side_effect=validate_project_json) \
as validate_project_json,\
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) \
as validate_gem_json:
templates = manifest.get_templates_for_generic_creation()
assert templates == expected_template_paths
@@ -64,21 +68,24 @@ class TestGetTemplatesForCreation:
)
def test_get_templates_for_gem_creation(self, valid_project_json_paths, valid_gem_json_paths,
expected_template_paths):
def validate_project_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_project_json_paths
def validate_project_json(project_json_path) -> bool:
return pathlib.Path(project_json_path) in valid_project_json_paths
def validate_gem_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_gem_json_paths
def validate_gem_json(gem_json_path) -> bool:
return pathlib.Path(gem_json_path) in valid_gem_json_paths
with patch('o3de.manifest.get_templates', side_effect=self.get_templates) as get_templates_patch, \
with patch('o3de.manifest.get_manifest_templates', side_effect=self.get_manifest_templates)\
as get_manifest_templates_patch, \
patch('o3de.manifest.get_project_templates', side_effect=self.get_project_templates) \
as get_project_templates_patch, \
patch('o3de.manifest.get_engine_templates', side_effect=self.get_engine_templates) \
as get_engine_templates_patch, \
patch('o3de.validation.valid_o3de_template_json', return_value=True) as validate_template_json, \
patch('o3de.validation.valid_o3de_project_json',
side_effect=validate_project_json) as validate_project_json, \
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) as validate_gem_json:
patch('o3de.validation.valid_o3de_template_json', return_value=True) \
as validate_template_json, \
patch('o3de.validation.valid_o3de_project_json', side_effect=validate_project_json) \
as validate_project_json, \
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) \
as validate_gem_json:
templates = manifest.get_templates_for_project_creation()
assert templates == expected_template_paths
@@ -89,20 +96,23 @@ class TestGetTemplatesForCreation:
)
def test_get_templates_for_project_creation(self, valid_project_json_paths, valid_gem_json_paths,
expected_template_paths):
def validate_project_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_project_json_paths
def validate_project_json(project_json_path) -> bool:
return pathlib.Path(project_json_path) in valid_project_json_paths
def validate_gem_json(template_path) -> bool:
return pathlib.Path(template_path) in valid_gem_json_paths
def validate_gem_json(gem_json_path) -> bool:
return pathlib.Path(gem_json_path) in valid_gem_json_paths
with patch('o3de.manifest.get_templates', side_effect=self.get_templates) as get_templates_patch, \
with patch('o3de.manifest.get_manifest_templates', side_effect=self.get_manifest_templates) \
as get_manifest_templates_patch, \
patch('o3de.manifest.get_project_templates', side_effect=self.get_project_templates) \
as get_project_templates_patch, \
patch('o3de.manifest.get_engine_templates', side_effect=self.get_engine_templates) \
as get_engine_templates_patch, \
patch('o3de.validation.valid_o3de_template_json', return_value=True) as validate_template_json, \
patch('o3de.validation.valid_o3de_project_json',
side_effect=validate_project_json) as validate_project_json, \
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) as validate_gem_json:
patch('o3de.validation.valid_o3de_template_json', return_value=True) \
as validate_template_json, \
patch('o3de.validation.valid_o3de_project_json', side_effect=validate_project_json) \
as validate_project_json, \
patch('o3de.validation.valid_o3de_gem_json', side_effect=validate_gem_json) \
as validate_gem_json:
templates = manifest.get_templates_for_gem_creation()
assert templates == expected_template_paths
@@ -90,27 +90,20 @@ TEST_TEMPLATE_JSON_PAYLOAD = '''
"copyFiles": [
{
"file": "CMakeLists.txt",
"origin": "CMakeLists.txt",
"isTemplated": true,
"isOptional": false
"isTemplated": true
},
{
"file": "gem.json",
"origin": "gem.json",
"isTemplated": true,
"isOptional": false
"isTemplated": true
},
{
"file": "preview.png",
"origin": "preview.png",
"isTemplated": false,
"isOptional": false
"isTemplated": false
}
],
"createDirectories": [
{
"dir": "Assets",
"origin": "Assets"
"dir": "Assets"
}
]
}
@@ -277,13 +270,9 @@ class TestPrintRegistration:
# Patch the manifest.py function to locate gem.json files in external subdirectories
# to just return a fake path to a single test gem
def get_gems_from_subdirectories(external_subdirs: list) -> list:
return ["D:/TestGem"]
with patch('o3de.manifest.load_o3de_manifest', side_effect=self.load_manifest_json) as load_manifest_patch, \
patch('o3de.manifest.get_gem_json_data', side_effect=self.get_gem_json_data) as get_json_patch, \
patch('o3de.manifest.get_project_json_data', side_effect=self.get_project_json_data) as get_project_json_patch, \
patch('o3de.manifest.get_gems_from_subdirectories', side_effect=get_gems_from_subdirectories) as get_gems_from_subdirs_patch, \
patch('o3de.print_registration.get_project_path', return_value=project_path) as get_project_path_patch:
result = print_registration._run_register_show(test_args)
assert result == 0