From 955bacc1305c2667c5d11b3861b6c5fd7a185059 Mon Sep 17 00:00:00 2001 From: "Bala.FA" Date: Wed, 21 Oct 2020 11:18:00 +0530 Subject: [PATCH] Refactor XML handling of _complete_multipart_upload() API --- minio/api.py | 11 ++++------- minio/datatypes.py | 45 ++++++++++++++++++++++++++++++++++++++++++++ minio/definitions.py | 24 ----------------------- minio/parsers.py | 20 +------------------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/minio/api.py b/minio/api.py index 3fe64d04c..3748fa68e 100644 --- a/minio/api.py +++ b/minio/api.py @@ -45,7 +45,8 @@ from . import __title__, __version__ from .commonconfig import Tags from .credentials import StaticProvider -from .datatypes import ListAllMyBucketsResult, Object, parse_list_objects +from .datatypes import (CompleteMultipartUploadResult, ListAllMyBucketsResult, + Object, parse_list_objects) from .definitions import BaseURL, ObjectWriteResult, Part from .deleteobjects import DeleteError, DeleteRequest, DeleteResult from .error import InvalidResponseError, S3Error, ServerError @@ -61,7 +62,6 @@ from .parsers import (parse_error_response, parse_list_multipart_uploads, parse_list_parts, - parse_multipart_upload_result, parse_new_multipart_upload) from .replicationconfig import ReplicationConfig from .select import SelectObjectReader @@ -1189,10 +1189,7 @@ def _complete_multipart_upload( }, query_params={'uploadId': upload_id}, ) - return ( - parse_multipart_upload_result(response.data), - response.getheader("x-amz-version-id"), - ) + return CompleteMultipartUploadResult(response) def _create_multipart_upload(self, bucket_name, object_name, headers): """Execute CreateMultipartUpload S3 API.""" @@ -1358,7 +1355,7 @@ def put_object( # pylint: disable=too-many-branches,too-many-statements result = self._complete_multipart_upload( bucket_name, object_name, upload_id, parts, ) - return result[0].etag, result[1] + return result.etag, result.version_id except Exception as exc: if upload_id: self._abort_multipart_upload( diff --git a/minio/datatypes.py b/minio/datatypes.py index 3b5d7ed2a..d5abb60cf 100644 --- a/minio/datatypes.py +++ b/minio/datatypes.py @@ -233,3 +233,48 @@ def parse_list_objects(response, bucket_name): if continuation_token is None and is_truncated: continuation_token = marker return objects, is_truncated, continuation_token, version_id_marker + + +class CompleteMultipartUploadResult: + """CompleteMultipartUpload API result.""" + + def __init__(self, response): + element = ET.fromstring(response.data.decode()) + self._bucket_name = findtext(element, "Bucket") + self._object_name = findtext(element, "Key") + self._location = findtext(element, "Location") + self._etag = findtext(element, "ETag") + if self._etag: + self._etag = self._etag.replace('"', "") + self._version_id = response.getheader("x-amz-version-id") + self._http_headers = response.getheaders() + + @property + def bucket_name(self): + """Get bucket name.""" + return self._bucket_name + + @property + def object_name(self): + """Get object name.""" + return self._object_name + + @property + def location(self): + """Get location.""" + return self._location + + @property + def etag(self): + """Get etag.""" + return self._etag + + @property + def version_id(self): + """Get version ID.""" + return self._version_id + + @property + def http_headers(self): + """Get HTTP headers.""" + return self._http_headers diff --git a/minio/definitions.py b/minio/definitions.py index 06753a4a0..ace25ff13 100644 --- a/minio/definitions.py +++ b/minio/definitions.py @@ -257,30 +257,6 @@ def build( return url -class MultipartUploadResult: - """ - A completed multipart upload metadata - :class:`MultipartUploadResult `. - - :param bucket_name: Bucket name. - :param object_name: Object name. - :param location: Object uploaded location. - :param etag: Object final etag. - """ - - def __init__(self, bucket_name, object_name, location, etag): - self.bucket_name = bucket_name - self.object_name = object_name - self.location = location - self.etag = etag - - def __str__(self): - string_format = ("") - return string_format.format(self.bucket_name, self.object_name, - self.location, self.etag) - - class Upload: """ Upload information of a multipart upload.""" diff --git a/minio/parsers.py b/minio/parsers.py index 6fb40efad..d2f789891 100644 --- a/minio/parsers.py +++ b/minio/parsers.py @@ -30,8 +30,7 @@ from xml.etree import ElementTree from xml.etree.ElementTree import ParseError -from .definitions import (ListMultipartUploadsResult, ListPartsResult, - MultipartUploadResult) +from .definitions import ListMultipartUploadsResult, ListPartsResult from .error import S3Error from .helpers import strptime_rfc3339 @@ -168,23 +167,6 @@ def _get_text(name): ) -def parse_multipart_upload_result(data): - """ - Parser for complete multipart upload response. - - :param data: Response data for complete multipart upload. - :return: :class:`MultipartUploadResult `. - """ - root = S3Element.fromstring('CompleteMultipartUploadResult', data) - - return MultipartUploadResult( - root.get_child_text('Bucket'), - root.get_child_text('Key'), - root.get_child_text('Location'), - root.get_etag_elem() - ) - - def parse_new_multipart_upload(data): """ Parser for new multipart upload response.