diff options
author | Nate Sesti <sestinj@gmail.com> | 2023-06-08 17:15:29 -0400 |
---|---|---|
committer | Nate Sesti <sestinj@gmail.com> | 2023-06-08 17:15:29 -0400 |
commit | 040cc448bfdf77c3d43ea2a631a322e72c26ccc3 (patch) | |
tree | d7883f09a0dbe46db51fdc8be9cc5d24c6fb739b /continuedev | |
parent | fa77ffae9476a390eeaa6d477af09907dfbf7cd8 (diff) | |
download | sncontinue-040cc448bfdf77c3d43ea2a631a322e72c26ccc3.tar.gz sncontinue-040cc448bfdf77c3d43ea2a631a322e72c26ccc3.tar.bz2 sncontinue-040cc448bfdf77c3d43ea2a631a322e72c26ccc3.zip |
regex search and edit over whole directory
Diffstat (limited to 'continuedev')
-rw-r--r-- | continuedev/src/continuedev/steps/search_directory.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/continuedev/src/continuedev/steps/search_directory.py b/continuedev/src/continuedev/steps/search_directory.py new file mode 100644 index 00000000..9f4594b9 --- /dev/null +++ b/continuedev/src/continuedev/steps/search_directory.py @@ -0,0 +1,68 @@ +import asyncio +from textwrap import dedent +from typing import List + +from ..models.filesystem import RangeInFile +from ..models.main import Range +from ..core.main import Step +from ..core.sdk import ContinueSDK +import os +import re + +# Already have some code for this somewhere +IGNORE_DIRS = ["env", "venv", ".venv"] +IGNORE_FILES = [".env"] + + +def find_all_matches_in_dir(pattern: str, dirpath: str) -> List[RangeInFile]: + range_in_files = [] + for root, dirs, files in os.walk(dirpath): + dirname = os.path.basename(root) + if dirname.startswith(".") or dirname in IGNORE_DIRS: + continue + for file in files: + if file in IGNORE_FILES: + continue + with open(os.path.join(root, file), "r") as f: + # Find the index of all occurences of the pattern in the file. Use re. + file_content = f.read() + results = re.finditer(pattern, file_content) + range_in_files += [ + RangeInFile(filepath=os.path.join(root, file), range=Range.from_indices( + file_content, result.start(), result.end())) + for result in results + ] + + return range_in_files + + +class WriteRegexPatternStep(Step): + user_request: str + + async def run(self, sdk: ContinueSDK): + # Ask the user for a regex pattern + pattern = sdk.models.gpt35.complete(dedent(f"""\ + This is the user request: + + {self.user_request} + + Please write either a regex pattern or just a string that be used with python's re module to find all matches requested by the user. It will be used as `re.findall(<PATTERN_YOU_WILL_WRITE>, file_content)`. Your output should be only the regex or string, nothing else:""")) + + return pattern + + +class EditAllMatchesStep(Step): + pattern: str + user_request: str + directory: str | None = None + + async def run(self, sdk: ContinueSDK): + # Search all files for a given string + range_in_files = find_all_matches_in_dir(self.pattern, self.directory or await sdk.ide.getWorkspaceDirectory()) + + tasks = [asyncio.create_task(sdk.edit_file( + range=range_in_file.range, + filename=range_in_file.filepath, + prompt=self.user_request + )) for range_in_file in range_in_files] + await asyncio.gather(*tasks) |