diff --git a/cli/Commands/Make/Migration.php b/cli/Commands/Make/Migration.php index 992b02e8f5b0f97104ba157d74bee69a79934f1b..d9ae1d161728791818f6b168478c590ec785f6de 100644 --- a/cli/Commands/Make/Migration.php +++ b/cli/Commands/Make/Migration.php @@ -3,7 +3,6 @@ namespace Studip\Cli\Commands\Make; use Nette\PhpGenerator\PhpFile; -use Nette\PhpGenerator\PsrPrinter; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -97,7 +96,7 @@ final class Migration extends Command $class->addMethod('up')->addBody('// Add content'); $class->addMethod('down')->addBody('// Add content'); - $printer = new PsrPrinter(); + $printer = new StudipClassPrinter(); $result = $printer->printFile($file); $migrationName = $version . '_' . str_replace(' ', '_', lcfirst($name)); $filename = $path . '/' . $migrationName . '.php'; diff --git a/cli/Commands/Make/Model.php b/cli/Commands/Make/Model.php index 82e683bef6ee29ab76ea146e55f0661f735b0375..57b15af743215e93f409663f91ca2416ac2251b0 100644 --- a/cli/Commands/Make/Model.php +++ b/cli/Commands/Make/Model.php @@ -3,7 +3,6 @@ namespace Studip\Cli\Commands\Make; use Nette\PhpGenerator\PhpFile; -use Nette\PhpGenerator\PsrPrinter; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\ArrayInput; @@ -90,7 +89,7 @@ final class Model extends Command $method->addParameter('config', []); - $printer = new PsrPrinter(); + $printer = new StudipClassPrinter(); $result = $printer->printFile($file); $modelName = str_replace(' ', '_', ucfirst($name)); diff --git a/cli/Commands/Make/Plugin.php b/cli/Commands/Make/Plugin.php deleted file mode 100644 index 4f1f9dfc46f1851487c162cc076e5d46db40f1c6..0000000000000000000000000000000000000000 --- a/cli/Commands/Make/Plugin.php +++ /dev/null @@ -1,299 +0,0 @@ -<?php - -namespace Studip\Cli\Commands\Make; - -use Nette\PhpGenerator\PhpFile; -use Nette\PhpGenerator\PsrPrinter; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -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\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; - -final class Plugin extends Command -{ - private const VALID_PLUGIN_INTERFACES = [ - \SystemPlugin::class, - \StandardPlugin::class, - \AdminCourseAction::class, - \AdminCourseContents::class, - \AdminCourseWidgetPlugin::class, - \AdministrationPlugin::class, - \DetailspagePlugin::class, - \ExternPagePlugin::class, - \FileSystemPlugin::class, - \FileUploadHook::class, - \ForumModule::class, - \HomepagePlugin::class, - \LibraryPlugin::class, - \MetricsPlugin::class, - \PortalPlugin::class, - \PrivacyPlugin::class, - \ScorePlugin::class, - \QuestionnaireAssignmentPlugin::class, - \WebServicePlugin::class, - ]; - - protected static $defaultName = 'make:plugin'; - - protected function configure(): void - { - $this->addArgument('name', InputArgument::OPTIONAL, 'Name of the plugin'); - $this->addOption('origin', 'o', InputOption::VALUE_OPTIONAL, 'Origin of the plugin'); - $this->addOption('description', 'd', InputOption::VALUE_OPTIONAL, 'Description of the plugin'); - $this->addOption('plugin-version', 'pv', InputOption::VALUE_OPTIONAL, 'Version of the plugin'); - $this->addOption('min-version', 'min', InputOption::VALUE_OPTIONAL, 'Minimum version of Stud.IP the plugin supports'); - $this->addOption('max-version', 'max', InputOption::VALUE_OPTIONAL, 'Maximum version of Stud.IP the plugin supports'); - $this->addOption('plugin-interfaces', 'I', InputOption::VALUE_OPTIONAL, 'Comma separated list of plugin interfaces'); - $this->addOption('with-controller', 'c', InputOption::VALUE_OPTIONAL, 'Create default controller'); - $this->addOption('force', 'F', InputOption::VALUE_NEGATABLE, 'Force creation of the plugin (even if a plugin with that name and origin already exists)', false); - $this->setDescription('Create a new plain plugin frame'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $helper = $this->getHelper('question'); - - // Get name of the plugin (if not already passed via command line) - $name = $input->getArgument('name'); - if ($name === null) { - $question = new Question('Please enter the name of the plugin: '); - $question->setMaxAttempts(3); - $question->setValidator(function ($name): string { - if (!$name) { - throw new \RuntimeException('The name of the plugin is required'); - } - - return $name; - }); - $question->setTrimmable(true); - $name = $helper->ask($input, $output, $question); - } - - // Get origin of the plugin (if not already passed via command line) - $origin = $input->getOption('origin'); - if ($origin === null) { - $question = new Question('Please enter the origin of the plugin: '); - $question->setAutocompleterValues($this->getKnownOrigins()); - $question->setMaxAttempts(3); - $question->setValidator(function ($origin): string { - if (!$origin) { - throw new \RuntimeException('The origin of the plugin is required'); - } - - return $origin; - }); - $question->setTrimmable(true); - $origin = $helper->ask($input, $output, $question); - } - - $interfaces = null; - if ($input->hasOption('plugin-interfaces')) { - $interfaces = explode(',', $input->getOption('plugin-interfaces')); - $interfaces = array_filter($interfaces); - $interfaces = array_intersect($interfaces, self::VALID_PLUGIN_INTERFACES); - $interfaces = $interfaces ?: null; - } - $withDefaultController = $input->getOption('with-controller'); - - if (!$input->getOption('no-interaction')) { - $version = $input->getOption('plugin-version'); - if ($version === null) { - $question = new Question('Please enter the version of the plugin: ', '1.0'); - $version = $helper->ask($input, $output, $question); - } - - $minVersion = $input->getOption('min-version'); - if ($minVersion === null) { - $question = new Question('Please enter the studipMinVersion of the plugin: ', ''); - $minVersion = $helper->ask($input, $output, $question); - } - - $maxVersion = $input->getOption('max-version'); - if ($maxVersion === null) { - $question = new Question('Please enter the studipMaxVersion of the plugin: ', ''); - $maxVersion = $helper->ask($input, $output, $question); - } - - $description = $input->getOption('description'); - if ($description === null) { - $question = new Question('Please enter the description of the plugin: '); - $description = $helper->ask($input, $output, $question); - } - - if ($interfaces === null) { - $question = new ChoiceQuestion( - 'Please enter the interfaces of the plugin: ', - self::VALID_PLUGIN_INTERFACES, - 0 - ); - $question->setMultiselect(true); - $interfaces = $helper->ask($input, $output, $question); - } - - if ($withDefaultController === null) { - $question = new ConfirmationQuestion( - 'Should controller classes be created? (y/n) ', - false, - '/^(y|j)/i' - ); - $withDefaultController = $helper->ask($input, $output, $question); - } - } - - // Cleanup - $className = strtopascalcase($name); - $interfaces = $interfaces ?? [\SystemPlugin::class]; - - $pluginPath = $GLOBALS['STUDIP_BASE_PATH'] . "/public/plugins_packages/$origin/$className"; - - if ( - file_exists($pluginPath) - && !$input->getOption('force') - ) { - $question = new ConfirmationQuestion( - 'There is already a plugin with that origin and name. Overwrite? (y/n) ', - false, - '/^(y|j)/i' - ); - if (!$helper->ask($input, $output, $question)) { - $output->writeln('<error>Aborted'); - exit; - } - } - - mkdir($pluginPath, 0755, true); - mkdir("$pluginPath/controllers", 0755, true); - mkdir("$pluginPath/views", 0755, true); - mkdir("$pluginPath/lib/classes/", 0755, true); - mkdir("$pluginPath/lib/models", 0755, true); - mkdir("$pluginPath/migrations", 0755, true); - - file_put_contents( - "$pluginPath/plugin.manifest", - $this->generatePluginManifest( - $name, - $className, - $origin, - $version ?? '', - $minVersion ?? '', - $maxVersion ?? '', - $description ?? '' - ) - ); - - // Generate Plugin-Class - $file = new PhpFile(); - $class = $file->addClass($className); - $class->setExtends(\StudIPPlugin::class); - foreach ($interfaces as $interface) { - $class->addImplement($interface); - } - - $method = $class->addMethod('__construct'); - $method->addBody('parent::__construct();'); - $method = $class->addMethod('perform'); - $method->addParameter('unconsumed_path'); - $method->addBody("//Import here styles or scripts for example"); - $method->addBody('parent::perform($unconsumed_path);'); - - foreach ($interfaces as $interface) { - foreach (get_class_methods($interface) as $method) { - $class->inheritMethod($method); - }; - } - - $printer = new PsrPrinter(); - $result = $printer->printFile($file); - - // Include requiring of bootstrap - $result = str_replace( - '<?php', - '<?php' . PHP_EOL . 'require __DIR__ . \'/bootstrap.php\';' . PHP_EOL, - $result - ); - $filename = "$pluginPath/$className.php"; - file_put_contents($filename, $result); - - // Create bootstrap - $bootstrap = implode(PHP_EOL, [ - '<?php', - 'StudipAutoloader::addAutoloadPath(__DIR__ . \'/lib/classes\');', - 'StudipAutoloader::addAutoloadPath(__DIR__ . \'/lib/models\');', - ]); - file_put_contents( - "$pluginPath/bootstrap.php", - $bootstrap - ); - - if ($withDefaultController) { - $controller_name = is_string($withDefaultController) ? strtolower($withDefaultController) : 'show'; - - // Create default controller an views - $file = new PhpFile(); - $class = $file->addClass(strtopascalcase($controller_name . ' Controller')); - $class->addProperty('_autobind', true); - $class->setExtends(\PluginController::class); - $method = $class->addMethod('index_action'); - $method->addBody("//add your code here"); - - $printer = new PsrPrinter(); - $result = $printer->printFile($file); - $filename = "$pluginPath/controllers/$controller_name.php"; - - file_put_contents($filename, $result); - $viewPath = "$pluginPath/views/$controller_name"; - mkdir($viewPath, 0755, true); - - file_put_contents("$viewPath/index.php", $result); - - } - - $output->writeln('<info>Your plugin has been created!</info>'); - - return Command::SUCCESS; - } - - - private function generatePluginManifest( - string $name, - string $class_name, - string $origin, - string $version, - string $minVersion, - string $maxVersion, - string $description, - ): string { - if ($version === '') { - $version = '1.0'; - } - - $manifest = "pluginname=$name\n"; - $manifest .= "pluginclassname=$class_name\n"; - $manifest .= "origin=$origin\n"; - $manifest .= "version=$version\n"; - - if ($description) { - $manifest .= "description=$description\n"; - } - if ($minVersion) { - $manifest .= "studipMinVersion=$minVersion\n"; - } - if ($maxVersion) { - $manifest .= "studipMaxVersion=$maxVersion\n"; - } - - return $manifest; - } - - private function getKnownOrigins(): array - { - $origins = glob($GLOBALS['STUDIP_BASE_PATH'] . '/public/plugins_packages/*', GLOB_ONLYDIR); - $origins = array_map('basename', $origins); - natcasesort($origins); - return $origins; - } -} diff --git a/cli/Commands/Make/StudipClassPrinter.php b/cli/Commands/Make/StudipClassPrinter.php new file mode 100644 index 0000000000000000000000000000000000000000..5e860850ef6bb909099529487725c7a9f4e15287 --- /dev/null +++ b/cli/Commands/Make/StudipClassPrinter.php @@ -0,0 +1,18 @@ +<?php +namespace Studip\Cli\Commands\Make; + +use Nette\PhpGenerator\Printer; + +final class StudipClassPrinter extends Printer +{ + /** length of the line after which the line will break */ + public int $wrapLength = 120; + /** indentation character, can be replaced with a sequence of spaces */ + public string $indentation = ' '; + /** number of blank lines between properties */ + public int $linesBetweenProperties = 0; + /** number of blank lines between methods */ + public int $linesBetweenMethods = 1; + + public string $returnTypeColon = ': '; +} diff --git a/cli/studip b/cli/studip index 8effcae08c7e12686feb840c5c1b54d4ad8a0905..4d19e2b1149550418f3b4f315cd542e2c131f5f5 100755 --- a/cli/studip +++ b/cli/studip @@ -34,7 +34,6 @@ $commands = [ Commands\DB\MoveMatrikelnummer::class, Commands\Make\Migration::class, Commands\Make\Model::class, - Commands\Make\Plugin::class, Commands\DI\Reset::class, Commands\Files\Dump::class, Commands\Fix\Biest7789::class,