Coverage for functions \ flipdare \ config_key.py: 98%
57 statements
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
« prev ^ index » next coverage.py v7.13.0, created at 2026-05-08 12:22 +1000
1#!/usr/bin/env python
2# Copyright (c) 2026 Flipdare Pty Ltd. All rights reserved.
3#
4# This file is part of Flipdare's proprietary software and contains
5# confidential and copyrighted material. Unauthorised copying,
6# modification, distribution, or use of this file is strictly
7# prohibited without prior written permission from Flipdare Pty Ltd.
8#
9# This software includes third-party components licensed under MIT,
10# BSD, and Apache 2.0 licences. See THIRD_PARTY_NOTICES for details.
11#
14from enum import StrEnum
15from typing import Self
17__all__ = ["ConfigKey"]
19type ConfigType = int | float | bool | str
22class ConfigKey(StrEnum):
23 """Config keys"""
25 # Declared here so type-checkers know these attributes exist.
26 # They are populated per-member inside __new__.
27 _default_value: ConfigType | None
28 _value_type: type[ConfigType]
29 _is_trigger: bool
31 def __new__(
32 cls,
33 code: str,
34 default_value: ConfigType | None,
35 value_type: type[ConfigType],
36 is_trigger: bool | None = None,
37 ) -> Self:
38 obj = str.__new__(cls, code)
39 obj._value_ = code
40 obj._value_type = value_type
41 obj._default_value = default_value
42 if is_trigger is not None:
43 obj._is_trigger = is_trigger
44 return obj
46 # ---- Members --------------------------------------------------------
47 # fmt: off
48 #
49 # runtime triggers
50 #
51 JOB_CONFIG = ("JOB_CONFIG", None, bool, True)
52 AVATAR_CONFIG = ("AVATAR_CONFIG", None, bool, True)
53 #
54 # runtime options/variables
55 #
56 CHANGE_SCORE_THRESHOLD = ("CHANGE_SCORE_THRESHOLD", 0.5, float, False)
57 #
58 # config
59 #
60 GCLOUD_PROJECT = ("FLIP_GCLOUD_PROJECT", None, str, False)
61 STORAGE_BUCKET = ("FLIP_STORAGE_BUCKET", None, str, False)
62 API_KEY = ("FLIP_API", None, str, False)
63 BACKEND_API = ("FLIP_BACKEND_API", None, str, False)
64 STRIPE_CURRENCY_CONVERSION_ACCOUNT_ID = ("FLIP_STRIPE_CURRENCY_CONVERSION_ACCOUNT_ID", None, str, False)
65 STRIPE_PLATFORM_ACCOUNT_ID = ("FLIP_STRIPE_PLATFORM_ACCOUNT_ID", None, str, False)
66 STRIPE_PUBLIC = ("FLIP_STRIPE_PUBLIC", None, str, False)
67 STRIPE_SECRET = ("FLIP_STRIPE_SECRET", None, str, False)
68 STRIPE_CLIENT_ID = ("FLIP_STRIPE_CLIENT_ID", None, str, False)
69 STRIPE_REFRESH_WEBHOOK_URL = ("FLIP_STRIPE_REFRESH_URL", None, str, False)
70 STRIPE_RETURN_WEBHOOK_URL = ("FLIP_STRIPE_RETURN_URL", None, str, False)
71 STRIPE_PAY_WEBHOOK_URL = ("FLIP_STRIPE_PAY_URL", None, str, False)
72 STRIPE_WEBHOOK_KEY = ("FLIP_STRIPE_CALLBACK_KEY", None, str, False)
73 SMTP_TIMEOUT = ("FLIP_SMTP_TIMEOUT", 10, int, False)
74 SMTP_GATEWAY = ("FLIP_SMTP_GATEWAY", None, str, False)
75 SMTP_PORT = ("FLIP_SMTP_PORT", 465, int, False)
76 SMTP_USERNAME = ("FLIP_SMTP_USERNAME", None, str, False)
77 SMTP_PASSWORD = ("FLIP_SMTP_PASSWORD", None, str, False)
78 SEARCH_IP = ("FLIP_SEARCH_IP", None, str, False)
79 SEARCH_PORT = ("FLIP_SEARCH_PORT", 8108, int, False)
80 SEARCH_API = ("FLIP_SEARCH_API", None, str, False)
81 SEARCH_TIMEOUT = ("FLIP_SEARCH_TIMEOUT", 2, int, False)
82 SEARCH_ENABLE_NAT_LANG = ("FLIP_SEARCH_ENABLE_NAT_LANG", None, str, False)
83 EXCHANGE_RATE_API = ("FLIP_EXCHANGE_RATE_API", None, str, False)
84 GEMINI_API = ("FLIP_GEMINI_API", None, str, False)
85 CREDENTIAL = ("FLIP_CREDENTIAL", None, str, False)
86 # fmt: on
88 # ---- Properties -----------------------------------------------------
90 @property
91 def default_value(self) -> ConfigType | None:
92 return self._default_value
94 @property
95 def is_trigger(self) -> bool:
96 return self._is_trigger
98 @property
99 def is_config(self) -> bool:
100 return not self.is_trigger and self != ConfigKey.CREDENTIAL
102 @property
103 def value_type(self) -> type[ConfigType]:
104 return self._value_type