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