Skip to content
Closed
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
184 changes: 119 additions & 65 deletions penify_hook/api_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,54 @@

class APIClient:
def __init__(self, api_url, api_token: str = None, bearer_token: str = None):
"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
dictionary (dict): The processed files map.

Returns:
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""
self.api_url = api_url
self.AUTH_TOKEN = api_token
self.BEARER_TOKEN = bearer_token

def send_file_for_docstring_generation(self, file_name, content, line_numbers, repo_details = None):
"""Send file content and modified lines to the API and return modified
content.

This function constructs a payload containing the file path, content,
and modified line numbers, and sends it to a specified API endpoint for
processing. It handles the response from the API, returning the modified
content if the request is successful. If the request fails, it logs the
error details and returns the original content.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
file_name (str): The path to the file being sent.
content (str): The content of the file to be processed.
line_numbers (list): A list of line numbers that have been modified.
repo_details (str?): Additional repository details if applicable. Defaults to None.

dictionary (dict): The processed files map.

Returns:
str: The modified content returned by the API, or the original content if the
request fails.

Raises:
Exception: If there is an error in processing the file and no specific error
message is provided.
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""
payload = {
'file_path': file_name,
Expand All @@ -53,25 +74,27 @@ def send_file_for_docstring_generation(self, file_name, content, line_numbers, r
raise Exception(f"API Error: {error_message}")

def generate_commit_summary(self, git_diff, instruction: str = "", repo_details = None, jira_context: dict = None):
"""Generate a commit summary by sending a POST request to the API endpoint.

This function constructs a payload containing the git diff and any
additional instructions provided. It then sends this payload to a
specified API endpoint to generate a summary of the commit. If the
request is successful, it returns the response from the API; otherwise,
it returns None.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
git_diff (str): The git diff of the commit.
instruction (str??): Additional instruction for the commit. Defaults to "".
repo_details (dict??): Details of the git repository. Defaults to None.
jira_context (dict??): JIRA issue details to enhance the commit summary. Defaults to None.

dictionary (dict): The processed files map.

Returns:
dict: The response from the API if the request is successful, None otherwise.

