From f4f018b36fd70fe3b6ce603f0c97b7001c24895c Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 17 Mar 2024 18:14:17 +0000 Subject: [PATCH 01/72] Refactor CLI module and add cache directory creation --- senior_swe_ai/cli.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 739c829..838be58 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -1,9 +1,9 @@ """ SeniorSWE cli tool utilize AI to help you with your project """ from argparse import ArgumentParser, Namespace import sys -from typing import Any from senior_swe_ai.git_process import is_git_repo, get_repo_name, get_repo_root from senior_swe_ai.conf import config_init, load_conf, append_conf +from senior_swe_ai.cache import create_cache_dir def main() -> None: @@ -34,12 +34,14 @@ def main() -> None: append_conf({'repo_name': repo_name, 'repo_root': repo_root}) try: - conf: dict[Any, Any] = load_conf() + conf: dict[str, str] = load_conf() except FileNotFoundError: config_init() append_conf({'repo_name': repo_name, 'repo_root': repo_root}) conf = load_conf() + create_cache_dir() + if __name__ == '__main__': main() From 40ec7112250be248458cfade51850855b4a8f8d0 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:02:31 +0000 Subject: [PATCH 02/72] Add OpenAIEmbeddings and recursive_load_files functions --- senior_swe_ai/cli.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 838be58..c9e0574 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -1,9 +1,13 @@ """ SeniorSWE cli tool utilize AI to help you with your project """ from argparse import ArgumentParser, Namespace +import os import sys -from senior_swe_ai.git_process import is_git_repo, get_repo_name, get_repo_root +from langchain_openai import OpenAIEmbeddings +from senior_swe_ai.git_process import ( + is_git_repo, get_repo_name, get_repo_root, recursive_load_files +) from senior_swe_ai.conf import config_init, load_conf, append_conf -from senior_swe_ai.cache import create_cache_dir +from senior_swe_ai.cache import create_cache_dir, get_cache_path def main() -> None: @@ -42,6 +46,14 @@ def main() -> None: create_cache_dir() + embed_mdl = OpenAIEmbeddings( + model=conf['embed_model'], api_key=conf['api_key']) + + if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): + # all files in the git repository + files: list[str] = recursive_load_files() + + if __name__ == '__main__': main() From 112e82e8c9e3ecf3283798a88d6cd2e7a2c7b42d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:02:35 +0000 Subject: [PATCH 03/72] Add enums and lists for file and directory exclusions --- senior_swe_ai/consts.py | 114 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/senior_swe_ai/consts.py b/senior_swe_ai/consts.py index 7969f5d..11bf492 100644 --- a/senior_swe_ai/consts.py +++ b/senior_swe_ai/consts.py @@ -26,3 +26,117 @@ class EmbeddingsModel(Enum): """ Enum for supported embeddings models.""" OPENAI_TEXT_EMBEDDING_ADA_002 = "text-embedding-ada-002" OPENAI_TEXT_EMBEDDING_3_SMALL = "text-embedding-3-small" + + +class FaissModel(Enum): + """ Enum for supported faiss models.""" + FAISS_CPU = "faiss-cpu" + FAISS_GPU = "faiss-gpu" + + +EXCLUDE_DIRS: list[str] = [ + "__pycache__", + ".pytest_cache", + ".venv", + ".git", + ".idea", + "venv", + "env", + "node_modules", + "dist", + "build", + ".vscode", + ".github", + ".gitlab", + ".angular", + "cdk.out", + ".aws-sam", + ".terraform", + ".mypy_cache", + ".hypothesis", + ".junit", + ".metals", + ".bloop", + ".sbt", + ".dotty", + ".gradle", + ".mvn", + ".ccls-cache", + ".cmake", + ".stack-work", + ".cabal-sandbox", + ".cargo", + ".gogradle", + ".gocache", +] + +EXCLUDE_FILES: list[str] = [ + "package-lock.json", + "package.json", + "__init__.py", + ".gitignore", + ".gitattributes", + "yarn.lock", + "requirements.txt", + "setup.py", + "Dockerfile", + "docker-compose.yml", + "Makefile", + "README.md", + "LICENSE", + ".travis.yml", + ".babelrc", + ".eslintrc.js", + ".prettierrc", + "tsconfig.json", + "webpack.config.js", + "pom.xml", + "build.gradle", + "Cargo.toml", + "Cargo.lock", + "go.mod", + "go.sum", + "Gemfile", + "Gemfile.lock", + "Rakefile", + "composer.json", + "composer.lock", +] + +INCLUDE_FILES: list[str] = [ + ".js", + ".mjs", + ".ts", + ".tsx", + ".css", + ".scss", + ".less", + ".html", + ".htm", + ".json", + ".py", + ".java", + ".c", + ".cpp", + ".cs", + ".go", + ".php", + ".rb", + ".rs", + ".swift", + ".kt", + ".scala", + ".m", + ".h", + ".sh", + ".pl", + ".pm", + ".lua", + ".sql", + ".yaml", + ".yml", + ".rst", + ".md", + ".hs", + ".rb", +] From 7c8f75ab730afea800ca5abb61ff32602c78d2fd Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 17 Mar 2024 23:02:53 +0000 Subject: [PATCH 04/72] Add recursive_load_files function to load all files in the git repository --- senior_swe_ai/git_process.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/senior_swe_ai/git_process.py b/senior_swe_ai/git_process.py index 1676bb4..b454411 100644 --- a/senior_swe_ai/git_process.py +++ b/senior_swe_ai/git_process.py @@ -1,5 +1,7 @@ """ This module contains functions to interact with git repositories. """ +import os import subprocess +from senior_swe_ai.consts import EXCLUDE_DIRS, EXCLUDE_FILES, INCLUDE_FILES def is_git_repo() -> bool: @@ -23,3 +25,20 @@ def get_repo_name() -> str: return subprocess.run( ["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True ).stdout.strip().split('/')[-1] + + +def recursive_load_files() -> list[str]: + """ Load all files in the git repository """ + git_root: str = get_repo_root() + file_list: list = [] + + for root, _, files in os.walk(git_root): + if any(blacklist in root for blacklist in EXCLUDE_DIRS): + continue + for file in files: + file_ext: str = os.path.splitext(file)[1] + if any(whitelist == file_ext for whitelist in INCLUDE_FILES): + if file not in EXCLUDE_FILES: + file_list.append(os.path.join(root, file)) + + return file_list From 5906ca0a75aced491377a4f50bc682666c658d9a Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:07:17 +0000 Subject: [PATCH 05/72] Update function to handle edge cases --- poetry.lock | 125 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 118 insertions(+), 7 deletions(-) diff --git a/poetry.lock b/poetry.lock index cde2530..bdafcc7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -137,6 +137,16 @@ files = [ runs = "*" xmod = "*" +[[package]] +name = "esprima" +version = "4.0.1" +description = "ECMAScript parsing infrastructure for multipurpose analysis in Python" +optional = false +python-versions = "*" +files = [ + {file = "esprima-4.0.1.tar.gz", hash = "sha256:08db1a876d3c2910db9cfaeb83108193af5411fc3a3a66ebefacd390d21323ee"}, +] + [[package]] name = "exceptiongroup" version = "1.2.0" @@ -286,13 +296,13 @@ files = [ [[package]] name = "openai" -version = "1.14.0" +version = "1.14.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.14.0-py3-none-any.whl", hash = "sha256:5c9fd3a59f5cbdb4020733ddf79a22f6b7a36d561968cb3f3dd255cdd263d9fe"}, - {file = "openai-1.14.0.tar.gz", hash = "sha256:e287057adf0ec3315abc32ddcc968d095879abd9b68bf51c0402dab13ab5ae9b"}, + {file = "openai-1.14.1-py3-none-any.whl", hash = "sha256:f9322b0bf3b82bbd06930fad535369a023f35a3a96d3ef0b827644a15d7aae97"}, + {file = "openai-1.14.1.tar.gz", hash = "sha256:1fab5dd623cdc0c7c6e7da5d8d11fa6900f94191c2dfb6510d7eac33195fa175"}, ] [package.dependencies] @@ -474,14 +484,14 @@ astroid = ">=3.1.0,<=3.2.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, - {version = ">=0.3.7", markers = "python_version >= \"3.12\""}, - {version = ">=0.3.6", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, ] isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] spelling = ["pyenchant (>=3.2,<4.0)"] @@ -645,6 +655,107 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "tree-sitter" +version = "0.21.0" +description = "Python bindings for the Tree-Sitter parsing library" +optional = false +python-versions = "<3.12,>=3.8" +files = [ + {file = "tree-sitter-0.21.0.tar.gz", hash = "sha256:c74ec9eff30e0c5b9f00ee578cca64df322b9885c8a15364a2c537f485abcc77"}, + {file = "tree_sitter-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb334076814909e8b1f22aba5128a07a953e9eacfd269d3e4f1819cf2b290f5b"}, + {file = "tree_sitter-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8da1b036a13a5b1e7e499535060137f0127a05a0b63aec2b7e9992f27e1b0b2e"}, + {file = "tree_sitter-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcae2748f9d210370fca00fff95f7516e49953e60b4919bf42de64906417717"}, + {file = "tree_sitter-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca8f27570acb03a06fc3b663e4ebf1d224c442846ed3837a518b044bad20582b"}, + {file = "tree_sitter-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:d78e2cf597f6e54bbfe27beae5dae6cde290d934753cb1a00d8b12d66f2034d8"}, + {file = "tree_sitter-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:384c103edf6e5ac98710c1a71e2956849d692a0c47d55cd5ba3aedc000b7c3d6"}, + {file = "tree_sitter-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ce18b46634a4132c6932e032ea4717e572cf0db40223afcf0eab69664ad3500"}, + {file = "tree_sitter-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e2f0723c025bb532e9a0cad5e1b1f99b6e35049b948321c3ad7617be716bc7a"}, + {file = "tree_sitter-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63458f19b266d9ec58057d8435f92728a164a6debc24fb3c545664bc0b4fa087"}, + {file = "tree_sitter-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:f308f7d05019c35d43ea609c1f04ed896fd713ddf5c95db92b3c56dbbd3c1e09"}, + {file = "tree_sitter-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ab516edce67cd201312ecd55b65b195ce118ab900cc649fc868a1185e462a9bc"}, + {file = "tree_sitter-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ef283479cb0d5c37f4c8e6cefa6e28d4de9a1eb858b43e964c4e822282394300"}, + {file = "tree_sitter-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3310284a92d326d050cef385b4f6611a2166fbf04b2789fd87f279bfe939d6cb"}, + {file = "tree_sitter-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:46539b86c01463d4d5ac7b4834300504218f79e359fb496e0c4da40c24ddb167"}, + {file = "tree_sitter-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:eb89b951958c26f902ea3ae32f5d899ca9231d1aea64823d634f71e77af41b11"}, + {file = "tree_sitter-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72e109678704785cf75682edae5265106d9d13b5b146c2f6a5cd2ea0ed293e9c"}, + {file = "tree_sitter-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8eae679c13f519ae4437610f5d7a3a849b401f61d0bc08ad0ee580d4102387"}, + {file = "tree_sitter-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a9d007426365f3c027ef50c68ac03ab0b777ca6e613bfe921474ed69ad8ea1f"}, + {file = "tree_sitter-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:348df964896bc34ec4c55d45d052decbc0ec6519624bd15f2e31580477be5d6d"}, + {file = "tree_sitter-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:55307318d10325ebafb51025cb630663f61172855f43c4054942a4ba69d4f11c"}, +] + +[[package]] +name = "tree-sitter-languages" +version = "1.10.2" +description = "Binary Python wheels for all tree sitter languages." +optional = false +python-versions = "*" +files = [ + {file = "tree_sitter_languages-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5580348f0b20233b1d5431fa178ccd3d07423ca4a3275df02a44608fd72344b9"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:103c7466644486b1e9e03850df46fc6aa12f13ca636c74f173270276220ac80b"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d13db84511c6f1a7dc40383b66deafa74dabd8b877e3d65ab253f3719eccafd6"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57adfa32be7e465b54aa72f915f6c78a2b66b227df4f656b5d4fbd1ca7a92b3f"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c6385e033e460ceb8f33f3f940335f422ef2b763700a04f0089391a68b56153"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dfa3f38cc5381c5aba01dd7494f59b8a9050e82ff6e06e1233e3a0cbae297e3c"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:9f195155acf47f8bc5de7cee46ecd07b2f5697f007ba89435b51ef4c0b953ea5"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2de330e2ac6d7426ca025a3ec0f10d5640c3682c1d0c7702e812dcfb44b58120"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-win32.whl", hash = "sha256:c9731cf745f135d9770eeba9bb4e2ff4dabc107b5ae9b8211e919f6b9100ea6d"}, + {file = "tree_sitter_languages-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:6dd75851c41d0c3c4987a9b7692d90fa8848706c23115669d8224ffd6571e357"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7eb7d7542b2091c875fe52719209631fca36f8c10fa66970d2c576ae6a1b8289"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b41bcb00974b1c8a1800c7f1bb476a1d15a0463e760ee24872f2d53b08ee424"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f370cd7845c6c81df05680d5bd96db8a99d32b56f4728c5d05978911130a853"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1dc195c88ef4c72607e112a809a69190e096a2e5ebc6201548b3e05fdd169ad"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae34ac314a7170be24998a0f994c1ac80761d8d4bd126af27ee53a023d3b849"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:01b5742d5f5bd675489486b582bd482215880b26dde042c067f8265a6e925d9c"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ab1cbc46244d34fd16f21edaa20231b2a57f09f092a06ee3d469f3117e6eb954"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b1149e7467a4e92b8a70e6005fe762f880f493cf811fc003554b29f04f5e7c8"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-win32.whl", hash = "sha256:049276343962f4696390ee555acc2c1a65873270c66a6cbe5cb0bca83bcdf3c6"}, + {file = "tree_sitter_languages-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:7f3fdd468a577f04db3b63454d939e26e360229b53c80361920aa1ebf2cd7491"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c0f4c8b2734c45859edc7fcaaeaab97a074114111b5ba51ab4ec7ed52104763c"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:eecd3c1244ac3425b7a82ba9125b4ddb45d953bbe61de114c0334fd89b7fe782"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15db3c8510bc39a80147ee7421bf4782c15c09581c1dc2237ea89cefbd95b846"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92c6487a6feea683154d3e06e6db68c30e0ae749a7ce4ce90b9e4e46b78c85c7"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2f1cd1d1bdd65332f9c2b67d49dcf148cf1ded752851d159ac3e5ee4f4d260"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:976c8039165b8e12f17a01ddee9f4e23ec6e352b165ad29b44d2bf04e2fbe77e"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:dafbbdf16bf668a580902e1620f4baa1913e79438abcce721a50647564c687b9"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1aeabd3d60d6d276b73cd8f3739d595b1299d123cc079a317f1a5b3c5461e2ca"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-win32.whl", hash = "sha256:fab8ee641914098e8933b87ea3d657bea4dd00723c1ee7038b847b12eeeef4f5"}, + {file = "tree_sitter_languages-1.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:5e606430d736367e5787fa5a7a0c5a1ec9b85eded0b3596bbc0d83532a40810b"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:838d5b48a7ed7a17658721952c77fda4570d2a069f933502653b17e15a9c39c9"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b3c71b1d278c2889e018ee77b8ee05c384e2e3334dec798f8b611c4ab2d1e"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faa00abcb2c819027df58472da055d22fa7dfcb77c77413d8500c32ebe24d38b"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e102fbbf02322d9201a86a814e79a9734ac80679fdb9682144479044f401a73"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0b87cf1a7b03174ba18dfd81582be82bfed26803aebfe222bd20e444aba003"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c0f1b9af9cb67f0b942b020da9fdd000aad5e92f2383ae0ba7a330b318d31912"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5a4076c921f7a4d31e643843de7dfe040b65b63a238a5aa8d31d93aabe6572aa"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-win32.whl", hash = "sha256:fa6391a3a5d83d32db80815161237b67d70576f090ce5f38339206e917a6f8bd"}, + {file = "tree_sitter_languages-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:55649d3f254585a064121513627cf9788c1cfdadbc5f097f33d5ba750685a4c0"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f85d1edaa2d22d80d4ea5b6d12b95cf3644017b6c227d0d42854439e02e8893"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d78feed4a764ef3141cb54bf00fe94d514d8b6e26e09423e23b4c616fcb7938c"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1aca27531f9dd5308637d76643372856f0f65d0d28677d1bcf4211e8ed1ad0"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1031ea440dafb72237437d754eff8940153a3b051e3d18932ac25e75ce060a15"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99d3249beaef2c9fe558ecc9a97853c260433a849dcc68266d9770d196c2e102"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:59a4450f262a55148fb7e68681522f0c2a2f6b7d89666312a2b32708d8f416e1"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ce74eab0e430370d5e15a96b6c6205f93405c177a8b2e71e1526643b2fb9bab1"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9b4dd2b6b3d24c85dffe33d6c343448869eaf4f41c19ddba662eb5d65d8808f4"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-win32.whl", hash = "sha256:92d734fb968fe3927a7596d9f0459f81a8fa7b07e16569476b28e27d0d753348"}, + {file = "tree_sitter_languages-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:46a13f7d38f2eeb75f7cf127d1201346093748c270d686131f0cbc50e42870a1"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f8c6a936ae99fdd8857e91f86c11c2f5e507ff30631d141d98132bb7ab2c8638"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c283a61423f49cdfa7b5a5dfbb39221e3bd126fca33479cd80749d4d7a6b7349"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e60be6bdcff923386a54a5edcb6ff33fc38ab0118636a762024fa2bc98de55"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c00069f9575bd831eabcce2cdfab158dde1ed151e7e5614c2d985ff7d78a7de1"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:475ff53203d8a43ccb19bb322fa2fb200d764001cc037793f1fadd714bb343da"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26fe7c9c412e4141dea87ea4b3592fd12e385465b5bdab106b0d5125754d4f60"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8fed27319957458340f24fe14daad467cd45021da034eef583519f83113a8c5e"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3657a491a7f96cc75a3568ddd062d25f3be82b6a942c68801a7b226ff7130181"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-win32.whl", hash = "sha256:33f7d584d01a7a3c893072f34cfc64ec031f3cfe57eebc32da2f8ac046e101a7"}, + {file = "tree_sitter_languages-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:1b944af3ee729fa70fc8ae82224a9ff597cdb63addea084e0ea2fa2b0ec39bb7"}, +] + +[package.dependencies] +tree-sitter = "*" + [[package]] name = "typing-extensions" version = "4.10.0" @@ -680,5 +791,5 @@ files = [ [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "229e97db5442770924ef58e833164947a61aa0742bc0d645fb93330a199b51ca" +python-versions = ">=3.9.1,<3.12" +content-hash = "a42215fcea435b02f27db6f271e2114a440741d284ac0c93585c13027ae662ca" From aa7f7b0df700563831b4a48ae2259bb2dfdd53dc Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:07:23 +0000 Subject: [PATCH 06/72] Update python version and add new dependencies --- pyproject.toml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 4eadb6a..ad20dd2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,10 +6,13 @@ authors = ["Younis <23105954+Younis-Ahmed@users.noreply.github.com>"] readme = "README.md" [tool.poetry.dependencies] -python = "^3.10" +python = ">=3.9.1,<3.12" inquirer = "^3.2.4" openai = "^1.14.0" toml = "^0.10.2" +esprima = "^4.0.1" +tree-sitter = "^0.21.0" +tree-sitter-languages = "^1.10.2" [tool.poetry.group.dev.dependencies] From 45ca2da399811293754bbcc396dd00516a8f7d27 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:07:29 +0000 Subject: [PATCH 07/72] Add Python version check in main function --- senior_swe_ai/cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index c9e0574..084822a 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -12,6 +12,11 @@ def main() -> None: """ __main__ """ + py_version: tuple[int, int] = sys.version_info[:2] + if py_version < (3, 9) or py_version > (3, 12): + print('This app requires Python ^3.9.x or >3.12.x') + sys.exit(1) + parser = ArgumentParser( description='SeniorSWE cli tool utilize AI to help you with your project' ) @@ -52,7 +57,6 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): # all files in the git repository files: list[str] = recursive_load_files() - if __name__ == '__main__': From 6f2a277e14862abb869b3cbe8454132e30b56474 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:53:06 +0000 Subject: [PATCH 08/72] add langchain and sibling packages --- poetry.lock | 1288 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1284 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index bdafcc7..02077a8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,115 @@ # This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +[[package]] +name = "aiohttp" +version = "3.9.3" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, + {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, + {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, + {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, + {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, + {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, + {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, + {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, + {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, + {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, + {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, + {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, + {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, + {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, + {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, + {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, + {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, + {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, + {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, + {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, + {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, + {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, + {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, + {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, + {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, + {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, + {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + [[package]] name = "annotated-types" version = "0.6.0" @@ -58,6 +168,36 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + [[package]] name = "blessed" version = "1.20.0" @@ -85,6 +225,105 @@ files = [ {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + [[package]] name = "colorama" version = "0.4.6" @@ -96,6 +335,21 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "dataclasses-json" +version = "0.6.4" +description = "Easily serialize dataclasses to and from JSON." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dataclasses_json-0.6.4-py3-none-any.whl", hash = "sha256:f90578b8a3177f7552f4e1a6e535e84293cd5da421fcce0642d49c0d7bdf8df2"}, + {file = "dataclasses_json-0.6.4.tar.gz", hash = "sha256:73696ebf24936560cca79a2430cbc4f3dd23ac7bf46ed17f38e5e5e7657a6377"}, +] + +[package.dependencies] +marshmallow = ">=3.18.0,<4.0.0" +typing-inspect = ">=0.4.0,<1" + [[package]] name = "dill" version = "0.3.8" @@ -161,6 +415,163 @@ files = [ [package.extras] test = ["pytest (>=6)"] +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "greenlet" +version = "3.0.3" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c"}, + {file = "greenlet-3.0.3-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7"}, + {file = "greenlet-3.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6"}, + {file = "greenlet-3.0.3-cp37-cp37m-win32.whl", hash = "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d"}, + {file = "greenlet-3.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67"}, + {file = "greenlet-3.0.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b"}, + {file = "greenlet-3.0.3-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5"}, + {file = "greenlet-3.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da"}, + {file = "greenlet-3.0.3-cp38-cp38-win32.whl", hash = "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3"}, + {file = "greenlet-3.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + [[package]] name = "h11" version = "0.14.0" @@ -283,6 +694,190 @@ files = [ [package.dependencies] ansicon = {version = "*", markers = "platform_system == \"Windows\""} +[[package]] +name = "jsonpatch" +version = "1.33" +description = "Apply JSON-Patches (RFC 6902)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade"}, + {file = "jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c"}, +] + +[package.dependencies] +jsonpointer = ">=1.9" + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "langchain" +version = "0.1.12" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain-0.1.12-py3-none-any.whl", hash = "sha256:b4dd1760e2d035daefad08af60a209b96b729ee45492d34e3e127e553a471034"}, + {file = "langchain-0.1.12.tar.gz", hash = "sha256:5f612761ba548b81748ed8dc70535e8de0531445415028a82de3fd8255bfa8a3"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +async-timeout = {version = ">=4.0.0,<5.0.0", markers = "python_version < \"3.11\""} +dataclasses-json = ">=0.5.7,<0.7" +jsonpatch = ">=1.33,<2.0" +langchain-community = ">=0.0.28,<0.1" +langchain-core = ">=0.1.31,<0.2.0" +langchain-text-splitters = ">=0.0.1,<0.1" +langsmith = ">=0.1.17,<0.2.0" +numpy = ">=1,<2" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +azure = ["azure-ai-formrecognizer (>=3.2.1,<4.0.0)", "azure-ai-textanalytics (>=5.3.0,<6.0.0)", "azure-cognitiveservices-speech (>=1.28.0,<2.0.0)", "azure-core (>=1.26.4,<2.0.0)", "azure-cosmos (>=4.4.0b1,<5.0.0)", "azure-identity (>=1.12.0,<2.0.0)", "azure-search-documents (==11.4.0b8)", "openai (<2)"] +clarifai = ["clarifai (>=9.1.0)"] +cli = ["typer (>=0.9.0,<0.10.0)"] +cohere = ["cohere (>=4,<5)"] +docarray = ["docarray[hnswlib] (>=0.32.0,<0.33.0)"] +embeddings = ["sentence-transformers (>=2,<3)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cohere (>=4,<5)", "couchbase (>=4.1.9,<5.0.0)", "dashvector (>=1.0.1,<2.0.0)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "langchain-openai (>=0.0.2,<0.1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)"] +javascript = ["esprima (>=4.0.1,<5.0.0)"] +llms = ["clarifai (>=9.1.0)", "cohere (>=4,<5)", "huggingface_hub (>=0,<1)", "manifest-ml (>=0.0.1,<0.0.2)", "nlpcloud (>=1,<2)", "openai (<2)", "openlm (>=0.0.5,<0.0.6)", "torch (>=1,<3)", "transformers (>=4,<5)"] +openai = ["openai (<2)", "tiktoken (>=0.3.2,<0.6.0)"] +qdrant = ["qdrant-client (>=1.3.1,<2.0.0)"] +text-helpers = ["chardet (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langchain-community" +version = "0.0.28" +description = "Community contributed LangChain integrations." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_community-0.0.28-py3-none-any.whl", hash = "sha256:bdb015ac455ae68432ea104628717583dce041e1abdfcefe86e39f034f5e90b8"}, + {file = "langchain_community-0.0.28.tar.gz", hash = "sha256:8664d243a90550fc5ddc137b712034e02c8d43afc8d4cc832ba5842b44c864ce"}, +] + +[package.dependencies] +aiohttp = ">=3.8.3,<4.0.0" +dataclasses-json = ">=0.5.7,<0.7" +langchain-core = ">=0.1.31,<0.2.0" +langsmith = ">=0.1.0,<0.2.0" +numpy = ">=1,<2" +PyYAML = ">=5.3" +requests = ">=2,<3" +SQLAlchemy = ">=1.4,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +cli = ["typer (>=0.9.0,<0.10.0)"] +extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15.0,<3.0.0)", "anthropic (>=0.3.11,<0.4.0)", "arxiv (>=1.4,<2.0)", "assemblyai (>=0.17.0,<0.18.0)", "atlassian-python-api (>=3.36.0,<4.0.0)", "azure-ai-documentintelligence (>=1.0.0b1,<2.0.0)", "beautifulsoup4 (>=4,<5)", "bibtexparser (>=1.4.0,<2.0.0)", "cassio (>=0.1.0,<0.2.0)", "chardet (>=5.1.0,<6.0.0)", "cloudpickle (>=2.0.0)", "cohere (>=4,<5)", "databricks-vectorsearch (>=0.21,<0.22)", "datasets (>=2.15.0,<3.0.0)", "dgml-utils (>=0.3.0,<0.4.0)", "elasticsearch (>=8.12.0,<9.0.0)", "esprima (>=4.0.1,<5.0.0)", "faiss-cpu (>=1,<2)", "feedparser (>=6.0.10,<7.0.0)", "fireworks-ai (>=0.9.0,<0.10.0)", "friendli-client (>=1.2.4,<2.0.0)", "geopandas (>=0.13.1,<0.14.0)", "gitpython (>=3.1.32,<4.0.0)", "google-cloud-documentai (>=2.20.1,<3.0.0)", "gql (>=3.4.1,<4.0.0)", "gradientai (>=1.4.0,<2.0.0)", "hdbcli (>=2.19.21,<3.0.0)", "hologres-vector (>=0.0.6,<0.0.7)", "html2text (>=2020.1.16,<2021.0.0)", "httpx (>=0.24.1,<0.25.0)", "javelin-sdk (>=0.1.8,<0.2.0)", "jinja2 (>=3,<4)", "jq (>=1.4.1,<2.0.0)", "jsonschema (>1)", "lxml (>=4.9.2,<5.0.0)", "markdownify (>=0.11.6,<0.12.0)", "motor (>=3.3.1,<4.0.0)", "msal (>=1.25.0,<2.0.0)", "mwparserfromhell (>=0.6.4,<0.7.0)", "mwxml (>=0.3.3,<0.4.0)", "newspaper3k (>=0.2.8,<0.3.0)", "numexpr (>=2.8.6,<3.0.0)", "nvidia-riva-client (>=2.14.0,<3.0.0)", "oci (>=2.119.1,<3.0.0)", "openai (<2)", "openapi-pydantic (>=0.3.2,<0.4.0)", "oracle-ads (>=2.9.1,<3.0.0)", "pandas (>=2.0.1,<3.0.0)", "pdfminer-six (>=20221105,<20221106)", "pgvector (>=0.1.6,<0.2.0)", "praw (>=7.7.1,<8.0.0)", "psychicapi (>=0.8.0,<0.9.0)", "py-trello (>=0.19.0,<0.20.0)", "pymupdf (>=1.22.3,<2.0.0)", "pypdf (>=3.4.0,<4.0.0)", "pypdfium2 (>=4.10.0,<5.0.0)", "pyspark (>=3.4.0,<4.0.0)", "rank-bm25 (>=0.2.2,<0.3.0)", "rapidfuzz (>=3.1.1,<4.0.0)", "rapidocr-onnxruntime (>=1.3.2,<2.0.0)", "rdflib (==7.0.0)", "requests-toolbelt (>=1.0.0,<2.0.0)", "rspace_client (>=2.5.0,<3.0.0)", "scikit-learn (>=1.2.2,<2.0.0)", "sqlite-vss (>=0.1.2,<0.2.0)", "streamlit (>=1.18.0,<2.0.0)", "sympy (>=1.12,<2.0)", "telethon (>=1.28.5,<2.0.0)", "tidb-vector (>=0.0.3,<1.0.0)", "timescale-vector (>=0.0.1,<0.0.2)", "tqdm (>=4.48.0)", "tree-sitter (>=0.20.2,<0.21.0)", "tree-sitter-languages (>=1.8.0,<2.0.0)", "upstash-redis (>=0.15.0,<0.16.0)", "xata (>=1.0.0a7,<2.0.0)", "xmltodict (>=0.13.0,<0.14.0)", "zhipuai (>=1.0.7,<2.0.0)"] + +[[package]] +name = "langchain-core" +version = "0.1.32" +description = "Building applications with LLMs through composability" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_core-0.1.32-py3-none-any.whl", hash = "sha256:192aecdee6216af19b596ec18e7be3da0b9ecb9083eec263e02b68125737245d"}, + {file = "langchain_core-0.1.32.tar.gz", hash = "sha256:d62683becbf20f51f12875791a042320f45eaa0c87a267d30bc03bc1a07f5ec2"}, +] + +[package.dependencies] +anyio = ">=3,<5" +jsonpatch = ">=1.33,<2.0" +langsmith = ">=0.1.0,<0.2.0" +packaging = ">=23.2,<24.0" +pydantic = ">=1,<3" +PyYAML = ">=5.3" +requests = ">=2,<3" +tenacity = ">=8.1.0,<9.0.0" + +[package.extras] +extended-testing = ["jinja2 (>=3,<4)"] + +[[package]] +name = "langchain-openai" +version = "0.0.8" +description = "An integration package connecting OpenAI and LangChain" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_openai-0.0.8-py3-none-any.whl", hash = "sha256:4862fc72cecbee0240aaa6df0234d5893dd30cd33ca23ac5cfdd86c11d2c44df"}, + {file = "langchain_openai-0.0.8.tar.gz", hash = "sha256:b7aba7fcc52305e78b08197ebc54fc45cc06dbc40ba5b913bc48a22b30a4f5c9"}, +] + +[package.dependencies] +langchain-core = ">=0.1.27,<0.2.0" +openai = ">=1.10.0,<2.0.0" +tiktoken = ">=0.5.2,<1" + +[[package]] +name = "langchain-text-splitters" +version = "0.0.1" +description = "LangChain text splitting utilities" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langchain_text_splitters-0.0.1-py3-none-any.whl", hash = "sha256:f5b802f873f5ff6a8b9259ff34d53ed989666ef4e1582e6d1adb3b5520e3839a"}, + {file = "langchain_text_splitters-0.0.1.tar.gz", hash = "sha256:ac459fa98799f5117ad5425a9330b21961321e30bc19a2a2f9f761ddadd62aa1"}, +] + +[package.dependencies] +langchain-core = ">=0.1.28,<0.2.0" + +[package.extras] +extended-testing = ["lxml (>=5.1.0,<6.0.0)"] + +[[package]] +name = "langsmith" +version = "0.1.28" +description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "langsmith-0.1.28-py3-none-any.whl", hash = "sha256:a704db624b1dc8da635f62a5ff7136d8dbdd32c7cdb487604e8247d70985e269"}, + {file = "langsmith-0.1.28.tar.gz", hash = "sha256:a66ff27447d638d9083e656db907754bf1089cd7220c60604778cab133e372b4"}, +] + +[package.dependencies] +orjson = ">=3.9.14,<4.0.0" +pydantic = ">=1,<3" +requests = ">=2,<3" + +[[package]] +name = "marshmallow" +version = "3.21.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.21.1-py3-none-any.whl", hash = "sha256:f085493f79efb0644f270a9bf2892843142d80d7174bbbd2f3713f2a589dc633"}, + {file = "marshmallow-3.21.1.tar.gz", hash = "sha256:4e65e9e0d80fc9e609574b9983cf32579f305c718afb30d7233ab818571768c3"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["marshmallow[tests]", "pre-commit (>=3.5,<4.0)", "tox"] +docs = ["alabaster (==0.7.16)", "autodocsumm (==0.2.12)", "sphinx (==7.2.6)", "sphinx-issues (==4.0.0)", "sphinx-version-warning (==1.1.2)"] +tests = ["pytest", "pytz", "simplejson"] + [[package]] name = "mccabe" version = "0.7.0" @@ -294,6 +889,161 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + [[package]] name = "openai" version = "1.14.1" @@ -317,15 +1067,74 @@ typing-extensions = ">=4.7,<5" [package.extras] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] +[[package]] +name = "orjson" +version = "3.9.15" +description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" +optional = false +python-versions = ">=3.8" +files = [ + {file = "orjson-3.9.15-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d61f7ce4727a9fa7680cd6f3986b0e2c732639f46a5e0156e550e35258aa313a"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4feeb41882e8aa17634b589533baafdceb387e01e117b1ec65534ec724023d04"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbbeb3c9b2edb5fd044b2a070f127a0ac456ffd079cb82746fc84af01ef021a4"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b66bcc5670e8a6b78f0313bcb74774c8291f6f8aeef10fe70e910b8040f3ab75"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2973474811db7b35c30248d1129c64fd2bdf40d57d84beed2a9a379a6f57d0ab"}, + {file = "orjson-3.9.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fe41b6f72f52d3da4db524c8653e46243c8c92df826ab5ffaece2dba9cccd58"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4228aace81781cc9d05a3ec3a6d2673a1ad0d8725b4e915f1089803e9efd2b99"}, + {file = "orjson-3.9.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f7b65bfaf69493c73423ce9db66cfe9138b2f9ef62897486417a8fcb0a92bfe"}, + {file = "orjson-3.9.15-cp310-none-win32.whl", hash = "sha256:2d99e3c4c13a7b0fb3792cc04c2829c9db07838fb6973e578b85c1745e7d0ce7"}, + {file = "orjson-3.9.15-cp310-none-win_amd64.whl", hash = "sha256:b725da33e6e58e4a5d27958568484aa766e825e93aa20c26c91168be58e08cbb"}, + {file = "orjson-3.9.15-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c8e8fe01e435005d4421f183038fc70ca85d2c1e490f51fb972db92af6e047c2"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87f1097acb569dde17f246faa268759a71a2cb8c96dd392cd25c668b104cad2f"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff0f9913d82e1d1fadbd976424c316fbc4d9c525c81d047bbdd16bd27dd98cfc"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8055ec598605b0077e29652ccfe9372247474375e0e3f5775c91d9434e12d6b1"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d6768a327ea1ba44c9114dba5fdda4a214bdb70129065cd0807eb5f010bfcbb5"}, + {file = "orjson-3.9.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12365576039b1a5a47df01aadb353b68223da413e2e7f98c02403061aad34bde"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:71c6b009d431b3839d7c14c3af86788b3cfac41e969e3e1c22f8a6ea13139404"}, + {file = "orjson-3.9.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e18668f1bd39e69b7fed19fa7cd1cd110a121ec25439328b5c89934e6d30d357"}, + {file = "orjson-3.9.15-cp311-none-win32.whl", hash = "sha256:62482873e0289cf7313461009bf62ac8b2e54bc6f00c6fabcde785709231a5d7"}, + {file = "orjson-3.9.15-cp311-none-win_amd64.whl", hash = "sha256:b3d336ed75d17c7b1af233a6561cf421dee41d9204aa3cfcc6c9c65cd5bb69a8"}, + {file = "orjson-3.9.15-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:82425dd5c7bd3adfe4e94c78e27e2fa02971750c2b7ffba648b0f5d5cc016a73"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c51378d4a8255b2e7c1e5cc430644f0939539deddfa77f6fac7b56a9784160a"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ae4e06be04dc00618247c4ae3f7c3e561d5bc19ab6941427f6d3722a0875ef7"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bcef128f970bb63ecf9a65f7beafd9b55e3aaf0efc271a4154050fc15cdb386e"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b72758f3ffc36ca566ba98a8e7f4f373b6c17c646ff8ad9b21ad10c29186f00d"}, + {file = "orjson-3.9.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c57bc7b946cf2efa67ac55766e41764b66d40cbd9489041e637c1304400494"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:946c3a1ef25338e78107fba746f299f926db408d34553b4754e90a7de1d44068"}, + {file = "orjson-3.9.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2f256d03957075fcb5923410058982aea85455d035607486ccb847f095442bda"}, + {file = "orjson-3.9.15-cp312-none-win_amd64.whl", hash = "sha256:5bb399e1b49db120653a31463b4a7b27cf2fbfe60469546baf681d1b39f4edf2"}, + {file = "orjson-3.9.15-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b17f0f14a9c0ba55ff6279a922d1932e24b13fc218a3e968ecdbf791b3682b25"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f6cbd8e6e446fb7e4ed5bac4661a29e43f38aeecbf60c4b900b825a353276a1"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76bc6356d07c1d9f4b782813094d0caf1703b729d876ab6a676f3aaa9a47e37c"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fdfa97090e2d6f73dced247a2f2d8004ac6449df6568f30e7fa1a045767c69a6"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7413070a3e927e4207d00bd65f42d1b780fb0d32d7b1d951f6dc6ade318e1b5a"}, + {file = "orjson-3.9.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cf1596680ac1f01839dba32d496136bdd5d8ffb858c280fa82bbfeb173bdd40"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:809d653c155e2cc4fd39ad69c08fdff7f4016c355ae4b88905219d3579e31eb7"}, + {file = "orjson-3.9.15-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:920fa5a0c5175ab14b9c78f6f820b75804fb4984423ee4c4f1e6d748f8b22bc1"}, + {file = "orjson-3.9.15-cp38-none-win32.whl", hash = "sha256:2b5c0f532905e60cf22a511120e3719b85d9c25d0e1c2a8abb20c4dede3b05a5"}, + {file = "orjson-3.9.15-cp38-none-win_amd64.whl", hash = "sha256:67384f588f7f8daf040114337d34a5188346e3fae6c38b6a19a2fe8c663a2f9b"}, + {file = "orjson-3.9.15-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6fc2fe4647927070df3d93f561d7e588a38865ea0040027662e3e541d592811e"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34cbcd216e7af5270f2ffa63a963346845eb71e174ea530867b7443892d77180"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f541587f5c558abd93cb0de491ce99a9ef8d1ae29dd6ab4dbb5a13281ae04cbd"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92255879280ef9c3c0bcb327c5a1b8ed694c290d61a6a532458264f887f052cb"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05a1f57fb601c426635fcae9ddbe90dfc1ed42245eb4c75e4960440cac667262"}, + {file = "orjson-3.9.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede0bde16cc6e9b96633df1631fbcd66491d1063667f260a4f2386a098393790"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e88b97ef13910e5f87bcbc4dd7979a7de9ba8702b54d3204ac587e83639c0c2b"}, + {file = "orjson-3.9.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57d5d8cf9c27f7ef6bc56a5925c7fbc76b61288ab674eb352c26ac780caa5b10"}, + {file = "orjson-3.9.15-cp39-none-win32.whl", hash = "sha256:001f4eb0ecd8e9ebd295722d0cbedf0748680fb9998d3993abaed2f40587257a"}, + {file = "orjson-3.9.15-cp39-none-win_amd64.whl", hash = "sha256:ea0b183a5fe6b2b45f3b854b0d19c4e932d6f5934ae1f723b07cf9560edd4ec7"}, + {file = "orjson-3.9.15.tar.gz", hash = "sha256:95cae920959d772f30ab36d3b25f83bb0f3be671e986c72ce22f8fa700dae061"}, +] + [[package]] name = "packaging" -version = "24.0" +version = "23.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, - {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] [[package]] @@ -536,6 +1345,66 @@ pytest = ">=5.0" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + [[package]] name = "readchar" version = "4.0.6" @@ -550,6 +1419,129 @@ files = [ [package.dependencies] setuptools = ">=41.0" +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + [[package]] name = "runs" version = "1.2.2" @@ -602,6 +1594,159 @@ files = [ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] +[[package]] +name = "sqlalchemy" +version = "2.0.28" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, + {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, + {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "tenacity" +version = "8.2.3" +description = "Retry code until it succeeds" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, +] + +[package.extras] +doc = ["reno", "sphinx", "tornado (>=4.5)"] + +[[package]] +name = "tiktoken" +version = "0.6.0" +description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tiktoken-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:277de84ccd8fa12730a6b4067456e5cf72fef6300bea61d506c09e45658d41ac"}, + {file = "tiktoken-0.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9c44433f658064463650d61387623735641dcc4b6c999ca30bc0f8ba3fccaf5c"}, + {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb9a2a866ae6eef1995ab656744287a5ac95acc7e0491c33fad54d053288ad3"}, + {file = "tiktoken-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c62c05b3109fefca26fedb2820452a050074ad8e5ad9803f4652977778177d9f"}, + {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ef917fad0bccda07bfbad835525bbed5f3ab97a8a3e66526e48cdc3e7beacf7"}, + {file = "tiktoken-0.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e095131ab6092d0769a2fda85aa260c7c383072daec599ba9d8b149d2a3f4d8b"}, + {file = "tiktoken-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:05b344c61779f815038292a19a0c6eb7098b63c8f865ff205abb9ea1b656030e"}, + {file = "tiktoken-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cefb9870fb55dca9e450e54dbf61f904aab9180ff6fe568b61f4db9564e78871"}, + {file = "tiktoken-0.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:702950d33d8cabc039845674107d2e6dcabbbb0990ef350f640661368df481bb"}, + {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8d49d076058f23254f2aff9af603863c5c5f9ab095bc896bceed04f8f0b013a"}, + {file = "tiktoken-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:430bc4e650a2d23a789dc2cdca3b9e5e7eb3cd3935168d97d43518cbb1f9a911"}, + {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:293cb8669757301a3019a12d6770bd55bec38a4d3ee9978ddbe599d68976aca7"}, + {file = "tiktoken-0.6.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7bd1a288b7903aadc054b0e16ea78e3171f70b670e7372432298c686ebf9dd47"}, + {file = "tiktoken-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac76e000183e3b749634968a45c7169b351e99936ef46f0d2353cd0d46c3118d"}, + {file = "tiktoken-0.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17cc8a4a3245ab7d935c83a2db6bb71619099d7284b884f4b2aea4c74f2f83e3"}, + {file = "tiktoken-0.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:284aebcccffe1bba0d6571651317df6a5b376ff6cfed5aeb800c55df44c78177"}, + {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c1a3a5d33846f8cd9dd3b7897c1d45722f48625a587f8e6f3d3e85080559be8"}, + {file = "tiktoken-0.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6318b2bb2337f38ee954fd5efa82632c6e5ced1d52a671370fa4b2eff1355e91"}, + {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f5f0f2ed67ba16373f9a6013b68da298096b27cd4e1cf276d2d3868b5c7efd1"}, + {file = "tiktoken-0.6.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:75af4c0b16609c2ad02581f3cdcd1fb698c7565091370bf6c0cf8624ffaba6dc"}, + {file = "tiktoken-0.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:45577faf9a9d383b8fd683e313cf6df88b6076c034f0a16da243bb1c139340c3"}, + {file = "tiktoken-0.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7c1492ab90c21ca4d11cef3a236ee31a3e279bb21b3fc5b0e2210588c4209e68"}, + {file = "tiktoken-0.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e2b380c5b7751272015400b26144a2bab4066ebb8daae9c3cd2a92c3b508fe5a"}, + {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f497598b9f58c99cbc0eb764b4a92272c14d5203fc713dd650b896a03a50ad"}, + {file = "tiktoken-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e65e8bd6f3f279d80f1e1fbd5f588f036b9a5fa27690b7f0cc07021f1dfa0839"}, + {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5f1495450a54e564d236769d25bfefbf77727e232d7a8a378f97acddee08c1ae"}, + {file = "tiktoken-0.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6c4e4857d99f6fb4670e928250835b21b68c59250520a1941618b5b4194e20c3"}, + {file = "tiktoken-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:168d718f07a39b013032741867e789971346df8e89983fe3c0ef3fbd5a0b1cb9"}, + {file = "tiktoken-0.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:47fdcfe11bd55376785a6aea8ad1db967db7f66ea81aed5c43fad497521819a4"}, + {file = "tiktoken-0.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb7d2ccbf1a7784810aff6b80b4012fb42c6fc37eaa68cb3b553801a5cc2d1fc"}, + {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ccb7a111ee76af5d876a729a347f8747d5ad548e1487eeea90eaf58894b3138"}, + {file = "tiktoken-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2048e1086b48e3c8c6e2ceeac866561374cd57a84622fa49a6b245ffecb7744"}, + {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07f229a5eb250b6403a61200199cecf0aac4aa23c3ecc1c11c1ca002cbb8f159"}, + {file = "tiktoken-0.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:432aa3be8436177b0db5a2b3e7cc28fd6c693f783b2f8722539ba16a867d0c6a"}, + {file = "tiktoken-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:8bfe8a19c8b5c40d121ee7938cd9c6a278e5b97dc035fd61714b4f0399d2f7a1"}, + {file = "tiktoken-0.6.0.tar.gz", hash = "sha256:ace62a4ede83c75b0374a2ddfa4b76903cf483e9cb06247f566be3bf14e6beed"}, +] + +[package.dependencies] +regex = ">=2022.1.18" +requests = ">=2.26.0" + +[package.extras] +blobfile = ["blobfile (>=2)"] + [[package]] name = "toml" version = "0.10.2" @@ -767,6 +1912,38 @@ files = [ {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] +[[package]] +name = "typing-inspect" +version = "0.9.0" +description = "Runtime inspection utilities for typing module." +optional = false +python-versions = "*" +files = [ + {file = "typing_inspect-0.9.0-py3-none-any.whl", hash = "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f"}, + {file = "typing_inspect-0.9.0.tar.gz", hash = "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78"}, +] + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "wcwidth" version = "0.2.13" @@ -789,7 +1966,110 @@ files = [ {file = "xmod-1.8.1.tar.gz", hash = "sha256:38c76486b9d672c546d57d8035df0beb7f4a9b088bc3fb2de5431ae821444377"}, ] +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [metadata] lock-version = "2.0" python-versions = ">=3.9.1,<3.12" -content-hash = "a42215fcea435b02f27db6f271e2114a440741d284ac0c93585c13027ae662ca" +content-hash = "08eb31bec2d208ee4bf3da6cf31f744a845d52ce92dc180c1a0fd3e54e99d44d" From a289ddcd16fa93ac5b45e8eb14404a798a22eb2a Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:53:13 +0000 Subject: [PATCH 09/72] Add langchain dependencies --- pyproject.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index ad20dd2..016b108 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,10 @@ toml = "^0.10.2" esprima = "^4.0.1" tree-sitter = "^0.21.0" tree-sitter-languages = "^1.10.2" +langchain = "^0.1.12" +langchain-community = "^0.0.28" +langchain-text-splitters = "^0.0.1" +langchain-openai = "^0.0.8" [tool.poetry.group.dev.dependencies] From df4f618a453ad3156507ab1928ab3a33bb38bce9 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:53:20 +0000 Subject: [PATCH 10/72] Refactor file loading logic in main function --- senior_swe_ai/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 084822a..87ab6d8 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -55,9 +55,9 @@ def main() -> None: model=conf['embed_model'], api_key=conf['api_key']) if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): - # all files in the git repository + # all files in the git repository tree files: list[str] = recursive_load_files() - + if __name__ == '__main__': main() From ed7a37900e09153cbaf689e0039abe35d95deb82 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:53:29 +0000 Subject: [PATCH 11/72] Add file_handler module for file I/O operations --- senior_swe_ai/file_handler.py | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 senior_swe_ai/file_handler.py diff --git a/senior_swe_ai/file_handler.py b/senior_swe_ai/file_handler.py new file mode 100644 index 0000000..9da0dcc --- /dev/null +++ b/senior_swe_ai/file_handler.py @@ -0,0 +1,6 @@ +"""Module for handling file I/O operations""" + + +def get_extension(file_path: str) -> str: + """Get the file extension from the file path""" + return file_path.split('.')[-1] From 2db909451044378d655d9147fc322254ea3ecae2 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:53:41 +0000 Subject: [PATCH 12/72] Refactor code to improve performance and readability --- senior_swe_ai/llm_handler.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 senior_swe_ai/llm_handler.py diff --git a/senior_swe_ai/llm_handler.py b/senior_swe_ai/llm_handler.py new file mode 100644 index 0000000..f2c7343 --- /dev/null +++ b/senior_swe_ai/llm_handler.py @@ -0,0 +1,31 @@ +"""This module contains functions to interact with LLMs and their embeddings + using Langchain +""" +from langchain_text_splitters import Language + + +def get_langchain_text_splitters(language: Language): + """Get the Langchain text splitters for the given language""" + + if language == Language.PYTHON: + return Language.PYTHON + elif language == Language.JS: + return Language.JS + elif language == Language.TS: + return Language.TS + elif language == Language.JAVA: + return Language.JAVA + elif language == Language.KOTLIN: + return Language.KOTLIN + elif language == Language.RUST: + return Language.RUST + elif language == Language.GO: + return Language.GO + elif language == Language.CPP: + return Language.CPP + elif language == Language.CSHARP: + return Language.CSHARP + elif language == Language.RUBY: + return Language.RUBY + else: + return None From 52a6ce9d120e169f17a6de97f87a60c58109bd2f Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 23:46:08 +0000 Subject: [PATCH 13/72] Add language parser and file extension handling --- senior_swe_ai/cli.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 87ab6d8..a3abeb7 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -3,6 +3,9 @@ import os import sys from langchain_openai import OpenAIEmbeddings +from langchain_community.document_loaders.generic import GenericLoader +from langchain_community.document_loaders.parsers.language.language_parser import LanguageParser +from senior_swe_ai.file_handler import get_extension from senior_swe_ai.git_process import ( is_git_repo, get_repo_name, get_repo_root, recursive_load_files ) @@ -57,7 +60,17 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): # all files in the git repository tree files: list[str] = recursive_load_files() - + ext_arr = [] + for file in files: + ext: str = get_extension(file) + ext_arr.append(ext) + loader: GenericLoader = GenericLoader.from_filesystem( + file, + glob="*/[!.]*", + suffixes=set(ext_arr), + parser=LanguageParser(language=) + ) + if __name__ == '__main__': main() From 939d144fbec844b688c088ce1a3a24f7b02ed09c Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 23:46:13 +0000 Subject: [PATCH 14/72] Refactor get_langchain_text_splitters function to use a dictionary for language mapping --- senior_swe_ai/llm_handler.py | 42 ++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/senior_swe_ai/llm_handler.py b/senior_swe_ai/llm_handler.py index f2c7343..ca0b367 100644 --- a/senior_swe_ai/llm_handler.py +++ b/senior_swe_ai/llm_handler.py @@ -4,28 +4,24 @@ from langchain_text_splitters import Language -def get_langchain_text_splitters(language: Language): +def get_langchain_text_splitters(language: Language) -> Language | None: """Get the Langchain text splitters for the given language""" - if language == Language.PYTHON: - return Language.PYTHON - elif language == Language.JS: - return Language.JS - elif language == Language.TS: - return Language.TS - elif language == Language.JAVA: - return Language.JAVA - elif language == Language.KOTLIN: - return Language.KOTLIN - elif language == Language.RUST: - return Language.RUST - elif language == Language.GO: - return Language.GO - elif language == Language.CPP: - return Language.CPP - elif language == Language.CSHARP: - return Language.CSHARP - elif language == Language.RUBY: - return Language.RUBY - else: - return None + lang_map: dict[str, Language] = { + ".py": Language.PYTHON, + ".js": Language.JS, + ".jsx": Language.JS, + ".mjs": Language.JS, + ".cjs": Language.JS, + ".ts": Language.TS, + ".tsx": Language.TS, + ".java": Language.JAVA, + ".kt": Language.KOTLIN, + ".rs": Language.RUST, + ".go": Language.GO, + ".cpp": Language.CPP, + ".c": Language.C, + ".cs": Language.CSHARP, + ".rb": Language.RUBY, + } + return lang_map.get(language) From 45a7e9e7d9d34ab503796456435f79d01105fd01 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Mon, 18 Mar 2024 23:53:04 +0000 Subject: [PATCH 15/72] Refactor file loading and parsing logic in main() function --- senior_swe_ai/cli.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index a3abeb7..96db1d9 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -11,6 +11,7 @@ ) from senior_swe_ai.conf import config_init, load_conf, append_conf from senior_swe_ai.cache import create_cache_dir, get_cache_path +from senior_swe_ai.llm_handler import get_langchain_text_splitters def main() -> None: @@ -60,15 +61,15 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): # all files in the git repository tree files: list[str] = recursive_load_files() - ext_arr = [] + # ext_arr = [] for file in files: ext: str = get_extension(file) - ext_arr.append(ext) + # ext_arr.append(ext) loader: GenericLoader = GenericLoader.from_filesystem( file, glob="*/[!.]*", - suffixes=set(ext_arr), - parser=LanguageParser(language=) + suffixes=ext, + parser=LanguageParser(language=get_langchain_text_splitters(ext)) ) From aee44f90d2d01de1d03cd155fd2d60b915f5c510 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 00:02:40 +0000 Subject: [PATCH 16/72] Refactor file loading logic in main function --- senior_swe_ai/cli.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 96db1d9..aabf894 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -59,7 +59,7 @@ def main() -> None: model=conf['embed_model'], api_key=conf['api_key']) if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): - # all files in the git repository tree + # all desired files in the git repository tree files: list[str] = recursive_load_files() # ext_arr = [] for file in files: @@ -69,9 +69,10 @@ def main() -> None: file, glob="*/[!.]*", suffixes=ext, - parser=LanguageParser(language=get_langchain_text_splitters(ext)) + parser=LanguageParser( + language=get_langchain_text_splitters(ext)) ) - + if __name__ == '__main__': main() From 750fd5a01f2e138e60bce9c5de86c42034c69bcf Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:02:09 +0000 Subject: [PATCH 17/72] Update content-hash in poetry.lock --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 02077a8..20d666a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2072,4 +2072,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.9.1,<3.12" -content-hash = "08eb31bec2d208ee4bf3da6cf31f744a845d52ce92dc180c1a0fd3e54e99d44d" +content-hash = "fde27d7eb9bfbffa82d245cff2a067ed004ab9cb6665b6df540e44ebf1a1ae81" From 732bc8dc6c2e07e04ef247f44cad584b80e30709 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:02:14 +0000 Subject: [PATCH 18/72] Add tiktoken dependency --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 016b108..d0caa36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ langchain = "^0.1.12" langchain-community = "^0.0.28" langchain-text-splitters = "^0.0.1" langchain-openai = "^0.0.8" +tiktoken = "^0.6.0" [tool.poetry.group.dev.dependencies] From 7831b255e2546ef721b94f6ec7b3f6a17a3a64ba Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:02:21 +0000 Subject: [PATCH 19/72] Add language and text splitting functionality --- senior_swe_ai/cli.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index aabf894..8486199 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -2,9 +2,12 @@ from argparse import ArgumentParser, Namespace import os import sys +from typing import List +from langchain_core.documents.base import Document from langchain_openai import OpenAIEmbeddings from langchain_community.document_loaders.generic import GenericLoader from langchain_community.document_loaders.parsers.language.language_parser import LanguageParser +from langchain_text_splitters import Language, RecursiveCharacterTextSplitter from senior_swe_ai.file_handler import get_extension from senior_swe_ai.git_process import ( is_git_repo, get_repo_name, get_repo_root, recursive_load_files @@ -61,17 +64,23 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): # all desired files in the git repository tree files: list[str] = recursive_load_files() - # ext_arr = [] - for file in files: - ext: str = get_extension(file) - # ext_arr.append(ext) - loader: GenericLoader = GenericLoader.from_filesystem( - file, - glob="*/[!.]*", - suffixes=ext, - parser=LanguageParser( - language=get_langchain_text_splitters(ext)) - ) + + exts: set = {get_extension(file) for file in files} + loader: GenericLoader = GenericLoader.from_filesystem( + repo_root, + glob="*/[!.]*", + suffixes=list(exts), + parser=LanguageParser() + ) + docs: List[Document] = loader.load() + + text_splitter: RecursiveCharacterTextSplitter = RecursiveCharacterTextSplitter( + chunk_size=1000, + chunk_overlap=100, + + ) + text: List[Document] = text_splitter.split_documents(docs) + if __name__ == '__main__': From 6af969aebeed5182d7c54ac57fa2f5619b67d099 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:02:26 +0000 Subject: [PATCH 20/72] Add tree_parser module --- senior_swe_ai/tree_parser/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 senior_swe_ai/tree_parser/__init__.py diff --git a/senior_swe_ai/tree_parser/__init__.py b/senior_swe_ai/tree_parser/__init__.py new file mode 100644 index 0000000..e69de29 From 754176e480357fd2ea19064b947e7fc7cf08122d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:21:17 +0000 Subject: [PATCH 21/72] Add base class for tree-sitter parsers --- senior_swe_ai/tree_parser/base.py | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 senior_swe_ai/tree_parser/base.py diff --git a/senior_swe_ai/tree_parser/base.py b/senior_swe_ai/tree_parser/base.py new file mode 100644 index 0000000..d755470 --- /dev/null +++ b/senior_swe_ai/tree_parser/base.py @@ -0,0 +1,86 @@ +"""Base class for tree-sitter parsers.""" +from abc import ABC +from typing import Any + +import tree_sitter +from tree_sitter_languages import get_language, get_parser + +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry + + +class TreesitterMethodNode: + """Class to represent a method node in the tree-sitter parse tree.""" + + def __init__( + self, + name: "str | bytes | None", + doc_comment: "str | None", + method_source_code: "str | None", + node: tree_sitter.Node, + ) -> None: + self.name: str | bytes | None = name + self.doc_comment: str | None = doc_comment + self.method_source_code: str = method_source_code or node.text.decode() + self.node: tree_sitter.Node = node + + +class Treesitter(ABC): + """ Base class for tree-sitter parsers.""" + + def __init__( + self, + language: Language, + method_declaration_identifier: str, + name_identifier: str, + doc_comment_identifier: str, + ) -> None: + self.parser: tree_sitter.Parser = get_parser(language.value) + self.language: tree_sitter.Language = get_language(language.value) + self.method_declaration_identifier: str = method_declaration_identifier + self.method_name_identifier: str = name_identifier + self.doc_comment_identifier: str = doc_comment_identifier + + @staticmethod + def create_treesitter(lang: Language) -> Any: + """Factory method to create a tree-sitter parser for the given language.""" + return TreesitterRegistry.create_treesitter(lang) + + def parse(self, file_bytes: bytes) -> list[TreesitterMethodNode]: + """Parse the given file and return a list of method nodes.""" + self.tree = self.parser.parse(file_bytes) + result = [] + methods = self._query_all_methods(self.tree.root_node) + for method in methods: + method_name = self._query_method_name(method["method"]) + doc_comment = method["doc_comment"] + result.append( + TreesitterMethodNode( + method_name, doc_comment, None, method["method"]) + ) + return result + + def _query_all_methods( + self, + node: tree_sitter.Node, + ): + methods = [] + if node.type == self.method_declaration_identifier: + doc_comment_node = None + if ( + node.prev_named_sibling + and node.prev_named_sibling.type == self.doc_comment_identifier + ): + doc_comment_node = node.prev_named_sibling.text.decode() + methods.append({"method": node, "doc_comment": doc_comment_node}) + else: + for child in node.children: + methods.extend(self._query_all_methods(child)) + return methods + + def _query_method_name(self, node: tree_sitter.Node): + if node.type == self.method_declaration_identifier: + for child in node.children: + if child.type == self.method_name_identifier: + return child.text.decode() + return None From 38cc840d883bdb26d6cf709144b60b48ba591a10 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:21:22 +0000 Subject: [PATCH 22/72] Add TreesitterC class for parsing C code using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_c.py | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_c.py diff --git a/senior_swe_ai/tree_parser/tree_parser_c.py b/senior_swe_ai/tree_parser/tree_parser_c.py new file mode 100644 index 0000000..ed2984d --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_c.py @@ -0,0 +1,28 @@ +"""This module contains the TreesitterC class, which is responsible for +parsing C code using the tree-sitter library.""" +import tree_sitter +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import Treesitter +from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry + + +class TreesitterC(Treesitter): + """Class to parse C code using the tree-sitter library.""" + + def __init__(self): + super().__init__(Language.C, "function_definition", "identifier", "comment") + + def _query_method_name(self, node: tree_sitter.Node): + if node.type == self.method_declaration_identifier: + for child in node.children: + # if method returns pointer, skip pointer declarator + if child.type == "pointer_declarator": + child = child.children[1] + if child.type == "function_declarator": + for child in child.children: + if child.type == self.method_name_identifier: + return child.text.decode() + return None + + +TreesitterRegistry.register_treesitter(Language.C, TreesitterC) From 840716dd686afa43b8bd096f98bdf369f7bca9e2 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Tue, 19 Mar 2024 21:21:27 +0000 Subject: [PATCH 23/72] Add TreesitterCpp class to parse C++ code using the tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_cpp.py | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_cpp.py diff --git a/senior_swe_ai/tree_parser/tree_parser_cpp.py b/senior_swe_ai/tree_parser/tree_parser_cpp.py new file mode 100644 index 0000000..5e047cb --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_cpp.py @@ -0,0 +1,26 @@ +"""Module to parse C++ code using the tree-sitter library.""" +import tree_sitter +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import Treesitter +from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry + + +class TreesitterCpp(Treesitter): + """Class to parse C++ code using the tree-sitter library.""" + def __init__(self): + super().__init__(Language.CPP, "function_definition", "identifier", "comment") + + def _query_method_name(self, node: tree_sitter.Node): + if node.type == self.method_declaration_identifier: + for child in node.children: + # if method returns pointer, skip pointer declarator + if child.type == "pointer_declarator": + child = child.children[1] + if child.type == "function_declarator": + for child in child.children: + if child.type == self.method_name_identifier: + return child.text.decode() + return None + + +TreesitterRegistry.register_treesitter(Language.CPP, TreesitterCpp) From 3da8f63164f030a004e1bf52777fd7bc556183de Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 00:33:54 +0000 Subject: [PATCH 24/72] Add get_hash function to retrieve file hash --- senior_swe_ai/git_process.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/senior_swe_ai/git_process.py b/senior_swe_ai/git_process.py index b454411..b3b03f6 100644 --- a/senior_swe_ai/git_process.py +++ b/senior_swe_ai/git_process.py @@ -42,3 +42,12 @@ def recursive_load_files() -> list[str]: file_list.append(os.path.join(root, file)) return file_list + +def get_hash(file_path: str) -> str: + """ Get the hash of the file """ + return subprocess.run( + ["git", "log", "-1", "--pretty=format:%H", file_path], + capture_output=True, + check=True, + text=True, + ).stdout.strip() From 09e3c241a749d76be3196e260d24680ec298ff90 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 00:34:06 +0000 Subject: [PATCH 25/72] Add return type annotation to _query_all_methods and _query_method_name methods --- senior_swe_ai/tree_parser/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/senior_swe_ai/tree_parser/base.py b/senior_swe_ai/tree_parser/base.py index d755470..976b299 100644 --- a/senior_swe_ai/tree_parser/base.py +++ b/senior_swe_ai/tree_parser/base.py @@ -63,7 +63,7 @@ def parse(self, file_bytes: bytes) -> list[TreesitterMethodNode]: def _query_all_methods( self, node: tree_sitter.Node, - ): + ) -> list: methods = [] if node.type == self.method_declaration_identifier: doc_comment_node = None @@ -71,14 +71,14 @@ def _query_all_methods( node.prev_named_sibling and node.prev_named_sibling.type == self.doc_comment_identifier ): - doc_comment_node = node.prev_named_sibling.text.decode() + doc_comment_node: str = node.prev_named_sibling.text.decode() methods.append({"method": node, "doc_comment": doc_comment_node}) else: for child in node.children: methods.extend(self._query_all_methods(child)) return methods - def _query_method_name(self, node: tree_sitter.Node): + def _query_method_name(self, node: tree_sitter.Node) -> str | None: if node.type == self.method_declaration_identifier: for child in node.children: if child.type == self.method_name_identifier: From 6583070924606411afafa78e5539d2aebac208d5 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:48:23 +0000 Subject: [PATCH 26/72] Refactor code to use parse_code_files function --- senior_swe_ai/cli.py | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 8486199..27c7c01 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -7,8 +7,8 @@ from langchain_openai import OpenAIEmbeddings from langchain_community.document_loaders.generic import GenericLoader from langchain_community.document_loaders.parsers.language.language_parser import LanguageParser -from langchain_text_splitters import Language, RecursiveCharacterTextSplitter -from senior_swe_ai.file_handler import get_extension +from langchain_text_splitters import RecursiveCharacterTextSplitter +from senior_swe_ai.file_handler import get_extension, parse_code_files from senior_swe_ai.git_process import ( is_git_repo, get_repo_name, get_repo_root, recursive_load_files ) @@ -64,22 +64,8 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): # all desired files in the git repository tree files: list[str] = recursive_load_files() - - exts: set = {get_extension(file) for file in files} - loader: GenericLoader = GenericLoader.from_filesystem( - repo_root, - glob="*/[!.]*", - suffixes=list(exts), - parser=LanguageParser() - ) - docs: List[Document] = loader.load() - - text_splitter: RecursiveCharacterTextSplitter = RecursiveCharacterTextSplitter( - chunk_size=1000, - chunk_overlap=100, - - ) - text: List[Document] = text_splitter.split_documents(docs) + docs: List[Document] = parse_code_files(files) + From 4d6d7ad3c3c398bfeb013d55e681f13fe8dba1d8 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:48:37 +0000 Subject: [PATCH 27/72] Add code file parsing functionality --- senior_swe_ai/file_handler.py | 106 +++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/senior_swe_ai/file_handler.py b/senior_swe_ai/file_handler.py index 9da0dcc..a0aaf3a 100644 --- a/senior_swe_ai/file_handler.py +++ b/senior_swe_ai/file_handler.py @@ -1,6 +1,110 @@ """Module for handling file I/O operations""" +import os +from typing import List, Optional, Tuple + +from langchain.schema import Document +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain_text_splitters import Language +from senior_swe_ai.git_process import get_hash +from senior_swe_ai.llm_handler import get_langchain_language, get_langchain_text_splitters +from senior_swe_ai.tree_parser.base import Treesitter, TreesitterMethodNode def get_extension(file_path: str) -> str: """Get the file extension from the file path""" - return file_path.split('.')[-1] + return '.' + file_path.split('.')[-1] + + +def parse_code_files(code_files: list[str]) -> list[Document]: + """Parse the given code files and return a list of Documents""" + documents: list = [] + for code_file in code_files: + file_bytes, commit_hash, programming_language = read_file_and_get_metadata( + code_file) + if programming_language is None: + continue + + code_splitter: RecursiveCharacterTextSplitter = create_character_text_splitter( + programming_language) + treesitter_nodes: List[TreesitterMethodNode] = parse_file_with_treesitter( + file_bytes, programming_language) + + documents.extend(create_documents_from_nodes( + treesitter_nodes, code_file, commit_hash, code_splitter, programming_language)) + + return documents + + +def read_file_and_get_metadata(code_file: str) -> Tuple[bytes, str, Optional[Language]]: + """Read the file and get the metadata""" + with open(code_file, "r", encoding="utf-8") as file: + file_bytes: bytes = file.read().encode() + commit_hash: str = get_hash(code_file) + + file_extension: str = get_extension(code_file) + programming_language: Language | None = get_langchain_text_splitters( + file_extension) + + return file_bytes, commit_hash, programming_language + + +def parse_file_with_treesitter( + file_bytes: bytes, + programming_language: Language +) -> list[TreesitterMethodNode]: + """Parse the file using Treesitter and return the method nodes""" + treesitter_parser = Treesitter.create_treesitter(programming_language) + treesitter_nodes: list[TreesitterMethodNode] = treesitter_parser.parse( + file_bytes) + + return treesitter_nodes + + +def create_documents_from_nodes( + treesitter_nodes: list[TreesitterMethodNode], + code_file: str, + commit_hash: str, + code_splitter: RecursiveCharacterTextSplitter, + programming_language: Language +) -> list[Document]: + """Create documents from the Treesitter nodes and return them as a list""" + documents: list = [] + for node in treesitter_nodes: + method_source_code = node.method_source_code + filename: str = os.path.basename(code_file) + + if node.doc_comment and programming_language != Language.PYTHON: + method_source_code = node.doc_comment + "\n" + method_source_code + + splitted_documents = [method_source_code] + if code_splitter: + splitted_documents: List[str] = code_splitter.split_text( + method_source_code) + + for splitted_document in splitted_documents: + document = Document( + page_content=splitted_document, + metadata={ + "filename": filename, + "method_name": node.name, + "commit_hash": commit_hash, + }, + ) + documents.append(document) + + return documents + + +def create_character_text_splitter(language: Language) -> RecursiveCharacterTextSplitter: + """Create a RecursiveCharacterTextSplitter for the given language""" + langchain_language: Language | None = get_langchain_language(language) + if langchain_language: + return RecursiveCharacterTextSplitter.from_language( + language=langchain_language, + chunk_size=512, + chunk_overlap=128, + ) + return RecursiveCharacterTextSplitter( + chunk_size=512, + chunk_overlap=128, + ) From 7ff0ae4039868cb537cb76696f8b764d37b2948f Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:48:44 +0000 Subject: [PATCH 28/72] Update language mappings in llm_handler.py --- senior_swe_ai/llm_handler.py | 38 +++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/senior_swe_ai/llm_handler.py b/senior_swe_ai/llm_handler.py index ca0b367..c0f2cc7 100644 --- a/senior_swe_ai/llm_handler.py +++ b/senior_swe_ai/llm_handler.py @@ -1,7 +1,8 @@ """This module contains functions to interact with LLMs and their embeddings using Langchain """ -from langchain_text_splitters import Language +from langchain import text_splitter +from senior_swe_ai.consts import Language def get_langchain_text_splitters(language: Language) -> Language | None: @@ -9,19 +10,38 @@ def get_langchain_text_splitters(language: Language) -> Language | None: lang_map: dict[str, Language] = { ".py": Language.PYTHON, - ".js": Language.JS, - ".jsx": Language.JS, - ".mjs": Language.JS, - ".cjs": Language.JS, - ".ts": Language.TS, - ".tsx": Language.TS, + ".js": Language.JAVASCRIPT, + ".jsx": Language.JAVASCRIPT, + ".mjs": Language.JAVASCRIPT, + ".cjs": Language.JAVASCRIPT, + ".ts": Language.TYPESCRIPT, + ".tsx": Language.TYPESCRIPT, ".java": Language.JAVA, ".kt": Language.KOTLIN, ".rs": Language.RUST, ".go": Language.GO, ".cpp": Language.CPP, ".c": Language.C, - ".cs": Language.CSHARP, + ".cs": Language.C_SHARP, + ".hs": Language.HASKELL, ".rb": Language.RUBY, } - return lang_map.get(language) + return lang_map.get(language, None) + + +def get_langchain_language(language: Language) -> text_splitter.Language | None: + """Get the Langchain language for the given language""" + lang_map: dict[Language, text_splitter.Language] = { + Language.PYTHON: text_splitter.Language.PYTHON, + Language.JAVASCRIPT: text_splitter.Language.JS, + Language.TYPESCRIPT: text_splitter.Language.TS, + Language.JAVA: text_splitter.Language.JAVA, + Language.KOTLIN: text_splitter.Language.KOTLIN, + Language.RUST: text_splitter.Language.RUST, + Language.GO: text_splitter.Language.GO, + Language.CPP: text_splitter.Language.CPP, + Language.C_SHARP: text_splitter.Language.CSHARP, + Language.RUBY: text_splitter.Language.RUBY, + Language.HASKELL: None, # TODO: Add Haskell support + } + return lang_map.get(language, None) From c8435feba775e765e944dcda6a644f2854f14263 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Wed, 20 Mar 2024 21:49:48 +0000 Subject: [PATCH 29/72] Add VectorStore class for storing embeddings and metadata --- senior_swe_ai/vec_store.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 senior_swe_ai/vec_store.py diff --git a/senior_swe_ai/vec_store.py b/senior_swe_ai/vec_store.py new file mode 100644 index 0000000..ee564dc --- /dev/null +++ b/senior_swe_ai/vec_store.py @@ -0,0 +1,22 @@ +""" +vector store for storing embeddings and their +metadata, to enable fast search and retrieval +""" +from typing import Any, Dict, List, Optional, Tuple +import os +import inquirer +from langchain.schema import Document +from langchain_community.vectorstores import faiss + + +class VectorStore: + """ + VectorStore for storing embeddings and their metadata + """ + def __init__(self, embed_mdl, name): + self.embed_mdl = embed_mdl + self.name = name + + def idx_docs(self, docs: List[Document]) -> None: + """Index the given documents""" + pass \ No newline at end of file From 54cef33ab4f4dcd7b017f45476356c142b1df90b Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:12:30 +0000 Subject: [PATCH 30/72] Add VectorCache class and related functions to cache vector data --- senior_swe_ai/cache.py | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/senior_swe_ai/cache.py b/senior_swe_ai/cache.py index de9c4ba..c4eb280 100644 --- a/senior_swe_ai/cache.py +++ b/senior_swe_ai/cache.py @@ -1,10 +1,39 @@ """ This module contains functions to create and get the cache directory for the application. """ +import json import os import platform from pathlib import Path +from altair import Self + + +class VectorCache: + """ VectorCache class for storing vector data """ + + def __init__(self, filename, vec_ids, commit_hash) -> None: + self.filename = filename + self.vector_ids = vec_ids + self.commit_hash = commit_hash + + def to_json(self) -> str: + """Convert the object to json""" + return { + "filename": self.filename, + "commit_hash": self.commit_hash, + "vector_ids": self.vector_ids, + } + + @classmethod + def from_json(cls, data: dict[str, str]) -> Self: + """Create a VectorCache object from json""" + return cls( + filename=data.get("filename"), + vec_ids=data.get("vector_ids"), + commit_hash=data.get("commit_hash"), + ) + def get_cache_path() -> str: """Get the cache directory path for the application.""" @@ -28,3 +57,22 @@ def create_cache_dir() -> None: if not os.path.exists(get_cache_path()): path = Path(get_cache_path()) path.mkdir(parents=True, exist_ok=True) + + +def load_vec_cache(filename: str) -> dict[str, VectorCache]: + """Load the vector cache from the given file.""" + with open(get_cache_path() + f'/{filename}', 'r', encoding='utf-8') as f: + vec = json.load(f) + vec_cache = {} + for key, value in vec.items(): + vec_cache[key] = VectorCache.from_json(value) + return vec_cache + + +def save_vec_cache(vector_cache, filename) -> None: + """Save the vector cache to the given file.""" + with open( + get_cache_path() + "/" + filename, "w", encoding="utf-8" + ) as vector_cache_file: + json.dump(vector_cache, default=VectorCache.to_json, + fp=vector_cache_file) From 869c97ac1a5c2069c09e9ac0f17ccbe97051fbf4 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:12:38 +0000 Subject: [PATCH 31/72] Add FAISS installation prompt and cache saving --- senior_swe_ai/cli.py | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 27c7c01..23cc3ea 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -3,18 +3,18 @@ import os import sys from typing import List +import pkg_resources +import inquirer from langchain_core.documents.base import Document from langchain_openai import OpenAIEmbeddings -from langchain_community.document_loaders.generic import GenericLoader -from langchain_community.document_loaders.parsers.language.language_parser import LanguageParser -from langchain_text_splitters import RecursiveCharacterTextSplitter -from senior_swe_ai.file_handler import get_extension, parse_code_files +from senior_swe_ai.file_handler import parse_code_files from senior_swe_ai.git_process import ( is_git_repo, get_repo_name, get_repo_root, recursive_load_files ) from senior_swe_ai.conf import config_init, load_conf, append_conf -from senior_swe_ai.cache import create_cache_dir, get_cache_path -from senior_swe_ai.llm_handler import get_langchain_text_splitters +from senior_swe_ai.cache import create_cache_dir, get_cache_path, save_vec_cache +from senior_swe_ai.vec_store import VectorStore +from senior_swe_ai.consts import FaissModel def main() -> None: @@ -62,11 +62,45 @@ def main() -> None: model=conf['embed_model'], api_key=conf['api_key']) if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): + try: + pkg_resources.get_distribution('faiss') + except pkg_resources.DistributionNotFound: + question = [ + inquirer.List( + 'install', + message='FAISS is not installed. Do you want to install it?', + choices=['Yes', 'No'], + default='Yes' + ) + ] + answer: dict[str, str] = inquirer.prompt(question) + if answer['install'] == 'Yes': + question = [ + inquirer.List( + "faiss-installation", + message="Please select the appropriate option to install FAISS. \ + Use gpu if your system supports CUDA", + choices=[ + FaissModel.FAISS_CPU, + FaissModel.FAISS_GPU, + ], + default=FaissModel.FAISS_CPU, + ) + ] + answer: dict[str, str] = inquirer.prompt(question) + if answer['faiss-installation'] == 'faiss-cpu': + os.system('pip install faiss-cpu') + else: + os.system('pip install faiss-gpu') + else: + print('FAISS is required for this app to work') + sys.exit(1) # all desired files in the git repository tree files: list[str] = recursive_load_files() docs: List[Document] = parse_code_files(files) - - + vec_store = VectorStore(embed_mdl, repo_name) + vec_store.idx_docs(docs) + save_vec_cache(vec_store.vec_cache, f'{repo_name}.json') if __name__ == '__main__': From 1836769e42592ec5a38c4ab4fb2165c0aaf6163e Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 21:12:44 +0000 Subject: [PATCH 32/72] Update vec_store.py with vector cache and retrieval functionality --- senior_swe_ai/vec_store.py | 39 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/vec_store.py b/senior_swe_ai/vec_store.py index ee564dc..a06aeae 100644 --- a/senior_swe_ai/vec_store.py +++ b/senior_swe_ai/vec_store.py @@ -6,17 +6,52 @@ import os import inquirer from langchain.schema import Document -from langchain_community.vectorstores import faiss +from langchain_community.vectorstores.faiss import FAISS as faiss +from langchain_core.vectorstores import VectorStoreRetriever + +from senior_swe_ai.cache import VectorCache, get_cache_path class VectorStore: """ VectorStore for storing embeddings and their metadata """ + def __init__(self, embed_mdl, name): self.embed_mdl = embed_mdl self.name = name + self.vec_cache = {} + self.db = {} + self.retrieval = {} + + def _create_vec_cache(self, docs: List[Document]): + """Create a cache for the vectors""" + idx_docstore: Dict[int, str] = self.db.index_to_docstore_id + for idx, doc in enumerate(docs): + find_doc: str | Document = self.db.docstore.search( + idx_docstore[idx]) + if find_doc: + if self.vec_cache.get(find_doc.metadata["filename"]): + self.vec_cache[find_doc.metadata["filename"] + ].vector_ids.append(idx_docstore[idx]) + else: + self.vec_cache[find_doc.metadata["filename"]] = VectorCache( + doc.metadata["filename"], [ + idx_docstore[idx]], doc.metadata["commit_hash"] + ) def idx_docs(self, docs: List[Document]) -> None: """Index the given documents""" - pass \ No newline at end of file + self.db: faiss = faiss.from_documents(docs, self.embed_mdl) + idx: bytes = self.db.serialize_to_bytes() + with open(get_cache_path() + f'/{self.name}.faiss', 'wb') as f: + f.write(idx) + + self._create_vec_cache(docs) + + self.retrieval: VectorStoreRetriever = self.db.as_retriever( + search_type="mmr", search_kwargs={"k": 8}) + + def similarity_search(self, query: str) -> List[Document]: + """Search for similar documents to the given query""" + return self.db.similarity_search(query, k=4) \ No newline at end of file From 929c8963b46db01050169af9280dc16b5f2e51ac Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:35:41 +0000 Subject: [PATCH 33/72] Fix bug in login functionality --- poetry.lock | 83 ++++++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/poetry.lock b/poetry.lock index 20d666a..1c91986 100644 --- a/poetry.lock +++ b/poetry.lock @@ -788,13 +788,13 @@ extended-testing = ["aiosqlite (>=0.19.0,<0.20.0)", "aleph-alpha-client (>=2.15. [[package]] name = "langchain-core" -version = "0.1.32" +version = "0.1.33" description = "Building applications with LLMs through composability" optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langchain_core-0.1.32-py3-none-any.whl", hash = "sha256:192aecdee6216af19b596ec18e7be3da0b9ecb9083eec263e02b68125737245d"}, - {file = "langchain_core-0.1.32.tar.gz", hash = "sha256:d62683becbf20f51f12875791a042320f45eaa0c87a267d30bc03bc1a07f5ec2"}, + {file = "langchain_core-0.1.33-py3-none-any.whl", hash = "sha256:cee7fbab114c74b7279a92c8a376b40344b0fa3d0f0af3143a858e3b7485bf13"}, + {file = "langchain_core-0.1.33.tar.gz", hash = "sha256:545eff3de83cc58231bd2b0c6d672323fc2077b94d326ba1a3219118af1d1a66"}, ] [package.dependencies] @@ -845,13 +845,13 @@ extended-testing = ["lxml (>=5.1.0,<6.0.0)"] [[package]] name = "langsmith" -version = "0.1.28" +version = "0.1.31" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false -python-versions = ">=3.8.1,<4.0" +python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.28-py3-none-any.whl", hash = "sha256:a704db624b1dc8da635f62a5ff7136d8dbdd32c7cdb487604e8247d70985e269"}, - {file = "langsmith-0.1.28.tar.gz", hash = "sha256:a66ff27447d638d9083e656db907754bf1089cd7220c60604778cab133e372b4"}, + {file = "langsmith-0.1.31-py3-none-any.whl", hash = "sha256:5211a9dc00831db307eb843485a97096484b697b5d2cd1efaac34228e97ca087"}, + {file = "langsmith-0.1.31.tar.gz", hash = "sha256:efd54ccd44be7fda911bfdc0ead340473df2fdd07345c7252901834d0c4aa37e"}, ] [package.dependencies] @@ -1046,13 +1046,13 @@ files = [ [[package]] name = "openai" -version = "1.14.1" +version = "1.14.2" description = "The official Python library for the openai API" optional = false python-versions = ">=3.7.1" files = [ - {file = "openai-1.14.1-py3-none-any.whl", hash = "sha256:f9322b0bf3b82bbd06930fad535369a023f35a3a96d3ef0b827644a15d7aae97"}, - {file = "openai-1.14.1.tar.gz", hash = "sha256:1fab5dd623cdc0c7c6e7da5d8d11fa6900f94191c2dfb6510d7eac33195fa175"}, + {file = "openai-1.14.2-py3-none-any.whl", hash = "sha256:a48b3c4d635b603952189ac5a0c0c9b06c025b80eb2900396939f02bb2104ac3"}, + {file = "openai-1.14.2.tar.gz", hash = "sha256:e5642f7c02cf21994b08477d7bb2c1e46d8f335d72c26f0396c5f89b15b5b153"}, ] [package.dependencies] @@ -1330,17 +1330,17 @@ testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygm [[package]] name = "pytest-mock" -version = "3.12.0" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.12.0.tar.gz", hash = "sha256:31a40f038c22cad32287bb43932054451ff5583ff094bca6f675df2f8bc1a6e9"}, - {file = "pytest_mock-3.12.0-py3-none-any.whl", hash = "sha256:0972719a7263072da3a21c7f4773069bcc7486027d7e8e1f81d98a47e701bc4f"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -1802,32 +1802,37 @@ telegram = ["requests"] [[package]] name = "tree-sitter" -version = "0.21.0" +version = "0.21.1" description = "Python bindings for the Tree-Sitter parsing library" optional = false -python-versions = "<3.12,>=3.8" -files = [ - {file = "tree-sitter-0.21.0.tar.gz", hash = "sha256:c74ec9eff30e0c5b9f00ee578cca64df322b9885c8a15364a2c537f485abcc77"}, - {file = "tree_sitter-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb334076814909e8b1f22aba5128a07a953e9eacfd269d3e4f1819cf2b290f5b"}, - {file = "tree_sitter-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8da1b036a13a5b1e7e499535060137f0127a05a0b63aec2b7e9992f27e1b0b2e"}, - {file = "tree_sitter-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcae2748f9d210370fca00fff95f7516e49953e60b4919bf42de64906417717"}, - {file = "tree_sitter-0.21.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ca8f27570acb03a06fc3b663e4ebf1d224c442846ed3837a518b044bad20582b"}, - {file = "tree_sitter-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:d78e2cf597f6e54bbfe27beae5dae6cde290d934753cb1a00d8b12d66f2034d8"}, - {file = "tree_sitter-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:384c103edf6e5ac98710c1a71e2956849d692a0c47d55cd5ba3aedc000b7c3d6"}, - {file = "tree_sitter-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ce18b46634a4132c6932e032ea4717e572cf0db40223afcf0eab69664ad3500"}, - {file = "tree_sitter-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e2f0723c025bb532e9a0cad5e1b1f99b6e35049b948321c3ad7617be716bc7a"}, - {file = "tree_sitter-0.21.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:63458f19b266d9ec58057d8435f92728a164a6debc24fb3c545664bc0b4fa087"}, - {file = "tree_sitter-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:f308f7d05019c35d43ea609c1f04ed896fd713ddf5c95db92b3c56dbbd3c1e09"}, - {file = "tree_sitter-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ab516edce67cd201312ecd55b65b195ce118ab900cc649fc868a1185e462a9bc"}, - {file = "tree_sitter-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ef283479cb0d5c37f4c8e6cefa6e28d4de9a1eb858b43e964c4e822282394300"}, - {file = "tree_sitter-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3310284a92d326d050cef385b4f6611a2166fbf04b2789fd87f279bfe939d6cb"}, - {file = "tree_sitter-0.21.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:46539b86c01463d4d5ac7b4834300504218f79e359fb496e0c4da40c24ddb167"}, - {file = "tree_sitter-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:eb89b951958c26f902ea3ae32f5d899ca9231d1aea64823d634f71e77af41b11"}, - {file = "tree_sitter-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:72e109678704785cf75682edae5265106d9d13b5b146c2f6a5cd2ea0ed293e9c"}, - {file = "tree_sitter-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8eae679c13f519ae4437610f5d7a3a849b401f61d0bc08ad0ee580d4102387"}, - {file = "tree_sitter-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a9d007426365f3c027ef50c68ac03ab0b777ca6e613bfe921474ed69ad8ea1f"}, - {file = "tree_sitter-0.21.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:348df964896bc34ec4c55d45d052decbc0ec6519624bd15f2e31580477be5d6d"}, - {file = "tree_sitter-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:55307318d10325ebafb51025cb630663f61172855f43c4054942a4ba69d4f11c"}, +python-versions = ">=3.8" +files = [ + {file = "tree-sitter-0.21.1.tar.gz", hash = "sha256:fc830cea69fff71cdf28e57326eeb9460ae5ff70d1b5d4bba36b889b4ba0237f"}, + {file = "tree_sitter-0.21.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5725ae76f460b25e62788257eac4b3cc86670f97485fbb19f27c6c8a62524db6"}, + {file = "tree_sitter-0.21.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a61817730c9ba0af2a3d646357946a89927ec1a59090ad6898f17cb646f71636"}, + {file = "tree_sitter-0.21.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941690e1ddec309f3cd4cf70d5e63310499f2fdec42913e271720da38f95ff77"}, + {file = "tree_sitter-0.21.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:016ff1578df0f93605b94ffb385925d657371e411f4bd435281cfbb019f3bcf3"}, + {file = "tree_sitter-0.21.1-cp310-cp310-win_amd64.whl", hash = "sha256:d3085928e6ea5170728ea543d53426a4a19877ec67e8d835f754bda383887af6"}, + {file = "tree_sitter-0.21.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:797a57ba1c53162098a0ec23e3983ba2f7c5858fef427ee6560baa12c16288a9"}, + {file = "tree_sitter-0.21.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bec17a7ea8c7d628b60abf8be1e9ede18fb6dac6aeab4c4f5b0f458404ad594"}, + {file = "tree_sitter-0.21.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba3e9218e375f35b0bdb284747d6d42282810601a0cc0565c681cc10d45fb1d"}, + {file = "tree_sitter-0.21.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:08b9193de82e8029f42b05a618e4a99151133b5a0a746fa56070d37665f6181d"}, + {file = "tree_sitter-0.21.1-cp311-cp311-win_amd64.whl", hash = "sha256:dacf0bd3124aaa0e1474ce96a36276d90fd3a0cb581a5bc185ef0366f4617e47"}, + {file = "tree_sitter-0.21.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:88793e8e0b32c531cefcaa86c858d4c46079b629c9ec4ed264ba86337f9754b3"}, + {file = "tree_sitter-0.21.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c02f8a8b8c463b5b0ce007d3568ce434f159a176cedc8a3eaa68ec745bc8f0d"}, + {file = "tree_sitter-0.21.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c6879f6a7544c15f0e3e4185c391d09cf643a7664f251ccb97dde243cf6ba51"}, + {file = "tree_sitter-0.21.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b4f029b04d267ed9dd0c78a816f92c28bfc4962194db5fbb6a6e2c83622fec2"}, + {file = "tree_sitter-0.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:e9b32455d8f7151eb6a6a03541461e32107479a7dbc00fe1b1f93f899ce71234"}, + {file = "tree_sitter-0.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:96718b674f0e86c58d31d0f8507aa33b89af9381631f1a41c22231b6b0fc968a"}, + {file = "tree_sitter-0.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:404dd04cc6506d3b3b9ff6e82de3afd51f50d9253a7dbaac175b02019bb6e3e9"}, + {file = "tree_sitter-0.21.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c2e322b00eea3f77426778b72e06d692ffce18571b0c7b56dd5fefc23fb79dc"}, + {file = "tree_sitter-0.21.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1c3081556248a6149e49756491ad80cbbb6428bb6997120c857a01e6d8d426a6"}, + {file = "tree_sitter-0.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:22c528609e8017c3b703472fe2e5e84c24d132cf9ce1cb19fc61d9f54037ceda"}, + {file = "tree_sitter-0.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:18544491bf2910e1587f67bcd568eeaf6de4a9d3b47c8018a724d4b97f96596b"}, + {file = "tree_sitter-0.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8023c3e4e8133db620c7779577c9cf2b81ae047e40ce132af7b49ad0470676ce"}, + {file = "tree_sitter-0.21.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38f5cf1ca75c9f874028bb4c0b4dfada1a39807286191dd8de67206971392d35"}, + {file = "tree_sitter-0.21.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5732e57f86037b5a95eeed8d59967b0c8f3534622c998ac0e49ffaab3dee9f8f"}, + {file = "tree_sitter-0.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:001b3162586f2e87949fdee768d266510bd21ec87f5c10f0e8a6fe20f1232647"}, ] [[package]] From 1567441a76ec5727df2e5459e1a6619a9d6baf7b Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:35:48 +0000 Subject: [PATCH 34/72] Add ConversationSummaryMemory and ConversationalRetrievalChain imports --- senior_swe_ai/cli.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 23cc3ea..b76c9d6 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -3,6 +3,8 @@ import os import sys from typing import List +from langchain.memory import ConversationSummaryMemory +from langchain.chains.conversational_retrieval.base import ConversationalRetrievalChain import pkg_resources import inquirer from langchain_core.documents.base import Document @@ -61,6 +63,8 @@ def main() -> None: embed_mdl = OpenAIEmbeddings( model=conf['embed_model'], api_key=conf['api_key']) + vec_store = VectorStore(embed_mdl, repo_name) + if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): try: pkg_resources.get_distribution('faiss') @@ -98,10 +102,17 @@ def main() -> None: # all desired files in the git repository tree files: list[str] = recursive_load_files() docs: List[Document] = parse_code_files(files) - vec_store = VectorStore(embed_mdl, repo_name) vec_store.idx_docs(docs) save_vec_cache(vec_store.vec_cache, f'{repo_name}.json') + vec_store.load_docs() + + mem = ConversationSummaryMemory( + llm=conf['chat_model'], memory_key='chat_history', return_messages=True + ) + qa = ConversationalRetrievalChain( + conf['chat_model'], retriever=vec_store.retrieval, memory=mem) + if __name__ == '__main__': main() From 1188b107edc454ea68888ebe482d18139336140d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:35:53 +0000 Subject: [PATCH 35/72] Add load_docs method to VectorStore class --- senior_swe_ai/vec_store.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/vec_store.py b/senior_swe_ai/vec_store.py index a06aeae..0dc3e34 100644 --- a/senior_swe_ai/vec_store.py +++ b/senior_swe_ai/vec_store.py @@ -9,7 +9,7 @@ from langchain_community.vectorstores.faiss import FAISS as faiss from langchain_core.vectorstores import VectorStoreRetriever -from senior_swe_ai.cache import VectorCache, get_cache_path +from senior_swe_ai.cache import VectorCache, get_cache_path, load_vec_cache class VectorStore: @@ -54,4 +54,15 @@ def idx_docs(self, docs: List[Document]) -> None: def similarity_search(self, query: str) -> List[Document]: """Search for similar documents to the given query""" - return self.db.similarity_search(query, k=4) \ No newline at end of file + return self.db.similarity_search(query, k=4) + + def load_docs(self): + """ Load the documents from the cache """ + with open(os.path.join(get_cache_path(), f"{self.name}.faiss"), "rb") as f: + idx: bytes = f.read() + self.db = faiss.deserialize_from_bytes(idx, self.embed_mdl) + self.vec_cache: Dict[str, VectorCache] = load_vec_cache( + f'{self.name}.json') + self.retrieval = self.db.as_retriever( + search_type="mmr", search_kwargs={"k": 8} + ) From f9b8d9dfc2656f05149bcf3c494cf3c96ce6ff1e Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:47:02 +0000 Subject: [PATCH 36/72] Fix Haskell support in get_langchain_language function --- senior_swe_ai/llm_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/senior_swe_ai/llm_handler.py b/senior_swe_ai/llm_handler.py index c0f2cc7..f4b19fd 100644 --- a/senior_swe_ai/llm_handler.py +++ b/senior_swe_ai/llm_handler.py @@ -42,6 +42,6 @@ def get_langchain_language(language: Language) -> text_splitter.Language | None: Language.CPP: text_splitter.Language.CPP, Language.C_SHARP: text_splitter.Language.CSHARP, Language.RUBY: text_splitter.Language.RUBY, - Language.HASKELL: None, # TODO: Add Haskell support + Language.HASKELL: None, # : Add Haskell support } return lang_map.get(language, None) From 0e36b5ee38c11287ed37efdafdc55ed1b299e921 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Thu, 21 Mar 2024 22:47:07 +0000 Subject: [PATCH 37/72] Refactor vec_store.py to remove unused imports --- senior_swe_ai/vec_store.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/senior_swe_ai/vec_store.py b/senior_swe_ai/vec_store.py index 0dc3e34..a86dda2 100644 --- a/senior_swe_ai/vec_store.py +++ b/senior_swe_ai/vec_store.py @@ -2,9 +2,8 @@ vector store for storing embeddings and their metadata, to enable fast search and retrieval """ -from typing import Any, Dict, List, Optional, Tuple +from typing import Dict, List import os -import inquirer from langchain.schema import Document from langchain_community.vectorstores.faiss import FAISS as faiss from langchain_core.vectorstores import VectorStoreRetriever From d69c6bb526bdde0bd5d55fec101ff4ff34772966 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:28:07 +0000 Subject: [PATCH 38/72] Update CLI to use FaissModel enum values and add chat functionality --- senior_swe_ai/cli.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index b76c9d6..aa7b9cf 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -85,10 +85,10 @@ def main() -> None: message="Please select the appropriate option to install FAISS. \ Use gpu if your system supports CUDA", choices=[ - FaissModel.FAISS_CPU, - FaissModel.FAISS_GPU, + FaissModel.FAISS_CPU.value, + FaissModel.FAISS_GPU.value, ], - default=FaissModel.FAISS_CPU, + default=FaissModel.FAISS_CPU.value, ) ] answer: dict[str, str] = inquirer.prompt(question) @@ -113,6 +113,28 @@ def main() -> None: qa = ConversationalRetrievalChain( conf['chat_model'], retriever=vec_store.retrieval, memory=mem) + try: + continue_chat = True + while continue_chat: + question: str = input(conf['username'] + ': ') + answer = qa(question) + print(repo_name + ': ' + answer) + + choice: str = ( + input( + '[C]ontinue chatting, [R]eset chat history, or [Q]uit? ' + ).strip().upper() + ) + if choice == 'C': + continue + if choice == 'R': + mem.clear() + continue + if choice == 'Q': + continue_chat = False + except KeyboardInterrupt: + print('āœŒ') + if __name__ == '__main__': main() From 67f15d998d78c725e4307ba61105aa62117fcb1c Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:28:54 +0000 Subject: [PATCH 39/72] Fix duplicate config --- senior_swe_ai/cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index aa7b9cf..f47949f 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -49,6 +49,7 @@ def main() -> None: repo_name: str = get_repo_name() repo_root: str = get_repo_root() + # TODO: Fix duplicate config append_conf({'repo_name': repo_name, 'repo_root': repo_root}) try: From b9e3f7d9f845c7aea6c6f6db9b4d51dfca9fb160 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 00:35:50 +0000 Subject: [PATCH 40/72] Update configuration handling in conf.py --- senior_swe_ai/conf.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/senior_swe_ai/conf.py b/senior_swe_ai/conf.py index 1d95cbd..67a4a99 100644 --- a/senior_swe_ai/conf.py +++ b/senior_swe_ai/conf.py @@ -107,16 +107,26 @@ def save_conf(conf) -> None: def append_conf(conf: dict[Any, Any]) -> None: """ Append the configuration to the file """ conf_file_path: str = get_config_path() - with open(conf_file_path, 'a', encoding='utf-8') as conf_file: - toml.dump(conf, conf_file) + conf_item: dict[Any, Any] = load_conf() + + # Update the existing configuration with the new configuration + conf_item.update(conf) + + # Write the updated configuration back to the file + with open(conf_file_path, 'w', encoding='utf-8') as conf_file: + toml.dump(conf_item, conf_file) def load_conf() -> dict[Any, Any]: """ Load the configuration from the file """ conf_file_path: str = get_config_path() - with open(conf_file_path, 'r', encoding='utf-8') as conf_file: - conf: dict[Any, Any] = toml.load(conf_file) - return conf + try: + with open(conf_file_path, 'r', encoding='utf-8') as conf_file: + conf: dict[Any, Any] = toml.load(conf_file) + return conf + except FileNotFoundError as e: + raise FileNotFoundError( + 'Configuration file not found, `init` the app first.') from e def get_username() -> str: From b8f6a88de001cc7e0668a777593d7ed090fbfc23 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 00:46:01 +0000 Subject: [PATCH 41/72] Remove duplicate config in main function --- senior_swe_ai/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index f47949f..aa7b9cf 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -49,7 +49,6 @@ def main() -> None: repo_name: str = get_repo_name() repo_root: str = get_repo_root() - # TODO: Fix duplicate config append_conf({'repo_name': repo_name, 'repo_root': repo_root}) try: From 920c3aec6c9912afc91660fdfa6c5a4521d378d2 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 00:50:45 +0000 Subject: [PATCH 42/72] Add type hints and fix none return type in parse_code_files function --- senior_swe_ai/file_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/senior_swe_ai/file_handler.py b/senior_swe_ai/file_handler.py index a0aaf3a..ceee2bb 100644 --- a/senior_swe_ai/file_handler.py +++ b/senior_swe_ai/file_handler.py @@ -14,7 +14,7 @@ def get_extension(file_path: str) -> str: """Get the file extension from the file path""" return '.' + file_path.split('.')[-1] - +# TODO (senior_swe_ai): Add type hints, fix none return type def parse_code_files(code_files: list[str]) -> list[Document]: """Parse the given code files and return a list of Documents""" documents: list = [] From e60bc23c41b438831d26bfa0f29921473e21bc87 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:32:26 +0000 Subject: [PATCH 43/72] Update cli.py with ChatOpenAI model and fix print statement --- senior_swe_ai/cli.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index aa7b9cf..460c5fe 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -4,11 +4,13 @@ import sys from typing import List from langchain.memory import ConversationSummaryMemory -from langchain.chains.conversational_retrieval.base import ConversationalRetrievalChain +from langchain.chains.conversational_retrieval.base import ( + BaseConversationalRetrievalChain, ConversationalRetrievalChain +) import pkg_resources import inquirer from langchain_core.documents.base import Document -from langchain_openai import OpenAIEmbeddings +from langchain_openai import OpenAIEmbeddings, ChatOpenAI from senior_swe_ai.file_handler import parse_code_files from senior_swe_ai.git_process import ( is_git_repo, get_repo_name, get_repo_root, recursive_load_files @@ -106,19 +108,20 @@ def main() -> None: save_vec_cache(vec_store.vec_cache, f'{repo_name}.json') vec_store.load_docs() - + chat_mdl = ChatOpenAI(model=conf['chat_model'], api_key=conf['api_key'], temperature=0.9, + max_tokens=2048) mem = ConversationSummaryMemory( - llm=conf['chat_model'], memory_key='chat_history', return_messages=True + llm=chat_mdl, memory_key='chat_history', return_messages=True ) - qa = ConversationalRetrievalChain( - conf['chat_model'], retriever=vec_store.retrieval, memory=mem) + qa: BaseConversationalRetrievalChain = ConversationalRetrievalChain.from_llm( + chat_mdl, retriever=vec_store.retrieval, memory=mem) try: continue_chat = True while continue_chat: question: str = input(conf['username'] + ': ') answer = qa(question) - print(repo_name + ': ' + answer) + print(repo_name + ': ' + answer['answer']) choice: str = ( input( @@ -133,7 +136,7 @@ def main() -> None: if choice == 'Q': continue_chat = False except KeyboardInterrupt: - print('āœŒ') + print('\nāœŒ') if __name__ == '__main__': From 1f1f77614b66dba9b9807e61f0692c3ad6d9226f Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:32:38 +0000 Subject: [PATCH 44/72] Exclude too few public methods in pylint configuration file --- .pylintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pylintrc b/.pylintrc index a6052c6..8c4795a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -278,7 +278,7 @@ valid-metaclass-classmethod-first-arg=mcs # List of regular expressions of class ancestor names to ignore when counting # public methods (see R0903) -exclude-too-few-public-methods= +# exclude-too-few-public-methods= # List of qualified class names to ignore when counting class parents (see # R0901) From 2833e0db426328e78616b512a8121e3867daa08d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:33:49 +0000 Subject: [PATCH 45/72] Fix OpenAI API key validation --- senior_swe_ai/conf.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/senior_swe_ai/conf.py b/senior_swe_ai/conf.py index 67a4a99..a291bcf 100644 --- a/senior_swe_ai/conf.py +++ b/senior_swe_ai/conf.py @@ -52,7 +52,7 @@ def config_init() -> None: while api_validate is False: api_key: str = getpass.getpass('Enter your OpenAI API key: ') - api_validate: bool = validate_api_key(api_key) + api_validate: bool = validate_api_key(api_key.strip()) if api_validate is False: print('Invalid API key. Please try again.') @@ -83,17 +83,19 @@ def validate_api_key(api_key: str) -> bool: try: # Make a simple request to the API - client = openai.OpenAI() - openai.api_key = api_key + client = openai.OpenAI(api_key=api_key) + # openai.api_key = api_key client.embeddings.create( input="A test request to validate the API key", model="text-embedding-ada-002" ) return True - except openai.AuthenticationError: + except openai.AuthenticationError as e: # If an AuthenticationError is raised, the API key is invalid + print(f"AuthenticationError: {e}") return False - except openai.OpenAIError: + except openai.OpenAIError as e: + print(f"OpenAIError: {e}") return False From e57931d908c1b2b7f9053835ca0162a07fb3662b Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:34:32 +0000 Subject: [PATCH 46/72] Add type hints and fix none return type in file_handler.py --- senior_swe_ai/file_handler.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/senior_swe_ai/file_handler.py b/senior_swe_ai/file_handler.py index ceee2bb..f336659 100644 --- a/senior_swe_ai/file_handler.py +++ b/senior_swe_ai/file_handler.py @@ -14,12 +14,12 @@ def get_extension(file_path: str) -> str: """Get the file extension from the file path""" return '.' + file_path.split('.')[-1] -# TODO (senior_swe_ai): Add type hints, fix none return type + def parse_code_files(code_files: list[str]) -> list[Document]: """Parse the given code files and return a list of Documents""" documents: list = [] for code_file in code_files: - file_bytes, commit_hash, programming_language = read_file_and_get_metadata( + file_bytes, commit_hash, programming_language, file_extension = read_file_and_get_metadata( code_file) if programming_language is None: continue @@ -30,7 +30,9 @@ def parse_code_files(code_files: list[str]) -> list[Document]: file_bytes, programming_language) documents.extend(create_documents_from_nodes( - treesitter_nodes, code_file, commit_hash, code_splitter, programming_language)) + treesitter_nodes, code_file, commit_hash, + code_splitter, programming_language, file_extension + )) return documents @@ -45,7 +47,7 @@ def read_file_and_get_metadata(code_file: str) -> Tuple[bytes, str, Optional[Lan programming_language: Language | None = get_langchain_text_splitters( file_extension) - return file_bytes, commit_hash, programming_language + return file_bytes, commit_hash, programming_language, file_extension def parse_file_with_treesitter( @@ -65,7 +67,8 @@ def create_documents_from_nodes( code_file: str, commit_hash: str, code_splitter: RecursiveCharacterTextSplitter, - programming_language: Language + programming_language: Language, + extension: str ) -> list[Document]: """Create documents from the Treesitter nodes and return them as a list""" documents: list = [] @@ -88,6 +91,8 @@ def create_documents_from_nodes( "filename": filename, "method_name": node.name, "commit_hash": commit_hash, + 'language': programming_language, + 'extension': extension, }, ) documents.append(document) @@ -104,7 +109,4 @@ def create_character_text_splitter(language: Language) -> RecursiveCharacterText chunk_size=512, chunk_overlap=128, ) - return RecursiveCharacterTextSplitter( - chunk_size=512, - chunk_overlap=128, - ) + return None From c92d912a1b2dd642dffac4ffd5cd4de3a4328d53 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:34:43 +0000 Subject: [PATCH 47/72] Add tree parsers for various programming languages --- senior_swe_ai/tree_parser/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/senior_swe_ai/tree_parser/__init__.py b/senior_swe_ai/tree_parser/__init__.py index e69de29..8e60366 100644 --- a/senior_swe_ai/tree_parser/__init__.py +++ b/senior_swe_ai/tree_parser/__init__.py @@ -0,0 +1,13 @@ +""" This module is responsible for parsing the ASTs of different programming languages. """ +from senior_swe_ai.tree_parser.base import Treesitter, TreesitterMethodNode +from senior_swe_ai.tree_parser.tree_parser_c import TreesitterC +from senior_swe_ai.tree_parser.tree_parser_cpp import TreesitterCpp +from senior_swe_ai.tree_parser.tree_parser_cs import TreesitterCsharp +from senior_swe_ai.tree_parser.tree_parser_go import TreesitterGo +from senior_swe_ai.tree_parser.tree_parser_java import TreesitterJava +from senior_swe_ai.tree_parser.tree_parser_js import TreesitterJavascript +from senior_swe_ai.tree_parser.tree_parser_kt import TreesitterKotlin +from senior_swe_ai.tree_parser.tree_parser_py import TreesitterPython +from senior_swe_ai.tree_parser.tree_parser_rb import TreesitterRuby +from senior_swe_ai.tree_parser.tree_parser_rs import TreesitterRust +from senior_swe_ai.tree_parser.tree_parser_ts import TreesitterTypescript From 18140e71f4c554f799218ed30e6f061bab319064 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 21:34:59 +0000 Subject: [PATCH 48/72] Fix issue with TreesitterMethodNode class and add tree attribute --- senior_swe_ai/tree_parser/base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/senior_swe_ai/tree_parser/base.py b/senior_swe_ai/tree_parser/base.py index 976b299..51bf847 100644 --- a/senior_swe_ai/tree_parser/base.py +++ b/senior_swe_ai/tree_parser/base.py @@ -9,7 +9,7 @@ from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry -class TreesitterMethodNode: +class TreesitterMethodNode: # pylint: disable=too-few-public-methods """Class to represent a method node in the tree-sitter parse tree.""" def __init__( @@ -40,6 +40,7 @@ def __init__( self.method_declaration_identifier: str = method_declaration_identifier self.method_name_identifier: str = name_identifier self.doc_comment_identifier: str = doc_comment_identifier + self.tree: tree_sitter.Tree | None = None @staticmethod def create_treesitter(lang: Language) -> Any: @@ -52,7 +53,7 @@ def parse(self, file_bytes: bytes) -> list[TreesitterMethodNode]: result = [] methods = self._query_all_methods(self.tree.root_node) for method in methods: - method_name = self._query_method_name(method["method"]) + method_name: str | None = self._query_method_name(method["method"]) doc_comment = method["doc_comment"] result.append( TreesitterMethodNode( From 21d2cdc8197269556d1008af15954f9ecb701489 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 22:03:17 +0000 Subject: [PATCH 49/72] Update import statements and convert repo name to uppercase --- senior_swe_ai/cli.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 460c5fe..64f89c9 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -7,7 +7,7 @@ from langchain.chains.conversational_retrieval.base import ( BaseConversationalRetrievalChain, ConversationalRetrievalChain ) -import pkg_resources +from importlib.metadata import distribution, PackageNotFoundError import inquirer from langchain_core.documents.base import Document from langchain_openai import OpenAIEmbeddings, ChatOpenAI @@ -48,8 +48,8 @@ def main() -> None: print('The current directory is not a git repository') sys.exit(1) - repo_name: str = get_repo_name() - repo_root: str = get_repo_root() + repo_name: str = get_repo_name().upper() + repo_root: str = get_repo_root().upper() append_conf({'repo_name': repo_name, 'repo_root': repo_root}) @@ -69,8 +69,8 @@ def main() -> None: if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): try: - pkg_resources.get_distribution('faiss') - except pkg_resources.DistributionNotFound: + distribution('faiss') + except PackageNotFoundError: question = [ inquirer.List( 'install', From 435a9da711c9c42c58e6c8e86e6ee908c5efeaeb Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 22:03:23 +0000 Subject: [PATCH 50/72] Update username to uppercase in config_init() function --- senior_swe_ai/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/senior_swe_ai/conf.py b/senior_swe_ai/conf.py index a291bcf..8bb8bab 100644 --- a/senior_swe_ai/conf.py +++ b/senior_swe_ai/conf.py @@ -71,7 +71,7 @@ def config_init() -> None: conf: dict[str, str] = { 'api_key': api_key, - 'username': get_username(), + 'username': get_username().upper(), 'embed_model': answers['embed_model'], 'chat_model': 'gpt-3.5-turbo' } From 8e9fecf6315c4b74a6e6f94d3f820cbc80b4a8b7 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 22:03:55 +0000 Subject: [PATCH 51/72] Fix repo_root variable assignment --- senior_swe_ai/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 64f89c9..64dafb5 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -49,7 +49,7 @@ def main() -> None: sys.exit(1) repo_name: str = get_repo_name().upper() - repo_root: str = get_repo_root().upper() + repo_root: str = get_repo_root() append_conf({'repo_name': repo_name, 'repo_root': repo_root}) From cac8794464d707f5044be8f7bedc1a417b7ccaec Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sat, 23 Mar 2024 22:47:41 +0000 Subject: [PATCH 52/72] Add import statement for PackageNotFoundError --- senior_swe_ai/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 64dafb5..1582a93 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -3,11 +3,11 @@ import os import sys from typing import List +from importlib.metadata import distribution, PackageNotFoundError from langchain.memory import ConversationSummaryMemory from langchain.chains.conversational_retrieval.base import ( BaseConversationalRetrievalChain, ConversationalRetrievalChain ) -from importlib.metadata import distribution, PackageNotFoundError import inquirer from langchain_core.documents.base import Document from langchain_openai import OpenAIEmbeddings, ChatOpenAI From 4fbcf0dca59f0347c22e665315b41cedaad94ebf Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:13:10 +0000 Subject: [PATCH 53/72] Update pyproject.toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index d0caa36..7947311 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "senior-swe-ai" version = "0.1.0" description = "SeniorSWE-AI is a command-line interface for in-context embedding that leverages the semantic comprehension capabilities of large language models to analyze the intended codebase and engage in a conversation with it, mimicking the behavior of a seasoned software engineer. " -authors = ["Younis <23105954+Younis-Ahmed@users.noreply.github.com>"] +authors = ["younisalx-swe@hotmail.com"] readme = "README.md" [tool.poetry.dependencies] @@ -18,6 +18,7 @@ langchain-community = "^0.0.28" langchain-text-splitters = "^0.0.1" langchain-openai = "^0.0.8" tiktoken = "^0.6.0" +rich = "^13.7.1" [tool.poetry.group.dev.dependencies] From 06a5c6e7a8b9d53fd2bb9368fbb80502792e5e21 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:13:18 +0000 Subject: [PATCH 54/72] Fix import error and update help message --- senior_swe_ai/cli.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/senior_swe_ai/cli.py b/senior_swe_ai/cli.py index 1582a93..c8b2962 100644 --- a/senior_swe_ai/cli.py +++ b/senior_swe_ai/cli.py @@ -3,7 +3,6 @@ import os import sys from typing import List -from importlib.metadata import distribution, PackageNotFoundError from langchain.memory import ConversationSummaryMemory from langchain.chains.conversational_retrieval.base import ( BaseConversationalRetrievalChain, ConversationalRetrievalChain @@ -18,7 +17,7 @@ from senior_swe_ai.conf import config_init, load_conf, append_conf from senior_swe_ai.cache import create_cache_dir, get_cache_path, save_vec_cache from senior_swe_ai.vec_store import VectorStore -from senior_swe_ai.consts import FaissModel +from senior_swe_ai.consts import FaissModel, faiss_installed def main() -> None: @@ -34,7 +33,7 @@ def main() -> None: parser.add_argument( 'options', choices=['init', 'chat'], - help="'init': initialize the app. 'chat': chat with the AI" + help="'init': initialize the app. 'chat': chat with desired codebase." ) args: Namespace = parser.parse_args() @@ -68,9 +67,8 @@ def main() -> None: vec_store = VectorStore(embed_mdl, repo_name) if not os.path.exists(get_cache_path() + f'/{repo_name}.faiss'): - try: - distribution('faiss') - except PackageNotFoundError: + is_faiss_installed: bool = faiss_installed() + if not is_faiss_installed: question = [ inquirer.List( 'install', From 2c8c25d0c4fa1a94da2e29021b33c1df113fefb7 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:13:34 +0000 Subject: [PATCH 55/72] Add faiss_installed function to check if faiss is installed --- senior_swe_ai/consts.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/senior_swe_ai/consts.py b/senior_swe_ai/consts.py index 11bf492..10bae65 100644 --- a/senior_swe_ai/consts.py +++ b/senior_swe_ai/consts.py @@ -1,5 +1,6 @@ """ Holds all constants for the project. """ from enum import Enum +from importlib.metadata import distribution, PackageNotFoundError class Language(Enum): @@ -140,3 +141,14 @@ class FaissModel(Enum): ".hs", ".rb", ] + + +def faiss_installed() -> bool: + """Check if faiss is installed.""" + for pack in FaissModel: + try: + distribution(pack.value) + return True + except PackageNotFoundError: + continue + return False From 9c9e04817b75571a75f094d30faad7416034d81d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:30:53 +0000 Subject: [PATCH 56/72] Refactor tree parser imports and function names --- senior_swe_ai/file_handler.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/senior_swe_ai/file_handler.py b/senior_swe_ai/file_handler.py index f336659..739d06d 100644 --- a/senior_swe_ai/file_handler.py +++ b/senior_swe_ai/file_handler.py @@ -7,7 +7,7 @@ from langchain_text_splitters import Language from senior_swe_ai.git_process import get_hash from senior_swe_ai.llm_handler import get_langchain_language, get_langchain_text_splitters -from senior_swe_ai.tree_parser.base import Treesitter, TreesitterMethodNode +from senior_swe_ai.tree_parser.base import BaseTreeParser, TreeParserMethodNode def get_extension(file_path: str) -> str: @@ -26,7 +26,7 @@ def parse_code_files(code_files: list[str]) -> list[Document]: code_splitter: RecursiveCharacterTextSplitter = create_character_text_splitter( programming_language) - treesitter_nodes: List[TreesitterMethodNode] = parse_file_with_treesitter( + treesitter_nodes: List[TreeParserMethodNode] = parse_file_with_treesitter( file_bytes, programming_language) documents.extend(create_documents_from_nodes( @@ -53,24 +53,24 @@ def read_file_and_get_metadata(code_file: str) -> Tuple[bytes, str, Optional[Lan def parse_file_with_treesitter( file_bytes: bytes, programming_language: Language -) -> list[TreesitterMethodNode]: - """Parse the file using Treesitter and return the method nodes""" - treesitter_parser = Treesitter.create_treesitter(programming_language) - treesitter_nodes: list[TreesitterMethodNode] = treesitter_parser.parse( +) -> list[TreeParserMethodNode]: + """Parse the file using BaseTreeParser and return the method nodes""" + treesitter_parser = BaseTreeParser.create_treesitter(programming_language) + treesitter_nodes: list[TreeParserMethodNode] = treesitter_parser.parse( file_bytes) return treesitter_nodes def create_documents_from_nodes( - treesitter_nodes: list[TreesitterMethodNode], + treesitter_nodes: list[TreeParserMethodNode], code_file: str, commit_hash: str, code_splitter: RecursiveCharacterTextSplitter, programming_language: Language, extension: str ) -> list[Document]: - """Create documents from the Treesitter nodes and return them as a list""" + """Create documents from the BaseTreeParser nodes and return them as a list""" documents: list = [] for node in treesitter_nodes: method_source_code = node.method_source_code From d83ca04d527c07cb16e74b68573dd85f69719b30 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:00 +0000 Subject: [PATCH 57/72] Update tree parser imports --- senior_swe_ai/tree_parser/__init__.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/senior_swe_ai/tree_parser/__init__.py b/senior_swe_ai/tree_parser/__init__.py index 8e60366..f1e64d7 100644 --- a/senior_swe_ai/tree_parser/__init__.py +++ b/senior_swe_ai/tree_parser/__init__.py @@ -1,13 +1,13 @@ """ This module is responsible for parsing the ASTs of different programming languages. """ -from senior_swe_ai.tree_parser.base import Treesitter, TreesitterMethodNode -from senior_swe_ai.tree_parser.tree_parser_c import TreesitterC -from senior_swe_ai.tree_parser.tree_parser_cpp import TreesitterCpp -from senior_swe_ai.tree_parser.tree_parser_cs import TreesitterCsharp -from senior_swe_ai.tree_parser.tree_parser_go import TreesitterGo -from senior_swe_ai.tree_parser.tree_parser_java import TreesitterJava -from senior_swe_ai.tree_parser.tree_parser_js import TreesitterJavascript -from senior_swe_ai.tree_parser.tree_parser_kt import TreesitterKotlin -from senior_swe_ai.tree_parser.tree_parser_py import TreesitterPython -from senior_swe_ai.tree_parser.tree_parser_rb import TreesitterRuby -from senior_swe_ai.tree_parser.tree_parser_rs import TreesitterRust -from senior_swe_ai.tree_parser.tree_parser_ts import TreesitterTypescript +from senior_swe_ai.tree_parser.base import BaseTreeParser, TreeParserMethodNode +from senior_swe_ai.tree_parser.tree_parser_c import TreeParserC +from senior_swe_ai.tree_parser.tree_parser_cpp import TreeParserCpp +from senior_swe_ai.tree_parser.tree_parser_cs import TreeParserCsharp +from senior_swe_ai.tree_parser.tree_parser_go import TreeParserGo +from senior_swe_ai.tree_parser.tree_parser_java import TreeParserJava +from senior_swe_ai.tree_parser.tree_parser_js import TreeParserJs +from senior_swe_ai.tree_parser.tree_parser_kt import TreeParserKotlin +from senior_swe_ai.tree_parser.tree_parser_py import TreeParsePy +from senior_swe_ai.tree_parser.tree_parser_rb import TreeParseRuby +from senior_swe_ai.tree_parser.tree_parser_rs import TreeParseRust +from senior_swe_ai.tree_parser.tree_parser_ts import TreeParseTypescript From 47aa89ca94dc1fe6d7e6dbc45cb98363ab3b2f0d Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:11 +0000 Subject: [PATCH 58/72] Refactor tree-sitter parser classes and rename TreesitterMethodNode to TreeParserMethodNode --- senior_swe_ai/tree_parser/base.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/senior_swe_ai/tree_parser/base.py b/senior_swe_ai/tree_parser/base.py index 51bf847..b24ad5c 100644 --- a/senior_swe_ai/tree_parser/base.py +++ b/senior_swe_ai/tree_parser/base.py @@ -1,22 +1,24 @@ """Base class for tree-sitter parsers.""" from abc import ABC +from dataclasses import dataclass from typing import Any import tree_sitter from tree_sitter_languages import get_language, get_parser from senior_swe_ai.consts import Language -from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry -class TreesitterMethodNode: # pylint: disable=too-few-public-methods +@dataclass +class TreeParserMethodNode: """Class to represent a method node in the tree-sitter parse tree.""" def __init__( self, - name: "str | bytes | None", - doc_comment: "str | None", - method_source_code: "str | None", + name: str | bytes | None, + doc_comment: str | None, + method_source_code: str | None, node: tree_sitter.Node, ) -> None: self.name: str | bytes | None = name @@ -25,7 +27,7 @@ def __init__( self.node: tree_sitter.Node = node -class Treesitter(ABC): +class BaseTreeParser(ABC): """ Base class for tree-sitter parsers.""" def __init__( @@ -45,9 +47,9 @@ def __init__( @staticmethod def create_treesitter(lang: Language) -> Any: """Factory method to create a tree-sitter parser for the given language.""" - return TreesitterRegistry.create_treesitter(lang) + return TreeParserRegistry.create_treesitter(lang) - def parse(self, file_bytes: bytes) -> list[TreesitterMethodNode]: + def parse(self, file_bytes: bytes) -> list[TreeParserMethodNode]: """Parse the given file and return a list of method nodes.""" self.tree = self.parser.parse(file_bytes) result = [] @@ -56,7 +58,7 @@ def parse(self, file_bytes: bytes) -> list[TreesitterMethodNode]: method_name: str | None = self._query_method_name(method["method"]) doc_comment = method["doc_comment"] result.append( - TreesitterMethodNode( + TreeParserMethodNode( method_name, doc_comment, None, method["method"]) ) return result From 170d828c0fdb604180aeea77e47b3301a81bbea3 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:21 +0000 Subject: [PATCH 59/72] Refactor TreesitterC to TreeParserC --- senior_swe_ai/tree_parser/tree_parser_c.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/senior_swe_ai/tree_parser/tree_parser_c.py b/senior_swe_ai/tree_parser/tree_parser_c.py index ed2984d..bc08f70 100644 --- a/senior_swe_ai/tree_parser/tree_parser_c.py +++ b/senior_swe_ai/tree_parser/tree_parser_c.py @@ -1,23 +1,26 @@ -"""This module contains the TreesitterC class, which is responsible for +"""This module contains the TreeParserC class, which is responsible for parsing C code using the tree-sitter library.""" +import warnings import tree_sitter from senior_swe_ai.consts import Language -from senior_swe_ai.tree_parser.base import Treesitter -from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry -class TreesitterC(Treesitter): +class TreeParserC(BaseTreeParser): """Class to parse C code using the tree-sitter library.""" - def __init__(self): - super().__init__(Language.C, "function_definition", "identifier", "comment") + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__(Language.C, "function_definition", "identifier", "comment") - def _query_method_name(self, node: tree_sitter.Node): + def _query_method_name(self, node: tree_sitter.Node) -> str | None: if node.type == self.method_declaration_identifier: for child in node.children: # if method returns pointer, skip pointer declarator if child.type == "pointer_declarator": - child = child.children[1] + child: tree_sitter.Node = child.children[1] if child.type == "function_declarator": for child in child.children: if child.type == self.method_name_identifier: @@ -25,4 +28,4 @@ def _query_method_name(self, node: tree_sitter.Node): return None -TreesitterRegistry.register_treesitter(Language.C, TreesitterC) +TreeParserRegistry.register_treesitter(Language.C, TreeParserC) From 60466fd65f99fa891d42c46302719bbf6830f607 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:27 +0000 Subject: [PATCH 60/72] Refactor C++ tree parser implementation --- senior_swe_ai/tree_parser/tree_parser_cpp.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/senior_swe_ai/tree_parser/tree_parser_cpp.py b/senior_swe_ai/tree_parser/tree_parser_cpp.py index 5e047cb..47bee5e 100644 --- a/senior_swe_ai/tree_parser/tree_parser_cpp.py +++ b/senior_swe_ai/tree_parser/tree_parser_cpp.py @@ -1,21 +1,25 @@ """Module to parse C++ code using the tree-sitter library.""" +import warnings import tree_sitter from senior_swe_ai.consts import Language -from senior_swe_ai.tree_parser.base import Treesitter -from senior_swe_ai.tree_parser.tree_parser_registry import TreesitterRegistry +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry -class TreesitterCpp(Treesitter): +class TreeParserCpp(BaseTreeParser): """Class to parse C++ code using the tree-sitter library.""" - def __init__(self): - super().__init__(Language.CPP, "function_definition", "identifier", "comment") - def _query_method_name(self, node: tree_sitter.Node): + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__(Language.CPP, "function_definition", "identifier", "comment") + + def _query_method_name(self, node: tree_sitter.Node) -> str | None: if node.type == self.method_declaration_identifier: for child in node.children: # if method returns pointer, skip pointer declarator if child.type == "pointer_declarator": - child = child.children[1] + child: tree_sitter.Node = child.children[1] if child.type == "function_declarator": for child in child.children: if child.type == self.method_name_identifier: @@ -23,4 +27,4 @@ def _query_method_name(self, node: tree_sitter.Node): return None -TreesitterRegistry.register_treesitter(Language.CPP, TreesitterCpp) +TreeParserRegistry.register_treesitter(Language.CPP, TreeParserCpp) From fb57d842b95427a4d660389d221d34c70e7a72c5 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:38 +0000 Subject: [PATCH 61/72] Add TreeParserCsharp class for parsing C# code using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_cs.py | 67 +++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_cs.py diff --git a/senior_swe_ai/tree_parser/tree_parser_cs.py b/senior_swe_ai/tree_parser/tree_parser_cs.py new file mode 100644 index 0000000..0e016a9 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_cs.py @@ -0,0 +1,67 @@ +"""This module contains the TreeParserCsharp class, which is responsible +for parsing C# code using the tree-sitter library.""" +import warnings +import tree_sitter +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParserCsharp(BaseTreeParser): + """Class to parse C# code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.C_SHARP, "method_declaration", "identifier", "comment" + ) + + def _query_method_name(self, node: tree_sitter.Node) -> str | None: + first_match = None + if node.type == self.method_declaration_identifier: + for child in node.children: + if child.type == self.method_name_identifier and not first_match: + first_match: str = child.text.decode() + elif child.type == self.method_name_identifier and first_match: + return child.text.decode() + return first_match + + def _query_all_methods(self, node: tree_sitter.Node) -> list: + methods = [] + if node.type == self.method_declaration_identifier: + doc_comment_nodes = [] + if ( + node.prev_named_sibling + and node.prev_named_sibling.type == self.doc_comment_identifier + ): + current_doc_comment_node: tree_sitter.Node = node.prev_named_sibling + while ( + current_doc_comment_node + and current_doc_comment_node.type == self.doc_comment_identifier + ): + doc_comment_nodes.append( + current_doc_comment_node.text.decode()) + if current_doc_comment_node.prev_named_sibling: + current_doc_comment_node = ( + current_doc_comment_node.prev_named_sibling + ) + else: + current_doc_comment_node = None + + doc_comment_str = "" + doc_comment_nodes.reverse() + for doc_comment_node in doc_comment_nodes: + doc_comment_str += doc_comment_node + "\n" + if doc_comment_str.strip() != "": + methods.append( + {"method": node, "doc_comment": doc_comment_str.strip()}) + else: + methods.append({"method": node, "doc_comment": None}) + else: + for child in node.children: + methods.extend(self._query_all_methods(child)) + return methods + + +TreeParserRegistry.register_treesitter(Language.C_SHARP, TreeParserCsharp) From ec2c4cb68dfbe3a4272327598f4e4f103ac1751e Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:51 +0000 Subject: [PATCH 62/72] Add Go tree parser implementation --- senior_swe_ai/tree_parser/tree_parser_go.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_go.py diff --git a/senior_swe_ai/tree_parser/tree_parser_go.py b/senior_swe_ai/tree_parser/tree_parser_go.py new file mode 100644 index 0000000..54231c0 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_go.py @@ -0,0 +1,17 @@ +"""Class to parse Go code using the tree-sitter library.""" +import warnings +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParserGo(BaseTreeParser): + """Class to parse Go code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__(Language.GO, "function_declaration", "identifier", "comment") + + +TreeParserRegistry.register_treesitter(Language.GO, TreeParserGo) From 5eec04ac61a885abdf8f509ccf5382dfd3b147b4 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:31:58 +0000 Subject: [PATCH 63/72] Add Java tree parser module --- senior_swe_ai/tree_parser/tree_parser_java.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_java.py diff --git a/senior_swe_ai/tree_parser/tree_parser_java.py b/senior_swe_ai/tree_parser/tree_parser_java.py new file mode 100644 index 0000000..4324d1e --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_java.py @@ -0,0 +1,19 @@ +""" Java tree parser module""" +import warnings +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParserJava(BaseTreeParser): + """Class to parse Java code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.JAVA, "method_declaration", "identifier", "block_comment" + ) + + +TreeParserRegistry.register_treesitter(Language.JAVA, TreeParserJava) From 8a99df00c17d8b3d158ce9cb311a5c7eac0b3041 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:03 +0000 Subject: [PATCH 64/72] Add TreeParserJs for JavaScript --- senior_swe_ai/tree_parser/tree_parser_js.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_js.py diff --git a/senior_swe_ai/tree_parser/tree_parser_js.py b/senior_swe_ai/tree_parser/tree_parser_js.py new file mode 100644 index 0000000..2d3083e --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_js.py @@ -0,0 +1,20 @@ +""" This module contains the BaseTreeParser for JavaScript. """ +import warnings +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParserJs(BaseTreeParser): + """Class to parse JavaScript code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.JAVASCRIPT, "function_declaration", "identifier", "comment" + ) + + +TreeParserRegistry.register_treesitter( + Language.JAVASCRIPT, TreeParserJs) From bccbe73f08290b72f07ec0f5e52ad26e6b048345 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:10 +0000 Subject: [PATCH 65/72] Add TreeParserKotlin class for parsing Kotlin code using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_kt.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_kt.py diff --git a/senior_swe_ai/tree_parser/tree_parser_kt.py b/senior_swe_ai/tree_parser/tree_parser_kt.py new file mode 100644 index 0000000..6aae1a9 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_kt.py @@ -0,0 +1,19 @@ +""" This module contains the BaseTreeParser for JavaScript. """ +import warnings +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParserKotlin(BaseTreeParser): + """Class to parse Kotlin code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.KOTLIN, "function_declaration", "simple_identifier", "comment" + ) + + +TreeParserRegistry.register_treesitter(Language.KOTLIN, TreeParserKotlin) From 5130b41b49ddef802a4cdedf958288a2880a4178 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:14 +0000 Subject: [PATCH 66/72] Add Python code parsing using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_py.py | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_py.py diff --git a/senior_swe_ai/tree_parser/tree_parser_py.py b/senior_swe_ai/tree_parser/tree_parser_py.py new file mode 100644 index 0000000..bac9499 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_py.py @@ -0,0 +1,66 @@ +""" This module is used to parse the python code using the tree-sitter library. """ +from typing import Tuple +import warnings +import tree_sitter +from tree_sitter import Node +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser, TreeParserMethodNode +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParsePy(BaseTreeParser): + """Class to parse Python code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.PYTHON, "function_definition", "identifier", "expression_statement" + ) + + def parse(self, file_bytes: bytes) -> list[TreeParserMethodNode]: + self.tree = self.parser.parse(file_bytes) + result = [] + methods: list = self._query_all_methods(self.tree.root_node) + for method in methods: + method_name: str | None = self._query_method_name(method) + doc_comment: str | None = self._query_doc_comment(method) + result.append(TreeParserMethodNode( + method_name, doc_comment, None, method)) + return result + + def _query_method_name(self, node: tree_sitter.Node) -> str | None: + if node.type == self.method_declaration_identifier: + for child in node.children: + if child.type == self.method_name_identifier: + return child.text.decode() + return None + + def _query_all_methods(self, node: tree_sitter.Node) -> list: + methods = [] + for child in node.children: + if child.type == self.method_declaration_identifier: + methods.append(child) + if child.type == "class_definition": + class_body: Node = child.children[-1] + for child_node in class_body.children: + if child_node.type == self.method_declaration_identifier: + methods.append(child_node) + return methods + + def _query_doc_comment(self, node: tree_sitter.Node) -> str | None: + query_code = """ + (function_definition + body: (block . (expression_statement (string)) @function_doc_str)) + """ + doc_str_query: tree_sitter.Query = self.language.query(query_code) + doc_strs: tree_sitter.List[Tuple[Node, str] + ] = doc_str_query.captures(node) + + if doc_strs: + return doc_strs[0][0].text.decode() + + return None + + +TreeParserRegistry.register_treesitter(Language.PYTHON, TreeParsePy) From 2176f350bf31065b8eb78b205d239d134397ddf3 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:20 +0000 Subject: [PATCH 67/72] Add Ruby tree parser implementation --- senior_swe_ai/tree_parser/tree_parser_rb.py | 42 +++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_rb.py diff --git a/senior_swe_ai/tree_parser/tree_parser_rb.py b/senior_swe_ai/tree_parser/tree_parser_rb.py new file mode 100644 index 0000000..166cff8 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_rb.py @@ -0,0 +1,42 @@ +""" This module contains the Ruby tree parser. """ + +import warnings +import tree_sitter +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParseRuby(BaseTreeParser): + """Class to parse Ruby code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.RUBY, "method", "identifier", "comment" + ) + + def _query_all_methods( + self, + node: tree_sitter.Node, + ) -> list: + methods = [] + if node.type == self.method_declaration_identifier: + doc_comment = [] + doc_comment_node = node + while ( + doc_comment_node.prev_named_sibling + and doc_comment_node.prev_named_sibling.type == self.doc_comment_identifier + ): + doc_comment_node: tree_sitter.Node = doc_comment_node.prev_named_sibling + doc_comment.insert(0, doc_comment_node.text.decode()) + methods.append( + {"method": node, "doc_comment": "\n".join(doc_comment)}) + else: + for child in node.children: + methods.extend(self._query_all_methods(child)) + return methods + + +TreeParserRegistry.register_treesitter(Language.RUBY, TreeParseRuby) From 29dd428524cd672074e21db6630201f6dfce0bb6 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:30 +0000 Subject: [PATCH 68/72] Add TreeParseTypescript class for parsing TypeScript code using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_ts.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_ts.py diff --git a/senior_swe_ai/tree_parser/tree_parser_ts.py b/senior_swe_ai/tree_parser/tree_parser_ts.py new file mode 100644 index 0000000..5e2ccf2 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_ts.py @@ -0,0 +1,20 @@ +""" This module is responsible for parsing the code using the tree-sitter library. """ +import warnings +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParseTypescript(BaseTreeParser): + """Class to parse TypeScript code using the tree-sitter library.""" + + def __init__(self) -> None: + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__( + Language.TYPESCRIPT, "function_declaration", "identifier", "comment" + ) + + +TreeParserRegistry.register_treesitter( + Language.TYPESCRIPT, TreeParseTypescript) From c38d67f583a725fe6e4cb804c6cbda989212f257 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:35 +0000 Subject: [PATCH 69/72] Add TreeParserRegistry class for managing tree-sitter parsers --- .../tree_parser/tree_parser_registry.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_registry.py diff --git a/senior_swe_ai/tree_parser/tree_parser_registry.py b/senior_swe_ai/tree_parser/tree_parser_registry.py new file mode 100644 index 0000000..1d1d955 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_registry.py @@ -0,0 +1,21 @@ +"""Registry for tree-sitter parsers.""" +from senior_swe_ai.consts import Language + + +class TreeParserRegistry: + """Registry for tree-sitter parsers.""" + _registry = {} + + @classmethod + def register_treesitter(cls, name, treesitter_class) -> None: + """Register a tree-sitter parser.""" + cls._registry[name] = treesitter_class + + @classmethod + def create_treesitter(cls, name: Language): + """Factory method to create a tree-sitter parser for the given language.""" + treesitter_class = cls._registry.get(name) + if treesitter_class: + return treesitter_class() + + raise ValueError("Invalid tree type") From 935d61cf6737a517a5fa99b239cd3c09af2d3814 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:32:41 +0000 Subject: [PATCH 70/72] Add Rust code parser using tree-sitter library --- senior_swe_ai/tree_parser/tree_parser_rs.py | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 senior_swe_ai/tree_parser/tree_parser_rs.py diff --git a/senior_swe_ai/tree_parser/tree_parser_rs.py b/senior_swe_ai/tree_parser/tree_parser_rs.py new file mode 100644 index 0000000..2ddfe32 --- /dev/null +++ b/senior_swe_ai/tree_parser/tree_parser_rs.py @@ -0,0 +1,54 @@ +""" This module is used to parse Rust code using tree-sitter library.""" +import warnings +import tree_sitter +from senior_swe_ai.consts import Language +from senior_swe_ai.tree_parser.base import BaseTreeParser +from senior_swe_ai.tree_parser.tree_parser_registry import TreeParserRegistry + + +class TreeParseRust(BaseTreeParser): + """Class to parse Rust code using the tree-sitter library.""" + + def __init__(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + super().__init__(Language.RUST, "function_item", "identifier", "line_comment") + + def _query_all_methods(self, node: tree_sitter.Node) -> list: + methods = [] + if node.type == self.method_declaration_identifier: + doc_comment_nodes = [] + if ( + node.prev_named_sibling + and node.prev_named_sibling.type == self.doc_comment_identifier + ): + current_doc_comment_node = node.prev_named_sibling + while ( + current_doc_comment_node + and current_doc_comment_node.type == self.doc_comment_identifier + ): + doc_comment_nodes.append( + current_doc_comment_node.text.decode()) + if current_doc_comment_node.prev_named_sibling: + current_doc_comment_node = ( + current_doc_comment_node.prev_named_sibling + ) + else: + current_doc_comment_node = None + + doc_comment_str = "" + doc_comment_nodes.reverse() + for doc_comment_node in doc_comment_nodes: + doc_comment_str += doc_comment_node + "\n" + if doc_comment_str.strip() != "": + methods.append( + {"method": node, "doc_comment": doc_comment_str.strip()}) + else: + methods.append({"method": node, "doc_comment": None}) + else: + for child in node.children: + methods.extend(self._query_all_methods(child)) + return methods + + +TreeParserRegistry.register_treesitter(Language.RUST, TreeParseRust) From 448ab0d02b7c80c9c295d8ddbf8f4dd87ebccc3c Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:37:39 +0000 Subject: [PATCH 71/72] Update author email in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 7947311..9a7bc02 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "senior-swe-ai" version = "0.1.0" description = "SeniorSWE-AI is a command-line interface for in-context embedding that leverages the semantic comprehension capabilities of large language models to analyze the intended codebase and engage in a conversation with it, mimicking the behavior of a seasoned software engineer. " -authors = ["younisalx-swe@hotmail.com"] +authors = ["Younis <23105954+Younis-Ahmed@users.noreply.github.com>"] readme = "README.md" [tool.poetry.dependencies] From 2f8741a0d75ba729b86b8fad01ef8ea9be5f0bc1 Mon Sep 17 00:00:00 2001 From: Younis <23105954+Younis-Ahmed@users.noreply.github.com> Date: Sun, 24 Mar 2024 18:37:46 +0000 Subject: [PATCH 72/72] Add markdown-it-py package and its dependencies --- poetry.lock | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 1c91986..dde87ee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -859,6 +859,30 @@ orjson = ">=3.9.14,<4.0.0" pydantic = ">=1,<3" requests = ">=2,<3" +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "marshmallow" version = "3.21.1" @@ -889,6 +913,17 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + [[package]] name = "multidict" version = "6.0.5" @@ -1277,6 +1312,21 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pylint" version = "3.1.0" @@ -1542,6 +1592,24 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "rich" +version = "13.7.1" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.1-py3-none-any.whl", hash = "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222"}, + {file = "rich-13.7.1.tar.gz", hash = "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + [[package]] name = "runs" version = "1.2.2" @@ -2077,4 +2145,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = ">=3.9.1,<3.12" -content-hash = "fde27d7eb9bfbffa82d245cff2a067ed004ab9cb6665b6df540e44ebf1a1ae81" +content-hash = "2da91d2c22287d48c163b5a198968b3ef6bb3ff493386515e3a31e0d19378694"