diff --git a/mlflow/projects/utils.py b/mlflow/projects/utils.py index bfd9f3b2af94f..fc1bfd7943e99 100644 --- a/mlflow/projects/utils.py +++ b/mlflow/projects/utils.py @@ -50,16 +50,21 @@ def _parse_subdirectory(uri): # Parses a uri and returns the uri and subdirectory as separate values. # Uses '#' as a delimiter. + unquoted_uri = _strip_quotes(uri) subdirectory = "" - parsed_uri = uri - if "#" in uri: - subdirectory = uri[uri.find("#") + 1 :] - parsed_uri = uri[: uri.find("#")] + parsed_uri = unquoted_uri + if "#" in unquoted_uri: + subdirectory = unquoted_uri[unquoted_uri.find("#") + 1 :] + parsed_uri = unquoted_uri[: unquoted_uri.find("#")] if subdirectory and "." in subdirectory: raise ExecutionException("'.' is not allowed in project subdirectory paths.") return parsed_uri, subdirectory +def _strip_quotes(uri): + return uri.strip("'\"") + + def _get_storage_dir(storage_dir): if storage_dir is not None and not os.path.exists(storage_dir): os.makedirs(storage_dir) diff --git a/tests/projects/test_utils.py b/tests/projects/test_utils.py index 1272cb9a79a55..f6d41e7b5fc67 100644 --- a/tests/projects/test_utils.py +++ b/tests/projects/test_utils.py @@ -137,6 +137,12 @@ def test_parse_subdirectory(): assert parsed_uri == "uri" assert parsed_subdirectory == "subdirectory" + # Make sure the parsing works with quotes. + test_uri = "'uri#subdirectory'" + parsed_uri, parsed_subdirectory = _parse_subdirectory(test_uri) + assert parsed_uri == "uri" + assert parsed_subdirectory == "subdirectory" + # Make sure periods are restricted in Git repo subdirectory paths. period_fail_uri = GIT_PROJECT_URI + "#.." with pytest.raises(ExecutionException):