Skip to content

SK-2142 return None on empty error response #186

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: release/25.6.2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions skyflow/utils/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,6 @@ def get_metrics():
}
return details_dic


def parse_insert_response(api_response, continue_on_error):
# Retrieve the headers and data from the API response
api_response_headers = api_response.headers
Expand Down Expand Up @@ -244,8 +243,7 @@ def parse_insert_response(api_response, continue_on_error):
errors.append(error)

insert_response.inserted_fields = inserted_fields
insert_response.errors = errors

insert_response.errors = errors if len(errors) > 0 else None
else:
for record in api_response_data.records:
field_data = {
Expand All @@ -257,6 +255,7 @@ def parse_insert_response(api_response, continue_on_error):

inserted_fields.append(field_data)
insert_response.inserted_fields = inserted_fields
insert_response.errors = None

return insert_response

Expand All @@ -275,21 +274,17 @@ def parse_delete_response(api_response: V1BulkDeleteRecordResponse):
delete_response = DeleteResponse()
deleted_ids = api_response.record_id_response
delete_response.deleted_ids = deleted_ids
delete_response.errors = []
delete_response.errors = None
return delete_response


def parse_get_response(api_response: V1BulkGetRecordResponse):
get_response = GetResponse()
data = []
errors = []
for record in api_response.records:
field_data = {field: value for field, value in record.fields.items()}
data.append(field_data)

get_response.data = data
get_response.errors = errors

return get_response

def parse_detokenize_response(api_response: HttpResponse[V1DetokenizeResponse]):
Expand Down Expand Up @@ -320,7 +315,7 @@ def parse_detokenize_response(api_response: HttpResponse[V1DetokenizeResponse]):
errors = errors
detokenize_response = DetokenizeResponse()
detokenize_response.detokenized_fields = detokenized_fields
detokenize_response.errors = errors
detokenize_response.errors = errors if len(errors) > 0 else None

return detokenize_response

Expand Down
2 changes: 1 addition & 1 deletion skyflow/vault/controller/_detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def output_to_dict_list(output):
entities=entities,
run_id=run_id_val,
status=status_val,
errors=[]
errors=None
)

def __get_token_format(self, request):
Expand Down
2 changes: 0 additions & 2 deletions skyflow/vault/data/_insert_response.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
class InsertResponse:
def __init__(self, inserted_fields = None, errors=None):
if errors is None:
errors = list()
self.inserted_fields = inserted_fields
self.errors = errors

Expand Down
2 changes: 1 addition & 1 deletion skyflow/vault/data/_query_response.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class QueryResponse:
def __init__(self):
self.fields = []
self.errors = []
self.errors = None

def __repr__(self):
return f"QueryResponse(fields={self.fields}, errors={self.errors})"
Expand Down
2 changes: 1 addition & 1 deletion skyflow/vault/data/_update_response.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class UpdateResponse:
def __init__(self, updated_field = None, errors=None):
self.updated_field = updated_field
self.errors = errors if errors is not None else []
self.errors = errors

def __repr__(self):
return f"UpdateResponse(updated_field={self.updated_field}, errors={self.errors})"
Expand Down
2 changes: 1 addition & 1 deletion skyflow/vault/detect/_deidentify_file_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def __init__(
entities: list = None, # list of dicts with keys 'file' and 'extension'
run_id: str = None,
status: str = None,
errors: list = [],
errors: list = None,
):
self.file_base64 = file_base64
self.file = File(file) if file else None
Expand Down
6 changes: 3 additions & 3 deletions tests/utils/test__utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ def test_parse_insert_response_continue_on_error_false(self):
]
self.assertEqual(result.inserted_fields, expected_inserted_fields)

self.assertEqual(result.errors, [])
self.assertEqual(result.errors, None)

def test_parse_update_record_response(self):
api_response = Mock()
Expand All @@ -291,7 +291,7 @@ def test_parse_delete_response_successful(self):
expected_deleted_ids = ["id_1", "id_2", "id_3"]
self.assertEqual(result.deleted_ids, expected_deleted_ids)

