Files
pr-agent/pr_agent/config_loader.py

82 lines
2.5 KiB
Python
Raw Normal View History

2023-07-06 00:21:08 +03:00
from os.path import abspath, dirname, join
2023-07-24 12:49:57 +02:00
from pathlib import Path
from typing import Optional
2023-07-06 00:21:08 +03:00
from dynaconf import Dynaconf
from starlette_context import context
2023-07-06 00:21:08 +03:00
2023-07-24 12:49:57 +02:00
PR_AGENT_TOML_KEY = 'pr-agent'
2023-07-06 00:21:08 +03:00
current_dir = dirname(abspath(__file__))
global_settings = Dynaconf(
2023-07-06 00:21:08 +03:00
envvar_prefix=False,
2023-07-08 08:52:11 +03:00
merge_enabled=True,
2023-07-06 00:21:08 +03:00
settings_files=[join(current_dir, f) for f in [
"settings/.secrets.toml",
"settings/configuration.toml",
"settings/ignore.toml",
"settings/language_extensions.toml",
"settings/pr_reviewer_prompts.toml",
2023-10-06 21:03:36 +11:00
"settings/pr_questions_prompts.toml",
2024-02-15 14:25:22 +02:00
"settings/pr_line_questions_prompts.toml",
2023-10-06 21:03:36 +11:00
"settings/pr_description_prompts.toml",
"settings/pr_code_suggestions_prompts.toml",
2024-05-10 19:44:26 +03:00
"settings/pr_code_suggestions_reflect_prompts.toml",
"settings/pr_sort_code_suggestions_prompts.toml",
2023-10-06 21:03:36 +11:00
"settings/pr_information_from_user_prompts.toml",
"settings/pr_update_changelog_prompts.toml",
"settings/pr_custom_labels.toml",
2023-10-06 21:03:36 +11:00
"settings/pr_add_docs.toml",
2024-09-21 16:58:37 +03:00
"settings/custom_labels.toml",
"settings/pr_help_prompts.toml",
"settings_prod/.secrets.toml",
]]
2023-07-06 00:21:08 +03:00
)
2023-07-24 12:49:57 +02:00
def get_settings():
"""
Retrieves the current settings.
This function attempts to fetch the settings from the starlette_context's context object. If it fails,
it defaults to the global settings defined outside of this function.
Returns:
Dynaconf: The current settings object, either from the context or the global default.
"""
try:
return context["settings"]
except Exception:
return global_settings
2023-07-24 12:49:57 +02:00
# Add local configuration from pyproject.toml of the project being reviewed
def _find_repository_root() -> Optional[Path]:
2023-07-24 12:49:57 +02:00
"""
Identify project root directory by recursively searching for the .git directory in the parent directories.
"""
cwd = Path.cwd().resolve()
no_way_up = False
while not no_way_up:
no_way_up = cwd == cwd.parent
if (cwd / ".git").is_dir():
return cwd
cwd = cwd.parent
2023-07-25 16:36:58 +03:00
return None
2023-07-24 12:49:57 +02:00
2023-07-24 12:49:57 +02:00
def _find_pyproject() -> Optional[Path]:
"""
Search for file pyproject.toml in the repository root.
"""
2023-07-25 16:41:29 +03:00
repo_root = _find_repository_root()
if repo_root:
pyproject = repo_root / "pyproject.toml"
2023-07-25 16:41:29 +03:00
return pyproject if pyproject.is_file() else None
return None
2023-07-24 12:49:57 +02:00
2023-07-24 12:49:57 +02:00
pyproject_path = _find_pyproject()
if pyproject_path is not None:
get_settings().load_file(pyproject_path, env=f'tool.{PR_AGENT_TOML_KEY}')