| Code Coverage | ||||||||||
| Classes and Traits | Functions and Methods | Lines | ||||||||
| Total |  | 0.00% | 0 / 1 |  | 0.00% | 0 / 11 | CRAP |  | 0.00% | 0 / 80 | 
| InitCommand |  | 0.00% | 0 / 1 |  | 0.00% | 0 / 11 | 306 |  | 0.00% | 0 / 80 | 
| configure |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 4 | |||
| execute |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 10 | |||
| generateConfiguration |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 7 | |||
| askConfigTargetPath |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 7 | |||
| continueWithInvalidData |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 4 | |||
| askConnectionDetails |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 12 | |||
| isConnectionValid |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 13 | |||
| askQuestion |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 4 | |||
| askIntegerQuestion |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 5 | |||
| getQuestionHelper |  | 0.00% | 0 / 1 | 2 |  | 0.00% | 0 / 3 | |||
| compileDirectoryList |  | 0.00% | 0 / 1 | 12 |  | 0.00% | 0 / 11 | |||
| <?php | |
| namespace Siesta\Console; | |
| use Siesta\Config\Config; | |
| use Siesta\Database\ConnectionData; | |
| use Siesta\Database\ConnectionFactory; | |
| use Siesta\Database\Exception\ConnectException; | |
| use Siesta\Driver\MySQL\MySQLDriver; | |
| use Siesta\Exception\InvalidConfigurationException; | |
| use Siesta\Util\File; | |
| use Symfony\Component\Console\Command\Command; | |
| use Symfony\Component\Console\Helper\QuestionHelper; | |
| use Symfony\Component\Console\Input\InputInterface; | |
| use Symfony\Component\Console\Output\OutputInterface; | |
| use Symfony\Component\Console\Question\ConfirmationQuestion; | |
| use Symfony\Component\Console\Question\Question; | |
| /** | |
| * @author Gregor Müller | |
| */ | |
| class InitCommand extends Command | |
| { | |
| /** | |
| * @var InputInterface | |
| */ | |
| protected $input; | |
| /** | |
| * @var OutputInterface | |
| */ | |
| protected $output; | |
| /** | |
| * @var QuestionHelper | |
| */ | |
| protected $questionHelper; | |
| /** | |
| * | |
| */ | |
| protected function configure() | |
| { | |
| $this->setName('init'); | |
| $this->setDescription('Creates a config file for siesta'); | |
| } | |
| /** | |
| * @param InputInterface $input | |
| * @param OutputInterface $output | |
| * | |
| * @return void | |
| */ | |
| protected function execute(InputInterface $input, OutputInterface $output) | |
| { | |
| $this->input = $input; | |
| $this->output = $output; | |
| $this->questionHelper = $this->getQuestionHelper(); | |
| do { | |
| $cd = $this->askConnectionDetails(); | |
| } while (!$this->isConnectionValid($cd) and !$this->continueWithInvalidData()); | |
| $targetPath = $this->askConfigTargetPath(); | |
| $this->generateConfiguration($cd, $targetPath); | |
| } | |
| /** | |
| * @param ConnectionData $connectionData | |
| * @param string $targetPath | |
| */ | |
| private function generateConfiguration(ConnectionData $connectionData, $targetPath) | |
| { | |
| $file = new File($targetPath . '/' . Config::CONFIG_FILE_NAME); | |
| $file->createDirForFile(); | |
| $configuration = Config::buildConfiguration($connectionData); | |
| $file->putContents(json_encode($configuration, JSON_PRETTY_PRINT)); | |
| $this->output->writeln("Config file generated in " . $targetPath); | |
| } | |
| /** | |
| * @return string | |
| */ | |
| private function askConfigTargetPath() | |
| { | |
| $directoryList = []; | |
| $this->compileDirectoryList($directoryList, getcwd()); | |
| $question = new Question('<question>Please enter target path for configuration</question> ', ''); | |
| $question->setAutocompleterValues($directoryList); | |
| return $this->questionHelper->ask($this->input, $this->output, $question); | |
| } | |
| /** | |
| * @return bool | |
| */ | |
| private function continueWithInvalidData() | |
| { | |
| $question = new ConfirmationQuestion('<question>Connection not possible, use connection data anyway? (y/n)</question>', false); | |
| return $this->questionHelper->ask($this->input, $this->output, $question); | |
| } | |
| /** | |
| * @return ConnectionData | |
| */ | |
| private function askConnectionDetails() | |
| { | |
| $cd = new ConnectionData(); | |
| $cd->name = $this->askQuestion("Please enter connection name", "default"); | |
| $cd->host = $this->askQuestion("Please enter host", "127.0.0.1"); | |
| $cd->port = $this->askIntegerQuestion("Please enter port", 3306); | |
| $cd->driver = $this->askQuestion("Please enter driver", MySQLDriver::DRIVER_CLASS); | |
| $cd->database = $this->askQuestion("Please enter database name", "test"); | |
| $cd->user = $this->askQuestion("Please enter user", "root"); | |
| $cd->password = $this->askQuestion("Please enter password", ""); | |
| $cd->charSet = $this->askQuestion("Please enter charset", "utf8"); | |
| return $cd; | |
| } | |
| /** | |
| * @param ConnectionData $cd | |
| * | |
| * @return bool | |
| */ | |
| private function isConnectionValid(ConnectionData $cd) : bool | |
| { | |
| try { | |
| ConnectionFactory::addConnection($cd); | |
| $this->output->writeln("Connection successful"); | |
| return true; | |
| } catch (InvalidConfigurationException $e) { | |
| $this->output->writeln("Error " . $e->getMessage()); | |
| return false; | |
| } catch (ConnectException $e) { | |
| $this->output->writeln("Error " . $e->getMessage()); | |
| return false; | |
| } | |
| } | |
| /** | |
| * @param $question | |
| * @param $default | |
| * | |
| * @return string | |
| */ | |
| private function askQuestion(string $question, string $default) : string | |
| { | |
| $q = new Question("<question>$question ($default)</question> ", $default); | |
| return $this->questionHelper->ask($this->input, $this->output, $q); | |
| } | |
| /** | |
| * @param $question | |
| * @param $default | |
| * | |
| * @return int | |
| */ | |
| private function askIntegerQuestion(string $question, int $default) : int | |
| { | |
| $q = new Question("<question>$question ($default)</question> ", $default); | |
| $stringValue = $this->questionHelper->ask($this->input, $this->output, $q); | |
| return (int)$stringValue; | |
| } | |
| /** | |
| * @return QuestionHelper | |
| */ | |
| private function getQuestionHelper() | |
| { | |
| return $this->getHelper('question'); | |
| } | |
| /** | |
| * @param array $directoryList | |
| * @param string $currentDirectory | |
| */ | |
| private function compileDirectoryList(&$directoryList, $currentDirectory) | |
| { | |
| $dir = new File($currentDirectory); | |
| $fileList = $dir->scanDir(); | |
| foreach ($fileList as $file) { | |
| if (!$file->isDir()) { | |
| continue; | |
| } | |
| $directoryList[] = str_replace(getcwd() . "/", "", $file->getAbsoluteFileName()); | |
| $this->compileDirectoryList($directoryList, $file->getAbsoluteFileName()); | |
| } | |
| } | |
| } |