From 278bd96e383c11f705ea0c4bff29e02f613006e2 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Wed, 4 Oct 2023 14:24:44 +0100 Subject: [PATCH 01/33] Template generation version from Hackathon --- demo/demo5-template-content/demo-config.yaml | 13 ++ demo/demo5-template-content/demoScript.php | 42 ++++ src/DocGenerator.php | 182 ++++++++++++++---- .../ChatGpt/TemplateGenerator.php | 182 ++++++++++++++++++ .../ChatGpt/prompts/templateGeneration | 7 + 5 files changed, 389 insertions(+), 37 deletions(-) create mode 100644 demo/demo5-template-content/demo-config.yaml create mode 100644 demo/demo5-template-content/demoScript.php create mode 100644 src/TemplateGenerator/ChatGpt/TemplateGenerator.php create mode 100644 src/TemplateGenerator/ChatGpt/prompts/templateGeneration diff --git a/demo/demo5-template-content/demo-config.yaml b/demo/demo5-template-content/demo-config.yaml new file mode 100644 index 00000000..7ab56a81 --- /dev/null +++ b/demo/demo5-template-content/demo-config.yaml @@ -0,0 +1,13 @@ +project_root: '%DOC_GEN_LIB_PATH%' +cache_dir: '%WORKING_DIR%/demo/demo5-template-content/__cache' +templates_dir: '%WORKING_DIR%/demo/demo5-template-content/templates' +language_handlers: + php: + class: \BumbleDocGen\LanguageHandler\Php\PhpHandler + settings: + async_source_loading_enabled: true +source_locators: + - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator + arguments: + directories: + - "%project_root%" diff --git a/demo/demo5-template-content/demoScript.php b/demo/demo5-template-content/demoScript.php new file mode 100644 index 00000000..e27438c6 --- /dev/null +++ b/demo/demo5-template-content/demoScript.php @@ -0,0 +1,42 @@ +#!/usr/bin/env php +create(__DIR__ . '/demo-config.yaml'); + $docGen->generateProjectTemplatesStructure(); + $docGen->generateProjectTemplates(); +} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + die($e->getMessage()); +} + +function copyTemplateDir() +{ + $filesystem = new Filesystem(); + $finder = new Finder(); + $targetDir = __DIR__ . '/templates'; + $sourceDir = __DIR__ . '/../demo5-templates-generation/templates'; + + if (!$filesystem->exists($targetDir)) { + $filesystem->mkdir($targetDir); + } else { + return; + } + + $finder->in($sourceDir)->files()->ignoreDotFiles(false); + + foreach ($finder as $file) { + // Get the relative path of the file + $relativePath = $file->getRelativePathname(); + // Copy the file to the target directory + $filesystem->copy($file->getRealPath(), $targetDir . '/' . $relativePath); + } +} diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 829982ef..4569402d 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -16,6 +16,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use BumbleDocGen\TemplateGenerator\ChatGpt\MissingDocBlocksGenerator; use BumbleDocGen\TemplateGenerator\ChatGpt\ReadmeTemplateFiller; +use BumbleDocGen\TemplateGenerator\ChatGpt\TemplateGenerator; use BumbleDocGen\TemplateGenerator\ChatGpt\TemplatesStructureGenerator; use DI\DependencyException; use DI\NotFoundException; @@ -81,23 +82,36 @@ public function generateProjectTemplatesStructure(): void new \Tectalic\OpenAi\Authentication($openaiKey) ); - $availableModels = array_values(array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - )); + $availableModels = array_values( + array_filter( + array_map( + fn(array $v) => $v['id'], + $openaiClient->models()->list()->toArray()['data'] ?? [] + ), + fn(string $v) => str_starts_with($v, "gpt-") + ) + ); $model = $this->io->choice("Choose GPT model from available", $availableModels); $templatesStructureGenerator = new TemplatesStructureGenerator($openaiClient, $model); do { - $additionalPrompt = $this->io->ask('Write instructions for more accurate documentation generation ( or just skip this step )') ?: null; + $additionalPrompt = $this->io->ask( + 'Write instructions for more accurate documentation generation ( or just skip this step )' + ) ?: null; $this->logger->notice("Sending ChatGPT request"); - $structure = $templatesStructureGenerator->generateStructureByEntityCollection($entitiesCollection, $additionalPrompt); - $structureAsString = implode("\n", array_map(fn($v, $k) => "{$k} => {$v}", $structure, array_keys($structure))); - $action = $this->io->choice("The proposed documentation structure is as follows:\n\n{$structureAsString}", ['Save', 'Regenerate', 'Cancel']); + $structure = $templatesStructureGenerator->generateStructureByEntityCollection( + $entitiesCollection, + $additionalPrompt + ); + $structureAsString = implode( + "\n", + array_map(fn($v, $k) => "{$k} => {$v}", $structure, array_keys($structure)) + ); + $action = $this->io->choice( + "The proposed documentation structure is as follows:\n\n{$structureAsString}", + ['Save', 'Regenerate', 'Cancel'] + ); } while ($action == 'Regenerate'); if ($action === 'Save') { @@ -146,22 +160,33 @@ public function addMissingDocBlocks(): void new \Tectalic\OpenAi\Authentication($openaiKey) ); - $availableModels = array_values(array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - )); + $availableModels = array_values( + array_filter( + array_map( + fn(array $v) => $v['id'], + $openaiClient->models()->list()->toArray()['data'] ?? [] + ), + fn(string $v) => str_starts_with($v, "gpt-") + ) + ); $model = $this->io->choice("Choose GPT model from available", $availableModels); $missingDocBlocksGenerator = new MissingDocBlocksGenerator($openaiClient, $this->parserHelper, $model); $alreadyProcessedEntities = []; - $getEntities = function (ClassEntityCollection|array $entitiesCollection) use (&$getEntities, &$alreadyProcessedEntities): \Generator { + $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( + &$getEntities, + & + $alreadyProcessedEntities + ): \Generator { foreach ($entitiesCollection as $classEntity) { /**@var ClassEntity $classEntity */ - if (!$classEntity->entityDataCanBeLoaded() || array_key_exists($classEntity->getName(), $alreadyProcessedEntities)) { + if ( + !$classEntity->entityDataCanBeLoaded() || array_key_exists( + $classEntity->getName(), + $alreadyProcessedEntities + ) + ) { continue; } $interfaces = $classEntity->getInterfacesEntities(); @@ -193,7 +218,9 @@ public function addMissingDocBlocks(): void $classFileLines = explode("\n", $classFileContent); foreach ($newBocBlocks as $method => $docBlock) { $methodEntity = $entity->getMethodEntity($method); - $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock(false)->getLocation()?->getLineNumber() : null; + $lineNumber = $docCommentLine = $methodEntity->getDocComment() ? $methodEntity->getDocBlock( + false + )->getLocation()?->getLineNumber() : null; $lineNumber = $lineNumber ?: $methodEntity->getStartLine(); foreach (file($entity->getFullFileName(), FILE_IGNORE_NEW_LINES) as $line => $lineContent) { @@ -246,7 +273,9 @@ public function fillInReadmeMdTemplate(): void $entryPoints = []; do { - $entityName = $this->io->ask("Enter the name of the class that is the entry point of the documented project (or just skip this step)"); + $entityName = $this->io->ask( + "Enter the name of the class that is the entry point of the documented project (or just skip this step)" + ); if ($entityName) { $entity = $entitiesCollection->findEntity($entityName, false); if (!$entity) { @@ -259,11 +288,17 @@ public function fillInReadmeMdTemplate(): void $action = null; if ($entryPoints) { do { - $this->io->text(array_merge(["Entry-point classes:"], array_map(function ($v) { - static $n = 0; - ++$n; - return "{$n}) {$v}"; - }, array_keys($entryPoints)))); + $this->io->text( + array_merge( + ["Entry-point classes:"], + array_map(function ($v) { + static $n = 0; + ++$n; + return "{$n}) {$v}"; + }, + array_keys($entryPoints)) + ) + ); $action = $this->io->choice("Choose your next action", ['Continue', 'Add more', 'Remove last']); if ($action === 'Remove last') { @@ -273,19 +308,28 @@ public function fillInReadmeMdTemplate(): void } } while ($action !== 'Continue'); - $additionalPrompt = $this->io->ask('Write instructions for more accurate documentation generation ( or just skip this step )'); + $additionalPrompt = $this->io->ask( + 'Write instructions for more accurate documentation generation ( or just skip this step )' + ); - $availableModels = array_values(array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - )); + $availableModels = array_values( + array_filter( + array_map( + fn(array $v) => $v['id'], + $openaiClient->models()->list()->toArray()['data'] ?? [] + ), + fn(string $v) => str_starts_with($v, "gpt-") + ) + ); $model = $this->io->choice("Choose GPT model from available", $availableModels, 'gpt-4'); $readmeTemplateFiller = new ReadmeTemplateFiller($openaiClient, $model); - $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent($entitiesCollection, $entryPoints, $composerJsonFile, $additionalPrompt); + $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent( + $entitiesCollection, + $entryPoints, + $composerJsonFile, + $additionalPrompt + ); $fileContent = "{% set title = 'About the project' %}\n{$readmeFileContent}"; $this->io->note("readme.md.twig file content generated:"); @@ -297,6 +341,68 @@ public function fillInReadmeMdTemplate(): void } } + public function generateProjectTemplates(): void + { + $this->parser->parse(); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::getEntityCollectionName()); + + $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt'); + $openaiClient = \Tectalic\OpenAi\Manager::build( + new \GuzzleHttp\Client(), + new \Tectalic\OpenAi\Authentication($openaiKey) + ); + + $availableModels = array_values( + array_filter( + array_map( + fn(array $v) => $v['id'], + $openaiClient->models()->list()->toArray()['data'] ?? [] + ), + fn(string $v) => str_starts_with($v, "gpt-") + ) + ); + + $model = $this->io->choice("Choose GPT model from available", $availableModels); + + $templateGenerator = new TemplateGenerator($openaiClient, $model); + + $finder = new Finder(); + + $finder->files()->in($this->configuration->getTemplatesDir()); + foreach ($finder as $file) { + if ($file->getBasename() === 'readme.md.twig') { + continue; + } + + do { + $this->logger->notice( + 'Creating template for ' . $templateGenerator->getFileSubPathFromPath($file->getRealPath()) + ); + $additionalPrompt = $this->io->ask( + 'Add additional information about this ( or just skip this step )' + ) ?: null; + $this->logger->notice('Sending ChatGPT request'); + $content = $templateGenerator->generate( + $file->getRealPath(), + $file->getContents(), + $entitiesCollection, + $additionalPrompt + ); + $action = $this->io->choice( + "The proposed documentation is as follows:\n\n{$content}", + ['Save', 'Regenerate', 'Cancel'] + ); + } while ($action === 'Regenerate'); + + if ($action === 'Save') { + $this->logger->notice( + 'Saving file: .' . $file->getRealPath() + ); + $this->fs->dumpFile($file->getRealPath(), $content); + } + } + } + /** * Generates documentation using configuration * @@ -311,7 +417,9 @@ public function generate(): void $this->parser->parse(); $this->renderer->run(); } catch (\Exception $e) { - $this->logger->critical("{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}"); + $this->logger->critical( + "{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}" + ); } $time = microtime(true) - $start; diff --git a/src/TemplateGenerator/ChatGpt/TemplateGenerator.php b/src/TemplateGenerator/ChatGpt/TemplateGenerator.php new file mode 100644 index 00000000..9eaeb3de --- /dev/null +++ b/src/TemplateGenerator/ChatGpt/TemplateGenerator.php @@ -0,0 +1,182 @@ + 'system', + 'content' => file_get_contents(__DIR__ . '/prompts/templateGenerationSystem') + ], + ]; + + $messages[] = [ + 'role' => 'user', + 'content' => 'Create the template for ' . $this->getFileSubPathFromPath( + $filePath + ) . ' the existing template is: [TEMPLATE]' . $fileContent . '[/TEMPLATE]', + ]; + + $messages[] = [ + 'role' => 'user', + 'content' => "The file documents a namespace/class with the following method stubs: \n" . implode( + "\n", + $methodStubs + ), + ]; + + if ($additionalPrompt) { + $messages[] = [ + 'role' => 'user', + 'content' => "Additional Information: {$additionalPrompt}" + ]; + } + + $response = $this->openaiClient->chatCompletions()->create( + new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ + 'model' => $this->model, + 'messages' => $messages, + ]) + )->toModel(); + + return $this->extractTemplateContent($response->choices[0]->message->content); + } + + private function extractTemplateContent(string $str): ?string + { + preg_match('/\[TEMPLATE](.*?)\[\/TEMPLATE]/s', $str, $matches); + return $matches[1] ?? null; + } + + private function isNamespaceChildOrSame(string $namespace1, string $namespace2): bool + { + // If namespaces are exactly the same + if ($namespace1 === $namespace2) { + return true; + } + + if (str_starts_with($namespace2, $namespace1 . '\\')) { + $remainder = substr($namespace2, strlen($namespace1) + 1); + if (!str_contains($remainder, '\\')) { + return true; + } + } + + return false; + } + + + private function getNamespaceFromPath(string $path): ?string + { + $namespaceStart = 'templates/tech/'; + + $startPosition = strpos($path, $namespaceStart); + + if ($startPosition === false) { + return null; + } + + $namespacePart = substr($path, $startPosition + strlen($namespaceStart)); + $namespace = dirname($namespacePart); + + return str_replace('/', '\\', $namespace); + } + + public function getFileSubPathFromPath(string $path) + { + $subPathStart = 'templates/tech/'; + + $startPosition = strpos($path, $subPathStart); + + if ($startPosition === false) { + return null; + } + + return substr($path, $startPosition + strlen($subPathStart)); + } + + /** + * @throws NotFoundException + * @throws DependencyException + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + public function generate( + string $filePath, + string $fileContent, + ?ClassEntityCollection $entitiesCollection, + ?string $additionalPrompt = null + ): ?string { + $namespace = $this->getNamespaceFromPath($filePath); + + $alreadyProcessedEntities = []; + $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( + &$getEntities, + & + $alreadyProcessedEntities + ): \Generator { + foreach ($entitiesCollection as $classEntity) { + /**@var ClassEntity $classEntity */ + if ( + !$classEntity->entityDataCanBeLoaded() || array_key_exists( + $classEntity->getName(), + $alreadyProcessedEntities + ) + ) { + continue; + } + $interfaces = $classEntity->getInterfacesEntities(); + if ($interfaces) { + yield from $getEntities($interfaces); + } + $parentClass = $classEntity->getParentClass(); + if ($parentClass) { + yield from $getEntities([$parentClass]); + } + $alreadyProcessedEntities[$classEntity->getName()] = 1; + yield $classEntity; + } + }; + + $methodStubs = []; + foreach ($getEntities($entitiesCollection) as $entity) { + $nsCheck = $this->isNamespaceChildOrSame($namespace, $entity->getNamespaceName()); + if ($nsCheck) { + $methods = $entity->getMethodEntityCollection(); + foreach ($methods as $method) { + /** @var MethodEntity $method */ + $methodStubs[] = $entity->getName() . ' function ' . $method->getName( + ) . '(' . $method->getParametersString() . ') # ' . $method->getDescription(); + } + } + } + + return $this->getTemplateFromGPT($filePath, $fileContent, $methodStubs, $additionalPrompt); + } +} diff --git a/src/TemplateGenerator/ChatGpt/prompts/templateGeneration b/src/TemplateGenerator/ChatGpt/prompts/templateGeneration new file mode 100644 index 00000000..9fd8e731 --- /dev/null +++ b/src/TemplateGenerator/ChatGpt/prompts/templateGeneration @@ -0,0 +1,7 @@ +You are a documentation generator that adds information to twig files you are provided. + +You will be given an existing template and should retain the existing information, supplementing it with additional information. + +You should not add information that is not 100% correct. + +Do not use any twig functions From 5c6ee497af089fd4ba66ceec705fd3c529b6ad2e Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 17:53:21 +0100 Subject: [PATCH 02/33] Updates .gitignore Adds rules to ignore certain directories of all demos --- .gitignore | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 5cbbce09..bdfaeda6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,14 @@ composer.phar /vendor/ .idea -/demo/demo1/docs/ -/demo/demo1/__cache/ -/demo/demo2-templates-generation/__cache/ -/demo/demo2-templates-generation/docs/ -/demo/demo3-add-missing-doc-blocks/__cache/ -/demo/demo4-generating-readme-file/__cache/ -/demo/demo4-generating-readme-file/docs/ -/demo/demo4-generating-readme-file/templates/ +/.bumbleDocGenCache/ /last_run.log /.phpunit.result.cache +/demo/*/__cache/ +/demo/*/.cache/ +/demo/*/docs/ +/demo/*/last_run.log + +/demo/demo1/docs/ /demo/demo2-templates-generation/templates/ -/.bumbleDocGenCache/ +/demo/demo4-generating-readme-file/templates/ From e7a5598cbff9b206aef0be96007955f8d7d27c6d Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 17:54:33 +0100 Subject: [PATCH 03/33] Updates demo-config.yaml Only look at files in `/src` for demos --- demo/demo2-templates-generation/demo-config.yaml | 2 +- demo/demo3-add-missing-doc-blocks/demo-config.yaml | 2 +- demo/demo4-generating-readme-file/demo-config.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/demo2-templates-generation/demo-config.yaml b/demo/demo2-templates-generation/demo-config.yaml index 2d5be500..e7e1cc0b 100644 --- a/demo/demo2-templates-generation/demo-config.yaml +++ b/demo/demo2-templates-generation/demo-config.yaml @@ -11,4 +11,4 @@ source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: directories: - - "%project_root%" \ No newline at end of file + - "%project_root%/src" diff --git a/demo/demo3-add-missing-doc-blocks/demo-config.yaml b/demo/demo3-add-missing-doc-blocks/demo-config.yaml index d5d59162..76753b22 100644 --- a/demo/demo3-add-missing-doc-blocks/demo-config.yaml +++ b/demo/demo3-add-missing-doc-blocks/demo-config.yaml @@ -10,4 +10,4 @@ source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: directories: - - "%project_root%" \ No newline at end of file + - "%project_root%/src" diff --git a/demo/demo4-generating-readme-file/demo-config.yaml b/demo/demo4-generating-readme-file/demo-config.yaml index d4854c6d..edec479b 100644 --- a/demo/demo4-generating-readme-file/demo-config.yaml +++ b/demo/demo4-generating-readme-file/demo-config.yaml @@ -10,4 +10,4 @@ source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: directories: - - "%project_root%" \ No newline at end of file + - "%project_root%/src" From dc08ea4025a1924b0482e358ea5caa6b147f4808 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 17:55:17 +0100 Subject: [PATCH 04/33] Moves template content demo --- demo/demo5-template-content/demoScript.php | 42 ------------------- .../demo-config.yaml | 6 +-- demo/demo6-template-content/demoScript.php | 28 +++++++++++++ 3 files changed, 31 insertions(+), 45 deletions(-) delete mode 100644 demo/demo5-template-content/demoScript.php rename demo/{demo5-template-content => demo6-template-content}/demo-config.yaml (66%) create mode 100644 demo/demo6-template-content/demoScript.php diff --git a/demo/demo5-template-content/demoScript.php b/demo/demo5-template-content/demoScript.php deleted file mode 100644 index e27438c6..00000000 --- a/demo/demo5-template-content/demoScript.php +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env php -create(__DIR__ . '/demo-config.yaml'); - $docGen->generateProjectTemplatesStructure(); - $docGen->generateProjectTemplates(); -} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { - die($e->getMessage()); -} - -function copyTemplateDir() -{ - $filesystem = new Filesystem(); - $finder = new Finder(); - $targetDir = __DIR__ . '/templates'; - $sourceDir = __DIR__ . '/../demo5-templates-generation/templates'; - - if (!$filesystem->exists($targetDir)) { - $filesystem->mkdir($targetDir); - } else { - return; - } - - $finder->in($sourceDir)->files()->ignoreDotFiles(false); - - foreach ($finder as $file) { - // Get the relative path of the file - $relativePath = $file->getRelativePathname(); - // Copy the file to the target directory - $filesystem->copy($file->getRealPath(), $targetDir . '/' . $relativePath); - } -} diff --git a/demo/demo5-template-content/demo-config.yaml b/demo/demo6-template-content/demo-config.yaml similarity index 66% rename from demo/demo5-template-content/demo-config.yaml rename to demo/demo6-template-content/demo-config.yaml index 7ab56a81..9dc06f53 100644 --- a/demo/demo5-template-content/demo-config.yaml +++ b/demo/demo6-template-content/demo-config.yaml @@ -1,6 +1,6 @@ project_root: '%DOC_GEN_LIB_PATH%' -cache_dir: '%WORKING_DIR%/demo/demo5-template-content/__cache' -templates_dir: '%WORKING_DIR%/demo/demo5-template-content/templates' +cache_dir: '%WORKING_DIR%/demo/demo6-template-content/__cache' +templates_dir: '%WORKING_DIR%/demo/demo6-template-content/templates' language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler @@ -10,4 +10,4 @@ source_locators: - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator arguments: directories: - - "%project_root%" + - "%project_root%/src" diff --git a/demo/demo6-template-content/demoScript.php b/demo/demo6-template-content/demoScript.php new file mode 100644 index 00000000..b02595ad --- /dev/null +++ b/demo/demo6-template-content/demoScript.php @@ -0,0 +1,28 @@ +#!/usr/bin/env php +create(__DIR__ . '/demo-config.yaml'); + generateTemplateStructureIfNeeded($docGen); + $docGen->generateProjectTemplates(); +} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + die($e->getMessage()); +} + +function generateTemplateStructureIfNeeded(\BumbleDocGen\DocGenerator $docGen) +{ + $finder = new Finder(); + $targetDir = __DIR__ . '/templates'; + $finder->files()->in($targetDir); + $fileCount = iterator_count($finder); + + if ($fileCount === 0) { + $docGen->generateProjectTemplatesStructure(); + } +} From 4e76c2818eecea364255a580fffc91da76799ff5 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 17:57:40 +0100 Subject: [PATCH 05/33] AI Refactor - Adds support for using HuggingFace models - Moves as much configuration as possible to ENV variables - Moves code related to AI to its own namespace - Replaces `tectalic/openai` with `guzzlehttp/guzzle` --- composer.json | 4 +- composer.lock | 1311 ++++++++++------- .../Generators}/MissingDocBlocksGenerator.php | 85 +- .../Generators/ReadmeTemplateGenerator.php} | 58 +- .../Generators}/TemplateGenerator.php | 49 +- .../TemplatesStructureGenerator.php | 51 + src/AI/ProviderFactory.php | 39 + src/AI/ProviderInterface.php | 20 + .../Prompts}/missingDocBlockGeneration | 0 .../HuggingFace/Prompts}/readmeTemplateFiller | 0 .../HuggingFace/Prompts/structureGeneration | 17 + .../HuggingFace/Prompts}/templateGeneration | 0 src/AI/Providers/HuggingFace/Provider.php | 143 ++ .../OpenAI/Prompts/missingDocBlockGeneration | 4 + .../OpenAI/Prompts/readmeTemplateFiller | 6 + .../OpenAI/Prompts}/structureGeneration | 2 +- .../OpenAI/Prompts/templateGeneration | 7 + src/AI/Providers/OpenAI/Provider.php | 148 ++ .../Command/AddMissingDocBlocksCommand.php | 2 - .../Command/FillInReadmeMdTemplateCommand.php | 2 - ...nerateProjectTemplatesStructureCommand.php | 2 - src/DocGenerator.php | 108 +- .../ChatGpt/TemplatesStructureGenerator.php | 77 - 23 files changed, 1288 insertions(+), 847 deletions(-) rename src/{TemplateGenerator/ChatGpt => AI/Generators}/MissingDocBlocksGenerator.php (76%) rename src/{TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php => AI/Generators/ReadmeTemplateGenerator.php} (54%) rename src/{TemplateGenerator/ChatGpt => AI/Generators}/TemplateGenerator.php (76%) create mode 100644 src/AI/Generators/TemplatesStructureGenerator.php create mode 100644 src/AI/ProviderFactory.php create mode 100644 src/AI/ProviderInterface.php rename src/{TemplateGenerator/ChatGpt/prompts => AI/Providers/HuggingFace/Prompts}/missingDocBlockGeneration (100%) rename src/{TemplateGenerator/ChatGpt/prompts => AI/Providers/HuggingFace/Prompts}/readmeTemplateFiller (100%) create mode 100644 src/AI/Providers/HuggingFace/Prompts/structureGeneration rename src/{TemplateGenerator/ChatGpt/prompts => AI/Providers/HuggingFace/Prompts}/templateGeneration (100%) create mode 100644 src/AI/Providers/HuggingFace/Provider.php create mode 100644 src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration create mode 100644 src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller rename src/{TemplateGenerator/ChatGpt/prompts => AI/Providers/OpenAI/Prompts}/structureGeneration (93%) create mode 100644 src/AI/Providers/OpenAI/Prompts/templateGeneration create mode 100644 src/AI/Providers/OpenAI/Provider.php delete mode 100644 src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php diff --git a/composer.json b/composer.json index 99a4de6d..b807cdd8 100644 --- a/composer.json +++ b/composer.json @@ -34,11 +34,11 @@ "ocramius/proxy-manager": "~2.0", "symfony/yaml": "^6.0", "hassankhan/config": "^3.1", - "tectalic/openai": "^1.5", - "guzzlehttp/guzzle": "^7.7", + "guzzlehttp/guzzle": "^7.8", "symfony/filesystem": "^6.0" }, "require-dev": { + "roave/security-advisories": "dev-latest", "phpunit/phpunit": "^9.5", "dg/bypass-finals": "^1.4", "squizlabs/php_codesniffer": "3.*", diff --git a/composer.lock b/composer.lock index d60a87bd..2fa38cdf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7f5651e61bc501ef3ce91aa575e6ec4b", + "content-hash": "635541b0f20b20823aadf06b31418cec", "packages": [ { "name": "bramus/ansi-php", @@ -96,72 +96,6 @@ }, "time": "2021-12-05T09:10:49+00:00" }, - { - "name": "clue/stream-filter", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/clue/stream-filter.git", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e", - "reference": "d6169430c7731d8509da7aecd0af756a5747b78e", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "Clue\\StreamFilter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering" - } - ], - "description": "A simple and modern approach to stream filtering in PHP", - "homepage": "https://github.com/clue/php-stream-filter", - "keywords": [ - "bucket brigade", - "callback", - "filter", - "php_user_filter", - "stream", - "stream_filter_append", - "stream_filter_register" - ], - "support": { - "issues": "https://github.com/clue/stream-filter/issues", - "source": "https://github.com/clue/stream-filter/tree/v1.6.0" - }, - "funding": [ - { - "url": "https://clue.engineering/support", - "type": "custom" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-21T13:15:14+00:00" - }, { "name": "doctrine/annotations", "version": "1.14.3", @@ -240,16 +174,16 @@ }, { "name": "doctrine/deprecations", - "version": "v1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", - "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", "shasum": "" }, "require": { @@ -281,9 +215,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" }, - "time": "2023-06-03T09:27:29+00:00" + "time": "2023-09-27T20:04:15+00:00" }, { "name": "doctrine/lexer", @@ -1028,16 +962,16 @@ }, { "name": "nette/php-generator", - "version": "v4.0.9", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/nette/php-generator.git", - "reference": "72cf9e20686904678d9c1de664c6f7a8c9d676ed" + "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/php-generator/zipball/72cf9e20686904678d9c1de664c6f7a8c9d676ed", - "reference": "72cf9e20686904678d9c1de664c6f7a8c9d676ed", + "url": "https://api.github.com/repos/nette/php-generator/zipball/8b728c622c49b196513c0f95508f2f66342d1e8f", + "reference": "8b728c622c49b196513c0f95508f2f66342d1e8f", "shasum": "" }, "require": { @@ -1057,7 +991,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "4.1-dev" } }, "autoload": { @@ -1091,22 +1025,22 @@ ], "support": { "issues": "https://github.com/nette/php-generator/issues", - "source": "https://github.com/nette/php-generator/tree/v4.0.9" + "source": "https://github.com/nette/php-generator/tree/v4.1.0" }, - "time": "2023-08-29T19:09:26+00:00" + "time": "2023-09-26T12:28:52+00:00" }, { "name": "nette/utils", - "version": "v4.0.1", + "version": "v4.0.2", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e" + "reference": "cead6637226456b35e1175cc53797dd585d85545" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/9124157137da01b1f5a5a22d6486cb975f26db7e", - "reference": "9124157137da01b1f5a5a22d6486cb975f26db7e", + "url": "https://api.github.com/repos/nette/utils/zipball/cead6637226456b35e1175cc53797dd585d85545", + "reference": "cead6637226456b35e1175cc53797dd585d85545", "shasum": "" }, "require": { @@ -1128,8 +1062,7 @@ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", "ext-json": "to use Nette\\Utils\\Json", "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", - "ext-xml": "to use Strings::length() etc. when mbstring is not available" + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" }, "type": "library", "extra": { @@ -1178,9 +1111,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.1" + "source": "https://github.com/nette/utils/tree/v4.0.2" }, - "time": "2023-07-30T15:42:21+00:00" + "time": "2023-09-19T11:58:07+00:00" }, { "name": "nikic/php-parser", @@ -1238,84 +1171,6 @@ }, "time": "2023-08-13T19:53:39+00:00" }, - { - "name": "nyholm/psr7", - "version": "1.8.0", - "source": { - "type": "git", - "url": "https://github.com/Nyholm/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0", - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "http-interop/http-factory-tests": "^0.9", - "php-http/message-factory": "^1.0", - "php-http/psr7-integration-tests": "^1.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4", - "symfony/error-handler": "^4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.8-dev" - } - }, - "autoload": { - "psr-4": { - "Nyholm\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - }, - { - "name": "Martijn van der Ven", - "email": "martijn@vanderven.se" - } - ], - "description": "A fast PHP7 implementation of PSR-7", - "homepage": "https://tnyholm.se", - "keywords": [ - "psr-17", - "psr-7" - ], - "support": { - "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.0" - }, - "funding": [ - { - "url": "https://github.com/Zegnat", - "type": "github" - }, - { - "url": "https://github.com/nyholm", - "type": "github" - } - ], - "time": "2023-05-02T11:26:24+00:00" - }, { "name": "ocramius/proxy-manager", "version": "2.14.1", @@ -1399,16 +1254,16 @@ }, { "name": "php-di/invoker", - "version": "2.3.3", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786" + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/cd6d9f267d1a3474bdddf1be1da079f01b942786", - "reference": "cd6d9f267d1a3474bdddf1be1da079f01b942786", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86", + "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86", "shasum": "" }, "require": { @@ -1442,7 +1297,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.3" + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4" }, "funding": [ { @@ -1450,7 +1305,7 @@ "type": "github" } ], - "time": "2021-12-13T09:22:56+00:00" + "time": "2023-09-08T09:24:21+00:00" }, { "name": "php-di/php-di", @@ -1525,209 +1380,6 @@ ], "time": "2023-08-10T14:57:56+00:00" }, - { - "name": "php-http/discovery", - "version": "1.19.1", - "source": { - "type": "git", - "url": "https://github.com/php-http/discovery.git", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0|^2.0", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "nyholm/psr7": "<1.0", - "zendframework/zend-diactoros": "*" - }, - "provide": { - "php-http/async-client-implementation": "*", - "php-http/client-implementation": "*", - "psr/http-client-implementation": "*", - "psr/http-factory-implementation": "*", - "psr/http-message-implementation": "*" - }, - "require-dev": { - "composer/composer": "^1.0.2|^2.0", - "graham-campbell/phpspec-skip-example-extension": "^5.0", - "php-http/httplug": "^1.0 || ^2.0", - "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", - "symfony/phpunit-bridge": "^6.2" - }, - "type": "composer-plugin", - "extra": { - "class": "Http\\Discovery\\Composer\\Plugin", - "plugin-optional": true - }, - "autoload": { - "psr-4": { - "Http\\Discovery\\": "src/" - }, - "exclude-from-classmap": [ - "src/Composer/Plugin.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", - "homepage": "http://php-http.org", - "keywords": [ - "adapter", - "client", - "discovery", - "factory", - "http", - "message", - "psr17", - "psr7" - ], - "support": { - "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.1" - }, - "time": "2023-07-11T07:02:26+00:00" - }, - { - "name": "php-http/message", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/message.git", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd", - "shasum": "" - }, - "require": { - "clue/stream-filter": "^1.5", - "php": "^7.2 || ^8.0", - "psr/http-message": "^1.1 || ^2.0" - }, - "provide": { - "php-http/message-factory-implementation": "1.0" - }, - "require-dev": { - "ergebnis/composer-normalize": "^2.6", - "ext-zlib": "*", - "guzzlehttp/psr7": "^1.0 || ^2.0", - "laminas/laminas-diactoros": "^2.0 || ^3.0", - "php-http/message-factory": "^1.0.2", - "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", - "slim/slim": "^3.0" - }, - "suggest": { - "ext-zlib": "Used with compressor/decompressor streams", - "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", - "laminas/laminas-diactoros": "Used with Diactoros Factories", - "slim/slim": "Used with Slim Framework PSR-7 implementation" - }, - "type": "library", - "autoload": { - "files": [ - "src/filters.php" - ], - "psr-4": { - "Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com" - } - ], - "description": "HTTP Message related tools", - "homepage": "http://php-http.org", - "keywords": [ - "http", - "message", - "psr-7" - ], - "support": { - "issues": "https://github.com/php-http/message/issues", - "source": "https://github.com/php-http/message/tree/1.16.0" - }, - "time": "2023-05-17T06:43:38+00:00" - }, - { - "name": "php-http/multipart-stream-builder", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-http/multipart-stream-builder.git", - "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a", - "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0", - "php-http/discovery": "^1.15", - "psr/http-factory-implementation": "^1.0" - }, - "require-dev": { - "nyholm/psr7": "^1.0", - "php-http/message": "^1.5", - "php-http/message-factory": "^1.0.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Http\\Message\\MultipartStream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com" - } - ], - "description": "A builder class that help you create a multipart stream", - "homepage": "http://php-http.org", - "keywords": [ - "factory", - "http", - "message", - "multipart stream", - "stream" - ], - "support": { - "issues": "https://github.com/php-http/multipart-stream-builder/issues", - "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0" - }, - "time": "2023-04-28T14:10:22+00:00" - }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -1898,16 +1550,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.23.1", + "version": "1.24.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", - "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { @@ -1939,9 +1591,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, - "time": "2023-08-03T16:32:59+00:00" + "time": "2023-09-26T12:28:12+00:00" }, { "name": "psr/cache", @@ -2097,16 +1749,16 @@ }, { "name": "psr/http-client", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31", - "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { @@ -2143,9 +1795,9 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/1.0.2" + "source": "https://github.com/php-fig/http-client" }, - "time": "2023-04-10T20:12:12+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", @@ -2463,68 +2115,6 @@ }, "time": "2022-10-10T08:44:53+00:00" }, - { - "name": "spatie/data-transfer-object", - "version": "1.14.1", - "source": { - "type": "git", - "url": "https://github.com/spatie/data-transfer-object.git", - "reference": "12c25e15f08684f1c57c88ccfb3a38a677a11314" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/12c25e15f08684f1c57c88ccfb3a38a677a11314", - "reference": "12c25e15f08684f1c57c88ccfb3a38a677a11314", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "require-dev": { - "larapack/dd": "^1.1", - "phpunit/phpunit": "^7.0|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Spatie\\DataTransferObject\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brent Roose", - "email": "brent@spatie.be", - "homepage": "https://spatie.be", - "role": "Developer" - } - ], - "description": "Data transfer objects with batteries included", - "homepage": "https://github.com/spatie/data-transfer-object", - "keywords": [ - "data-transfer-object", - "spatie" - ], - "support": { - "issues": "https://github.com/spatie/data-transfer-object/issues", - "source": "https://github.com/spatie/data-transfer-object/tree/1.14.1" - }, - "funding": [ - { - "url": "https://spatie.be/open-source/support-us", - "type": "custom" - }, - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "abandoned": "spatie/laravel-data", - "time": "2021-12-15T07:25:06+00:00" - }, { "name": "symfony/cache", "version": "v6.0.19", @@ -3788,80 +3378,6 @@ ], "time": "2023-01-11T11:50:03+00:00" }, - { - "name": "tectalic/openai", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/tectalichq/public-openai-client-php.git", - "reference": "434f48f816818f4a56eb8801f24b3d85ddc35a01" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tectalichq/public-openai-client-php/zipball/434f48f816818f4a56eb8801f24b3d85ddc35a01", - "reference": "434f48f816818f4a56eb8801f24b3d85ddc35a01", - "shasum": "" - }, - "require": { - "ext-json": "*", - "nyholm/psr7": "^1.4", - "php": "^7.2.5 || ^8.0", - "php-http/message": "^1.11", - "php-http/multipart-stream-builder": "^1.2", - "psr/http-client": "^1.0.1", - "spatie/data-transfer-object": "^1.14" - }, - "conflict": { - "cebe/php-openapi": "<1.7", - "riverline/multipart-parser": "<2.0.9", - "symfony/yaml": "<3.4.31 || >4.0 <4.3.4" - }, - "require-dev": { - "league/openapi-psr7-validator": "^0.17.0", - "mikey179/vfsstream": "^1.6.10", - "php-http/mock-client": "^1.5", - "phpstan/phpstan": "^1.4", - "phpunit/phpunit": "^8.5.14 || ^9.5 || ^10.0", - "squizlabs/php_codesniffer": "^3.6", - "symfony/http-client": "^5.3" - }, - "suggest": { - "php-http/mock-client": "Simplify testing by using a mock HTTP client" - }, - "type": "library", - "autoload": { - "psr-4": { - "Tectalic\\OpenAi\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "An OpenAI REST API Client with support for ChatGPT, GPT-4, GPT-3.5, GPT-3, Codex, DALL·E, Whisper, Embeddings and Moderation models. Includes fully typed Data Transfer Objects (DTOs) for all requests and responses and IDE autocomplete support.", - "homepage": "https://tectalic.com/apis/openai", - "keywords": [ - "ChatGpt", - "GPT-3", - "ai", - "api", - "dall-e", - "dalle", - "gpt-3.5", - "gpt-4", - "gpt3", - "gpt3.5", - "gpt4", - "openai", - "rest", - "tectalic", - "whisper" - ], - "support": { - "source": "https://github.com/tectalichq/public-openai-client-php/tree/v1.5.0" - }, - "time": "2023-06-19T03:13:28+00:00" - }, { "name": "twig/twig", "version": "v3.7.1", @@ -4054,16 +3570,16 @@ "packages-dev": [ { "name": "captainhook/captainhook", - "version": "5.16.4", + "version": "5.17.3", "source": { "type": "git", "url": "https://github.com/captainhookphp/captainhook.git", - "reference": "524c8660551bafe9c7211440a71a35984e8dfc4b" + "reference": "cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/524c8660551bafe9c7211440a71a35984e8dfc4b", - "reference": "524c8660551bafe9c7211440a71a35984e8dfc4b", + "url": "https://api.github.com/repos/captainhookphp/captainhook/zipball/cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d", + "reference": "cac493cfacf14f3a2d16b4ebff9a3bc9adb4c68d", "shasum": "" }, "require": { @@ -4073,7 +3589,7 @@ "php": ">=7.4", "sebastianfeldmann/camino": "^0.9.2", "sebastianfeldmann/cli": "^3.3", - "sebastianfeldmann/git": "^3.8.9", + "sebastianfeldmann/git": "^3.9", "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0", "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" @@ -4125,7 +3641,7 @@ ], "support": { "issues": "https://github.com/captainhookphp/captainhook/issues", - "source": "https://github.com/captainhookphp/captainhook/tree/5.16.4" + "source": "https://github.com/captainhookphp/captainhook/tree/5.17.3" }, "funding": [ { @@ -4133,7 +3649,7 @@ "type": "github" } ], - "time": "2023-04-17T19:48:47+00:00" + "time": "2023-10-04T11:51:41+00:00" }, { "name": "captainhook/plugin-composer", @@ -4192,16 +3708,16 @@ }, { "name": "dg/bypass-finals", - "version": "v1.5.0", + "version": "v1.5.1", "source": { "type": "git", "url": "https://github.com/dg/bypass-finals.git", - "reference": "7df37b7342d7d25ab906e53eb4e92d83542f46c1" + "reference": "12ef25e1f8d4144e4ec80d13a28895e8942f4104" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dg/bypass-finals/zipball/7df37b7342d7d25ab906e53eb4e92d83542f46c1", - "reference": "7df37b7342d7d25ab906e53eb4e92d83542f46c1", + "url": "https://api.github.com/repos/dg/bypass-finals/zipball/12ef25e1f8d4144e4ec80d13a28895e8942f4104", + "reference": "12ef25e1f8d4144e4ec80d13a28895e8942f4104", "shasum": "" }, "require": { @@ -4239,9 +3755,9 @@ ], "support": { "issues": "https://github.com/dg/bypass-finals/issues", - "source": "https://github.com/dg/bypass-finals/tree/v1.5.0" + "source": "https://github.com/dg/bypass-finals/tree/v1.5.1" }, - "time": "2023-08-23T11:20:33+00:00" + "time": "2023-09-16T09:13:54+00:00" }, { "name": "doctrine/instantiator", @@ -4485,16 +4001,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.27", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1", - "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { @@ -4551,7 +4067,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -4559,7 +4075,7 @@ "type": "github" } ], - "time": "2023-07-26T13:44:30+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4804,16 +4320,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.11", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "810500e92855eba8a7a5319ae913be2da6f957b0" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/810500e92855eba8a7a5319ae913be2da6f957b0", - "reference": "810500e92855eba8a7a5319ae913be2da6f957b0", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { @@ -4828,7 +4344,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -4887,7 +4403,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.11" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -4903,7 +4419,688 @@ "type": "tidelift" } ], - "time": "2023-08-19T07:10:56+00:00" + "time": "2023-09-19T05:39:22+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-latest", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/66dba7265a37e4081f443ed8211d507cd3cce5ef", + "reference": "66dba7265a37e4081f443ed8211d507cd3cce5ef", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "admidio/admidio": "<4.2.11", + "adodb/adodb-php": "<=5.20.20|>=5.21,<=5.21.3", + "aheinze/cockpit": "<2.2", + "aimeos/aimeos-typo3": "<19.10.12|>=20,<20.10.5", + "akaunting/akaunting": "<2.1.13", + "akeneo/pim-community-dev": "<5.0.119|>=6,<6.0.53", + "alextselegidis/easyappointments": "<1.5", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amazing/media2click": ">=1,<1.3.3", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "amphp/http-client": ">=4,<4.4", + "anchorcms/anchor-cms": "<=0.12.7", + "andreapollastri/cipi": "<=3.1.15", + "andrewhaine/silverstripe-form-capture": ">=0.2,<=0.2.3|>=1,<1.0.2|>=2,<2.2.5", + "apache-solr-for-typo3/solr": "<2.8.3", + "apereo/phpcas": "<1.6", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6|>=2.6,<2.7.10|>=3,<3.0.12|>=3.1,<3.1.3", + "appwrite/server-ce": "<=1.2.1", + "arc/web": "<3", + "area17/twill": "<1.2.5|>=2,<2.5.3", + "artesaos/seotools": "<0.17.2", + "asymmetricrypt/asymmetricrypt": "<9.9.99", + "athlon1600/php-proxy": "<=5.1", + "athlon1600/php-proxy-app": "<=3", + "austintoddj/canvas": "<=3.4.2", + "automad/automad": "<1.8", + "awesome-support/awesome-support": "<=6.0.7", + "aws/aws-sdk-php": ">=3,<3.2.1", + "azuracast/azuracast": "<0.18.3", + "backdrop/backdrop": "<1.24.2", + "backpack/crud": "<3.4.9", + "badaso/core": "<2.7", + "bagisto/bagisto": "<0.1.5", + "barrelstrength/sprout-base-email": "<1.2.7", + "barrelstrength/sprout-forms": "<3.9", + "barryvdh/laravel-translation-manager": "<0.6.2", + "barzahlen/barzahlen-php": "<2.0.1", + "baserproject/basercms": "<4.7.5", + "bassjobsen/bootstrap-3-typeahead": ">4.0.2", + "bigfork/silverstripe-form-capture": ">=3,<3.1.1", + "billz/raspap-webgui": "<=2.9.2", + "bk2k/bootstrap-package": ">=7.1,<7.1.2|>=8,<8.0.8|>=9,<9.0.4|>=9.1,<9.1.3|>=10,<10.0.10|>=11,<11.0.3", + "bmarshall511/wordpress_zero_spam": "<5.2.13", + "bolt/bolt": "<3.7.2", + "bolt/core": "<=4.2", + "bottelet/flarepoint": "<2.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "brotkrueml/codehighlight": "<2.7", + "brotkrueml/schema": "<1.13.1|>=2,<2.5.1", + "brotkrueml/typo3-matomo-integration": "<1.3.2", + "buddypress/buddypress": "<7.2.1", + "bugsnag/bugsnag-laravel": "<2.0.2", + "bytefury/crater": "<6.0.2", + "cachethq/cachet": "<2.5.1", + "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", + "cardgate/magento2": "<2.0.33", + "cardgate/woocommerce": "<=3.1.15", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "catfan/medoo": "<1.7.5", + "cecil/cecil": "<7.47.1", + "centreon/centreon": "<22.10.0.0-beta1", + "cesnet/simplesamlphp-module-proxystatistics": "<3.1", + "chriskacerguis/codeigniter-restserver": "<=2.7.1", + "civicrm/civicrm-core": ">=4.2,<4.2.9|>=4.3,<4.3.3", + "cockpit-hq/cockpit": "<=2.6.3", + "codeception/codeception": "<3.1.3|>=4,<4.1.22", + "codeigniter/framework": "<3.1.9", + "codeigniter4/framework": "<4.3.5", + "codeigniter4/shield": "<1.0.0.0-beta4", + "codiad/codiad": "<=2.8.4", + "composer/composer": "<1.10.27|>=2,<2.2.22|>=2.3,<2.6.4", + "concrete5/concrete5": "<=9.2.1", + "concrete5/core": "<8.5.8|>=9,<9.1", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": "<4.9.42|>=4.10,<4.13.28|>=5,<5.1.10", + "contao/listing-bundle": ">=4,<4.4.8", + "contao/managed-edition": "<=1.5", + "cosenary/instagram": "<=2.3", + "craftcms/cms": "<=4.4.14", + "croogo/croogo": "<4", + "cuyz/valinor": "<0.12", + "czproject/git-php": "<4.0.3", + "darylldoyle/safe-svg": "<1.9.10", + "datadog/dd-trace": ">=0.30,<0.30.2", + "datatables/datatables": "<1.10.10", + "david-garcia/phpwhois": "<=4.3.1", + "dbrisinajumi/d2files": "<1", + "dcat/laravel-admin": "<=2.1.3.0-beta", + "derhansen/fe_change_pwd": "<2.0.5|>=3,<3.0.3", + "derhansen/sf_event_mgt": "<4.3.1|>=5,<5.1.1", + "desperado/xml-bundle": "<=0.1.7", + "directmailteam/direct-mail": "<5.2.4", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2|>=3,<3.1.4", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1|>=2.8.3,<2.8.4", + "dolibarr/dolibarr": "<18", + "dompdf/dompdf": "<2.0.2|==2.0.2", + "drupal/core": "<9.4.14|>=9.5,<9.5.8|>=10,<10.0.8", + "drupal/drupal": ">=6,<6.38|>=7,<7.80|>=8,<8.9.16|>=9,<9.1.12|>=9.2,<9.2.4", + "dweeves/magmi": "<=0.7.24", + "ecodev/newsletter": "<=4", + "ectouch/ectouch": "<=2.7.2", + "elefant/cms": "<2.0.7", + "elgg/elgg": "<3.3.24|>=4,<4.0.5", + "encore/laravel-admin": "<=1.8.19", + "endroid/qr-code-bundle": "<3.4.2", + "enshrined/svg-sanitize": "<0.15", + "erusev/parsedown": "<1.7.2", + "ether/logs": "<3.0.4", + "exceedone/exment": "<4.4.3|>=5,<5.0.3", + "exceedone/laravel-admin": "<2.2.3|==3", + "ezsystems/demobundle": ">=5.4,<5.4.6.1-dev", + "ezsystems/ez-support-tools": ">=2.2,<2.2.3", + "ezsystems/ezdemo-ls-extension": ">=5.4,<5.4.2.1-dev", + "ezsystems/ezfind-ls": ">=5.3,<5.3.6.1-dev|>=5.4,<5.4.11.1-dev|>=2017.12,<2017.12.0.1-dev", + "ezsystems/ezplatform": "<=1.13.6|>=2,<=2.5.24", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.6|>=1.5,<1.5.29|>=2.3,<2.3.26", + "ezsystems/ezplatform-admin-ui-assets": ">=4,<4.2.1|>=5,<5.0.1|>=5.1,<5.1.1", + "ezsystems/ezplatform-graphql": ">=1.0.0.0-RC1-dev,<1.0.13|>=2.0.0.0-beta1,<2.3.12", + "ezsystems/ezplatform-kernel": "<1.2.5.1-dev|>=1.3,<1.3.26", + "ezsystems/ezplatform-rest": ">=1.2,<=1.2.2|>=1.3,<1.3.8", + "ezsystems/ezplatform-richtext": ">=2.3,<2.3.7.1-dev", + "ezsystems/ezplatform-user": ">=1,<1.0.1", + "ezsystems/ezpublish-kernel": "<6.13.8.2-dev|>=7,<7.5.30", + "ezsystems/ezpublish-legacy": "<=2017.12.7.3|>=2018.6,<=2019.03.5.1", + "ezsystems/platform-ui-assets-bundle": ">=4.2,<4.2.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1-dev|>=2.5,<2.5.15", + "ezyang/htmlpurifier": "<4.1.1", + "facade/ignition": "<1.16.15|>=2,<2.4.2|>=2.5,<2.5.2", + "facturascripts/facturascripts": "<=2022.08", + "feehi/cms": "<=2.1.1", + "feehi/feehicms": "<=2.1.1", + "fenom/fenom": "<=2.12.1", + "filegator/filegator": "<7.8", + "firebase/php-jwt": "<6", + "fixpunkt/fp-masterquiz": "<2.2.1|>=3,<3.5.2", + "fixpunkt/fp-newsletter": "<1.1.1|>=2,<2.1.2|>=2.2,<3.2.6", + "flarum/core": "<1.8", + "flarum/framework": "<1.8", + "flarum/mentions": "<1.6.3", + "flarum/sticky": ">=0.1.0.0-beta14,<=0.1.0.0-beta15", + "flarum/tags": "<=0.1.0.0-beta13", + "fluidtypo3/vhs": "<5.1.1", + "fof/byobu": ">=0.3.0.0-beta2,<1.1.7", + "fof/upload": "<1.2.3", + "fooman/tcpdf": "<6.2.22", + "forkcms/forkcms": "<5.11.1", + "fossar/tcpdf-parser": "<6.2.22", + "francoisjacquet/rosariosis": "<11", + "frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2", + "friendsofsymfony/oauth2-php": "<1.3", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "friendsoftypo3/mediace": ">=7.6.2,<7.6.5", + "friendsoftypo3/openid": ">=4.5,<4.5.31|>=4.7,<4.7.16|>=6,<6.0.11|>=6.1,<6.1.6", + "froala/wysiwyg-editor": "<3.2.7|>=4.0.1,<=4.1.1", + "froxlor/froxlor": "<2.1", + "fuel/core": "<1.8.1", + "funadmin/funadmin": "<=3.2|>=3.3.2,<=3.3.3", + "gaoming13/wechat-php-sdk": "<=1.10.2", + "genix/cms": "<=1.1.11", + "getgrav/grav": "<=1.7.42.1", + "getkirby/cms": "<3.5.8.3-dev|>=3.6,<3.6.6.3-dev|>=3.7,<3.7.5.2-dev|>=3.8,<3.8.4.1-dev|>=3.9,<3.9.6", + "getkirby/kirby": "<=2.5.12", + "getkirby/panel": "<2.5.14", + "getkirby/starterkit": "<=3.7.0.2", + "gilacms/gila": "<=1.11.4", + "gleez/cms": "<=1.2|==2", + "globalpayments/php-sdk": "<2", + "gogentooss/samlbase": "<1.2.7", + "google/protobuf": "<3.15", + "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", + "gree/jose": "<2.2.1", + "gregwar/rst": "<1.0.3", + "grumpydictator/firefly-iii": "<6", + "gugoan/economizzer": "<=0.9.0.0-beta1", + "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", + "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", + "harvesthq/chosen": "<1.8.7", + "helloxz/imgurl": "<=2.31", + "hhxsv5/laravel-s": "<3.7.36", + "hillelcoren/invoice-ninja": "<5.3.35", + "himiklab/yii2-jqgrid-widget": "<1.0.8", + "hjue/justwriting": "<=1", + "hov/jobfair": "<1.0.13|>=2,<2.0.2", + "httpsoft/http-message": "<1.0.12", + "hyn/multi-tenant": ">=5.6,<5.7.2", + "ibexa/admin-ui": ">=4.2,<4.2.3", + "ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3", + "ibexa/graphql": ">=2.5,<2.5.31|>=3.3,<3.3.28|>=4.2,<4.2.3", + "ibexa/post-install": "<=1.0.4", + "ibexa/user": ">=4,<4.4.3", + "icecoder/icecoder": "<=8.1", + "idno/known": "<=1.3.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.99999|>=4.2,<=4.2.99999|>=5,<=5.0.99999|>=5.1,<=5.1.99999|>=5.2,<=5.2.99999|>=5.3,<=5.3.99999|>=5.4,<=5.4.99999|>=5.5,<=5.5.49|>=5.6,<=5.6.99999|>=5.7,<=5.7.99999|>=5.8,<=5.8.99999|>=6,<6.18.31|>=7,<7.22.4", + "illuminate/database": "<6.20.26|>=7,<7.30.5|>=8,<8.40", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "illuminate/view": "<6.20.42|>=7,<7.30.6|>=8,<8.75", + "impresscms/impresscms": "<=1.4.5", + "in2code/femanager": "<5.5.3|>=6,<6.3.4|>=7,<7.2.2", + "in2code/ipandlanguageredirect": "<5.1.2", + "in2code/lux": "<17.6.1|>=18,<24.0.2", + "innologi/typo3-appointments": "<2.0.6", + "intelliants/subrion": "<4.2.2", + "islandora/islandora": ">=2,<2.4.1", + "ivankristianto/phpwhois": "<=4.3", + "jackalope/jackalope-doctrine-dbal": "<1.7.4", + "james-heinrich/getid3": "<1.9.21", + "james-heinrich/phpthumb": "<1.7.12", + "jasig/phpcas": "<1.3.3", + "jcbrand/converse.js": "<3.3.3", + "joomla/application": "<1.0.13", + "joomla/archive": "<1.1.12|>=2,<2.0.1", + "joomla/filesystem": "<1.6.2|>=2,<2.0.1", + "joomla/filter": "<1.4.4|>=2,<2.0.1", + "joomla/framework": ">=2.5.4,<=3.8.12", + "joomla/input": ">=2,<2.0.2", + "joomla/joomla-cms": ">=2.5,<3.9.12", + "joomla/session": "<1.3.1", + "joyqi/hyper-down": "<=2.4.27", + "jsdecena/laracom": "<2.0.9", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kelvinmo/simplexrd": "<3.1.1", + "kevinpapst/kimai2": "<1.16.7", + "khodakhah/nodcms": "<=3", + "kimai/kimai": "<1.1", + "kitodo/presentation": "<3.2.3|>=3.3,<3.3.4", + "klaviyo/magento2-extension": ">=1,<3", + "knplabs/knp-snappy": "<=1.4.2", + "kohana/core": "<3.3.3", + "krayin/laravel-crm": "<1.2.2", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laminas/laminas-diactoros": "<2.18.1|==2.19|==2.20|==2.21|==2.22|==2.23|>=2.24,<2.24.2|>=2.25,<2.25.2", + "laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1", + "laminas/laminas-http": "<2.14.2", + "laravel/fortify": "<1.11.1", + "laravel/framework": "<6.20.44|>=7,<7.30.6|>=8,<8.75", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "latte/latte": "<2.10.8", + "lavalite/cms": "<=9", + "lcobucci/jwt": ">=3.4,<3.4.6|>=4,<4.0.4|>=4.1,<4.1.5", + "league/commonmark": "<0.18.3", + "league/flysystem": "<1.1.4|>=2,<2.1.1", + "league/oauth2-server": ">=8.3.2,<8.4.2|>=8.5,<8.5.3", + "lexik/jwt-authentication-bundle": "<2.10.7|>=2.11,<2.11.3", + "librenms/librenms": "<2017.08.18", + "liftkit/database": "<2.13.2", + "limesurvey/limesurvey": "<3.27.19", + "livehelperchat/livehelperchat": "<=3.91", + "livewire/livewire": ">2.2.4,<2.2.6", + "lms/routes": "<2.1.1", + "localizationteam/l10nmgr": "<7.4|>=8,<8.7|>=9,<9.2", + "luyadev/yii-helpers": "<1.2.1", + "magento/community-edition": "<=2.4", + "magento/magento1ce": "<1.9.4.3-dev", + "magento/magento1ee": ">=1,<1.14.4.3-dev", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2.0-patch2", + "maikuolan/phpmussel": ">=1,<1.6", + "mantisbt/mantisbt": "<=2.25.5", + "marcwillmann/turn": "<0.3.3", + "matyhtf/framework": "<3.0.6", + "mautic/core": "<4.3", + "mediawiki/core": ">=1.27,<1.27.6|>=1.29,<1.29.3|>=1.30,<1.30.2|>=1.31,<1.31.9|>=1.32,<1.32.6|>=1.32.99,<1.33.3|>=1.33.99,<1.34.3|>=1.34.99,<1.35", + "mediawiki/matomo": "<2.4.3", + "melisplatform/melis-asset-manager": "<5.0.1", + "melisplatform/melis-cms": "<5.0.1", + "melisplatform/melis-front": "<5.0.1", + "mezzio/mezzio-swoole": "<3.7|>=4,<4.3", + "mgallegos/laravel-jqgrid": "<=1.3", + "microweber/microweber": "<=1.3.4", + "miniorange/miniorange-saml": "<1.4.3", + "mittwald/typo3_forum": "<1.2.1", + "mobiledetect/mobiledetectlib": "<2.8.32", + "modx/revolution": "<=2.8.3.0-patch", + "mojo42/jirafeau": "<4.4", + "mongodb/mongodb": ">=1,<1.9.2", + "monolog/monolog": ">=1.8,<1.12", + "moodle/moodle": "<4.2.0.0-RC2-dev|==4.2", + "movim/moxl": ">=0.8,<=0.10", + "mpdf/mpdf": "<=7.1.7", + "mustache/mustache": ">=2,<2.14.1", + "namshi/jose": "<2.2", + "neoan3-apps/template": "<1.1.1", + "neorazorx/facturascripts": "<2022.04", + "neos/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "neos/form": ">=1.2,<4.3.3|>=5,<5.0.9|>=5.1,<5.1.3", + "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.9.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", + "neos/neos-ui": "<=8.3.3", + "neos/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", + "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", + "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", + "nilsteampassnet/teampass": "<3.0.10", + "notrinos/notrinos-erp": "<=0.7", + "noumo/easyii": "<=0.9", + "nukeviet/nukeviet": "<4.5.02", + "nyholm/psr7": "<1.6.1", + "nystudio107/craft-seomatic": "<3.4.12", + "nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1", + "october/backend": "<1.1.2", + "october/cms": "<1.0.469|==1.0.469|==1.0.471|==1.1.1", + "october/october": "<=3.4.4", + "october/rain": "<1.0.472|>=1.1,<1.1.2", + "october/system": "<1.0.476|>=1.1,<1.1.12|>=2,<2.2.34|>=3,<3.0.66", + "onelogin/php-saml": "<2.10.4", + "oneup/uploader-bundle": "<1.9.3|>=2,<2.1.5", + "open-web-analytics/open-web-analytics": "<1.7.4", + "opencart/opencart": "<=3.0.3.7|>=4,<4.0.2.3-dev", + "openid/php-openid": "<2.3", + "openmage/magento-lts": "<=19.5|>=20,<=20.1", + "opensource-workshop/connect-cms": "<1.7.2|>=2,<2.3.2", + "orchid/platform": ">=9,<9.4.4|>=14.0.0.0-alpha4,<14.5", + "oro/commerce": ">=4.1,<5.0.6", + "oro/crm": ">=1.7,<1.7.4|>=3.1,<4.1.17|>=4.2,<4.2.7", + "oro/platform": ">=1.7,<1.7.4|>=3.1,<3.1.29|>=4.1,<4.1.17|>=4.2,<4.2.8", + "oxid-esales/oxideshop-ce": "<4.5", + "packbackbooks/lti-1-3-php-library": "<5", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": "<3", + "pagekit/pagekit": "<=1.0.18", + "paragonie/random_compat": "<2", + "passbolt/passbolt_api": "<2.11", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.14", + "pear/crypt_gpg": "<1.6.7", + "pear/pear": "<=1.10.1", + "pegasus/google-for-jobs": "<1.5.1|>=2,<2.1.1", + "personnummer/personnummer": "<3.0.2", + "phanan/koel": "<5.1.4", + "php-mod/curl": "<2.3.2", + "phpbb/phpbb": "<3.2.10|>=3.3,<3.3.1", + "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", + "phpmailer/phpmailer": "<6.5", + "phpmussel/phpmussel": ">=1,<1.6", + "phpmyadmin/phpmyadmin": "<5.2.1", + "phpmyfaq/phpmyfaq": "<=3.1.7", + "phpoffice/phpexcel": "<1.8", + "phpoffice/phpspreadsheet": "<1.16", + "phpseclib/phpseclib": "<2.0.31|>=3,<3.0.19", + "phpservermon/phpservermon": "<3.6", + "phpsysinfo/phpsysinfo": "<3.2.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "phpxmlrpc/phpxmlrpc": "<4.9.2", + "pi/pi": "<=2.5", + "pimcore/admin-ui-classic-bundle": "<1.1.2", + "pimcore/customer-management-framework-bundle": "<3.4.2", + "pimcore/data-hub": "<1.2.4", + "pimcore/demo": "<10.3", + "pimcore/perspective-editor": "<1.5.1", + "pimcore/pimcore": "<10.6.8", + "pixelfed/pixelfed": "<=0.11.4", + "pocketmine/bedrock-protocol": "<8.0.2", + "pocketmine/pocketmine-mp": "<=4.23|>=5,<5.3.1", + "pressbooks/pressbooks": "<5.18", + "prestashop/autoupgrade": ">=4,<4.10.1", + "prestashop/blockwishlist": ">=2,<2.1.1", + "prestashop/contactform": ">=1.0.1,<4.3", + "prestashop/gamification": "<2.3.2", + "prestashop/prestashop": "<8.1.2", + "prestashop/productcomments": "<5.0.2", + "prestashop/ps_emailsubscription": "<2.6.1", + "prestashop/ps_facetedsearch": "<3.4.1", + "prestashop/ps_linklist": "<3.1", + "privatebin/privatebin": "<1.4", + "processwire/processwire": "<=3.0.200", + "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", + "propel/propel1": ">=1,<=1.7.1", + "pterodactyl/panel": "<1.7", + "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", + "ptrofimov/beanstalk_console": "<1.7.14", + "pusher/pusher-php-server": "<2.2.1", + "pwweb/laravel-core": "<=0.3.6.0-beta", + "pyrocms/pyrocms": "<=3.9.1", + "rainlab/blog-plugin": "<1.4.1", + "rainlab/debugbar-plugin": "<3.1", + "rainlab/user-plugin": "<=1.4.5", + "rankmath/seo-by-rank-math": "<=1.0.95", + "rap2hpoutre/laravel-log-viewer": "<0.13", + "react/http": ">=0.7,<1.9", + "really-simple-plugins/complianz-gdpr": "<6.4.2", + "remdex/livehelperchat": "<3.99", + "rmccue/requests": ">=1.6,<1.8", + "robrichards/xmlseclibs": "<3.0.4", + "roots/soil": "<4.1", + "rudloff/alltube": "<3.0.3", + "s-cart/core": "<6.9", + "s-cart/s-cart": "<6.9", + "sabberworm/php-css-parser": ">=1,<1.0.1|>=2,<2.0.1|>=3,<3.0.1|>=4,<4.0.1|>=5,<5.0.9|>=5.1,<5.1.3|>=5.2,<5.2.1|>=6,<6.0.2|>=7,<7.0.4|>=8,<8.0.1|>=8.1,<8.1.1|>=8.2,<8.2.1|>=8.3,<8.3.1", + "sabre/dav": "<1.7.11|>=1.8,<1.8.9", + "scheb/two-factor-bundle": "<3.26|>=4,<4.11", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "sfroemken/url_redirect": "<=1.2.1", + "sheng/yiicms": "<=1.2", + "shopware/core": "<=6.4.20", + "shopware/platform": "<=6.4.20", + "shopware/production": "<=6.3.5.2", + "shopware/shopware": "<=5.7.17", + "shopware/storefront": "<=6.4.8.1", + "shopxo/shopxo": "<2.2.6", + "showdoc/showdoc": "<2.10.4", + "silverstripe-australia/advancedreports": ">=1,<=2", + "silverstripe/admin": "<1.13.6", + "silverstripe/assets": ">=1,<1.11.1", + "silverstripe/cms": "<4.11.3", + "silverstripe/comments": ">=1.3,<1.9.99|>=2,<2.9.99|>=3,<3.1.1", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": "<4.13.14|>=5,<5.0.13", + "silverstripe/graphql": "<3.5.2|>=4.0.0.0-alpha1,<4.0.0.0-alpha2|>=4.1.1,<4.1.2|>=4.2.2,<4.2.3", + "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", + "silverstripe/recipe-cms": ">=4.5,<4.5.3", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/silverstripe-omnipay": "<2.5.2|>=3,<3.0.2|>=3.1,<3.1.4|>=3.2,<3.2.1", + "silverstripe/subsites": ">=2,<2.6.1", + "silverstripe/taxonomy": ">=1.3,<1.3.1|>=2,<2.0.1", + "silverstripe/userforms": "<3", + "silverstripe/versioned-admin": ">=1,<1.11.1", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.15.4|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.18.6", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "simplesamlphp/simplesamlphp-module-openid": "<1", + "simplesamlphp/simplesamlphp-module-openidprovider": "<0.9", + "simplito/elliptic-php": "<1.0.6", + "sitegeist/fluid-components": "<3.5", + "sjbr/sr-freecap": "<2.4.6|>=2.5,<2.5.3", + "slim/psr7": "<1.4.1|>=1.5,<1.5.1|>=1.6,<1.6.1", + "slim/slim": "<2.6", + "slub/slub-events": "<3.0.3", + "smarty/smarty": "<3.1.48|>=4,<4.3.1", + "snipe/snipe-it": "<=6.2.1", + "socalnick/scn-social-auth": "<1.15.2", + "socialiteproviders/steam": "<1.1", + "spatie/browsershot": "<3.57.4", + "spipu/html2pdf": "<5.2.8", + "spoon/library": "<1.4.1", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "ssddanbrown/bookstack": "<22.02.3", + "statamic/cms": "<4.10", + "stormpath/sdk": "<9.9.99", + "studio-42/elfinder": "<2.1.62", + "subhh/libconnect": "<7.0.8|>=8,<8.1", + "sukohi/surpass": "<1", + "sulu/sulu": "<1.6.44|>=2,<2.2.18|>=2.3,<2.3.8|==2.4.0.0-RC1|>=2.5,<2.5.10", + "sumocoders/framework-user-bundle": "<1.4", + "swag/paypal": "<5.4.4", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": "<1.10.1", + "sylius/paypal-plugin": ">=1,<1.2.4|>=1.3,<1.3.1", + "sylius/resource-bundle": "<1.3.14|>=1.4,<1.4.7|>=1.5,<1.5.2|>=1.6,<1.6.4", + "sylius/sylius": "<1.9.10|>=1.10,<1.10.11|>=1.11,<1.11.2", + "symbiote/silverstripe-multivaluefield": ">=3,<3.0.99", + "symbiote/silverstripe-queuedjobs": ">=3,<3.0.2|>=3.1,<3.1.4|>=4,<4.0.7|>=4.1,<4.1.2|>=4.2,<4.2.4|>=4.3,<4.3.3|>=4.4,<4.4.3|>=4.5,<4.5.1|>=4.6,<4.6.4", + "symbiote/silverstripe-seed": "<6.0.3", + "symbiote/silverstripe-versionedfiles": "<=2.0.3", + "symfont/process": ">=0", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/error-handler": ">=4.4,<4.4.4|>=5,<5.0.4", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7|>=5.3.14,<=5.3.14|>=5.4.3,<=5.4.3|>=6.0.3,<=6.0.3", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7", + "symfony/http-kernel": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/maker-bundle": ">=1.27,<1.29.2|>=1.30,<1.31.1", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.8", + "symfony/security-bundle": ">=2,<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<3.4.49|>=4,<4.4.24|>=5,<5.2.9", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<3.4.48|>=4,<4.4.23|>=5,<5.2.8", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8|>=4.4,<4.4.7|>=5,<5.0.7|>=5.1,<5.2.8|>=5.3,<5.3.2", + "symfony/serializer": ">=2,<2.0.11|>=4.1,<4.4.35|>=5,<5.3.12", + "symfony/symfony": "<4.4.50|>=5,<5.4.20|>=6,<6.0.20|>=6.1,<6.1.12|>=6.2,<6.2.6", + "symfony/translation": ">=2,<2.0.17", + "symfony/ux-autocomplete": "<2.11.2", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "t3/dce": "<0.11.5|>=2.2,<2.6.2", + "t3g/svg-sanitizer": "<1.0.3", + "tastyigniter/tastyigniter": "<3.3", + "tcg/voyager": "<=1.4", + "tecnickcom/tcpdf": "<6.2.22", + "terminal42/contao-tablelookupwizard": "<3.3.5", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "thinkcmf/thinkcmf": "<=5.1.7", + "thorsten/phpmyfaq": "<3.2.0.0-beta2", + "tikiwiki/tiki-manager": "<=17.1", + "tinymce/tinymce": "<5.10.7|>=6,<6.3.1", + "tinymighty/wiki-seo": "<1.2.2", + "titon/framework": "<9.9.99", + "tobiasbg/tablepress": "<=2.0.0.0-RC1", + "topthink/framework": "<6.0.14", + "topthink/think": "<=6.1.1", + "topthink/thinkphp": "<=3.2.3", + "tpwd/ke_search": "<4.0.3|>=4.1,<4.6.6|>=5,<5.0.2", + "tribalsystems/zenario": "<=9.4.59197", + "truckersmp/phpwhois": "<=4.3.1", + "ttskch/pagination-service-provider": "<1", + "twig/twig": "<1.44.7|>=2,<2.15.3|>=3,<3.4.3", + "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", + "typo3/cms-backend": ">=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-core": "<8.7.51|>=9,<9.5.42|>=10,<10.4.39|>=11,<11.5.30|>=12,<12.4.4", + "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", + "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", + "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", + "typo3/html-sanitizer": ">=1,<1.5.1|>=2,<2.1.2", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "typo3/swiftmailer": ">=4.1,<4.1.99|>=5.4,<5.4.5", + "typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10", + "ua-parser/uap-php": "<3.8", + "uasoft-indonesia/badaso": "<=2.9.7", + "unisharp/laravel-filemanager": "<=2.5.1", + "userfrosting/userfrosting": ">=0.3.1,<4.6.3", + "usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2", + "uvdesk/community-skeleton": "<=1.1.1", + "vanilla/safecurl": "<0.9.2", + "verot/class.upload.php": "<=1.0.3|>=2,<=2.0.4", + "vova07/yii2-fileapi-widget": "<0.1.9", + "vrana/adminer": "<4.8.1", + "waldhacker/hcaptcha": "<2.1.2", + "wallabag/tcpdf": "<6.2.22", + "wallabag/wallabag": "<2.6.7", + "wanglelecc/laracms": "<=1.0.3", + "web-auth/webauthn-framework": ">=3.3,<3.3.4", + "webbuilders-group/silverstripe-kapost-bridge": "<0.4", + "webcoast/deferred-image-processing": "<1.0.2", + "webklex/laravel-imap": "<5.3", + "webklex/php-imap": "<5.3", + "webpa/webpa": "<3.1.2", + "wikibase/wikibase": "<=1.39.3", + "wikimedia/parsoid": "<0.12.2", + "willdurand/js-translation-bundle": "<2.1.1", + "wintercms/winter": "<1.2.3", + "woocommerce/woocommerce": "<6.6", + "wp-cli/wp-cli": "<2.5", + "wp-graphql/wp-graphql": "<=1.14.5", + "wpanel/wpanel4-cms": "<=4.3.1", + "wpcloud/wp-stateless": "<3.2", + "wwbn/avideo": "<=12.4", + "xataface/xataface": "<3", + "xpressengine/xpressengine": "<3.0.15", + "yeswiki/yeswiki": "<4.1", + "yetiforce/yetiforce-crm": "<=6.4", + "yidashi/yii2cmf": "<=2", + "yii2mod/yii2-cms": "<1.9.2", + "yiisoft/yii": "<1.1.27", + "yiisoft/yii2": "<2.0.38", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.43", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<=2.2.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "yikesinc/yikes-inc-easy-mailchimp-extender": "<6.8.6", + "yoast-seo-for-typo3/yoast_seo": "<7.2.3", + "yourls/yourls": "<=1.8.2", + "zencart/zencart": "<=1.5.7.0-beta", + "zendesk/zendesk_api_client_php": "<2.2.11", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": "<1.8.4", + "zendframework/zend-feed": "<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": "<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<=3", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": "<2.0.2", + "zendframework/zendrest": "<2.0.2", + "zendframework/zendservice-amazon": "<2.0.3", + "zendframework/zendservice-api": "<1", + "zendframework/zendservice-audioscrobbler": "<2.0.2", + "zendframework/zendservice-nirvanix": "<2.0.2", + "zendframework/zendservice-slideshare": "<2.0.2", + "zendframework/zendservice-technorati": "<2.0.2", + "zendframework/zendservice-windowsazure": "<2.0.2", + "zendframework/zendxml": "<1.0.1", + "zenstruck/collection": "<0.2.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2", + "zoujingli/thinkadmin": "<6.0.22" + }, + "default-branch": true, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + }, + { + "name": "Ilya Tribusean", + "email": "slash3b@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "keywords": [ + "dev" + ], + "support": { + "issues": "https://github.com/Roave/SecurityAdvisories/issues", + "source": "https://github.com/Roave/SecurityAdvisories/tree/latest" + }, + "funding": [ + { + "url": "https://github.com/Ocramius", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/roave/security-advisories", + "type": "tidelift" + } + ], + "time": "2023-10-09T22:04:13+00:00" }, { "name": "sebastian/cli-parser", @@ -5985,16 +6182,16 @@ }, { "name": "sebastianfeldmann/git", - "version": "3.8.9", + "version": "3.9.2", "source": { "type": "git", "url": "https://github.com/sebastianfeldmann/git.git", - "reference": "38586be69b0932b630337afcc8db12e5b7981254" + "reference": "11c85123216b32985f8f0b8547a52390d87d544e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/38586be69b0932b630337afcc8db12e5b7981254", - "reference": "38586be69b0932b630337afcc8db12e5b7981254", + "url": "https://api.github.com/repos/sebastianfeldmann/git/zipball/11c85123216b32985f8f0b8547a52390d87d544e", + "reference": "11c85123216b32985f8f0b8547a52390d87d544e", "shasum": "" }, "require": { @@ -6034,7 +6231,7 @@ ], "support": { "issues": "https://github.com/sebastianfeldmann/git/issues", - "source": "https://github.com/sebastianfeldmann/git/tree/3.8.9" + "source": "https://github.com/sebastianfeldmann/git/tree/3.9.2" }, "funding": [ { @@ -6042,7 +6239,7 @@ "type": "github" } ], - "time": "2023-03-30T16:37:34+00:00" + "time": "2023-10-04T10:59:08+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -6215,7 +6412,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "roave/security-advisories": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { diff --git a/src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php b/src/AI/Generators/MissingDocBlocksGenerator.php similarity index 76% rename from src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php rename to src/AI/Generators/MissingDocBlocksGenerator.php index 8dba3747..1e219cca 100644 --- a/src/TemplateGenerator/ChatGpt/MissingDocBlocksGenerator.php +++ b/src/AI/Generators/MissingDocBlocksGenerator.php @@ -2,8 +2,9 @@ declare(strict_types=1); -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; +use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityInterface; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; @@ -12,20 +13,15 @@ use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; -use Tectalic\OpenAi\Client; -use Tectalic\OpenAi\ClientException; final class MissingDocBlocksGenerator { - public const MODEL_GPT_4 = 'gpt-4'; - public const MODE_READ_ONLY_SIGNATURES = 1; public const MODE_READ_ALL_CODE = 2; public function __construct( - private Client $openaiClient, + private ProviderInterface $aiHandler, private ParserHelper $parserHelper, - private string $model = self::MODEL_GPT_4, ) { } @@ -55,13 +51,11 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo * @throws DependencyException * @throws NotFoundException * @throws InvalidConfigurationParameterException - * @throws ClientException */ public function generateDocBlocksForMethodsWithoutIt( RootEntityInterface $rootEntity, int $mode = self::MODE_READ_ONLY_SIGNATURES, ): array { - if (!is_a($rootEntity, ClassEntity::class)) { throw new \InvalidArgumentException('Currently we can only work PHP class entities'); } @@ -82,12 +76,15 @@ public function generateDocBlocksForMethodsWithoutIt( $foundThrows = $matches[1] ?? []; $foundThrows = array_combine($foundThrows, $foundThrows); if ($foundThrows) { - $newThrowsDockBlocks[$method->getName()] = array_filter(array_map(function (string $className) use ($method) { - return $this->parserHelper->parseFullClassName( - $className, - $method->getImplementingClass() - ); - }, $foundThrows), fn($c) => !in_array($c, $alreadySavedThrows)); + $newThrowsDockBlocks[$method->getName()] = array_filter( + array_map(function (string $className) use ($method) { + return $this->parserHelper->parseFullClassName( + $className, + $method->getImplementingClass() + ); + }, $foundThrows), + fn($c) => !in_array($c, $alreadySavedThrows) + ); } } @@ -96,18 +93,34 @@ public function generateDocBlocksForMethodsWithoutIt( $prototypeDocComment = $prototype?->getDocComment(); if ($prototypeDocComment && !str_contains(strtolower($method->getDocComment()), '@inheritdoc')) { if (isset($newThrowsDockBlocks[$method->getName()])) { - $methodsDockBlocks[$method->getName()] = str_replace('*/', "*\n * [throws]\n * {@inheritDoc}\n */", $method->getDocComment()); + $methodsDockBlocks[$method->getName()] = str_replace( + '*/', + "*\n * [throws]\n * {@inheritDoc}\n */", + $method->getDocComment() + ); } else { - $methodsDockBlocks[$method->getName()] = str_replace('*/', "*\n * {@inheritDoc}\n */", $method->getDocComment()); + $methodsDockBlocks[$method->getName()] = str_replace( + '*/', + "*\n * {@inheritDoc}\n */", + $method->getDocComment() + ); } } elseif (isset($newThrowsDockBlocks[$method->getName()])) { - $methodsDockBlocks[$method->getName()] = str_replace('*/', "* [throws]\n */", $method->getDocComment()); + $methodsDockBlocks[$method->getName()] = str_replace( + '*/', + "* [throws]\n */", + $method->getDocComment() + ); } continue; } if (!$method->getDescription() && $method->getDocComment()) { - $methodsDockBlocks[$method->getName()] = str_replace('/**', "/**\n * [insert]", $method->getDocComment()); + $methodsDockBlocks[$method->getName()] = str_replace( + '/**', + "/**\n * [insert]", + $method->getDocComment() + ); } elseif (strlen($method->getDocCommentRecursive()) > 1) { if ($method->getDescription()) { if (isset($newThrowsDockBlocks[$method->getName()])) { @@ -132,27 +145,14 @@ public function generateDocBlocksForMethodsWithoutIt( if ($toRequest) { $classSignature = "{$rootEntity->getModifiersString()} \\{$rootEntity->getName()}"; - $requestData = "/**{$rootEntity->getDescription()}*/\n{$classSignature}{\n" . implode("\n", $toRequest) . "\n}"; - - $messages = [ - [ - 'role' => 'system', - 'content' => file_get_contents(__DIR__ . '/prompts/missingDocBlockGeneration') - ], - ]; - $messages[] = [ - 'role' => 'user', - 'content' => $requestData, - ]; - - $response = $this->openaiClient->chatCompletions()->create( - new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ - 'model' => $this->model, - 'messages' => $messages, - ]) - )->toModel(); - - $responseData = json_decode($response->choices[0]->message->content ?? "{}", true); + $requestData = "/**{$rootEntity->getDescription()}*/\n{$classSignature}{\n" . implode( + "\n", + $toRequest + ) . "\n}"; + + $responseData = $this->aiHandler->generateMissingPHPDocBlocs($requestData); + $responseData = json_decode($responseData ?? "{}", true); + if (!$responseData) { return []; } @@ -160,7 +160,10 @@ public function generateDocBlocksForMethodsWithoutIt( foreach ($methodsDockBlocks as $methodName => $block) { $methodsDockBlocks[$methodName] = str_replace("[insert]", $responseData[$methodName] ?? '', $block); - $throwsString = implode("\n *", array_map(fn($v) => "@throws {$v}", $newThrowsDockBlocks[$methodName] ?? [])); + $throwsString = implode( + "\n *", + array_map(fn($v) => "@throws {$v}", $newThrowsDockBlocks[$methodName] ?? []) + ); if ($throwsString) { $methodsDockBlocks[$methodName] = str_replace( '[throws]', diff --git a/src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php b/src/AI/Generators/ReadmeTemplateGenerator.php similarity index 54% rename from src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php rename to src/AI/Generators/ReadmeTemplateGenerator.php index 74e96774..2795168d 100644 --- a/src/TemplateGenerator/ChatGpt/ReadmeTemplateFiller.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -2,8 +2,9 @@ declare(strict_types=1); -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; +use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; @@ -11,16 +12,11 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; -use Tectalic\OpenAi\Client; -use Tectalic\OpenAi\ClientException; -final class ReadmeTemplateFiller +final class ReadmeTemplateGenerator { - public const MODEL_GPT_4 = 'gpt-4'; - public function __construct( - private Client $openaiClient, - private string $model = self::MODEL_GPT_4, + private ProviderInterface $aiHandler, ) { } @@ -31,7 +27,6 @@ public function __construct( * @param string|null $composerJsonFile * @param string|null $additionalPrompt * @return string - * @throws ClientException * @throws DependencyException * @throws InvalidConfigurationParameterException * @throws NotFoundException @@ -47,25 +42,16 @@ public function generateReadmeFileContent( throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities'); } - $messages = [ - [ - 'role' => 'system', - 'content' => file_get_contents(__DIR__ . '/prompts/readmeTemplateFiller') - ], - ]; + $namespacesList = array_map( + fn(ClassEntity $e) => $e->getNamespaceName(), + iterator_to_array($rootEntityCollection) + ); - $namespacesList = array_map(fn(ClassEntity $e) => $e->getNamespaceName(), iterator_to_array($rootEntityCollection)); $namespacesList = array_unique($namespacesList); - $messages[] = [ - 'role' => 'user', - 'content' => "Project namespaces:\n" . implode("\n", $namespacesList), - ]; + $messages[] = "Project namespaces:\n" . implode("\n", $namespacesList); if ($composerJsonFile) { - $messages[] = [ - 'role' => 'user', - 'content' => "Composer JSON:\n" . file_get_contents($composerJsonFile), - ]; + $messages[] = "Composer JSON:\n" . file_get_contents($composerJsonFile); } $entryPointsSignatures = []; @@ -76,30 +62,20 @@ public function generateReadmeFileContent( } $classSignature = "{$entryPoint->getModifiersString()} \\{$entryPoint->getName()}"; - $entryPointsSignatures[] = "/**{$entryPoint->getDescription()}*/\n{$classSignature}{\n" . implode("\n", $methodsSignatures) . "\n}"; + $entryPointsSignatures[] = "/**{$entryPoint->getDescription()}*/\n{$classSignature}{\n" . implode( + "\n", + $methodsSignatures + ) . "\n}"; } if ($entryPointsSignatures) { - $messages[] = [ - 'role' => 'user', - 'content' => "Project entry points: \n" . implode("\n\n", $entryPointsSignatures) - ]; + $messages[] = "Project entry points: \n" . implode("\n\n", $entryPointsSignatures); } if ($additionalPrompt) { - $messages[] = [ - 'role' => 'user', - 'content' => "Additional Information: {$additionalPrompt}" - ]; + $messages[] = "Additional Information: {$additionalPrompt}"; } - $response = $this->openaiClient->chatCompletions()->create( - new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ - 'model' => $this->model, - 'messages' => $messages, - ]) - )->toModel(); - - return $response->choices[0]->message->content ?? ''; + return $this->aiHandler->generateReadMeFileContent($messages); } } diff --git a/src/TemplateGenerator/ChatGpt/TemplateGenerator.php b/src/AI/Generators/TemplateGenerator.php similarity index 76% rename from src/TemplateGenerator/ChatGpt/TemplateGenerator.php rename to src/AI/Generators/TemplateGenerator.php index 9eaeb3de..e6edf34d 100644 --- a/src/TemplateGenerator/ChatGpt/TemplateGenerator.php +++ b/src/AI/Generators/TemplateGenerator.php @@ -2,8 +2,9 @@ declare(strict_types=1); -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; +use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; @@ -11,15 +12,11 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use DI\DependencyException; use DI\NotFoundException; -use Tectalic\OpenAi\Client; final class TemplateGenerator { - public const MODEL_GPT_4 = 'gpt-4'; - public function __construct( - private Client $openaiClient, - private string $model = self::MODEL_GPT_4, + private ProviderInterface $aiHandler, ) { } @@ -29,43 +26,23 @@ private function getTemplateFromGPT( array $methodStubs, ?string $additionalPrompt ): ?string { - $messages = [ - [ - 'role' => 'system', - 'content' => file_get_contents(__DIR__ . '/prompts/templateGenerationSystem') - ], - ]; - - $messages[] = [ - 'role' => 'user', - 'content' => 'Create the template for ' . $this->getFileSubPathFromPath( - $filePath - ) . ' the existing template is: [TEMPLATE]' . $fileContent . '[/TEMPLATE]', - ]; - - $messages[] = [ - 'role' => 'user', - 'content' => "The file documents a namespace/class with the following method stubs: \n" . implode( + $prompts[] = 'Create the template for ' . $this->getFileSubPathFromPath( + $filePath + ) . ' the existing template is: [TEMPLATE]' . $fileContent . '[/TEMPLATE]'; + + $prompts[] = + "The file documents a namespace/class with the following method stubs: \n" . implode( "\n", $methodStubs - ), - ]; + ); if ($additionalPrompt) { - $messages[] = [ - 'role' => 'user', - 'content' => "Additional Information: {$additionalPrompt}" - ]; + $prompts[] = "Additional Information: {$additionalPrompt}"; } - $response = $this->openaiClient->chatCompletions()->create( - new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ - 'model' => $this->model, - 'messages' => $messages, - ]) - )->toModel(); + $response = $this->aiHandler->generateTemplateContent($prompts); - return $this->extractTemplateContent($response->choices[0]->message->content); + return $this->extractTemplateContent($response); } private function extractTemplateContent(string $str): ?string diff --git a/src/AI/Generators/TemplatesStructureGenerator.php b/src/AI/Generators/TemplatesStructureGenerator.php new file mode 100644 index 00000000..cf9a3bb4 --- /dev/null +++ b/src/AI/Generators/TemplatesStructureGenerator.php @@ -0,0 +1,51 @@ + $e->getNamespaceName(), + iterator_to_array($rootEntityCollection) + ); + $namespacesList = array_unique($namespacesList); + + $content = $this->aiHandler->generateTemplateStructure($namespacesList, $additionalPrompt); + + $structure = json_decode($content); + $finalStructure = [ + "/readme.md.twig" => "About the project", + ]; + + foreach ($structure as $dir => $docName) { + $finalStructure["{$dir}/index.md.twig"] = $docName; + } + + $finalStructure["/tech/index.md.twig"] = "Description of the technical part of the project"; + return $finalStructure; + } +} diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php new file mode 100644 index 00000000..f5cf6a04 --- /dev/null +++ b/src/AI/ProviderFactory.php @@ -0,0 +1,39 @@ + [ + 'Authorization' => 'Bearer ' . $bearerToken + ] + ] + ); + $this->client = $client; + $this->endpoint = $apiEndpoint; + $this->maxNewTokens = getenv('HUGGINGFACE_MAX_NEW_TOKENS') ?: 1024; + $this->topP = getenv('HUGGINGFACE_TOP_P') ?: 0.5; + $this->temperature = getenv('HUGGINGFACE_TEMPERATURE') ?: 0.1; + } + + public function generateMissingPHPDocBlocs(string $requestData): string + { + $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); + $prompts = [$requestData]; + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateReadMeFileContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('templateGeneration'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string + { + $systemPrompt = $this->getSystemPrompt('structureGeneration'); + + $messages = []; + if ($additionalPrompt) { + $messages[] = "Additional Information: {$additionalPrompt}"; + } + + $messages[] = "The namespace list is:\n"; + $messages[] = implode("\n", $namespacesList); + $messages[] = "\nThe JSON object for the structure of the documentation should be:"; + $this->extractFirstJsonObject = true; + + return $this->sendPrompt($messages, $systemPrompt); + } + + public function getName(): string + { + return 'HuggingFace'; + } + + public function sendPrompt(array $prompts, string $system): string + { + $input = $system . "\n_____\n" . implode(' ', $prompts); + try { + $response = $this->client->request('POST', $this->endpoint, [ + 'json' => [ + // Todo: improve this setup + 'inputs' => $input, + 'parameters' => [ + 'max_new_tokens' => $this->maxNewTokens, + 'top_p' => $this->topP, + 'temperature' => $this->temperature + ] + ] + ]); + + $responseData = json_decode( + $response->getBody()->getContents(), + true, + 512, + JSON_THROW_ON_ERROR + ); + + if (isset($responseData[0]['generated_text'])) { + if ($this->extractFirstJsonObject) { + return $this->extractJsonObjectsFromText($responseData[0]['generated_text']); + } + return $responseData[0]['generated_text']; + } + + throw new RuntimeException('Generated text not found in response'); + } catch (GuzzleException $e) { + throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); + } catch (\JsonException $e) { + throw new RuntimeException( + '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() + ); + } + } + + private function extractJsonObjectsFromText($text) + { + $pattern = '/\{(?:[^{}]|(?R))*}/x'; + $result = preg_match_all($pattern, $text, $matches); + + if ($result === false || !isset($matches[0][0])) { + throw new RuntimeException('Failed to extract JSON object'); + } + + // Check if the matched string is valid JSON + $jsonObject = $matches[0][0]; + try { + json_decode($jsonObject, false, 512, JSON_THROW_ON_ERROR); + } catch (\JsonException $e) { + throw new RuntimeException('Failed to decode JSON object: ' . $e->getMessage()); + } + + return $jsonObject; + } + + private function getSystemPrompt(string $fileName): string + { + $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; + return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); + } +} diff --git a/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration b/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration new file mode 100644 index 00000000..2505e13e --- /dev/null +++ b/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration @@ -0,0 +1,4 @@ +You are a documentation generator. I will give you information about PHP class. +You must generate a description for each of the proposed methods. +The response format is the name of the method and its description in JSON format, for example {"method1":"Some description", "method2":"Method2 description" }. +The description should be short and descriptive. \ No newline at end of file diff --git a/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller b/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller new file mode 100644 index 00000000..cfd95d7a --- /dev/null +++ b/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller @@ -0,0 +1,6 @@ +You are a documentation generator. +You should analyze the code that I posted and describe what the library or project does, how to use it in md format. +I will send you composer.json file content, list of all available namespaces and main classes ( entry points ) signature. +Make a general description with examples of use but without a detailed description of the methods. +If you want to link to specific class documentation, use this format: ClassName . For example you can use this if you enumerate the list of available entry points +Be sure to place a link to the full technical description in the documentation. The link should be: Description of the technical part of the project \ No newline at end of file diff --git a/src/TemplateGenerator/ChatGpt/prompts/structureGeneration b/src/AI/Providers/OpenAI/Prompts/structureGeneration similarity index 93% rename from src/TemplateGenerator/ChatGpt/prompts/structureGeneration rename to src/AI/Providers/OpenAI/Prompts/structureGeneration index 45a809d2..0031dbc7 100644 --- a/src/TemplateGenerator/ChatGpt/prompts/structureGeneration +++ b/src/AI/Providers/OpenAI/Prompts/structureGeneration @@ -6,4 +6,4 @@ You should respond in JSON. An example response would be: {"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"} You must follow these rules very strictly, don't add anything extra. You keep the final structure concise and understandable. -You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. \ No newline at end of file +You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. diff --git a/src/AI/Providers/OpenAI/Prompts/templateGeneration b/src/AI/Providers/OpenAI/Prompts/templateGeneration new file mode 100644 index 00000000..9fd8e731 --- /dev/null +++ b/src/AI/Providers/OpenAI/Prompts/templateGeneration @@ -0,0 +1,7 @@ +You are a documentation generator that adds information to twig files you are provided. + +You will be given an existing template and should retain the existing information, supplementing it with additional information. + +You should not add information that is not 100% correct. + +Do not use any twig functions diff --git a/src/AI/Providers/OpenAI/Provider.php b/src/AI/Providers/OpenAI/Provider.php new file mode 100644 index 00000000..4c398005 --- /dev/null +++ b/src/AI/Providers/OpenAI/Provider.php @@ -0,0 +1,148 @@ + 'Bearer ' . $bearerToken + ]; + + $organisation = getenv('OPENAI_ORG') ?: null; + if ($organisation !== null) { + $headers['OpenAI-Organization'] = $organisation; + } + + $client = new Client( + [ + 'headers' => $headers + ] + ); + $this->client = $client; + $this->endpoint = getenv('OPENAI_ENDPOINT') ?: 'https://api.openai.com/v1/chat/completions'; + $this->temperature = getenv('OPENAI_TEMPERATURE') ?: 0.7; + $this->model = getenv('OPENAI_GPT_MODEL') ?: 'gpt-3.5-turbo'; + $this->frequencyPenalty = getenv('OPENAI_FREQUENCY_PENALTY') ?: 0; + $this->maxTokens = getenv('OPENAI_MAX_TOKENS') ?: null; + $this->topP = getenv('OPENAI_TOP_P') ?: 1; + } + + public function generateMissingPHPDocBlocs(string $requestData): string + { + $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); + $prompts = [$requestData]; + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateReadMeFileContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('templateGeneration'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string + { + $systemPrompt = $this->getSystemPrompt('structureGeneration'); + + $prompts = []; + if ($additionalPrompt) { + $prompts[] = "Additional Information: {$additionalPrompt}"; + } + + $prompts[] = implode("\n", $namespacesList); + + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function getName(): string + { + return 'OpenAI'; + } + + public function sendPrompt(array $prompts, string $system): string + { + $requestData = [ + 'messages' => $this->createMessages($prompts, $system), + 'model' => $this->model, + 'temperature' => $this->temperature, + 'frequency_penalty' => $this->frequencyPenalty, + 'top_p' => $this->topP, + ]; + + if ($this->maxTokens !== null) { + $requestData['max_tokens'] = $this->maxTokens; + } + + try { + $response = $this->client->request('POST', $this->endpoint, [ + 'json' => $requestData, + ]); + + $responseData = json_decode( + $response->getBody()->getContents(), + true, + 512, + JSON_THROW_ON_ERROR + ); + + if (isset($responseData['choices'][0]['message']['content'])) { + return $responseData['choices'][0]['message']['content']; + } + + throw new RuntimeException('Generated text not found in response'); + } catch (GuzzleException $e) { + throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); + } catch (\JsonException $e) { + throw new RuntimeException( + '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() + ); + } + } + + private function createMessage(string $role, string $content): \stdClass + { + $message = new \stdClass(); + $message->role = $role; + $message->content = $content; + return $message; + } + + private function createMessages(array $prompts, string $system): array + { + $messages = []; + $messages[] = $this->createMessage('system', $system); + foreach ($prompts as $prompt) { + $messages[] = $this->createMessage('user', $prompt); + } + return $messages; + } + + private function getSystemPrompt(string $fileName): string + { + $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; + return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); + } +} diff --git a/src/Console/Command/AddMissingDocBlocksCommand.php b/src/Console/Command/AddMissingDocBlocksCommand.php index cd3d964e..66bcd595 100644 --- a/src/Console/Command/AddMissingDocBlocksCommand.php +++ b/src/Console/Command/AddMissingDocBlocksCommand.php @@ -10,7 +10,6 @@ use DI\NotFoundException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Tectalic\OpenAi\ClientException; final class AddMissingDocBlocksCommand extends BaseCommand { @@ -31,7 +30,6 @@ protected function configure(): void /** * @throws DependencyException * @throws ReflectionException - * @throws ClientException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ diff --git a/src/Console/Command/FillInReadmeMdTemplateCommand.php b/src/Console/Command/FillInReadmeMdTemplateCommand.php index d0d001cc..ad83056d 100644 --- a/src/Console/Command/FillInReadmeMdTemplateCommand.php +++ b/src/Console/Command/FillInReadmeMdTemplateCommand.php @@ -10,7 +10,6 @@ use DI\NotFoundException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Tectalic\OpenAi\ClientException; final class FillInReadmeMdTemplateCommand extends BaseCommand { @@ -32,7 +31,6 @@ protected function configure(): void /** * @throws DependencyException * @throws ReflectionException - * @throws ClientException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ diff --git a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php b/src/Console/Command/GenerateProjectTemplatesStructureCommand.php index ac16dae4..e54a828f 100644 --- a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php +++ b/src/Console/Command/GenerateProjectTemplatesStructureCommand.php @@ -10,7 +10,6 @@ use DI\NotFoundException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -use Tectalic\OpenAi\ClientException; final class GenerateProjectTemplatesStructureCommand extends BaseCommand { @@ -32,7 +31,6 @@ protected function configure(): void /** * @throws DependencyException * @throws ReflectionException - * @throws ClientException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 4569402d..4c893462 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -4,6 +4,11 @@ namespace BumbleDocGen; +use BumbleDocGen\AI\Generators\MissingDocBlocksGenerator; +use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; +use BumbleDocGen\AI\Generators\TemplateGenerator; +use BumbleDocGen\AI\Generators\TemplatesStructureGenerator; +use BumbleDocGen\AI\ProviderFactory; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup; @@ -14,10 +19,6 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; -use BumbleDocGen\TemplateGenerator\ChatGpt\MissingDocBlocksGenerator; -use BumbleDocGen\TemplateGenerator\ChatGpt\ReadmeTemplateFiller; -use BumbleDocGen\TemplateGenerator\ChatGpt\TemplateGenerator; -use BumbleDocGen\TemplateGenerator\ChatGpt\TemplatesStructureGenerator; use DI\DependencyException; use DI\NotFoundException; use Monolog\Logger; @@ -26,7 +27,6 @@ use Symfony\Component\Console\Style\OutputStyle; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; -use Tectalic\OpenAi\ClientException; /** * Class for generating documentation. @@ -65,7 +65,6 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr /** * Generate documentation structure with blank templates using AI tools * - * @throws ClientException * @throws NotFoundException * @throws ReflectionException * @throws DependencyException @@ -76,30 +75,14 @@ public function generateProjectTemplatesStructure(): void $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt'); - $openaiClient = \Tectalic\OpenAi\Manager::build( - new \GuzzleHttp\Client(), - new \Tectalic\OpenAi\Authentication($openaiKey) - ); - - $availableModels = array_values( - array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - ) - ); - - $model = $this->io->choice("Choose GPT model from available", $availableModels); - $templatesStructureGenerator = new TemplatesStructureGenerator($openaiClient, $model); + $aiHandler = ProviderFactory::create(); + $templatesStructureGenerator = new TemplatesStructureGenerator($aiHandler); do { $additionalPrompt = $this->io->ask( - 'Write instructions for more accurate documentation generation ( or just skip this step )' + 'Write instructions for more accurate template structure generation ( or just skip this step )' ) ?: null; - $this->logger->notice("Sending ChatGPT request"); + $this->io->note("Sending " . $aiHandler->getName() . " request"); $structure = $templatesStructureGenerator->generateStructureByEntityCollection( $entitiesCollection, $additionalPrompt @@ -112,7 +95,7 @@ public function generateProjectTemplatesStructure(): void "The proposed documentation structure is as follows:\n\n{$structureAsString}", ['Save', 'Regenerate', 'Cancel'] ); - } while ($action == 'Regenerate'); + } while ($action === 'Regenerate'); if ($action === 'Save') { $templatesDir = $this->configuration->getTemplatesDir(); @@ -143,7 +126,6 @@ public function generateProjectTemplatesStructure(): void * @throws DependencyException * @throws ReflectionException * @throws InvalidConfigurationParameterException - * @throws ClientException */ public function addMissingDocBlocks(): void { @@ -154,24 +136,9 @@ public function addMissingDocBlocks(): void $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt'); - $openaiClient = \Tectalic\OpenAi\Manager::build( - new \GuzzleHttp\Client(), - new \Tectalic\OpenAi\Authentication($openaiKey) - ); + $aiHandler = ProviderFactory::create(); - $availableModels = array_values( - array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - ) - ); - - $model = $this->io->choice("Choose GPT model from available", $availableModels); - $missingDocBlocksGenerator = new MissingDocBlocksGenerator($openaiClient, $this->parserHelper, $model); + $missingDocBlocksGenerator = new MissingDocBlocksGenerator($aiHandler, $this->parserHelper); $alreadyProcessedEntities = []; $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( @@ -243,7 +210,6 @@ public function addMissingDocBlocks(): void /** * @throws ReflectionException * @throws DependencyException - * @throws ClientException * @throws NotFoundException * @throws InvalidConfigurationParameterException */ @@ -253,12 +219,6 @@ public function fillInReadmeMdTemplate(): void $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt'); - $openaiClient = \Tectalic\OpenAi\Manager::build( - new \GuzzleHttp\Client(), - new \Tectalic\OpenAi\Authentication($openaiKey) - ); - $finder = new Finder(); $finder ->files() @@ -296,7 +256,7 @@ public function fillInReadmeMdTemplate(): void ++$n; return "{$n}) {$v}"; }, - array_keys($entryPoints)) + array_keys($entryPoints)) ) ); @@ -312,18 +272,9 @@ public function fillInReadmeMdTemplate(): void 'Write instructions for more accurate documentation generation ( or just skip this step )' ); - $availableModels = array_values( - array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - ) - ); - - $model = $this->io->choice("Choose GPT model from available", $availableModels, 'gpt-4'); - $readmeTemplateFiller = new ReadmeTemplateFiller($openaiClient, $model); + $aiHandler = ProviderFactory::create(); + $readmeTemplateFiller = new ReadmeTemplateGenerator($aiHandler); + $this->io->note("Sending " . $aiHandler->getName() . " request"); $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent( $entitiesCollection, $entryPoints, @@ -344,27 +295,10 @@ public function fillInReadmeMdTemplate(): void public function generateProjectTemplates(): void { $this->parser->parse(); - $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::getEntityCollectionName()); - - $openaiKey = getenv('OPENAI_API_KEY') ?: $this->io->askHidden('Enter the key to work with ChatGpt'); - $openaiClient = \Tectalic\OpenAi\Manager::build( - new \GuzzleHttp\Client(), - new \Tectalic\OpenAi\Authentication($openaiKey) - ); - - $availableModels = array_values( - array_filter( - array_map( - fn(array $v) => $v['id'], - $openaiClient->models()->list()->toArray()['data'] ?? [] - ), - fn(string $v) => str_starts_with($v, "gpt-") - ) - ); - - $model = $this->io->choice("Choose GPT model from available", $availableModels); + $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $templateGenerator = new TemplateGenerator($openaiClient, $model); + $aiHandler = ProviderFactory::create(); + $templateGenerator = new TemplateGenerator($aiHandler); $finder = new Finder(); @@ -375,13 +309,13 @@ public function generateProjectTemplates(): void } do { - $this->logger->notice( + $this->io->note( 'Creating template for ' . $templateGenerator->getFileSubPathFromPath($file->getRealPath()) ); $additionalPrompt = $this->io->ask( 'Add additional information about this ( or just skip this step )' ) ?: null; - $this->logger->notice('Sending ChatGPT request'); + $this->io->note("Sending " . $aiHandler->getName() . " request"); $content = $templateGenerator->generate( $file->getRealPath(), $file->getContents(), diff --git a/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php b/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php deleted file mode 100644 index 7f7c7a8f..00000000 --- a/src/TemplateGenerator/ChatGpt/TemplatesStructureGenerator.php +++ /dev/null @@ -1,77 +0,0 @@ - 'system', - 'content' => file_get_contents(__DIR__ . '/prompts/structureGeneration') - ], - ]; - - if ($additionalPrompt) { - $messages[] = [ - 'role' => 'user', - 'content' => "Additional Information: {$additionalPrompt}" - ]; - } - - $namespacesList = array_map(fn(ClassEntity $e) => $e->getNamespaceName(), iterator_to_array($rootEntityCollection)); - $namespacesList = array_unique($namespacesList); - $messages[] = [ - 'role' => 'user', - 'content' => implode("\n", $namespacesList), - ]; - - $response = $this->openaiClient->chatCompletions()->create( - new \Tectalic\OpenAi\Models\ChatCompletions\CreateRequest([ - 'model' => $this->model, - 'messages' => $messages, - ]) - )->toModel(); - - $finalStructure = [ - "/readme.md.twig" => "About the project", - ]; - - if ($content = $response->choices[0]->message->content ?? null) { - $structure = json_decode($content); - foreach ($structure as $dir => $docName) { - $finalStructure["{$dir}/index.md.twig"] = $docName; - } - } - $finalStructure["/tech/index.md.twig"] = "Description of the technical part of the project"; - return $finalStructure; - } -} From facda2bbe0e4737191fef838f9d951876e56611d Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 17:58:42 +0100 Subject: [PATCH 06/33] Doc updates --- docs/tech/classes/MissingDocBlocksGenerator.md | 6 +++--- docs/tech/classes/ReadmeTemplateFiller.md | 4 ++-- docs/tech/classes/TemplatesStructureGenerator.md | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/tech/classes/MissingDocBlocksGenerator.md b/docs/tech/classes/MissingDocBlocksGenerator.md index a18931ff..396b7f12 100644 --- a/docs/tech/classes/MissingDocBlocksGenerator.md +++ b/docs/tech/classes/MissingDocBlocksGenerator.md @@ -73,7 +73,7 @@ final class MissingDocBlocksGenerator ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, string $model = \BumbleDocGen\TemplateGenerator\ChatGpt\MissingDocBlocksGenerator::MODEL_GPT_4); +public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper, string $model = \BumbleDocGen\AI\Generators\MissingDocBlocksGenerator::MODEL_GPT_4); ``` @@ -120,7 +120,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, \BumbleDocGen ```php -public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity, int $mode = \BumbleDocGen\TemplateGenerator\ChatGpt\MissingDocBlocksGenerator::MODE_READ_ONLY_SIGNATURES): array; +public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity, int $mode = \BumbleDocGen\AI\Generators\MissingDocBlocksGenerator::MODE_READ_ONLY_SIGNATURES): array; ``` @@ -228,4 +228,4 @@ public function hasMethodsWithoutDocBlocks(\BumbleDocGen\Core\Parser\Entity\Root
- \ No newline at end of file + diff --git a/docs/tech/classes/ReadmeTemplateFiller.md b/docs/tech/classes/ReadmeTemplateFiller.md index 6ec06514..7a55f1c3 100644 --- a/docs/tech/classes/ReadmeTemplateFiller.md +++ b/docs/tech/classes/ReadmeTemplateFiller.md @@ -62,7 +62,7 @@ final class ReadmeTemplateFiller ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = \BumbleDocGen\TemplateGenerator\ChatGpt\ReadmeTemplateFiller::MODEL_GPT_4); +public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = \BumbleDocGen\AI\Generators\ReadmeTemplateGenerator::MODEL_GPT_4); ``` @@ -168,4 +168,4 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE
- \ No newline at end of file + diff --git a/docs/tech/classes/TemplatesStructureGenerator.md b/docs/tech/classes/TemplatesStructureGenerator.md index 24d4d697..b702dc0e 100644 --- a/docs/tech/classes/TemplatesStructureGenerator.md +++ b/docs/tech/classes/TemplatesStructureGenerator.md @@ -62,7 +62,7 @@ final class TemplatesStructureGenerator ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = \BumbleDocGen\TemplateGenerator\ChatGpt\TemplatesStructureGenerator::MODEL_GPT_4); +public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = \BumbleDocGen\AI\Generators\TemplatesStructureGenerator::MODEL_GPT_4); ``` @@ -152,4 +152,4 @@ public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\En
- \ No newline at end of file + From 79d845c5f9d8609c0c39d314af2896d790661939 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 18:00:23 +0100 Subject: [PATCH 07/33] Composer update --- composer.lock | 208 +------------------------------------------------- 1 file changed, 1 insertion(+), 207 deletions(-) diff --git a/composer.lock b/composer.lock index 2fa38cdf..3bac40c4 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "635541b0f20b20823aadf06b31418cec", + "content-hash": "86a6a7f6923c44c4dc1e5190ec5a3510", "packages": [ { "name": "bramus/ansi-php", @@ -732,72 +732,6 @@ }, "time": "2022-07-25T13:18:36+00:00" }, - { - "name": "laminas/laminas-code", - "version": "4.7.1", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-code.git", - "reference": "91aabc066d5620428120800c0eafc0411e441a62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-code/zipball/91aabc066d5620428120800c0eafc0411e441a62", - "reference": "91aabc066d5620428120800c0eafc0411e441a62", - "shasum": "" - }, - "require": { - "php": ">=7.4, <8.2" - }, - "require-dev": { - "doctrine/annotations": "^1.13.2", - "ext-phar": "*", - "laminas/laminas-coding-standard": "^2.3.0", - "laminas/laminas-stdlib": "^3.6.1", - "phpunit/phpunit": "^9.5.10", - "psalm/plugin-phpunit": "^0.17.0", - "vimeo/psalm": "^4.13.1" - }, - "suggest": { - "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", - "laminas/laminas-stdlib": "Laminas\\Stdlib component" - }, - "type": "library", - "autoload": { - "files": [ - "polyfill/ReflectionEnumPolyfill.php" - ], - "psr-4": { - "Laminas\\Code\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", - "homepage": "https://laminas.dev", - "keywords": [ - "code", - "laminas", - "laminasframework" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-code/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-code/issues", - "rss": "https://github.com/laminas/laminas-code/releases.atom", - "source": "https://github.com/laminas/laminas-code" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2022-11-21T01:32:31+00:00" - }, { "name": "laravel/serializable-closure", "version": "v1.3.1", @@ -1171,87 +1105,6 @@ }, "time": "2023-08-13T19:53:39+00:00" }, - { - "name": "ocramius/proxy-manager", - "version": "2.14.1", - "source": { - "type": "git", - "url": "https://github.com/Ocramius/ProxyManager.git", - "reference": "3990d60ef79001badbab4927a6a811682274a0d1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/3990d60ef79001badbab4927a6a811682274a0d1", - "reference": "3990d60ef79001badbab4927a6a811682274a0d1", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.1.0", - "laminas/laminas-code": "^4.4.2", - "php": "~8.0.0", - "webimpress/safe-writer": "^2.2.0" - }, - "conflict": { - "thecodingmachine/safe": "<1.3.3" - }, - "require-dev": { - "codelicia/xulieta": "^0.1.6", - "doctrine/coding-standard": "^9.0.0", - "ext-phar": "*", - "phpbench/phpbench": "^1.0.3", - "phpunit/phpunit": "^9.5.6", - "roave/infection-static-analysis-plugin": "^1.8", - "squizlabs/php_codesniffer": "^3.6.0", - "vimeo/psalm": "^4.8.1" - }, - "suggest": { - "laminas/laminas-json": "To have the JsonRpc adapter (Remote Object feature)", - "laminas/laminas-soap": "To have the Soap adapter (Remote Object feature)", - "laminas/laminas-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)", - "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects" - }, - "type": "library", - "autoload": { - "psr-4": { - "ProxyManager\\": "src/ProxyManager" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies", - "homepage": "https://github.com/Ocramius/ProxyManager", - "keywords": [ - "aop", - "lazy loading", - "proxy", - "proxy pattern", - "service proxies" - ], - "support": { - "issues": "https://github.com/Ocramius/ProxyManager/issues", - "source": "https://github.com/Ocramius/ProxyManager/tree/2.14.1" - }, - "funding": [ - { - "url": "https://github.com/Ocramius", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager", - "type": "tidelift" - } - ], - "time": "2022-03-05T18:43:14+00:00" - }, { "name": "php-di/invoker", "version": "2.3.4", @@ -3449,65 +3302,6 @@ ], "time": "2023-08-28T11:09:02+00:00" }, - { - "name": "webimpress/safe-writer", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/webimpress/safe-writer.git", - "reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/9d37cc8bee20f7cb2f58f6e23e05097eab5072e6", - "reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6", - "shasum": "" - }, - "require": { - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.5.4", - "vimeo/psalm": "^4.7", - "webimpress/coding-standard": "^1.2.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev", - "dev-develop": "2.3.x-dev", - "dev-release-1.0": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Webimpress\\SafeWriter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-2-Clause" - ], - "description": "Tool to write files safely, to avoid race conditions", - "keywords": [ - "concurrent write", - "file writer", - "race condition", - "safe writer", - "webimpress" - ], - "support": { - "issues": "https://github.com/webimpress/safe-writer/issues", - "source": "https://github.com/webimpress/safe-writer/tree/2.2.0" - }, - "funding": [ - { - "url": "https://github.com/michalbundyra", - "type": "github" - } - ], - "time": "2021-04-19T16:34:45+00:00" - }, { "name": "webmozart/assert", "version": "1.11.0", From 36a3b306ca0910f83c879b2a960a316cb52ace93 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 22:57:14 +0100 Subject: [PATCH 08/33] Moves json extractor to trait --- src/AI/Providers/HuggingFace/Provider.php | 25 ++++---------------- src/AI/Traits/JsonExtractorTrait.php | 28 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 src/AI/Traits/JsonExtractorTrait.php diff --git a/src/AI/Providers/HuggingFace/Provider.php b/src/AI/Providers/HuggingFace/Provider.php index 65d952e5..bf94a19c 100644 --- a/src/AI/Providers/HuggingFace/Provider.php +++ b/src/AI/Providers/HuggingFace/Provider.php @@ -5,12 +5,15 @@ namespace BumbleDocGen\AI\Providers\HuggingFace; use BumbleDocGen\AI\ProviderInterface; +use BumbleDocGen\AI\Traits\JsonExtractorTrait; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; use RuntimeException; final class Provider implements ProviderInterface { + use JsonExtractorTrait; + public bool $extractFirstJsonObject = false; private Client $client; private string $endpoint; @@ -100,7 +103,7 @@ public function sendPrompt(array $prompts, string $system): string if (isset($responseData[0]['generated_text'])) { if ($this->extractFirstJsonObject) { - return $this->extractJsonObjectsFromText($responseData[0]['generated_text']); + return $this->extractFirstJsonObjectFromText($responseData[0]['generated_text']); } return $responseData[0]['generated_text']; } @@ -115,26 +118,6 @@ public function sendPrompt(array $prompts, string $system): string } } - private function extractJsonObjectsFromText($text) - { - $pattern = '/\{(?:[^{}]|(?R))*}/x'; - $result = preg_match_all($pattern, $text, $matches); - - if ($result === false || !isset($matches[0][0])) { - throw new RuntimeException('Failed to extract JSON object'); - } - - // Check if the matched string is valid JSON - $jsonObject = $matches[0][0]; - try { - json_decode($jsonObject, false, 512, JSON_THROW_ON_ERROR); - } catch (\JsonException $e) { - throw new RuntimeException('Failed to decode JSON object: ' . $e->getMessage()); - } - - return $jsonObject; - } - private function getSystemPrompt(string $fileName): string { $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; diff --git a/src/AI/Traits/JsonExtractorTrait.php b/src/AI/Traits/JsonExtractorTrait.php new file mode 100644 index 00000000..4121de30 --- /dev/null +++ b/src/AI/Traits/JsonExtractorTrait.php @@ -0,0 +1,28 @@ +getMessage()); + } + + return $jsonObject; + } +} From d15c23a5fd88ac7af7e62500ea2c1173b764214b Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 22:57:57 +0100 Subject: [PATCH 09/33] Switch return type of create --- src/AI/ProviderFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index f5cf6a04..71bf2fe3 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -10,7 +10,7 @@ final class ProviderFactory { - public static function create(): OpenAIProvider|HuggingFaceProvider + public static function create(): ProviderInterface { $apiType = getenv('API_TYPE'); switch ($apiType) { From b8d9eeeb6d0da250711431a3104f29373a83c2fc Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 22:58:53 +0100 Subject: [PATCH 10/33] Update method signature --- src/AI/ProviderInterface.php | 2 +- src/AI/Providers/HuggingFace/Provider.php | 5 ++--- src/AI/Providers/OpenAI/Provider.php | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/AI/ProviderInterface.php b/src/AI/ProviderInterface.php index 84e93663..2e85e4a4 100644 --- a/src/AI/ProviderInterface.php +++ b/src/AI/ProviderInterface.php @@ -8,7 +8,7 @@ interface ProviderInterface { public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string; - public function generateMissingPHPDocBlocs(string $requestData): string; + public function generateMissingPHPDocBlocs(string $prompt): string; public function generateTemplateContent(array $prompts): string; diff --git a/src/AI/Providers/HuggingFace/Provider.php b/src/AI/Providers/HuggingFace/Provider.php index bf94a19c..0b696c3f 100644 --- a/src/AI/Providers/HuggingFace/Provider.php +++ b/src/AI/Providers/HuggingFace/Provider.php @@ -37,11 +37,10 @@ public function __construct($bearerToken, $apiEndpoint) $this->temperature = getenv('HUGGINGFACE_TEMPERATURE') ?: 0.1; } - public function generateMissingPHPDocBlocs(string $requestData): string + public function generateMissingPHPDocBlocs(string $prompt): string { $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); - $prompts = [$requestData]; - return $this->sendPrompt($prompts, $systemPrompt); + return $this->sendPrompt([$prompt], $systemPrompt); } public function generateReadMeFileContent(array $prompts): string diff --git a/src/AI/Providers/OpenAI/Provider.php b/src/AI/Providers/OpenAI/Provider.php index 4c398005..fdc0e441 100644 --- a/src/AI/Providers/OpenAI/Provider.php +++ b/src/AI/Providers/OpenAI/Provider.php @@ -44,10 +44,10 @@ public function __construct($bearerToken) $this->topP = getenv('OPENAI_TOP_P') ?: 1; } - public function generateMissingPHPDocBlocs(string $requestData): string + public function generateMissingPHPDocBlocs(string $prompt): string { $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); - $prompts = [$requestData]; + $prompts = [$prompt]; return $this->sendPrompt($prompts, $systemPrompt); } From 29ee9e4c65e4b5fbe8626a379cabf0f689e71418 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 10 Oct 2023 22:59:40 +0100 Subject: [PATCH 11/33] Adds Ollama provider --- src/AI/ProviderFactory.php | 3 + .../Ollama/Prompts/missingDocBlockGeneration | 4 + .../Ollama/Prompts/readmeTemplateFiller | 6 + .../Ollama/Prompts/structureGeneration | 9 + .../Ollama/Prompts/templateGeneration | 7 + src/AI/Providers/Ollama/Provider.php | 162 ++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration create mode 100644 src/AI/Providers/Ollama/Prompts/readmeTemplateFiller create mode 100644 src/AI/Providers/Ollama/Prompts/structureGeneration create mode 100644 src/AI/Providers/Ollama/Prompts/templateGeneration create mode 100644 src/AI/Providers/Ollama/Provider.php diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index 71bf2fe3..200a06a1 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -6,6 +6,7 @@ use BumbleDocGen\AI\Providers\HuggingFace\Provider as HuggingFaceProvider; use BumbleDocGen\AI\Providers\OpenAI\Provider as OpenAIProvider; +use BumbleDocGen\AI\Providers\Ollama\Provider as OllamaProvider; use RuntimeException; final class ProviderFactory @@ -24,6 +25,8 @@ public static function create(): ProviderInterface throw new RuntimeException("Environment variable HUGGINGFACE_TOKEN not set!"); } return new HuggingFaceProvider($apiKey, $endpoint); + case 'ollama': + return new OllamaProvider(); case 'openai': $apiKey = getenv('OPENAI_API_KEY'); if (empty($apiKey)) { diff --git a/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration b/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration new file mode 100644 index 00000000..2505e13e --- /dev/null +++ b/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration @@ -0,0 +1,4 @@ +You are a documentation generator. I will give you information about PHP class. +You must generate a description for each of the proposed methods. +The response format is the name of the method and its description in JSON format, for example {"method1":"Some description", "method2":"Method2 description" }. +The description should be short and descriptive. \ No newline at end of file diff --git a/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller b/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller new file mode 100644 index 00000000..cfd95d7a --- /dev/null +++ b/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller @@ -0,0 +1,6 @@ +You are a documentation generator. +You should analyze the code that I posted and describe what the library or project does, how to use it in md format. +I will send you composer.json file content, list of all available namespaces and main classes ( entry points ) signature. +Make a general description with examples of use but without a detailed description of the methods. +If you want to link to specific class documentation, use this format: ClassName . For example you can use this if you enumerate the list of available entry points +Be sure to place a link to the full technical description in the documentation. The link should be: Description of the technical part of the project \ No newline at end of file diff --git a/src/AI/Providers/Ollama/Prompts/structureGeneration b/src/AI/Providers/Ollama/Prompts/structureGeneration new file mode 100644 index 00000000..0031dbc7 --- /dev/null +++ b/src/AI/Providers/Ollama/Prompts/structureGeneration @@ -0,0 +1,9 @@ +You are a documentation generator. +You will be given a list of PHP namespaces. You need to return the file structure for documentation using these namespaces. +You should logically group the documentation files by namespaces. +Each directory must start with /tech, for example: /tech/scripts or /tech/db/entities. +You should respond in JSON. An example response would be: +{"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"} +You must follow these rules very strictly, don't add anything extra. +You keep the final structure concise and understandable. +You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. diff --git a/src/AI/Providers/Ollama/Prompts/templateGeneration b/src/AI/Providers/Ollama/Prompts/templateGeneration new file mode 100644 index 00000000..9fd8e731 --- /dev/null +++ b/src/AI/Providers/Ollama/Prompts/templateGeneration @@ -0,0 +1,7 @@ +You are a documentation generator that adds information to twig files you are provided. + +You will be given an existing template and should retain the existing information, supplementing it with additional information. + +You should not add information that is not 100% correct. + +Do not use any twig functions diff --git a/src/AI/Providers/Ollama/Provider.php b/src/AI/Providers/Ollama/Provider.php new file mode 100644 index 00000000..1f9d0fbf --- /dev/null +++ b/src/AI/Providers/Ollama/Provider.php @@ -0,0 +1,162 @@ +client = $client; + $this->endpoint = getenv('OLLAMA_ENDPOINT') ?: 'http://localhost:11434/api/generate'; + $this->temperature = getenv('OLLAMA_TEMPERATURE') ?: 0.8; + $this->model = getenv('OLLAMA_MODEL') ?: 'llama2'; + $this->topP = getenv('OLLAMA_TOP_P') ?: 10; + $this->topK = getenv('OLLAMA_TOP_K') ?: 0.9; + $this->repeatPenalty = getenv('OPENAI_REPEAT_PENALTY') ?: 1.1; + } + + public function generateMissingPHPDocBlocs(string $prompt): string + { + $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); + return $this->sendPrompt([$prompt], $systemPrompt); + } + + public function generateReadMeFileContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateContent(array $prompts): string + { + $systemPrompt = $this->getSystemPrompt('templateGeneration'); + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string + { + $systemPrompt = $this->getSystemPrompt('structureGeneration'); + + $prompts = []; + if ($additionalPrompt) { + $prompts[] = "Additional Information: {$additionalPrompt}"; + } + + $prompts[] = implode("\n", $namespacesList); + + $this->extractFirstJsonObject = true; + return $this->sendPrompt($prompts, $systemPrompt); + } + + public function getName(): string + { + return 'Ollama'; + } + + /** + * @see https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion + * @see https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values + */ + public function sendPrompt(array $prompts, string $system): string + { + $requestData = [ + 'prompt' => implode("\n\n", $prompts), + 'system' => $system, + 'model' => $this->model, + 'options' => [ + 'temperature' => $this->temperature, + 'top_p' => $this->topP, + 'top_k' => $this->topK, + 'repeat_penalty' => $this->repeatPenalty, + ], + ]; + + try { + $response = $this->client->request('POST', $this->endpoint, [ + 'json' => $requestData, + ]); + + $responseParsed = $this->processResponse($response); + + if ($this->extractFirstJsonObject) { + return $this->extractFirstJsonObjectFromText($responseParsed); + } + return $responseParsed; + } catch (GuzzleException $e) { + throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); + } + } + + private function processResponse($guzzleResponse): string + { + $content = (string)$guzzleResponse->getBody(); + + // Split the content by lines, as each line represents a JSON object + $lines = explode("\n", $content); + + $fullResponse = ""; + + foreach ($lines as $line) { + try { + $jsonObject = json_decode($line, true, 512, JSON_THROW_ON_ERROR); + if ($jsonObject['done']) { + // todo: $jsonObject has key 'context' which is an encoding of the conversation and can be sent + // in the next request to keep conversational memory. + break; + } + $fullResponse .= $jsonObject['response']; + } catch (\JsonException $e) { + throw new RuntimeException( + '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() + ); + } + } + + return $fullResponse; + } + + private function getSystemPrompt(string $fileName): string + { + $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; + return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); + } +} From 81a09bc91ac8af6f987a376818111c85c4450418 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Fri, 13 Oct 2023 11:58:03 +0100 Subject: [PATCH 12/33] Comment update --- src/AI/Providers/HuggingFace/Provider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AI/Providers/HuggingFace/Provider.php b/src/AI/Providers/HuggingFace/Provider.php index 0b696c3f..ed2b1c8e 100644 --- a/src/AI/Providers/HuggingFace/Provider.php +++ b/src/AI/Providers/HuggingFace/Provider.php @@ -83,7 +83,7 @@ public function sendPrompt(array $prompts, string $system): string try { $response = $this->client->request('POST', $this->endpoint, [ 'json' => [ - // Todo: improve this setup + // Todo: add more parameters 'inputs' => $input, 'parameters' => [ 'max_new_tokens' => $this->maxNewTokens, From 7a0a0b7468ffc735eb166143eedb3560358f933b Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Thu, 19 Oct 2023 20:54:25 +0100 Subject: [PATCH 13/33] Documentation update --- docs/classes/DocGenerator.md | 49 ++- docs/shared_c.cache | 2 +- docs/tech/classes/DocGenerator.md | 49 ++- docs/tech/classes/JsonExtractorTrait.md | 34 ++ .../tech/classes/MissingDocBlocksGenerator.md | 32 +- docs/tech/classes/Provider.md | 352 ++++++++++++++++++ docs/tech/classes/ProviderFactory.md | 64 ++++ docs/tech/classes/ProviderInterface.md | 279 ++++++++++++++ docs/tech/classes/Provider_2.md | 338 +++++++++++++++++ docs/tech/classes/Provider_3.md | 323 ++++++++++++++++ ...teFiller.md => ReadmeTemplateGenerator.md} | 33 +- docs/tech/classes/TemplateGenerator.md | 197 ++++++++++ .../classes/TemplatesStructureGenerator.md | 29 +- docs/tech/map.md | 22 +- 14 files changed, 1695 insertions(+), 108 deletions(-) create mode 100644 docs/tech/classes/JsonExtractorTrait.md create mode 100644 docs/tech/classes/Provider.md create mode 100644 docs/tech/classes/ProviderFactory.md create mode 100644 docs/tech/classes/ProviderInterface.md create mode 100644 docs/tech/classes/Provider_2.md create mode 100644 docs/tech/classes/Provider_3.md rename docs/tech/classes/{ReadmeTemplateFiller.md => ReadmeTemplateGenerator.md} (74%) create mode 100644 docs/tech/classes/TemplateGenerator.md diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index 5e45691f..772bfac5 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

- DocGenerator class: + DocGenerator class:

@@ -42,6 +42,9 @@ final class DocGenerator
  • generate - Generates documentation using configuration
  • +
  • + generateProjectTemplates +
  • generateProjectTemplatesStructure - Generate documentation structure with blank templates using AI tools
  • @@ -55,11 +58,11 @@ final class DocGenerator @@ -74,7 +77,7 @@ final class DocGenerator ```php @@ -151,7 +154,7 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo ```php @@ -179,9 +182,6 @@ public function addMissingDocBlocks(): void;
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • -
  • - \Tectalic\OpenAi\ClientException
  • - @@ -191,7 +191,7 @@ public function addMissingDocBlocks(): void; ```php @@ -213,9 +213,6 @@ public function fillInReadmeMdTemplate(): void;
  • \DI\DependencyException
  • -
  • - \Tectalic\OpenAi\ClientException
  • -
  • \DI\NotFoundException
  • @@ -231,7 +228,7 @@ public function fillInReadmeMdTemplate(): void; ```php @@ -255,6 +252,27 @@ public function generate(): void; + +
    +
    + + + +```php +public function generateProjectTemplates(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    @@ -278,9 +296,6 @@ public function generateProjectTemplatesStructure(): void; Throws:
      -
    • - \Tectalic\OpenAi\ClientException
    • -
    • \DI\NotFoundException
    • @@ -302,7 +317,7 @@ public function generateProjectTemplatesStructure(): void; ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 7f9cb911..56f12a0d 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index 39cbeccf..5e76f74d 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

      - DocGenerator class: + DocGenerator class:

      @@ -42,6 +42,9 @@ final class DocGenerator
    • generate - Generates documentation using configuration
    • +
    • + generateProjectTemplates +
    • generateProjectTemplatesStructure - Generate documentation structure with blank templates using AI tools
    • @@ -55,11 +58,11 @@ final class DocGenerator @@ -74,7 +77,7 @@ final class DocGenerator ```php @@ -151,7 +154,7 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo ```php @@ -179,9 +182,6 @@ public function addMissingDocBlocks(): void;
    • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • -
    • - \Tectalic\OpenAi\ClientException
    • -
    @@ -191,7 +191,7 @@ public function addMissingDocBlocks(): void; ```php @@ -213,9 +213,6 @@ public function fillInReadmeMdTemplate(): void;
  • \DI\DependencyException
  • -
  • - \Tectalic\OpenAi\ClientException
  • -
  • \DI\NotFoundException
  • @@ -231,7 +228,7 @@ public function fillInReadmeMdTemplate(): void; ```php @@ -255,6 +252,27 @@ public function generate(): void; + +
    +
    + + + +```php +public function generateProjectTemplates(): void; +``` + + + +Parameters: not specified + +Return value: void + +

    @@ -278,9 +296,6 @@ public function generateProjectTemplatesStructure(): void; Throws:
    @@ -178,7 +166,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E ```php diff --git a/docs/tech/classes/Provider.md b/docs/tech/classes/Provider.md new file mode 100644 index 00000000..9fb7aae6 --- /dev/null +++ b/docs/tech/classes/Provider.md @@ -0,0 +1,352 @@ + + BumbleDocGen / Technical description of the project / Class map / Provider
    + +

    + Provider class: +

    + + + + + +```php +namespace BumbleDocGen\AI\Providers\HuggingFace; + +final class Provider implements \BumbleDocGen\AI\ProviderInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + generateMissingPHPDocBlocs +
    2. +
    3. + generateReadMeFileContent +
    4. +
    5. + generateTemplateContent +
    6. +
    7. + generateTemplateStructure +
    8. +
    9. + getName +
    10. +
    11. + sendPrompt +
    12. +
    + +

    Traits:

    + + + + +

    Properties:

    + +
      +
    1. + extractFirstJsonObject
    2. +
    + + + +

    Property details:

    + + +* # + $extractFirstJsonObject + **|** source code +```php +public bool $extractFirstJsonObject; + +``` + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(mixed $bearerToken, mixed $apiEndpoint); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $bearerTokenmixed-
    $apiEndpointmixed-
    + + + +
    +
    +
    + + + +```php +public function generateMissingPHPDocBlocs(string $prompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptstring-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateReadMeFileContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namespacesListarray-
    $additionalPromptstring | null-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function sendPrompt(array $prompts, string $system): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    $systemstring-
    + +Return value: string + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/ProviderFactory.md b/docs/tech/classes/ProviderFactory.md new file mode 100644 index 00000000..e1a9f224 --- /dev/null +++ b/docs/tech/classes/ProviderFactory.md @@ -0,0 +1,64 @@ + + BumbleDocGen / Technical description of the project / Class map / ProviderFactory
    + +

    + ProviderFactory class: +

    + + + + + +```php +namespace BumbleDocGen\AI; + +final class ProviderFactory +``` + + + + + + + + + +

    Methods:

    + +
      +
    1. + create +
    2. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public static function create(): \BumbleDocGen\AI\ProviderInterface; +``` + + + +Parameters: not specified + +Return value: \BumbleDocGen\AI\ProviderInterface + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/ProviderInterface.md b/docs/tech/classes/ProviderInterface.md new file mode 100644 index 00000000..c9b779dc --- /dev/null +++ b/docs/tech/classes/ProviderInterface.md @@ -0,0 +1,279 @@ + + BumbleDocGen / Technical description of the project / Class map / ProviderInterface
    + +

    + ProviderInterface class: +

    + + + + + +```php +namespace BumbleDocGen\AI; + +interface ProviderInterface +``` + + + + + + + + + +

    Methods:

    + +
      +
    1. + generateMissingPHPDocBlocs +
    2. +
    3. + generateReadMeFileContent +
    4. +
    5. + generateTemplateContent +
    6. +
    7. + generateTemplateStructure +
    8. +
    9. + getName +
    10. +
    11. + sendPrompt +
    12. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function generateMissingPHPDocBlocs(string $prompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptstring-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateReadMeFileContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namespacesListarray-
    $additionalPromptstring | null-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function sendPrompt(array $prompts, string $system): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    $systemstring-
    + +Return value: string + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/Provider_2.md b/docs/tech/classes/Provider_2.md new file mode 100644 index 00000000..e803828f --- /dev/null +++ b/docs/tech/classes/Provider_2.md @@ -0,0 +1,338 @@ + + BumbleDocGen / Technical description of the project / Class map / Provider
    + +

    + Provider class: +

    + + + + + +```php +namespace BumbleDocGen\AI\Providers\Ollama; + +final class Provider implements \BumbleDocGen\AI\ProviderInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + generateMissingPHPDocBlocs +
    2. +
    3. + generateReadMeFileContent +
    4. +
    5. + generateTemplateContent +
    6. +
    7. + generateTemplateStructure +
    8. +
    9. + getName +
    10. +
    11. + sendPrompt +
    12. +
    + +

    Traits:

    + + + + +

    Properties:

    + +
      +
    1. + extractFirstJsonObject
    2. +
    + + + +

    Property details:

    + + +* # + $extractFirstJsonObject + **|** source code +```php +public bool $extractFirstJsonObject; + +``` + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(); +``` + + + +Parameters: not specified + + + +
    +
    +
    + + + +```php +public function generateMissingPHPDocBlocs(string $prompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptstring-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateReadMeFileContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namespacesListarray-
    $additionalPromptstring | null-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function sendPrompt(array $prompts, string $system): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    $systemstring-
    + +Return value: string + + + +See: + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/Provider_3.md b/docs/tech/classes/Provider_3.md new file mode 100644 index 00000000..5a18549a --- /dev/null +++ b/docs/tech/classes/Provider_3.md @@ -0,0 +1,323 @@ + + BumbleDocGen / Technical description of the project / Class map / Provider
    + +

    + Provider class: +

    + + + + + +```php +namespace BumbleDocGen\AI\Providers\OpenAI; + +final class Provider implements \BumbleDocGen\AI\ProviderInterface +``` + + + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + generateMissingPHPDocBlocs +
    2. +
    3. + generateReadMeFileContent +
    4. +
    5. + generateTemplateContent +
    6. +
    7. + generateTemplateStructure +
    8. +
    9. + getName +
    10. +
    11. + sendPrompt +
    12. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +public function __construct(mixed $bearerToken); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $bearerTokenmixed-
    + + + +
    +
    +
    + + + +```php +public function generateMissingPHPDocBlocs(string $prompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptstring-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateReadMeFileContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateContent(array $prompts): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $namespacesListarray-
    $additionalPromptstring | null-
    + +Return value: string + + +
    +
    +
    + + + +```php +public function getName(): string; +``` + + + +Parameters: not specified + +Return value: string + + +
    +
    +
    + + + +```php +public function sendPrompt(array $prompts, string $system): string; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $promptsarray-
    $systemstring-
    + +Return value: string + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/classes/ReadmeTemplateFiller.md b/docs/tech/classes/ReadmeTemplateGenerator.md similarity index 74% rename from docs/tech/classes/ReadmeTemplateFiller.md rename to docs/tech/classes/ReadmeTemplateGenerator.md index bf8625dd..59a1599a 100644 --- a/docs/tech/classes/ReadmeTemplateFiller.md +++ b/docs/tech/classes/ReadmeTemplateGenerator.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateFiller
    + BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateGenerator

    - ReadmeTemplateFiller class: + ReadmeTemplateGenerator class:

    @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; -final class ReadmeTemplateFiller +final class ReadmeTemplateGenerator ``` @@ -39,13 +39,6 @@ final class ReadmeTemplateFiller -

    Constants:

    - @@ -58,11 +51,11 @@ final class ReadmeTemplateFiller ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); ``` @@ -79,13 +72,8 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model - $openaiClient - \Tectalic\OpenAi\Client - - - - - $model - string + $aiHandler + \BumbleDocGen\AI\ProviderInterface - @@ -100,7 +88,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model ```php @@ -148,9 +136,6 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE Throws:
      -
    • - \Tectalic\OpenAi\ClientException
    • -
    • \DI\DependencyException
    • diff --git a/docs/tech/classes/TemplateGenerator.md b/docs/tech/classes/TemplateGenerator.md new file mode 100644 index 00000000..afc925c8 --- /dev/null +++ b/docs/tech/classes/TemplateGenerator.md @@ -0,0 +1,197 @@ + + BumbleDocGen / Technical description of the project / Class map / TemplateGenerator
      + +

      + TemplateGenerator class: +

      + + + + + +```php +namespace BumbleDocGen\AI\Generators; + +final class TemplateGenerator +``` + + + + + + + + +

      Initialization methods:

      + +
        +
      1. + __construct +
      2. +
      + +

      Methods:

      + +
        +
      1. + generate +
      2. +
      3. + getFileSubPathFromPath +
      4. +
      + + + + + + + +

      Method details:

      + +
      + + + +```php +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiHandler\BumbleDocGen\AI\ProviderInterface-
      + + + +
      +
      +
      + + + +```php +public function generate(string $filePath, string $fileContent, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection|null $entitiesCollection, string|null $additionalPrompt = null): string|null; +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $filePathstring-
      $fileContentstring-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection | null-
      $additionalPromptstring | null-
      + +Return value: string | null + + +Throws: + + +
      +
      +
      + + + +```php +public function getFileSubPathFromPath(string $path): mixed; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $pathstring-
      + +Return value: mixed + + +
      +
      + + \ No newline at end of file diff --git a/docs/tech/classes/TemplatesStructureGenerator.md b/docs/tech/classes/TemplatesStructureGenerator.md index bb3fbc00..fc4bdc14 100644 --- a/docs/tech/classes/TemplatesStructureGenerator.md +++ b/docs/tech/classes/TemplatesStructureGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / TemplatesStructureGenerator

      - TemplatesStructureGenerator class: + TemplatesStructureGenerator class:

      @@ -10,7 +10,7 @@ ```php -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; final class TemplatesStructureGenerator ``` @@ -39,13 +39,6 @@ final class TemplatesStructureGenerator -

      Constants:

      - @@ -58,11 +51,11 @@ final class TemplatesStructureGenerator ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); ``` @@ -79,13 +72,8 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model - $openaiClient - \Tectalic\OpenAi\Client - - - - - $model - string + $aiHandler + \BumbleDocGen\AI\ProviderInterface - @@ -100,7 +88,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model ```php @@ -138,9 +126,6 @@ public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\En Throws:
        -
      • - \Tectalic\OpenAi\ClientException
      • -
      • \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
      • diff --git a/docs/tech/map.md b/docs/tech/map.md index 7a49ed96..082db8df 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -3,6 +3,23 @@ Directory layout ( only documented files shown ):
        └──src/
        +│  ├──AI/
        +│  │  ├──Generators/
        +│  │  │  ├── MissingDocBlocksGenerator.php 
        +│  │  │  ├── ReadmeTemplateGenerator.php 
        +│  │  │  ├── TemplateGenerator.php 
        +│  │  │  └── TemplatesStructureGenerator.php 
        +│  │  ├──Providers/
        +│  │  │  ├──HuggingFace/
        +│  │  │  │  └── Provider.php 
        +│  │  │  ├──Ollama/
        +│  │  │  │  └── Provider.php 
        +│  │  │  └──OpenAI/
        +│  │  │  │  └── Provider.php 
        +│  │  ├──Traits/
        +│  │  │  └── JsonExtractorTrait.php 
        +│  │  ├── ProviderFactory.php 
        +│  │  └── ProviderInterface.php 
         │  ├──Console/
         │  │  ├──Command/
         │  │  │  ├── AddMissingDocBlocksCommand.php Base class for all commands.
        @@ -237,11 +254,6 @@ Directory layout ( only documented files shown ):
         │  │  │  └── PhpHandlerSettings.php 
         │  │  ├── LanguageHandlerInterface.php 
         │  │  └── LanguageHandlersCollection.php 
        -│  ├──TemplateGenerator/
        -│  │  └──ChatGpt/
        -│  │  │  ├── MissingDocBlocksGenerator.php 
        -│  │  │  ├── ReadmeTemplateFiller.php 
        -│  │  │  └── TemplatesStructureGenerator.php 
         │  ├── DocGenerator.php Class for generating documentation.
         │  └── DocGeneratorFactory.php 
         
        From 988f694d48e916555b5d5dc0072fc611a9dd0720 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Thu, 19 Oct 2023 22:03:57 +0100 Subject: [PATCH 14/33] Fix to creating templates if they are needed --- demo/demo6-template-content/demoScript.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/demo/demo6-template-content/demoScript.php b/demo/demo6-template-content/demoScript.php index b02595ad..9b931988 100644 --- a/demo/demo6-template-content/demoScript.php +++ b/demo/demo6-template-content/demoScript.php @@ -19,8 +19,12 @@ function generateTemplateStructureIfNeeded(\BumbleDocGen\DocGenerator $docGen) { $finder = new Finder(); $targetDir = __DIR__ . '/templates'; - $finder->files()->in($targetDir); - $fileCount = iterator_count($finder); + $fileCount = 0; + + if (is_dir($targetDir)) { + $finder->files()->in($targetDir); + $fileCount = iterator_count($finder); + } if ($fileCount === 0) { $docGen->generateProjectTemplatesStructure(); From 6aebbccffe10c3b7346d28d472275207434f2e0c Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Sun, 29 Oct 2023 19:28:58 +0000 Subject: [PATCH 15/33] Removes HuggingFace & Ollama AI providers These will be re-added in another branch --- src/AI/ProviderFactory.php | 18 +- .../HuggingFace/Prompts/structureGeneration | 17 -- .../HuggingFace/Prompts/templateGeneration | 7 - src/AI/Providers/HuggingFace/Provider.php | 125 -------------- .../Ollama/Prompts/missingDocBlockGeneration | 4 - .../Ollama/Prompts/readmeTemplateFiller | 6 - .../Ollama/Prompts/structureGeneration | 9 - .../Ollama/Prompts/templateGeneration | 7 - src/AI/Providers/Ollama/Provider.php | 162 ------------------ 9 files changed, 2 insertions(+), 353 deletions(-) delete mode 100644 src/AI/Providers/HuggingFace/Prompts/structureGeneration delete mode 100644 src/AI/Providers/HuggingFace/Prompts/templateGeneration delete mode 100644 src/AI/Providers/HuggingFace/Provider.php delete mode 100644 src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration delete mode 100644 src/AI/Providers/Ollama/Prompts/readmeTemplateFiller delete mode 100644 src/AI/Providers/Ollama/Prompts/structureGeneration delete mode 100644 src/AI/Providers/Ollama/Prompts/templateGeneration delete mode 100644 src/AI/Providers/Ollama/Provider.php diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index 200a06a1..ccab08e6 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -4,9 +4,7 @@ namespace BumbleDocGen\AI; -use BumbleDocGen\AI\Providers\HuggingFace\Provider as HuggingFaceProvider; use BumbleDocGen\AI\Providers\OpenAI\Provider as OpenAIProvider; -use BumbleDocGen\AI\Providers\Ollama\Provider as OllamaProvider; use RuntimeException; final class ProviderFactory @@ -15,27 +13,15 @@ public static function create(): ProviderInterface { $apiType = getenv('API_TYPE'); switch ($apiType) { - case 'huggingface': - $endpoint = getenv('HUGGINGFACE_ENDPOINT'); - $apiKey = getenv('HUGGINGFACE_API_KEY'); - if (empty($endpoint)) { - throw new RuntimeException("Environment variable HUGGINGFACE_ENDPOINT not set!"); - } - if (empty($apiKey)) { - throw new RuntimeException("Environment variable HUGGINGFACE_TOKEN not set!"); - } - return new HuggingFaceProvider($apiKey, $endpoint); - case 'ollama': - return new OllamaProvider(); case 'openai': $apiKey = getenv('OPENAI_API_KEY'); if (empty($apiKey)) { - throw new RuntimeException("Environment variable OPENAI_GPT_MODEL not set!"); + throw new RuntimeException("Environment variable OPENAI_API_KEY not set!"); } return new OpenAIProvider($apiKey); default: throw new RuntimeException( - "Environment variable API_TYPE not set to valid option (openai, huggingface)!", + "Environment variable API_TYPE not set to valid option (huggingface, openai, ollama)!", ); } } diff --git a/src/AI/Providers/HuggingFace/Prompts/structureGeneration b/src/AI/Providers/HuggingFace/Prompts/structureGeneration deleted file mode 100644 index 03d551e7..00000000 --- a/src/AI/Providers/HuggingFace/Prompts/structureGeneration +++ /dev/null @@ -1,17 +0,0 @@ -Task: "Create a documentation file structure from a list of PHP namespaces, categorizing them into broader, human-readable topics." - -Output: "A JSON object representing the documentation file structure, starting each directory with /tech, e.g., /tech/scripts or /tech/db/entities." - -Example Output: -``` - { - "/tech": "Technical documentation", - "/tech/scripts": "List of scripts you can use", - "/tech/db/entities": "List of DB entities you can use" - } -``` -Constraints: - - "Begin directories with /tech." - - "Group namespaces into broader, logical topics at the top level." - - "The deeper structure can reflect more specific categorizations based on namespace functionalities." - - "Keep the structure concise and understandable." diff --git a/src/AI/Providers/HuggingFace/Prompts/templateGeneration b/src/AI/Providers/HuggingFace/Prompts/templateGeneration deleted file mode 100644 index 9fd8e731..00000000 --- a/src/AI/Providers/HuggingFace/Prompts/templateGeneration +++ /dev/null @@ -1,7 +0,0 @@ -You are a documentation generator that adds information to twig files you are provided. - -You will be given an existing template and should retain the existing information, supplementing it with additional information. - -You should not add information that is not 100% correct. - -Do not use any twig functions diff --git a/src/AI/Providers/HuggingFace/Provider.php b/src/AI/Providers/HuggingFace/Provider.php deleted file mode 100644 index ed2b1c8e..00000000 --- a/src/AI/Providers/HuggingFace/Provider.php +++ /dev/null @@ -1,125 +0,0 @@ - [ - 'Authorization' => 'Bearer ' . $bearerToken - ] - ] - ); - $this->client = $client; - $this->endpoint = $apiEndpoint; - $this->maxNewTokens = getenv('HUGGINGFACE_MAX_NEW_TOKENS') ?: 1024; - $this->topP = getenv('HUGGINGFACE_TOP_P') ?: 0.5; - $this->temperature = getenv('HUGGINGFACE_TEMPERATURE') ?: 0.1; - } - - public function generateMissingPHPDocBlocs(string $prompt): string - { - $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); - return $this->sendPrompt([$prompt], $systemPrompt); - } - - public function generateReadMeFileContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('templateGeneration'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string - { - $systemPrompt = $this->getSystemPrompt('structureGeneration'); - - $messages = []; - if ($additionalPrompt) { - $messages[] = "Additional Information: {$additionalPrompt}"; - } - - $messages[] = "The namespace list is:\n"; - $messages[] = implode("\n", $namespacesList); - $messages[] = "\nThe JSON object for the structure of the documentation should be:"; - $this->extractFirstJsonObject = true; - - return $this->sendPrompt($messages, $systemPrompt); - } - - public function getName(): string - { - return 'HuggingFace'; - } - - public function sendPrompt(array $prompts, string $system): string - { - $input = $system . "\n_____\n" . implode(' ', $prompts); - try { - $response = $this->client->request('POST', $this->endpoint, [ - 'json' => [ - // Todo: add more parameters - 'inputs' => $input, - 'parameters' => [ - 'max_new_tokens' => $this->maxNewTokens, - 'top_p' => $this->topP, - 'temperature' => $this->temperature - ] - ] - ]); - - $responseData = json_decode( - $response->getBody()->getContents(), - true, - 512, - JSON_THROW_ON_ERROR - ); - - if (isset($responseData[0]['generated_text'])) { - if ($this->extractFirstJsonObject) { - return $this->extractFirstJsonObjectFromText($responseData[0]['generated_text']); - } - return $responseData[0]['generated_text']; - } - - throw new RuntimeException('Generated text not found in response'); - } catch (GuzzleException $e) { - throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); - } catch (\JsonException $e) { - throw new RuntimeException( - '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() - ); - } - } - - private function getSystemPrompt(string $fileName): string - { - $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; - return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); - } -} diff --git a/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration b/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration deleted file mode 100644 index 2505e13e..00000000 --- a/src/AI/Providers/Ollama/Prompts/missingDocBlockGeneration +++ /dev/null @@ -1,4 +0,0 @@ -You are a documentation generator. I will give you information about PHP class. -You must generate a description for each of the proposed methods. -The response format is the name of the method and its description in JSON format, for example {"method1":"Some description", "method2":"Method2 description" }. -The description should be short and descriptive. \ No newline at end of file diff --git a/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller b/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller deleted file mode 100644 index cfd95d7a..00000000 --- a/src/AI/Providers/Ollama/Prompts/readmeTemplateFiller +++ /dev/null @@ -1,6 +0,0 @@ -You are a documentation generator. -You should analyze the code that I posted and describe what the library or project does, how to use it in md format. -I will send you composer.json file content, list of all available namespaces and main classes ( entry points ) signature. -Make a general description with examples of use but without a detailed description of the methods. -If you want to link to specific class documentation, use this format: ClassName . For example you can use this if you enumerate the list of available entry points -Be sure to place a link to the full technical description in the documentation. The link should be: Description of the technical part of the project \ No newline at end of file diff --git a/src/AI/Providers/Ollama/Prompts/structureGeneration b/src/AI/Providers/Ollama/Prompts/structureGeneration deleted file mode 100644 index 0031dbc7..00000000 --- a/src/AI/Providers/Ollama/Prompts/structureGeneration +++ /dev/null @@ -1,9 +0,0 @@ -You are a documentation generator. -You will be given a list of PHP namespaces. You need to return the file structure for documentation using these namespaces. -You should logically group the documentation files by namespaces. -Each directory must start with /tech, for example: /tech/scripts or /tech/db/entities. -You should respond in JSON. An example response would be: -{"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"} -You must follow these rules very strictly, don't add anything extra. -You keep the final structure concise and understandable. -You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. diff --git a/src/AI/Providers/Ollama/Prompts/templateGeneration b/src/AI/Providers/Ollama/Prompts/templateGeneration deleted file mode 100644 index 9fd8e731..00000000 --- a/src/AI/Providers/Ollama/Prompts/templateGeneration +++ /dev/null @@ -1,7 +0,0 @@ -You are a documentation generator that adds information to twig files you are provided. - -You will be given an existing template and should retain the existing information, supplementing it with additional information. - -You should not add information that is not 100% correct. - -Do not use any twig functions diff --git a/src/AI/Providers/Ollama/Provider.php b/src/AI/Providers/Ollama/Provider.php deleted file mode 100644 index 1f9d0fbf..00000000 --- a/src/AI/Providers/Ollama/Provider.php +++ /dev/null @@ -1,162 +0,0 @@ -client = $client; - $this->endpoint = getenv('OLLAMA_ENDPOINT') ?: 'http://localhost:11434/api/generate'; - $this->temperature = getenv('OLLAMA_TEMPERATURE') ?: 0.8; - $this->model = getenv('OLLAMA_MODEL') ?: 'llama2'; - $this->topP = getenv('OLLAMA_TOP_P') ?: 10; - $this->topK = getenv('OLLAMA_TOP_K') ?: 0.9; - $this->repeatPenalty = getenv('OPENAI_REPEAT_PENALTY') ?: 1.1; - } - - public function generateMissingPHPDocBlocs(string $prompt): string - { - $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); - return $this->sendPrompt([$prompt], $systemPrompt); - } - - public function generateReadMeFileContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('templateGeneration'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string - { - $systemPrompt = $this->getSystemPrompt('structureGeneration'); - - $prompts = []; - if ($additionalPrompt) { - $prompts[] = "Additional Information: {$additionalPrompt}"; - } - - $prompts[] = implode("\n", $namespacesList); - - $this->extractFirstJsonObject = true; - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function getName(): string - { - return 'Ollama'; - } - - /** - * @see https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion - * @see https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values - */ - public function sendPrompt(array $prompts, string $system): string - { - $requestData = [ - 'prompt' => implode("\n\n", $prompts), - 'system' => $system, - 'model' => $this->model, - 'options' => [ - 'temperature' => $this->temperature, - 'top_p' => $this->topP, - 'top_k' => $this->topK, - 'repeat_penalty' => $this->repeatPenalty, - ], - ]; - - try { - $response = $this->client->request('POST', $this->endpoint, [ - 'json' => $requestData, - ]); - - $responseParsed = $this->processResponse($response); - - if ($this->extractFirstJsonObject) { - return $this->extractFirstJsonObjectFromText($responseParsed); - } - return $responseParsed; - } catch (GuzzleException $e) { - throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); - } - } - - private function processResponse($guzzleResponse): string - { - $content = (string)$guzzleResponse->getBody(); - - // Split the content by lines, as each line represents a JSON object - $lines = explode("\n", $content); - - $fullResponse = ""; - - foreach ($lines as $line) { - try { - $jsonObject = json_decode($line, true, 512, JSON_THROW_ON_ERROR); - if ($jsonObject['done']) { - // todo: $jsonObject has key 'context' which is an encoding of the conversation and can be sent - // in the next request to keep conversational memory. - break; - } - $fullResponse .= $jsonObject['response']; - } catch (\JsonException $e) { - throw new RuntimeException( - '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() - ); - } - } - - return $fullResponse; - } - - private function getSystemPrompt(string $fileName): string - { - $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; - return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); - } -} From 27d3157cbaffadbc89990b81f7cefd4df208788c Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Sun, 29 Oct 2023 19:34:59 +0000 Subject: [PATCH 16/33] Simplify AI Providers Refactors the AI provider interface to make adding additional AI providers easier --- .../Generators/MissingDocBlocksGenerator.php | 10 +- src/AI/Generators/ReadmeTemplateGenerator.php | 15 +- src/AI/Generators/TemplateGenerator.php | 163 +++++++++++------- .../TemplatesStructureGenerator.php | 23 ++- .../Prompts/missingDocBlockGeneration | 0 .../Prompts/readmeTemplateFiller | 0 .../OpenAI => }/Prompts/structureGeneration | 12 +- src/AI/ProviderInterface.php | 12 +- .../OpenAI/Prompts/missingDocBlockGeneration | 4 - .../OpenAI/Prompts/readmeTemplateFiller | 6 - .../OpenAI/Prompts/templateGeneration | 7 - src/AI/Providers/OpenAI/Provider.php | 52 ++---- 12 files changed, 160 insertions(+), 144 deletions(-) rename src/AI/{Providers/HuggingFace => }/Prompts/missingDocBlockGeneration (100%) rename src/AI/{Providers/HuggingFace => }/Prompts/readmeTemplateFiller (100%) rename src/AI/{Providers/OpenAI => }/Prompts/structureGeneration (56%) delete mode 100644 src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration delete mode 100644 src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller delete mode 100644 src/AI/Providers/OpenAI/Prompts/templateGeneration diff --git a/src/AI/Generators/MissingDocBlocksGenerator.php b/src/AI/Generators/MissingDocBlocksGenerator.php index 1e219cca..4c3523c7 100644 --- a/src/AI/Generators/MissingDocBlocksGenerator.php +++ b/src/AI/Generators/MissingDocBlocksGenerator.php @@ -129,9 +129,9 @@ public function generateDocBlocksForMethodsWithoutIt( $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['{@inheritDoc}']); } continue; - } else { - $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]', '{@inheritDoc}']); } + + $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]', '{@inheritDoc}']); } else { $methodsDockBlocks[$method->getName()] = $this->createDocBlockText(['[insert]']); } @@ -150,8 +150,10 @@ public function generateDocBlocksForMethodsWithoutIt( $toRequest ) . "\n}"; - $responseData = $this->aiHandler->generateMissingPHPDocBlocs($requestData); - $responseData = json_decode($responseData ?? "{}", true); + $systemPrompt = $this->aiHandler->getSystemPrompt('missingDocBlockGeneration'); + $prompts = [$requestData]; + $responseData = $this->aiHandler->sendPrompts($prompts, $systemPrompt); + $responseData = json_decode($responseData, true, 512, JSON_THROW_ON_ERROR); if (!$responseData) { return []; diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index 2795168d..eea807e3 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -48,10 +48,11 @@ public function generateReadmeFileContent( ); $namespacesList = array_unique($namespacesList); - $messages[] = "Project namespaces:\n" . implode("\n", $namespacesList); + $prompts = []; + $prompts[] = $this->aiHandler->formatDataPrompt('Project namespaces', implode("\n", $namespacesList)); if ($composerJsonFile) { - $messages[] = "Composer JSON:\n" . file_get_contents($composerJsonFile); + $prompts[] = $this->aiHandler->formatDataPrompt('Composer JSON', file_get_contents($composerJsonFile)); } $entryPointsSignatures = []; @@ -69,13 +70,17 @@ public function generateReadmeFileContent( } if ($entryPointsSignatures) { - $messages[] = "Project entry points: \n" . implode("\n\n", $entryPointsSignatures); + $prompts[] = $this->aiHandler->formatDataPrompt( + 'Project entry points', + implode("\n\n", $entryPointsSignatures) + ); } if ($additionalPrompt) { - $messages[] = "Additional Information: {$additionalPrompt}"; + $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); } - return $this->aiHandler->generateReadMeFileContent($messages); + $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateFiller'); + return $this->aiHandler->sendPrompts($prompts, $systemPrompt); } } diff --git a/src/AI/Generators/TemplateGenerator.php b/src/AI/Generators/TemplateGenerator.php index e6edf34d..35534462 100644 --- a/src/AI/Generators/TemplateGenerator.php +++ b/src/AI/Generators/TemplateGenerator.php @@ -12,43 +12,66 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\MethodEntity; use DI\DependencyException; use DI\NotFoundException; +use DirectoryIterator; +use JsonException; final class TemplateGenerator { + private const FILE_LENGTH_EXISTING_CONTENT = 300; + + private array $alreadyProcessedEntities = []; + public function __construct( private ProviderInterface $aiHandler, ) { } - private function getTemplateFromGPT( + /** + * @throws NotFoundException + * @throws DependencyException + * @throws ReflectionException + * @throws JsonException + * @throws InvalidConfigurationParameterException + */ + public function generate( string $filePath, string $fileContent, - array $methodStubs, - ?string $additionalPrompt + ?ClassEntityCollection $entitiesCollection, + ?string $additionalPrompt = null ): ?string { - $prompts[] = 'Create the template for ' . $this->getFileSubPathFromPath( - $filePath - ) . ' the existing template is: [TEMPLATE]' . $fileContent . '[/TEMPLATE]'; + $methodStubs = $this->getMethodStubs($filePath, $entitiesCollection); + $directoryStructure = $this->getDirectoryStructure($filePath); - $prompts[] = - "The file documents a namespace/class with the following method stubs: \n" . implode( + if (strlen($fileContent) > self::FILE_LENGTH_EXISTING_CONTENT) { + return $fileContent; //todo: better way to not generate already existing content + } + $prompts[] = $this->aiHandler->formatDataPrompt( + 'Method Stubs', + implode( "\n", $methodStubs - ); - + ) + ); + $prompts[] = $this->aiHandler->formatDataPrompt( + 'Directory Structure', + json_encode( + $directoryStructure, + JSON_THROW_ON_ERROR + ) + ); if ($additionalPrompt) { - $prompts[] = "Additional Information: {$additionalPrompt}"; + $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); } - $response = $this->aiHandler->generateTemplateContent($prompts); + $prompts[] = 'Generate the documentation content for ' . $this->getFileSubPathFromPath( + $filePath + ); - return $this->extractTemplateContent($response); - } + $systemPrompt = $this->aiHandler->getSystemPrompt('templateGeneration'); - private function extractTemplateContent(string $str): ?string - { - preg_match('/\[TEMPLATE](.*?)\[\/TEMPLATE]/s', $str, $matches); - return $matches[1] ?? null; + $aiContent = $this->aiHandler->sendPrompts($prompts, $systemPrompt); + + return $fileContent . "\n" . $aiContent; } private function isNamespaceChildOrSame(string $namespace1, string $namespace2): bool @@ -68,7 +91,6 @@ private function isNamespaceChildOrSame(string $namespace1, string $namespace2): return false; } - private function getNamespaceFromPath(string $path): ?string { $namespaceStart = 'templates/tech/'; @@ -82,10 +104,10 @@ private function getNamespaceFromPath(string $path): ?string $namespacePart = substr($path, $startPosition + strlen($namespaceStart)); $namespace = dirname($namespacePart); - return str_replace('/', '\\', $namespace); + return "BumbleDocGen\\" . str_replace('/', '\\', $namespace); //todo: fix that i'm passing BumbleDocGen } - public function getFileSubPathFromPath(string $path) + public function getFileSubPathFromPath(string $path): ?string { $subPathStart = 'templates/tech/'; @@ -98,51 +120,71 @@ public function getFileSubPathFromPath(string $path) return substr($path, $startPosition + strlen($subPathStart)); } + private function getDirectoryStructure($path, $parent = ''): array + { + $data = []; + + // If a file path is provided, get its directory. + if (!is_dir($path)) { + $parent .= '/' . basename(dirname($path)); + $path = dirname($path); + } + + $items = new DirectoryIterator($path); + foreach ($items as $item) { + if (!$item->isDot()) { + $currentPath = $parent . '/' . $item->getFilename(); + if ($item->isDir()) { + $data[$currentPath] = $this->getDirectoryStructure($item->getPathname(), $currentPath); + } else { + $data[$currentPath] = $currentPath; + } + } + } + + return $data; + } + /** - * @throws NotFoundException - * @throws DependencyException * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - public function generate( - string $filePath, - string $fileContent, - ?ClassEntityCollection $entitiesCollection, - ?string $additionalPrompt = null - ): ?string { - $namespace = $this->getNamespaceFromPath($filePath); - - $alreadyProcessedEntities = []; - $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( - &$getEntities, - & - $alreadyProcessedEntities - ): \Generator { - foreach ($entitiesCollection as $classEntity) { - /**@var ClassEntity $classEntity */ - if ( - !$classEntity->entityDataCanBeLoaded() || array_key_exists( - $classEntity->getName(), - $alreadyProcessedEntities - ) - ) { - continue; - } - $interfaces = $classEntity->getInterfacesEntities(); - if ($interfaces) { - yield from $getEntities($interfaces); - } - $parentClass = $classEntity->getParentClass(); - if ($parentClass) { - yield from $getEntities([$parentClass]); - } - $alreadyProcessedEntities[$classEntity->getName()] = 1; - yield $classEntity; + private function getEntities(ClassEntityCollection|array $entitiesCollection): \Generator + { + foreach ($entitiesCollection as $classEntity) { + /**@var ClassEntity $classEntity */ + if ( + !$classEntity->entityDataCanBeLoaded() || array_key_exists( + $classEntity->getName(), + $this->alreadyProcessedEntities + ) + ) { + continue; + } + $interfaces = $classEntity->getInterfacesEntities(); + if ($interfaces) { + yield from $this->getEntities($interfaces); } - }; + $parentClass = $classEntity->getParentClass(); + if ($parentClass) { + yield from $this->getEntities([$parentClass]); + } + $this->alreadyProcessedEntities[$classEntity->getName()] = 1; + yield $classEntity; + } + } + /** + * @throws ReflectionException + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + private function getMethodStubs(string $filePath, ?ClassEntityCollection $entitiesCollection): array + { + $namespace = $this->getNamespaceFromPath($filePath); $methodStubs = []; - foreach ($getEntities($entitiesCollection) as $entity) { + foreach ($this->getEntities($entitiesCollection) as $entity) { $nsCheck = $this->isNamespaceChildOrSame($namespace, $entity->getNamespaceName()); if ($nsCheck) { $methods = $entity->getMethodEntityCollection(); @@ -153,7 +195,6 @@ public function generate( } } } - - return $this->getTemplateFromGPT($filePath, $fileContent, $methodStubs, $additionalPrompt); + return $methodStubs; } } diff --git a/src/AI/Generators/TemplatesStructureGenerator.php b/src/AI/Generators/TemplatesStructureGenerator.php index cf9a3bb4..b372a2b2 100644 --- a/src/AI/Generators/TemplatesStructureGenerator.php +++ b/src/AI/Generators/TemplatesStructureGenerator.php @@ -10,6 +10,7 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; +use JsonException; final class TemplatesStructureGenerator { @@ -20,6 +21,7 @@ public function __construct(private ProviderInterface $aiHandler) /** * @throws ReflectionException * @throws InvalidConfigurationParameterException + * @throws JsonException */ public function generateStructureByEntityCollection( RootEntityCollection $rootEntityCollection, @@ -34,15 +36,30 @@ public function generateStructureByEntityCollection( ); $namespacesList = array_unique($namespacesList); - $content = $this->aiHandler->generateTemplateStructure($namespacesList, $additionalPrompt); + $prompts = []; + $prompts[] = $this->aiHandler->formatDataPrompt( + 'Namespaces', + implode( + "\n", + $namespacesList + ) + ); + + $systemPrompt = $this->aiHandler->getSystemPrompt('structureGeneration'); + + if ($additionalPrompt) { + $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); + } + + $content = $this->aiHandler->sendPrompts($prompts, $systemPrompt); - $structure = json_decode($content); + $structure = json_decode($content, true, 512, JSON_THROW_ON_ERROR); $finalStructure = [ "/readme.md.twig" => "About the project", ]; foreach ($structure as $dir => $docName) { - $finalStructure["{$dir}/index.md.twig"] = $docName; + $finalStructure["/tech{$dir}/index.md.twig"] = $docName; } $finalStructure["/tech/index.md.twig"] = "Description of the technical part of the project"; diff --git a/src/AI/Providers/HuggingFace/Prompts/missingDocBlockGeneration b/src/AI/Prompts/missingDocBlockGeneration similarity index 100% rename from src/AI/Providers/HuggingFace/Prompts/missingDocBlockGeneration rename to src/AI/Prompts/missingDocBlockGeneration diff --git a/src/AI/Providers/HuggingFace/Prompts/readmeTemplateFiller b/src/AI/Prompts/readmeTemplateFiller similarity index 100% rename from src/AI/Providers/HuggingFace/Prompts/readmeTemplateFiller rename to src/AI/Prompts/readmeTemplateFiller diff --git a/src/AI/Providers/OpenAI/Prompts/structureGeneration b/src/AI/Prompts/structureGeneration similarity index 56% rename from src/AI/Providers/OpenAI/Prompts/structureGeneration rename to src/AI/Prompts/structureGeneration index 0031dbc7..dd55f1b5 100644 --- a/src/AI/Providers/OpenAI/Prompts/structureGeneration +++ b/src/AI/Prompts/structureGeneration @@ -1,9 +1,9 @@ You are a documentation generator. -You will be given a list of PHP namespaces. You need to return the file structure for documentation using these namespaces. -You should logically group the documentation files by namespaces. -Each directory must start with /tech, for example: /tech/scripts or /tech/db/entities. +You will be given a list of PHP namespaces. You need to return a file structure for documentation using these namespaces. +You should logically group the documentation files by namespaces, keeping the final structure concise and understandable. +You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. +You need to exclude the top level namespace from the directory structure. You should respond in JSON. An example response would be: +""" {"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"} -You must follow these rules very strictly, don't add anything extra. -You keep the final structure concise and understandable. -You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. +""" diff --git a/src/AI/ProviderInterface.php b/src/AI/ProviderInterface.php index 2e85e4a4..64ef819c 100644 --- a/src/AI/ProviderInterface.php +++ b/src/AI/ProviderInterface.php @@ -6,15 +6,11 @@ interface ProviderInterface { - public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string; - - public function generateMissingPHPDocBlocs(string $prompt): string; - - public function generateTemplateContent(array $prompts): string; + public function getName(): string; - public function generateReadMeFileContent(array $prompts): string; + public function getSystemPrompt(string $fileName): string; - public function sendPrompt(array $prompts, string $system): string; + public function sendPrompts(array $prompts, string $system): string; - public function getName(): string; + public function formatDataPrompt(string $title, string $content): string; } diff --git a/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration b/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration deleted file mode 100644 index 2505e13e..00000000 --- a/src/AI/Providers/OpenAI/Prompts/missingDocBlockGeneration +++ /dev/null @@ -1,4 +0,0 @@ -You are a documentation generator. I will give you information about PHP class. -You must generate a description for each of the proposed methods. -The response format is the name of the method and its description in JSON format, for example {"method1":"Some description", "method2":"Method2 description" }. -The description should be short and descriptive. \ No newline at end of file diff --git a/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller b/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller deleted file mode 100644 index cfd95d7a..00000000 --- a/src/AI/Providers/OpenAI/Prompts/readmeTemplateFiller +++ /dev/null @@ -1,6 +0,0 @@ -You are a documentation generator. -You should analyze the code that I posted and describe what the library or project does, how to use it in md format. -I will send you composer.json file content, list of all available namespaces and main classes ( entry points ) signature. -Make a general description with examples of use but without a detailed description of the methods. -If you want to link to specific class documentation, use this format: ClassName . For example you can use this if you enumerate the list of available entry points -Be sure to place a link to the full technical description in the documentation. The link should be: Description of the technical part of the project \ No newline at end of file diff --git a/src/AI/Providers/OpenAI/Prompts/templateGeneration b/src/AI/Providers/OpenAI/Prompts/templateGeneration deleted file mode 100644 index 9fd8e731..00000000 --- a/src/AI/Providers/OpenAI/Prompts/templateGeneration +++ /dev/null @@ -1,7 +0,0 @@ -You are a documentation generator that adds information to twig files you are provided. - -You will be given an existing template and should retain the existing information, supplementing it with additional information. - -You should not add information that is not 100% correct. - -Do not use any twig functions diff --git a/src/AI/Providers/OpenAI/Provider.php b/src/AI/Providers/OpenAI/Provider.php index fdc0e441..665f1087 100644 --- a/src/AI/Providers/OpenAI/Provider.php +++ b/src/AI/Providers/OpenAI/Provider.php @@ -18,6 +18,7 @@ final class Provider implements ProviderInterface private ?int $maxTokens; private int $topP; private string $model; + private const DATA_SEPARATOR = '"""'; public function __construct($bearerToken) { @@ -44,45 +45,12 @@ public function __construct($bearerToken) $this->topP = getenv('OPENAI_TOP_P') ?: 1; } - public function generateMissingPHPDocBlocs(string $prompt): string - { - $systemPrompt = $this->getSystemPrompt('missingDocBlockGeneration'); - $prompts = [$prompt]; - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateReadMeFileContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('readmeTemplateFiller'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateContent(array $prompts): string - { - $systemPrompt = $this->getSystemPrompt('templateGeneration'); - return $this->sendPrompt($prompts, $systemPrompt); - } - - public function generateTemplateStructure(array $namespacesList, ?string $additionalPrompt): string - { - $systemPrompt = $this->getSystemPrompt('structureGeneration'); - - $prompts = []; - if ($additionalPrompt) { - $prompts[] = "Additional Information: {$additionalPrompt}"; - } - - $prompts[] = implode("\n", $namespacesList); - - return $this->sendPrompt($prompts, $systemPrompt); - } - public function getName(): string { return 'OpenAI'; } - public function sendPrompt(array $prompts, string $system): string + public function sendPrompts(array $prompts, string $system): string { $requestData = [ 'messages' => $this->createMessages($prompts, $system), @@ -122,6 +90,11 @@ public function sendPrompt(array $prompts, string $system): string } } + public function getSystemPrompt(string $fileName): string + { + $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; + return $systemPrompt ?? file_get_contents(__DIR__ . '../Prompts/' . $fileName); + } private function createMessage(string $role, string $content): \stdClass { $message = new \stdClass(); @@ -130,6 +103,11 @@ private function createMessage(string $role, string $content): \stdClass return $message; } + public function formatDataPrompt(string $title, string $content): string + { + return $title . ": \n" . self::DATA_SEPARATOR . "\n" . $content . "\n" . self::DATA_SEPARATOR; + } + private function createMessages(array $prompts, string $system): array { $messages = []; @@ -139,10 +117,4 @@ private function createMessages(array $prompts, string $system): array } return $messages; } - - private function getSystemPrompt(string $fileName): string - { - $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; - return $systemPrompt ?? file_get_contents(__DIR__ . '/Prompts/' . $fileName); - } } From fec760ef81cfe6824ec979a0cbd8b810170dcf8b Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Sun, 29 Oct 2023 19:36:54 +0000 Subject: [PATCH 17/33] Improves template generation Updated prompt for template generation Option for template generation to be non-interactive --- demo/demo6-template-content/demo-config.yaml | 2 ++ src/AI/Prompts/templateGeneration | 7 +++++ src/DocGenerator.php | 31 +++++++++++++++----- 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 src/AI/Prompts/templateGeneration diff --git a/demo/demo6-template-content/demo-config.yaml b/demo/demo6-template-content/demo-config.yaml index 9dc06f53..214dec39 100644 --- a/demo/demo6-template-content/demo-config.yaml +++ b/demo/demo6-template-content/demo-config.yaml @@ -1,6 +1,8 @@ project_root: '%DOC_GEN_LIB_PATH%' cache_dir: '%WORKING_DIR%/demo/demo6-template-content/__cache' templates_dir: '%WORKING_DIR%/demo/demo6-template-content/templates' +output_dir: "%WORKING_DIR%/demo/demo6-template-content/docs" +output_dir_base_url: "/demo/demo6-template-content/docs" language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler diff --git a/src/AI/Prompts/templateGeneration b/src/AI/Prompts/templateGeneration new file mode 100644 index 00000000..fc73d74c --- /dev/null +++ b/src/AI/Prompts/templateGeneration @@ -0,0 +1,7 @@ +You are a documentation generator. +You will be provided with method stubs and an existing directory structure for the section of documentation you are generating. +You must create a general description the class you are documenting and detailed description of the methods of the class. +You should create examples of how to use the class, in PHP. +If a link exists in the provided directory structure to a subclass, you should link to it. If it doesn't exist, include it in the documentation. +You can provide links to subclasses of the class using this format: \Namespace\ClassName +You will output the response in Twig without using "```twig [CONTENT]```" diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 526042d3..6383843e 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -302,7 +302,7 @@ public function fillInReadmeMdTemplate(): void } } - public function generateProjectTemplates(): void + public function generateProjectTemplates($interactive = true): void { $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); @@ -322,9 +322,13 @@ public function generateProjectTemplates(): void $this->io->note( 'Creating template for ' . $templateGenerator->getFileSubPathFromPath($file->getRealPath()) ); - $additionalPrompt = $this->io->ask( - 'Add additional information about this ( or just skip this step )' - ) ?: null; + if ($interactive) { + $additionalPrompt = $this->io->ask( + 'Add additional information about this ( or just skip this step )' + ) ?: null; + } else { + $additionalPrompt = null; + } $this->io->note("Sending " . $aiHandler->getName() . " request"); $content = $templateGenerator->generate( $file->getRealPath(), @@ -332,10 +336,21 @@ public function generateProjectTemplates(): void $entitiesCollection, $additionalPrompt ); - $action = $this->io->choice( - "The proposed documentation is as follows:\n\n{$content}", - ['Save', 'Regenerate', 'Cancel'] - ); + if ($content === null) { + $this->io->note( + 'Template already exists for ' . $templateGenerator->getFileSubPathFromPath( + $file->getRealPath() + ) + ); + $action = 'Continue'; + } elseif ($interactive) { + $action = $this->io->choice( + "The proposed documentation is as follows:\n\n{$content}", + ['Save', 'Regenerate', 'Cancel'] + ); + } else { + $action = 'Save'; + } } while ($action === 'Regenerate'); if ($action === 'Save') { From bebd5f47b50d7b551cd201a3529e12b8f4aacde0 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Sun, 29 Oct 2023 19:37:25 +0000 Subject: [PATCH 18/33] Code style fixes --- src/DocGenerator.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 6383843e..401d6eaa 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -23,6 +23,8 @@ use BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper; use DI\DependencyException; use DI\NotFoundException; +use Exception; +use Generator; use Monolog\Logger; use Psr\Cache\InvalidArgumentException; use Symfony\Component\Console\Formatter\OutputFormatterStyle; @@ -155,7 +157,7 @@ public function addMissingDocBlocks(): void &$getEntities, & $alreadyProcessedEntities - ): \Generator { + ): Generator { foreach ($entitiesCollection as $classEntity) { /**@var ClassEntity $classEntity */ if ( @@ -366,7 +368,7 @@ public function generateProjectTemplates($interactive = true): void * Generates documentation using configuration * * @throws InvalidArgumentException - * @throws \Exception + * @throws Exception */ public function generate(): void { @@ -376,7 +378,7 @@ public function generate(): void try { $this->parser->parse(); $this->renderer->run(); - } catch (\Exception $e) { + } catch (Exception $e) { $this->logger->critical( "{$e->getFile()}:{$e->getLine()} {$e->getMessage()} \n\n{{$e->getTraceAsString()}}" ); @@ -406,7 +408,10 @@ public function generate(): void $tag = strtolower($warningMessage['type']); $rows[] = ["<{$tag}>{$warningMessage['type']}", "<{$tag}>{$warningMessage['msg']}"]; if ($warningMessage['isRenderingError']) { - $rows[] = ['', 'This error occurs during the document rendering process']; + $rows[] = [ + '', + 'This error occurs during the document rendering process' + ]; } $rows[] = ['', $warningMessage['initiator']]; if ($warningMessagesCount - $i !== 1) { From 0e725da24b7328e240a9576ba781d1ac6ab10a54 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:47:41 +0000 Subject: [PATCH 19/33] Switches demos over to use AI commands --- demo/demo2-templates-generation/demoScript.php | 16 +++++++++++++--- demo/demo3-add-missing-doc-blocks/demoScript.php | 16 +++++++++++++--- demo/demo4-generating-readme-file/demoScript.php | 16 +++++++++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/demo/demo2-templates-generation/demoScript.php b/demo/demo2-templates-generation/demoScript.php index 27f1080b..03e3c5a4 100644 --- a/demo/demo2-templates-generation/demoScript.php +++ b/demo/demo2-templates-generation/demoScript.php @@ -1,13 +1,23 @@ #!/usr/bin/env php create(__DIR__ . '/demo-config.yaml'); - $docGen->generateProjectTemplatesStructure(); -} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + $application = new App(); + $input = new ArrayInput([ + 'command' => InitDocsStructureCommand::NAME, + '--config' => 'demo/demo2-templates-generation/demo-config.yaml', + '--provider' => 'openai', + '--model' => 'gpt-4', + ]); + $application->run($input); +} catch (\Exception $e) { die($e->getMessage()); } diff --git a/demo/demo3-add-missing-doc-blocks/demoScript.php b/demo/demo3-add-missing-doc-blocks/demoScript.php index 93702bce..59935dc7 100644 --- a/demo/demo3-add-missing-doc-blocks/demoScript.php +++ b/demo/demo3-add-missing-doc-blocks/demoScript.php @@ -1,13 +1,23 @@ #!/usr/bin/env php create(__DIR__ . '/demo-config.yaml'); - $docGen->addMissingDocBlocks(); -} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + $application = new App(); + $input = new ArrayInput([ + 'command' => AddDocBlocksCommand::NAME, + '--config' => 'demo/demo3-add-missing-doc-blocks/demo-config.yaml', + '--provider' => 'openai', + '--model' => 'gpt-4', + ]); + $application->run($input); +} catch (\Exception $e) { die($e->getMessage()); } diff --git a/demo/demo4-generating-readme-file/demoScript.php b/demo/demo4-generating-readme-file/demoScript.php index d287e7d0..aa244e41 100644 --- a/demo/demo4-generating-readme-file/demoScript.php +++ b/demo/demo4-generating-readme-file/demoScript.php @@ -1,13 +1,23 @@ #!/usr/bin/env php create(__DIR__ . '/demo-config.yaml'); - $docGen->fillInReadmeMdTemplate(); -} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { + $application = new App(); + $input = new ArrayInput([ + 'command' => GenerateReadMeTemplateCommand::NAME, + '--config' => 'demo/demo4-generating-readme-file/demo-config.yaml', + '--provider' => 'openai', + '--model' => 'gpt-4', + ]); + $application->run($input); +} catch (\Exception $e) { die($e->getMessage()); } From caaf887ee337300f47a9892bd6edcc6f60478f86 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:49:18 +0000 Subject: [PATCH 20/33] Updates Template demos - Adds new configuration - Moves demo for template content --- .../demo-config.yaml | 6 +++ demo/demo6-template-content/demo-config.yaml | 15 ------ demo/demo6-template-content/demoScript.php | 32 ------------ demo/demo7-template-content/demo-config.yaml | 20 ++++++++ demo/demo7-template-content/demoScript.php | 51 +++++++++++++++++++ 5 files changed, 77 insertions(+), 47 deletions(-) delete mode 100644 demo/demo6-template-content/demo-config.yaml delete mode 100644 demo/demo6-template-content/demoScript.php create mode 100644 demo/demo7-template-content/demo-config.yaml create mode 100644 demo/demo7-template-content/demoScript.php diff --git a/demo/demo2-templates-generation/demo-config.yaml b/demo/demo2-templates-generation/demo-config.yaml index e7e1cc0b..98f257b5 100644 --- a/demo/demo2-templates-generation/demo-config.yaml +++ b/demo/demo2-templates-generation/demo-config.yaml @@ -12,3 +12,9 @@ source_locators: arguments: directories: - "%project_root%/src" + +ai: + data_dir: '%WORKING_DIR%/demo/demo2-templates-generation/ai_data' +# api_key: + handler: "open_ai" + model: "gpt-4" diff --git a/demo/demo6-template-content/demo-config.yaml b/demo/demo6-template-content/demo-config.yaml deleted file mode 100644 index 214dec39..00000000 --- a/demo/demo6-template-content/demo-config.yaml +++ /dev/null @@ -1,15 +0,0 @@ -project_root: '%DOC_GEN_LIB_PATH%' -cache_dir: '%WORKING_DIR%/demo/demo6-template-content/__cache' -templates_dir: '%WORKING_DIR%/demo/demo6-template-content/templates' -output_dir: "%WORKING_DIR%/demo/demo6-template-content/docs" -output_dir_base_url: "/demo/demo6-template-content/docs" -language_handlers: - php: - class: \BumbleDocGen\LanguageHandler\Php\PhpHandler - settings: - async_source_loading_enabled: true -source_locators: - - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator - arguments: - directories: - - "%project_root%/src" diff --git a/demo/demo6-template-content/demoScript.php b/demo/demo6-template-content/demoScript.php deleted file mode 100644 index 9b931988..00000000 --- a/demo/demo6-template-content/demoScript.php +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env php -create(__DIR__ . '/demo-config.yaml'); - generateTemplateStructureIfNeeded($docGen); - $docGen->generateProjectTemplates(); -} catch (\Exception | \Psr\Cache\InvalidArgumentException $e) { - die($e->getMessage()); -} - -function generateTemplateStructureIfNeeded(\BumbleDocGen\DocGenerator $docGen) -{ - $finder = new Finder(); - $targetDir = __DIR__ . '/templates'; - $fileCount = 0; - - if (is_dir($targetDir)) { - $finder->files()->in($targetDir); - $fileCount = iterator_count($finder); - } - - if ($fileCount === 0) { - $docGen->generateProjectTemplatesStructure(); - } -} diff --git a/demo/demo7-template-content/demo-config.yaml b/demo/demo7-template-content/demo-config.yaml new file mode 100644 index 00000000..5afa58a1 --- /dev/null +++ b/demo/demo7-template-content/demo-config.yaml @@ -0,0 +1,20 @@ +project_root: '%DOC_GEN_LIB_PATH%' +cache_dir: '%WORKING_DIR%/demo/demo7-template-content/__cache' +templates_dir: '%WORKING_DIR%/demo/demo7-template-content/templates' +output_dir: "%WORKING_DIR%/demo/demo7-template-content/docs" +output_dir_base_url: "/demo/demo7-template-content/docs" +language_handlers: + php: + class: \BumbleDocGen\LanguageHandler\Php\PhpHandler + settings: + async_source_loading_enabled: true +source_locators: + - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator + arguments: + directories: + - "%project_root%/src" +ai: + data_dir: '%WORKING_DIR%/demo/demo7-template-content/ai_data' + api_key: + handler: "open_ai" + model: "gpt-4" diff --git a/demo/demo7-template-content/demoScript.php b/demo/demo7-template-content/demoScript.php new file mode 100644 index 00000000..806ef7d8 --- /dev/null +++ b/demo/demo7-template-content/demoScript.php @@ -0,0 +1,51 @@ +#!/usr/bin/env php + GenerateTemplatesContentCommand::NAME, + '--config' => 'demo/demo7-template-content/demo-config.yaml', + '--provider' => 'openai', + '--model' => 'gpt-4', + ]); + + $application->run($input); +} catch (\Exception $e) { + die($e->getMessage()); +} + +function generateStructureIfNotExists(App $application): void +{ + $finder = new Finder(); + $targetDir = __DIR__ . '/templates'; + $fileCount = 0; + + if (is_dir($targetDir)) { + $finder->files()->in($targetDir); + $fileCount = iterator_count($finder); + } + + if ($fileCount === 0) { + $input = new ArrayInput([ + 'command' => InitDocsStructureCommand::NAME, + '--config' => 'demo/demo7-template-content/demo-config.yaml', + '--provider' => 'openai', + '--model' => 'gpt-4', + ]); + $application->run($input); + } +} From fe43d425b584cc189ff1339f6e59b6374fc20742 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:50:00 +0000 Subject: [PATCH 21/33] Removes JsonExtractorTrait --- src/AI/Traits/JsonExtractorTrait.php | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 src/AI/Traits/JsonExtractorTrait.php diff --git a/src/AI/Traits/JsonExtractorTrait.php b/src/AI/Traits/JsonExtractorTrait.php deleted file mode 100644 index 4121de30..00000000 --- a/src/AI/Traits/JsonExtractorTrait.php +++ /dev/null @@ -1,28 +0,0 @@ -getMessage()); - } - - return $jsonObject; - } -} From a0d4e5af1de01eb9e698f13eb916b4ca60dd15d0 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:58:28 +0000 Subject: [PATCH 22/33] AI Refactor - Template generation no longer creates a structure that mirrors the namespaces - Changes template content generation to only generate content for structures that have been automatically generated - Renames commands/generators and prompts to better match - Moves commands over to AI namespace & adds shared parameters/configuration - Updates generators to allow easy overriding of system prompts - Adds back support for choosing OpenAI model if one not provided - Adds non-interactive mode for most commands --- src/AI/Console/AddDocBlocksCommand.php | 70 ++++++ .../GenerateReadMeTemplateCommand.php} | 33 ++- .../GenerateTemplatesContentCommand.php | 73 +++++++ src/AI/Console/InitDocsStructureCommand.php | 75 +++++++ ...ksGenerator.php => DocBlocksGenerator.php} | 7 +- src/AI/Generators/ReadmeTemplateGenerator.php | 5 +- .../Generators/TemplateContentGenerator.php | 152 +++++++++++++ src/AI/Generators/TemplateGenerator.php | 200 ------------------ ...tor.php => TemplateStructureGenerator.php} | 18 +- ...gDocBlockGeneration => docBlockGeneration} | 0 ...emplateFiller => readmeTemplateGeneration} | 0 src/AI/Prompts/structureGeneration | 9 - src/AI/Prompts/templateContentGeneration | 1 + src/AI/Prompts/templateGeneration | 7 - src/AI/Prompts/templateStructureGeneration | 18 ++ src/AI/ProviderFactory.php | 23 +- src/AI/Providers/OpenAI/Provider.php | 64 ++++-- src/AI/Traits/SharedCommandLogicTrait.php | 131 ++++++++++++ src/Console/App.php | 14 +- .../Command/AddMissingDocBlocksCommand.php | 43 ---- ...nerateProjectTemplatesStructureCommand.php | 44 ---- src/Core/Configuration/Configuration.php | 35 +++ src/DocGenerator.php | 155 ++++++++------ 23 files changed, 757 insertions(+), 420 deletions(-) create mode 100644 src/AI/Console/AddDocBlocksCommand.php rename src/{Console/Command/FillInReadmeMdTemplateCommand.php => AI/Console/GenerateReadMeTemplateCommand.php} (50%) create mode 100644 src/AI/Console/GenerateTemplatesContentCommand.php create mode 100644 src/AI/Console/InitDocsStructureCommand.php rename src/AI/Generators/{MissingDocBlocksGenerator.php => DocBlocksGenerator.php} (97%) create mode 100644 src/AI/Generators/TemplateContentGenerator.php delete mode 100644 src/AI/Generators/TemplateGenerator.php rename src/AI/Generators/{TemplatesStructureGenerator.php => TemplateStructureGenerator.php} (78%) rename src/AI/Prompts/{missingDocBlockGeneration => docBlockGeneration} (100%) rename src/AI/Prompts/{readmeTemplateFiller => readmeTemplateGeneration} (100%) delete mode 100644 src/AI/Prompts/structureGeneration create mode 100644 src/AI/Prompts/templateContentGeneration delete mode 100644 src/AI/Prompts/templateGeneration create mode 100644 src/AI/Prompts/templateStructureGeneration create mode 100644 src/AI/Traits/SharedCommandLogicTrait.php delete mode 100644 src/Console/Command/AddMissingDocBlocksCommand.php delete mode 100644 src/Console/Command/GenerateProjectTemplatesStructureCommand.php diff --git a/src/AI/Console/AddDocBlocksCommand.php b/src/AI/Console/AddDocBlocksCommand.php new file mode 100644 index 00000000..fa53acae --- /dev/null +++ b/src/AI/Console/AddDocBlocksCommand.php @@ -0,0 +1,70 @@ + 'Path to the directory of the documented project', + 'templates_dir' => 'Path to directory with documentation templates', + 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', + ]; + } + + protected function configure(): void + { + $this->setName(self::NAME) + ->setDescription('Leverage AI to insert missing doc blocks in code.'); + $this->addSharedCommandOptions(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + * @throws ReflectionException + * @throws GuzzleException + * @throws JsonException + */ + protected function execute( + InputInterface $input, + OutputInterface $output + ): int { + $configuration = $this->getConfigurationFromInput($input); + $provider = $this->getAIProvider($input, $configuration); + $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); + $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); + $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + + $this->createDocGenInstance($input, $output)->addDocBlocks( + $provider, + $apiKey, + $model, + $systemPrompt + ); + + return self::SUCCESS; + } +} diff --git a/src/Console/Command/FillInReadmeMdTemplateCommand.php b/src/AI/Console/GenerateReadMeTemplateCommand.php similarity index 50% rename from src/Console/Command/FillInReadmeMdTemplateCommand.php rename to src/AI/Console/GenerateReadMeTemplateCommand.php index ad83056d..50ac014b 100644 --- a/src/Console/Command/FillInReadmeMdTemplateCommand.php +++ b/src/AI/Console/GenerateReadMeTemplateCommand.php @@ -2,17 +2,25 @@ declare(strict_types=1); -namespace BumbleDocGen\Console\Command; +namespace BumbleDocGen\AI\Console; +use BumbleDocGen\AI\Traits\SharedCommandLogicTrait; +use BumbleDocGen\Console\Command\BaseCommand; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use DI\DependencyException; use DI\NotFoundException; +use GuzzleHttp\Exception\GuzzleException; +use JsonException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; -final class FillInReadmeMdTemplateCommand extends BaseCommand +final class GenerateReadMeTemplateCommand extends BaseCommand { + use SharedCommandLogicTrait; + + public const NAME = 'ai:generate-readme-template'; + protected function getCustomConfigOptionsMap(): array { return [ @@ -24,21 +32,32 @@ protected function getCustomConfigOptionsMap(): array protected function configure(): void { - $this->setName('ai-fill-in-readme-md-template') - ->setDescription('Filling the readme file template with data using LLMs tools'); + $this->setName(self::NAME) + ->setDescription('Leverage AI to generate content for a project readme.md file.'); + $this->addSharedCommandOptions(false); } + /** - * @throws DependencyException - * @throws ReflectionException * @throws NotFoundException + * @throws GuzzleException + * @throws ReflectionException + * @throws DependencyException * @throws InvalidConfigurationParameterException + * @throws JsonException */ protected function execute( InputInterface $input, OutputInterface $output ): int { - $this->createDocGenInstance($input, $output)->fillInReadmeMdTemplate(); + $configuration = $this->getConfigurationFromInput($input); + + $provider = $this->getAIProvider($input, $configuration); + $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); + $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); + $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + + $this->createDocGenInstance($input, $output)->generateReadmeTemplate($provider, $apiKey, $model, $systemPrompt); return self::SUCCESS; } } diff --git a/src/AI/Console/GenerateTemplatesContentCommand.php b/src/AI/Console/GenerateTemplatesContentCommand.php new file mode 100644 index 00000000..9bcfabd0 --- /dev/null +++ b/src/AI/Console/GenerateTemplatesContentCommand.php @@ -0,0 +1,73 @@ + 'Path to the directory of the documented project', + 'templates_dir' => 'Path to directory with documentation templates', + 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', + ]; + } + + protected function configure(): void + { + $this->setName(self::NAME) + ->setDescription('Leverage AI to generate content for doc templates.'); + $this->addSharedCommandOptions(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int + * @throws DependencyException + * @throws GuzzleException + * @throws JsonException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + * @throws ReflectionException + */ + protected function execute( + InputInterface $input, + OutputInterface $output + ): int { + $configuration = $this->getConfigurationFromInput($input); + + $provider = $this->getAIProvider($input, $configuration); + $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); + $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); + + $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + $nonInteractive = (bool)$this->getValueFromOptionOrConfig( + $input, + $configuration, + 'non-interactive' + ); + + $docGen = $this->createDocGenInstance($input, $output); + $docGen->generateTemplatesContent($provider, $apiKey, $model, $nonInteractive, $systemPrompt); + return Command::SUCCESS; + } +} diff --git a/src/AI/Console/InitDocsStructureCommand.php b/src/AI/Console/InitDocsStructureCommand.php new file mode 100644 index 00000000..786c0ba0 --- /dev/null +++ b/src/AI/Console/InitDocsStructureCommand.php @@ -0,0 +1,75 @@ + 'Path to the directory of the documented project', + 'templates_dir' => 'Path to directory with documentation templates', + 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', + ]; + } + + protected function configure(): void + { + $this->setName(self::NAME) + ->setDescription('Leverage AI to establish a documentation structure with empty files.'); + $this->addSharedCommandOptions(); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int + * @throws DependencyException + * @throws InvalidConfigurationParameterException + * @throws NotFoundException + * @throws GuzzleException + * @throws JsonException + */ + protected function execute( + InputInterface $input, + OutputInterface $output + ): int { + $configuration = $this->getConfigurationFromInput($input); + + $provider = $this->getAIProvider($input, $configuration); + $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); + $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); + + $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + $nonInteractive = (bool)$this->getValueFromOptionOrConfig( + $input, + $configuration, + 'non-interactive' + ); + $this->createDocGenInstance($input, $output)->initDocsStructure( + $provider, + $apiKey, + $model, + $nonInteractive, + $systemPrompt + ); + return self::SUCCESS; + } +} diff --git a/src/AI/Generators/MissingDocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php similarity index 97% rename from src/AI/Generators/MissingDocBlocksGenerator.php rename to src/AI/Generators/DocBlocksGenerator.php index 4c3523c7..8d95f56e 100644 --- a/src/AI/Generators/MissingDocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -14,7 +14,7 @@ use DI\DependencyException; use DI\NotFoundException; -final class MissingDocBlocksGenerator +final class DocBlocksGenerator { public const MODE_READ_ONLY_SIGNATURES = 1; public const MODE_READ_ALL_CODE = 2; @@ -54,6 +54,7 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo */ public function generateDocBlocksForMethodsWithoutIt( RootEntityInterface $rootEntity, + ?string $systemPrompt = null, int $mode = self::MODE_READ_ONLY_SIGNATURES, ): array { if (!is_a($rootEntity, ClassEntity::class)) { @@ -150,7 +151,9 @@ public function generateDocBlocksForMethodsWithoutIt( $toRequest ) . "\n}"; - $systemPrompt = $this->aiHandler->getSystemPrompt('missingDocBlockGeneration'); + if ($systemPrompt === null) { + $systemPrompt = $this->aiHandler->getSystemPrompt('docBlockGeneration'); + } $prompts = [$requestData]; $responseData = $this->aiHandler->sendPrompts($prompts, $systemPrompt); $responseData = json_decode($responseData, true, 512, JSON_THROW_ON_ERROR); diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index eea807e3..e5f10d87 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -37,6 +37,7 @@ public function generateReadmeFileContent( array $entryPoints = [], ?string $composerJsonFile = null, ?string $additionalPrompt = null, + ?string $systemPrompt = null, ): string { if (!is_a($rootEntityCollection, ClassEntityCollection::class)) { throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities'); @@ -80,7 +81,9 @@ public function generateReadmeFileContent( $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); } - $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateFiller'); + if ($systemPrompt === null) { + $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateGeneration'); + } return $this->aiHandler->sendPrompts($prompts, $systemPrompt); } } diff --git a/src/AI/Generators/TemplateContentGenerator.php b/src/AI/Generators/TemplateContentGenerator.php new file mode 100644 index 00000000..bafb70dc --- /dev/null +++ b/src/AI/Generators/TemplateContentGenerator.php @@ -0,0 +1,152 @@ +getMethodStubs($fileNamespaces, $entitiesCollection); + $prompts[] = $this->aiHandler->formatDataPrompt( + 'Method Stubs', + $methodStubs + ); + + if ($additionalPrompt) { + $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); + } + + $prompts[] = ' Produce content for an "index.twig" file titled "' . $fileName . '"'; + + if ($systemPrompt === null) { + $systemPrompt = $this->aiHandler->getSystemPrompt('templateContentGeneration'); + } else { + $systemPrompt = file_get_contents($systemPrompt); + } + + $aiContent = $this->aiHandler->sendPrompts($prompts, $systemPrompt); + + return $fileContent . "\n" . $aiContent; + } + + /** + * @throws ReflectionException + * @throws InvalidConfigurationParameterException + */ + private function getEntities(ClassEntityCollection|array $entitiesCollection): \Generator + { + foreach ($entitiesCollection as $classEntity) { + /**@var ClassEntity $classEntity */ + if ( + !$classEntity->entityDataCanBeLoaded() || array_key_exists( + $classEntity->getName(), + $this->alreadyProcessedEntities + ) + ) { + continue; + } + $interfaces = $classEntity->getInterfacesEntities(); + if ($interfaces) { + yield from $this->getEntities($interfaces); + } + $parentClass = $classEntity->getParentClass(); + if ($parentClass) { + yield from $this->getEntities([$parentClass]); + } + $this->alreadyProcessedEntities[$classEntity->getName()] = 1; + yield $classEntity; + } + } + + /** + * @throws ReflectionException + * @throws DependencyException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + private function getMethodStubs( + array $fileNamespaces, + ?ClassEntityCollection $entitiesCollection + ): string { + $tree = []; + $this->alreadyProcessedEntities = []; + + foreach ($this->getEntities($entitiesCollection) as $entity) { + $nsCheck = in_array($entity->getNamespaceName(), $fileNamespaces, true); + if ($nsCheck) { + $methods = $entity->getMethodEntityCollection(); + $simpleEntityName = $this->getSimpleEntityName($entity->getName()); + foreach ($methods as $method) { + /** @var MethodEntity $method */ + $methodString = $method->getName() . '(' . $method->getParametersString() . ')'; + $description = $method->getDescription(); + + if (!isset($tree[$entity->getNamespaceName()])) { + $tree[$entity->getNamespaceName()] = []; + } + + if (!isset($tree[$entity->getNamespaceName()][$simpleEntityName])) { + $tree[$entity->getNamespaceName()][$simpleEntityName] = []; + } + + $tree[$entity->getNamespaceName()][$simpleEntityName][$methodString] = $description; + } + } + } + return $this->treeToText($tree); + } + + private function getSimpleEntityName(string $fullEntityName): string + { + $parts = explode('\\', $fullEntityName); + return end($parts); + } + + private function treeToText(array $tree, $indentLevel = 0): string + { + $text = ''; + $indent = str_repeat(' ', $indentLevel); + + foreach ($tree as $key => $value) { + if (is_array($value)) { + $text .= $indent . $key . ":\n"; + $text .= $this->treeToText($value, $indentLevel + 1); + } else { + $text .= $indent . $key . ": " . $value . "\n"; + } + } + + return $text; + } +} diff --git a/src/AI/Generators/TemplateGenerator.php b/src/AI/Generators/TemplateGenerator.php deleted file mode 100644 index 35534462..00000000 --- a/src/AI/Generators/TemplateGenerator.php +++ /dev/null @@ -1,200 +0,0 @@ -getMethodStubs($filePath, $entitiesCollection); - $directoryStructure = $this->getDirectoryStructure($filePath); - - if (strlen($fileContent) > self::FILE_LENGTH_EXISTING_CONTENT) { - return $fileContent; //todo: better way to not generate already existing content - } - $prompts[] = $this->aiHandler->formatDataPrompt( - 'Method Stubs', - implode( - "\n", - $methodStubs - ) - ); - $prompts[] = $this->aiHandler->formatDataPrompt( - 'Directory Structure', - json_encode( - $directoryStructure, - JSON_THROW_ON_ERROR - ) - ); - if ($additionalPrompt) { - $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); - } - - $prompts[] = 'Generate the documentation content for ' . $this->getFileSubPathFromPath( - $filePath - ); - - $systemPrompt = $this->aiHandler->getSystemPrompt('templateGeneration'); - - $aiContent = $this->aiHandler->sendPrompts($prompts, $systemPrompt); - - return $fileContent . "\n" . $aiContent; - } - - private function isNamespaceChildOrSame(string $namespace1, string $namespace2): bool - { - // If namespaces are exactly the same - if ($namespace1 === $namespace2) { - return true; - } - - if (str_starts_with($namespace2, $namespace1 . '\\')) { - $remainder = substr($namespace2, strlen($namespace1) + 1); - if (!str_contains($remainder, '\\')) { - return true; - } - } - - return false; - } - - private function getNamespaceFromPath(string $path): ?string - { - $namespaceStart = 'templates/tech/'; - - $startPosition = strpos($path, $namespaceStart); - - if ($startPosition === false) { - return null; - } - - $namespacePart = substr($path, $startPosition + strlen($namespaceStart)); - $namespace = dirname($namespacePart); - - return "BumbleDocGen\\" . str_replace('/', '\\', $namespace); //todo: fix that i'm passing BumbleDocGen - } - - public function getFileSubPathFromPath(string $path): ?string - { - $subPathStart = 'templates/tech/'; - - $startPosition = strpos($path, $subPathStart); - - if ($startPosition === false) { - return null; - } - - return substr($path, $startPosition + strlen($subPathStart)); - } - - private function getDirectoryStructure($path, $parent = ''): array - { - $data = []; - - // If a file path is provided, get its directory. - if (!is_dir($path)) { - $parent .= '/' . basename(dirname($path)); - $path = dirname($path); - } - - $items = new DirectoryIterator($path); - foreach ($items as $item) { - if (!$item->isDot()) { - $currentPath = $parent . '/' . $item->getFilename(); - if ($item->isDir()) { - $data[$currentPath] = $this->getDirectoryStructure($item->getPathname(), $currentPath); - } else { - $data[$currentPath] = $currentPath; - } - } - } - - return $data; - } - - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - private function getEntities(ClassEntityCollection|array $entitiesCollection): \Generator - { - foreach ($entitiesCollection as $classEntity) { - /**@var ClassEntity $classEntity */ - if ( - !$classEntity->entityDataCanBeLoaded() || array_key_exists( - $classEntity->getName(), - $this->alreadyProcessedEntities - ) - ) { - continue; - } - $interfaces = $classEntity->getInterfacesEntities(); - if ($interfaces) { - yield from $this->getEntities($interfaces); - } - $parentClass = $classEntity->getParentClass(); - if ($parentClass) { - yield from $this->getEntities([$parentClass]); - } - $this->alreadyProcessedEntities[$classEntity->getName()] = 1; - yield $classEntity; - } - } - - /** - * @throws ReflectionException - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - private function getMethodStubs(string $filePath, ?ClassEntityCollection $entitiesCollection): array - { - $namespace = $this->getNamespaceFromPath($filePath); - $methodStubs = []; - foreach ($this->getEntities($entitiesCollection) as $entity) { - $nsCheck = $this->isNamespaceChildOrSame($namespace, $entity->getNamespaceName()); - if ($nsCheck) { - $methods = $entity->getMethodEntityCollection(); - foreach ($methods as $method) { - /** @var MethodEntity $method */ - $methodStubs[] = $entity->getName() . ' function ' . $method->getName( - ) . '(' . $method->getParametersString() . ') # ' . $method->getDescription(); - } - } - } - return $methodStubs; - } -} diff --git a/src/AI/Generators/TemplatesStructureGenerator.php b/src/AI/Generators/TemplateStructureGenerator.php similarity index 78% rename from src/AI/Generators/TemplatesStructureGenerator.php rename to src/AI/Generators/TemplateStructureGenerator.php index b372a2b2..85b4217e 100644 --- a/src/AI/Generators/TemplatesStructureGenerator.php +++ b/src/AI/Generators/TemplateStructureGenerator.php @@ -12,9 +12,9 @@ use BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException; use JsonException; -final class TemplatesStructureGenerator +final class TemplateStructureGenerator { - public function __construct(private ProviderInterface $aiHandler) + public function __construct(private ProviderInterface $aiHandler, private string $aiConfigDirectory) { } @@ -26,6 +26,7 @@ public function __construct(private ProviderInterface $aiHandler) public function generateStructureByEntityCollection( RootEntityCollection $rootEntityCollection, ?string $additionalPrompt = null, + ?string $systemPrompt = null, ): array { if (!is_a($rootEntityCollection, ClassEntityCollection::class)) { throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities'); @@ -45,7 +46,9 @@ public function generateStructureByEntityCollection( ) ); - $systemPrompt = $this->aiHandler->getSystemPrompt('structureGeneration'); + if ($systemPrompt === null) { + $systemPrompt = $this->aiHandler->getSystemPrompt('templateStructureGeneration'); + } if ($additionalPrompt) { $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); @@ -53,16 +56,19 @@ public function generateStructureByEntityCollection( $content = $this->aiHandler->sendPrompts($prompts, $systemPrompt); + file_put_contents($this->aiConfigDirectory . '/structure.json', $content); + $structure = json_decode($content, true, 512, JSON_THROW_ON_ERROR); + $finalStructure = [ "/readme.md.twig" => "About the project", ]; - foreach ($structure as $dir => $docName) { - $finalStructure["/tech{$dir}/index.md.twig"] = $docName; + foreach ($structure as $dir => $info) { + $finalStructure["/tech{$dir}index.md.twig"] = $info['name']; } - $finalStructure["/tech/index.md.twig"] = "Description of the technical part of the project"; + $finalStructure["/tech/index.md.twig"] = "Technical Overview"; return $finalStructure; } } diff --git a/src/AI/Prompts/missingDocBlockGeneration b/src/AI/Prompts/docBlockGeneration similarity index 100% rename from src/AI/Prompts/missingDocBlockGeneration rename to src/AI/Prompts/docBlockGeneration diff --git a/src/AI/Prompts/readmeTemplateFiller b/src/AI/Prompts/readmeTemplateGeneration similarity index 100% rename from src/AI/Prompts/readmeTemplateFiller rename to src/AI/Prompts/readmeTemplateGeneration diff --git a/src/AI/Prompts/structureGeneration b/src/AI/Prompts/structureGeneration deleted file mode 100644 index dd55f1b5..00000000 --- a/src/AI/Prompts/structureGeneration +++ /dev/null @@ -1,9 +0,0 @@ -You are a documentation generator. -You will be given a list of PHP namespaces. You need to return a file structure for documentation using these namespaces. -You should logically group the documentation files by namespaces, keeping the final structure concise and understandable. -You don't need to make the documentation structure exactly the same as the list of namespaces, you can combine them. -You need to exclude the top level namespace from the directory structure. -You should respond in JSON. An example response would be: -""" -{"/tech": "Technical description", "/tech/events": "Events to call", "/tech/modules": "Project modules", "/tech/modules/module1": "Description of the module1"} -""" diff --git a/src/AI/Prompts/templateContentGeneration b/src/AI/Prompts/templateContentGeneration new file mode 100644 index 00000000..e29cfae1 --- /dev/null +++ b/src/AI/Prompts/templateContentGeneration @@ -0,0 +1 @@ +You're tasked with generating an overview of the technical documentation from class names within a namespace. For each class, provide a brief high-level description of its purpose and responsibilities. Do not delve into specific methods or properties. Link to detailed class documentation using: \Namespace\ClassName. diff --git a/src/AI/Prompts/templateGeneration b/src/AI/Prompts/templateGeneration deleted file mode 100644 index fc73d74c..00000000 --- a/src/AI/Prompts/templateGeneration +++ /dev/null @@ -1,7 +0,0 @@ -You are a documentation generator. -You will be provided with method stubs and an existing directory structure for the section of documentation you are generating. -You must create a general description the class you are documenting and detailed description of the methods of the class. -You should create examples of how to use the class, in PHP. -If a link exists in the provided directory structure to a subclass, you should link to it. If it doesn't exist, include it in the documentation. -You can provide links to subclasses of the class using this format: \Namespace\ClassName -You will output the response in Twig without using "```twig [CONTENT]```" diff --git a/src/AI/Prompts/templateStructureGeneration b/src/AI/Prompts/templateStructureGeneration new file mode 100644 index 00000000..6771727b --- /dev/null +++ b/src/AI/Prompts/templateStructureGeneration @@ -0,0 +1,18 @@ +Given a list of PHP namespaces, generate a JSON representation of a condensed documentation file structure based on the criteria below: + - Group related namespaces. + - Exclude the top-level namespace. + - Represent each path with associated metadata: a human-readable name and a list of related namespaces. + +Return the response in pure JSON format only, without any markdown or additional context. + +Example Output: +{ + "/tech/": { + "name": "Technical description", + "namespaces": ["\Namespace\Tech"] + }, + "/tech/events/": { + "name": "Events to call", + "namespaces": ["\Namespace\Tech\Events", "\Namespace\Tech\Events\Listener"] + } +} diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index ccab08e6..3cc551b2 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -9,20 +9,15 @@ final class ProviderFactory { - public static function create(): ProviderInterface + private const VALID_PROVIDERS = [OpenAIProvider::NAME]; + + public static function create(string $handler, string $apiKey, string $model): ProviderInterface { - $apiType = getenv('API_TYPE'); - switch ($apiType) { - case 'openai': - $apiKey = getenv('OPENAI_API_KEY'); - if (empty($apiKey)) { - throw new RuntimeException("Environment variable OPENAI_API_KEY not set!"); - } - return new OpenAIProvider($apiKey); - default: - throw new RuntimeException( - "Environment variable API_TYPE not set to valid option (huggingface, openai, ollama)!", - ); - } + return match ($handler) { + OpenAIProvider::NAME => new OpenAIProvider($apiKey, $model), + default => throw new RuntimeException( + "Parameter 'ai-handler' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!", + ), + }; } } diff --git a/src/AI/Providers/OpenAI/Provider.php b/src/AI/Providers/OpenAI/Provider.php index 665f1087..f8364932 100644 --- a/src/AI/Providers/OpenAI/Provider.php +++ b/src/AI/Providers/OpenAI/Provider.php @@ -7,26 +7,30 @@ use BumbleDocGen\AI\ProviderInterface; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; +use JsonException; use RuntimeException; final class Provider implements ProviderInterface { + private const API_ENDPOINT = 'https://api.openai.com/v1/chat/completions'; + private const API_MODEL_ENDPOINT = 'https://api.openai.com/v1/models'; + private const DATA_SEPARATOR = '"""'; + public const NAME = 'openai'; private Client $client; - private string $endpoint; + private ?string $model; private float $temperature; private float $frequencyPenalty; private ?int $maxTokens; private int $topP; - private string $model; - private const DATA_SEPARATOR = '"""'; - public function __construct($bearerToken) + public function __construct(string $bearerToken, ?string $model) { $headers = [ 'Authorization' => 'Bearer ' . $bearerToken ]; - $organisation = getenv('OPENAI_ORG') ?: null; + //todo: pass through in config + $organisation = null; if ($organisation !== null) { $headers['OpenAI-Organization'] = $organisation; } @@ -37,17 +41,16 @@ public function __construct($bearerToken) ] ); $this->client = $client; - $this->endpoint = getenv('OPENAI_ENDPOINT') ?: 'https://api.openai.com/v1/chat/completions'; - $this->temperature = getenv('OPENAI_TEMPERATURE') ?: 0.7; - $this->model = getenv('OPENAI_GPT_MODEL') ?: 'gpt-3.5-turbo'; - $this->frequencyPenalty = getenv('OPENAI_FREQUENCY_PENALTY') ?: 0; - $this->maxTokens = getenv('OPENAI_MAX_TOKENS') ?: null; - $this->topP = getenv('OPENAI_TOP_P') ?: 1; + $this->model = $model; + $this->temperature = 0.5; + $this->frequencyPenalty = 0; + $this->maxTokens = null; + $this->topP = 1; } public function getName(): string { - return 'OpenAI'; + return self::NAME; } public function sendPrompts(array $prompts, string $system): string @@ -65,7 +68,7 @@ public function sendPrompts(array $prompts, string $system): string } try { - $response = $this->client->request('POST', $this->endpoint, [ + $response = $this->client->request('POST', self::API_ENDPOINT, [ 'json' => $requestData, ]); @@ -83,7 +86,7 @@ public function sendPrompts(array $prompts, string $system): string throw new RuntimeException('Generated text not found in response'); } catch (GuzzleException $e) { throw new RuntimeException('[' . $e->getCode() . ']' . $e->getMessage()); - } catch (\JsonException $e) { + } catch (JsonException $e) { throw new RuntimeException( '[' . $e->getCode() . '] Failed to decode JSON response: ' . $e->getMessage() ); @@ -92,9 +95,33 @@ public function sendPrompts(array $prompts, string $system): string public function getSystemPrompt(string $fileName): string { - $systemPrompt = getenv('PROMPT_' . $fileName) ?: null; - return $systemPrompt ?? file_get_contents(__DIR__ . '../Prompts/' . $fileName); + return file_get_contents(dirname(__DIR__) . '/../Prompts/' . $fileName); } + + public function formatDataPrompt(string $title, string $content): string + { + return $title . ": \n" . self::DATA_SEPARATOR . "\n" . $content . "\n" . self::DATA_SEPARATOR; + } + + /** + * @throws GuzzleException + * @throws JsonException + */ + public function getAvailableModels(): array + { + $response = $this->client->request('GET', self::API_MODEL_ENDPOINT); + $data = json_decode($response->getBody()->getContents(), true, 512, JSON_THROW_ON_ERROR); + // Order by 'created' field in descending order + usort($data['data'], function ($a, $b) { + return $b['created'] <=> $a['created']; + }); + $models = []; + foreach ($data['data'] as $model) { + $models[] = $model['id']; + } + return $models; + } + private function createMessage(string $role, string $content): \stdClass { $message = new \stdClass(); @@ -103,11 +130,6 @@ private function createMessage(string $role, string $content): \stdClass return $message; } - public function formatDataPrompt(string $title, string $content): string - { - return $title . ": \n" . self::DATA_SEPARATOR . "\n" . $content . "\n" . self::DATA_SEPARATOR; - } - private function createMessages(array $prompts, string $system): array { $messages = []; diff --git a/src/AI/Traits/SharedCommandLogicTrait.php b/src/AI/Traits/SharedCommandLogicTrait.php new file mode 100644 index 00000000..bce2f3cf --- /dev/null +++ b/src/AI/Traits/SharedCommandLogicTrait.php @@ -0,0 +1,131 @@ +createConfiguration($input->getOption('config')); + } + + protected function addSharedCommandOptions($nonInteractiveAvailable = true): void + { + if ($nonInteractiveAvailable) { + $this->addOption( + 'non-interactive', + '', + InputOption::VALUE_NONE, + "Use non-interactive mode, doesn't prompt for additional information.", + ); + } + $this->addOption( + 'provider', + '', + InputOption::VALUE_REQUIRED, + 'The AI service to use, options: openai', + ); + $this->addOption( + 'api-key', + '', + InputOption::VALUE_REQUIRED, + 'The API key to use when interacting with the AI', + ); + $this->addOption( + 'model', + '', + InputOption::VALUE_OPTIONAL, + 'The AI model to use', + ); + $this->addOption( + 'system-prompt', + '', + InputOption::VALUE_OPTIONAL, + 'A path to a file containing the system prompt, defaults available in `src/AI/Prompts`', + ); + } + + protected function getAIProvider(InputInterface $input, Configuration $configuration): string + { + $handler = $this->getValueFromOptionOrConfig($input, $configuration, 'provider'); + if (empty($handler)) { + $handler = OpenAIProvider::NAME; + } + return $handler; + } + + protected function getAIApiKey( + InputInterface $input, + OutputInterface $output, + Configuration $configuration, + string $provider + ) { + $apiKey = $this->getValueFromOptionOrConfig($input, $configuration, 'api-key'); + if (empty($apiKey) && $provider === OpenAIProvider::NAME) { + $question = new Question('Please provide the API key: '); + $helper = $this->getHelper('question'); + $apiKey = $helper->ask($input, $output, $question); + } + return $apiKey; + } + + /** + * @throws GuzzleException + * @throws JsonException + */ + protected function getAIModel( + InputInterface $input, + OutputInterface $output, + Configuration $configuration, + string $provider, + string $apiKey, + ): string { + $model = $this->getValueFromOptionOrConfig($input, $configuration, 'model'); + if (empty($model) && $provider === OpenAIProvider::NAME) { + $openAiProvider = new OpenAIProvider($apiKey, null); + $models = $openAiProvider->getAvailableModels(); + + $question = new ChoiceQuestion( + 'Please choose one of the available models:', + $models, + 0 + ); + $question->setErrorMessage('Model %s is invalid.'); + + $helper = $this->getHelper('question'); + $model = $helper->ask($input, $output, $question); + } + return $model; + } + + protected function getValueFromOptionOrConfig( + InputInterface $input, + Configuration $configuration, + $key + ): string|bool|null { + $value = $input->getOption($key); + if ($value) { + return $value; + } + $aiConfig = $configuration->getAIConfig(); + $key = str_replace('-', '_', $key); + return $aiConfig[$key] ?? null; + } +} diff --git a/src/Console/App.php b/src/Console/App.php index 28ee02e4..58819ef8 100644 --- a/src/Console/App.php +++ b/src/Console/App.php @@ -4,10 +4,11 @@ namespace BumbleDocGen\Console; -use BumbleDocGen\Console\Command\AddMissingDocBlocksCommand; -use BumbleDocGen\Console\Command\FillInReadmeMdTemplateCommand; +use BumbleDocGen\AI\Console\AddDocBlocksCommand; +use BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand; +use BumbleDocGen\AI\Console\InitDocsStructureCommand; +use BumbleDocGen\AI\Console\GenerateTemplatesContentCommand; use BumbleDocGen\Console\Command\GenerateCommand; -use BumbleDocGen\Console\Command\GenerateProjectTemplatesStructureCommand; use BumbleDocGen\DocGeneratorFactory; use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\CompleteCommand; @@ -33,9 +34,10 @@ public function __construct() ); $this->setDefinition($inputDefinition); $this->add(new GenerateCommand()); - $this->add(new FillInReadmeMdTemplateCommand()); - $this->add(new AddMissingDocBlocksCommand()); - $this->add(new GenerateProjectTemplatesStructureCommand()); + $this->add(new GenerateReadMeTemplateCommand()); + $this->add(new AddDocBlocksCommand()); + $this->add(new InitDocsStructureCommand()); + $this->add(new GenerateTemplatesContentCommand()); $this->setExtraCommands(); } diff --git a/src/Console/Command/AddMissingDocBlocksCommand.php b/src/Console/Command/AddMissingDocBlocksCommand.php deleted file mode 100644 index 66bcd595..00000000 --- a/src/Console/Command/AddMissingDocBlocksCommand.php +++ /dev/null @@ -1,43 +0,0 @@ - 'Path to the directory of the documented project', - 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', - ]; - } - - protected function configure(): void - { - $this->setName('ai-add-missing-doc-blocks') - ->setDescription('Add missing doc blocks in documented code using LLMs tools'); - } - - /** - * @throws DependencyException - * @throws ReflectionException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - protected function execute( - InputInterface $input, - OutputInterface $output - ): int { - $this->createDocGenInstance($input, $output)->addMissingDocBlocks(); - return self::SUCCESS; - } -} diff --git a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php b/src/Console/Command/GenerateProjectTemplatesStructureCommand.php deleted file mode 100644 index e54a828f..00000000 --- a/src/Console/Command/GenerateProjectTemplatesStructureCommand.php +++ /dev/null @@ -1,44 +0,0 @@ - 'Path to the directory of the documented project', - 'templates_dir' => 'Path to directory with documentation templates', - 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', - ]; - } - - protected function configure(): void - { - $this->setName('ai-generate-project-templates-structure') - ->setDescription('Generate empty documentation templates for a documented project using LLMs tools'); - } - - /** - * @throws DependencyException - * @throws ReflectionException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - protected function execute( - InputInterface $input, - OutputInterface $output - ): int { - $this->createDocGenInstance($input, $output)->generateProjectTemplatesStructure(); - return self::SUCCESS; - } -} diff --git a/src/Core/Configuration/Configuration.php b/src/Core/Configuration/Configuration.php index 913273b1..4cdb75a9 100644 --- a/src/Core/Configuration/Configuration.php +++ b/src/Core/Configuration/Configuration.php @@ -98,6 +98,27 @@ public function getTemplatesDir(): string return $templatesDir; } + public function getAiDataDir(): string + { + $dataDir = $this->parameterBag->getSubConfigurationParameterBag('ai')->validateAndGetStringValue( + 'data_dir', + false + ); + $parentDir = dirname($dataDir); + if (!$parentDir || !is_dir($parentDir)) { + throw new InvalidConfigurationParameterException( + "`ai:data_dir` cannot be created because parent directory `{$parentDir}` does not exist" + ); + } + if (!file_exists($dataDir)) { + $this->logger->notice("Creating `{$dataDir}` directory"); + mkdir($dataDir); + } + $dataDir = realpath($dataDir); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $dataDir); + return $dataDir; + } + /** * @throws InvalidConfigurationParameterException */ @@ -355,4 +376,18 @@ public function getAdditionalConsoleCommands(): AdditionalCommandCollection $this->localObjectCache->cacheMethodResult(__METHOD__, '', $additionalCommandCollection); return $additionalCommandCollection; } + + public function getAIConfig(): array + { + try { + return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + } catch (ObjectNotFoundException) { + } + if (!$this->parameterBag->has('ai')) { + return []; + } + $aiConfig = $this->parameterBag->get('ai', false); + $this->localObjectCache->cacheMethodResult(__METHOD__, '', $aiConfig); + return $aiConfig; + } } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 401d6eaa..5af60242 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -4,10 +4,10 @@ namespace BumbleDocGen; -use BumbleDocGen\AI\Generators\MissingDocBlocksGenerator; +use BumbleDocGen\AI\Generators\DocBlocksGenerator; use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; -use BumbleDocGen\AI\Generators\TemplateGenerator; -use BumbleDocGen\AI\Generators\TemplatesStructureGenerator; +use BumbleDocGen\AI\Generators\TemplateContentGenerator; +use BumbleDocGen\AI\Generators\TemplateStructureGenerator; use BumbleDocGen\AI\ProviderFactory; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; @@ -25,6 +25,7 @@ use DI\NotFoundException; use Exception; use Generator; +use JsonException; use Monolog\Logger; use Psr\Cache\InvalidArgumentException; use Symfony\Component\Console\Formatter\OutputFormatterStyle; @@ -77,36 +78,49 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr /** * Generate documentation structure with blank templates using AI tools * - * @throws NotFoundException - * @throws ReflectionException - * @throws DependencyException * @throws InvalidConfigurationParameterException */ - public function generateProjectTemplatesStructure(): void - { + public function initDocsStructure( + string $aiHandler, + string $aiApiKey, + string $aiModel, + bool $nonInteractive = false, + ?string $systemPrompt = null, + ): void { $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $aiHandler = ProviderFactory::create(); - $templatesStructureGenerator = new TemplatesStructureGenerator($aiHandler); + $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); + $aiDirectory = $this->configuration->getAiDataDir(); + + $templatesStructureGenerator = new TemplateStructureGenerator($aiProvider, $aiDirectory); do { - $additionalPrompt = $this->io->ask( - 'Write instructions for more accurate template structure generation ( or just skip this step )' - ) ?: null; - $this->io->note("Sending " . $aiHandler->getName() . " request"); + if ($nonInteractive) { + $additionalPrompt = null; + } else { + $additionalPrompt = $this->io->ask( + 'Write instructions for more accurate template structure generation ( or just skip this step )' + ) ?: null; + } + $this->io->note("Sending " . $aiProvider->getName() . " request"); $structure = $templatesStructureGenerator->generateStructureByEntityCollection( $entitiesCollection, - $additionalPrompt + $additionalPrompt, + $systemPrompt ); $structureAsString = implode( "\n", array_map(fn($v, $k) => "{$k} => {$v}", $structure, array_keys($structure)) ); - $action = $this->io->choice( - "The proposed documentation structure is as follows:\n\n{$structureAsString}", - ['Save', 'Regenerate', 'Cancel'] - ); + if ($nonInteractive) { + $action = 'Save'; + } else { + $action = $this->io->choice( + "The proposed documentation structure is as follows:\n\n{$structureAsString}", + ['Save', 'Regenerate', 'Cancel'] + ); + } } while ($action === 'Regenerate'); if ($action === 'Save') { @@ -139,8 +153,12 @@ public function generateProjectTemplatesStructure(): void * @throws ReflectionException * @throws InvalidConfigurationParameterException */ - public function addMissingDocBlocks(): void - { + public function addDocBlocks( + string $aiHandler, + string $aiApiKey, + string $aiModel, + ?string $systemPrompt = null, + ): void { if (!$this->io->confirm("This command will change the source code of your project. Continue?")) { return; } @@ -148,9 +166,9 @@ public function addMissingDocBlocks(): void $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $aiHandler = ProviderFactory::create(); + $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); - $missingDocBlocksGenerator = new MissingDocBlocksGenerator($aiHandler, $this->parserHelper); + $missingDocBlocksGenerator = new DocBlocksGenerator($aiProvider, $this->parserHelper); $alreadyProcessedEntities = []; $getEntities = function (ClassEntityCollection|array $entitiesCollection) use ( @@ -190,7 +208,7 @@ public function addMissingDocBlocks(): void continue; } $this->logger->notice("Processing `{$entity->getName()}` class"); - $newBocBlocks = $missingDocBlocksGenerator->generateDocBlocksForMethodsWithoutIt($entity); + $newBocBlocks = $missingDocBlocksGenerator->generateDocBlocksForMethodsWithoutIt($entity, $systemPrompt); $classFileContent = $entity->getFileContent(); $toReplace = []; @@ -225,8 +243,12 @@ public function addMissingDocBlocks(): void * @throws NotFoundException * @throws InvalidConfigurationParameterException */ - public function fillInReadmeMdTemplate(): void - { + public function generateReadmeTemplate( + string $aiHandler, + string $aiApiKey, + string $aiModel, + ?string $systemPrompt = null, + ): void { $this->io->note("Project analysis"); $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); @@ -284,14 +306,15 @@ public function fillInReadmeMdTemplate(): void 'Write instructions for more accurate documentation generation ( or just skip this step )' ); - $aiHandler = ProviderFactory::create(); - $readmeTemplateFiller = new ReadmeTemplateGenerator($aiHandler); - $this->io->note("Sending " . $aiHandler->getName() . " request"); + $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); + $readmeTemplateFiller = new ReadmeTemplateGenerator($aiProvider); + $this->io->note("Sending " . $aiProvider->getName() . " request"); $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent( $entitiesCollection, $entryPoints, $composerJsonFile, - $additionalPrompt + $additionalPrompt, + $systemPrompt ); $fileContent = "{% set title = 'About the project' %}\n{$readmeFileContent}"; @@ -304,48 +327,60 @@ public function fillInReadmeMdTemplate(): void } } - public function generateProjectTemplates($interactive = true): void - { + /** + * @throws ReflectionException + * @throws DependencyException + * @throws JsonException + * @throws NotFoundException + * @throws InvalidConfigurationParameterException + */ + public function generateTemplatesContent( + string $aiHandler, + string $aiApiKey, + string $aiModel, + bool $nonInteractive = false, + ?string $systemPrompt = null, + ): void { $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - $aiHandler = ProviderFactory::create(); - $templateGenerator = new TemplateGenerator($aiHandler); - - $finder = new Finder(); - - $finder->files()->in($this->configuration->getTemplatesDir()); - foreach ($finder as $file) { - if ($file->getBasename() === 'readme.md.twig') { - continue; - } + $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); + $aiConfigDirectory = $this->configuration->getAiDataDir(); + $templateGenerator = new TemplateContentGenerator($aiProvider); + $aiStructure = file_get_contents($aiConfigDirectory . '/structure.json'); + $aiStructure = json_decode($aiStructure, true, 512, JSON_THROW_ON_ERROR); + foreach ($aiStructure as $path => $data) { + $template = $this->configuration->getTemplatesDir() . '/tech' . $path . 'index.md.twig'; do { $this->io->note( - 'Creating template for ' . $templateGenerator->getFileSubPathFromPath($file->getRealPath()) + 'Creating template for ' . $template ); - if ($interactive) { + if ($nonInteractive) { + $additionalPrompt = null; + } else { + $processThisTemplate = $this->io->choice( + 'Do you want to create this template?', + ['Yes', 'No'], + 'Yes' + ); + if ($processThisTemplate === 'No') { + continue(2); + } $additionalPrompt = $this->io->ask( 'Add additional information about this ( or just skip this step )' ) ?: null; - } else { - $additionalPrompt = null; } - $this->io->note("Sending " . $aiHandler->getName() . " request"); + $this->io->note("Sending " . $aiProvider->getName() . " request"); $content = $templateGenerator->generate( - $file->getRealPath(), - $file->getContents(), + $template, + $data['name'], + $data['namespaces'], $entitiesCollection, - $additionalPrompt + $additionalPrompt, + $systemPrompt, ); - if ($content === null) { - $this->io->note( - 'Template already exists for ' . $templateGenerator->getFileSubPathFromPath( - $file->getRealPath() - ) - ); - $action = 'Continue'; - } elseif ($interactive) { + if (!$nonInteractive) { $action = $this->io->choice( "The proposed documentation is as follows:\n\n{$content}", ['Save', 'Regenerate', 'Cancel'] @@ -357,9 +392,9 @@ public function generateProjectTemplates($interactive = true): void if ($action === 'Save') { $this->logger->notice( - 'Saving file: .' . $file->getRealPath() + 'Saving file: .' . $template ); - $this->fs->dumpFile($file->getRealPath(), $content); + $this->fs->dumpFile($template, $content); } } } From ad54d6834e409d333e35ba2d6cde245a43773fb1 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:59:03 +0000 Subject: [PATCH 23/33] Add demo templates --- .../templates/readme.md.twig | 1 + .../templates/tech/AI/index.md.twig | 47 +++++++++++++++++++ .../templates/tech/Console/index.md.twig | 34 ++++++++++++++ .../templates/tech/Core/Cache/index.md.twig | 25 ++++++++++ .../tech/Core/Configuration/index.md.twig | 2 + .../templates/tech/Core/Logger/index.md.twig | 2 + .../templates/tech/Core/Parser/index.md.twig | 2 + .../templates/tech/Core/Plugin/index.md.twig | 2 + .../tech/Core/Renderer/index.md.twig | 2 + .../tech/LanguageHandler/Php/index.md.twig | 2 + .../tech/LanguageHandler/index.md.twig | 2 + .../templates/tech/index.md.twig | 2 + 12 files changed, 123 insertions(+) create mode 100644 demo/demo7-template-content/templates/readme.md.twig create mode 100644 demo/demo7-template-content/templates/tech/AI/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Console/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig create mode 100644 demo/demo7-template-content/templates/tech/index.md.twig diff --git a/demo/demo7-template-content/templates/readme.md.twig b/demo/demo7-template-content/templates/readme.md.twig new file mode 100644 index 00000000..ba63f40c --- /dev/null +++ b/demo/demo7-template-content/templates/readme.md.twig @@ -0,0 +1 @@ +{% set title = 'About the project' %} diff --git a/demo/demo7-template-content/templates/tech/AI/index.md.twig b/demo/demo7-template-content/templates/tech/AI/index.md.twig new file mode 100644 index 00000000..0e08eef6 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/AI/index.md.twig @@ -0,0 +1,47 @@ +{% set title = 'Artificial Intelligence' %} +{{ generatePageBreadcrumbs(title, _self) }} + +# Artificial Intelligence + +This page contains the documentation for the classes and methods in the AI namespace. The AI namespace is broken down into several sub-namespaces, including `Console`, `Generators`, `Providers\OpenAI`, and the base `AI` namespace. + +## Console + +The `Console` sub-namespace contains command classes used in the console for various tasks. These classes are: + +- \BumbleDocGen\AI\Console\AddDocBlocksCommand +- \BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand +- \BumbleDocGen\AI\Console\GenerateTemplatesContentCommand +- \BumbleDocGen\AI\Console\InitDocsStructureCommand + +Each of these classes includes methods for managing console commands such as `addArgument`, `addOption`, `getAliases`, `getApplication`, and more. + +## Generators + +The `Generators` sub-namespace contains utility classes used for generating documentation. These classes include: + +- \BumbleDocGen\AI\Generators\MissingDocBlocksGenerator +- \BumbleDocGen\AI\Generators\ReadmeTemplateGenerator +- \BumbleDocGen\AI\Generators\TemplateGenerator +- \BumbleDocGen\AI\Generators\TemplatesStructureGenerator + +These classes host methods to compile and generate documentation blocks, README files, and template structures. + +## Providers + +The `Providers` sub-namespace comprises classes used to interface with external AI providers. Currently, the only AI provider implemented is `OpenAI`. + +- \BumbleDocGen\AI\Providers\OpenAI\Provider + +This class contains methods for interfacing with the OpenAI API, including methods for formatting data prompts, retrieving available models, and sending prompts to the AI. + +## Base AI Namespace + +The base AI namespace includes important classes for interacting with AI providers: + +- \BumbleDocGen\AI\ProviderFactory +- \BumbleDocGen\AI\ProviderInterface + +The `ProviderFactory` class is used to instantiate AI providers, while the `ProviderInterface` is an interface that all AI providers must implement. + +For detailed information about each class and its methods, refer to the specific class documentation page. \ No newline at end of file diff --git a/demo/demo7-template-content/templates/tech/Console/index.md.twig b/demo/demo7-template-content/templates/tech/Console/index.md.twig new file mode 100644 index 00000000..277b0659 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Console/index.md.twig @@ -0,0 +1,34 @@ +{% set title = 'Console Operations' %} +{{ generatePageBreadcrumbs(title, _self) }} + +# Console Operations + +## \BumbleDocGen\Console\Command + +### [BaseCommand](\Namespace\BaseCommand) + +This is the base class for all commands in the console application. It takes care of basic command operations such as argument and option manipulation, command description, and execution. + +### [AdditionalCommandCollection](\Namespace\AdditionalCommandCollection) + +This class manages a collection of additional commands. It provides methods for adding and iterating over the command objects. + +### [GenerateCommand](\Namespace\GenerateCommand) + +This class represents a specific console command that generates output based on provided arguments and options. + +## \BumbleDocGen\Console + +### [App](\Namespace\App) + +This class represents the console application itself. It provides a wide range of methods for command registration, execution, and lifecycle management. + +## \BumbleDocGen\Console\ProgressBar + +### [ProgressBarFactory](\Namespace\ProgressBarFactory) + +This class is a factory for creating stylized progress bars, which can be used to display progress information for long-running console commands. + +### [StylizedProgressBar](\Namespace\StylizedProgressBar) + +This class represents a stylized progress bar. It provides methods for managing the progress bar's appearance and updating its progress. diff --git a/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig new file mode 100644 index 00000000..caa81c5e --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig @@ -0,0 +1,25 @@ +{% set title = 'Core Cache' %} +{{ generatePageBreadcrumbs(title, _self) }} + +``` +

        Core Cache

        + +

        The Core Cache namespace consists of classes responsible for managing cache in the BumbleDocGen application. These classes provide functionality for persisting, retrieving, and removing cache items.

        + +

        Classes:

        + +

        EntityCacheItemPool

        +

        This class manages a collection of cache items. It provides methods for adding, deleting, and retrieving cache items, as well as for committing any deferred cache operations.

        + +

        SharedCompressedDocumentFileCache

        +

        This class is responsible for caching document files. It provides methods for getting, setting, and saving the cache, as well as for removing unused keys.

        + +

        SourceLocatorCacheItemPool

        +

        This class manages a collection of source locator cache items. Similar to the EntityCacheItemPool, it provides methods for adding, deleting, and retrieving cache items, and committing deferred cache operations.

        + +

        ObjectNotFoundException

        +

        This class defines an exception to be thrown when a requested object is not found in the cache. It extends the base PHP Exception class.

        + +

        LocalObjectCache

        +

        This class provides methods for caching and retrieving the results of method calls. This can help improve performance by avoiding the need for expensive or duplicate method calls.

        +``` diff --git a/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig new file mode 100644 index 00000000..8263468a --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Core Configuration' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig new file mode 100644 index 00000000..aed6b562 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Core Logger' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig new file mode 100644 index 00000000..9bdfa8fe --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Core Parser' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig new file mode 100644 index 00000000..94089fdd --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Core Plugin' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig new file mode 100644 index 00000000..c95e7b4a --- /dev/null +++ b/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Core Renderer' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig b/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig new file mode 100644 index 00000000..b52ecc33 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'PHP Language Handler' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig b/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig new file mode 100644 index 00000000..9943ec78 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Language Handler' %} +{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/index.md.twig b/demo/demo7-template-content/templates/tech/index.md.twig new file mode 100644 index 00000000..b5239b81 --- /dev/null +++ b/demo/demo7-template-content/templates/tech/index.md.twig @@ -0,0 +1,2 @@ +{% set title = 'Technical Overview' %} +{{ generatePageBreadcrumbs(title, _self) }} From 8c8fd304bba52b191187d922a18879082ee5f6fb Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:59:12 +0000 Subject: [PATCH 24/33] Add ai_data example --- .../ai_data/structure.json | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 demo/demo7-template-content/ai_data/structure.json diff --git a/demo/demo7-template-content/ai_data/structure.json b/demo/demo7-template-content/ai_data/structure.json new file mode 100644 index 00000000..c055bc50 --- /dev/null +++ b/demo/demo7-template-content/ai_data/structure.json @@ -0,0 +1,106 @@ +{ + "/AI/": { + "name": "Artificial Intelligence", + "namespaces": [ + "BumbleDocGen\\AI\\Console", + "BumbleDocGen\\AI\\Generators", + "BumbleDocGen\\AI", + "BumbleDocGen\\AI\\Providers\\OpenAI", + "BumbleDocGen\\AI\\Traits" + ] + }, + "/Console/": { + "name": "Console Operations", + "namespaces": [ + "BumbleDocGen\\Console", + "BumbleDocGen\\Console\\Command", + "BumbleDocGen\\Console\\ProgressBar" + ] + }, + "/Core/Cache/": { + "name": "Core Cache", + "namespaces": [ + "BumbleDocGen\\Core\\Cache", + "BumbleDocGen\\Core\\Cache\\LocalCache", + "BumbleDocGen\\Core\\Cache\\LocalCache\\Exception" + ] + }, + "/Core/Configuration/": { + "name": "Core Configuration", + "namespaces": [ + "BumbleDocGen\\Core\\Configuration", + "BumbleDocGen\\Core\\Configuration\\Exception", + "BumbleDocGen\\Core\\Configuration\\ValueResolver", + "BumbleDocGen\\Core\\Configuration\\ValueTransformer" + ] + }, + "/Core/Logger/": { + "name": "Core Logger", + "namespaces": ["BumbleDocGen\\Core\\Logger\\Handler"] + }, + "/Core/Parser/": { + "name": "Core Parser", + "namespaces": [ + "BumbleDocGen\\Core\\Parser", + "BumbleDocGen\\Core\\Parser\\Entity", + "BumbleDocGen\\Core\\Parser\\Entity\\Cache", + "BumbleDocGen\\Core\\Parser\\Entity\\Cache\\CacheKey", + "BumbleDocGen\\Core\\Parser\\Entity\\CollectionLogOperation", + "BumbleDocGen\\Core\\Parser\\FilterCondition", + "BumbleDocGen\\Core\\Parser\\FilterCondition\\CommonFilterCondition", + "BumbleDocGen\\Core\\Parser\\SourceLocator" + ] + }, + "/Core/Plugin/": { + "name": "Core Plugin", + "namespaces": [ + "BumbleDocGen\\Core\\Plugin", + "BumbleDocGen\\Core\\Plugin\\CorePlugin\\LastPageCommitter", + "BumbleDocGen\\Core\\Plugin\\CorePlugin\\PageLinker", + "BumbleDocGen\\Core\\Plugin\\Event\\Parser", + "BumbleDocGen\\Core\\Plugin\\Event\\Renderer" + ] + }, + "/Core/Renderer/": { + "name": "Core Renderer", + "namespaces": [ + "BumbleDocGen\\Core\\Renderer", + "BumbleDocGen\\Core\\Renderer\\Breadcrumbs", + "BumbleDocGen\\Core\\Renderer\\Context", + "BumbleDocGen\\Core\\Renderer\\Context\\Dependency", + "BumbleDocGen\\Core\\Renderer\\EntityDocRenderer", + "BumbleDocGen\\Core\\Renderer\\PageLinkProcessor", + "BumbleDocGen\\Core\\Renderer\\Twig", + "BumbleDocGen\\Core\\Renderer\\Twig\\Filter", + "BumbleDocGen\\Core\\Renderer\\Twig\\Function" + ] + }, + "/LanguageHandler/": { + "name": "Language Handler", + "namespaces": ["BumbleDocGen\\LanguageHandler"] + }, + "/LanguageHandler/Php/": { + "name": "PHP Language Handler", + "namespaces": [ + "BumbleDocGen\\LanguageHandler\\Php", + "BumbleDocGen\\LanguageHandler\\Php\\Parser", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Cache", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Exception", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Reflection", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\ClassConstantFilterCondition", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\ClassFilterCondition", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\MethodFilterCondition", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\PropertyFilterCondition", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\SourceLocator", + "BumbleDocGen\\LanguageHandler\\Php\\Parser\\SourceLocator\\Internal", + "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\CorePlugin\\BasePhpStubber", + "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\CorePlugin\\EntityDocUnifiedPlace", + "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\Event\\Entity", + "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\Event\\Parser", + "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\EntityDocRenderer", + "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\EntityDocRenderer\\PhpClassToMd", + "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\Twig\\Function" + ] + } +} \ No newline at end of file From 6ec863ceead3f43ae290b6a0b1c2b02c9bb273a6 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Mon, 30 Oct 2023 23:59:27 +0000 Subject: [PATCH 25/33] Increase allowed length of git commit body line --- captainhook.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/captainhook.json b/captainhook.json index 665aed09..edee41bd 100644 --- a/captainhook.json +++ b/captainhook.json @@ -6,7 +6,7 @@ "action": "\\CaptainHook\\App\\Hook\\Message\\Action\\Beams", "options": { "subjectLength": 50, - "bodyLineLength": 72 + "bodyLineLength": 200 } } ] From aa5bb00258bb5f560fbcf46f9e68e499a1500b13 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 11:21:25 +0000 Subject: [PATCH 26/33] Update documentation after merge --- docs/README.md | 2 +- docs/classes/DocGenerator.md | 259 ++- docs/shared_c.cache | 2 +- .../1.configuration/classes/Configuration.md | 76 +- .../classes/PageLinkerPlugin.md | 216 +++ docs/tech/1.configuration/readme.md | 4 +- docs/tech/2.parser/entity.md | 2 +- docs/tech/2.parser/entityFilterCondition.md | 2 +- docs/tech/2.parser/readme.md | 2 +- docs/tech/2.parser/sourceLocator.md | 2 +- docs/tech/3.renderer/01_templates.md | 2 +- docs/tech/3.renderer/02_breadcrumbs.md | 2 +- docs/tech/3.renderer/03_documentStructure.md | 2 +- docs/tech/3.renderer/04_twigCustomFilters.md | 2 +- .../tech/3.renderer/05_twigCustomFunctions.md | 2 +- docs/tech/3.renderer/readme.md | 2 +- .../tech/3.renderer/templatesDynamicBlocks.md | 2 +- docs/tech/3.renderer/templatesLinking.md | 2 +- docs/tech/3.renderer/templatesVariables.md | 2 +- .../classes/PageLinkerPlugin.md | 216 +++ docs/tech/4.pluginSystem/readme.md | 19 +- ...ctureCommand.md => AddDocBlocksCommand.md} | 17 +- docs/tech/classes/App.md | 4 +- docs/tech/classes/Configuration.md | 76 +- ...ocksGenerator.md => DocBlocksGenerator.md} | 23 +- docs/tech/classes/DocGenerator.md | 259 ++- ...nd.md => GenerateReadMeTemplateCommand.md} | 17 +- .../GenerateTemplatesContentCommand.md | 1393 +++++++++++++++++ ...Command.md => InitDocsStructureCommand.md} | 17 +- docs/tech/classes/PageLinkerPlugin.md | 216 +++ docs/tech/classes/Provider.md | 179 +-- docs/tech/classes/ProviderFactory.md | 33 +- docs/tech/classes/ProviderInterface.md | 134 +- docs/tech/classes/Provider_2.md | 338 ---- docs/tech/classes/Provider_3.md | 323 ---- docs/tech/classes/ReadmeTemplateGenerator.md | 7 +- ...torTrait.md => SharedCommandLogicTrait.md} | 6 +- ...nerator.md => TemplateContentGenerator.md} | 65 +- ...rator.md => TemplateStructureGenerator.md} | 27 +- docs/tech/map.md | 27 +- docs/tech/readme.md | 2 +- 41 files changed, 2851 insertions(+), 1132 deletions(-) create mode 100644 docs/tech/1.configuration/classes/PageLinkerPlugin.md create mode 100644 docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md rename docs/tech/classes/{GenerateProjectTemplatesStructureCommand.md => AddDocBlocksCommand.md} (98%) rename docs/tech/classes/{MissingDocBlocksGenerator.md => DocBlocksGenerator.md} (84%) rename docs/tech/classes/{FillInReadmeMdTemplateCommand.md => GenerateReadMeTemplateCommand.md} (98%) create mode 100644 docs/tech/classes/GenerateTemplatesContentCommand.md rename docs/tech/classes/{AddMissingDocBlocksCommand.md => InitDocsStructureCommand.md} (98%) create mode 100644 docs/tech/classes/PageLinkerPlugin.md delete mode 100644 docs/tech/classes/Provider_2.md delete mode 100644 docs/tech/classes/Provider_3.md rename docs/tech/classes/{JsonExtractorTrait.md => SharedCommandLogicTrait.md} (70%) rename docs/tech/classes/{TemplateGenerator.md => TemplateContentGenerator.md} (71%) rename docs/tech/classes/{TemplatesStructureGenerator.md => TemplateStructureGenerator.md} (74%) diff --git a/docs/README.md b/docs/README.md index 78b1a9de..fdf78ebd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -95,4 +95,4 @@ To update this documentation, run the following command:

        -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Fri Oct 27 15:10:16 2023 +0300
        Page content update date: Fri Oct 27 2023
        Made with Bumble Documentation Generator
        \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
        Last modified date: Sat Oct 28 11:03:31 2023 +0300
        Page content update date: Tue Oct 31 2023
        Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index d0b00cfe..bba7b522 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

        - DocGenerator class: + DocGenerator class:

        @@ -34,16 +34,19 @@ final class DocGenerator
        1. - addMissingDocBlocks + addDocBlocks - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
        2. -
        3. - fillInReadmeMdTemplate -
        4. generate - Generates documentation using configuration
        5. - generateProjectTemplatesStructure + generateReadmeTemplate +
        6. +
        7. + generateTemplatesContent +
        8. +
        9. + initDocsStructure - Generate documentation structure with blank templates using AI tools
        10. parseAndGetRootEntityCollectionsGroup @@ -55,11 +58,11 @@ final class DocGenerator @@ -74,7 +77,7 @@ final class DocGenerator ```php @@ -154,18 +157,50 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
          ```php -public function addMissingDocBlocks(): void; +public function addDocBlocks(string $aiHandler, string $aiApiKey, string $aiModel, string|null $systemPrompt = null): void; ```
          Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
          -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          NameTypeDescription
          $aiHandlerstring-
          $aiApiKeystring-
          $aiModelstring-
          $systemPromptstring | null-
          Return value: void @@ -184,8 +219,36 @@ public function addMissingDocBlocks(): void;
        11. \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
        12. +
      + + +
      +
      + + + +```php +public function generate(): void; +``` + +
      Generates documentation using configuration
      + +Parameters: not specified + +Return value: void + + +Throws: + @@ -194,18 +257,50 @@ public function addMissingDocBlocks(): void;
      ```php -public function fillInReadmeMdTemplate(): void; +public function generateReadmeTemplate(string $aiHandler, string $aiApiKey, string $aiModel, string|null $systemPrompt = null): void; ``` -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiHandlerstring-
      $aiApiKeystring-
      $aiModelstring-
      $systemPromptstring | null-
      Return value: void @@ -218,9 +313,6 @@ public function fillInReadmeMdTemplate(): void;
    • \DI\DependencyException
    • -
    • - \Tectalic\OpenAi\ClientException
    • -
    • \DI\NotFoundException
    • @@ -234,18 +326,55 @@ public function fillInReadmeMdTemplate(): void;
      ```php -public function generate(): void; +public function generateTemplatesContent(string $aiHandler, string $aiApiKey, string $aiModel, bool $nonInteractive = false, string|null $systemPrompt = null): void; ``` -
      Generates documentation using configuration
      -Parameters: not specified + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiHandlerstring-
      $aiApiKeystring-
      $aiModelstring-
      $nonInteractivebool-
      $systemPromptstring | null-
      Return value: void @@ -253,10 +382,19 @@ public function generate(): void; Throws: @@ -265,36 +403,61 @@ public function generate(): void;
        -
      • # - generateProjectTemplatesStructure +
      • # + initDocsStructure | source code
      ```php -public function generateProjectTemplatesStructure(): void; +public function initDocsStructure(string $aiHandler, string $aiApiKey, string $aiModel, bool $nonInteractive = false, string|null $systemPrompt = null): void; ```
      Generate documentation structure with blank templates using AI tools
      -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiHandlerstring-
      $aiApiKeystring-
      $aiModelstring-
      $nonInteractivebool-
      $systemPromptstring | null-
      Return value: void Throws:
        -
      • - \Tectalic\OpenAi\ClientException
      • - -
      • - \DI\NotFoundException
      • - -
      • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
      • - -
      • - \DI\DependencyException
      • -
      • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
      • @@ -307,7 +470,7 @@ public function generateProjectTemplatesStructure(): void; ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 5289b3f7..02d4449e 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md index eb3efb01..d4d73b45 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/1.configuration/classes/Configuration.md @@ -33,9 +33,15 @@ final class Configuration

        Methods:

          +
        1. + getAIConfig +
        2. getAdditionalConsoleCommands
        3. +
        4. + getAiDataDir +
        5. getCacheDir
        6. @@ -146,6 +152,27 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame +
      +
      +
      + + + +```php +public function getAIConfig(): array; +``` + + + +Parameters: not specified + +Return value: array + +

      @@ -153,7 +180,7 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame ```php @@ -180,6 +207,27 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad
    + +
    +
    + + + +```php +public function getAiDataDir(): string; +``` + + + +Parameters: not specified + +Return value: string + +

    @@ -187,7 +235,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -215,7 +263,7 @@ public function getCacheDir(): string|null; ```php @@ -236,7 +284,7 @@ public function getDocGenLibDir(): string; ```php @@ -264,7 +312,7 @@ public function getGitClientPath(): string; ```php @@ -298,7 +346,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -326,7 +374,7 @@ public function getOutputDir(): string; ```php @@ -354,7 +402,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -388,7 +436,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -512,7 +560,7 @@ public function getTemplatesDir(): string; ```php @@ -546,7 +594,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -580,7 +628,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -608,7 +656,7 @@ public function getWorkingDir(): string; ```php @@ -636,7 +684,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/1.configuration/classes/PageLinkerPlugin.md b/docs/tech/1.configuration/classes/PageLinkerPlugin.md new file mode 100644 index 00000000..7cb0053c --- /dev/null +++ b/docs/tech/1.configuration/classes/PageLinkerPlugin.md @@ -0,0 +1,216 @@ + + BumbleDocGen / Technical description of the project / Configuration files / PageLinkerPlugin
    + +

    + PageLinkerPlugin class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; + +final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface +``` + +
    Adds URLs to empty links in HTML format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation
    + + +Examples of using: + +```php +[a]Existent page name[/a] => Existent page name + +``` + +```php +[a x-title="Custom title"]\Namespace\ClassName[/a] => Custom title + +``` + +```php +[a]\Namespace\ClassName[/a] => \Namespace\ClassName + +``` + +```php +[a]Non-existent page name[/a] => Non-existent page name + +``` + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + beforeCreatingDocFile +
    2. +
    3. + getSubscribedEvents + - Returns an array of event names this subscriber wants to listen to.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public static function getSubscribedEvents(): array; +``` + +
    Returns an array of event names this subscriber wants to listen to.
    + +Parameters: not specified + +Return value: array + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/1.configuration/readme.md b/docs/tech/1.configuration/readme.md index 1f5fba34..4a62cb26 100644 --- a/docs/tech/1.configuration/readme.md +++ b/docs/tech/1.configuration/readme.md @@ -206,6 +206,8 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each - PageHtmlLinkerPlugin +- PageLinkerPlugin + - LastPageCommitter @@ -222,4 +224,4 @@ The inheritance algorithm is as follows: scalar types can be overwritten by each

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/2.parser/entity.md b/docs/tech/2.parser/entity.md index fc0f0b76..9ad24f95 100644 --- a/docs/tech/2.parser/entity.md +++ b/docs/tech/2.parser/entity.md @@ -123,4 +123,4 @@ These classes are a convenient wrapper for accessing data in templates:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/entityFilterCondition.md b/docs/tech/2.parser/entityFilterCondition.md index 664d7122..72619891 100644 --- a/docs/tech/2.parser/entityFilterCondition.md +++ b/docs/tech/2.parser/entityFilterCondition.md @@ -78,4 +78,4 @@ Filter condition for working with entities PHP language handler:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/readme.md b/docs/tech/2.parser/readme.md index 78a4e377..e359c9f0 100644 --- a/docs/tech/2.parser/readme.md +++ b/docs/tech/2.parser/readme.md @@ -41,4 +41,4 @@ In this section, we show how the parser works and what components it consists of

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/2.parser/sourceLocator.md b/docs/tech/2.parser/sourceLocator.md index a180f879..df7da3c3 100644 --- a/docs/tech/2.parser/sourceLocator.md +++ b/docs/tech/2.parser/sourceLocator.md @@ -30,4 +30,4 @@ You can create your own source locators or use any existing ones. All source loc

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:09:56 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/01_templates.md b/docs/tech/3.renderer/01_templates.md index 9fbb4be9..4e9dcb57 100644 --- a/docs/tech/3.renderer/01_templates.md +++ b/docs/tech/3.renderer/01_templates.md @@ -101,4 +101,4 @@ Result after starting the documentation generation process:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/02_breadcrumbs.md b/docs/tech/3.renderer/02_breadcrumbs.md index 65540021..b979e42c 100644 --- a/docs/tech/3.renderer/02_breadcrumbs.md +++ b/docs/tech/3.renderer/02_breadcrumbs.md @@ -51,4 +51,4 @@ Here is an example of the result of the `generatePageBreadcrumbs` function:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/03_documentStructure.md b/docs/tech/3.renderer/03_documentStructure.md index 6401c41e..158325da 100644 --- a/docs/tech/3.renderer/03_documentStructure.md +++ b/docs/tech/3.renderer/03_documentStructure.md @@ -19,4 +19,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/04_twigCustomFilters.md b/docs/tech/3.renderer/04_twigCustomFilters.md index e5b789ef..ac2c586a 100644 --- a/docs/tech/3.renderer/04_twigCustomFilters.md +++ b/docs/tech/3.renderer/04_twigCustomFilters.md @@ -263,4 +263,4 @@ Here is a list of filters available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/05_twigCustomFunctions.md b/docs/tech/3.renderer/05_twigCustomFunctions.md index 5d28192e..482c50d5 100644 --- a/docs/tech/3.renderer/05_twigCustomFunctions.md +++ b/docs/tech/3.renderer/05_twigCustomFunctions.md @@ -385,4 +385,4 @@ Here is a list of functions available by default:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Fri Oct 13 18:40:45 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/readme.md b/docs/tech/3.renderer/readme.md index 011cf62e..37d1604e 100644 --- a/docs/tech/3.renderer/readme.md +++ b/docs/tech/3.renderer/readme.md @@ -60,4 +60,4 @@ This process is presented in the form of a diagram below.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesDynamicBlocks.md b/docs/tech/3.renderer/templatesDynamicBlocks.md index f1f21d98..2be1acf4 100644 --- a/docs/tech/3.renderer/templatesDynamicBlocks.md +++ b/docs/tech/3.renderer/templatesDynamicBlocks.md @@ -26,4 +26,4 @@ You can use the built-in functions and filters or add your own, so you can imple

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesLinking.md b/docs/tech/3.renderer/templatesLinking.md index 95e092ac..32623d36 100644 --- a/docs/tech/3.renderer/templatesLinking.md +++ b/docs/tech/3.renderer/templatesLinking.md @@ -27,4 +27,4 @@ You can also implement your own functions for relinking if necessary.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/3.renderer/templatesVariables.md b/docs/tech/3.renderer/templatesVariables.md index f96b5325..18860755 100644 --- a/docs/tech/3.renderer/templatesVariables.md +++ b/docs/tech/3.renderer/templatesVariables.md @@ -11,4 +11,4 @@ There are several variables available in each processed template.

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md b/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md new file mode 100644 index 00000000..12a27fc4 --- /dev/null +++ b/docs/tech/4.pluginSystem/classes/PageLinkerPlugin.md @@ -0,0 +1,216 @@ + + BumbleDocGen / Technical description of the project / Plugin system / PageLinkerPlugin
    + +

    + PageLinkerPlugin class: +

    + + + + + +```php +namespace BumbleDocGen\Core\Plugin\CorePlugin\PageLinker; + +final class PageLinkerPlugin extends \BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker implements \BumbleDocGen\Core\Plugin\PluginInterface, \Symfony\Component\EventDispatcher\EventSubscriberInterface +``` + +
    Adds URLs to empty links in HTML format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation
    + + +Examples of using: + +```php +[a]Existent page name[/a] => Existent page name + +``` + +```php +[a x-title="Custom title"]\Namespace\ClassName[/a] => Custom title + +``` + +```php +[a]\Namespace\ClassName[/a] => \Namespace\ClassName + +``` + +```php +[a]Non-existent page name[/a] => Non-existent page name + +``` + + + + + + +

    Initialization methods:

    + +
      +
    1. + __construct +
    2. +
    + +

    Methods:

    + +
      +
    1. + beforeCreatingDocFile +
    2. +
    3. + getSubscribedEvents + - Returns an array of event names this subscriber wants to listen to.
    4. +
    + + + + + + + +

    Method details:

    + +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public function __construct(\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper $breadcrumbsHelper, \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup $rootEntityCollectionsGroup, \BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl $getDocumentedEntityUrlFunction, \Psr\Log\LoggerInterface $logger); +``` + + + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $breadcrumbsHelper\BumbleDocGen\Core\Renderer\Breadcrumbs\BreadcrumbsHelper-
    $rootEntityCollectionsGroup\BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsGroup-
    $getDocumentedEntityUrlFunction\BumbleDocGen\Core\Renderer\Twig\Function\GetDocumentedEntityUrl-
    $logger\Psr\Log\LoggerInterface-
    + + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public function beforeCreatingDocFile(\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile $event): void; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $event\BumbleDocGen\Core\Plugin\Event\Renderer\BeforeCreatingDocFile-
    + +Return value: void + + +Throws: + + +
    +
    +
    + + + +```php +// Implemented in BumbleDocGen\Core\Plugin\CorePlugin\PageLinker\BasePageLinker + +public static function getSubscribedEvents(): array; +``` + +
    Returns an array of event names this subscriber wants to listen to.
    + +Parameters: not specified + +Return value: array + + +
    +
    + + \ No newline at end of file diff --git a/docs/tech/4.pluginSystem/readme.md b/docs/tech/4.pluginSystem/readme.md index 88447734..8ea565d3 100644 --- a/docs/tech/4.pluginSystem/readme.md +++ b/docs/tech/4.pluginSystem/readme.md @@ -54,6 +54,23 @@ Plugins for any programming languages work regardless of which language handler 3) Relative link to the entity file from the root directory of the project 4) Page title ( title ) 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) + 6) Relative reference to the entity document from the root directory of the documentation + + + PageLinkerPlugin + any + + + + Adds URLs to empty links in HTML format; + Links may contain: + 1) Short entity name + 2) Full entity name + 3) Relative link to the entity file from the root directory of the project + 4) Page title ( title ) + 5) Template key ( BreadcrumbsHelper::getTemplateLinkKey() ) 6) Relative reference to the entity document from the root directory of the documentation @@ -206,4 +223,4 @@ plugins:

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Oct 28 11:03:31 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator \ No newline at end of file diff --git a/docs/tech/classes/GenerateProjectTemplatesStructureCommand.md b/docs/tech/classes/AddDocBlocksCommand.md similarity index 98% rename from docs/tech/classes/GenerateProjectTemplatesStructureCommand.md rename to docs/tech/classes/AddDocBlocksCommand.md index e68b5658..829ffb30 100644 --- a/docs/tech/classes/GenerateProjectTemplatesStructureCommand.md +++ b/docs/tech/classes/AddDocBlocksCommand.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / GenerateProjectTemplatesStructureCommand
    + BumbleDocGen / Technical description of the project / Class map / AddDocBlocksCommand

    - GenerateProjectTemplatesStructureCommand class: + AddDocBlocksCommand class:

    @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\Console\Command; +namespace BumbleDocGen\AI\Console; -final class GenerateProjectTemplatesStructureCommand extends \BumbleDocGen\Console\Command\BaseCommand +final class AddDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseCommand ```
    Base class for all commands.
    @@ -134,6 +134,11 @@ final class GenerateProjectTemplatesStructureCommand extends \BumbleDocGen\Conso - Sets the process title of the command. +

    Traits:

    + +

    Constants:

    + +
    +
    + + + +```php +public function getAiDataDir(): string; +``` + + + +Parameters: not specified + +Return value: string + +

    @@ -187,7 +235,7 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad ```php @@ -215,7 +263,7 @@ public function getCacheDir(): string|null; ```php @@ -236,7 +284,7 @@ public function getDocGenLibDir(): string; ```php @@ -264,7 +312,7 @@ public function getGitClientPath(): string; ```php @@ -298,7 +346,7 @@ public function getLanguageHandlersCollection(): \BumbleDocGen\LanguageHandler\L ```php @@ -326,7 +374,7 @@ public function getOutputDir(): string; ```php @@ -354,7 +402,7 @@ public function getOutputDirBaseUrl(): string; ```php @@ -388,7 +436,7 @@ public function getPageLinkProcessor(): \BumbleDocGen\Core\Renderer\PageLinkProc ```php @@ -512,7 +560,7 @@ public function getTemplatesDir(): string; ```php @@ -546,7 +594,7 @@ public function getTwigFilters(): \BumbleDocGen\Core\Renderer\Twig\Filter\Custom ```php @@ -580,7 +628,7 @@ public function getTwigFunctions(): \BumbleDocGen\Core\Renderer\Twig\Function\Cu ```php @@ -608,7 +656,7 @@ public function getWorkingDir(): string; ```php @@ -636,7 +684,7 @@ public function isCheckFileInGitBeforeCreatingDocEnabled(): bool; ```php diff --git a/docs/tech/classes/MissingDocBlocksGenerator.md b/docs/tech/classes/DocBlocksGenerator.md similarity index 84% rename from docs/tech/classes/MissingDocBlocksGenerator.md rename to docs/tech/classes/DocBlocksGenerator.md index d209f02f..1eeda3fe 100644 --- a/docs/tech/classes/MissingDocBlocksGenerator.md +++ b/docs/tech/classes/DocBlocksGenerator.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / MissingDocBlocksGenerator
    + BumbleDocGen / Technical description of the project / Class map / DocBlocksGenerator

    - MissingDocBlocksGenerator class: + DocBlocksGenerator class:

    @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\AI\Generators; -final class MissingDocBlocksGenerator +final class DocBlocksGenerator ``` @@ -46,11 +46,11 @@ final class MissingDocBlocksGenerator @@ -65,7 +65,7 @@ final class MissingDocBlocksGenerator ```php @@ -107,11 +107,11 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler, \Bumb ```php -public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity, int $mode = self::MODE_READ_ONLY_SIGNATURES): array; +public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\Entity\RootEntityInterface $rootEntity, string|null $systemPrompt = null, int $mode = self::MODE_READ_ONLY_SIGNATURES): array; ``` @@ -131,6 +131,11 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E $rootEntity \BumbleDocGen\Core\Parser\Entity\RootEntityInterface - + + + $systemPrompt + string | null + - $mode @@ -166,7 +171,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E ```php diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index e341c957..d93f2764 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -34,16 +34,19 @@ final class DocGenerator
    1. - addMissingDocBlocks + addDocBlocks - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
    2. -
    3. - fillInReadmeMdTemplate -
    4. generate - Generates documentation using configuration
    5. - generateProjectTemplatesStructure + generateReadmeTemplate +
    6. +
    7. + generateTemplatesContent +
    8. +
    9. + initDocsStructure - Generate documentation structure with blank templates using AI tools
    10. parseAndGetRootEntityCollectionsGroup @@ -55,11 +58,11 @@ final class DocGenerator @@ -74,7 +77,7 @@ final class DocGenerator ```php @@ -154,18 +157,50 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
      ```php -public function addMissingDocBlocks(): void; +public function addDocBlocks(string $aiHandler, string $aiApiKey, string $aiModel, string|null $systemPrompt = null): void; ```
      Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
      -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiHandlerstring-
      $aiApiKeystring-
      $aiModelstring-
      $systemPromptstring | null-
      Return value: void @@ -184,8 +219,36 @@ public function addMissingDocBlocks(): void;
    11. \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    12. + + +
    +
    +
    + + + +```php +public function generate(): void; +``` + +
    Generates documentation using configuration
    + +Parameters: not specified + +Return value: void + + +Throws: + @@ -194,18 +257,50 @@ public function addMissingDocBlocks(): void;
    ```php -public function fillInReadmeMdTemplate(): void; +public function generateReadmeTemplate(string $aiHandler, string $aiApiKey, string $aiModel, string|null $systemPrompt = null): void; ``` -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $aiHandlerstring-
    $aiApiKeystring-
    $aiModelstring-
    $systemPromptstring | null-
    Return value: void @@ -218,9 +313,6 @@ public function fillInReadmeMdTemplate(): void;
  • \DI\DependencyException
  • -
  • - \Tectalic\OpenAi\ClientException
  • -
  • \DI\NotFoundException
  • @@ -234,18 +326,55 @@ public function fillInReadmeMdTemplate(): void;
    ```php -public function generate(): void; +public function generateTemplatesContent(string $aiHandler, string $aiApiKey, string $aiModel, bool $nonInteractive = false, string|null $systemPrompt = null): void; ``` -
    Generates documentation using configuration
    -Parameters: not specified + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $aiHandlerstring-
    $aiApiKeystring-
    $aiModelstring-
    $nonInteractivebool-
    $systemPromptstring | null-
    Return value: void @@ -253,10 +382,19 @@ public function generate(): void; Throws: @@ -265,36 +403,61 @@ public function generate(): void;
      -
    • # - generateProjectTemplatesStructure +
    • # + initDocsStructure | source code
    ```php -public function generateProjectTemplatesStructure(): void; +public function initDocsStructure(string $aiHandler, string $aiApiKey, string $aiModel, bool $nonInteractive = false, string|null $systemPrompt = null): void; ```
    Generate documentation structure with blank templates using AI tools
    -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescription
    $aiHandlerstring-
    $aiApiKeystring-
    $aiModelstring-
    $nonInteractivebool-
    $systemPromptstring | null-
    Return value: void Throws:
      -
    • - \Tectalic\OpenAi\ClientException
    • - -
    • - \DI\NotFoundException
    • - -
    • - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    • - -
    • - \DI\DependencyException
    • -
    • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    • @@ -307,7 +470,7 @@ public function generateProjectTemplatesStructure(): void; ```php diff --git a/docs/tech/classes/FillInReadmeMdTemplateCommand.md b/docs/tech/classes/GenerateReadMeTemplateCommand.md similarity index 98% rename from docs/tech/classes/FillInReadmeMdTemplateCommand.md rename to docs/tech/classes/GenerateReadMeTemplateCommand.md index 0a39b3e8..c890e3ff 100644 --- a/docs/tech/classes/FillInReadmeMdTemplateCommand.md +++ b/docs/tech/classes/GenerateReadMeTemplateCommand.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / FillInReadmeMdTemplateCommand
      + BumbleDocGen / Technical description of the project / Class map / GenerateReadMeTemplateCommand

      - FillInReadmeMdTemplateCommand class: + GenerateReadMeTemplateCommand class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\Console\Command; +namespace BumbleDocGen\AI\Console; -final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\BaseCommand +final class GenerateReadMeTemplateCommand extends \BumbleDocGen\Console\Command\BaseCommand ```
      Base class for all commands.
      @@ -134,6 +134,11 @@ final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\ - Sets the process title of the command. +

      Traits:

      + +

      Constants:

        @@ -145,6 +150,10 @@ final class FillInReadmeMdTemplateCommand extends \BumbleDocGen\Console\Command\ href="#qinvalid"># INVALID | source code +
      • # + NAME | source + code
      • # SUCCESS | source diff --git a/docs/tech/classes/GenerateTemplatesContentCommand.md b/docs/tech/classes/GenerateTemplatesContentCommand.md new file mode 100644 index 00000000..64c4cdef --- /dev/null +++ b/docs/tech/classes/GenerateTemplatesContentCommand.md @@ -0,0 +1,1393 @@ + + BumbleDocGen / Technical description of the project / Class map / GenerateTemplatesContentCommand
        + +

        + GenerateTemplatesContentCommand class: +

        + + + + + +```php +namespace BumbleDocGen\AI\Console; + +final class GenerateTemplatesContentCommand extends \BumbleDocGen\Console\Command\BaseCommand +``` + +
        Base class for all commands.
        + + + + + + +

        Initialization methods:

        + +
          +
        1. + __construct +
        2. +
        + +

        Methods:

        + +
          +
        1. + addArgument + - Adds an argument.
        2. +
        3. + addOption + - Adds an option.
        4. +
        5. + addUsage + - Add a command usage example, it'll be prefixed with the command name.
        6. +
        7. + complete + - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
        8. +
        9. + getAliases + - Returns the aliases for the command.
        10. +
        11. + getApplication + - Gets the application instance for this command.
        12. +
        13. + getDefaultDescription +
        14. +
        15. + getDefaultName +
        16. +
        17. + getDefinition + - Gets the InputDefinition attached to this Command.
        18. +
        19. + getDescription + - Returns the description for the command.
        20. +
        21. + getHelp + - Returns the help for the command.
        22. +
        23. + getHelper + - Gets a helper instance by name.
        24. +
        25. + getHelperSet + - Gets the helper set.
        26. +
        27. + getName + - Returns the command name.
        28. +
        29. + getNativeDefinition + - Gets the InputDefinition to be used to create representations of this Command.
        30. +
        31. + getProcessedHelp + - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
        32. +
        33. + getSynopsis + - Returns the synopsis for the command.
        34. +
        35. + getUsages + - Returns alternative usages of the command.
        36. +
        37. + ignoreValidationErrors + - Ignores validation errors.
        38. +
        39. + isEnabled + - Checks whether the command is enabled or not in the current environment.
        40. +
        41. + isHidden +
        42. +
        43. + mergeApplicationDefinition + - Merges the application definition with the command definition.
        44. +
        45. + run + - Runs the command.
        46. +
        47. + setAliases + - Sets the aliases for the command.
        48. +
        49. + setApplication +
        50. +
        51. + setCode + - Sets the code to execute when running this command.
        52. +
        53. + setDefinition + - Sets an array of argument and option instances.
        54. +
        55. + setDescription + - Sets the description for the command.
        56. +
        57. + setHelp + - Sets the help for the command.
        58. +
        59. + setHelperSet +
        60. +
        61. + setHidden +
        62. +
        63. + setName + - Sets the name of the command.
        64. +
        65. + setProcessTitle + - Sets the process title of the command.
        66. +
        + +

        Traits:

        + + + +

        Constants:

        + + + + + + +

        Method details:

        + +
        + + + +```php +// Implemented in BumbleDocGen\Console\Command\BaseCommand + +public function __construct(string $name = null); +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestringThe name of the command; passing null means it must be set in configure()
        + + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; +``` + +
        Adds an argument.
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
        $descriptionstring-
        $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
        + +Return value: static + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; +``` + +
        Adds an option.
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
        $modeintThe option mode: One of the InputOption::VALUE_* constants
        $descriptionstring-
        $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
        + +Return value: static + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function addUsage(string $usage): static; +``` + +
        Add a command usage example, it'll be prefixed with the command name.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $usagestring-
        + +Return value: static + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; +``` + +
        Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $input\Symfony\Component\Console\Completion\CompletionInput-
        $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
        + +Return value: void + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getAliases(): array; +``` + +
        Returns the aliases for the command.
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getApplication(): \Symfony\Component\Console\Application|null; +``` + +
        Gets the application instance for this command.
        + +Parameters: not specified + +Return value: \Symfony\Component\Console\Application | null + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public static function getDefaultDescription(): string|null; +``` + + + +Parameters: not specified + +Return value: string | null + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public static function getDefaultName(): string|null; +``` + + + +Parameters: not specified + +Return value: string | null + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; +``` + +
        Gets the InputDefinition attached to this Command.
        + +Parameters: not specified + +Return value: \Symfony\Component\Console\Input\InputDefinition + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getDescription(): string; +``` + +
        Returns the description for the command.
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getHelp(): string; +``` + +
        Returns the help for the command.
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getHelper(string $name): mixed; +``` + +
        Gets a helper instance by name.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: mixed + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; +``` + +
        Gets the helper set.
        + +Parameters: not specified + +Return value: \Symfony\Component\Console\Helper\HelperSet | null + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getName(): string|null; +``` + +
        Returns the command name.
        + +Parameters: not specified + +Return value: string | null + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; +``` + +
        Gets the InputDefinition to be used to create representations of this Command.
        + +Parameters: not specified + +Return value: \Symfony\Component\Console\Input\InputDefinition + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getProcessedHelp(): string; +``` + +
        Returns the processed help for the command replacing the %command.name% and +%command.full_name% patterns with the real values dynamically.
        + +Parameters: not specified + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getSynopsis(bool $short = false): string; +``` + +
        Returns the synopsis for the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $shortboolWhether to show the short version of the synopsis (with options folded) or not
        + +Return value: string + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function getUsages(): array; +``` + +
        Returns alternative usages of the command.
        + +Parameters: not specified + +Return value: array + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function ignoreValidationErrors(): mixed; +``` + +
        Ignores validation errors.
        + +Parameters: not specified + +Return value: mixed + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function isEnabled(): bool; +``` + +
        Checks whether the command is enabled or not in the current environment.
        + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function isHidden(): bool; +``` + + + +Parameters: not specified + +Return value: bool + + +
        +
        +
        + +
          +
        • # + mergeApplicationDefinition + :warning: Is internal | source code
        • +
        + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; +``` + +
        Merges the application definition with the command definition.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
        + +Return value: mixed + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; +``` + +
        Runs the command.
        + +Parameters: + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $input\Symfony\Component\Console\Input\InputInterface-
        $output\Symfony\Component\Console\Output\OutputInterface-
        + +Return value: int + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setAliases(iterable $aliases): static; +``` + +
        Sets the aliases for the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $aliasesiterableAn array of aliases for the command
        + +Return value: static + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $application\Symfony\Component\Console\Application-
        + +Return value: mixed + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setCode(callable $code): static; +``` + +
        Sets the code to execute when running this command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $codecallableA callable(InputInterface $input, OutputInterface $output)
        + +Return value: static + + +Throws: + + + +See: + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; +``` + +
        Sets an array of argument and option instances.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
        + +Return value: static + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setDescription(string $description): static; +``` + +
        Sets the description for the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $descriptionstring-
        + +Return value: static + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setHelp(string $help): static; +``` + +
        Sets the help for the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $helpstring-
        + +Return value: static + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $helperSet\Symfony\Component\Console\Helper\HelperSet-
        + +Return value: mixed + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setHidden(bool $hidden = true): static; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $hiddenboolWhether or not the command should be hidden from the list of commands
        + +Return value: static + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setName(string $name): static; +``` + +
        Sets the name of the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $namestring-
        + +Return value: static + + +Throws: + + +
        +
        +
        + + + +```php +// Implemented in Symfony\Component\Console\Command\Command + +public function setProcessTitle(string $title): static; +``` + +
        Sets the process title of the command.
        + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $titlestring-
        + +Return value: static + + +
        +
        + + \ No newline at end of file diff --git a/docs/tech/classes/AddMissingDocBlocksCommand.md b/docs/tech/classes/InitDocsStructureCommand.md similarity index 98% rename from docs/tech/classes/AddMissingDocBlocksCommand.md rename to docs/tech/classes/InitDocsStructureCommand.md index b77d8002..d5929e21 100644 --- a/docs/tech/classes/AddMissingDocBlocksCommand.md +++ b/docs/tech/classes/InitDocsStructureCommand.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / AddMissingDocBlocksCommand
        + BumbleDocGen / Technical description of the project / Class map / InitDocsStructureCommand

        - AddMissingDocBlocksCommand class: + InitDocsStructureCommand class:

        @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\Console\Command; +namespace BumbleDocGen\AI\Console; -final class AddMissingDocBlocksCommand extends \BumbleDocGen\Console\Command\BaseCommand +final class InitDocsStructureCommand extends \BumbleDocGen\Console\Command\BaseCommand ```
        Base class for all commands.
        @@ -134,6 +134,11 @@ final class AddMissingDocBlocksCommand extends \BumbleDocGen\Console\Command\Bas - Sets the process title of the command.
      • +

        Traits:

        + +

        Constants:

        ```php -public static function create(): \BumbleDocGen\AI\ProviderInterface; +public static function create(string $handler, string $apiKey, string $model): \BumbleDocGen\AI\ProviderInterface; ``` -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $handlerstring-
        $apiKeystring-
        $modelstring-
        Return value: \BumbleDocGen\AI\ProviderInterface diff --git a/docs/tech/classes/ProviderInterface.md b/docs/tech/classes/ProviderInterface.md index c9b779dc..003f029a 100644 --- a/docs/tech/classes/ProviderInterface.md +++ b/docs/tech/classes/ProviderInterface.md @@ -27,22 +27,16 @@ interface ProviderInterface
        1. - generateMissingPHPDocBlocs + formatDataPrompt
        2. - generateReadMeFileContent -
        3. -
        4. - generateTemplateContent -
        5. -
        6. - generateTemplateStructure + getName
        7. - getName + getSystemPrompt
        8. - sendPrompt + sendPrompts
        @@ -57,13 +51,13 @@ interface ProviderInterface
        ```php -public function generateMissingPHPDocBlocs(string $prompt): string; +public function formatDataPrompt(string $title, string $content): string; ``` @@ -80,46 +74,13 @@ public function generateMissingPHPDocBlocs(string $prompt): string; - $prompt + $title string - - - - -Return value: string - - -
        -
        -
        - - - -```php -public function generateReadMeFileContent(array $prompts): string; -``` - - - -Parameters: - - - - - - - - - - - - + + @@ -133,35 +94,18 @@ public function generateReadMeFileContent(array $prompts): string;
        ```php -public function generateTemplateContent(array $prompts): string; +public function getName(): string; ``` -Parameters: - -
        NameTypeDescription
        $promptsarray$contentstring -
        - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        +Parameters: not specified Return value: string @@ -171,13 +115,13 @@ public function generateTemplateContent(array $prompts): string;
        ```php -public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; +public function getSystemPrompt(string $fileName): string; ``` @@ -194,13 +138,8 @@ public function generateTemplateStructure(array $namespacesList, string|null $ad - $namespacesList - array - - - - - $additionalPrompt - string | null + $fileName + string - @@ -214,34 +153,13 @@ public function generateTemplateStructure(array $namespacesList, string|null $ad
        - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - ```php -public function sendPrompt(array $prompts, string $system): string; +public function sendPrompts(array $prompts, string $system): string; ``` diff --git a/docs/tech/classes/Provider_2.md b/docs/tech/classes/Provider_2.md deleted file mode 100644 index e803828f..00000000 --- a/docs/tech/classes/Provider_2.md +++ /dev/null @@ -1,338 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / Provider
        - -

        - Provider class: -

        - - - - - -```php -namespace BumbleDocGen\AI\Providers\Ollama; - -final class Provider implements \BumbleDocGen\AI\ProviderInterface -``` - - - - - - - - -

        Initialization methods:

        - -
          -
        1. - __construct -
        2. -
        - -

        Methods:

        - -
          -
        1. - generateMissingPHPDocBlocs -
        2. -
        3. - generateReadMeFileContent -
        4. -
        5. - generateTemplateContent -
        6. -
        7. - generateTemplateStructure -
        8. -
        9. - getName -
        10. -
        11. - sendPrompt -
        12. -
        - -

        Traits:

        - - - - -

        Properties:

        - -
          -
        1. - extractFirstJsonObject
        2. -
        - - - -

        Property details:

        - - -* # - $extractFirstJsonObject - **|** source code -```php -public bool $extractFirstJsonObject; - -``` - - - - -

        Method details:

        - -
        - - - -```php -public function __construct(); -``` - - - -Parameters: not specified - - - -
        -
        -
        - - - -```php -public function generateMissingPHPDocBlocs(string $prompt): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptstring-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateReadMeFileContent(array $prompts): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateTemplateContent(array $prompts): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namespacesListarray-
        $additionalPromptstring | null-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - - -```php -public function sendPrompt(array $prompts, string $system): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        $systemstring-
        - -Return value: string - - - -See: - -
        -
        - - \ No newline at end of file diff --git a/docs/tech/classes/Provider_3.md b/docs/tech/classes/Provider_3.md deleted file mode 100644 index 5a18549a..00000000 --- a/docs/tech/classes/Provider_3.md +++ /dev/null @@ -1,323 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / Provider
        - -

        - Provider class: -

        - - - - - -```php -namespace BumbleDocGen\AI\Providers\OpenAI; - -final class Provider implements \BumbleDocGen\AI\ProviderInterface -``` - - - - - - - - -

        Initialization methods:

        - -
          -
        1. - __construct -
        2. -
        - -

        Methods:

        - -
          -
        1. - generateMissingPHPDocBlocs -
        2. -
        3. - generateReadMeFileContent -
        4. -
        5. - generateTemplateContent -
        6. -
        7. - generateTemplateStructure -
        8. -
        9. - getName -
        10. -
        11. - sendPrompt -
        12. -
        - - - - - - - -

        Method details:

        - -
        - - - -```php -public function __construct(mixed $bearerToken); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $bearerTokenmixed-
        - - - -
        -
        -
        - - - -```php -public function generateMissingPHPDocBlocs(string $prompt): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptstring-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateReadMeFileContent(array $prompts): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateTemplateContent(array $prompts): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function generateTemplateStructure(array $namespacesList, string|null $additionalPrompt): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $namespacesListarray-
        $additionalPromptstring | null-
        - -Return value: string - - -
        -
        -
        - - - -```php -public function getName(): string; -``` - - - -Parameters: not specified - -Return value: string - - -
        -
        -
        - - - -```php -public function sendPrompt(array $prompts, string $system): string; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
        NameTypeDescription
        $promptsarray-
        $systemstring-
        - -Return value: string - - -
        -
        - - \ No newline at end of file diff --git a/docs/tech/classes/ReadmeTemplateGenerator.md b/docs/tech/classes/ReadmeTemplateGenerator.md index 59a1599a..2490d548 100644 --- a/docs/tech/classes/ReadmeTemplateGenerator.md +++ b/docs/tech/classes/ReadmeTemplateGenerator.md @@ -92,7 +92,7 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler);
      ```php -public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, array $entryPoints = [], string|null $composerJsonFile = null, string|null $additionalPrompt = null): string; +public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, array $entryPoints = [], string|null $composerJsonFile = null, string|null $additionalPrompt = null, string|null $systemPrompt = null): string; ``` @@ -127,6 +127,11 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE $additionalPrompt string | null - + + + $systemPrompt + string | null + - diff --git a/docs/tech/classes/JsonExtractorTrait.md b/docs/tech/classes/SharedCommandLogicTrait.md similarity index 70% rename from docs/tech/classes/JsonExtractorTrait.md rename to docs/tech/classes/SharedCommandLogicTrait.md index f83fad87..de7e9de7 100644 --- a/docs/tech/classes/JsonExtractorTrait.md +++ b/docs/tech/classes/SharedCommandLogicTrait.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / JsonExtractorTrait
      + BumbleDocGen / Technical description of the project / Class map / SharedCommandLogicTrait

      - JsonExtractorTrait class: + SharedCommandLogicTrait class:

      @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\AI\Traits; -trait JsonExtractorTrait +trait SharedCommandLogicTrait ``` diff --git a/docs/tech/classes/TemplateGenerator.md b/docs/tech/classes/TemplateContentGenerator.md similarity index 71% rename from docs/tech/classes/TemplateGenerator.md rename to docs/tech/classes/TemplateContentGenerator.md index afc925c8..4a6ae029 100644 --- a/docs/tech/classes/TemplateGenerator.md +++ b/docs/tech/classes/TemplateContentGenerator.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / TemplateGenerator
      + BumbleDocGen / Technical description of the project / Class map / TemplateContentGenerator

      - TemplateGenerator class: + TemplateContentGenerator class:

      @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\AI\Generators; -final class TemplateGenerator +final class TemplateContentGenerator ``` @@ -36,9 +36,6 @@ final class TemplateGenerator
    • generate
    • -
    • - getFileSubPathFromPath -
    • @@ -54,7 +51,7 @@ final class TemplateGenerator ```php @@ -91,11 +88,11 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); ```php -public function generate(string $filePath, string $fileContent, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection|null $entitiesCollection, string|null $additionalPrompt = null): string|null; +public function generate(string $filePath, string $fileName, array $fileNamespaces, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection|null $entitiesCollection, string|null $additionalPrompt = null, string|null $systemPrompt = null): string|null; ``` @@ -117,9 +114,14 @@ public function generate(string $filePath, string $fileContent, \BumbleDocGen\La - - $fileContent + $fileName string - + + + $fileNamespaces + array + - $entitiesCollection @@ -130,6 +132,11 @@ public function generate(string $filePath, string $fileContent, \BumbleDocGen\La $additionalPrompt string | null - + + + $systemPrompt + string | null + - @@ -153,44 +160,6 @@ public function generate(string $filePath, string $fileContent, \BumbleDocGen\La
    -
    -
    -
    - - - -```php -public function getFileSubPathFromPath(string $path): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
    NameTypeDescription
    $pathstring-
    - -Return value: mixed - -

    diff --git a/docs/tech/classes/TemplatesStructureGenerator.md b/docs/tech/classes/TemplateStructureGenerator.md similarity index 74% rename from docs/tech/classes/TemplatesStructureGenerator.md rename to docs/tech/classes/TemplateStructureGenerator.md index fc4bdc14..8809dfeb 100644 --- a/docs/tech/classes/TemplatesStructureGenerator.md +++ b/docs/tech/classes/TemplateStructureGenerator.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / TemplatesStructureGenerator
    + BumbleDocGen / Technical description of the project / Class map / TemplateStructureGenerator

    - TemplatesStructureGenerator class: + TemplateStructureGenerator class:

    @@ -12,7 +12,7 @@ ```php namespace BumbleDocGen\AI\Generators; -final class TemplatesStructureGenerator +final class TemplateStructureGenerator ``` @@ -51,11 +51,11 @@ final class TemplatesStructureGenerator ```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler, string $aiConfigDirectory); ``` @@ -75,6 +75,11 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); $aiHandler \BumbleDocGen\AI\ProviderInterface - + + + $aiConfigDirectory + string + - @@ -88,11 +93,11 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); ```php -public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string|null $additionalPrompt = null): array; +public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string|null $additionalPrompt = null, string|null $systemPrompt = null): array; ``` @@ -117,6 +122,11 @@ public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\En $additionalPrompt string | null - + + + $systemPrompt + string | null + - @@ -132,6 +142,9 @@ public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\En
  • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
  • +
  • + \JsonException
  • +
    diff --git a/docs/tech/map.md b/docs/tech/map.md index 8ec103fb..0f139ff2 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -4,30 +4,28 @@ Directory layout ( only documented files shown ):
    └──src/
     │  ├──AI/
    +│  │  ├──Console/
    +│  │  │  ├── AddDocBlocksCommand.php Base class for all commands.
    +│  │  │  ├── GenerateReadMeTemplateCommand.php Base class for all commands.
    +│  │  │  ├── GenerateTemplatesContentCommand.php Base class for all commands.
    +│  │  │  └── InitDocsStructureCommand.php Base class for all commands.
     │  │  ├──Generators/
    -│  │  │  ├── MissingDocBlocksGenerator.php 
    +│  │  │  ├── DocBlocksGenerator.php 
     │  │  │  ├── ReadmeTemplateGenerator.php 
    -│  │  │  ├── TemplateGenerator.php 
    -│  │  │  └── TemplatesStructureGenerator.php 
    +│  │  │  ├── TemplateContentGenerator.php 
    +│  │  │  └── TemplateStructureGenerator.php 
     │  │  ├──Providers/
    -│  │  │  ├──HuggingFace/
    -│  │  │  │  └── Provider.php 
    -│  │  │  ├──Ollama/
    -│  │  │  │  └── Provider.php 
     │  │  │  └──OpenAI/
    -│  │  │  │  └── Provider.php 
    +│  │  │  │  └── Provider.php 
     │  │  ├──Traits/
    -│  │  │  └── JsonExtractorTrait.php 
    +│  │  │  └── SharedCommandLogicTrait.php 
     │  │  ├── ProviderFactory.php 
     │  │  └── ProviderInterface.php 
     │  ├──Console/
     │  │  ├──Command/
    -│  │  │  ├── AddMissingDocBlocksCommand.php Base class for all commands.
     │  │  │  ├── AdditionalCommandCollection.php 
     │  │  │  ├── BaseCommand.php Base class for all commands.
    -│  │  │  ├── FillInReadmeMdTemplateCommand.php Base class for all commands.
    -│  │  │  ├── GenerateCommand.php Base class for all commands.
    -│  │  │  └── GenerateProjectTemplatesStructureCommand.php Base class for all commands.
    +│  │  │  └── GenerateCommand.php Base class for all commands.
     │  │  ├──ProgressBar/
     │  │  │  ├── ProgressBarFactory.php 
     │  │  │  └── StylizedProgressBar.php 
    @@ -108,6 +106,7 @@ Directory layout ( only documented files shown ):
     │  │  │  │  └──PageLinker/
     │  │  │  │  │  ├── BasePageLinker.php 
     │  │  │  │  │  ├── PageHtmlLinkerPlugin.php Adds URLs to empty links in HTML format; Links may contain: 1) Short entity name 2) Full entity n...
    +│  │  │  │  │  ├── PageLinkerPlugin.php Adds URLs to empty links in HTML format; Links may contain: 1) Short entity name 2) Full entity n...
     │  │  │  │  │  └── PageRstLinkerPlugin.php Adds URLs to empty links in rst format; Links may contain: 1) Short entity name 2) Full entity na...
     │  │  │  ├──Event/
     │  │  │  │  ├──Parser/
    @@ -263,4 +262,4 @@ Directory layout ( only documented files shown ):
     
     

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file diff --git a/docs/tech/readme.md b/docs/tech/readme.md index 9d83be95..f4cb803d 100644 --- a/docs/tech/readme.md +++ b/docs/tech/readme.md @@ -44,4 +44,4 @@ After that, the process of parsing the project code according to the configurati

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Fri Oct 27 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Thu Oct 5 17:42:06 2023 +0300
    Page content update date: Tue Oct 31 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file From 2716e89232d04230e5aa6295c9ad63f96627a5c9 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 12:43:33 +0000 Subject: [PATCH 27/33] Removes template structure and content generation Removing for the moment, will be re-added in a later branch --- .../demo-config.yaml | 20 --- .../demo2-templates-generation/demoScript.php | 23 --- .../ai_data/structure.json | 106 ------------ demo/demo7-template-content/demo-config.yaml | 20 --- demo/demo7-template-content/demoScript.php | 51 ------ .../templates/readme.md.twig | 1 - .../templates/tech/AI/index.md.twig | 47 ------ .../templates/tech/Console/index.md.twig | 34 ---- .../templates/tech/Core/Cache/index.md.twig | 25 --- .../tech/Core/Configuration/index.md.twig | 2 - .../templates/tech/Core/Logger/index.md.twig | 2 - .../templates/tech/Core/Parser/index.md.twig | 2 - .../templates/tech/Core/Plugin/index.md.twig | 2 - .../tech/Core/Renderer/index.md.twig | 2 - .../tech/LanguageHandler/Php/index.md.twig | 2 - .../tech/LanguageHandler/index.md.twig | 2 - .../templates/tech/index.md.twig | 2 - .../GenerateTemplatesContentCommand.php | 73 --------- src/AI/Console/InitDocsStructureCommand.php | 75 --------- .../Generators/TemplateContentGenerator.php | 152 ------------------ .../Generators/TemplateStructureGenerator.php | 74 --------- src/AI/Prompts/templateContentGeneration | 1 - src/AI/Prompts/templateStructureGeneration | 18 --- src/Console/App.php | 4 - src/DocGenerator.php | 144 ----------------- 25 files changed, 884 deletions(-) delete mode 100644 demo/demo2-templates-generation/demo-config.yaml delete mode 100644 demo/demo2-templates-generation/demoScript.php delete mode 100644 demo/demo7-template-content/ai_data/structure.json delete mode 100644 demo/demo7-template-content/demo-config.yaml delete mode 100644 demo/demo7-template-content/demoScript.php delete mode 100644 demo/demo7-template-content/templates/readme.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/AI/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Console/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig delete mode 100644 demo/demo7-template-content/templates/tech/index.md.twig delete mode 100644 src/AI/Console/GenerateTemplatesContentCommand.php delete mode 100644 src/AI/Console/InitDocsStructureCommand.php delete mode 100644 src/AI/Generators/TemplateContentGenerator.php delete mode 100644 src/AI/Generators/TemplateStructureGenerator.php delete mode 100644 src/AI/Prompts/templateContentGeneration delete mode 100644 src/AI/Prompts/templateStructureGeneration diff --git a/demo/demo2-templates-generation/demo-config.yaml b/demo/demo2-templates-generation/demo-config.yaml deleted file mode 100644 index 98f257b5..00000000 --- a/demo/demo2-templates-generation/demo-config.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project_root: '%DOC_GEN_LIB_PATH%' -templates_dir: '%WORKING_DIR%/demo/demo2-templates-generation/templates' -cache_dir: '%WORKING_DIR%/demo/demo2-templates-generation/__cache' -language_handlers: - php: - class: \BumbleDocGen\LanguageHandler\Php\PhpHandler - settings: - file_source_base_url: '#' - async_source_loading_enabled: true -source_locators: - - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator - arguments: - directories: - - "%project_root%/src" - -ai: - data_dir: '%WORKING_DIR%/demo/demo2-templates-generation/ai_data' -# api_key: - handler: "open_ai" - model: "gpt-4" diff --git a/demo/demo2-templates-generation/demoScript.php b/demo/demo2-templates-generation/demoScript.php deleted file mode 100644 index 03e3c5a4..00000000 --- a/demo/demo2-templates-generation/demoScript.php +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env php - InitDocsStructureCommand::NAME, - '--config' => 'demo/demo2-templates-generation/demo-config.yaml', - '--provider' => 'openai', - '--model' => 'gpt-4', - ]); - $application->run($input); -} catch (\Exception $e) { - die($e->getMessage()); -} diff --git a/demo/demo7-template-content/ai_data/structure.json b/demo/demo7-template-content/ai_data/structure.json deleted file mode 100644 index c055bc50..00000000 --- a/demo/demo7-template-content/ai_data/structure.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "/AI/": { - "name": "Artificial Intelligence", - "namespaces": [ - "BumbleDocGen\\AI\\Console", - "BumbleDocGen\\AI\\Generators", - "BumbleDocGen\\AI", - "BumbleDocGen\\AI\\Providers\\OpenAI", - "BumbleDocGen\\AI\\Traits" - ] - }, - "/Console/": { - "name": "Console Operations", - "namespaces": [ - "BumbleDocGen\\Console", - "BumbleDocGen\\Console\\Command", - "BumbleDocGen\\Console\\ProgressBar" - ] - }, - "/Core/Cache/": { - "name": "Core Cache", - "namespaces": [ - "BumbleDocGen\\Core\\Cache", - "BumbleDocGen\\Core\\Cache\\LocalCache", - "BumbleDocGen\\Core\\Cache\\LocalCache\\Exception" - ] - }, - "/Core/Configuration/": { - "name": "Core Configuration", - "namespaces": [ - "BumbleDocGen\\Core\\Configuration", - "BumbleDocGen\\Core\\Configuration\\Exception", - "BumbleDocGen\\Core\\Configuration\\ValueResolver", - "BumbleDocGen\\Core\\Configuration\\ValueTransformer" - ] - }, - "/Core/Logger/": { - "name": "Core Logger", - "namespaces": ["BumbleDocGen\\Core\\Logger\\Handler"] - }, - "/Core/Parser/": { - "name": "Core Parser", - "namespaces": [ - "BumbleDocGen\\Core\\Parser", - "BumbleDocGen\\Core\\Parser\\Entity", - "BumbleDocGen\\Core\\Parser\\Entity\\Cache", - "BumbleDocGen\\Core\\Parser\\Entity\\Cache\\CacheKey", - "BumbleDocGen\\Core\\Parser\\Entity\\CollectionLogOperation", - "BumbleDocGen\\Core\\Parser\\FilterCondition", - "BumbleDocGen\\Core\\Parser\\FilterCondition\\CommonFilterCondition", - "BumbleDocGen\\Core\\Parser\\SourceLocator" - ] - }, - "/Core/Plugin/": { - "name": "Core Plugin", - "namespaces": [ - "BumbleDocGen\\Core\\Plugin", - "BumbleDocGen\\Core\\Plugin\\CorePlugin\\LastPageCommitter", - "BumbleDocGen\\Core\\Plugin\\CorePlugin\\PageLinker", - "BumbleDocGen\\Core\\Plugin\\Event\\Parser", - "BumbleDocGen\\Core\\Plugin\\Event\\Renderer" - ] - }, - "/Core/Renderer/": { - "name": "Core Renderer", - "namespaces": [ - "BumbleDocGen\\Core\\Renderer", - "BumbleDocGen\\Core\\Renderer\\Breadcrumbs", - "BumbleDocGen\\Core\\Renderer\\Context", - "BumbleDocGen\\Core\\Renderer\\Context\\Dependency", - "BumbleDocGen\\Core\\Renderer\\EntityDocRenderer", - "BumbleDocGen\\Core\\Renderer\\PageLinkProcessor", - "BumbleDocGen\\Core\\Renderer\\Twig", - "BumbleDocGen\\Core\\Renderer\\Twig\\Filter", - "BumbleDocGen\\Core\\Renderer\\Twig\\Function" - ] - }, - "/LanguageHandler/": { - "name": "Language Handler", - "namespaces": ["BumbleDocGen\\LanguageHandler"] - }, - "/LanguageHandler/Php/": { - "name": "PHP Language Handler", - "namespaces": [ - "BumbleDocGen\\LanguageHandler\\Php", - "BumbleDocGen\\LanguageHandler\\Php\\Parser", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Cache", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Exception", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\Entity\\Reflection", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\ClassConstantFilterCondition", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\ClassFilterCondition", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\MethodFilterCondition", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\FilterCondition\\PropertyFilterCondition", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\SourceLocator", - "BumbleDocGen\\LanguageHandler\\Php\\Parser\\SourceLocator\\Internal", - "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\CorePlugin\\BasePhpStubber", - "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\CorePlugin\\EntityDocUnifiedPlace", - "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\Event\\Entity", - "BumbleDocGen\\LanguageHandler\\Php\\Plugin\\Event\\Parser", - "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\EntityDocRenderer", - "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\EntityDocRenderer\\PhpClassToMd", - "BumbleDocGen\\LanguageHandler\\Php\\Renderer\\Twig\\Function" - ] - } -} \ No newline at end of file diff --git a/demo/demo7-template-content/demo-config.yaml b/demo/demo7-template-content/demo-config.yaml deleted file mode 100644 index 5afa58a1..00000000 --- a/demo/demo7-template-content/demo-config.yaml +++ /dev/null @@ -1,20 +0,0 @@ -project_root: '%DOC_GEN_LIB_PATH%' -cache_dir: '%WORKING_DIR%/demo/demo7-template-content/__cache' -templates_dir: '%WORKING_DIR%/demo/demo7-template-content/templates' -output_dir: "%WORKING_DIR%/demo/demo7-template-content/docs" -output_dir_base_url: "/demo/demo7-template-content/docs" -language_handlers: - php: - class: \BumbleDocGen\LanguageHandler\Php\PhpHandler - settings: - async_source_loading_enabled: true -source_locators: - - class: \BumbleDocGen\Core\Parser\SourceLocator\RecursiveDirectoriesSourceLocator - arguments: - directories: - - "%project_root%/src" -ai: - data_dir: '%WORKING_DIR%/demo/demo7-template-content/ai_data' - api_key: - handler: "open_ai" - model: "gpt-4" diff --git a/demo/demo7-template-content/demoScript.php b/demo/demo7-template-content/demoScript.php deleted file mode 100644 index 806ef7d8..00000000 --- a/demo/demo7-template-content/demoScript.php +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env php - GenerateTemplatesContentCommand::NAME, - '--config' => 'demo/demo7-template-content/demo-config.yaml', - '--provider' => 'openai', - '--model' => 'gpt-4', - ]); - - $application->run($input); -} catch (\Exception $e) { - die($e->getMessage()); -} - -function generateStructureIfNotExists(App $application): void -{ - $finder = new Finder(); - $targetDir = __DIR__ . '/templates'; - $fileCount = 0; - - if (is_dir($targetDir)) { - $finder->files()->in($targetDir); - $fileCount = iterator_count($finder); - } - - if ($fileCount === 0) { - $input = new ArrayInput([ - 'command' => InitDocsStructureCommand::NAME, - '--config' => 'demo/demo7-template-content/demo-config.yaml', - '--provider' => 'openai', - '--model' => 'gpt-4', - ]); - $application->run($input); - } -} diff --git a/demo/demo7-template-content/templates/readme.md.twig b/demo/demo7-template-content/templates/readme.md.twig deleted file mode 100644 index ba63f40c..00000000 --- a/demo/demo7-template-content/templates/readme.md.twig +++ /dev/null @@ -1 +0,0 @@ -{% set title = 'About the project' %} diff --git a/demo/demo7-template-content/templates/tech/AI/index.md.twig b/demo/demo7-template-content/templates/tech/AI/index.md.twig deleted file mode 100644 index 0e08eef6..00000000 --- a/demo/demo7-template-content/templates/tech/AI/index.md.twig +++ /dev/null @@ -1,47 +0,0 @@ -{% set title = 'Artificial Intelligence' %} -{{ generatePageBreadcrumbs(title, _self) }} - -# Artificial Intelligence - -This page contains the documentation for the classes and methods in the AI namespace. The AI namespace is broken down into several sub-namespaces, including `Console`, `Generators`, `Providers\OpenAI`, and the base `AI` namespace. - -## Console - -The `Console` sub-namespace contains command classes used in the console for various tasks. These classes are: - -- \BumbleDocGen\AI\Console\AddDocBlocksCommand -- \BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand -- \BumbleDocGen\AI\Console\GenerateTemplatesContentCommand -- \BumbleDocGen\AI\Console\InitDocsStructureCommand - -Each of these classes includes methods for managing console commands such as `addArgument`, `addOption`, `getAliases`, `getApplication`, and more. - -## Generators - -The `Generators` sub-namespace contains utility classes used for generating documentation. These classes include: - -- \BumbleDocGen\AI\Generators\MissingDocBlocksGenerator -- \BumbleDocGen\AI\Generators\ReadmeTemplateGenerator -- \BumbleDocGen\AI\Generators\TemplateGenerator -- \BumbleDocGen\AI\Generators\TemplatesStructureGenerator - -These classes host methods to compile and generate documentation blocks, README files, and template structures. - -## Providers - -The `Providers` sub-namespace comprises classes used to interface with external AI providers. Currently, the only AI provider implemented is `OpenAI`. - -- \BumbleDocGen\AI\Providers\OpenAI\Provider - -This class contains methods for interfacing with the OpenAI API, including methods for formatting data prompts, retrieving available models, and sending prompts to the AI. - -## Base AI Namespace - -The base AI namespace includes important classes for interacting with AI providers: - -- \BumbleDocGen\AI\ProviderFactory -- \BumbleDocGen\AI\ProviderInterface - -The `ProviderFactory` class is used to instantiate AI providers, while the `ProviderInterface` is an interface that all AI providers must implement. - -For detailed information about each class and its methods, refer to the specific class documentation page. \ No newline at end of file diff --git a/demo/demo7-template-content/templates/tech/Console/index.md.twig b/demo/demo7-template-content/templates/tech/Console/index.md.twig deleted file mode 100644 index 277b0659..00000000 --- a/demo/demo7-template-content/templates/tech/Console/index.md.twig +++ /dev/null @@ -1,34 +0,0 @@ -{% set title = 'Console Operations' %} -{{ generatePageBreadcrumbs(title, _self) }} - -# Console Operations - -## \BumbleDocGen\Console\Command - -### [BaseCommand](\Namespace\BaseCommand) - -This is the base class for all commands in the console application. It takes care of basic command operations such as argument and option manipulation, command description, and execution. - -### [AdditionalCommandCollection](\Namespace\AdditionalCommandCollection) - -This class manages a collection of additional commands. It provides methods for adding and iterating over the command objects. - -### [GenerateCommand](\Namespace\GenerateCommand) - -This class represents a specific console command that generates output based on provided arguments and options. - -## \BumbleDocGen\Console - -### [App](\Namespace\App) - -This class represents the console application itself. It provides a wide range of methods for command registration, execution, and lifecycle management. - -## \BumbleDocGen\Console\ProgressBar - -### [ProgressBarFactory](\Namespace\ProgressBarFactory) - -This class is a factory for creating stylized progress bars, which can be used to display progress information for long-running console commands. - -### [StylizedProgressBar](\Namespace\StylizedProgressBar) - -This class represents a stylized progress bar. It provides methods for managing the progress bar's appearance and updating its progress. diff --git a/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig deleted file mode 100644 index caa81c5e..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Cache/index.md.twig +++ /dev/null @@ -1,25 +0,0 @@ -{% set title = 'Core Cache' %} -{{ generatePageBreadcrumbs(title, _self) }} - -``` -

    Core Cache

    - -

    The Core Cache namespace consists of classes responsible for managing cache in the BumbleDocGen application. These classes provide functionality for persisting, retrieving, and removing cache items.

    - -

    Classes:

    - -

    EntityCacheItemPool

    -

    This class manages a collection of cache items. It provides methods for adding, deleting, and retrieving cache items, as well as for committing any deferred cache operations.

    - -

    SharedCompressedDocumentFileCache

    -

    This class is responsible for caching document files. It provides methods for getting, setting, and saving the cache, as well as for removing unused keys.

    - -

    SourceLocatorCacheItemPool

    -

    This class manages a collection of source locator cache items. Similar to the EntityCacheItemPool, it provides methods for adding, deleting, and retrieving cache items, and committing deferred cache operations.

    - -

    ObjectNotFoundException

    -

    This class defines an exception to be thrown when a requested object is not found in the cache. It extends the base PHP Exception class.

    - -

    LocalObjectCache

    -

    This class provides methods for caching and retrieving the results of method calls. This can help improve performance by avoiding the need for expensive or duplicate method calls.

    -``` diff --git a/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig deleted file mode 100644 index 8263468a..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Configuration/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Core Configuration' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig deleted file mode 100644 index aed6b562..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Logger/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Core Logger' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig deleted file mode 100644 index 9bdfa8fe..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Parser/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Core Parser' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig deleted file mode 100644 index 94089fdd..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Plugin/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Core Plugin' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig b/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig deleted file mode 100644 index c95e7b4a..00000000 --- a/demo/demo7-template-content/templates/tech/Core/Renderer/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Core Renderer' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig b/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig deleted file mode 100644 index b52ecc33..00000000 --- a/demo/demo7-template-content/templates/tech/LanguageHandler/Php/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'PHP Language Handler' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig b/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig deleted file mode 100644 index 9943ec78..00000000 --- a/demo/demo7-template-content/templates/tech/LanguageHandler/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Language Handler' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/demo/demo7-template-content/templates/tech/index.md.twig b/demo/demo7-template-content/templates/tech/index.md.twig deleted file mode 100644 index b5239b81..00000000 --- a/demo/demo7-template-content/templates/tech/index.md.twig +++ /dev/null @@ -1,2 +0,0 @@ -{% set title = 'Technical Overview' %} -{{ generatePageBreadcrumbs(title, _self) }} diff --git a/src/AI/Console/GenerateTemplatesContentCommand.php b/src/AI/Console/GenerateTemplatesContentCommand.php deleted file mode 100644 index 9bcfabd0..00000000 --- a/src/AI/Console/GenerateTemplatesContentCommand.php +++ /dev/null @@ -1,73 +0,0 @@ - 'Path to the directory of the documented project', - 'templates_dir' => 'Path to directory with documentation templates', - 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', - ]; - } - - protected function configure(): void - { - $this->setName(self::NAME) - ->setDescription('Leverage AI to generate content for doc templates.'); - $this->addSharedCommandOptions(); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - * @throws DependencyException - * @throws GuzzleException - * @throws JsonException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - * @throws ReflectionException - */ - protected function execute( - InputInterface $input, - OutputInterface $output - ): int { - $configuration = $this->getConfigurationFromInput($input); - - $provider = $this->getAIProvider($input, $configuration); - $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); - $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); - - $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); - $nonInteractive = (bool)$this->getValueFromOptionOrConfig( - $input, - $configuration, - 'non-interactive' - ); - - $docGen = $this->createDocGenInstance($input, $output); - $docGen->generateTemplatesContent($provider, $apiKey, $model, $nonInteractive, $systemPrompt); - return Command::SUCCESS; - } -} diff --git a/src/AI/Console/InitDocsStructureCommand.php b/src/AI/Console/InitDocsStructureCommand.php deleted file mode 100644 index 786c0ba0..00000000 --- a/src/AI/Console/InitDocsStructureCommand.php +++ /dev/null @@ -1,75 +0,0 @@ - 'Path to the directory of the documented project', - 'templates_dir' => 'Path to directory with documentation templates', - 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', - ]; - } - - protected function configure(): void - { - $this->setName(self::NAME) - ->setDescription('Leverage AI to establish a documentation structure with empty files.'); - $this->addSharedCommandOptions(); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - * @throws DependencyException - * @throws InvalidConfigurationParameterException - * @throws NotFoundException - * @throws GuzzleException - * @throws JsonException - */ - protected function execute( - InputInterface $input, - OutputInterface $output - ): int { - $configuration = $this->getConfigurationFromInput($input); - - $provider = $this->getAIProvider($input, $configuration); - $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); - $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); - - $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); - $nonInteractive = (bool)$this->getValueFromOptionOrConfig( - $input, - $configuration, - 'non-interactive' - ); - $this->createDocGenInstance($input, $output)->initDocsStructure( - $provider, - $apiKey, - $model, - $nonInteractive, - $systemPrompt - ); - return self::SUCCESS; - } -} diff --git a/src/AI/Generators/TemplateContentGenerator.php b/src/AI/Generators/TemplateContentGenerator.php deleted file mode 100644 index bafb70dc..00000000 --- a/src/AI/Generators/TemplateContentGenerator.php +++ /dev/null @@ -1,152 +0,0 @@ -getMethodStubs($fileNamespaces, $entitiesCollection); - $prompts[] = $this->aiHandler->formatDataPrompt( - 'Method Stubs', - $methodStubs - ); - - if ($additionalPrompt) { - $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); - } - - $prompts[] = ' Produce content for an "index.twig" file titled "' . $fileName . '"'; - - if ($systemPrompt === null) { - $systemPrompt = $this->aiHandler->getSystemPrompt('templateContentGeneration'); - } else { - $systemPrompt = file_get_contents($systemPrompt); - } - - $aiContent = $this->aiHandler->sendPrompts($prompts, $systemPrompt); - - return $fileContent . "\n" . $aiContent; - } - - /** - * @throws ReflectionException - * @throws InvalidConfigurationParameterException - */ - private function getEntities(ClassEntityCollection|array $entitiesCollection): \Generator - { - foreach ($entitiesCollection as $classEntity) { - /**@var ClassEntity $classEntity */ - if ( - !$classEntity->entityDataCanBeLoaded() || array_key_exists( - $classEntity->getName(), - $this->alreadyProcessedEntities - ) - ) { - continue; - } - $interfaces = $classEntity->getInterfacesEntities(); - if ($interfaces) { - yield from $this->getEntities($interfaces); - } - $parentClass = $classEntity->getParentClass(); - if ($parentClass) { - yield from $this->getEntities([$parentClass]); - } - $this->alreadyProcessedEntities[$classEntity->getName()] = 1; - yield $classEntity; - } - } - - /** - * @throws ReflectionException - * @throws DependencyException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - private function getMethodStubs( - array $fileNamespaces, - ?ClassEntityCollection $entitiesCollection - ): string { - $tree = []; - $this->alreadyProcessedEntities = []; - - foreach ($this->getEntities($entitiesCollection) as $entity) { - $nsCheck = in_array($entity->getNamespaceName(), $fileNamespaces, true); - if ($nsCheck) { - $methods = $entity->getMethodEntityCollection(); - $simpleEntityName = $this->getSimpleEntityName($entity->getName()); - foreach ($methods as $method) { - /** @var MethodEntity $method */ - $methodString = $method->getName() . '(' . $method->getParametersString() . ')'; - $description = $method->getDescription(); - - if (!isset($tree[$entity->getNamespaceName()])) { - $tree[$entity->getNamespaceName()] = []; - } - - if (!isset($tree[$entity->getNamespaceName()][$simpleEntityName])) { - $tree[$entity->getNamespaceName()][$simpleEntityName] = []; - } - - $tree[$entity->getNamespaceName()][$simpleEntityName][$methodString] = $description; - } - } - } - return $this->treeToText($tree); - } - - private function getSimpleEntityName(string $fullEntityName): string - { - $parts = explode('\\', $fullEntityName); - return end($parts); - } - - private function treeToText(array $tree, $indentLevel = 0): string - { - $text = ''; - $indent = str_repeat(' ', $indentLevel); - - foreach ($tree as $key => $value) { - if (is_array($value)) { - $text .= $indent . $key . ":\n"; - $text .= $this->treeToText($value, $indentLevel + 1); - } else { - $text .= $indent . $key . ": " . $value . "\n"; - } - } - - return $text; - } -} diff --git a/src/AI/Generators/TemplateStructureGenerator.php b/src/AI/Generators/TemplateStructureGenerator.php deleted file mode 100644 index 85b4217e..00000000 --- a/src/AI/Generators/TemplateStructureGenerator.php +++ /dev/null @@ -1,74 +0,0 @@ - $e->getNamespaceName(), - iterator_to_array($rootEntityCollection) - ); - $namespacesList = array_unique($namespacesList); - - $prompts = []; - $prompts[] = $this->aiHandler->formatDataPrompt( - 'Namespaces', - implode( - "\n", - $namespacesList - ) - ); - - if ($systemPrompt === null) { - $systemPrompt = $this->aiHandler->getSystemPrompt('templateStructureGeneration'); - } - - if ($additionalPrompt) { - $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); - } - - $content = $this->aiHandler->sendPrompts($prompts, $systemPrompt); - - file_put_contents($this->aiConfigDirectory . '/structure.json', $content); - - $structure = json_decode($content, true, 512, JSON_THROW_ON_ERROR); - - $finalStructure = [ - "/readme.md.twig" => "About the project", - ]; - - foreach ($structure as $dir => $info) { - $finalStructure["/tech{$dir}index.md.twig"] = $info['name']; - } - - $finalStructure["/tech/index.md.twig"] = "Technical Overview"; - return $finalStructure; - } -} diff --git a/src/AI/Prompts/templateContentGeneration b/src/AI/Prompts/templateContentGeneration deleted file mode 100644 index e29cfae1..00000000 --- a/src/AI/Prompts/templateContentGeneration +++ /dev/null @@ -1 +0,0 @@ -You're tasked with generating an overview of the technical documentation from class names within a namespace. For each class, provide a brief high-level description of its purpose and responsibilities. Do not delve into specific methods or properties. Link to detailed class documentation using: \Namespace\ClassName. diff --git a/src/AI/Prompts/templateStructureGeneration b/src/AI/Prompts/templateStructureGeneration deleted file mode 100644 index 6771727b..00000000 --- a/src/AI/Prompts/templateStructureGeneration +++ /dev/null @@ -1,18 +0,0 @@ -Given a list of PHP namespaces, generate a JSON representation of a condensed documentation file structure based on the criteria below: - - Group related namespaces. - - Exclude the top-level namespace. - - Represent each path with associated metadata: a human-readable name and a list of related namespaces. - -Return the response in pure JSON format only, without any markdown or additional context. - -Example Output: -{ - "/tech/": { - "name": "Technical description", - "namespaces": ["\Namespace\Tech"] - }, - "/tech/events/": { - "name": "Events to call", - "namespaces": ["\Namespace\Tech\Events", "\Namespace\Tech\Events\Listener"] - } -} diff --git a/src/Console/App.php b/src/Console/App.php index 58819ef8..4dfc8606 100644 --- a/src/Console/App.php +++ b/src/Console/App.php @@ -6,8 +6,6 @@ use BumbleDocGen\AI\Console\AddDocBlocksCommand; use BumbleDocGen\AI\Console\GenerateReadMeTemplateCommand; -use BumbleDocGen\AI\Console\InitDocsStructureCommand; -use BumbleDocGen\AI\Console\GenerateTemplatesContentCommand; use BumbleDocGen\Console\Command\GenerateCommand; use BumbleDocGen\DocGeneratorFactory; use Symfony\Component\Console\Application; @@ -36,8 +34,6 @@ public function __construct() $this->add(new GenerateCommand()); $this->add(new GenerateReadMeTemplateCommand()); $this->add(new AddDocBlocksCommand()); - $this->add(new InitDocsStructureCommand()); - $this->add(new GenerateTemplatesContentCommand()); $this->setExtraCommands(); } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 5af60242..1adb4a05 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -6,8 +6,6 @@ use BumbleDocGen\AI\Generators\DocBlocksGenerator; use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; -use BumbleDocGen\AI\Generators\TemplateContentGenerator; -use BumbleDocGen\AI\Generators\TemplateStructureGenerator; use BumbleDocGen\AI\ProviderFactory; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; @@ -75,76 +73,6 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr return $this->rootEntityCollectionsGroup; } - /** - * Generate documentation structure with blank templates using AI tools - * - * @throws InvalidConfigurationParameterException - */ - public function initDocsStructure( - string $aiHandler, - string $aiApiKey, - string $aiModel, - bool $nonInteractive = false, - ?string $systemPrompt = null, - ): void { - $this->parser->parse(); - $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - - $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); - $aiDirectory = $this->configuration->getAiDataDir(); - - $templatesStructureGenerator = new TemplateStructureGenerator($aiProvider, $aiDirectory); - - do { - if ($nonInteractive) { - $additionalPrompt = null; - } else { - $additionalPrompt = $this->io->ask( - 'Write instructions for more accurate template structure generation ( or just skip this step )' - ) ?: null; - } - $this->io->note("Sending " . $aiProvider->getName() . " request"); - $structure = $templatesStructureGenerator->generateStructureByEntityCollection( - $entitiesCollection, - $additionalPrompt, - $systemPrompt - ); - $structureAsString = implode( - "\n", - array_map(fn($v, $k) => "{$k} => {$v}", $structure, array_keys($structure)) - ); - if ($nonInteractive) { - $action = 'Save'; - } else { - $action = $this->io->choice( - "The proposed documentation structure is as follows:\n\n{$structureAsString}", - ['Save', 'Regenerate', 'Cancel'] - ); - } - } while ($action === 'Regenerate'); - - if ($action === 'Save') { - $templatesDir = $this->configuration->getTemplatesDir(); - $finder = new Finder(); - $finder->files()->in($this->configuration->getTemplatesDir()); - if ( - $finder->hasResults() && - $this->io->confirm("Directory `{$templatesDir}` already contains files. Clean before saving new ones?") - ) { - $this->fs->remove([$templatesDir]); - } - - foreach ($structure as $fileName => $title) { - $fileName = $templatesDir . $fileName; - $this->fs->appendToFile($fileName, "{% set title = '{$title}' %}\n"); - if (!str_ends_with($fileName, 'readme.md.twig')) { - $this->fs->appendToFile($fileName, "{{ generatePageBreadcrumbs(title, _self) }}\n"); - } - $this->logger->notice("Creating `{$fileName}` template"); - } - } - } - /** * Generate missing docBlocks with ChatGPT for project class methods that are available for documentation * @@ -327,78 +255,6 @@ public function generateReadmeTemplate( } } - /** - * @throws ReflectionException - * @throws DependencyException - * @throws JsonException - * @throws NotFoundException - * @throws InvalidConfigurationParameterException - */ - public function generateTemplatesContent( - string $aiHandler, - string $aiApiKey, - string $aiModel, - bool $nonInteractive = false, - ?string $systemPrompt = null, - ): void { - $this->parser->parse(); - $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - - $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); - $aiConfigDirectory = $this->configuration->getAiDataDir(); - $templateGenerator = new TemplateContentGenerator($aiProvider); - $aiStructure = file_get_contents($aiConfigDirectory . '/structure.json'); - $aiStructure = json_decode($aiStructure, true, 512, JSON_THROW_ON_ERROR); - - foreach ($aiStructure as $path => $data) { - $template = $this->configuration->getTemplatesDir() . '/tech' . $path . 'index.md.twig'; - do { - $this->io->note( - 'Creating template for ' . $template - ); - if ($nonInteractive) { - $additionalPrompt = null; - } else { - $processThisTemplate = $this->io->choice( - 'Do you want to create this template?', - ['Yes', 'No'], - 'Yes' - ); - if ($processThisTemplate === 'No') { - continue(2); - } - $additionalPrompt = $this->io->ask( - 'Add additional information about this ( or just skip this step )' - ) ?: null; - } - $this->io->note("Sending " . $aiProvider->getName() . " request"); - $content = $templateGenerator->generate( - $template, - $data['name'], - $data['namespaces'], - $entitiesCollection, - $additionalPrompt, - $systemPrompt, - ); - if (!$nonInteractive) { - $action = $this->io->choice( - "The proposed documentation is as follows:\n\n{$content}", - ['Save', 'Regenerate', 'Cancel'] - ); - } else { - $action = 'Save'; - } - } while ($action === 'Regenerate'); - - if ($action === 'Save') { - $this->logger->notice( - 'Saving file: .' . $template - ); - $this->fs->dumpFile($template, $content); - } - } - } - /** * Generates documentation using configuration * From 2b9de19526f2df00931b8839c5c6fdbf6a26669e Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 17:50:54 +0000 Subject: [PATCH 28/33] AI command/generator changes - Switches to using custom config options - Has console command build the AI provider for use in functions - Switches to asking for provider/model/api key if not provided - Tests API key is valid --- src/AI/Console/AddDocBlocksCommand.php | 19 +-- .../Console/GenerateReadMeTemplateCommand.php | 14 +- src/AI/Generators/DocBlocksGenerator.php | 5 +- src/AI/Generators/ReadmeTemplateGenerator.php | 5 +- src/AI/ProviderFactory.php | 8 +- src/AI/Providers/OpenAI/Provider.php | 8 +- src/AI/Traits/SharedCommandLogicTrait.php | 155 +++++++++--------- src/Core/Configuration/Configuration.php | 40 ++--- src/DocGenerator.php | 20 +-- 9 files changed, 111 insertions(+), 163 deletions(-) diff --git a/src/AI/Console/AddDocBlocksCommand.php b/src/AI/Console/AddDocBlocksCommand.php index fa53acae..1826f010 100644 --- a/src/AI/Console/AddDocBlocksCommand.php +++ b/src/AI/Console/AddDocBlocksCommand.php @@ -27,6 +27,9 @@ protected function getCustomConfigOptionsMap(): array 'project_root' => 'Path to the directory of the documented project', 'templates_dir' => 'Path to directory with documentation templates', 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', + 'ai_provider' => 'The AI service to use, options: openai', + 'ai_api_key' => 'The API key to use when interacting with the AI', + 'ai_model' => 'The AI model to use', ]; } @@ -34,7 +37,6 @@ protected function configure(): void { $this->setName(self::NAME) ->setDescription('Leverage AI to insert missing doc blocks in code.'); - $this->addSharedCommandOptions(); } /** @@ -52,18 +54,11 @@ protected function execute( InputInterface $input, OutputInterface $output ): int { - $configuration = $this->getConfigurationFromInput($input); - $provider = $this->getAIProvider($input, $configuration); - $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); - $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); - $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + // Initialise AI provider from params/config + $aiProvider = $this->initAiProvider($input, $output); - $this->createDocGenInstance($input, $output)->addDocBlocks( - $provider, - $apiKey, - $model, - $systemPrompt - ); + // Generate doc blocks + $this->createDocGenInstance($input, $output)->addDocBlocks($aiProvider); return self::SUCCESS; } diff --git a/src/AI/Console/GenerateReadMeTemplateCommand.php b/src/AI/Console/GenerateReadMeTemplateCommand.php index 50ac014b..909dd60a 100644 --- a/src/AI/Console/GenerateReadMeTemplateCommand.php +++ b/src/AI/Console/GenerateReadMeTemplateCommand.php @@ -27,6 +27,9 @@ protected function getCustomConfigOptionsMap(): array 'project_root' => 'Path to the directory of the documented project', 'templates_dir' => 'Path to directory with documentation templates', 'cache_dir' => 'Configuration parameter: Path to the directory where the documentation generator cache will be saved', + 'ai_provider' => 'The AI service to use, options: openai', + 'ai_api_key' => 'The API key to use when interacting with the AI', + 'ai_model' => 'The AI model to use', ]; } @@ -34,7 +37,6 @@ protected function configure(): void { $this->setName(self::NAME) ->setDescription('Leverage AI to generate content for a project readme.md file.'); - $this->addSharedCommandOptions(false); } @@ -50,14 +52,12 @@ protected function execute( InputInterface $input, OutputInterface $output ): int { - $configuration = $this->getConfigurationFromInput($input); + // Initialise AI provider from params/config + $aiProvider = $this->initAiProvider($input, $output); - $provider = $this->getAIProvider($input, $configuration); - $apiKey = $this->getAIApiKey($input, $output, $configuration, $provider); - $model = $this->getAIModel($input, $output, $configuration, $provider, $apiKey); - $systemPrompt = $this->getValueFromOptionOrConfig($input, $configuration, 'system-prompt'); + // Generate Read me + $this->createDocGenInstance($input, $output)->generateReadmeTemplate($aiProvider); - $this->createDocGenInstance($input, $output)->generateReadmeTemplate($provider, $apiKey, $model, $systemPrompt); return self::SUCCESS; } } diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 8d95f56e..404ea1ec 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -54,7 +54,6 @@ public function hasMethodsWithoutDocBlocks(RootEntityInterface $rootEntity): boo */ public function generateDocBlocksForMethodsWithoutIt( RootEntityInterface $rootEntity, - ?string $systemPrompt = null, int $mode = self::MODE_READ_ONLY_SIGNATURES, ): array { if (!is_a($rootEntity, ClassEntity::class)) { @@ -151,9 +150,7 @@ public function generateDocBlocksForMethodsWithoutIt( $toRequest ) . "\n}"; - if ($systemPrompt === null) { - $systemPrompt = $this->aiHandler->getSystemPrompt('docBlockGeneration'); - } + $systemPrompt = $this->aiHandler->getSystemPrompt('docBlockGeneration'); $prompts = [$requestData]; $responseData = $this->aiHandler->sendPrompts($prompts, $systemPrompt); $responseData = json_decode($responseData, true, 512, JSON_THROW_ON_ERROR); diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index e5f10d87..97b98a65 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -37,7 +37,6 @@ public function generateReadmeFileContent( array $entryPoints = [], ?string $composerJsonFile = null, ?string $additionalPrompt = null, - ?string $systemPrompt = null, ): string { if (!is_a($rootEntityCollection, ClassEntityCollection::class)) { throw new \InvalidArgumentException('Currently we can only work with collections of PHP entities'); @@ -81,9 +80,7 @@ public function generateReadmeFileContent( $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); } - if ($systemPrompt === null) { - $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateGeneration'); - } + $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateGeneration'); return $this->aiHandler->sendPrompts($prompts, $systemPrompt); } } diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index 3cc551b2..201592a8 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -9,14 +9,14 @@ final class ProviderFactory { - private const VALID_PROVIDERS = [OpenAIProvider::NAME]; + public const VALID_PROVIDERS = [OpenAIProvider::NAME]; - public static function create(string $handler, string $apiKey, string $model): ProviderInterface + public static function create(string $provider, string $apiKey, ?string $model = null): ProviderInterface { - return match ($handler) { + return match ($provider) { OpenAIProvider::NAME => new OpenAIProvider($apiKey, $model), default => throw new RuntimeException( - "Parameter 'ai-handler' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!", + "Parameter 'ai-provider' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!", ), }; } diff --git a/src/AI/Providers/OpenAI/Provider.php b/src/AI/Providers/OpenAI/Provider.php index f8364932..d6b4a7bd 100644 --- a/src/AI/Providers/OpenAI/Provider.php +++ b/src/AI/Providers/OpenAI/Provider.php @@ -29,19 +29,13 @@ public function __construct(string $bearerToken, ?string $model) 'Authorization' => 'Bearer ' . $bearerToken ]; - //todo: pass through in config - $organisation = null; - if ($organisation !== null) { - $headers['OpenAI-Organization'] = $organisation; - } - $client = new Client( [ 'headers' => $headers ] ); $this->client = $client; - $this->model = $model; + $this->model = $model ?? 'gpt-4'; $this->temperature = 0.5; $this->frequencyPenalty = 0; $this->maxTokens = null; diff --git a/src/AI/Traits/SharedCommandLogicTrait.php b/src/AI/Traits/SharedCommandLogicTrait.php index bce2f3cf..a3046393 100644 --- a/src/AI/Traits/SharedCommandLogicTrait.php +++ b/src/AI/Traits/SharedCommandLogicTrait.php @@ -2,7 +2,8 @@ namespace BumbleDocGen\AI\Traits; -use BumbleDocGen\AI\Providers\OpenAI\Provider as OpenAIProvider; +use BumbleDocGen\AI\ProviderFactory; +use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\DocGeneratorFactory; use DI\DependencyException; @@ -10,7 +11,6 @@ use GuzzleHttp\Exception\GuzzleException; use JsonException; use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ChoiceQuestion; use Symfony\Component\Console\Question\Question; @@ -18,114 +18,107 @@ trait SharedCommandLogicTrait { /** - * @throws DependencyException * @throws NotFoundException + * @throws GuzzleException + * @throws DependencyException + * @throws JsonException */ - protected function getConfigurationFromInput(InputInterface $input): Configuration - { - return (new DocGeneratorFactory())->createConfiguration($input->getOption('config')); - } + protected function initAiProvider( + InputInterface $input, + OutputInterface $output, + ): ProviderInterface { + $config = (new DocGeneratorFactory())->createConfiguration($input->getOption('config')); + $configParams = $this->getCustomConfigurationParameters($input); - protected function addSharedCommandOptions($nonInteractiveAvailable = true): void - { - if ($nonInteractiveAvailable) { - $this->addOption( - 'non-interactive', - '', - InputOption::VALUE_NONE, - "Use non-interactive mode, doesn't prompt for additional information.", - ); + // Get Provider, request if not found + $provider = $this->getValueFromParamOrConfig($configParams, $config, 'ai_provider'); + if ($provider === null) { + $provider = $this->askForAiProvider($input, $output); } - $this->addOption( - 'provider', - '', - InputOption::VALUE_REQUIRED, - 'The AI service to use, options: openai', - ); - $this->addOption( - 'api-key', - '', - InputOption::VALUE_REQUIRED, - 'The API key to use when interacting with the AI', - ); - $this->addOption( - 'model', - '', - InputOption::VALUE_OPTIONAL, - 'The AI model to use', - ); - $this->addOption( - 'system-prompt', - '', - InputOption::VALUE_OPTIONAL, - 'A path to a file containing the system prompt, defaults available in `src/AI/Prompts`', - ); - } - protected function getAIProvider(InputInterface $input, Configuration $configuration): string - { - $handler = $this->getValueFromOptionOrConfig($input, $configuration, 'provider'); - if (empty($handler)) { - $handler = OpenAIProvider::NAME; + // Get API Key, request if not found + $apiKey = $this->getValueFromParamOrConfig($configParams, $config, 'ai_api_key'); + if ($apiKey === null) { + $apiKey = $this->askForAiApiKey($input, $output); + } + + // Test API key is valid + $aiProvider = ProviderFactory::create($provider, $apiKey); + $apiKeyTest = $this->testProviderAPIKey($aiProvider); + if (!$apiKeyTest) { + throw new \RuntimeException('Parameter/config: `ai_api_key` is invalid!'); + } + + // Get model, request if not found + $model = $this->getValueFromParamOrConfig($configParams, $config, 'ai_model'); + if ($model === null) { + $model = $this->askForAIModel($input, $output, $aiProvider); } - return $handler; + + // Return finalised provider + return ProviderFactory::create($provider, $apiKey, $model); } - protected function getAIApiKey( + private function askForAiApiKey( InputInterface $input, OutputInterface $output, - Configuration $configuration, - string $provider ) { - $apiKey = $this->getValueFromOptionOrConfig($input, $configuration, 'api-key'); - if (empty($apiKey) && $provider === OpenAIProvider::NAME) { - $question = new Question('Please provide the API key: '); - $helper = $this->getHelper('question'); - $apiKey = $helper->ask($input, $output, $question); - } - return $apiKey; + $question = new Question('Please provide the API key: '); + return $this->getHelper('question')->ask($input, $output, $question); + } + + private function askForAiProvider( + InputInterface $input, + OutputInterface $output, + ) { + $question = new ChoiceQuestion( + 'Please choose one of the available AI providers:', + ProviderFactory::VALID_PROVIDERS, + ); + $question->setErrorMessage('Provider %s is invalid.'); + return $this->getHelper('question')->ask($input, $output, $question); } /** * @throws GuzzleException * @throws JsonException */ - protected function getAIModel( + private function askForAIModel( InputInterface $input, OutputInterface $output, - Configuration $configuration, - string $provider, - string $apiKey, - ): string { - $model = $this->getValueFromOptionOrConfig($input, $configuration, 'model'); - if (empty($model) && $provider === OpenAIProvider::NAME) { - $openAiProvider = new OpenAIProvider($apiKey, null); - $models = $openAiProvider->getAvailableModels(); + ProviderInterface $provider + ): ?string { + if (method_exists($provider, 'getAvailableModels')) { + $models = $provider->getAvailableModels(); $question = new ChoiceQuestion( 'Please choose one of the available models:', $models, - 0 ); $question->setErrorMessage('Model %s is invalid.'); - $helper = $this->getHelper('question'); - $model = $helper->ask($input, $output, $question); + return $this->getHelper('question')->ask($input, $output, $question); } - return $model; + throw new \RuntimeException('Missing parameter/config: `ai_model`'); } - protected function getValueFromOptionOrConfig( - InputInterface $input, - Configuration $configuration, - $key - ): string|bool|null { - $value = $input->getOption($key); - if ($value) { - return $value; + private function testProviderAPIKey(ProviderInterface $provider): bool + { + if (method_exists($provider, 'getAvailableModels')) { + try { + $provider->getAvailableModels(); + } catch (JsonException | GuzzleException) { + return false; + } + } + return true; + } + + private function getValueFromParamOrConfig(array $configParams, Configuration $configuration, $key): ?string + { + if (array_key_exists($key, $configParams)) { + return $configParams[$key]; } - $aiConfig = $configuration->getAIConfig(); - $key = str_replace('-', '_', $key); - return $aiConfig[$key] ?? null; + return $configuration->getIfExists($key); } } diff --git a/src/Core/Configuration/Configuration.php b/src/Core/Configuration/Configuration.php index 4cdb75a9..969b1e46 100644 --- a/src/Core/Configuration/Configuration.php +++ b/src/Core/Configuration/Configuration.php @@ -98,27 +98,6 @@ public function getTemplatesDir(): string return $templatesDir; } - public function getAiDataDir(): string - { - $dataDir = $this->parameterBag->getSubConfigurationParameterBag('ai')->validateAndGetStringValue( - 'data_dir', - false - ); - $parentDir = dirname($dataDir); - if (!$parentDir || !is_dir($parentDir)) { - throw new InvalidConfigurationParameterException( - "`ai:data_dir` cannot be created because parent directory `{$parentDir}` does not exist" - ); - } - if (!file_exists($dataDir)) { - $this->logger->notice("Creating `{$dataDir}` directory"); - mkdir($dataDir); - } - $dataDir = realpath($dataDir); - $this->localObjectCache->cacheMethodResult(__METHOD__, '', $dataDir); - return $dataDir; - } - /** * @throws InvalidConfigurationParameterException */ @@ -377,17 +356,22 @@ public function getAdditionalConsoleCommands(): AdditionalCommandCollection return $additionalCommandCollection; } - public function getAIConfig(): array + /** + * @throws InvalidConfigurationParameterException + */ + public function getIfExists($key): ?string { try { - return $this->localObjectCache->getMethodCachedResult(__METHOD__, ''); + return $this->localObjectCache->getMethodCachedResult(__METHOD__, $key); } catch (ObjectNotFoundException) { } - if (!$this->parameterBag->has('ai')) { - return []; + + if (!$this->parameterBag->has($key)) { + return null; } - $aiConfig = $this->parameterBag->get('ai', false); - $this->localObjectCache->cacheMethodResult(__METHOD__, '', $aiConfig); - return $aiConfig; + $value = $this->parameterBag->validateAndGetStringValue($key, false); + + $this->localObjectCache->cacheMethodResult(__METHOD__, $key, $value); + return $value; } } diff --git a/src/DocGenerator.php b/src/DocGenerator.php index 1adb4a05..bce61c25 100644 --- a/src/DocGenerator.php +++ b/src/DocGenerator.php @@ -6,7 +6,7 @@ use BumbleDocGen\AI\Generators\DocBlocksGenerator; use BumbleDocGen\AI\Generators\ReadmeTemplateGenerator; -use BumbleDocGen\AI\ProviderFactory; +use BumbleDocGen\AI\ProviderInterface; use BumbleDocGen\Core\Configuration\Configuration; use BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException; use BumbleDocGen\Core\Logger\Handler\GenerationErrorsHandler; @@ -23,7 +23,6 @@ use DI\NotFoundException; use Exception; use Generator; -use JsonException; use Monolog\Logger; use Psr\Cache\InvalidArgumentException; use Symfony\Component\Console\Formatter\OutputFormatterStyle; @@ -82,10 +81,7 @@ public function parseAndGetRootEntityCollectionsGroup(): RootEntityCollectionsGr * @throws InvalidConfigurationParameterException */ public function addDocBlocks( - string $aiHandler, - string $aiApiKey, - string $aiModel, - ?string $systemPrompt = null, + ProviderInterface $aiProvider, ): void { if (!$this->io->confirm("This command will change the source code of your project. Continue?")) { return; @@ -93,9 +89,6 @@ public function addDocBlocks( $this->parser->parse(); $entitiesCollection = $this->rootEntityCollectionsGroup->get(ClassEntityCollection::NAME); - - $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); - $missingDocBlocksGenerator = new DocBlocksGenerator($aiProvider, $this->parserHelper); $alreadyProcessedEntities = []; @@ -136,7 +129,7 @@ public function addDocBlocks( continue; } $this->logger->notice("Processing `{$entity->getName()}` class"); - $newBocBlocks = $missingDocBlocksGenerator->generateDocBlocksForMethodsWithoutIt($entity, $systemPrompt); + $newBocBlocks = $missingDocBlocksGenerator->generateDocBlocksForMethodsWithoutIt($entity); $classFileContent = $entity->getFileContent(); $toReplace = []; @@ -172,10 +165,7 @@ public function addDocBlocks( * @throws InvalidConfigurationParameterException */ public function generateReadmeTemplate( - string $aiHandler, - string $aiApiKey, - string $aiModel, - ?string $systemPrompt = null, + ProviderInterface $aiProvider, ): void { $this->io->note("Project analysis"); $this->parser->parse(); @@ -234,7 +224,6 @@ public function generateReadmeTemplate( 'Write instructions for more accurate documentation generation ( or just skip this step )' ); - $aiProvider = ProviderFactory::create($aiHandler, $aiApiKey, $aiModel); $readmeTemplateFiller = new ReadmeTemplateGenerator($aiProvider); $this->io->note("Sending " . $aiProvider->getName() . " request"); $readmeFileContent = $readmeTemplateFiller->generateReadmeFileContent( @@ -242,7 +231,6 @@ public function generateReadmeTemplate( $entryPoints, $composerJsonFile, $additionalPrompt, - $systemPrompt ); $fileContent = "{% set title = 'About the project' %}\n{$readmeFileContent}"; From 44409ecf70e0d04b7adee0d8bb550260c21ff405 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 17:53:20 +0000 Subject: [PATCH 29/33] Updates demo ordering --- .gitignore | 2 +- .../demo-config.yaml | 4 ++-- .../demoScript.php | 6 +++--- .../demo-config.yaml | 4 ++-- .../demoScript.php | 6 +++--- .../demoScript.php | 2 +- .../templates/README.md.twig | 2 +- .../.gitignore | 0 .../demo-config.yaml | 4 ++-- .../demoScript.php | 0 10 files changed, 15 insertions(+), 15 deletions(-) rename demo/{demo3-add-missing-doc-blocks => demo2-add-missing-doc-blocks}/demo-config.yaml (73%) rename demo/{demo3-add-missing-doc-blocks => demo2-add-missing-doc-blocks}/demoScript.php (77%) rename demo/{demo4-generating-readme-file => demo3-generating-readme-file}/demo-config.yaml (73%) rename demo/{demo4-generating-readme-file => demo3-generating-readme-file}/demoScript.php (78%) rename demo/{demo5-config-array => demo4-config-array}/demoScript.php (95%) rename demo/{demo5-config-array => demo4-config-array}/templates/README.md.twig (73%) rename demo/{demo6-unified-document-structure => demo5-unified-document-structure}/.gitignore (100%) rename demo/{demo6-unified-document-structure => demo5-unified-document-structure}/demo-config.yaml (75%) rename demo/{demo6-unified-document-structure => demo5-unified-document-structure}/demoScript.php (100%) diff --git a/.gitignore b/.gitignore index bdfaeda6..23f21656 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ composer.phar /demo/demo1/docs/ /demo/demo2-templates-generation/templates/ -/demo/demo4-generating-readme-file/templates/ +/demo/demo3-generating-readme-file/templates/ diff --git a/demo/demo3-add-missing-doc-blocks/demo-config.yaml b/demo/demo2-add-missing-doc-blocks/demo-config.yaml similarity index 73% rename from demo/demo3-add-missing-doc-blocks/demo-config.yaml rename to demo/demo2-add-missing-doc-blocks/demo-config.yaml index 76753b22..228705e0 100644 --- a/demo/demo3-add-missing-doc-blocks/demo-config.yaml +++ b/demo/demo2-add-missing-doc-blocks/demo-config.yaml @@ -1,6 +1,6 @@ project_root: '%DOC_GEN_LIB_PATH%' -cache_dir: '%WORKING_DIR%/demo/demo3-add-missing-doc-blocks/__cache' -templates_dir: '%WORKING_DIR%/demo/demo3-add-missing-doc-blocks/templates' +cache_dir: '%WORKING_DIR%/demo/demo2-add-missing-doc-blocks/__cache' +templates_dir: '%WORKING_DIR%/demo/demo2-add-missing-doc-blocks/templates' language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler diff --git a/demo/demo3-add-missing-doc-blocks/demoScript.php b/demo/demo2-add-missing-doc-blocks/demoScript.php similarity index 77% rename from demo/demo3-add-missing-doc-blocks/demoScript.php rename to demo/demo2-add-missing-doc-blocks/demoScript.php index 59935dc7..e1bbf39c 100644 --- a/demo/demo3-add-missing-doc-blocks/demoScript.php +++ b/demo/demo2-add-missing-doc-blocks/demoScript.php @@ -13,9 +13,9 @@ $application = new App(); $input = new ArrayInput([ 'command' => AddDocBlocksCommand::NAME, - '--config' => 'demo/demo3-add-missing-doc-blocks/demo-config.yaml', - '--provider' => 'openai', - '--model' => 'gpt-4', + '--config' => 'demo/demo2-add-missing-doc-blocks/demo-config.yaml', + '--ai_provider' => 'openai', + '--ai_model' => 'gpt-4', ]); $application->run($input); } catch (\Exception $e) { diff --git a/demo/demo4-generating-readme-file/demo-config.yaml b/demo/demo3-generating-readme-file/demo-config.yaml similarity index 73% rename from demo/demo4-generating-readme-file/demo-config.yaml rename to demo/demo3-generating-readme-file/demo-config.yaml index edec479b..bca8adfc 100644 --- a/demo/demo4-generating-readme-file/demo-config.yaml +++ b/demo/demo3-generating-readme-file/demo-config.yaml @@ -1,6 +1,6 @@ project_root: '%DOC_GEN_LIB_PATH%' -cache_dir: '%WORKING_DIR%/demo/demo4-generating-readme-file/__cache' -templates_dir: '%WORKING_DIR%/demo/demo4-generating-readme-file/templates' +cache_dir: '%WORKING_DIR%/demo/demo3-generating-readme-file/__cache' +templates_dir: '%WORKING_DIR%/demo/demo3-generating-readme-file/templates' language_handlers: php: class: \BumbleDocGen\LanguageHandler\Php\PhpHandler diff --git a/demo/demo4-generating-readme-file/demoScript.php b/demo/demo3-generating-readme-file/demoScript.php similarity index 78% rename from demo/demo4-generating-readme-file/demoScript.php rename to demo/demo3-generating-readme-file/demoScript.php index aa244e41..055b061b 100644 --- a/demo/demo4-generating-readme-file/demoScript.php +++ b/demo/demo3-generating-readme-file/demoScript.php @@ -13,9 +13,9 @@ $application = new App(); $input = new ArrayInput([ 'command' => GenerateReadMeTemplateCommand::NAME, - '--config' => 'demo/demo4-generating-readme-file/demo-config.yaml', - '--provider' => 'openai', - '--model' => 'gpt-4', + '--config' => 'demo/demo3-generating-readme-file/demo-config.yaml', + '--ai_provider' => 'openai', + '--ai_model' => 'gpt-4', ]); $application->run($input); } catch (\Exception $e) { diff --git a/demo/demo5-config-array/demoScript.php b/demo/demo4-config-array/demoScript.php similarity index 95% rename from demo/demo5-config-array/demoScript.php rename to demo/demo4-config-array/demoScript.php index 7c733bd3..701a7c17 100644 --- a/demo/demo5-config-array/demoScript.php +++ b/demo/demo4-config-array/demoScript.php @@ -9,7 +9,7 @@ $docGen = (new \BumbleDocGen\DocGeneratorFactory()) ->createByConfigArray([ 'project_root' => '%WORKING_DIR%/vendor/doctrine', - 'demo_dir' => '%WORKING_DIR%/demo/demo5-config-array', // <= custom parameter + 'demo_dir' => '%WORKING_DIR%/demo/demo4-config-array', // <= custom parameter 'cache_dir' => '%demo_dir%/.cache', 'templates_dir' => '%demo_dir%/templates', 'output_dir' => "%demo_dir%/docs", diff --git a/demo/demo5-config-array/templates/README.md.twig b/demo/demo4-config-array/templates/README.md.twig similarity index 73% rename from demo/demo5-config-array/templates/README.md.twig rename to demo/demo4-config-array/templates/README.md.twig index c9231639..f370c324 100644 --- a/demo/demo5-config-array/templates/README.md.twig +++ b/demo/demo4-config-array/templates/README.md.twig @@ -6,4 +6,4 @@ To update this documentation, run the following command: -{{ 'php demo/demo5-config-array/demoScript.php' | textToCodeBlock('console') }} \ No newline at end of file +{{ 'php demo/demo4-config-array/demoScript.php' | textToCodeBlock('console') }} diff --git a/demo/demo6-unified-document-structure/.gitignore b/demo/demo5-unified-document-structure/.gitignore similarity index 100% rename from demo/demo6-unified-document-structure/.gitignore rename to demo/demo5-unified-document-structure/.gitignore diff --git a/demo/demo6-unified-document-structure/demo-config.yaml b/demo/demo5-unified-document-structure/demo-config.yaml similarity index 75% rename from demo/demo6-unified-document-structure/demo-config.yaml rename to demo/demo5-unified-document-structure/demo-config.yaml index 282d3021..92c129f4 100644 --- a/demo/demo6-unified-document-structure/demo-config.yaml +++ b/demo/demo5-unified-document-structure/demo-config.yaml @@ -1,6 +1,6 @@ parent_configuration: '%WORKING_DIR%/bumble_doc_gen.yaml' -demo_dir: '%WORKING_DIR%/demo/demo6-unified-document-structure' # Here I define a template configuration variable +demo_dir: '%WORKING_DIR%/demo/demo5-unified-document-structure' # Here I define a template configuration variable output_dir: "%demo_dir%/docs" cache_dir: '%demo_dir%/.bumbleDocGenCache' plugins: # Connecting this built-in plugin will change the structure of the configured document - - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin \ No newline at end of file + - class: \BumbleDocGen\LanguageHandler\Php\Plugin\CorePlugin\EntityDocUnifiedPlace\EntityDocUnifiedPlacePlugin diff --git a/demo/demo6-unified-document-structure/demoScript.php b/demo/demo5-unified-document-structure/demoScript.php similarity index 100% rename from demo/demo6-unified-document-structure/demoScript.php rename to demo/demo5-unified-document-structure/demoScript.php From e3d38d73080970ed0c47cdfcb3a17bc794b68ba7 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 17:56:01 +0000 Subject: [PATCH 30/33] This commit updates the documentation --- docs/classes/DocGenerator.md | 129 +- docs/shared_c.cache | 2 +- .../1.configuration/classes/Configuration.md | 124 +- docs/tech/2.parser/classes/ClassEntity.md | 110 +- .../2.parser/classes/ClassEntityCollection.md | 18 +- docs/tech/2.parser/classes/ConstantEntity.md | 34 +- .../classes/ConstantEntityCollection.md | 4 +- .../2.parser/classes/DynamicMethodEntity.md | 10 +- docs/tech/2.parser/classes/MethodEntity.md | 64 +- .../classes/MethodEntityCollection.md | 4 +- docs/tech/2.parser/classes/PropertyEntity.md | 42 +- .../classes/PropertyEntityCollection.md | 4 +- .../3.renderer/classes/BreadcrumbsHelper.md | 18 +- .../classes/ClassEntityCollection_2.md | 36 +- docs/tech/3.renderer/classes/DrawClassMap.md | 8 +- .../classes/DrawDocumentationMenu.md | 2 +- .../classes/GetDocumentedEntityUrl.md | 12 +- .../classes/GetDocumentedEntityUrl_2.md | 12 +- .../classes/GetDocumentedEntityUrl_3.md | 2 +- docs/tech/classes/App.md | 4 +- docs/tech/classes/Configuration.md | 124 +- docs/tech/classes/DocBlocksGenerator.md | 36 +- docs/tech/classes/DocGenerator.md | 129 +- .../GenerateTemplatesContentCommand.md | 1393 ----------------- docs/tech/classes/InitDocsStructureCommand.md | 1393 ----------------- docs/tech/classes/ProjectParser.md | 4 +- docs/tech/classes/Provider.md | 12 +- docs/tech/classes/ProviderFactory.md | 13 +- docs/tech/classes/ReadmeTemplateGenerator.md | 33 +- docs/tech/classes/TemplateContentGenerator.md | 166 -- .../classes/TemplateStructureGenerator.md | 155 -- docs/tech/map.md | 8 +- 32 files changed, 472 insertions(+), 3633 deletions(-) delete mode 100644 docs/tech/classes/GenerateTemplatesContentCommand.md delete mode 100644 docs/tech/classes/InitDocsStructureCommand.md delete mode 100644 docs/tech/classes/TemplateContentGenerator.md delete mode 100644 docs/tech/classes/TemplateStructureGenerator.md diff --git a/docs/classes/DocGenerator.md b/docs/classes/DocGenerator.md index c40ae41f..f52e4fcb 100644 --- a/docs/classes/DocGenerator.md +++ b/docs/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / DocGenerator

    - DocGenerator class: + DocGenerator class:

    @@ -34,17 +34,14 @@ final class DocGenerator
    1. - addMissingDocBlocks + addDocBlocks - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
    2. -
    3. - fillInReadmeMdTemplate -
    4. generate - Generates documentation using configuration
    5. - generateProjectTemplatesStructure - - Generate documentation structure with blank templates using AI tools
    6. + generateReadmeTemplate +
    7. parseAndGetRootEntityCollectionsGroup
    8. @@ -55,11 +52,11 @@ final class DocGenerator @@ -74,7 +71,7 @@ final class DocGenerator ```php @@ -154,18 +151,35 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
      ```php -public function addMissingDocBlocks(): void; +public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ```
      Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
      -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiProvider\BumbleDocGen\AI\ProviderInterface-
      Return value: void @@ -184,49 +198,6 @@ public function addMissingDocBlocks(): void;
    9. \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    10. -
    11. - \Tectalic\OpenAi\ClientException
    12. - - - -
      -
      -
      - - - -```php -public function fillInReadmeMdTemplate(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: -
      @@ -236,7 +207,7 @@ public function fillInReadmeMdTemplate(): void; ```php @@ -265,36 +236,50 @@ public function generate(): void;
      ```php -public function generateProjectTemplatesStructure(): void; +public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` -
      Generate documentation structure with blank templates using AI tools
      -Parameters: not specified + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $aiProvider\BumbleDocGen\AI\ProviderInterface-
      Return value: void Throws:
        -
      • - \Tectalic\OpenAi\ClientException
      • - -
      • - \DI\NotFoundException
      • -
      • \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
      • \DI\DependencyException
      • +
      • + \DI\NotFoundException
      • +
      • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
      • @@ -307,7 +292,7 @@ public function generateProjectTemplatesStructure(): void; ```php diff --git a/docs/shared_c.cache b/docs/shared_c.cache index 4576516a..1d573122 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/1.configuration/classes/Configuration.md b/docs/tech/1.configuration/classes/Configuration.md index fb86e439..bab9b55b 100644 --- a/docs/tech/1.configuration/classes/Configuration.md +++ b/docs/tech/1.configuration/classes/Configuration.md @@ -33,15 +33,9 @@ final class Configuration

        Methods:

          -
        1. - getAIConfig -
        2. getAdditionalConsoleCommands
        3. -
        4. - getAiDataDir -
        5. getCacheDir
        6. @@ -51,6 +45,9 @@ final class Configuration
        7. getGitClientPath
        8. +
        9. + getIfExists +
        10. getLanguageHandlersCollection
        11. @@ -152,27 +149,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame -
      -
      -
      - - - -```php -public function getAIConfig(): array; -``` - - - -Parameters: not specified - -Return value: array - -

      @@ -180,7 +156,7 @@ public function getAIConfig(): array; ```php @@ -207,27 +183,6 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad -
      -
      -
      - - - -```php -public function getAiDataDir(): string; -``` - - - -Parameters: not specified - -Return value: string - -

      @@ -235,7 +190,7 @@ public function getAiDataDir(): string; ```php @@ -263,7 +218,7 @@ public function getCacheDir(): string|null; ```php @@ -284,7 +239,7 @@ public function getDocGenLibDir(): string; ```php @@ -298,6 +253,51 @@ public function getGitClientPath(): string; Return value: string +Throws: + + +
      +
      +
      + + + +```php +public function getIfExists(mixed $key): string|null; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keymixed-
      + +Return value: string | null + + Throws: @@ -450,7 +450,7 @@ public function documentCreationAllowed(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    13. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    14. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -480,7 +480,7 @@ public function entityCacheIsOutdated(): bool; Throws: @@ -544,7 +544,7 @@ public function getAbsoluteFileName(): string|null; Throws: @@ -628,7 +628,7 @@ public function getCasesNames(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    15. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    16. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -676,7 +676,7 @@ public function getConstant(string $name): string|array|int|bool|null|float; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    17. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    18. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -735,7 +735,7 @@ public function getConstantEntity(string $constantName, bool $unsafe = true): \B \DI\DependencyException
    19. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    20. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -772,7 +772,7 @@ public function getConstantEntityCollection(): \BumbleDocGen\LanguageHandler\Php \DI\DependencyException
    21. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    22. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -803,7 +803,7 @@ public function getConstants(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    23. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    24. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -834,7 +834,7 @@ public function getConstantsData(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    25. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    26. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -871,7 +871,7 @@ public function getDescription(): string; \DI\DependencyException
    27. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    28. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -901,7 +901,7 @@ public function getDescriptionLinks(): array; Throws: @@ -974,7 +974,7 @@ public function getDocComment(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    29. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    30. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1011,7 +1011,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    31. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    32. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1062,7 +1062,7 @@ public function getDocRender(): \BumbleDocGen\Core\Renderer\EntityDocRenderer\En Throws: @@ -1171,7 +1171,7 @@ public function getExtends(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    33. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    34. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1199,7 +1199,7 @@ public function getFileContent(): string; Throws: @@ -1267,7 +1267,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; Throws: @@ -1321,7 +1321,7 @@ public function getFullFileName(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    35. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    36. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1352,7 +1352,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    37. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    38. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1383,7 +1383,7 @@ public function getInterfaceNames(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    39. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    40. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1414,7 +1414,7 @@ public function getInterfacesEntities(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    41. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    42. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1445,7 +1445,7 @@ public function getInterfacesString(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    43. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    44. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1501,7 +1501,7 @@ public function getMethodEntity(string $methodName, bool $unsafe = true): \Bumbl \DI\DependencyException
    45. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    46. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    47. \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    48. @@ -1535,7 +1535,7 @@ public function getMethodEntityCollection(): \BumbleDocGen\LanguageHandler\Php\P \DI\DependencyException
    49. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    50. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    51. \DI\NotFoundException
    52. @@ -1572,7 +1572,7 @@ public function getMethodsData(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    53. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    54. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1603,7 +1603,7 @@ public function getModifiersString(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    55. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    56. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1655,7 +1655,7 @@ public function getNamespaceName(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    57. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    58. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1707,7 +1707,7 @@ public function getParentClass(): \BumbleDocGen\LanguageHandler\Php\Parser\Entit \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    59. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    60. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1738,7 +1738,7 @@ public function getParentClassName(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    61. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    62. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1769,7 +1769,7 @@ public function getParentClassNames(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    63. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    64. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1859,7 +1859,7 @@ public function getPropertiesData(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    65. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    66. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1915,7 +1915,7 @@ public function getPropertyEntity(string $propertyName, bool $unsafe = true): \B \DI\DependencyException
    67. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    68. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    69. \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    70. @@ -1949,7 +1949,7 @@ public function getPropertyEntityCollection(): \BumbleDocGen\LanguageHandler\Php \DI\DependencyException
    71. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    72. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    73. \DI\NotFoundException
    74. @@ -2024,7 +2024,7 @@ public function getRelativeFileName(bool $loadIfEmpty = true): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    75. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    76. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2097,7 +2097,7 @@ public function getStartLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    77. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    78. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2130,7 +2130,7 @@ public function getThrows(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    79. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    80. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2161,7 +2161,7 @@ public function getTraitsNames(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    81. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    82. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2247,7 +2247,7 @@ public function hasConstant(string $constant): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    83. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    84. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2348,7 +2348,7 @@ public function hasMethod(string $method): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    85. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    86. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2396,7 +2396,7 @@ public function hasParentClass(string $parentClassName): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    87. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    88. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2444,7 +2444,7 @@ public function hasProperty(string $property): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    89. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    90. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2498,7 +2498,7 @@ public function hasTraits(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    91. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    92. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2546,7 +2546,7 @@ public function implementsInterface(string $interfaceName): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    93. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    94. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2577,7 +2577,7 @@ public function isAbstract(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    95. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    96. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2684,7 +2684,7 @@ public function isEntityFileCanBeLoad(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    97. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    98. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2753,7 +2753,7 @@ public function isEnum(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    99. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    100. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2781,7 +2781,7 @@ public function isInGit(): bool; Throws: @@ -2846,7 +2846,7 @@ public function isInterface(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    101. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    102. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2917,7 +2917,7 @@ public function isSubclassOf(string $className): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    103. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    104. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -2948,7 +2948,7 @@ public function isTrait(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    105. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    106. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/ClassEntityCollection.md b/docs/tech/2.parser/classes/ClassEntityCollection.md index 96298fa7..0a7fd670 100644 --- a/docs/tech/2.parser/classes/ClassEntityCollection.md +++ b/docs/tech/2.parser/classes/ClassEntityCollection.md @@ -254,7 +254,7 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity Throws: @@ -414,7 +414,7 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    107. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    108. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -462,7 +462,7 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    109. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    110. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -778,7 +778,7 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    111. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    112. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -809,7 +809,7 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    113. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    114. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -840,7 +840,7 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    115. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    116. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -871,7 +871,7 @@ public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    117. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    118. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1128,7 +1128,7 @@ public function loadClassEntities(): void; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    119. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    120. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/ConstantEntity.md b/docs/tech/2.parser/classes/ConstantEntity.md index cfb51506..2bf68d72 100644 --- a/docs/tech/2.parser/classes/ConstantEntity.md +++ b/docs/tech/2.parser/classes/ConstantEntity.md @@ -256,7 +256,7 @@ public function entityCacheIsOutdated(): bool; Throws: @@ -403,7 +403,7 @@ public function getDescriptionLinks(): array; Throws: @@ -470,7 +470,7 @@ public function getDocComment(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    121. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    122. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -545,7 +545,7 @@ public function getEndLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    123. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    124. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -599,7 +599,7 @@ public function getFileName(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    125. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    126. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -646,7 +646,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; Throws: @@ -742,7 +742,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    127. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    128. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -794,7 +794,7 @@ public function getNamespaceName(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    129. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    130. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -932,7 +932,7 @@ public function getStartLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    131. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    132. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -965,7 +965,7 @@ public function getThrows(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    133. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    134. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1127,7 +1127,7 @@ public function isEntityFileCanBeLoad(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    135. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    136. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1181,7 +1181,7 @@ public function isPrivate(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    137. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    138. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1212,7 +1212,7 @@ public function isProtected(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    139. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    140. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1243,7 +1243,7 @@ public function isPublic(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    141. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    142. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/ConstantEntityCollection.md b/docs/tech/2.parser/classes/ConstantEntityCollection.md index 13405e59..29b3547e 100644 --- a/docs/tech/2.parser/classes/ConstantEntityCollection.md +++ b/docs/tech/2.parser/classes/ConstantEntityCollection.md @@ -325,7 +325,7 @@ public function loadConstantEntities(): void; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    143. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    144. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -419,7 +419,7 @@ public function unsafeGet(string $constantName): \BumbleDocGen\LanguageHandler\P \DI\DependencyException
    145. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    146. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/DynamicMethodEntity.md b/docs/tech/2.parser/classes/DynamicMethodEntity.md index 75630006..eabbbb78 100644 --- a/docs/tech/2.parser/classes/DynamicMethodEntity.md +++ b/docs/tech/2.parser/classes/DynamicMethodEntity.md @@ -225,7 +225,7 @@ public function getAbsoluteFileName(): string|null; Throws: @@ -351,7 +351,7 @@ public function getFileName(): string|null; Throws: @@ -619,7 +619,7 @@ public function getReturnType(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    147. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    148. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -790,7 +790,7 @@ public function isInitialization(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    149. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    150. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    151. \Exception
    152. diff --git a/docs/tech/2.parser/classes/MethodEntity.md b/docs/tech/2.parser/classes/MethodEntity.md index d9f75e11..71fcf298 100644 --- a/docs/tech/2.parser/classes/MethodEntity.md +++ b/docs/tech/2.parser/classes/MethodEntity.md @@ -315,7 +315,7 @@ public function entityCacheIsOutdated(): bool; Throws: @@ -469,7 +469,7 @@ public function getDescription(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    153. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    154. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -499,7 +499,7 @@ public function getDescriptionLinks(): array; Throws: @@ -587,7 +587,7 @@ public function getDocComment(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    155. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    156. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -624,7 +624,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ \DI\NotFoundException
    157. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    158. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -655,7 +655,7 @@ public function getDocCommentLine(): int|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    159. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    160. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -692,7 +692,7 @@ public function getDocCommentLineRecursive(): int|null; \DI\NotFoundException
    161. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    162. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -729,7 +729,7 @@ public function getDocCommentRecursive(): string; \DI\DependencyException
    163. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    164. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -783,7 +783,7 @@ public function getEndLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    165. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    166. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -837,7 +837,7 @@ public function getFileName(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    167. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    168. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -884,7 +884,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; Throws: @@ -938,7 +938,7 @@ public function getFirstReturnValue(): mixed; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    169. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    170. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1011,7 +1011,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    171. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    172. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1042,7 +1042,7 @@ public function getModifiersString(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    173. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    174. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1094,7 +1094,7 @@ public function getNamespaceName(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    175. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    176. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1154,7 +1154,7 @@ public function getParameters(): array; \DI\DependencyException
    177. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    178. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    179. \Exception
    180. @@ -1194,7 +1194,7 @@ public function getParametersString(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    181. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    182. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1252,7 +1252,7 @@ public function getPrototype(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ \DI\NotFoundException
    183. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    184. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1289,7 +1289,7 @@ public function getReturnType(): string; \DI\DependencyException
    185. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    186. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1389,7 +1389,7 @@ public function getSignature(): string; \DI\NotFoundException
    187. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    188. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1420,7 +1420,7 @@ public function getStartColumn(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    189. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    190. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1451,7 +1451,7 @@ public function getStartLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    191. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    192. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1484,7 +1484,7 @@ public function getThrows(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    193. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    194. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1688,7 +1688,7 @@ public function isEntityFileCanBeLoad(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    195. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    196. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1746,7 +1746,7 @@ public function isInitialization(): bool; \DI\NotFoundException
    197. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    198. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1800,7 +1800,7 @@ public function isPrivate(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    199. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    200. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1831,7 +1831,7 @@ public function isProtected(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    201. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    202. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1862,7 +1862,7 @@ public function isPublic(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    203. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    204. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1893,7 +1893,7 @@ public function isStatic(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    205. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    206. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/MethodEntityCollection.md b/docs/tech/2.parser/classes/MethodEntityCollection.md index f39ab9ff..1f6b8f03 100644 --- a/docs/tech/2.parser/classes/MethodEntityCollection.md +++ b/docs/tech/2.parser/classes/MethodEntityCollection.md @@ -378,7 +378,7 @@ public function loadMethodEntities(): void; \DI\NotFoundException
    207. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    208. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -472,7 +472,7 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php \DI\DependencyException
    209. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    210. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/PropertyEntity.md b/docs/tech/2.parser/classes/PropertyEntity.md index 71088233..c074ce3e 100644 --- a/docs/tech/2.parser/classes/PropertyEntity.md +++ b/docs/tech/2.parser/classes/PropertyEntity.md @@ -268,7 +268,7 @@ public function entityCacheIsOutdated(): bool; Throws: @@ -422,7 +422,7 @@ public function getDescription(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    211. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    212. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -452,7 +452,7 @@ public function getDescriptionLinks(): array; Throws: @@ -525,7 +525,7 @@ public function getDocComment(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    213. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    214. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -562,7 +562,7 @@ public function getDocCommentEntity(): \BumbleDocGen\LanguageHandler\Php\Parser\ \DI\NotFoundException
    215. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    216. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -616,7 +616,7 @@ public function getEndLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    217. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    218. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -670,7 +670,7 @@ public function getFileName(): string|null; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    219. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    220. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -717,7 +717,7 @@ public function getFileSourceLink(bool $withLine = true): string|null; Throws: @@ -813,7 +813,7 @@ public function getImplementingReflectionClass(): \Roave\BetterReflection\Reflec \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    221. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    222. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -850,7 +850,7 @@ public function getModifiersString(): string; \DI\NotFoundException
    223. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    224. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -902,7 +902,7 @@ public function getNamespaceName(): string; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    225. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    226. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1040,7 +1040,7 @@ public function getStartLine(): int; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    227. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    228. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1073,7 +1073,7 @@ public function getThrows(): array; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    229. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    230. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1110,7 +1110,7 @@ public function getType(): string; \DI\DependencyException
    231. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    232. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1272,7 +1272,7 @@ public function isEntityFileCanBeLoad(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    233. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    234. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1347,7 +1347,7 @@ public function isPrivate(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    235. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    236. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1378,7 +1378,7 @@ public function isProtected(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    237. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    238. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -1409,7 +1409,7 @@ public function isPublic(): bool; \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    239. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    240. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/2.parser/classes/PropertyEntityCollection.md b/docs/tech/2.parser/classes/PropertyEntityCollection.md index c650e7f3..beb3f3ec 100644 --- a/docs/tech/2.parser/classes/PropertyEntityCollection.md +++ b/docs/tech/2.parser/classes/PropertyEntityCollection.md @@ -319,7 +319,7 @@ public function loadPropertyEntities(): void; \DI\DependencyException
    241. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    242. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    243. \DI\NotFoundException
    244. @@ -419,7 +419,7 @@ public function unsafeGet(string $objectName): \BumbleDocGen\LanguageHandler\Php \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    245. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    246. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md index b9f31d6e..ee7e250e 100644 --- a/docs/tech/3.renderer/classes/BreadcrumbsHelper.md +++ b/docs/tech/3.renderer/classes/BreadcrumbsHelper.md @@ -162,7 +162,7 @@ public function getAllPageLinks(): array; \DI\DependencyException
    247. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    248. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -218,7 +218,7 @@ public function getBreadcrumbs(string $filePatch, bool $fromCurrent = true): arr \DI\DependencyException
    249. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    250. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -274,7 +274,7 @@ public function getBreadcrumbsForTemplates(string $filePatch, bool $fromCurrent \DI\DependencyException
    251. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    252. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -322,7 +322,7 @@ public function getPageDataByKey(string $key): array|null; \DI\DependencyException
    253. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    254. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    255. \DI\NotFoundException
    256. @@ -373,7 +373,7 @@ public function getPageDocFileByKey(string $key): string|null; \DI\DependencyException
    257. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    258. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    259. \DI\NotFoundException
    260. @@ -424,7 +424,7 @@ public function getPageLinkByKey(string $key): string|null; \DI\DependencyException
    261. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    262. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    263. \DI\NotFoundException
    264. @@ -472,7 +472,7 @@ public function getTemplateLinkKey(string $templateName): string|null; Throws: @@ -517,7 +517,7 @@ public function getTemplateTitle(string $templateName): string; Throws: @@ -598,7 +598,7 @@ public function renderBreadcrumbs(string $currentPageTitle, string $filePatch, b \Twig\Error\LoaderError
    265. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    266. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md index 78de16c9..53a420ff 100644 --- a/docs/tech/3.renderer/classes/ClassEntityCollection_2.md +++ b/docs/tech/3.renderer/classes/ClassEntityCollection_2.md @@ -254,10 +254,10 @@ public function add(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntity Throws: @@ -325,10 +325,10 @@ public function filterByInterfaces(array $interfaces): \BumbleDocGen\LanguageHan Throws: @@ -411,10 +411,10 @@ public function filterByParentClassNames(array $parentClassNames): \BumbleDocGen Throws: @@ -459,10 +459,10 @@ public function filterByPaths(array $paths): \BumbleDocGen\LanguageHandler\Php\P Throws: @@ -775,10 +775,10 @@ public function getOnlyAbstractClasses(): \BumbleDocGen\LanguageHandler\Php\Pars Throws: @@ -806,10 +806,10 @@ public function getOnlyInstantiable(): \BumbleDocGen\LanguageHandler\Php\Parser\ Throws: @@ -837,10 +837,10 @@ public function getOnlyInterfaces(): \BumbleDocGen\LanguageHandler\Php\Parser\En Throws: @@ -868,10 +868,10 @@ public function getOnlyTraits(): \BumbleDocGen\LanguageHandler\Php\Parser\Entity Throws: @@ -1125,10 +1125,10 @@ public function loadClassEntities(): void; \DI\DependencyException
    267. - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    268. + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    269. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    270. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/DrawClassMap.md b/docs/tech/3.renderer/classes/DrawClassMap.md index 1d07d031..623e4afb 100644 --- a/docs/tech/3.renderer/classes/DrawClassMap.md +++ b/docs/tech/3.renderer/classes/DrawClassMap.md @@ -165,13 +165,13 @@ public function __invoke(\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEn \DI\NotFoundException
    271. - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    272. + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    273. \DI\DependencyException
    274. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    275. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException @@ -267,13 +267,13 @@ public function getDirectoryStructure(\BumbleDocGen\LanguageHandler\Php\Parser\E \DI\NotFoundException
    276. - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    277. + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    278. \DI\DependencyException
    279. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    280. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException diff --git a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md index 77fd7c92..3086ed84 100644 --- a/docs/tech/3.renderer/classes/DrawDocumentationMenu.md +++ b/docs/tech/3.renderer/classes/DrawDocumentationMenu.md @@ -21,7 +21,7 @@ and all links with this page are recursively collected for it, after which the h See: diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md index 3c66c451..dc59f8b2 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentedEntityUrl
      + BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentedEntityUrl

      GetDocumentedEntityUrl class: @@ -21,11 +21,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
    281. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    282. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    283. \DI\NotFoundException
    284. - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    285. + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md index dc59f8b2..3c66c451 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_2.md @@ -1,5 +1,5 @@ - BumbleDocGen / Technical description of the project / Renderer / Template functions / GetDocumentedEntityUrl
      + BumbleDocGen / Technical description of the project / Renderer / How to create documentation templates? / Linking templates / GetDocumentedEntityUrl

      GetDocumentedEntityUrl class: @@ -21,11 +21,11 @@ the `EntityDocRendererInterface::getDocFileExtension()` directory will be create See: @@ -211,13 +211,13 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
    286. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    287. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    288. \DI\NotFoundException
    289. - \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
    290. + \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException diff --git a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md index d7fa2b43..65449c9c 100644 --- a/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md +++ b/docs/tech/3.renderer/classes/GetDocumentedEntityUrl_3.md @@ -211,7 +211,7 @@ public function __invoke(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $ \DI\DependencyException
    291. - \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    292. + \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
    293. \DI\NotFoundException
    294. diff --git a/docs/tech/classes/App.md b/docs/tech/classes/App.md index 6066fe41..7fceff4d 100644 --- a/docs/tech/classes/App.md +++ b/docs/tech/classes/App.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / App

      - App class: + App class:

      @@ -156,7 +156,7 @@ class App extends \Symfony\Component\Console\Application implements \Symfony\Con ```php diff --git a/docs/tech/classes/Configuration.md b/docs/tech/classes/Configuration.md index 517f1e68..01e0a96d 100644 --- a/docs/tech/classes/Configuration.md +++ b/docs/tech/classes/Configuration.md @@ -33,15 +33,9 @@ final class Configuration

      Methods:

        -
      1. - getAIConfig -
      2. getAdditionalConsoleCommands
      3. -
      4. - getAiDataDir -
      5. getCacheDir
      6. @@ -51,6 +45,9 @@ final class Configuration
      7. getGitClientPath
      8. +
      9. + getIfExists +
      10. getLanguageHandlersCollection
      11. @@ -152,27 +149,6 @@ public function __construct(\BumbleDocGen\Core\Configuration\ConfigurationParame -
      -
      -
      - - - -```php -public function getAIConfig(): array; -``` - - - -Parameters: not specified - -Return value: array - -

      @@ -180,7 +156,7 @@ public function getAIConfig(): array; ```php @@ -207,27 +183,6 @@ public function getAdditionalConsoleCommands(): \BumbleDocGen\Console\Command\Ad -
      -
      -
      - - - -```php -public function getAiDataDir(): string; -``` - - - -Parameters: not specified - -Return value: string - -

      @@ -235,7 +190,7 @@ public function getAiDataDir(): string; ```php @@ -263,7 +218,7 @@ public function getCacheDir(): string|null; ```php @@ -284,7 +239,7 @@ public function getDocGenLibDir(): string; ```php @@ -298,6 +253,51 @@ public function getGitClientPath(): string; Return value: string +Throws: + + +
      +
      +
      + + + +```php +public function getIfExists(mixed $key): string|null; +``` + + + +Parameters: + + + + + + + + + + + + + + + + +
      NameTypeDescription
      $keymixed-
      + +Return value: string | null + + Throws:
      @@ -178,7 +166,7 @@ public function generateDocBlocksForMethodsWithoutIt(\BumbleDocGen\Core\Parser\E ```php diff --git a/docs/tech/classes/DocGenerator.md b/docs/tech/classes/DocGenerator.md index 486ecaeb..608b7ccb 100644 --- a/docs/tech/classes/DocGenerator.md +++ b/docs/tech/classes/DocGenerator.md @@ -2,7 +2,7 @@ BumbleDocGen / Technical description of the project / Class map / DocGenerator

      - DocGenerator class: + DocGenerator class:

      @@ -34,17 +34,14 @@ final class DocGenerator
      1. - addMissingDocBlocks + addDocBlocks - Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
      2. -
      3. - fillInReadmeMdTemplate -
      4. generate - Generates documentation using configuration
      5. - generateProjectTemplatesStructure - - Generate documentation structure with blank templates using AI tools
      6. + generateReadmeTemplate +
      7. parseAndGetRootEntityCollectionsGroup
      8. @@ -55,11 +52,11 @@ final class DocGenerator @@ -74,7 +71,7 @@ final class DocGenerator ```php @@ -154,18 +151,35 @@ public function __construct(\Symfony\Component\Filesystem\Filesystem $fs, \Symfo
        ```php -public function addMissingDocBlocks(): void; +public function addDocBlocks(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ```
        Generate missing docBlocks with ChatGPT for project class methods that are available for documentation
        -Parameters: not specified +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $aiProvider\BumbleDocGen\AI\ProviderInterface-
        Return value: void @@ -184,49 +198,6 @@ public function addMissingDocBlocks(): void;
      9. \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
      10. -
      11. - \Tectalic\OpenAi\ClientException
      12. - - - -
        -
        -
        - - - -```php -public function fillInReadmeMdTemplate(): void; -``` - - - -Parameters: not specified - -Return value: void - - -Throws: -
        @@ -236,7 +207,7 @@ public function fillInReadmeMdTemplate(): void; ```php @@ -265,36 +236,50 @@ public function generate(): void;
        ```php -public function generateProjectTemplatesStructure(): void; +public function generateReadmeTemplate(\BumbleDocGen\AI\ProviderInterface $aiProvider): void; ``` -
        Generate documentation structure with blank templates using AI tools
        -Parameters: not specified + +Parameters: + + + + + + + + + + + + + + + + +
        NameTypeDescription
        $aiProvider\BumbleDocGen\AI\ProviderInterface-
        Return value: void Throws:
          -
        • - \Tectalic\OpenAi\ClientException
        • - -
        • - \DI\NotFoundException
        • -
        • \BumbleDocGen\LanguageHandler\Php\Parser\Entity\Exception\ReflectionException
        • \DI\DependencyException
        • +
        • + \DI\NotFoundException
        • +
        • \BumbleDocGen\Core\Configuration\Exception\InvalidConfigurationParameterException
        • @@ -307,7 +292,7 @@ public function generateProjectTemplatesStructure(): void; ```php diff --git a/docs/tech/classes/GenerateTemplatesContentCommand.md b/docs/tech/classes/GenerateTemplatesContentCommand.md deleted file mode 100644 index 64c4cdef..00000000 --- a/docs/tech/classes/GenerateTemplatesContentCommand.md +++ /dev/null @@ -1,1393 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / GenerateTemplatesContentCommand
          - -

          - GenerateTemplatesContentCommand class: -

          - - - - - -```php -namespace BumbleDocGen\AI\Console; - -final class GenerateTemplatesContentCommand extends \BumbleDocGen\Console\Command\BaseCommand -``` - -
          Base class for all commands.
          - - - - - - -

          Initialization methods:

          - -
            -
          1. - __construct -
          2. -
          - -

          Methods:

          - -
            -
          1. - addArgument - - Adds an argument.
          2. -
          3. - addOption - - Adds an option.
          4. -
          5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
          6. -
          7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
          8. -
          9. - getAliases - - Returns the aliases for the command.
          10. -
          11. - getApplication - - Gets the application instance for this command.
          12. -
          13. - getDefaultDescription -
          14. -
          15. - getDefaultName -
          16. -
          17. - getDefinition - - Gets the InputDefinition attached to this Command.
          18. -
          19. - getDescription - - Returns the description for the command.
          20. -
          21. - getHelp - - Returns the help for the command.
          22. -
          23. - getHelper - - Gets a helper instance by name.
          24. -
          25. - getHelperSet - - Gets the helper set.
          26. -
          27. - getName - - Returns the command name.
          28. -
          29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
          30. -
          31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
          32. -
          33. - getSynopsis - - Returns the synopsis for the command.
          34. -
          35. - getUsages - - Returns alternative usages of the command.
          36. -
          37. - ignoreValidationErrors - - Ignores validation errors.
          38. -
          39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
          40. -
          41. - isHidden -
          42. -
          43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
          44. -
          45. - run - - Runs the command.
          46. -
          47. - setAliases - - Sets the aliases for the command.
          48. -
          49. - setApplication -
          50. -
          51. - setCode - - Sets the code to execute when running this command.
          52. -
          53. - setDefinition - - Sets an array of argument and option instances.
          54. -
          55. - setDescription - - Sets the description for the command.
          56. -
          57. - setHelp - - Sets the help for the command.
          58. -
          59. - setHelperSet -
          60. -
          61. - setHidden -
          62. -
          63. - setName - - Sets the name of the command.
          64. -
          65. - setProcessTitle - - Sets the process title of the command.
          66. -
          - -

          Traits:

          - - - -

          Constants:

          - - - - - - -

          Method details:

          - -
          - - - -```php -// Implemented in BumbleDocGen\Console\Command\BaseCommand - -public function __construct(string $name = null); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestringThe name of the command; passing null means it must be set in configure()
          - - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
          Adds an argument.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
          $descriptionstring-
          $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
          Adds an option.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
          $modeintThe option mode: One of the InputOption::VALUE_* constants
          $descriptionstring-
          $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
          Add a command usage example, it'll be prefixed with the command name.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $usagestring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
          Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $input\Symfony\Component\Console\Completion\CompletionInput-
          $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
          - -Return value: void - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
          Returns the aliases for the command.
          - -Parameters: not specified - -Return value: array - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
          Gets the application instance for this command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
          Gets the InputDefinition attached to this Command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
          Returns the description for the command.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
          Returns the help for the command.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
          Gets a helper instance by name.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          - -Return value: mixed - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
          Gets the helper set.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
          Returns the command name.
          - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
          Gets the InputDefinition to be used to create representations of this Command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
          Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
          Returns the synopsis for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $shortboolWhether to show the short version of the synopsis (with options folded) or not
          - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
          Returns alternative usages of the command.
          - -Parameters: not specified - -Return value: array - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
          Ignores validation errors.
          - -Parameters: not specified - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
          Checks whether the command is enabled or not in the current environment.
          - -Parameters: not specified - -Return value: bool - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
          -
          -
          - -
            -
          • # - mergeApplicationDefinition - :warning: Is internal | source code
          • -
          - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
          Merges the application definition with the command definition.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
          Runs the command.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $input\Symfony\Component\Console\Input\InputInterface-
          $output\Symfony\Component\Console\Output\OutputInterface-
          - -Return value: int - - -Throws: - - - -See: - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
          Sets the aliases for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $aliasesiterableAn array of aliases for the command
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $application\Symfony\Component\Console\Application-
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
          Sets the code to execute when running this command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $codecallableA callable(InputInterface $input, OutputInterface $output)
          - -Return value: static - - -Throws: - - - -See: - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
          Sets an array of argument and option instances.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
          Sets the description for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $descriptionstring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
          Sets the help for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $helpstring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $helperSet\Symfony\Component\Console\Helper\HelperSet-
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $hiddenboolWhether or not the command should be hidden from the list of commands
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
          Sets the name of the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
          Sets the process title of the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $titlestring-
          - -Return value: static - - -
          -
          - - \ No newline at end of file diff --git a/docs/tech/classes/InitDocsStructureCommand.md b/docs/tech/classes/InitDocsStructureCommand.md deleted file mode 100644 index 3b0b78dc..00000000 --- a/docs/tech/classes/InitDocsStructureCommand.md +++ /dev/null @@ -1,1393 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / InitDocsStructureCommand
          - -

          - InitDocsStructureCommand class: -

          - - - - - -```php -namespace BumbleDocGen\AI\Console; - -final class InitDocsStructureCommand extends \BumbleDocGen\Console\Command\BaseCommand -``` - -
          Base class for all commands.
          - - - - - - -

          Initialization methods:

          - -
            -
          1. - __construct -
          2. -
          - -

          Methods:

          - -
            -
          1. - addArgument - - Adds an argument.
          2. -
          3. - addOption - - Adds an option.
          4. -
          5. - addUsage - - Add a command usage example, it'll be prefixed with the command name.
          6. -
          7. - complete - - Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
          8. -
          9. - getAliases - - Returns the aliases for the command.
          10. -
          11. - getApplication - - Gets the application instance for this command.
          12. -
          13. - getDefaultDescription -
          14. -
          15. - getDefaultName -
          16. -
          17. - getDefinition - - Gets the InputDefinition attached to this Command.
          18. -
          19. - getDescription - - Returns the description for the command.
          20. -
          21. - getHelp - - Returns the help for the command.
          22. -
          23. - getHelper - - Gets a helper instance by name.
          24. -
          25. - getHelperSet - - Gets the helper set.
          26. -
          27. - getName - - Returns the command name.
          28. -
          29. - getNativeDefinition - - Gets the InputDefinition to be used to create representations of this Command.
          30. -
          31. - getProcessedHelp - - Returns the processed help for the command replacing the %command.name% and %command.full_name% patterns with the real values dynamically.
          32. -
          33. - getSynopsis - - Returns the synopsis for the command.
          34. -
          35. - getUsages - - Returns alternative usages of the command.
          36. -
          37. - ignoreValidationErrors - - Ignores validation errors.
          38. -
          39. - isEnabled - - Checks whether the command is enabled or not in the current environment.
          40. -
          41. - isHidden -
          42. -
          43. - mergeApplicationDefinition - - Merges the application definition with the command definition.
          44. -
          45. - run - - Runs the command.
          46. -
          47. - setAliases - - Sets the aliases for the command.
          48. -
          49. - setApplication -
          50. -
          51. - setCode - - Sets the code to execute when running this command.
          52. -
          53. - setDefinition - - Sets an array of argument and option instances.
          54. -
          55. - setDescription - - Sets the description for the command.
          56. -
          57. - setHelp - - Sets the help for the command.
          58. -
          59. - setHelperSet -
          60. -
          61. - setHidden -
          62. -
          63. - setName - - Sets the name of the command.
          64. -
          65. - setProcessTitle - - Sets the process title of the command.
          66. -
          - -

          Traits:

          - - - -

          Constants:

          - - - - - - -

          Method details:

          - -
          - - - -```php -// Implemented in BumbleDocGen\Console\Command\BaseCommand - -public function __construct(string $name = null); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestringThe name of the command; passing null means it must be set in configure()
          - - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addArgument(string $name, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
          Adds an argument.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          $modeintThe argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL
          $descriptionstring-
          $defaultmixedThe default value (for InputArgument::OPTIONAL mode only)
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addOption(string $name, string|array $shortcut = null, int $mode = null, string $description = '', mixed $default = null): static; -``` - -
          Adds an option.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          $shortcutstring | arrayThe shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts
          $modeintThe option mode: One of the InputOption::VALUE_* constants
          $descriptionstring-
          $defaultmixedThe default value (must be null for InputOption::VALUE_NONE)
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function addUsage(string $usage): static; -``` - -
          Add a command usage example, it'll be prefixed with the command name.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $usagestring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function complete(\Symfony\Component\Console\Completion\CompletionInput $input, \Symfony\Component\Console\Completion\CompletionSuggestions $suggestions): void; -``` - -
          Adds suggestions to $suggestions for the current completion input (e.g. option or argument).
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $input\Symfony\Component\Console\Completion\CompletionInput-
          $suggestions\Symfony\Component\Console\Completion\CompletionSuggestions-
          - -Return value: void - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getAliases(): array; -``` - -
          Returns the aliases for the command.
          - -Parameters: not specified - -Return value: array - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getApplication(): \Symfony\Component\Console\Application|null; -``` - -
          Gets the application instance for this command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Application | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultDescription(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public static function getDefaultName(): string|null; -``` - - - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
          Gets the InputDefinition attached to this Command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getDescription(): string; -``` - -
          Returns the description for the command.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelp(): string; -``` - -
          Returns the help for the command.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelper(string $name): mixed; -``` - -
          Gets a helper instance by name.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          - -Return value: mixed - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getHelperSet(): \Symfony\Component\Console\Helper\HelperSet|null; -``` - -
          Gets the helper set.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Helper\HelperSet | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getName(): string|null; -``` - -
          Returns the command name.
          - -Parameters: not specified - -Return value: string | null - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getNativeDefinition(): \Symfony\Component\Console\Input\InputDefinition; -``` - -
          Gets the InputDefinition to be used to create representations of this Command.
          - -Parameters: not specified - -Return value: \Symfony\Component\Console\Input\InputDefinition - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getProcessedHelp(): string; -``` - -
          Returns the processed help for the command replacing the %command.name% and -%command.full_name% patterns with the real values dynamically.
          - -Parameters: not specified - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getSynopsis(bool $short = false): string; -``` - -
          Returns the synopsis for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $shortboolWhether to show the short version of the synopsis (with options folded) or not
          - -Return value: string - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function getUsages(): array; -``` - -
          Returns alternative usages of the command.
          - -Parameters: not specified - -Return value: array - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function ignoreValidationErrors(): mixed; -``` - -
          Ignores validation errors.
          - -Parameters: not specified - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isEnabled(): bool; -``` - -
          Checks whether the command is enabled or not in the current environment.
          - -Parameters: not specified - -Return value: bool - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function isHidden(): bool; -``` - - - -Parameters: not specified - -Return value: bool - - -
          -
          -
          - -
            -
          • # - mergeApplicationDefinition - :warning: Is internal | source code
          • -
          - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function mergeApplicationDefinition(bool $mergeArgs = true): mixed; -``` - -
          Merges the application definition with the command definition.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $mergeArgsboolWhether to merge or not the Application definition arguments to Command definition arguments
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function run(\Symfony\Component\Console\Input\InputInterface $input, \Symfony\Component\Console\Output\OutputInterface $output): int; -``` - -
          Runs the command.
          - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $input\Symfony\Component\Console\Input\InputInterface-
          $output\Symfony\Component\Console\Output\OutputInterface-
          - -Return value: int - - -Throws: - - - -See: - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setAliases(iterable $aliases): static; -``` - -
          Sets the aliases for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $aliasesiterableAn array of aliases for the command
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setApplication(\Symfony\Component\Console\Application $application = null): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $application\Symfony\Component\Console\Application-
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setCode(callable $code): static; -``` - -
          Sets the code to execute when running this command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $codecallableA callable(InputInterface $input, OutputInterface $output)
          - -Return value: static - - -Throws: - - - -See: - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDefinition(array|\Symfony\Component\Console\Input\InputDefinition $definition): static; -``` - -
          Sets an array of argument and option instances.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $definitionarray | \Symfony\Component\Console\Input\InputDefinition-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setDescription(string $description): static; -``` - -
          Sets the description for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $descriptionstring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelp(string $help): static; -``` - -
          Sets the help for the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $helpstring-
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHelperSet(\Symfony\Component\Console\Helper\HelperSet $helperSet): mixed; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $helperSet\Symfony\Component\Console\Helper\HelperSet-
          - -Return value: mixed - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setHidden(bool $hidden = true): static; -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $hiddenboolWhether or not the command should be hidden from the list of commands
          - -Return value: static - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setName(string $name): static; -``` - -
          Sets the name of the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $namestring-
          - -Return value: static - - -Throws: - - -
          -
          -
          - - - -```php -// Implemented in Symfony\Component\Console\Command\Command - -public function setProcessTitle(string $title): static; -``` - -
          Sets the process title of the command.
          - -Parameters: - - - - - - - - - - - - - - - - -
          NameTypeDescription
          $titlestring-
          - -Return value: static - - -
          -
          - - \ No newline at end of file diff --git a/docs/tech/classes/ProjectParser.md b/docs/tech/classes/ProjectParser.md index f9a01dd5..52e5ef4f 100644 --- a/docs/tech/classes/ProjectParser.md +++ b/docs/tech/classes/ProjectParser.md @@ -110,13 +110,13 @@ public function parse(): \BumbleDocGen\Core\Parser\Entity\RootEntityCollectionsG Throws: diff --git a/docs/tech/classes/Provider.md b/docs/tech/classes/Provider.md index 24893c97..140ee025 100644 --- a/docs/tech/classes/Provider.md +++ b/docs/tech/classes/Provider.md @@ -112,7 +112,7 @@ public function __construct(string $bearerToken, string|null $model); ```php @@ -155,7 +155,7 @@ public function formatDataPrompt(string $title, string $content): string; ```php @@ -172,7 +172,7 @@ public function getAvailableModels(): array; Throws:
      +

      Constants:

      + @@ -48,7 +55,7 @@ final class ProviderFactory ```php -public static function create(string $handler, string $apiKey, string $model): \BumbleDocGen\AI\ProviderInterface; +public static function create(string $provider, string $apiKey, string|null $model = null): \BumbleDocGen\AI\ProviderInterface; ``` @@ -65,7 +72,7 @@ public static function create(string $handler, string $apiKey, string $model): \ - $handler + $provider string - @@ -76,7 +83,7 @@ public static function create(string $handler, string $apiKey, string $model): \ $model - string + string | null - diff --git a/docs/tech/classes/ReadmeTemplateGenerator.md b/docs/tech/classes/ReadmeTemplateGenerator.md index 7907dbd1..fcd71f6f 100644 --- a/docs/tech/classes/ReadmeTemplateGenerator.md +++ b/docs/tech/classes/ReadmeTemplateGenerator.md @@ -1,8 +1,8 @@ - BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateFiller
      + BumbleDocGen / Technical description of the project / Class map / ReadmeTemplateGenerator

      - ReadmeTemplateFiller class: + ReadmeTemplateGenerator class:

      @@ -10,9 +10,9 @@ ```php -namespace BumbleDocGen\TemplateGenerator\ChatGpt; +namespace BumbleDocGen\AI\Generators; -final class ReadmeTemplateFiller +final class ReadmeTemplateGenerator ``` @@ -39,13 +39,6 @@ final class ReadmeTemplateFiller
    -

    Constants:

    - @@ -58,11 +51,11 @@ final class ReadmeTemplateFiller ```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); ``` @@ -79,13 +72,8 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model - $openaiClient - \Tectalic\OpenAi\Client - - - - - $model - string + $aiHandler + \BumbleDocGen\AI\ProviderInterface - @@ -100,7 +88,7 @@ public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model ```php @@ -148,9 +136,6 @@ public function generateReadmeFileContent(\BumbleDocGen\Core\Parser\Entity\RootE Throws:
      -
    • - \Tectalic\OpenAi\ClientException
    • -
    • \DI\DependencyException
    • diff --git a/docs/tech/classes/TemplateContentGenerator.md b/docs/tech/classes/TemplateContentGenerator.md deleted file mode 100644 index 4a6ae029..00000000 --- a/docs/tech/classes/TemplateContentGenerator.md +++ /dev/null @@ -1,166 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / TemplateContentGenerator
      - -

      - TemplateContentGenerator class: -

      - - - - - -```php -namespace BumbleDocGen\AI\Generators; - -final class TemplateContentGenerator -``` - - - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct -
      2. -
      - -

      Methods:

      - -
        -
      1. - generate -
      2. -
      - - - - - - - -

      Method details:

      - -
      - - - -```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); -``` - - - -Parameters: - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $aiHandler\BumbleDocGen\AI\ProviderInterface-
      - - - -
      -
      -
      - - - -```php -public function generate(string $filePath, string $fileName, array $fileNamespaces, \BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection|null $entitiesCollection, string|null $additionalPrompt = null, string|null $systemPrompt = null): string|null; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $filePathstring-
      $fileNamestring-
      $fileNamespacesarray-
      $entitiesCollection\BumbleDocGen\LanguageHandler\Php\Parser\Entity\ClassEntityCollection | null-
      $additionalPromptstring | null-
      $systemPromptstring | null-
      - -Return value: string | null - - -Throws: - - -
      -
      - - \ No newline at end of file diff --git a/docs/tech/classes/TemplateStructureGenerator.md b/docs/tech/classes/TemplateStructureGenerator.md deleted file mode 100644 index caae17c4..00000000 --- a/docs/tech/classes/TemplateStructureGenerator.md +++ /dev/null @@ -1,155 +0,0 @@ - - BumbleDocGen / Technical description of the project / Class map / TemplatesStructureGenerator
      - -

      - TemplatesStructureGenerator class: -

      - - - - - -```php -namespace BumbleDocGen\TemplateGenerator\ChatGpt; - -final class TemplatesStructureGenerator -``` - - - - - - - - -

      Initialization methods:

      - -
        -
      1. - __construct -
      2. -
      - -

      Methods:

      - -
        -
      1. - generateStructureByEntityCollection -
      2. -
      - - -

      Constants:

      - - - - - - -

      Method details:

      - -
      - - - -```php -public function __construct(\Tectalic\OpenAi\Client $openaiClient, string $model = self::MODEL_GPT_4); -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $openaiClient\Tectalic\OpenAi\Client-
      $modelstring-
      - - - -
      -
      -
      - - - -```php -public function generateStructureByEntityCollection(\BumbleDocGen\Core\Parser\Entity\RootEntityCollection $rootEntityCollection, string|null $additionalPrompt = null): array; -``` - - - -Parameters: - - - - - - - - - - - - - - - - - - - - - -
      NameTypeDescription
      $rootEntityCollection\BumbleDocGen\Core\Parser\Entity\RootEntityCollection-
      $additionalPromptstring | null-
      - -Return value: array - - -Throws: - - -
      -
      - - \ No newline at end of file diff --git a/docs/tech/map.md b/docs/tech/map.md index e4a405c8..1ccc0ccb 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -6,14 +6,10 @@ Directory layout ( only documented files shown ): │ ├──AI/ │ │ ├──Console/ │ │ │ ├── AddDocBlocksCommand.php Base class for all commands. -│ │ │ ├── GenerateReadMeTemplateCommand.php Base class for all commands. -│ │ │ ├── GenerateTemplatesContentCommand.php Base class for all commands. -│ │ │ └── InitDocsStructureCommand.php Base class for all commands. +│ │ │ └── GenerateReadMeTemplateCommand.php Base class for all commands. │ │ ├──Generators/ │ │ │ ├── DocBlocksGenerator.php -│ │ │ ├── ReadmeTemplateGenerator.php -│ │ │ ├── TemplateContentGenerator.php -│ │ │ └── TemplateStructureGenerator.php +│ │ │ └── ReadmeTemplateGenerator.php │ │ ├──Providers/ │ │ │ └──OpenAI/ │ │ │ │ └── Provider.php From 321828c0901802905583377299ed4aa969127213 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Tue, 31 Oct 2023 18:04:41 +0000 Subject: [PATCH 31/33] Renames $aiHandler -> $aiProvider --- src/AI/Generators/DocBlocksGenerator.php | 6 +++--- src/AI/Generators/ReadmeTemplateGenerator.php | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/AI/Generators/DocBlocksGenerator.php b/src/AI/Generators/DocBlocksGenerator.php index 404ea1ec..49174426 100644 --- a/src/AI/Generators/DocBlocksGenerator.php +++ b/src/AI/Generators/DocBlocksGenerator.php @@ -20,7 +20,7 @@ final class DocBlocksGenerator public const MODE_READ_ALL_CODE = 2; public function __construct( - private ProviderInterface $aiHandler, + private ProviderInterface $aiProvider, private ParserHelper $parserHelper, ) { } @@ -150,9 +150,9 @@ public function generateDocBlocksForMethodsWithoutIt( $toRequest ) . "\n}"; - $systemPrompt = $this->aiHandler->getSystemPrompt('docBlockGeneration'); + $systemPrompt = $this->aiProvider->getSystemPrompt('docBlockGeneration'); $prompts = [$requestData]; - $responseData = $this->aiHandler->sendPrompts($prompts, $systemPrompt); + $responseData = $this->aiProvider->sendPrompts($prompts, $systemPrompt); $responseData = json_decode($responseData, true, 512, JSON_THROW_ON_ERROR); if (!$responseData) { diff --git a/src/AI/Generators/ReadmeTemplateGenerator.php b/src/AI/Generators/ReadmeTemplateGenerator.php index 97b98a65..f6af61a9 100644 --- a/src/AI/Generators/ReadmeTemplateGenerator.php +++ b/src/AI/Generators/ReadmeTemplateGenerator.php @@ -16,7 +16,7 @@ final class ReadmeTemplateGenerator { public function __construct( - private ProviderInterface $aiHandler, + private ProviderInterface $aiProvider, ) { } @@ -49,10 +49,10 @@ public function generateReadmeFileContent( $namespacesList = array_unique($namespacesList); $prompts = []; - $prompts[] = $this->aiHandler->formatDataPrompt('Project namespaces', implode("\n", $namespacesList)); + $prompts[] = $this->aiProvider->formatDataPrompt('Project namespaces', implode("\n", $namespacesList)); if ($composerJsonFile) { - $prompts[] = $this->aiHandler->formatDataPrompt('Composer JSON', file_get_contents($composerJsonFile)); + $prompts[] = $this->aiProvider->formatDataPrompt('Composer JSON', file_get_contents($composerJsonFile)); } $entryPointsSignatures = []; @@ -70,17 +70,17 @@ public function generateReadmeFileContent( } if ($entryPointsSignatures) { - $prompts[] = $this->aiHandler->formatDataPrompt( + $prompts[] = $this->aiProvider->formatDataPrompt( 'Project entry points', implode("\n\n", $entryPointsSignatures) ); } if ($additionalPrompt) { - $prompts[] = $this->aiHandler->formatDataPrompt('Additional Information', $additionalPrompt); + $prompts[] = $this->aiProvider->formatDataPrompt('Additional Information', $additionalPrompt); } - $systemPrompt = $this->aiHandler->getSystemPrompt('readmeTemplateGeneration'); - return $this->aiHandler->sendPrompts($prompts, $systemPrompt); + $systemPrompt = $this->aiProvider->getSystemPrompt('readmeTemplateGeneration'); + return $this->aiProvider->sendPrompts($prompts, $systemPrompt); } } From ba3a5246b9080b7d70d7cff16169dcf9e6f1bd67 Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Thu, 2 Nov 2023 08:27:41 +0000 Subject: [PATCH 32/33] Update error message for incorrect provider --- src/AI/ProviderFactory.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AI/ProviderFactory.php b/src/AI/ProviderFactory.php index 201592a8..8cc8872a 100644 --- a/src/AI/ProviderFactory.php +++ b/src/AI/ProviderFactory.php @@ -16,7 +16,7 @@ public static function create(string $provider, string $apiKey, ?string $model = return match ($provider) { OpenAIProvider::NAME => new OpenAIProvider($apiKey, $model), default => throw new RuntimeException( - "Parameter 'ai-provider' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!", + "Parameter 'ai_provider' not set to valid option (" . implode(',', self::VALID_PROVIDERS) . ")!", ), }; } From c8a5aabcea4cf3a2a237270a8c94192e739fed6b Mon Sep 17 00:00:00 2001 From: Sean McNamara Date: Thu, 2 Nov 2023 09:09:01 +0000 Subject: [PATCH 33/33] Documentation generation after merge --- docs/shared_c.cache | 2 +- docs/tech/classes/DocBlocksGenerator.md | 4 ++-- docs/tech/classes/ReadmeTemplateGenerator.md | 4 ++-- docs/tech/map.md | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/shared_c.cache b/docs/shared_c.cache index ffe36910..e7b90da8 100644 --- a/docs/shared_c.cache +++ b/docs/shared_c.cache @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/tech/classes/DocBlocksGenerator.md b/docs/tech/classes/DocBlocksGenerator.md index 8c2d8e60..f100749e 100644 --- a/docs/tech/classes/DocBlocksGenerator.md +++ b/docs/tech/classes/DocBlocksGenerator.md @@ -69,7 +69,7 @@ final class DocBlocksGenerator
    ```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider, \BumbleDocGen\LanguageHandler\Php\Parser\ParserHelper $parserHelper); ``` @@ -86,7 +86,7 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler, \Bumb - $aiHandler + $aiProvider \BumbleDocGen\AI\ProviderInterface - diff --git a/docs/tech/classes/ReadmeTemplateGenerator.md b/docs/tech/classes/ReadmeTemplateGenerator.md index fcd71f6f..d36bc1cd 100644 --- a/docs/tech/classes/ReadmeTemplateGenerator.md +++ b/docs/tech/classes/ReadmeTemplateGenerator.md @@ -55,7 +55,7 @@ final class ReadmeTemplateGenerator ```php -public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); +public function __construct(\BumbleDocGen\AI\ProviderInterface $aiProvider); ``` @@ -72,7 +72,7 @@ public function __construct(\BumbleDocGen\AI\ProviderInterface $aiHandler); - $aiHandler + $aiProvider \BumbleDocGen\AI\ProviderInterface - diff --git a/docs/tech/map.md b/docs/tech/map.md index 6206879d..b4e5458b 100644 --- a/docs/tech/map.md +++ b/docs/tech/map.md @@ -256,4 +256,4 @@ Directory layout ( only documented files shown ):

    -Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Wed Nov 01 2023
    Made with Bumble Documentation Generator
    \ No newline at end of file +Last page committer: fshcherbanich <filipp.shcherbanich@team.bumble.com>
    Last modified date: Sat Sep 2 21:01:47 2023 +0300
    Page content update date: Thu Nov 02 2023
    Made with Bumble Documentation Generator \ No newline at end of file