katana_public_api_client.utils¶
katana_public_api_client.utils
¶
Utility functions for working with Katana API responses.
This module provides convenient helpers for unwrapping API responses, handling errors, extracting data, and formatting display values.
Classes¶
APIError(message, status_code, error_response=None)
¶
Bases: Exception
Base exception for API errors.
Parameters:
-
message(str) –Human-readable error message
-
status_code(int) –HTTP status code
-
error_response(ErrorResponse | DetailedErrorResponse | None, default:None) –The error response object from the API
Source code in katana_public_api_client/utils.py
Functions¶
AuthenticationError(message, status_code, error_response=None)
¶
Bases: APIError
Raised when authentication fails (401).
Source code in katana_public_api_client/utils.py
RateLimitError(message, status_code, error_response=None)
¶
Bases: APIError
Raised when rate limit is exceeded (429).
Source code in katana_public_api_client/utils.py
ServerError(message, status_code, error_response=None)
¶
Bases: APIError
Raised when server error occurs (5xx).
Source code in katana_public_api_client/utils.py
ValidationError(message, status_code, error_response=None)
¶
Bases: APIError
Raised when request validation fails (422).
Parameters:
-
message(str) –Human-readable error message
-
status_code(int) –HTTP status code (should be 422)
-
error_response(DetailedErrorResponse | None, default:None) –The detailed error response with validation details
Source code in katana_public_api_client/utils.py
Functions¶
__str__()
¶
Format validation error with Ajv-keyword-specific details.
Each detail's typed subtype is dispatched into a keyword-specific
renderer that consults info.* for keyword metadata (limit,
pattern, allowed values, etc.). Unknown keywords route to
GenericValidationError and render through a fallback that
surfaces path/code/message plus any info captured
in additional_properties.
Source code in katana_public_api_client/utils.py
Functions¶
get_error_message(response)
¶
Extract error message from an error response.
Parameters:
-
response(Response[T]) –The Response object (typically an error response)
Returns:
-
str | None–Error message string, or None if no error message found
Example
Source code in katana_public_api_client/utils.py
get_variant_display_name(variant)
¶
Build the full variant display name matching Katana UI format.
Format: "{Product/Material Name} / {Config Value 1} / {Config Value 2} / ..."
Example: "Premium 140 / Glossy Black / Large / Type A"
Takes a VariantResponse (the discriminated-union variant schema with
typed product_or_material: Material | Product | Unset). Variants returned
without ?extend=product_or_material have product_or_material UNSET, in
which case the display name falls back to empty string.
Parameters:
-
variant(VariantResponse) –VariantResponse fetched with
?extend=product_or_material.
Returns:
-
str–Formatted variant name with config values, or empty string if no name available.
Example
from katana_public_api_client import KatanaClient
from katana_public_api_client.api.variant import get_all_variants
from katana_public_api_client.models.get_all_variants_extend_item import (
GetAllVariantsExtendItem,
)
from katana_public_api_client.utils import (
get_variant_display_name,
unwrap_data,
)
async with KatanaClient() as client:
response = await get_all_variants.asyncio_detailed(
client=client,
extend=[GetAllVariantsExtendItem.PRODUCT_OR_MATERIAL],
)
for variant in unwrap_data(response):
print(get_variant_display_name(variant))
# e.g. "Premium 140 / Glossy Black / Large / Type A"
Source code in katana_public_api_client/utils.py
handle_response(response, *, on_success=None, on_error=None, raise_on_error=False)
¶
Handle a response with custom success and error handlers.
This function provides a convenient way to handle both success and error cases with custom callbacks.
Parameters:
-
response(Response[T]) –The Response object from an API call
-
on_success(Callable[[T], Any] | None, default:None) –Callback function to call with parsed data on success
-
on_error(Callable[[APIError], Any] | None, default:None) –Callback function to call with APIError on error
-
raise_on_error(bool, default:False) –If True, raise the error even if on_error is provided
Returns:
-
Any–Result of on_success callback, result of on_error callback, or None
Example
def handle_products(product_list):
print(f"Got {len(product_list.data)} products")
return product_list.data
def handle_error(error):
print(f"Error: {error}")
return []
response = await get_all_products.asyncio_detailed(client=client)
products = handle_response(
response, on_success=handle_products, on_error=handle_error
)
Source code in katana_public_api_client/utils.py
is_error(response)
¶
Check if a response was an error (4xx or 5xx status code).
Parameters:
Returns:
-
bool–True if status code is 4xx or 5xx, False otherwise
Source code in katana_public_api_client/utils.py
is_success(response)
¶
Check if a response was successful (2xx status code).
Parameters:
Returns:
-
bool–True if status code is 2xx, False otherwise
Example
Source code in katana_public_api_client/utils.py
unwrap(response, *, raise_on_error=True)
¶
Unwrap a Response object and return the parsed data or raise an error.
This is the main utility function for handling API responses. It automatically raises appropriate exceptions for error responses and returns the parsed data for successful responses.
Parameters:
-
response(Response[T]) –The Response object from an API call
-
raise_on_error(bool, default:True) –If True, raise exceptions on error status codes. If False, return None on errors.
Returns:
-
T | None–The parsed response data
Raises:
-
AuthenticationError–When status is 401
-
ValidationError–When status is 422
-
RateLimitError–When status is 429
-
ServerError–When status is 5xx
-
APIError–For other error status codes
Example
from katana_public_api_client import KatanaClient
from katana_public_api_client.api.product import get_all_products
from katana_public_api_client.utils import unwrap
async with KatanaClient() as client:
response = await get_all_products.asyncio_detailed(client=client)
product_list = unwrap(
response
) # Raises on error, returns parsed data
products = product_list.data # List of Product objects
Source code in katana_public_api_client/utils.py
unwrap_as(response, expected_type, *, raise_on_error=True)
¶
Unwrap a Response and validate the parsed data is of the expected type.
This is a convenience function that combines unwrap() with type validation. It's useful when you expect a specific model type from an API response.
Parameters:
-
response(Response[T]) –The Response object from an API call
-
expected_type(type[ExpectedT]) –The expected type of the parsed response
-
raise_on_error(bool, default:True) –If True, raise exceptions on error status codes. If False, returns None on error instead of raising.
Returns:
-
ExpectedT | None–The parsed response data, typed as ExpectedT (or ExpectedT | None if
-
ExpectedT | None–raise_on_error=False)
Raises:
-
Same exceptions as unwrap(), plus– -
TypeError–If the parsed response is not of the expected type
Example
from katana_public_api_client import KatanaClient
from katana_public_api_client.api.sales_order import get_sales_order
from katana_public_api_client.models import SalesOrder
from katana_public_api_client.utils import unwrap_as
async with KatanaClient() as client:
response = await get_sales_order.asyncio_detailed(
client=client, id=123
)
order = unwrap_as(response, SalesOrder) # Type-safe SalesOrder
print(order.order_no)
Source code in katana_public_api_client/utils.py
unwrap_data(response, *, raise_on_error=True, default=None)
¶
unwrap_data(
response: Response[T],
*,
raise_on_error: Literal[True] = True,
default: None = None
) -> Any
Unwrap a Response and extract the data list from list responses.
This is a convenience function that unwraps the response and extracts
the .data field from list response objects (like ProductListResponse,
WebhookListResponse, etc.).
Parameters:
-
response(Response[T]) –The Response object from an API call
-
raise_on_error(bool, default:True) –If True, raise exceptions on error status codes. If False, return default on errors.
-
default(list[DataT] | None, default:None) –Default value to return if data is not available
Returns:
-
Any | None–List of data objects, or default if not available
Example
from katana_public_api_client import KatanaClient
from katana_public_api_client.api.product import get_all_products
from katana_public_api_client.utils import unwrap_data
async with KatanaClient() as client:
response = await get_all_products.asyncio_detailed(client=client)
products = unwrap_data(response) # Directly get list of Products
for product in products:
print(product.name)