Skip to content

Commit 74da1c5

Browse files
authored
SNOW-270946 Progress percentage computation to handle the case when file size is zero (#628)
1 parent 23d8207 commit 74da1c5

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

src/snowflake/connector/file_transfer_agent.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,12 @@ def _update_progress(
171171
return progress == 1.0
172172

173173

174-
class SnowflakeProgressPercentage:
174+
def percent(seen_so_far: int, size: float) -> float:
175+
return 1.0 if seen_so_far >= size or size <= 0\
176+
else float(seen_so_far / size)
177+
178+
179+
class SnowflakeProgressPercentage():
175180
"""Built-in Progress bar for PUT commands."""
176181

177182
def __init__(
@@ -208,7 +213,7 @@ def __call__(self, bytes_amount: int):
208213
with self._lock:
209214
if self._output_stream:
210215
self._seen_so_far += bytes_amount
211-
percentage = float(self._seen_so_far / self._size)
216+
percentage = percent(self._seen_so_far, self._size)
212217
if not self._done:
213218
self._done = _update_progress(
214219
self._filename, self._start_time,
@@ -234,7 +239,7 @@ def __call__(self, current: int):
234239
with self._lock:
235240
if self._output_stream:
236241
self._seen_so_far = current
237-
percentage = float(self._seen_so_far / self._size)
242+
percentage = percent(self._seen_so_far, self._size)
238243
if not self._done:
239244
self._done = _update_progress(
240245
self._filename, self._start_time,

test/unit/test_put_get.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111

1212
from snowflake.connector.compat import IS_WINDOWS
1313
from snowflake.connector.errors import Error
14-
from snowflake.connector.file_transfer_agent import SnowflakeFileTransferAgent
14+
from snowflake.connector.file_transfer_agent import (
15+
SnowflakeAzureProgressPercentage,
16+
SnowflakeFileTransferAgent,
17+
SnowflakeS3ProgressPercentage,
18+
percent,
19+
)
1520

1621

1722
@pytest.mark.skipif(IS_WINDOWS, reason='permission model is different')
@@ -74,3 +79,18 @@ def test_put_error(tmpdir):
7479
sf_file_transfer_agent.result()
7580

7681
chmod(file1, 0o700)
82+
83+
84+
def test_percentage(tmp_path):
85+
"""Tests for ProgressPercentage classes."""
86+
assert 1.0 == percent(0, 0)
87+
assert 1.0 == percent(20, 0)
88+
assert 1.0 == percent(40, 20)
89+
assert 0.5 == percent(14, 28)
90+
91+
file_path = tmp_path / 'zero_file1'
92+
file_path.touch()
93+
func_callback = SnowflakeS3ProgressPercentage(str(file_path), 0)
94+
func_callback(1)
95+
func_callback = SnowflakeAzureProgressPercentage(str(file_path), 0)
96+
func_callback(1)

0 commit comments

Comments
 (0)