From 356fb679912e8d1f9369c903a8b9b5ea19d0884a Mon Sep 17 00:00:00 2001 From: Chunhui Shi Date: Fri, 26 Feb 2021 23:19:09 -0800 Subject: [PATCH] SNOW-270946 Progress percentage computation to handle the case when file size is zero (#628) --- .../connector/file_transfer_agent.py | 11 +++++++--- test/unit/test_put_get.py | 22 ++++++++++++++++++- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/snowflake/connector/file_transfer_agent.py b/src/snowflake/connector/file_transfer_agent.py index c6a6bc543..8789a79fd 100644 --- a/src/snowflake/connector/file_transfer_agent.py +++ b/src/snowflake/connector/file_transfer_agent.py @@ -171,7 +171,12 @@ def _update_progress( return progress == 1.0 -class SnowflakeProgressPercentage: +def percent(seen_so_far: int, size: float) -> float: + return 1.0 if seen_so_far >= size or size <= 0\ + else float(seen_so_far / size) + + +class SnowflakeProgressPercentage(): """Built-in Progress bar for PUT commands.""" def __init__( @@ -208,7 +213,7 @@ def __call__(self, bytes_amount: int): with self._lock: if self._output_stream: self._seen_so_far += bytes_amount - percentage = float(self._seen_so_far / self._size) + percentage = percent(self._seen_so_far, self._size) if not self._done: self._done = _update_progress( self._filename, self._start_time, @@ -234,7 +239,7 @@ def __call__(self, current: int): with self._lock: if self._output_stream: self._seen_so_far = current - percentage = float(self._seen_so_far / self._size) + percentage = percent(self._seen_so_far, self._size) if not self._done: self._done = _update_progress( self._filename, self._start_time, diff --git a/test/unit/test_put_get.py b/test/unit/test_put_get.py index 7521a32cb..a2e878399 100644 --- a/test/unit/test_put_get.py +++ b/test/unit/test_put_get.py @@ -11,7 +11,12 @@ from snowflake.connector.compat import IS_WINDOWS from snowflake.connector.errors import Error -from snowflake.connector.file_transfer_agent import SnowflakeFileTransferAgent +from snowflake.connector.file_transfer_agent import ( + SnowflakeAzureProgressPercentage, + SnowflakeFileTransferAgent, + SnowflakeS3ProgressPercentage, + percent, +) @pytest.mark.skipif(IS_WINDOWS, reason='permission model is different') @@ -74,3 +79,18 @@ def test_put_error(tmpdir): sf_file_transfer_agent.result() chmod(file1, 0o700) + + +def test_percentage(tmp_path): + """Tests for ProgressPercentage classes.""" + assert 1.0 == percent(0, 0) + assert 1.0 == percent(20, 0) + assert 1.0 == percent(40, 20) + assert 0.5 == percent(14, 28) + + file_path = tmp_path / 'zero_file1' + file_path.touch() + func_callback = SnowflakeS3ProgressPercentage(str(file_path), 0) + func_callback(1) + func_callback = SnowflakeAzureProgressPercentage(str(file_path), 0) + func_callback(1)