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()