krz/hutch-stats
Server-side utility for calculating contributions for sourcehut users.
clone: git clone https://gitbay.org/krz/hutch-stats.git
main: src/srht_contrib/config.py · raw
1from __future__ import annotations
2
3from functools import lru_cache
4
5from pydantic import Field
6from pydantic_settings import BaseSettings, SettingsConfigDict
7
8
9class Settings(BaseSettings):
10 model_config = SettingsConfigDict(
11 env_file=".env",
12 env_file_encoding="utf-8",
13 case_sensitive=True,
14 )
15
16 app_name: str = "srht-contrib"
17 app_env: str = "development"
18 api_host: str = "127.0.0.1"
19 api_port: int = 8000
20 enable_scheduler: bool = Field(default=False, alias="ENABLE_SCHEDULER")
21 api_key: str = Field(default="", alias="API_KEY")
22
23 srht_token: str = Field(default="", alias="SRHT_TOKEN")
24 todo_srht_endpoint: str = Field(
25 default="https://todo.sr.ht/query",
26 alias="TODO_SRHT_ENDPOINT",
27 )
28 git_srht_endpoint: str = Field(
29 default="https://git.sr.ht/query",
30 alias="GIT_SRHT_ENDPOINT",
31 )
32 database_url: str = Field(
33 default="sqlite:///./srht_contrib.db",
34 alias="DATABASE_URL",
35 )
36 default_actor: str = Field(default="~unknown", alias="DEFAULT_ACTOR")
37 poll_interval_seconds: int = Field(default=300, alias="POLL_INTERVAL_SECONDS")
38 sync_overlap_hours: int = Field(default=1, alias="SYNC_OVERLAP_HOURS")
39 srht_request_delay_seconds: float = Field(default=0.5, alias="SRHT_REQUEST_DELAY_SECONDS")
40 sqlite_busy_timeout_seconds: float = Field(default=30.0, alias="SQLITE_BUSY_TIMEOUT_SECONDS")
41 discovery_batch_size: int = Field(default=20, alias="DISCOVERY_BATCH_SIZE")
42 indexed_actor_repoll_seconds: int = Field(default=21600, alias="INDEXED_ACTOR_REPOLL_SECONDS")
43 discovery_error_backoff_seconds: int = Field(default=3600, alias="DISCOVERY_ERROR_BACKOFF_SECONDS")
44 discovery_error_backoff_max_seconds: int = Field(default=21600, alias="DISCOVERY_ERROR_BACKOFF_MAX_SECONDS")
45 git_repo_discovery_ttl_seconds: int = Field(default=3600, alias="GIT_REPO_DISCOVERY_TTL_SECONDS")
46 actor_aliases_json: dict[str, list[str]] = Field(
47 default_factory=dict,
48 alias="ACTOR_ALIASES_JSON",
49 )
50 git_tracked_repositories: list[str] = Field(
51 default_factory=list,
52 alias="GIT_TRACKED_REPOSITORIES",
53 )
54
55 event_weights: dict[str, float] = {
56 "commit": 1.0,
57 "ticket_created": 1.0,
58 "ticket_comment": 0.5,
59 "ticket_closed": 0.75,
60 "build_started": 0.25,
61 "build_passed": 0.25,
62 }
63
64
65@lru_cache(maxsize=1)
66def get_settings() -> Settings:
67 return Settings()