Skip to content

Commit 4f58c35

Browse files
SK-2838: use SDK logger for deprecation warnings instead of Python warnings module (#248)
1 parent c12dfd5 commit 4f58c35

8 files changed

Lines changed: 100 additions & 79 deletions

File tree

README.md

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -410,21 +410,36 @@ Refer to [Query your data](https://docs.skyflow.com/query-data/) and [Execute Qu
410410

411411
### Upload File
412412

413-
Upload files to a Skyflow vault using the `upload_file` method. Create a file upload request with the `FileUploadRequest` class, which accepts parameters such as the table name, column name, and Skyflow ID.
413+
Upload files to a Skyflow vault using the `upload_file` method. Create a file upload request with the `FileUploadRequest` class.
414+
415+
**Upload a file to an existing record:**
414416

415417
```python
416418
from skyflow.vault.data import FileUploadRequest
417419

418420
# Open the file in binary read mode
419421
with open('path/to/file.pdf', 'rb') as file_obj:
420422
upload_request = FileUploadRequest(
421-
table='documents', # Table name
422-
column_name='attachment', # Column name to store file
423-
skyflow_id='<SKYFLOW_ID>', # Skyflow ID of the record
424-
file_object=file_obj # Pass file object
423+
table='<TABLE_NAME>',
424+
column_name='<COLUMN_NAME>',
425+
skyflow_id='<SKYFLOW_ID>',
426+
file_object=file_obj
427+
)
428+
429+
response = skyflow_client.vault('<VAULT_ID>').upload_file(upload_request)
430+
print('File upload:', response)
431+
```
432+
433+
**Upload a file and create a new record (omit `skyflow_id`):**
434+
435+
```python
436+
with open('path/to/file.pdf', 'rb') as file_obj:
437+
upload_request = FileUploadRequest(
438+
table='documents',
439+
column_name='attachment',
440+
file_object=file_obj
425441
)
426-
427-
# Perform File Upload
442+
428443
response = skyflow_client.vault('<VAULT_ID>').upload_file(upload_request)
429444
print('File upload:', response)
430445
```

samples/vault_api/upload_file.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66

77
"""
88
* Skyflow File Upload Example
9-
*
9+
*
1010
* This example demonstrates how to:
1111
* 1. Configure Skyflow client credentials
1212
* 2. Set up vault configuration
13-
* 3. Create a file upload request
14-
* 4. Handle response and errors
13+
* 3. Upload a file to an existing record (with skyflow_id)
14+
* 4. Upload a file and create a new record (without skyflow_id)
15+
* 5. Handle response and errors
16+
*
17+
* Note: All FileUploadRequest parameters must be
18+
* passed as keyword arguments.
1519
"""
1620

1721
def perform_file_upload():
@@ -35,8 +39,8 @@ def perform_file_upload():
3539

3640
# Step 2: Configure Vault
3741
primary_vault_config = {
38-
'vault_id': '<YOUR_VAULT_ID1>',
39-
'cluster_id': '<YOUR_CLUSTER_ID1>',
42+
'vault_id': '<YOUR_VAULT_ID>',
43+
'cluster_id': '<YOUR_CLUSTER_ID>',
4044
'env': Env.PROD,
4145
'credentials': credentials
4246
}
@@ -50,20 +54,28 @@ def perform_file_upload():
5054
.build()
5155
)
5256

53-
# Step 4: Prepare File Upload Data
57+
# Step 4a: Upload a file to an existing record
5458
with open('<PATH_TO_FILE>', 'rb') as file_obj:
55-
file_upload_request = FileUploadRequest(
56-
table='<TABLE_NAME>', # Table to upload file to
57-
column_name='<COLUMN_NAME>', # Column to upload file into
58-
file_object=file_obj, # Pass file object
59-
skyflow_id='<SKYFLOW_ID>' # Record ID to associate the file with
59+
upload_request = FileUploadRequest(
60+
table='<TABLE_NAME>',
61+
column_name='<COLUMN_NAME>',
62+
skyflow_id='<SKYFLOW_ID>',
63+
file_object=file_obj
6064
)
6165

62-
# Step 5: Perform File Upload
63-
response = skyflow_client.vault('<VAULT_ID>').upload_file(file_upload_request)
66+
response = skyflow_client.vault('<YOUR_VAULT_ID>').upload_file(upload_request)
67+
print('File upload to existing record:', response)
6468

65-
# Handle Successful Response
66-
print('File upload successful: ', response)
69+
# Step 4b: Upload a file and create a new record (omit skyflow_id)
70+
with open('<PATH_TO_FILE>', 'rb') as file_obj:
71+
upload_request = FileUploadRequest(
72+
table='<TABLE_NAME>',
73+
column_name='<COLUMN_NAME>',
74+
file_object=file_obj
75+
)
76+
77+
response = skyflow_client.vault('<YOUR_VAULT_ID>').upload_file(upload_request)
78+
print('File upload with new record:', response)
6779

6880
except SkyflowError as error:
6981
print('Skyflow Specific Error: ', {

skyflow/client/skyflow.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import warnings
21
from collections import OrderedDict
3-
from typing_extensions import deprecated
42
from skyflow import LogLevel
53
from skyflow.error import SkyflowError
64
from skyflow.utils import SkyflowMessages
7-
from skyflow.utils.logger import log_info, Logger
5+
from skyflow.utils.logger import log_info, log_warn, set_active_log_level, Logger
86
from skyflow.utils.constants import OptionField
97
from skyflow.utils.validations import validate_vault_config, validate_connection_config, validate_update_vault_config, \
108
validate_update_connection_config, validate_credentials, validate_log_level
@@ -61,13 +59,9 @@ def set_log_level(self, log_level):
6159
self.__builder._Builder__set_log_level(log_level)
6260
return self
6361

64-
@deprecated("[DEPRECATED] Use set_log_level() instead.")
6562
def update_log_level(self, log_level):
66-
warnings.warn(
67-
SkyflowMessages.Warning.UPDATE_LOG_LEVEL_DEPRECATED.value,
68-
DeprecationWarning,
69-
stacklevel=2,
70-
)
63+
""".. deprecated:: Use set_log_level() instead. Will be removed in a future release."""
64+
log_warn(SkyflowMessages.Warning.UPDATE_LOG_LEVEL_DEPRECATED.value)
7165
return self.set_log_level(log_level)
7266

7367
def get_log_level(self):
@@ -227,6 +221,7 @@ def __set_log_level(self, log_level):
227221
validate_log_level(self.__logger, log_level)
228222
self.__log_level = log_level
229223
self.__logger.set_log_level(log_level)
224+
set_active_log_level(log_level)
230225
self.__update_vault_client_logger(log_level, self.__logger)
231226
log_info(SkyflowMessages.Info.LOGGER_SETUP_DONE.value, self.__logger)
232227
log_info(SkyflowMessages.Info.CURRENT_LOG_LEVEL.value.format(self.__log_level), self.__logger)
@@ -243,6 +238,7 @@ def __add_skyflow_credentials(self, credentials):
243238
def build(self):
244239
validate_log_level(self.__logger, self.__log_level)
245240
self.__logger.set_log_level(self.__log_level)
241+
set_active_log_level(self.__log_level)
246242

247243
for config in self.__vault_list:
248244
self.__add_vault_config(config)

skyflow/utils/_skyflow_messages.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
error_prefix = f"Skyflow Python SDK {SDK_VERSION}"
66
INFO = "INFO"
7+
WARN = "WARN"
78
ERROR = "ERROR"
89

910
class SkyflowMessages:
@@ -417,11 +418,11 @@ class HttpStatus(Enum):
417418

418419
class Warning(Enum):
419420
UPDATE_LOG_LEVEL_DEPRECATED = (
420-
"[DEPRECATED] Skyflow.update_log_level() is deprecated. "
421-
"Use Skyflow.set_log_level() instead — identical behavior."
421+
f"{WARN}: [{error_prefix}] Skyflow.update_log_level() is deprecated. "
422+
"Use Skyflow.set_log_level() instead."
422423
)
423424
FILE_UPLOAD_REQUEST_ARG_ORDER_DEPRECATED = (
424-
"[DEPRECATED] FileUploadRequest: argument order changed. "
425+
f"{WARN}: [{error_prefix}] FileUploadRequest: argument order changed. "
425426
"Old positional order: (table, skyflow_id, column_name). "
426427
"New order: FileUploadRequest(table, column_name=..., skyflow_id=...)."
427428
)

skyflow/utils/logger/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from ._logger import Logger
2-
from ._log_helpers import log_error, log_info, log_error_log
2+
from ._log_helpers import log_error, log_info, log_warn, log_error_log, set_active_log_level

skyflow/utils/logger/_log_helpers.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22
from . import Logger
33
from ..constants import ResponseField
44

5+
_active_log_level = LogLevel.ERROR
6+
7+
8+
def set_active_log_level(level):
9+
global _active_log_level
10+
_active_log_level = level
11+
512

613
def log_info(message, logger = None):
714
if not logger:
815
logger = Logger(LogLevel.INFO)
916

1017
logger.info(message)
1118

19+
def log_warn(message, logger=None):
20+
if not logger:
21+
logger = Logger(_active_log_level)
22+
logger.warn(message)
23+
1224
def log_error_log(message, logger=None):
1325
if not logger:
1426
logger = Logger(LogLevel.ERROR)

skyflow/vault/data/_file_upload_request.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import warnings
21
from typing import BinaryIO, Optional
32

43
from skyflow.utils import SkyflowMessages
4+
from skyflow.utils.logger import log_warn
55

66

77
class FileUploadRequest:
@@ -15,12 +15,7 @@ def __init__(self,
1515
file_object: Optional[BinaryIO] = None,
1616
file_name: Optional[str] = None):
1717
if args:
18-
warnings.warn(
19-
SkyflowMessages.Warning.FILE_UPLOAD_REQUEST_ARG_ORDER_DEPRECATED.value,
20-
DeprecationWarning,
21-
stacklevel=2,
22-
)
23-
# Old positional order was: (table, skyflow_id, column_name, ...)
18+
log_warn(SkyflowMessages.Warning.FILE_UPLOAD_REQUEST_ARG_ORDER_DEPRECATED.value)
2419
skyflow_id = args[0] if args else skyflow_id
2520
column_name = args[1] if len(args) > 1 else column_name
2621
self.table = table

tests/client/test_skyflow.py

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import unittest
2-
import warnings
32
from unittest.mock import patch, Mock
43

54
from skyflow import LogLevel, Env
@@ -427,68 +426,59 @@ def _build_client(self):
427426

428427
def test_update_log_level_emits_deprecation_warning(self):
429428
client = self._build_client()
430-
with warnings.catch_warnings(record=True) as caught:
431-
warnings.simplefilter("always")
429+
with patch('skyflow.client.skyflow.log_warn') as mock_warn:
432430
client.update_log_level(LogLevel.INFO)
433-
deprecation_warnings = [w for w in caught if issubclass(w.category, DeprecationWarning)]
434-
self.assertGreaterEqual(len(deprecation_warnings), 1)
435-
self.assertTrue(any("set_log_level" in str(w.message) for w in deprecation_warnings))
436-
437-
def test_update_log_level_warning_points_at_caller(self):
438-
client = self._build_client()
439-
with warnings.catch_warnings(record=True) as caught:
440-
warnings.simplefilter("always")
441-
client.update_log_level(LogLevel.INFO)
442-
self.assertEqual(caught[0].filename, __file__)
431+
mock_warn.assert_called_once()
432+
self.assertIn("set_log_level", mock_warn.call_args[0][0])
443433

444434
def test_update_log_level_delegates_to_set_log_level(self):
445435
client = self._build_client()
446-
with warnings.catch_warnings(record=True):
447-
warnings.simplefilter("always")
448-
client.update_log_level(LogLevel.INFO)
436+
client.update_log_level(LogLevel.INFO)
449437
self.assertEqual(client.get_log_level(), LogLevel.INFO)
450438

451439

452440
class TestFileUploadRequestDeprecation(unittest.TestCase):
453441
def test_keyword_args_no_warning(self):
454-
with warnings.catch_warnings(record=True) as caught:
455-
warnings.simplefilter("always")
442+
with patch('skyflow.vault.data._file_upload_request.log_warn') as mock_warn:
456443
req = FileUploadRequest(
457444
table="table",
458445
column_name="col",
459446
skyflow_id="sky123",
460447
)
461-
self.assertEqual(len(caught), 0)
448+
mock_warn.assert_not_called()
462449
self.assertEqual(req.table, "table")
463450
self.assertEqual(req.column_name, "col")
464451
self.assertEqual(req.skyflow_id, "sky123")
465452

453+
def test_only_table_positional_no_warning(self):
454+
with patch('skyflow.vault.data._file_upload_request.log_warn') as mock_warn:
455+
req = FileUploadRequest("table", column_name="col", skyflow_id="sky123")
456+
mock_warn.assert_not_called()
457+
self.assertEqual(req.table, "table")
458+
466459
def test_old_positional_order_emits_deprecation_warning(self):
467-
with warnings.catch_warnings(record=True) as caught:
468-
warnings.simplefilter("always")
460+
with patch('skyflow.vault.data._file_upload_request.log_warn') as mock_warn:
469461
req = FileUploadRequest("table", "sky123", "col")
470-
self.assertEqual(len(caught), 1)
471-
self.assertTrue(issubclass(caught[0].category, DeprecationWarning))
472-
self.assertIn("FileUploadRequest", str(caught[0].message))
462+
mock_warn.assert_called_once()
463+
self.assertIn("FileUploadRequest", mock_warn.call_args[0][0])
473464

474465
def test_old_positional_order_remaps_args_correctly(self):
475-
with warnings.catch_warnings(record=True):
476-
warnings.simplefilter("always")
477-
req = FileUploadRequest("table", "sky123", "col")
466+
req = FileUploadRequest("table", "sky123", "col")
478467
self.assertEqual(req.skyflow_id, "sky123")
479468
self.assertEqual(req.column_name, "col")
480469

481-
def test_old_positional_order_warning_points_at_caller(self):
482-
with warnings.catch_warnings(record=True) as caught:
483-
warnings.simplefilter("always")
484-
FileUploadRequest("table", "sky123", "col")
485-
self.assertEqual(caught[0].filename, __file__)
486-
487470
def test_single_positional_arg_emits_warning_and_sets_skyflow_id(self):
488-
with warnings.catch_warnings(record=True) as caught:
489-
warnings.simplefilter("always")
471+
with patch('skyflow.vault.data._file_upload_request.log_warn') as mock_warn:
490472
req = FileUploadRequest("table", "sky123")
491-
self.assertEqual(len(caught), 1)
492-
self.assertTrue(issubclass(caught[0].category, DeprecationWarning))
473+
mock_warn.assert_called_once()
493474
self.assertEqual(req.skyflow_id, "sky123")
494475
self.assertIsNone(req.column_name)
476+
477+
def test_optional_fields_default_to_none(self):
478+
req = FileUploadRequest(table="table")
479+
self.assertIsNone(req.skyflow_id)
480+
self.assertIsNone(req.column_name)
481+
self.assertIsNone(req.file_path)
482+
self.assertIsNone(req.base64)
483+
self.assertIsNone(req.file_object)
484+
self.assertIsNone(req.file_name)

0 commit comments

Comments
 (0)