diff --git a/docugen-chatgpt.py b/docugen-chatgpt.py index 4238a4b..dbd2037 100644 --- a/docugen-chatgpt.py +++ b/docugen-chatgpt.py @@ -1,40 +1,44 @@ +#!/usr/bin/env python3 + import json import yaml from yaml import CLoader, CDumper from revChatGPT.revChatGPT import Chatbot import os from sys import argv +import fmtutil from parse import py +from argparse import ArgumentParser -# from argparse import ArgumentParser +argparser = ArgumentParser( + # prog="docugen", + description="generate docs with le AI(tm)", + epilog="https://github.com/turtlebasket/docugen" +) -# argparser = ArgumentParser( -# prog="docugen", -# description="generate docs with le AI(tm)", -# epilog="https://docugen.com" -# ) - -# argparser.add_argument("file", required=True) +argparser.add_argument("filename") +argparser.add_argument("-o", dest="output directory", help="directory to write docs to") +argparser.add_argument("-m", dest="model", help="model to use to generate documentation", choices=["chatgpt"]) +argparser.add_argument("-f", dest="format", help="formatting of output documentation", choices=["md"]) +args = argparser.parse_args() file_path = os.path.dirname(os.path.realpath(__file__)) with open(f"{file_path}/config.yaml", "r") as file: config = yaml.load(file, Loader=CLoader) -infile = open(argv[1], "r") -# print(infile) +infile = open(args.filename, "r") -# top level functions only for now +# python & top level functions only for now functions = py.find_toplevel_funcs(infile) print(f"Found {len(functions)} functions.") +if len(functions) >= 3: + print(f"Grab a cup of coffee, this could take a while.") + doc_prompt_head = "Explain what this function does in one short sentence, then give example code that uses the function:\n" # doc_prompt_example = "Return only example code using this function:\n" -# for function in functions: -# print(function["content"]) -# print("------------------") - bot = Chatbot({ 'Authorization': config['Authorization'], 'session_token': config['session_token'], @@ -42,12 +46,12 @@ bot = Chatbot({ bot.refresh_session() -with open(f"{argv[1].split('.')[0]}-doc.md", "w") as outfile: +with open(f"{args.filename.split('.')[0]}-doc.md", "w") as outfile: outfile.write(f"# Documentation for `{argv[1]}`\n\n") for function in functions: head_ask = doc_prompt_head + function["content"] resp = bot.get_chat_response(head_ask, output="text") print(f'Generated documentation for {function["head"]}.') # append results to doc - output = f"## `{function['head']}`\n" + resp['message'] + "\n\n" + output = f"### `{function['head']}`\n" + fmtutil.highlight_multiline_code_md(resp['message'], "python") + "\n\n" outfile.write(output) diff --git a/example/example_code-doc.md b/example/example_code-doc.md index 1153813..77948fd 100644 --- a/example/example_code-doc.md +++ b/example/example_code-doc.md @@ -1,101 +1,94 @@ # Documentation for `example/example_code.py` -## `remove_dirt(image)` -This function removes small elements from an image using area closing morphological operation. +### `remove_dirt(image)` +The `remove_dirt` function removes small objects from the input image using area closing. Here is an example of how to use the `remove_dirt` function: -Example: +```python +import skimage.morphology as morphology -``` -# Import the required module -from skimage import morphology +# Load an image using some library (e.g. Pillow, OpenCV, etc.) +image = ... -# Load the image -image = skimage.io.imread('image.jpg') - -# Apply the function to remove small elements from the image +# Remove small objects from the image image = remove_dirt(image) - -# Show the result -skimage.io.imshow(image) ``` -## `calculate_area(countour)` -This function calculates the area of a contour in an image. -Example: +### `calculate_area(countour)` +The `calculate_area` function calculates the area of a contour in an image using OpenCV. Here is an example of how to use the `calculate_area` function: -``` -# Import the required modules -import cv2 as cv +```python import numpy as np +import cv2 as cv -# Load the image and find the contours -image = cv.imread('image.jpg') -contours, _ = cv.findContours(image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) +# Load an image using some library (e.g. Pillow, OpenCV, etc.) +image = ... -# Iterate over the contours and calculate their areas +# Find contours in the image using OpenCV +contours = cv.findContours(image, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE) + +# Calculate the area of each contour for contour in contours: area = calculate_area(contour) - print('Area of contour:', area) + print(area) ``` -## `center_of_mass(X)` -This function calculates the center of mass of a set of points. -Example: +### `center_of_mass(X)` +The `center_of_mass` function calculates the center of mass of a 2D shape defined by a set of points. Here is an example of how to use the `center_of_mass` function: -``` +```python import numpy as np -# Define a set of points -X = np.array([[1,2], [3,4], [5,6]]) +# Define a set of points that define a shape +X = np.array([[0,0], [0,1], [1,1], [1,0]]) -# Calculate the center of mass of the points -center = center_of_mass(X) +# Calculate the center of mass of the shape +com = center_of_mass(X) -# Print the result -print('Center of mass:', center) +# Print the center of mass +print(com) ``` -The output will be `Center of mass: [3. 4.]`. +In this example, the output would be `[0.5, 0.5]`, which is the center of the square defined by the points `X`. -## `center_of_mass(X)` -This function calculates the center of mass of a set of points. -Example: +### `center_of_mass(X)` +The `center_of_mass` function calculates the center of mass of a 2D shape defined by a set of points. Here is an example of how to use the `center_of_mass` function: -``` +```python import numpy as np -# Define a set of points -X = np.array([[1,2], [3,4], [5,6]]) +# Define a set of points that define a shape +X = np.array([[0,0], [0,1], [1,1], [1,0]]) -# Calculate the center of mass of the points -center = center_of_mass(X) +# Calculate the center of mass of the shape +com = center_of_mass(X) -# Print the result -print('Center of mass:', center) +# Print the center of mass +print(com) ``` -The output will be `Center of mass: [3. 4.]`. +In this example, the output would be `[0.5, 0.5]`, which is the center of the square defined by the points `X`. -## `rg_ratio_normalize(imgarr)` -This function normalizes the temperature values in an image array using the RG ratio and a pyrometry calibration formula. -Example: +### `rg_ratio_normalize(imgarr)` +The `rg_ratio_normalize` function applies a normalization function to the red and green channels of a 2D image, then applies a camera calibration formula to the resulting normalized values and returns the resulting image. Here is an example of how to use the `rg_ratio_normalize` function: -``` -# Import the required modules +```python import numpy as np -# Load the image array -imgarr = np.array(...) +# Load an image using some library (e.g. Pillow, OpenCV, etc.) +image = ... -# Normalize the temperature values in the image +# Convert the image to a NumPy array +imgarr = np.array(image) + +# Apply the normalization and calibration to the image imgnew, tmin, tmax = rg_ratio_normalize(imgarr) -# Print the resulting minimum and maximum temperature values -print('Minimum temperature:', tmin) -print('Maximum temperature:', tmax) +# Print the minimum and maximum temperature values in the image +print(tmin, tmax) ``` + diff --git a/fmtutil/__init__.py b/fmtutil/__init__.py new file mode 100644 index 0000000..897cb5d --- /dev/null +++ b/fmtutil/__init__.py @@ -0,0 +1,29 @@ +import re + +ext_lang_map = { + "py": "python", + "java": "java", + "js": "javascript", + "cpp": "cpp", + "cxx": "cpp", + "hpp": "cpp", +} + + +def highlight_multiline_code_md(md_text: str, language_str: str) -> str: + """ + Highlight markdown-embedded code blocks. + """ + out = "" + in_code_block = False + for line in md_text.split("\n"): + if not in_code_block and re.search("^```(.*)$", line): + in_code_block = True + if line.strip() == "```": + line = f"```{language_str}" + elif in_code_block and line.strip() == "```": + in_code_block = False + + out += line + "\n" + + return out diff --git a/parse/js.py b/parse/js.py new file mode 100644 index 0000000..5e591b9 --- /dev/null +++ b/parse/js.py @@ -0,0 +1 @@ +# add later \ No newline at end of file