From c4af2750ac78b354a9c5d031d7bb259087ce24e0 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Fri, 8 Sep 2023 03:56:17 +1000 Subject: [PATCH 01/13] user_id defaults to OS username --- pilot/utils/arguments.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pilot/utils/arguments.py b/pilot/utils/arguments.py index b1f9b92..de334e4 100644 --- a/pilot/utils/arguments.py +++ b/pilot/utils/arguments.py @@ -1,3 +1,4 @@ +import getpass import os import re import sys @@ -38,7 +39,7 @@ def get_arguments(): arguments['app_id'] = str(uuid.uuid4()) if 'user_id' not in arguments: - arguments['user_id'] = str(uuid.uuid4()) + arguments['user_id'] = getpass.getuser() if 'email' not in arguments: arguments['email'] = get_email() From 8cec113df934ff3d2a9847abecd5681b4d31e4ec Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 10:46:03 +1000 Subject: [PATCH 02/13] test_username_to_uuid() --- pilot/utils/test_arguments.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pilot/utils/test_arguments.py b/pilot/utils/test_arguments.py index 3992826..f1844fc 100644 --- a/pilot/utils/test_arguments.py +++ b/pilot/utils/test_arguments.py @@ -1,7 +1,7 @@ import pytest from unittest.mock import patch, mock_open import uuid -from .arguments import get_email +from .arguments import get_email, username_to_uuid def test_email_found_in_gitconfig(): @@ -32,3 +32,7 @@ def test_gitconfig_not_present(): with patch('os.path.exists', return_value=False): with patch.object(uuid, "uuid4", return_value=mock_uuid): assert get_email() == mock_uuid + + +def test_username_to_uuid(): + assert username_to_uuid("test_user") == "31676025-316f-b555-e0bf-a12f0bcfd0ea" From f50eda55842fdbc2d521b16f762ef017ce5cd01f Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:06:17 +1000 Subject: [PATCH 03/13] quoted python version to avoid 3.10 being treated as 3.1 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e7e0f3..335731f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7, 3.8, 3.9, 3.10, 3.11] + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v2 From 310220b71989328ef90029871f011f0295a32079 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:12:41 +1000 Subject: [PATCH 04/13] python-dotenv does dropped support for python 3.7 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 335731f..f051b89 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v2 From 46b84315ecff04e8eb457bc0ac1a10a95bb1b363 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:16:11 +1000 Subject: [PATCH 05/13] get_step_code_changes() is undefined, commented out for now --- pilot/helpers/agents/Developer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pilot/helpers/agents/Developer.py b/pilot/helpers/agents/Developer.py index 47e4175..9ff9e60 100644 --- a/pilot/helpers/agents/Developer.py +++ b/pilot/helpers/agents/Developer.py @@ -259,7 +259,7 @@ class Developer(Agent): if type == 'COMMAND': for cmd in step_details: run_command_until_success(cmd['command'], cmd['timeout'], convo) - elif type == 'CODE_CHANGE': - code_changes_details = get_step_code_changes() + # elif type == 'CODE_CHANGE': + # code_changes_details = get_step_code_changes() # TODO: give to code monkey for implementation pass From c813d81d41057cbcefda37dff9400283c83b145f Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:43:38 +1000 Subject: [PATCH 06/13] tests should pass in CI --- .github/workflows/ci.yml | 5 +++-- pilot/logger/__init__.py | 0 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 pilot/logger/__init__.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f051b89..6c47fd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -33,11 +33,12 @@ jobs: pip install flake8 flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # stop the build if there are Python syntax errors or undefined names - #ruff --format=github --select=E9,F63,F7,F82 --target-version=py37 . + ruff --format=github --select=E9,F63,F7,F82 --target-version=py37 . # default set of ruff rules with GitHub Annotations #ruff --format=github --target-version=py37 . - name: Run tests run: | pip install pytest - pytest + cd pilot + PYTHONPATH=. pytest diff --git a/pilot/logger/__init__.py b/pilot/logger/__init__.py new file mode 100644 index 0000000..e69de29 From 3f36d04821d67545f7d10c8bab86aebba3fabef3 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:44:19 +1000 Subject: [PATCH 07/13] resolved deprecation warning --- pilot/database/models/architecture.py | 2 +- pilot/database/models/command_runs.py | 2 +- pilot/database/models/development.py | 2 +- pilot/database/models/development_planning.py | 2 +- pilot/database/models/development_steps.py | 2 +- pilot/database/models/environment_setup.py | 2 +- pilot/database/models/file_snapshot.py | 2 +- pilot/database/models/project_description.py | 2 +- pilot/database/models/user_apps.py | 2 +- pilot/database/models/user_inputs.py | 2 +- pilot/database/models/user_stories.py | 2 +- pilot/database/models/user_tasks.py | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pilot/database/models/architecture.py b/pilot/database/models/architecture.py index 261acb9..e806130 100644 --- a/pilot/database/models/architecture.py +++ b/pilot/database/models/architecture.py @@ -12,4 +12,4 @@ class Architecture(ProgressStep): architecture = JSONField() # Custom JSON field for SQLite class Meta: - db_table = 'architecture' + table_name = 'architecture' diff --git a/pilot/database/models/command_runs.py b/pilot/database/models/command_runs.py index b6c34c4..a6b55fb 100644 --- a/pilot/database/models/command_runs.py +++ b/pilot/database/models/command_runs.py @@ -13,7 +13,7 @@ class CommandRuns(BaseModel): previous_step = ForeignKeyField('self', null=True, column_name='previous_step') class Meta: - db_table = 'command_runs' + table_name = 'command_runs' indexes = ( (('app', 'hash_id'), True), ) \ No newline at end of file diff --git a/pilot/database/models/development.py b/pilot/database/models/development.py index dea5a7e..2d3faaa 100644 --- a/pilot/database/models/development.py +++ b/pilot/database/models/development.py @@ -5,4 +5,4 @@ from database.models.components.progress_step import ProgressStep class Development(ProgressStep): class Meta: - db_table = 'development' + table_name = 'development' diff --git a/pilot/database/models/development_planning.py b/pilot/database/models/development_planning.py index 8fe7a55..c5831a9 100644 --- a/pilot/database/models/development_planning.py +++ b/pilot/database/models/development_planning.py @@ -12,4 +12,4 @@ class DevelopmentPlanning(ProgressStep): development_plan = JSONField() # Custom JSON field for SQLite class Meta: - db_table = 'development_planning' + table_name = 'development_planning' diff --git a/pilot/database/models/development_steps.py b/pilot/database/models/development_steps.py index 6492a4d..aaf6b66 100644 --- a/pilot/database/models/development_steps.py +++ b/pilot/database/models/development_steps.py @@ -20,7 +20,7 @@ class DevelopmentSteps(BaseModel): previous_step = ForeignKeyField('self', null=True, column_name='previous_step') class Meta: - db_table = 'development_steps' + table_name = 'development_steps' indexes = ( (('app', 'hash_id'), True), ) diff --git a/pilot/database/models/environment_setup.py b/pilot/database/models/environment_setup.py index e34d609..1fe22b7 100644 --- a/pilot/database/models/environment_setup.py +++ b/pilot/database/models/environment_setup.py @@ -3,4 +3,4 @@ from database.models.components.progress_step import ProgressStep class EnvironmentSetup(ProgressStep): class Meta: - db_table = 'environment_setup' + table_name = 'environment_setup' diff --git a/pilot/database/models/file_snapshot.py b/pilot/database/models/file_snapshot.py index 9138a5f..68659f2 100644 --- a/pilot/database/models/file_snapshot.py +++ b/pilot/database/models/file_snapshot.py @@ -12,7 +12,7 @@ class FileSnapshot(BaseModel): content = TextField() class Meta: - db_table = 'file_snapshot' + table_name = 'file_snapshot' indexes = ( (('development_step', 'file'), True), ) \ No newline at end of file diff --git a/pilot/database/models/project_description.py b/pilot/database/models/project_description.py index 462c1a2..bb4b5ac 100644 --- a/pilot/database/models/project_description.py +++ b/pilot/database/models/project_description.py @@ -7,4 +7,4 @@ class ProjectDescription(ProgressStep): summary = TextField() class Meta: - db_table = 'project_description' + table_name = 'project_description' diff --git a/pilot/database/models/user_apps.py b/pilot/database/models/user_apps.py index d70672f..38aee23 100644 --- a/pilot/database/models/user_apps.py +++ b/pilot/database/models/user_apps.py @@ -12,7 +12,7 @@ class UserApps(BaseModel): workspace = CharField(null=True) class Meta: - db_table = 'user_apps' + table_name = 'user_apps' indexes = ( (('app', 'user'), True), ) diff --git a/pilot/database/models/user_inputs.py b/pilot/database/models/user_inputs.py index 7d2451c..8c83993 100644 --- a/pilot/database/models/user_inputs.py +++ b/pilot/database/models/user_inputs.py @@ -13,7 +13,7 @@ class UserInputs(BaseModel): previous_step = ForeignKeyField('self', null=True, column_name='previous_step') class Meta: - db_table = 'user_inputs' + table_name = 'user_inputs' indexes = ( (('app', 'hash_id'), True), ) \ No newline at end of file diff --git a/pilot/database/models/user_stories.py b/pilot/database/models/user_stories.py index 025e255..dd7e06a 100644 --- a/pilot/database/models/user_stories.py +++ b/pilot/database/models/user_stories.py @@ -11,4 +11,4 @@ class UserStories(ProgressStep): else: user_stories = JSONField() # Custom JSON field for SQLite class Meta: - db_table = 'user_stories' + table_name = 'user_stories' diff --git a/pilot/database/models/user_tasks.py b/pilot/database/models/user_tasks.py index 533340a..261de2d 100644 --- a/pilot/database/models/user_tasks.py +++ b/pilot/database/models/user_tasks.py @@ -12,4 +12,4 @@ class UserTasks(ProgressStep): user_tasks = JSONField() # Custom JSON field for SQLite class Meta: - db_table = 'user_tasks' + table_name = 'user_tasks' From 4b64631bec3f1c1281c734dc961378e1eeff14e3 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:50:55 +1000 Subject: [PATCH 08/13] linting --- .github/workflows/ci.yml | 2 +- pilot/utils/llm_connection.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6c47fd9..d04d6dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,7 +35,7 @@ jobs: # stop the build if there are Python syntax errors or undefined names ruff --format=github --select=E9,F63,F7,F82 --target-version=py37 . # default set of ruff rules with GitHub Annotations - #ruff --format=github --target-version=py37 . + #ruff --format=github --target-version=py37 --ignore=F401,E501 . - name: Run tests run: | diff --git a/pilot/utils/llm_connection.py b/pilot/utils/llm_connection.py index 97b9e23..7a0b55c 100644 --- a/pilot/utils/llm_connection.py +++ b/pilot/utils/llm_connection.py @@ -245,7 +245,7 @@ def stream_gpt_completion(data, req_type): if json_line['choices'][0]['finish_reason'] == 'function_call': function_calls['arguments'] = load_data_to_json(function_calls['arguments']) - return return_result({'function_calls': function_calls}, lines_printed); + return return_result({'function_calls': function_calls}, lines_printed) json_line = json_line['choices'][0]['delta'] From a38c7c4f6d7da03fec8ec5203fcc95a82d0d1779 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:54:16 +1000 Subject: [PATCH 09/13] linting --- pilot/main.py | 6 ++---- pilot/utils/arguments.py | 2 +- pilot/utils/llm_connection.py | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/pilot/main.py b/pilot/main.py index 751ea9a..8f4ab7c 100644 --- a/pilot/main.py +++ b/pilot/main.py @@ -2,18 +2,16 @@ from __future__ import print_function, unicode_literals import sys - from dotenv import load_dotenv from termcolor import colored -load_dotenv() - from helpers.Project import Project - from utils.arguments import get_arguments from utils.exit import exit_gpt_pilot from logger.logger import logger from database.database import database_exists, create_database, tables_exist, create_tables +load_dotenv() + def init(): # Check if the "euclid" database exists, if not, create it diff --git a/pilot/utils/arguments.py b/pilot/utils/arguments.py index cc7104c..e4409eb 100644 --- a/pilot/utils/arguments.py +++ b/pilot/utils/arguments.py @@ -53,7 +53,7 @@ def get_arguments(): else: arguments['app_id'] = str(uuid.uuid4()) print(colored('\n------------------ STARTING NEW PROJECT ----------------------', 'green', attrs=['bold'])) - print(f"If you wish to continue with this project in future run:") + print("If you wish to continue with this project in future run:") print(colored(f'python {sys.argv[0]} app_id={arguments["app_id"]}', 'green', attrs=['bold'])) print(colored('--------------------------------------------------------------\n', 'green', attrs=['bold'])) diff --git a/pilot/utils/llm_connection.py b/pilot/utils/llm_connection.py index 7a0b55c..72167f2 100644 --- a/pilot/utils/llm_connection.py +++ b/pilot/utils/llm_connection.py @@ -118,7 +118,7 @@ def create_gpt_chat_completion(messages: List[dict], req_type, min_tokens=MIN_TO # Check if the error message is related to token limit if "context_length_exceeded" in error_message.lower(): - raise Exception(f'Too many tokens in the request. Please try to continue the project with some previous development step.') + raise Exception('Too many tokens in the request. Please try to continue the project with some previous development step.') else: print('The request to OpenAI API failed. Here is the error message:') print(e) @@ -157,7 +157,7 @@ def retry_on_exception(func): time.sleep(wait_duration) continue - print(colored(f'There was a problem with request to openai API:', 'red')) + print(colored('There was a problem with request to openai API:', 'red')) print(err_str) user_message = questionary.text( From 0a4d13e65caafde31096eb975edd770a4e8d8b25 Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 11:56:05 +1000 Subject: [PATCH 10/13] install ruff --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d04d6dd..119b17c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,7 +30,7 @@ jobs: - name: Lint run: | - pip install flake8 + pip install flake8 ruff flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # stop the build if there are Python syntax errors or undefined names ruff --format=github --select=E9,F63,F7,F82 --target-version=py37 . From f2187b5a04a2133ad6bac15e3abf15ca746322fd Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 12:02:22 +1000 Subject: [PATCH 11/13] fixed tests for CI --- pilot/utils/test_arguments.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pilot/utils/test_arguments.py b/pilot/utils/test_arguments.py index f1844fc..25998e3 100644 --- a/pilot/utils/test_arguments.py +++ b/pilot/utils/test_arguments.py @@ -10,8 +10,9 @@ def test_email_found_in_gitconfig(): name = test_user email = test@example.com """ - with patch('builtins.open', mock_open(read_data=mock_file_content)): - assert get_email() == "test@example.com" + with patch('os.path.exists', return_value=True): + with patch('builtins.open', mock_open(read_data=mock_file_content)): + assert get_email() == "test@example.com" def test_email_not_found_in_gitconfig(): @@ -21,9 +22,10 @@ def test_email_not_found_in_gitconfig(): """ mock_uuid = "12345678-1234-5678-1234-567812345678" - with patch('builtins.open', mock_open(read_data=mock_file_content)): - with patch.object(uuid, "uuid4", return_value=mock_uuid): - assert get_email() == mock_uuid + with patch('os.path.exists', return_value=True): + with patch('builtins.open', mock_open(read_data=mock_file_content)): + with patch.object(uuid, "uuid4", return_value=mock_uuid): + assert get_email() == mock_uuid def test_gitconfig_not_present(): From 026eb69f2c3b071a28b6fda18f4fd2dcfb6a101d Mon Sep 17 00:00:00 2001 From: Nicholas Albion Date: Sat, 9 Sep 2023 12:05:21 +1000 Subject: [PATCH 12/13] actions/checkout@v4 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 119b17c..c22a440 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: python-version: ['3.8', '3.9', '3.10', '3.11'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 From b780a9f19cfef2f9d37aa0fb2eb377a378f85984 Mon Sep 17 00:00:00 2001 From: LeonOstrez <41999013+LeonOstrez@users.noreply.github.com> Date: Sat, 9 Sep 2023 09:53:48 +0200 Subject: [PATCH 13/13] load environment asap so that other files have it available --- pilot/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pilot/main.py b/pilot/main.py index 8f4ab7c..d4f9a84 100644 --- a/pilot/main.py +++ b/pilot/main.py @@ -3,6 +3,7 @@ from __future__ import print_function, unicode_literals import sys from dotenv import load_dotenv +load_dotenv() from termcolor import colored from helpers.Project import Project from utils.arguments import get_arguments @@ -10,8 +11,6 @@ from utils.exit import exit_gpt_pilot from logger.logger import logger from database.database import database_exists, create_database, tables_exist, create_tables -load_dotenv() - def init(): # Check if the "euclid" database exists, if not, create it