Currency utilities for the kiarina namespace
Project description
kiarina-currency
Currency utilities for the kiarina namespace with exchange rate support.
Purpose
Provides currency code types and exchange rate retrieval with pluggable rate providers.
Installation
pip install kiarina-currency
Quick Start
Basic Usage
from kiarina.currency import get_exchange_rate
# Get exchange rate (uses static provider by default)
rate = await get_exchange_rate("USD", "JPY")
print(f"1 USD = {rate} JPY")
# With default value for unsupported currencies
rate = await get_exchange_rate("USD", "XXX", default=1.0)
Using Different Rate Providers
from kiarina.currency import get_exchange_rate
# Use Frankfurter API for real-time rates
rate = await get_exchange_rate(
"USD", "EUR",
rate_options={"rate_provider": "frankfurter"}
)
Custom Rate Provider
from kiarina.currency import BaseRateProvider, get_exchange_rate
class MyRateProvider(BaseRateProvider):
async def get_rate(
self,
from_currency: str,
to_currency: str,
*,
default: float | None = None,
) -> float:
# Your custom implementation
return 1.5
# Use custom provider
rate = await get_exchange_rate(
"USD", "EUR",
rate_options={"rate_provider": MyRateProvider()}
)
API Reference
get_exchange_rate()
Get exchange rate between two currencies.
async def get_exchange_rate(
from_currency: CurrencyCode,
to_currency: CurrencyCode,
*,
default: float | None = None,
rate_options: RateOptions | None = None,
) -> float
Parameters:
from_currency: Source currency code (ISO 4217)to_currency: Target currency code (ISO 4217)default: Default value if rate not found (raisesExchangeRateNotFoundErrorif None)rate_options: Options for rate provider selection
Returns: Exchange rate as float
Raises: ExchangeRateNotFoundError if rate not found and no default provided
Rate Providers
Built-in Providers
-
static(default): Configuration-based static rates- Supports direct rates, inverted rates, and indirect rates via base currency
- Default rates from USD to 11 major currencies (JPY, EUR, GBP, CNY, KRW, AUD, CAD, CHF, HKD, SGD, INR)
-
frankfurter: Real-time rates from Frankfurter API- Free, open-source API for currency exchange rates
- Updated daily from European Central Bank
- Default value fallback for unsupported currencies or network errors
Creating Custom Providers
Implement the BaseRateProvider abstract class:
from kiarina.currency import BaseRateProvider
class MyRateProvider(BaseRateProvider):
async def get_rate(
self,
from_currency: str,
to_currency: str,
*,
default: float | None = None,
) -> float:
# Your implementation
pass
Configuration
Static Rate Provider
Configure static exchange rates:
kiarina.currency.rate_provider_impl.static:
base_currency: "USD"
rates:
USD:
JPY: 158.27
EUR: 0.86
GBP: 0.75
EUR:
GBP: 0.86
Rate Resolution:
- Direct rate:
rates[from_currency][to_currency] - Inverted rate:
1.0 / rates[to_currency][from_currency] - Indirect rate via base currency:
from → base → to
Frankfurter Rate Provider
Configure Frankfurter API settings:
kiarina.currency.rate_provider_impl.frankfurter:
base_url: "https://api.frankfurter.app"
timeout: 10.0
Rate Provider Selection
Set default rate provider:
kiarina.currency.rate_provider:
default: "static" # or "frankfurter"
providers:
static: "kiarina.currency.rate_provider_impl.static:StaticRateProvider"
frankfurter: "kiarina.currency.rate_provider_impl.frankfurter:FrankfurterRateProvider"
custom: "myapp.providers:CustomRateProvider"
Environment Variables:
KIARINA_CURRENCY_RATE_PROVIDER_DEFAULT: Default provider nameKIARINA_CURRENCY_RATE_PROVIDER_IMPL_STATIC_BASE_CURRENCY: Base currency for static providerKIARINA_CURRENCY_RATE_PROVIDER_IMPL_FRANKFURTER_BASE_URL: Frankfurter API base URLKIARINA_CURRENCY_RATE_PROVIDER_IMPL_FRANKFURTER_TIMEOUT: Request timeout in seconds
Testing
# Run tests
mise run package:test kiarina-currency
# Enable Frankfurter API tests (requires internet connection)
export KIARINA_CURRENCY_RATE_PROVIDER_IMPL_FRANKFURTER_TEST_ENABLED=1
mise run package:test kiarina-currency
Dependencies
httpx>=0.28.1- HTTP client for API callskiarina-utils-common>=1.11.0- Common utilitiespydantic>=2.10.6- Data validationpydantic-settings>=2.7.1- Settings managementpydantic-settings-manager>=2.3.0- Settings manager
License
This project is licensed under the MIT License - see the LICENSE file for details.
Related Projects
- kiarina-python - Parent monorepo
- Frankfurter API - Free currency exchange rate API
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kiarina_currency-1.28.0.tar.gz.
File metadata
- Download URL: kiarina_currency-1.28.0.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36c6da5b8eb5e5e66b1262dbf5c79e572d58a903b1cee220a7022da794feb649
|
|
| MD5 |
3c40c2dd7cb82634a9aa8a10db112550
|
|
| BLAKE2b-256 |
59ae9fbee1bd194abf960490ed65eab93865ac6bc4b7bf20c69b1e765dfc6394
|
File details
Details for the file kiarina_currency-1.28.0-py3-none-any.whl.
File metadata
- Download URL: kiarina_currency-1.28.0-py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3baa4d3108669d86efbdc2910baa44b73af674508143cdb33f51ed3f3ab497ff
|
|
| MD5 |
81daf9ac1b9b27fa9d6ad8827a602c11
|
|
| BLAKE2b-256 |
b33586c09f21177e28a0139a4e0d3d1cc83fef80f4ca2b335139548971da9311
|