Merge pull request #4555 from aws-lumberyard-dev/cgalvan/CreateTemplatePreferSanitizedNameForCppFilesContent

Updated create-template logic to prefer the SanitizedCppName when running replacements on cpp file contents.
This commit is contained in:
Chris Galvan
2021-10-07 18:22:22 -05:00
committed by GitHub
2 changed files with 57 additions and 18 deletions
+43 -4
View File
@@ -59,6 +59,14 @@ binary_file_ext = {
'.motionset'
}
cpp_file_ext = {
'.cpp',
'.h',
'.hpp',
'.hxx',
'.inl'
}
expect_license_info_ext = {
'.cpp',
'.h',
@@ -402,7 +410,7 @@ def create_template(source_path: pathlib.Path,
# if no template path, error
if not template_path:
logger.info(f'Template path empty. Using source name {source_name}')
template_path = source_name
template_path = pathlib.Path(source_name)
if not template_path.is_absolute():
default_templates_folder = manifest.get_registered(default_folder='templates')
template_path = default_templates_folder / template_path
@@ -518,21 +526,52 @@ def create_template(source_path: pathlib.Path,
replacements.append((source_name.upper(), '${NameUpper}'))
replacements.append((source_name, '${Name}'))
replacements.append((sanitized_source_name, '${SanitizedCppName}'))
sanitized_name_index = len(replacements) - 1
def _transform_into_template(s_data: object) -> (bool, str):
def _is_cpp_file(file_path: pathlib.Path) -> bool:
"""
Internal helper method to check if a file is a C++ file based
on its extension, so we can determine if we need to prefer
the ${SanitizedCppName}
:param file_path: The input file path
:return: bool: Whether or not the input file path has a C++ extension
"""
name, ext = os.path.splitext(file_path)
return ext.lower() in cpp_file_ext
def _transform_into_template(s_data: object,
prefer_sanitized_name: bool = False) -> (bool, str):
"""
Internal function to transform any data into templated data
:param s_data: the input data, this could be file data or file name data
:param prefer_sanitized_name: Optionally swap the sanitized name with the normal name
This can be necessary when creating the template, the source
name and sanitized source name might be the same, but C++
files will need to prefer the sanitized version, or else
there might be compile errors (e.g. '-' characters in the name)
:return: bool: whether or not the returned data MAY need to be transformed to instantiate it
t_data: potentially transformed data 0 for success or non 0 failure code
"""
def swap_sanitized_name_and_normal():
replacements[sanitized_name_index-1], replacements[sanitized_name_index] = \
replacements[sanitized_name_index], replacements[sanitized_name_index-1]
# copy the src data to the transformed data, then operate only on transformed data
t_data = str(s_data)
# If we need to prefer the sanitized name, then swap it for the normal
if prefer_sanitized_name:
swap_sanitized_name_and_normal()
# run all the replacements
for replacement in replacements:
t_data = t_data.replace(replacement[0], replacement[1])
# Once we are done running the replacements, reset the list if we had modified it
if prefer_sanitized_name:
swap_sanitized_name_and_normal()
if not keep_license_text:
t_data = _replace_license_text(t_data)
@@ -704,7 +743,7 @@ def create_template(source_path: pathlib.Path,
# open the file and attempt to transform it
with open(entry_abs, 'r') as s:
source_data = s.read()
templated, source_data = _transform_into_template(source_data)
templated, source_data = _transform_into_template(source_data, _is_cpp_file(entry_abs))
# if the file type is a file that we expect to fins license header and we don't find any
# warn that the we didn't find the license info, this makes it easy to make sure we didn't
@@ -840,7 +879,7 @@ def create_template(source_path: pathlib.Path,
# open the file and attempt to transform it
with open(entry_abs, 'r') as s:
source_data = s.read()
templated, source_data = _transform_into_template(source_data)
templated, source_data = _transform_into_template(source_data, _is_cpp_file(entry_abs))
# if the file type is a file that we expect to fins license header and we don't find any
# warn that the we didn't find the license info, this makes it easy to make sure we didn't
+14 -14
View File
@@ -31,17 +31,17 @@ TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE = """
#include <AzCore/EBus/EBus.h>
#include <AzCore/Interface/Interface.h>
namespace ${Name}
namespace ${SanitizedCppName}
{
class ${Name}Requests
class ${SanitizedCppName}Requests
{
public:
AZ_RTTI(${Name}Requests, "{${Random_Uuid}}");
virtual ~${Name}Requests() = default;
AZ_RTTI(${SanitizedCppName}Requests, "{${Random_Uuid}}");
virtual ~${SanitizedCppName}Requests() = default;
// Put your public methods here
};
class ${Name}BusTraits
class ${SanitizedCppName}BusTraits
: public AZ::EBusTraits
{
public:
@@ -52,31 +52,31 @@ namespace ${Name}
//////////////////////////////////////////////////////////////////////////
};
using ${Name}RequestBus = AZ::EBus<${Name}Requests, ${Name}BusTraits>;
using ${Name}Interface = AZ::Interface<${Name}Requests>;
using ${SanitizedCppName}RequestBus = AZ::EBus<${SanitizedCppName}Requests, ${SanitizedCppName}BusTraits>;
using ${SanitizedCppName}Interface = AZ::Interface<${SanitizedCppName}Requests>;
} // namespace ${Name}
} // namespace ${SanitizedCppName}
"""
TEST_TEMPLATED_CONTENT_WITH_LICENSE = CPP_LICENSE_TEXT + TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE
TEST_CONCRETE_TESTTEMPLATE_CONTENT_WITHOUT_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'Name': "TestTemplate"})
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'SanitizedCppName': "TestTemplate"})
TEST_CONCRETE_TESTTEMPLATE_CONTENT_WITH_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'Name': "TestTemplate"})
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'SanitizedCppName': "TestTemplate"})
TEST_CONCRETE_TESTPROJECT_TEMPLATE_CONTENT_WITHOUT_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'Name': "TestProject"})
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'SanitizedCppName': "TestProject"})
TEST_CONCRETE_TESTPROJECT_TEMPLATE_CONTENT_WITH_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'Name': "TestProject"})
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'SanitizedCppName': "TestProject"})
TEST_CONCRETE_TESTGEM_TEMPLATE_CONTENT_WITHOUT_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'Name': "TestGem"})
TEST_TEMPLATED_CONTENT_WITHOUT_LICENSE).safe_substitute({'SanitizedCppName': "TestGem"})
TEST_CONCRETE_TESTGEM_TEMPLATE_CONTENT_WITH_LICENSE = string.Template(
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'Name': "TestGem"})
TEST_TEMPLATED_CONTENT_WITH_LICENSE).safe_substitute({'SanitizedCppName': "TestGem"})
TEST_TEMPLATE_JSON_CONTENTS = """\
{