diff --git a/pr_agent/agent/pr_agent.py b/pr_agent/agent/pr_agent.py index cdc8eb0c..b064048c 100644 --- a/pr_agent/agent/pr_agent.py +++ b/pr_agent/agent/pr_agent.py @@ -12,6 +12,7 @@ from pr_agent.tools.pr_information_from_user import PRInformationFromUser from pr_agent.tools.pr_questions import PRQuestions from pr_agent.tools.pr_reviewer import PRReviewer from pr_agent.tools.pr_update_changelog import PRUpdateChangelog +from pr_agent.tools.pr_config import PRConfig command2class = { "answer": PRReviewer, @@ -26,6 +27,8 @@ command2class = { "ask": PRQuestions, "ask_question": PRQuestions, "update_changelog": PRUpdateChangelog, + "config": PRConfig, + "settings": PRConfig, } commands = list(command2class.keys()) diff --git a/pr_agent/servers/help.py b/pr_agent/servers/help.py index e011bd0e..838645f5 100644 --- a/pr_agent/servers/help.py +++ b/pr_agent/servers/help.py @@ -4,7 +4,8 @@ commands_text = "> **/review [-i]**: Request a review of your Pull Request. For "> **/improve**: Suggest improvements to the code in the PR. \n" \ "> **/ask \\**: Pose a question about the PR.\n\n" \ ">To edit any configuration parameter from 'configuration.toml', add --config_path=new_value\n" \ - ">For example: /review --pr_reviewer.extra_instructions=\"focus on the file: ...\" " \ + ">For example: /review --pr_reviewer.extra_instructions=\"focus on the file: ...\" \n" \ + ">To list the possible configuration parameters, use the **/config** command.\n" \ def bot_help_text(user: str): diff --git a/pr_agent/settings/configuration.toml b/pr_agent/settings/configuration.toml index fe7f1ec2..6a41b2b4 100644 --- a/pr_agent/settings/configuration.toml +++ b/pr_agent/settings/configuration.toml @@ -32,6 +32,8 @@ extra_instructions = "" push_changelog_changes=false extra_instructions = "" +[pr_config] # /config # + [github] # The type of deployment to create. Valid values are 'app' or 'user'. deployment_type = "user" diff --git a/pr_agent/tools/pr_config.py b/pr_agent/tools/pr_config.py new file mode 100644 index 00000000..0dc35918 --- /dev/null +++ b/pr_agent/tools/pr_config.py @@ -0,0 +1,48 @@ +import logging + +from pr_agent.config_loader import get_settings +from pr_agent.git_providers import get_git_provider + + +class PRConfig: + """ + The PRConfig class is responsible for listing all configuration options available for the user. + """ + def __init__(self, pr_url: str, args=None): + """ + Initialize the PRConfig object with the necessary attributes and objects to comment on a pull request. + + Args: + pr_url (str): The URL of the pull request to be reviewed. + args (list, optional): List of arguments passed to the PRReviewer class. Defaults to None. + """ + self.git_provider = get_git_provider()(pr_url) + + async def run(self): + logging.info('Getting configuration settings...') + logging.info('Preparing configs...') + pr_comment = self._prepare_pr_configs() + if get_settings().config.publish_output: + logging.info('Pushing configs...') + self.git_provider.publish_comment(pr_comment) + self.git_provider.remove_initial_comment() + return "" + + def _prepare_pr_configs(self) -> str: + import tomli + with open(get_settings().find_file("configuration.toml"), "rb") as conf_file: + configuration_headers = [header.lower() for header in tomli.load(conf_file).keys()] + relevant_configs = { + header: configs for header, configs in get_settings().to_dict().items() + if header.lower().startswith("pr_") and header.lower() in configuration_headers + } + comment_str = "Possible Configurations:" + for header, configs in relevant_configs.items(): + if configs: + comment_str += "\n" + for key, value in configs.items(): + comment_str += f"\n{header.lower()}.{key.lower()} = {repr(value) if isinstance(value, str) else value}" + comment_str += " " + if get_settings().config.verbosity_level >= 2: + logging.info(f"comment_str:\n{comment_str}") + return comment_str