self.assertEqual(result.errors, [])
self.assertEqual(result.errors, None)

def test_parse_get_response_successful(self):
mock_api_response = Mock()
Expand All @@ -310,7 +310,7 @@ def test_parse_get_response_successful(self):
]
self.assertEqual(result.data, expected_data)

self.assertEqual(result.errors, [])
# self.assertEqual(result.errors, None)

def test_parse_detokenize_response_with_mixed_records(self):
mock_api_response = Mock()
Expand Down
21 changes: 10 additions & 11 deletions tests/vault/controller/test__detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def test_deidentify_file_txt_success(self, mock_open, mock_basename, mock_base64
word_count=1, char_count=1, size_in_kb=1,
duration_in_seconds=None, page_count=None,
slide_count=None, entities=[], run_id="runid123",
status="SUCCESS", errors=[])) as mock_parse:
status="SUCCESS", errors=None)) as mock_parse:
result = self.detect.deidentify_file(req)

mock_validate.assert_called_once()
Expand All @@ -184,7 +184,7 @@ def test_deidentify_file_txt_success(self, mock_open, mock_basename, mock_base64
self.assertIsNone(result.page_count)
self.assertIsNone(result.slide_count)
self.assertEqual(result.entities, [])
self.assertEqual(result.errors, [])
self.assertEqual(result.errors, None)

@patch("skyflow.vault.controller._detect.validate_deidentify_file_request")
@patch("skyflow.vault.controller._detect.base64")
Expand Down Expand Up @@ -222,7 +222,7 @@ def test_deidentify_file_audio_success(self, mock_base64, mock_validate):
word_count=1, char_count=1, size_in_kb=1,
duration_in_seconds=1, page_count=None,
slide_count=None, entities=[], run_id="runid456",
status="SUCCESS", errors=[])) as mock_parse:
status="SUCCESS", errors=None)) as mock_parse:
result = self.detect.deidentify_file(req)
mock_validate.assert_called_once()
files_api.deidentify_audio.assert_called_once()
Expand Down Expand Up @@ -260,12 +260,11 @@ def test_get_detect_run_success(self, mock_validate):
response.word_character_count = Mock(word_count=1, character_count=1)
files_api.get_run.return_value = response
with patch.object(self.detect, "_Detect__parse_deidentify_file_response",
return_value=DeidentifyFileResponse(
file="file", type="txt", extension="txt", word_count=1,
char_count=1, size_in_kb=1, duration_in_seconds=None,
page_count=None, slide_count=None, entities=[],
run_id="runid789", status="SUCCESS",
errors=[])) as mock_parse:
return_value=DeidentifyFileResponse(file="file", type="txt", extension="txt", word_count=1,
char_count=1, size_in_kb=1, duration_in_seconds=None,
page_count=None, slide_count=None, entities=[],
run_id="runid789", status="SUCCESS",
errors=None)) as mock_parse:
result = self.detect.get_detect_run(req)
mock_validate.assert_called_once()
files_api.get_run.assert_called_once()
Expand Down Expand Up @@ -678,7 +677,7 @@ def test_deidentify_file_using_file_path(self, mock_open, mock_basename, mock_ba
entities=[],
run_id="runid123",
status="SUCCESS",
errors=[]
errors=None
)) as mock_parse:

