Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions pr_agent/algo/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -936,10 +936,11 @@ def try_fix_yaml(response_text: str,


def set_custom_labels(variables, git_provider=None):
if not get_settings().config.enable_custom_labels:
settings = get_settings()
if not settings.config.enable_custom_labels:
return

labels = get_settings().get('custom_labels', {})
labels = settings.get('custom_labels', {})
if not labels:
# set default labels
labels = ['Bug fix', 'Tests', 'Bug fix with tests', 'Enhancement', 'Documentation', 'Other']
Expand All @@ -950,14 +951,18 @@ def set_custom_labels(variables, git_provider=None):

# Set custom labels
variables["custom_labels_class"] = "class Label(str, Enum):"
counter = 0
labels_minimal_to_labels_dict = {}

custom_labels_lines = []

# This minimizes string concatenation and replaces with list append/join, much faster for large N
for k, v in labels.items():
key_minimal = k.lower().replace(' ', '_')
description = "'" + v['description'].strip('\n').replace('\n', '\\n') + "'"
# variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = '{k}' # {description}"
variables["custom_labels_class"] += f"\n {k.lower().replace(' ', '_')} = {description}"
labels_minimal_to_labels_dict[k.lower().replace(' ', '_')] = k
counter += 1
custom_labels_lines.append(f"\n {key_minimal} = {description}")
labels_minimal_to_labels_dict[key_minimal] = k

variables["custom_labels_class"] += ''.join(custom_labels_lines)
variables["labels_minimal_to_labels_dict"] = labels_minimal_to_labels_dict

def get_user_labels(current_labels: List[str] = None):
Expand Down
71 changes: 40 additions & 31 deletions pr_agent/config_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,38 @@
from dynaconf import Dynaconf
from starlette_context import context

PR_AGENT_TOML_KEY = 'pr-agent'
PR_AGENT_TOML_KEY = "pr-agent"

current_dir = dirname(abspath(__file__))
global_settings = Dynaconf(
envvar_prefix=False,
merge_enabled=True,
settings_files=[join(current_dir, f) for f in [
"settings/configuration.toml",
"settings/ignore.toml",
"settings/generated_code_ignore.toml",
"settings/language_extensions.toml",
"settings/pr_reviewer_prompts.toml",
"settings/pr_questions_prompts.toml",
"settings/pr_line_questions_prompts.toml",
"settings/pr_description_prompts.toml",
"settings/code_suggestions/pr_code_suggestions_prompts.toml",
"settings/code_suggestions/pr_code_suggestions_prompts_not_decoupled.toml",
"settings/code_suggestions/pr_code_suggestions_reflect_prompts.toml",
"settings/pr_information_from_user_prompts.toml",
"settings/pr_update_changelog_prompts.toml",
"settings/pr_custom_labels.toml",
"settings/pr_add_docs.toml",
"settings/custom_labels.toml",
"settings/pr_help_prompts.toml",
"settings/pr_help_docs_prompts.toml",
"settings/pr_help_docs_headings_prompts.toml",
"settings/.secrets.toml",
"settings_prod/.secrets.toml",
]]
settings_files=[
join(current_dir, f)
for f in [
"settings/configuration.toml",
"settings/ignore.toml",
"settings/generated_code_ignore.toml",
"settings/language_extensions.toml",
"settings/pr_reviewer_prompts.toml",
"settings/pr_questions_prompts.toml",
"settings/pr_line_questions_prompts.toml",
"settings/pr_description_prompts.toml",
"settings/code_suggestions/pr_code_suggestions_prompts.toml",
"settings/code_suggestions/pr_code_suggestions_prompts_not_decoupled.toml",
"settings/code_suggestions/pr_code_suggestions_reflect_prompts.toml",
"settings/pr_information_from_user_prompts.toml",
"settings/pr_update_changelog_prompts.toml",
"settings/pr_custom_labels.toml",
"settings/pr_add_docs.toml",
"settings/custom_labels.toml",
"settings/pr_help_prompts.toml",
"settings/pr_help_docs_prompts.toml",
"settings/pr_help_docs_headings_prompts.toml",
"settings/.secrets.toml",
"settings_prod/.secrets.toml",
]
],
)


Expand Down Expand Up @@ -81,7 +84,7 @@ def _find_pyproject() -> Optional[Path]:

pyproject_path = _find_pyproject()
if pyproject_path is not None:
get_settings().load_file(pyproject_path, env=f'tool.{PR_AGENT_TOML_KEY}')
get_settings().load_file(pyproject_path, env=f"tool.{PR_AGENT_TOML_KEY}")


def apply_secrets_manager_config():
Expand All @@ -90,15 +93,17 @@ def apply_secrets_manager_config():
"""
try:
# Dynamic imports to avoid circular dependency (secret_providers imports config_loader)
from pr_agent.secret_providers import get_secret_provider
from pr_agent.log import get_logger
from pr_agent.secret_providers import get_secret_provider

secret_provider = get_secret_provider()
if not secret_provider:
return

if (hasattr(secret_provider, 'get_all_secrets') and
get_settings().get("CONFIG.SECRET_PROVIDER") == 'aws_secrets_manager'):
if (
hasattr(secret_provider, "get_all_secrets")
and get_settings().get("CONFIG.SECRET_PROVIDER") == "aws_secrets_manager"
):
try:
secrets = secret_provider.get_all_secrets()
if secrets:
Expand All @@ -109,6 +114,7 @@ def apply_secrets_manager_config():
except Exception as e:
try:
from pr_agent.log import get_logger

get_logger().debug(f"Secret provider not configured: {e}")
except:
# Fail completely silently if log module is not available
Expand All @@ -123,14 +129,17 @@ def apply_secrets_to_config(secrets: dict):
# Dynamic import to avoid potential circular dependency
from pr_agent.log import get_logger
except:

def get_logger():
class DummyLogger:
def debug(self, msg): pass
def debug(self, msg):
pass

return DummyLogger()

for key, value in secrets.items():
if '.' in key: # nested key like "openai.key"
parts = key.split('.')
if "." in key: # nested key like "openai.key"
parts = key.split(".")
if len(parts) == 2:
section, setting = parts
section_upper = section.upper()
Expand Down