Skip to main content

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_system_currency

# Get system currency
currency = get_system_currency()
print(f"System currency: {currency}")  # e.g., "JPY" on Japanese system

# 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_system_currency()

Get system currency code from locale settings.

def get_system_currency() -> CurrencyCode

Returns: Currency code (ISO 4217) based on system locale. Falls back to "USD" if detection fails.

Detection Strategy:

  1. Try to get currency from locale.localeconv()["int_curr_symbol"]
  2. Map locale string to currency (e.g., ja_JPJPY, en_USUSD)
  3. Check environment variables (LC_ALL, LC_MONETARY, LANG)
  4. Fallback to "USD"

Examples:

from kiarina.currency import get_system_currency

# On Japanese system
currency = get_system_currency()  # Returns "JPY"

# On US system
currency = get_system_currency()  # Returns "USD"

# On unknown system
currency = get_system_currency()  # Returns "USD" (fallback)

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 (raises ExchangeRateNotFoundError if 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:

  1. Direct rate: rates[from_currency][to_currency]
  2. Inverted rate: 1.0 / rates[to_currency][from_currency]
  3. 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 name
  • KIARINA_CURRENCY_RATE_PROVIDER_IMPL_STATIC_BASE_CURRENCY: Base currency for static provider
  • KIARINA_CURRENCY_RATE_PROVIDER_IMPL_FRANKFURTER_BASE_URL: Frankfurter API base URL
  • KIARINA_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 calls
  • kiarina-utils-common>=1.11.0 - Common utilities
  • pydantic>=2.10.6 - Data validation
  • pydantic-settings>=2.7.1 - Settings management
  • pydantic-settings-manager>=2.3.0 - Settings manager

License

This project is licensed under the MIT License - see the LICENSE file for details.

Related Projects

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kiarina_currency-1.31.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kiarina_currency-1.31.0-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

File details

Details for the file kiarina_currency-1.31.0.tar.gz.

File metadata

  • Download URL: kiarina_currency-1.31.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for kiarina_currency-1.31.0.tar.gz
Algorithm Hash digest
SHA256 afdd63d38a062c2ab23d0240df765ad6747eec86ee6237e81a29445de34f624a
MD5 4d6b80ac85118371f4db4af030224f24
BLAKE2b-256 02f7befe3761769878e77647df720521cf2a8d1d04f81d44fa02775ea94a009a

See more details on using hashes here.

File details

Details for the file kiarina_currency-1.31.0-py3-none-any.whl.

File metadata

File hashes

Hashes for kiarina_currency-1.31.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6a359d5a1e2a177bf089fb30e41d5fb21e7d47c414921aeb64641a13fd0abbf1
MD5 4ed1d8be9768a3632ce5b01f6e581098
BLAKE2b-256 aeab1a0d70877045f0ac925284d640fb477ec43767fc3083081edb3118b5ba36

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page