result = self.detect.deidentify_file(req)
Expand Down Expand Up @@ -709,4 +708,4 @@ def test_deidentify_file_using_file_path(self, mock_open, mock_basename, mock_ba
self.assertIsNone(result.page_count)
self.assertIsNone(result.slide_count)
self.assertEqual(result.entities, [])
self.assertEqual(result.errors, [])
self.assertEqual(result.errors, None)
24 changes: 12 additions & 12 deletions tests/vault/controller/test__vault.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def test_insert_with_continue_on_error_false(self, mock_parse_response, mock_val

# Assert that the result matches the expected InsertResponse
self.assertEqual(result.inserted_fields, expected_inserted_fields)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_insert_request")
def test_insert_handles_generic_error(self, mock_validate):
Expand Down Expand Up @@ -181,7 +181,7 @@ def test_insert_with_continue_on_error_false_when_tokens_are_not_none(self, mock

# Assert that the result matches the expected InsertResponse
self.assertEqual(result.inserted_fields, expected_inserted_fields)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_update_request")
@patch("skyflow.vault.controller._vault.parse_update_record_response")
Expand Down Expand Up @@ -223,7 +223,7 @@ def test_update_successful(self, mock_parse_response, mock_validate):

# Check that the result matches the expected UpdateResponse
self.assertEqual(result.updated_field, expected_updated_field)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_update_request")
def test_update_handles_generic_error(self, mock_validate):
Expand Down Expand Up @@ -257,7 +257,7 @@ def test_delete_successful(self, mock_parse_response, mock_validate):

# Expected parsed response
expected_deleted_ids = ["12345", "67890"]
expected_response = DeleteResponse(deleted_ids=expected_deleted_ids, errors=[])
expected_response = DeleteResponse(deleted_ids=expected_deleted_ids, errors=None)

# Set the return value for the parse response
mock_parse_response.return_value = expected_response
Expand All @@ -273,7 +273,7 @@ def test_delete_successful(self, mock_parse_response, mock_validate):

# Check that the result matches the expected DeleteResponse
self.assertEqual(result.deleted_ids, expected_deleted_ids)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_delete_request")
def test_delete_handles_generic_exception(self, mock_validate):
Expand Down Expand Up @@ -330,7 +330,7 @@ def test_get_successful(self, mock_parse_response, mock_validate):
{"field1": "value1", "field2": "value2"},
{"field1": "value3", "field2": "value4"}
]
expected_response = GetResponse(data=expected_data, errors=[])
expected_response = GetResponse(data=expected_data, errors=None)

# Set the return value for parse_get_response
mock_parse_response.return_value = expected_response
Expand All @@ -346,7 +346,7 @@ def test_get_successful(self, mock_parse_response, mock_validate):

# Check that the result matches the expected GetResponse
self.assertEqual(result.data, expected_data)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_get_request")
@patch("skyflow.vault.controller._vault.parse_get_response")
Expand Down Expand Up @@ -381,7 +381,7 @@ def test_get_successful_with_column_values(self, mock_parse_response, mock_valid
{"field1": "value1", "field2": "value2"},
{"field1": "value3", "field2": "value4"}
]
expected_response = GetResponse(data=expected_data, errors=[])
expected_response = GetResponse(data=expected_data, errors=None)

# Set the return value for parse_get_response
mock_parse_response.return_value = expected_response
Expand All @@ -397,7 +397,7 @@ def test_get_successful_with_column_values(self, mock_parse_response, mock_valid

# Check that the result matches the expected GetResponse
self.assertEqual(result.data, expected_data)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_get_request")
def test_get_handles_generic_error(self, mock_validate):
Expand Down Expand Up @@ -446,7 +446,7 @@ def test_query_successful(self, mock_parse_response, mock_validate):

# Check that the result matches the expected QueryResponse
self.assertEqual(result.fields, expected_fields)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_query_request")
def test_query_handles_generic_error(self, mock_validate):
Expand Down Expand Up @@ -495,7 +495,7 @@ def test_detokenize_successful(self, mock_parse_response, mock_validate):
{"token": "token1", "value": "value1", "type": "STRING"},
{"token": "token2", "value": "value2", "type": "STRING"}
]
expected_response = DetokenizeResponse(detokenized_fields=expected_fields, errors=[])
expected_response = DetokenizeResponse(detokenized_fields=expected_fields, errors=None)

# Set the return value for parse_detokenize_response
mock_parse_response.return_value = expected_response
Expand All @@ -511,7 +511,7 @@ def test_detokenize_successful(self, mock_parse_response, mock_validate):

# Check that the result matches the expected DetokenizeResponse
self.assertEqual(result.detokenized_fields, expected_fields)
self.assertEqual(result.errors, []) # No errors expected
self.assertEqual(result.errors, None) # No errors expected

@patch("skyflow.vault.controller._vault.validate_detokenize_request")
def test_detokenize_handles_generic_error(self, mock_validate):
Expand Down
Loading