1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 15:07:44 +00:00
Files
matomo/plugins/CoreConsole/Commands/GeneratePlugin.php
Michal Kleiner 9a3ef94df6 [Coding Style] Enable rule PSR12.Files.FileHeader + unify file headers (#22132)
* [Coding Style] Enable rule PSR12.Files.FileHeader

* Apply CS

* Replace Piwik with Matomo in file headers

* Unify file headers (position, no. of lines, https links)

* Rebuild dist files

* Apply CS

* Fix system test that relies on line numbers in a file that had the file header updated

---------

Co-authored-by: Stefan Giehl <stefan@matomo.org>
2024-04-20 20:50:47 +02:00

201 خطوط
6.3 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\CoreConsole\Commands;
use Piwik\Filesystem;
use Piwik\Plugins\ExamplePlugin\ExamplePlugin;
use Piwik\Plugin;
use Piwik\Version;
/**
*/
class GeneratePlugin extends GeneratePluginBase
{
protected function configure()
{
$this->setName('generate:plugin')
->setAliases(array('generate:theme'))
->setDescription('Generates a new plugin/theme including all needed files')
->addRequiredValueOption('name', null, 'Plugin name ([a-Z0-9_-])')
->addRequiredValueOption('description', null, 'Plugin description, max 150 characters')
->addOptionalValueOption('pluginversion', null, 'Plugin version')
->addNoValueOption('overwrite', null, 'Generate even if plugin directory already exists.');
}
protected function doExecute(): int
{
$isTheme = $this->isTheme();
$pluginName = $this->getPluginName();
$description = $this->getPluginDescription();
$version = $this->getPluginVersion();
$this->generatePluginFolder($pluginName);
$plugin = new ExamplePlugin();
$info = $plugin->getInformation();
$exampleDescription = $info['description'];
if ($isTheme) {
$exampleFolder = Plugin\Manager::getPluginDirectory('ExampleTheme');
$replace = array(
'ExampleTheme' => $pluginName,
$exampleDescription => $description,
'0.1.0' => $version,
'3.0.0-b1' => Version::VERSION
);
$whitelistFiles = array();
} else {
$exampleFolder = Plugin\Manager::getPluginDirectory('ExamplePlugin');
$replace = array(
'ExamplePlugin' => $pluginName,
$exampleDescription => $description,
'0.1.0' => $version,
'3.0.0-b1' => Version::VERSION
);
$whitelistFiles = array(
'/ExamplePlugin.php',
'/plugin.json',
'/README.md',
'/CHANGELOG.md',
'/screenshots',
'/screenshots/.gitkeep',
'/docs',
'/docs/faq.md',
'/docs/index.md',
'/config',
'/config/config.php',
'/config/tracker.php'
);
}
$this->copyTemplateToPlugin($exampleFolder, $pluginName, $replace, $whitelistFiles);
$this->checkAndUpdateRequiredPiwikVersion($pluginName);
if ($isTheme) {
$this->writeSuccessMessage(array(
sprintf('Theme %s %s generated.', $pluginName, $version),
'If you have not done yet check out our Theming guide <comment>https://developer.matomo.org/guides/theming</comment>',
'Enjoy!'
));
} else {
$this->writeSuccessMessage(array(
sprintf('Plugin %s %s generated.', $pluginName, $version),
'Our developer guides will help you developing this plugin, check out <comment>https://developer.matomo.org/guides</comment>',
'To see a list of available generators execute <comment>./console list generate</comment>',
'Enjoy!'
));
}
return self::SUCCESS;
}
/**
* @return bool
*/
private function isTheme()
{
$commandName = $this->getInput()->getFirstArgument();
return false !== strpos($commandName, 'theme');
}
protected function generatePluginFolder($pluginName)
{
$pluginPath = $this->getPluginPath($pluginName);
Filesystem::mkdir($pluginPath);
}
/**
* @return string
* @throws \RuntimeException
*/
protected function getPluginName()
{
$overwrite = $this->getInput()->getOption('overwrite');
$self = $this;
$validate = function ($pluginName) use ($self, $overwrite) {
if (empty($pluginName)) {
throw new \RuntimeException('You have to enter a plugin name');
}
if (!Plugin\Manager::getInstance()->isValidPluginName($pluginName)) {
throw new \RuntimeException(sprintf('The plugin name %s is not valid. The name must be no longer than 60 characters and start with a letter and is only allowed to contain numbers and letters.', $pluginName));
}
$pluginPath = $self->getPluginPath($pluginName);
if (
file_exists($pluginPath)
&& !$overwrite
) {
throw new \RuntimeException('A plugin with this name already exists');
}
return $pluginName;
};
$pluginName = $this->getInput()->getOption('name');
if (empty($pluginName)) {
$pluginName = $this->askAndValidate('Enter a plugin name: ', $validate);
} else {
$validate($pluginName);
}
$pluginName = ucfirst($pluginName);
return $pluginName;
}
/**
* @return mixed
* @throws \RuntimeException
*/
protected function getPluginDescription()
{
$validate = function ($description) {
if (empty($description)) {
throw new \RuntimeException('You have to enter a description');
}
if (150 < strlen($description)) {
throw new \RuntimeException('Description is too long, max 150 characters allowed.');
}
return $description;
};
$description = $this->getInput()->getOption('description');
if (empty($description)) {
$description = $this->askAndValidate('Enter a plugin description: ', $validate);
} else {
$validate($description);
}
return $description;
}
/**
* @return string
*/
protected function getPluginVersion()
{
$version = $this->getInput()->getOption('pluginversion');
if (is_null($version)) {
$version = $this->ask('Enter a plugin version number (default to 0.1.0): ', '0.1.0');
}
return $version;
}
}