katana_public_api_client.helpers.variants¶
katana_public_api_client.helpers.variants
¶
Variant catalog operations.
Classes¶
VariantCache(ttl_seconds=300)
¶
Cache for variant data with multiple access patterns.
Provides: - List of all variants (for iteration/filtering) - Dict by variant ID (O(1) lookup by ID) - Dict by SKU (O(1) lookup by SKU) - TTL-based invalidation
Note: Cache stores Pydantic KatanaVariant models (not attrs models).
Parameters:
-
ttl_seconds(int, default:300) –Time-to-live in seconds. Default 5 minutes.
Source code in katana_public_api_client/helpers/variants.py
Functions¶
clear()
¶
is_valid()
¶
update(variants)
¶
Update cache with new variant list.
Parameters:
-
variants(list[KatanaVariant]) –List of domain variants to cache
Source code in katana_public_api_client/helpers/variants.py
Variants(*args, **kwargs)
¶
Bases: Base
Variant catalog management.
Provides CRUD operations for product variants in the Katana catalog. Includes caching for improved search performance.
Example
async with KatanaClient() as client: ... # CRUD operations ... variants = await client.variants.list() ... variant = await client.variants.get(123) ... new_variant = await client.variants.create({"name": "Large"}) ... ... # Fast repeated searches (uses cache) ... results1 = await client.variants.search("fox") ... results2 = await client.variants.search( ... "fork" ... ) # Instant - uses cached data
Source code in katana_public_api_client/helpers/variants.py
Functions¶
create(variant_data)
async
¶
Create a new variant.
Note: Clears the variant cache after creation.
Parameters:
-
variant_data(CreateVariantRequest) –CreateVariantRequest model with variant details.
Returns:
-
KatanaVariant–Created Variant object.
Example
from katana_public_api_client.models import CreateVariantRequest new_variant = await client.variants.create( ... CreateVariantRequest(name="Large", product_id=123) ... )
Source code in katana_public_api_client/helpers/variants.py
delete(variant_id)
async
¶
Delete a variant.
Note: Clears the variant cache after deletion.
Parameters:
-
variant_id(int) –The variant ID to delete.
Example
await client.variants.delete(123)
Source code in katana_public_api_client/helpers/variants.py
get(variant_id)
async
¶
Get a specific variant by ID.
Parameters:
-
variant_id(int) –The variant ID.
Returns:
-
KatanaVariant–KatanaVariant object.
Example
variant = await client.variants.get(123) print(variant.get_display_name()) print(f"Profit margin: {variant.profit_margin}%")
Source code in katana_public_api_client/helpers/variants.py
list(**filters)
async
¶
List all variants with optional filters.
Parameters:
-
**filters(Any, default:{}) –Filtering parameters.
Returns:
-
list[KatanaVariant]–List of KatanaVariant objects.
Example
variants = await client.variants.list(limit=100) for v in variants: ... print(f"{v.get_display_name()}: {v.profit_margin}%")
Source code in katana_public_api_client/helpers/variants.py
search(query, limit=50)
async
¶
Search variants by SKU or parent product/material name with relevance ranking.
Used by: MCP tool search_products
Features: - Fetches all variants with parent product/material info (cached for 5 min) - Multi-token matching (all tokens must match) - Relevance-based ranking (exact matches first) - Case-insensitive substring matching
Parameters:
-
query(str) –Search query (e.g., "fox fork 160")
-
limit(int, default:50) –Maximum number of results to return
Returns:
-
list[KatanaVariant]–List of matching Variant objects, sorted by relevance
Example
First search: fetches from API (~1-2s)¶
variants = await client.variants.search("fox fork", limit=10)
Subsequent searches: instant (<10ms, uses cache)¶
variants = await client.variants.search("fox 160", limit=10)
for variant in variants: ... print(f"{variant.sku}: {variant.product_or_material_name}")
Source code in katana_public_api_client/helpers/variants.py
update(variant_id, variant_data)
async
¶
Update an existing variant.
Note: Clears the variant cache after update.
Parameters:
-
variant_id(int) –The variant ID to update.
-
variant_data(UpdateVariantRequest) –UpdateVariantRequest model with fields to update.
Returns:
-
KatanaVariant–Updated Variant object.
Example
from katana_public_api_client.models import UpdateVariantRequest updated = await client.variants.update( ... 123, UpdateVariantRequest(name="XL") ... )