Coverage for polar/product/guard.py: 96%
28 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from typing import TypeAlias
3from typing_extensions import TypeIs
5from polar.models.product_price import (
6 HasPriceCurrency,
7 LegacyRecurringProductPriceCustom,
8 LegacyRecurringProductPriceFixed,
9 LegacyRecurringProductPriceFree,
10 ProductPrice,
11 ProductPriceCustom,
12 ProductPriceFixed,
13 ProductPriceFree,
14 ProductPriceMeteredUnit,
15 ProductPriceSeatUnit,
16)
18StaticPrice: TypeAlias = (
19 ProductPriceFixed
20 | LegacyRecurringProductPriceFixed
21 | ProductPriceFree
22 | LegacyRecurringProductPriceFree
23 | ProductPriceCustom
24 | LegacyRecurringProductPriceCustom
25)
27FixedPrice: TypeAlias = ProductPriceFixed | LegacyRecurringProductPriceFixed
29CustomPrice: TypeAlias = ProductPriceCustom | LegacyRecurringProductPriceCustom
31FreePrice: TypeAlias = ProductPriceFree | LegacyRecurringProductPriceFree
33MeteredPrice: TypeAlias = ProductPriceMeteredUnit
35SeatPrice: TypeAlias = ProductPriceSeatUnit
37LegacyPrice: TypeAlias = (
38 LegacyRecurringProductPriceFixed
39 | LegacyRecurringProductPriceFree
40 | LegacyRecurringProductPriceCustom
41)
44def is_legacy_price(price: ProductPrice) -> TypeIs[LegacyPrice]:
45 return isinstance(
46 price,
47 LegacyRecurringProductPriceFixed
48 | LegacyRecurringProductPriceFree
49 | LegacyRecurringProductPriceCustom,
50 )
53def is_currency_price(
54 price: ProductPrice,
55) -> TypeIs[FixedPrice | CustomPrice | MeteredPrice]:
56 return isinstance(price, HasPriceCurrency)
59def is_fixed_price(price: ProductPrice) -> TypeIs[FixedPrice]:
60 return isinstance(price, ProductPriceFixed | LegacyRecurringProductPriceFixed)
63def is_custom_price(price: ProductPrice) -> TypeIs[CustomPrice]:
64 return isinstance(price, ProductPriceCustom | LegacyRecurringProductPriceCustom)
67def is_free_price(price: ProductPrice) -> TypeIs[FreePrice]:
68 return isinstance(price, ProductPriceFree | LegacyRecurringProductPriceFree)
71def is_static_price(price: ProductPrice) -> TypeIs[StaticPrice]:
72 return price.is_static
75def is_metered_price(price: ProductPrice) -> TypeIs[MeteredPrice]:
76 return price.is_metered
79def is_seat_price(price: ProductPrice) -> TypeIs[SeatPrice]:
80 return isinstance(price, ProductPriceSeatUnit)
83def is_discount_applicable(
84 price: ProductPrice,
85) -> TypeIs[FixedPrice | CustomPrice | MeteredPrice | SeatPrice]:
86 return (
87 is_fixed_price(price)
88 or is_custom_price(price)
89 or is_metered_price(price)
90 or is_seat_price(price)
91 )