Raises:
Exception: If there is an error during the API request.
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""
payload = {
'git_diff': git_diff,
Expand Down Expand Up @@ -100,18 +123,29 @@ def generate_commit_summary(self, git_diff, instruction: str = "", repo_details
return None

def get_supported_file_types(self) -> list[str]:
"""Retrieve the supported file types from the API.

This function sends a request to the API endpoint
`/v1/file/supported_languages` to obtain a list of supported file types.
If the API call is successful (status code 200), it parses the JSON
response and returns the list of supported file types. If the API call
fails, it returns a default list of common file types.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
dictionary (dict): The processed files map.

Returns:
list[str]: A list of supported file types, either from the API or a default set.
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""

url = self.api_url+"/v1/file/supported_languages"
response = requests.get(url)
if response.status_code == 200:
Expand All @@ -121,20 +155,27 @@ def get_supported_file_types(self) -> list[str]:
return ["py", "js", "ts", "java", "kt", "cs", "c"]

def generate_commit_summary_with_llm(self, diff, message, generate_description: bool, repo_details, llm_client : LLMClient, jira_context=None):
"""Generates a commit summary using a local LLM client. If an error occurs
during the generation process,
it falls back to using the API.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
diff (str): The Git diff of changes.
message (str): User-provided commit message or instructions.
generate_description (bool): Flag indicating whether to generate a description for the commit.
repo_details (dict): Details about the repository.
llm_client (LLMClient): An instance of LLMClient used to generate the summary.
jira_context (JIRAContext?): Optional JIRA issue context to enhance the summary.

dictionary (dict): The processed files map.

Returns:
dict: A dictionary containing the title and description for the commit.
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""
try:
return llm_client.generate_commit_summary(diff, message, generate_description, repo_details, jira_context)
Expand All @@ -144,17 +185,30 @@ def generate_commit_summary_with_llm(self, diff, message, generate_description:
return self.generate_commit_summary(diff, message, repo_details, jira_context)

def get_api_key(self):
"""Fetch an API key from a specified URL.

This function sends a GET request to retrieve an API token using a
Bearer token in the headers. It handles the response and returns the API
key if the request is successful, or `None` otherwise.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
dictionary (dict): The processed files map.

Returns:
str: The API key if the request is successful, `None` otherwise.
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""


url = self.api_url+"/v1/apiToken/get"
response = requests.get(url, headers={"Authorization": f"Bearer {self.BEARER_TOKEN}"}, timeout=60*10)
if response.status_code == 200:
Expand Down
22 changes: 22 additions & 0 deletions penify_hook/base_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@
class BaseAnalyzer:

def __init__(self, folder_path: str, api_client: APIClient):
"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
dictionary (dict): The processed files map.

Returns:
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""
self.folder_path = folder_path
self.repo_path = recursive_search_git_folder(folder_path)
self.repo = None
Expand Down
99 changes: 60 additions & 39 deletions penify_hook/commands/commit_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,29 @@
def commit_code(api_url, token, message, open_terminal, generate_description,
llm_model=None, llm_api_base=None, llm_api_key=None,
jira_url=None, jira_user=None, jira_api_token=None):
"""Enhance Git commits with AI-powered commit messages.

This function allows for the generation of enhanced commit messages
using natural language processing models and optionally integrates with
JIRA for additional context. It processes the current Git folder to find
relevant files and generates a detailed commit message based on the
provided parameters.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
api_url (str): URL of the API endpoint.
token (str): Authentication token for the API.
message (str): Initial commit message provided by the user.
open_terminal (bool): Whether to open the terminal after committing.
generate_description (bool): Whether to generate a detailed description in the commit message.
llm_model (str?): The language model to use for generating the commit message. Defaults to
None.
llm_api_base (str?): Base URL of the LLM API. Defaults to None.
llm_api_key (str?): API key for accessing the LLM service. Defaults to None.
jira_url (str?): URL of the JIRA instance. Defaults to None.
jira_user (str?): Username for authenticating with JIRA. Defaults to None.
jira_api_token (str?): API token for accessing JIRA. Defaults to None.
dictionary (dict): The processed files map.

Returns:
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""

from penify_hook.ui_utils import print_error
from penify_hook.utils import recursive_search_git_folder
from ..commit_analyzer import CommitDocGenHook
Expand Down Expand Up @@ -98,18 +98,29 @@ def commit_code(api_url, token, message, open_terminal, generate_description,


def setup_commit_parser(parser):
"""Generates a parser for setting up a command to generate smart commit
messages.

This function sets up an argument parser that can be used to generate
commit messages with contextual information. It allows users to specify
options such as including a message, opening an edit terminal before
committing, and generating a detailed commit message.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
parser (argparse.ArgumentParser): The ArgumentParser object to be configured.
dictionary (dict): The processed files map.

Returns:
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""

commit_parser_description = """
It generates smart commit messages. By default, it will just generate just the Title of the commit message.
1. If you have not configured LLM, it will give an error. You either need to configure LLM or use the API key.
Expand All @@ -126,19 +137,29 @@ def setup_commit_parser(parser):
parser.add_argument("-d", "--description", action="store_false", help="It will generate commit message with title and description.", default=False)

def handle_commit(args):
"""Handle the commit functionality by processing arguments and invoking the
appropriate commands.

This function processes the provided command-line arguments to configure
settings for commit operations, including LLM (Language Model) and Jira
configurations. It then calls the `commit_code` function with these
configurations to perform the actual commit operation.

"""Save the processed files map to a JSON file.

Function parameters should be documented in the ``Args`` section. The name of each parameter is required. The type and
description of each parameter is optional, but should be included if not obvious.

Args:
args (argparse.Namespace): The parsed command-line arguments containing options like terminal,
description, message, etc.
dictionary (dict): The processed files map.

Returns:
bool: True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the ``Returns`` section followed by a colon.
The ``Returns`` section may span multiple lines and paragraphs.
Following lines should be indented to match the first line.
The ``Returns`` section supports any reStructuredText formatting,
including literal blocks::

{
'param1': param1,
'param2': param2
}
"""

from penify_hook.commands.commit_commands import commit_code
from penify_hook.commands.config_commands import get_jira_config, get_llm_config, get_token
from penify_hook.constants import API_URL
Expand Down
Loading
Loading