Fix pipelines can't handle None return value

This commit is contained in:
allegroai 2022-05-12 23:46:32 +03:00
parent e051085462
commit 3c396b1f7e
3 changed files with 24 additions and 28 deletions

View File

@ -4,6 +4,7 @@ import inspect
import json import json
import os import os
import re import re
import six
from copy import copy, deepcopy from copy import copy, deepcopy
from datetime import datetime from datetime import datetime
from logging import getLogger from logging import getLogger
@ -2032,6 +2033,8 @@ class PipelineController(object):
for g in pattern.findall(value): for g in pattern.findall(value):
# update with actual value # update with actual value
new_val = self.__parse_step_reference(g) new_val = self.__parse_step_reference(g)
if not isinstance(new_val, six.string_types):
return new_val
updated_value = updated_value.replace(g, new_val, 1) updated_value = updated_value.replace(g, new_val, 1)
return updated_value return updated_value

View File

@ -48,6 +48,8 @@ class Artifact(object):
Read-Only Artifact object Read-Only Artifact object
""" """
_not_set = object()
@property @property
def url(self): def url(self):
# type: () -> str # type: () -> str
@ -136,7 +138,7 @@ class Artifact(object):
self._metadata = dict(artifact_api_object.display_data) if artifact_api_object.display_data else {} self._metadata = dict(artifact_api_object.display_data) if artifact_api_object.display_data else {}
self._preview = artifact_api_object.type_data.preview if artifact_api_object.type_data else None self._preview = artifact_api_object.type_data.preview if artifact_api_object.type_data else None
self._content_type = artifact_api_object.type_data.content_type if artifact_api_object.type_data else None self._content_type = artifact_api_object.type_data.content_type if artifact_api_object.type_data else None
self._object = None self._object = self._not_set
def get(self, force_download=False): def get(self, force_download=False):
# type: (bool) -> Any # type: (bool) -> Any
@ -156,7 +158,7 @@ class Artifact(object):
:param bool force_download: download file from remote even if exists in local cache :param bool force_download: download file from remote even if exists in local cache
:return: One of the following objects Numpy.array, pandas.DataFrame, PIL.Image, dict (json), or pathlib2.Path. :return: One of the following objects Numpy.array, pandas.DataFrame, PIL.Image, dict (json), or pathlib2.Path.
""" """
if self._object: if self._object is not self._not_set:
return self._object return self._object
local_file = self.get_local_copy(raise_on_error=True, force_download=force_download) local_file = self.get_local_copy(raise_on_error=True, force_download=force_download)
@ -200,9 +202,8 @@ class Artifact(object):
) )
) )
local_file = Path(local_file) if self._object is self._not_set:
local_file = Path(local_file)
if self._object is None:
self._object = local_file self._object = local_file
return self._object return self._object
@ -640,7 +641,7 @@ class Artifacts(object):
artifact_type_data.content_type = mimetypes.guess_type(artifact_object)[0] artifact_type_data.content_type = mimetypes.guess_type(artifact_object)[0]
if preview: if preview:
artifact_type_data.preview = preview artifact_type_data.preview = preview
elif isinstance(artifact_object, six.string_types): elif isinstance(artifact_object, six.string_types) and artifact_object:
# if we got here, we should store it as text file. # if we got here, we should store it as text file.
artifact_type = 'string' artifact_type = 'string'
artifact_type_data.content_type = 'text/plain' artifact_type_data.content_type = 'text/plain'
@ -652,23 +653,22 @@ class Artifacts(object):
artifact_type_data.preview = '# full text too large to store, storing first {}kb\n{}'.format( artifact_type_data.preview = '# full text too large to store, storing first {}kb\n{}'.format(
self.max_preview_size_bytes//1024, artifact_object[:self.max_preview_size_bytes] self.max_preview_size_bytes//1024, artifact_object[:self.max_preview_size_bytes]
) )
if artifact_object: delete_after_upload = True
delete_after_upload = True override_filename_ext_in_uri = ".txt"
override_filename_ext_in_uri = '.txt' override_filename_in_uri = name + override_filename_ext_in_uri
override_filename_in_uri = name + override_filename_ext_in_uri fd, local_filename = mkstemp(prefix=quote(name, safe="") + ".", suffix=override_filename_ext_in_uri)
fd, local_filename = mkstemp(prefix=quote(name, safe="") + '.', suffix=override_filename_ext_in_uri) os.close(fd)
os.close(fd) # noinspection PyBroadException
# noinspection PyBroadException try:
try: with open(local_filename, "wt") as f:
with open(local_filename, 'wt') as f: f.write(artifact_object)
f.write(artifact_object) except Exception:
except Exception: # cleanup and raise exception
# cleanup and raise exception os.unlink(local_filename)
os.unlink(local_filename) raise
raise
elif artifact_object is None or (isinstance(artifact_object, str) and artifact_object == ""): elif artifact_object is None or (isinstance(artifact_object, str) and artifact_object == ""):
artifact_type = '' artifact_type = ''
store_as_pickle = False store_as_pickle = True
elif auto_pickle: elif auto_pickle:
# revert to pickling the object # revert to pickling the object
store_as_pickle = True store_as_pickle = True

View File

@ -369,13 +369,6 @@ class StorageHelper(object):
self._container = self._driver.get_container(container_name=self._base_url) self._container = self._driver.get_container(container_name=self._base_url)
else: # elif self._scheme == 'file': else: # elif self._scheme == 'file':
# if this is not a known scheme assume local file # if this is not a known scheme assume local file
# If the scheme is file, use only the path segment, If not, use the entire URL
if self._scheme == "file":
url = parsed.path
url = url.replace("\\", "/")
# url2pathname is specifically intended to operate on (urlparse result).path # url2pathname is specifically intended to operate on (urlparse result).path
# and returns a cross-platform compatible result # and returns a cross-platform compatible result
url = parsed.path url = parsed.path