Coverage for polar/product/guard.py: 68%

28 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-12-05 16:17 +0000

1from typing import TypeAlias 1ab

2 

3from typing_extensions import TypeIs 1ab

4 

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) 

17 

18StaticPrice: TypeAlias = ( 1ab

19 ProductPriceFixed 

20 | LegacyRecurringProductPriceFixed 

21 | ProductPriceFree 

22 | LegacyRecurringProductPriceFree 

23 | ProductPriceCustom 

24 | LegacyRecurringProductPriceCustom 

25) 

26 

27FixedPrice: TypeAlias = ProductPriceFixed | LegacyRecurringProductPriceFixed 1ab

28 

29CustomPrice: TypeAlias = ProductPriceCustom | LegacyRecurringProductPriceCustom 1ab

30 

31FreePrice: TypeAlias = ProductPriceFree | LegacyRecurringProductPriceFree 1ab

32 

33MeteredPrice: TypeAlias = ProductPriceMeteredUnit 1ab

34 

35SeatPrice: TypeAlias = ProductPriceSeatUnit 1ab

36 

37LegacyPrice: TypeAlias = ( 1ab

38 LegacyRecurringProductPriceFixed 

39 | LegacyRecurringProductPriceFree 

40 | LegacyRecurringProductPriceCustom 

41) 

42 

43 

44def is_legacy_price(price: ProductPrice) -> TypeIs[LegacyPrice]: 1ab

45 return isinstance( 

46 price, 

47 LegacyRecurringProductPriceFixed 

48 | LegacyRecurringProductPriceFree 

49 | LegacyRecurringProductPriceCustom, 

50 ) 

51 

52 

53def is_currency_price( 1ab

54 price: ProductPrice, 

55) -> TypeIs[FixedPrice | CustomPrice | MeteredPrice]: 

56 return isinstance(price, HasPriceCurrency) 

57 

58 

59def is_fixed_price(price: ProductPrice) -> TypeIs[FixedPrice]: 1ab

60 return isinstance(price, ProductPriceFixed | LegacyRecurringProductPriceFixed) 

61 

62 

63def is_custom_price(price: ProductPrice) -> TypeIs[CustomPrice]: 1ab

64 return isinstance(price, ProductPriceCustom | LegacyRecurringProductPriceCustom) 

65 

66 

67def is_free_price(price: ProductPrice) -> TypeIs[FreePrice]: 1ab

68 return isinstance(price, ProductPriceFree | LegacyRecurringProductPriceFree) 

69 

70 

71def is_static_price(price: ProductPrice) -> TypeIs[StaticPrice]: 1ab

72 return price.is_static 

73 

74 

75def is_metered_price(price: ProductPrice) -> TypeIs[MeteredPrice]: 1ab

76 return price.is_metered 

77 

78 

79def is_seat_price(price: ProductPrice) -> TypeIs[SeatPrice]: 1ab

80 return isinstance(price, ProductPriceSeatUnit) 

81 

82 

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 )