Merge stabilization/2110 as of 20edb35cdc into development (#5319)
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
|
||||
set -o errexit # exit on the first failure encountered
|
||||
|
||||
SOURCE_DIRECTORY=${PWD}
|
||||
|
||||
if [[ ! -d $OUTPUT_DIRECTORY ]]; then
|
||||
echo [ci_build] Error: $OUTPUT_DIRECTORY was not found
|
||||
exit 1
|
||||
@@ -22,8 +24,8 @@ fi
|
||||
|
||||
for project in $(echo $CMAKE_LY_PROJECTS | sed "s/;/ /g")
|
||||
do
|
||||
echo [ci_build] ${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
echo [ci_build] ${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$SOURCE_DIRECTORY/$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$SOURCE_DIRECTORY/$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
done
|
||||
|
||||
popd
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "debug",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all"
|
||||
}
|
||||
@@ -53,7 +53,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all"
|
||||
}
|
||||
@@ -66,7 +66,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all"
|
||||
}
|
||||
@@ -80,7 +80,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all",
|
||||
"CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE (SUITE_sandbox|SUITE_awsi) -L FRAMEWORK_googletest --no-tests=error",
|
||||
@@ -93,7 +93,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all",
|
||||
"CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE (SUITE_sandbox|SUITE_awsi) -L FRAMEWORK_googletest --no-tests=error",
|
||||
@@ -110,7 +110,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "AssetProcessorBatch",
|
||||
"ASSET_PROCESSOR_BINARY": "bin/profile/AssetProcessorBatch",
|
||||
@@ -124,7 +124,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "AssetProcessorBatch",
|
||||
"ASSET_PROCESSOR_BINARY": "bin/profile/AssetProcessorBatch",
|
||||
@@ -142,7 +142,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "TEST_SUITE_periodic",
|
||||
"CTEST_OPTIONS": "-L (SUITE_periodic) --no-tests=error",
|
||||
@@ -162,7 +162,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4 -DO3DE_HOME_PATH=\"${WORKSPACE}/home\" -DO3DE_REGISTER_ENGINE_PATH=\"${WORKSPACE}/o3de\" -DO3DE_REGISTER_THIS_ENGINE=TRUE",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all",
|
||||
"CTEST_OPTIONS": "-L (SUITE_sandbox) --no-tests=error"
|
||||
@@ -178,7 +178,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "profile",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "TEST_SUITE_benchmark",
|
||||
"CTEST_OPTIONS": "-L (SUITE_benchmark) --no-tests=error",
|
||||
@@ -195,7 +195,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "release",
|
||||
"OUTPUT_DIRECTORY": "build/linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all"
|
||||
}
|
||||
@@ -210,7 +210,7 @@
|
||||
"PARAMETERS": {
|
||||
"CONFIGURATION": "release",
|
||||
"OUTPUT_DIRECTORY": "build/mono_linux",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_MONOLITHIC_GAME=TRUE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-12 -DCMAKE_CXX_COMPILER=clang++-12 -DLY_MONOLITHIC_GAME=TRUE -DLY_PARALLEL_LINK_JOBS=4",
|
||||
"CMAKE_LY_PROJECTS": "AutomatedTesting",
|
||||
"CMAKE_TARGET": "all"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"ENV": {
|
||||
"NODE_LABEL": "linux",
|
||||
"NODE_LABEL": "linux-707531fc7",
|
||||
"LY_3RDPARTY_PATH": "/home/lybuilder/ly/workspace/3rdParty",
|
||||
"TIMEOUT": 30,
|
||||
"WORKSPACE": "/data/workspace",
|
||||
@@ -17,4 +17,4 @@
|
||||
"CLEAN_WORKSPACE": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
set -o errexit # exit on the first failure encountered
|
||||
|
||||
SOURCE_DIRECTORY=${PWD}
|
||||
|
||||
if [[ ! -d $OUTPUT_DIRECTORY ]]; then
|
||||
echo [ci_build] Error: $OUTPUT_DIRECTORY was not found
|
||||
exit 1
|
||||
@@ -22,8 +24,8 @@ fi
|
||||
|
||||
for project in $(echo $CMAKE_LY_PROJECTS | sed "s/;/ /g")
|
||||
do
|
||||
echo [ci_build] ${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
echo [ci_build] ${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$SOURCE_DIRECTORY/$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
${ASSET_PROCESSOR_BINARY} $ASSET_PROCESSOR_OPTIONS --project-path=$SOURCE_DIRECTORY/$project --platforms=$ASSET_PROCESSOR_PLATFORMS
|
||||
done
|
||||
|
||||
popd
|
||||
|
||||
@@ -9,6 +9,8 @@ REM
|
||||
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
|
||||
SET SOURCE_DIRECTORY=%CD%
|
||||
|
||||
IF NOT EXIST %OUTPUT_DIRECTORY% (
|
||||
ECHO [ci_build] Error: %OUTPUT_DIRECTORY% was not found
|
||||
GOTO :error
|
||||
@@ -21,8 +23,8 @@ IF NOT EXIST %ASSET_PROCESSOR_BINARY% (
|
||||
)
|
||||
|
||||
FOR %%P in (%CMAKE_LY_PROJECTS%) do (
|
||||
ECHO [ci_build] %ASSET_PROCESSOR_BINARY% %ASSET_PROCESSOR_OPTIONS% --project-path=%%P --platforms=%ASSET_PROCESSOR_PLATFORMS%
|
||||
%ASSET_PROCESSOR_BINARY% %ASSET_PROCESSOR_OPTIONS% --project-path=%%P --platforms=%ASSET_PROCESSOR_PLATFORMS%
|
||||
ECHO [ci_build] %ASSET_PROCESSOR_BINARY% %ASSET_PROCESSOR_OPTIONS% --project-path=%SOURCE_DIRECTORY%/%%P --platforms=%ASSET_PROCESSOR_PLATFORMS%
|
||||
%ASSET_PROCESSOR_BINARY% %ASSET_PROCESSOR_OPTIONS% --project-path=%SOURCE_DIRECTORY%/%%P --platforms=%ASSET_PROCESSOR_PLATFORMS%
|
||||
IF NOT !ERRORLEVEL!==0 GOTO :popd_error
|
||||
)
|
||||
|
||||
|
||||
@@ -54,6 +54,8 @@ def edit_gem_props(gem_path: pathlib.Path = None,
|
||||
new_icon: str = None,
|
||||
new_requirements: str = None,
|
||||
new_documentation_url: str = None,
|
||||
new_license: str = None,
|
||||
new_license_url: str = None,
|
||||
new_tags: list or str = None,
|
||||
remove_tags: list or str = None,
|
||||
replace_tags: list or str = None,
|
||||
@@ -94,6 +96,10 @@ def edit_gem_props(gem_path: pathlib.Path = None,
|
||||
update_key_dict['requirements'] = new_requirements
|
||||
if new_documentation_url:
|
||||
update_key_dict['documentation_url'] = new_documentation_url
|
||||
if new_license:
|
||||
update_key_dict['license'] = new_license
|
||||
if new_license_url:
|
||||
update_key_dict['license_url'] = new_license_url
|
||||
|
||||
update_key_dict['user_tags'] = update_values_in_key_list(gem_json_data.get('user_tags', []), new_tags,
|
||||
remove_tags, replace_tags)
|
||||
@@ -114,6 +120,8 @@ def _edit_gem_props(args: argparse) -> int:
|
||||
args.gem_icon,
|
||||
args.gem_requirements,
|
||||
args.gem_documentation_url,
|
||||
args.gem_license,
|
||||
args.gem_license_url,
|
||||
args.add_tags,
|
||||
args.remove_tags,
|
||||
args.replace_tags)
|
||||
@@ -142,6 +150,10 @@ def add_parser_args(parser):
|
||||
help='Sets the description of the requirements needed to use the gem.')
|
||||
group.add_argument('-gdu', '--gem-documentation-url', type=str, required=False,
|
||||
help='Sets the url for documentation of the gem.')
|
||||
group.add_argument('-gl', '--gem-license', type=str, required=False,
|
||||
help='Sets the name for the license of the gem.')
|
||||
group.add_argument('-glu', '--gem-license-url', type=str, required=False,
|
||||
help='Sets the url for the license of the gem.')
|
||||
group = parser.add_mutually_exclusive_group(required=False)
|
||||
group.add_argument('-at', '--add-tags', type=str, nargs='*', required=False,
|
||||
help='Adds tag(s) to user_tags property. Can be specified multiple times.')
|
||||
|
||||
@@ -18,7 +18,8 @@ TEST_GEM_JSON_PAYLOAD = '''
|
||||
{
|
||||
"gem_name": "TestGem",
|
||||
"display_name": "TestGem",
|
||||
"license": "What license TestGem uses goes here: i.e. https://opensource.org/licenses/MIT",
|
||||
"license": "MIT",
|
||||
"license_url": "https://opensource.org/licenses/MIT",
|
||||
"origin": "The primary repo for TestGem goes here: i.e. http://www.mydomain.com",
|
||||
"type": "Code",
|
||||
"summary": "A short description of TestGem.",
|
||||
@@ -46,26 +47,30 @@ def init_gem_json_data(request):
|
||||
class TestEditGemProperties:
|
||||
@pytest.mark.parametrize("gem_path, gem_name, gem_new_name, gem_display, gem_origin,\
|
||||
gem_type, gem_summary, gem_icon, gem_requirements, gem_documentation_url,\
|
||||
add_tags, remove_tags, replace_tags, expected_tags, expected_result", [
|
||||
gem_license, gem_license_url, add_tags, remove_tags, replace_tags,\
|
||||
expected_tags, expected_result", [
|
||||
pytest.param(pathlib.PurePath('D:/TestProject'),
|
||||
None, 'TestGem2', 'New Gem Name', 'O3DE', 'Code', 'Gem that exercises Default Gem Template',
|
||||
'new_preview.png', 'Do this extra thing', 'https://o3de.org/docs/user-guide/gems/',
|
||||
'Apache 2.0', 'https://www.apache.org/licenses/LICENSE-2.0',
|
||||
['Physics', 'Rendering', 'Scripting'], None, None, ['TestGem', 'Physics', 'Rendering', 'Scripting'],
|
||||
0),
|
||||
pytest.param(None,
|
||||
'TestGem2', None, 'New Gem Name', 'O3DE', 'Asset', 'Gem that exercises Default Gem Template',
|
||||
'new_preview.png', 'Do this extra thing', 'https://o3de.org/docs/user-guide/gems/', None,
|
||||
['Physics'], None, ['TestGem', 'Rendering', 'Scripting'], 0),
|
||||
'new_preview.png', 'Do this extra thing', 'https://o3de.org/docs/user-guide/gems/',
|
||||
'Apache 2.0', 'https://www.apache.org/licenses/LICENSE-2.0',
|
||||
None, ['Physics'], None, ['TestGem', 'Rendering', 'Scripting'], 0),
|
||||
pytest.param(None,
|
||||
'TestGem2', None, 'New Gem Name', 'O3DE', 'Tool', 'Gem that exercises Default Gem Template',
|
||||
'new_preview.png', 'Do this extra thing', 'https://o3de.org/docs/user-guide/gems/', None,
|
||||
None, ['Animation', 'TestGem'], ['Animation', 'TestGem'], 0)
|
||||
'new_preview.png', 'Do this extra thing', 'https://o3de.org/docs/user-guide/gems/',
|
||||
'Apache 2.0', 'https://www.apache.org/licenses/LICENSE-2.0',
|
||||
None, None, ['Animation', 'TestGem'], ['Animation', 'TestGem'], 0)
|
||||
]
|
||||
)
|
||||
def test_edit_gem_properties(self, gem_path, gem_name, gem_new_name, gem_display, gem_origin,
|
||||
gem_type, gem_summary, gem_icon, gem_requirements,
|
||||
gem_documentation_url, add_tags, remove_tags, replace_tags,
|
||||
expected_tags, expected_result):
|
||||
gem_documentation_url, gem_license, gem_license_url, add_tags, remove_tags,
|
||||
replace_tags, expected_tags, expected_result):
|
||||
|
||||
def get_gem_json_data(gem_path: pathlib.Path) -> dict:
|
||||
return self.gem_json.data
|
||||
@@ -82,7 +87,8 @@ class TestEditGemProperties:
|
||||
patch('o3de.manifest.get_registered', side_effect=get_gem_path) as get_registered_patch:
|
||||
result = gem_properties.edit_gem_props(gem_path, gem_name, gem_new_name, gem_display, gem_origin,
|
||||
gem_type, gem_summary, gem_icon, gem_requirements,
|
||||
gem_documentation_url, add_tags, remove_tags, replace_tags)
|
||||
gem_documentation_url, gem_license, gem_license_url,
|
||||
add_tags, remove_tags, replace_tags)
|
||||
assert result == expected_result
|
||||
if gem_new_name:
|
||||
assert self.gem_json.data.get('gem_name', '') == gem_new_name
|
||||
@@ -100,5 +106,9 @@ class TestEditGemProperties:
|
||||
assert self.gem_json.data.get('requirements', '') == gem_requirements
|
||||
if gem_documentation_url:
|
||||
assert self.gem_json.data.get('documentation_url', '') == gem_documentation_url
|
||||
if gem_license:
|
||||
assert self.gem_json.data.get('license', '') == gem_license
|
||||
if gem_license_url:
|
||||
assert self.gem_json.data.get('license_url', '') == gem_license_url
|
||||
|
||||
assert set(self.gem_json.data.get('user_tags', [])) == set(expected_tags)
|
||||
|
||||
Reference in New Issue
Block a user