Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2013-10-05 03:42:25 +0400
committerThomas Steur <thomas.steur@gmail.com>2013-10-05 03:42:41 +0400
commit5bfa0706837ec3e6ea6eca81b04e39b4f9427a22 (patch)
treeac32f34347b1ea3af60d2f8ac64b919e540e57f5
parent0deb2bbb8d5598200f7adfbc77b190516f919e48 (diff)
refs #4121 added possibility to generate API for a specific plugin
-rwxr-xr-xconsole1
-rw-r--r--core/Console.php2
-rw-r--r--core/Console/Command.php19
-rw-r--r--plugins/CoreConsole/GenerateApi.php127
-rw-r--r--plugins/CoreConsole/GeneratePlugin.php5
-rw-r--r--plugins/CoreConsole/RunTests.php2
-rw-r--r--plugins/CoreConsole/templates/PluginApiTemplate.php42
7 files changed, 196 insertions, 2 deletions
diff --git a/console b/console
index 8c99a38d04..a1a51328b4 100755
--- a/console
+++ b/console
@@ -6,6 +6,7 @@ define('PIWIK_USER_PATH', PIWIK_DOCUMENT_ROOT);
require_once PIWIK_INCLUDE_PATH . '/vendor/autoload.php';
require_once PIWIK_INCLUDE_PATH . '/core/Loader.php';
+require_once PIWIK_INCLUDE_PATH . '/libs/upgradephp/upgrade.php';
if (!Piwik\Common::isPhpCliMode()) {
exit;
diff --git a/core/Console.php b/core/Console.php
index 9e2057582c..dc8b9732b3 100644
--- a/core/Console.php
+++ b/core/Console.php
@@ -11,6 +11,7 @@
namespace Piwik;
use Piwik\Plugins\CoreConsole\GeneratePlugin;
+use Piwik\Plugins\CoreConsole\GenerateApi;
use Piwik\Plugins\CoreConsole\RunTests;
use Piwik\Plugins\CoreConsole\WatchLog;
use Symfony\Component\Console\Application;
@@ -23,6 +24,7 @@ class Console
$console->add(new RunTests());
$console->add(new GeneratePlugin());
+ $console->add(new GenerateApi());
$console->add(new WatchLog());
$console->run();
diff --git a/core/Console/Command.php b/core/Console/Command.php
index 7f49029c7e..920d69c303 100644
--- a/core/Console/Command.php
+++ b/core/Console/Command.php
@@ -12,6 +12,7 @@ namespace Piwik\Console;
use Piwik\Common;
use Symfony\Component\Console\Command\Command as SymfonyCommand;
+use Symfony\Component\Console\Output\OutputInterface;
class Command extends SymfonyCommand
{
@@ -23,4 +24,22 @@ class Command extends SymfonyCommand
parent::__construct($name);
}
+
+ public function writeSuccessMessage(OutputInterface $output, $messages)
+ {
+ $lengths = array_map('strlen', $messages);
+ $maxLen = max($lengths) + 4;
+
+ $separator = str_pad('', $maxLen, '*');
+
+ $output->writeln('');
+ $output->writeln('<info>' . $separator . '</info>');
+
+ foreach ($messages as $message) {
+ $output->writeln(' ' . $message . ' ');
+ }
+
+ $output->writeln('<info>' . $separator . '</info>');
+ $output->writeln('');
+ }
}
diff --git a/plugins/CoreConsole/GenerateApi.php b/plugins/CoreConsole/GenerateApi.php
new file mode 100644
index 0000000000..ab3c71e5a7
--- /dev/null
+++ b/plugins/CoreConsole/GenerateApi.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik_Plugins
+ * @package CoreConsole
+ */
+
+namespace Piwik\Plugins\CoreConsole;
+
+use Piwik\Common;
+use Piwik\Console\Command;
+use Piwik\Filesystem;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * @package CoreConsole
+ */
+class GenerateApi extends Command
+{
+ protected function configure()
+ {
+ $this->setName('generate:api')
+ ->setDescription('Adds an API to an existing plugin')
+ ->addOption('pluginname', null, InputOption::VALUE_REQUIRED, 'Plugin name ([a-Z0-9_-])');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $pluginName = $this->getPluginName($input, $output);
+
+ $this->generatePluginFolder($pluginName);
+ $this->generatePluginApi($pluginName);
+
+ $this->writeSuccessMessage($output, array(
+ sprintf('API.php for %s generated.', $pluginName),
+ 'You can now start adding API methods',
+ 'Enjoy!'
+ ));
+ }
+
+ /**
+ * @param $pluginName
+ * @return string
+ */
+ public function getPluginPath($pluginName)
+ {
+ $pluginPath = PIWIK_INCLUDE_PATH . '/plugins/' . ucfirst($pluginName);
+ return $pluginPath;
+ }
+
+ private function generatePluginFolder($pluginName)
+ {
+ $pluginPath = $this->getPluginPath($pluginName);
+ Filesystem::mkdir($pluginPath, true);
+ }
+
+ private function writePluginFile($pluginName, $fileName, $content)
+ {
+ $pluginPath = $this->getPluginPath($pluginName);
+
+ file_put_contents($pluginPath . $fileName, $content);
+ }
+
+ /**
+ * @param $pluginName
+ */
+ private function generatePluginApi($pluginName)
+ {
+ $template = file_get_contents(__DIR__ . '/templates/PluginApiTemplate.php');
+ $pluginFile = str_replace('PLUGINNAME', $pluginName, $template);
+ $this->writePluginFile($pluginName, '/API.php', $pluginFile);
+ }
+
+ private function getPluginNamesHavingNoApi()
+ {
+ $pluginDirs = \_glob(PIWIK_INCLUDE_PATH . '/plugins/*', GLOB_ONLYDIR);
+
+ $pluginNames = array();
+ foreach ($pluginDirs as $pluginDir) {
+ if (!file_exists($pluginDir . '/API.php')) {
+ $pluginNames[] = basename($pluginDir);;
+ }
+ }
+
+ return $pluginNames;
+ }
+
+ /**
+ * @param InputInterface $input
+ * @param OutputInterface $output
+ * @return array
+ * @throws \RunTimeException
+ */
+ private function getPluginName(InputInterface $input, OutputInterface $output)
+ {
+ $pluginNames = $this->getPluginNamesHavingNoApi();
+
+ $validate = function ($pluginName) use ($pluginNames) {
+ if (!in_array($pluginName, $pluginNames)) {
+ throw new \InvalidArgumentException('You have to enter the name of an existing plugin which does not already have an API');
+ }
+
+ return $pluginName;
+ };
+
+ $pluginName = $input->getOption('pluginname');
+
+ if (empty($pluginName)) {
+ $dialog = $this->getHelperSet()->get('dialog');
+ $pluginName = $dialog->askAndValidate($output, 'Enter the name of your plugin: ', $validate, false, null, $pluginNames);
+ } else {
+ $validate($pluginName);
+ }
+
+ $pluginName = ucfirst($pluginName);
+
+ return $pluginName;
+ }
+
+
+} \ No newline at end of file
diff --git a/plugins/CoreConsole/GeneratePlugin.php b/plugins/CoreConsole/GeneratePlugin.php
index e5b439ad7f..6c4e27a800 100644
--- a/plugins/CoreConsole/GeneratePlugin.php
+++ b/plugins/CoreConsole/GeneratePlugin.php
@@ -45,7 +45,10 @@ class GeneratePlugin extends Command
$this->generatePluginFiles($isTheme, $pluginName);
$title = $isTheme ? 'Theme' : 'Plugin';
- $output->writeln(sprintf('%s %s %s generated. Enjoy!', $title, $pluginName, $version));
+
+ $this->writeSuccessMessage($output, array(
+ sprintf('%s %s %s generated. Enjoy!', $title, $pluginName, $version)
+ ));
}
/**
diff --git a/plugins/CoreConsole/RunTests.php b/plugins/CoreConsole/RunTests.php
index 5da4485fd2..aa23bec7ed 100644
--- a/plugins/CoreConsole/RunTests.php
+++ b/plugins/CoreConsole/RunTests.php
@@ -36,7 +36,7 @@ class RunTests extends Command
$group = $input->getArgument('group');
if (!empty($group)) {
- $options = '--group ' . $group . ' ' . $options;
+ $options = '--group ' . ucfirst($group) . ' ' . $options;
}
$cmd = sprintf('cd %s/tests/PHPUnit && phpunit %s', PIWIK_DOCUMENT_ROOT, $options);
diff --git a/plugins/CoreConsole/templates/PluginApiTemplate.php b/plugins/CoreConsole/templates/PluginApiTemplate.php
new file mode 100644
index 0000000000..ed54ca38ff
--- /dev/null
+++ b/plugins/CoreConsole/templates/PluginApiTemplate.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik_Plugins
+ * @package Piwik_PLUGINNAME
+ */
+namespace Piwik\Plugins\PLUGINNAME;
+
+/**
+ * API for plugin PLUGINNAME
+ *
+ * @package Piwik_PLUGINNAME
+ */
+class API
+{
+ static private $instance = null;
+
+ /**
+ * @return \Piwik\Plugins\PLUGINNAME\API
+ */
+ static public function getInstance()
+ {
+ if (self::$instance == null) {
+ self::$instance = new self;
+ }
+
+ return self::$instance;
+ }
+
+ /**
+ * Get Answer to Life
+ * @return integer
+ */
+ public function getAnswerToLife()
+ {
+ return 42;
+ }
+} \ No newline at end of file