Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
50.00% |
4 / 8 |
CRAP | |
81.82% |
63 / 77 |
| Command | |
0.00% |
0 / 1 |
|
50.00% |
4 / 8 |
23.65 | |
81.82% |
63 / 77 |
| configure() | |
100.00% |
1 / 1 |
1 | |
100.00% |
17 / 17 |
|||
| initialize(InputInterface $input, OutputInterface $output) | |
0.00% |
0 / 1 |
10.64 | |
72.73% |
24 / 33 |
|||
| autoload($class) | |
100.00% |
1 / 1 |
5 | |
100.00% |
17 / 17 |
|||
| execute(InputInterface $input, OutputInterface $output) | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
| getOutput() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getInput() | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getDialogHelper() | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getCurrentWorkingDirectory() | |
0.00% |
0 / 1 |
2.26 | |
60.00% |
3 / 5 |
|||
| <?php | |
| namespace Environaut\Command; | |
| use Symfony\Component\Console\Command\Command as BaseCommand; | |
| use Symfony\Component\Console\Input\InputOption; | |
| use Symfony\Component\Console\Input\InputInterface; | |
| use Symfony\Component\Console\Output\OutputInterface; | |
| /** | |
| * Base class for environaut commands. | |
| */ | |
| abstract class Command extends BaseCommand | |
| { | |
| /** | |
| * @var InputInterface | |
| */ | |
| protected $input; | |
| /** | |
| * @var OutputInterface | |
| */ | |
| protected $output; | |
| /** | |
| * Defines default options for all commands. | |
| */ | |
| protected function configure() | |
| { | |
| parent::configure(); | |
| $this->addOption( | |
| 'bootstrap', | |
| 'b', | |
| InputOption::VALUE_OPTIONAL, | |
| 'Path to bootstrap file that should be required prior start.' | |
| ); | |
| $this->addOption( | |
| 'include-path', | |
| 'i', | |
| InputOption::VALUE_OPTIONAL, | |
| 'Path that should be prepended to the default PHP include_path.' | |
| ); | |
| $this->addOption( | |
| 'autoload-dir', | |
| 'a', | |
| InputOption::VALUE_OPTIONAL, | |
| 'Path from where to load custom classes specified in config etc.' | |
| ); | |
| } | |
| /** | |
| * Handles the default options all commands have in common. | |
| * | |
| * @param \Symfony\Component\Console\Input\InputInterface $input | |
| * @param \Symfony\Component\Console\Output\OutputInterface $output | |
| * | |
| * @throws \InvalidArgumentException in case of configuration errors | |
| */ | |
| protected function initialize(InputInterface $input, OutputInterface $output) | |
| { | |
| parent::initialize($input, $output); | |
| $this->input = $input; | |
| $this->output = $output; | |
| // prepend include_path if demanded | |
| $path = $input->getOption('include-path'); | |
| if (!empty($path)) { | |
| ini_set('include_path', $path . PATH_SEPARATOR . ini_get('include_path')); | |
| } | |
| // run given bootstrap file if necessary | |
| $bootstrap_path = $input->getOption('bootstrap'); | |
| if (!empty($bootstrap_path)) { | |
| if (!is_readable($bootstrap_path)) { | |
| throw new \InvalidArgumentException('Bootstrap file "' . $bootstrap_path . '" is not readable.'); | |
| } | |
| if ($this->input->getOption('verbose')) { | |
| $output->writeln('<comment>Requiring boostrap file from "' . $bootstrap_path . '".</comment>'); | |
| } | |
| require $bootstrap_path; | |
| } | |
| // we autoload classes from the current working directory or the specified autoload_dir | |
| $autoload_dir = $input->getOption('autoload-dir'); | |
| if (!empty($autoload_dir)) { | |
| if (!is_readable($autoload_dir)) { | |
| throw new \InvalidArgumentException( | |
| 'Autoload path "' . $autoload_dir . '" is not readable. Please specify an existing directory.' | |
| ); | |
| } | |
| if ($this->input->getOption('verbose')) { | |
| $output->writeln('<comment>Classes will be autoloaded from "' . $autoload_dir . '".</comment>'); | |
| } | |
| } else { | |
| if ($this->input->getOption('verbose')) { | |
| $output->writeln( | |
| '<comment>No autoload_dir specified, using "' . $this->getCurrentWorkingDirectory() . | |
| '" to autoload classes from.</comment>' | |
| ); | |
| } | |
| } | |
| spl_autoload_register(array($this, 'autoload')); | |
| } | |
| /** | |
| * Autoloads the given class if it exists. | |
| * | |
| * @param string $class class name like 'Foo\Bar\Baz' | |
| * | |
| * @throws \InvalidArgumentException in case of errors (file | |
| */ | |
| protected function autoload($class) | |
| { | |
| $class = str_replace('\\', DIRECTORY_SEPARATOR, $class); | |
| $autoload_dir = $this->getInput()->getOption('autoload-dir'); | |
| if (empty($autoload_dir)) { | |
| $autoload_dir = $this->getCurrentWorkingDirectory(); | |
| } | |
| $file_path = $autoload_dir . DIRECTORY_SEPARATOR . $class . '.php'; | |
| if ($this->input->getOption('verbose')) { | |
| $this->output->write('<info>Autoloading</info>: '); | |
| } | |
| if (is_readable($file_path)) { | |
| if ($this->input->getOption('verbose')) { | |
| $this->output->writeln($file_path); | |
| } | |
| include_once($file_path); | |
| } else { | |
| $this->output->writeln('<error>Autoload error: "' . $file_path . '" not found!</error>' . PHP_EOL); | |
| // don't exit here to let other autoloaders get their chance | |
| //throw new \InvalidArgumentException('Could not include unreadable file: ' . $file_path); | |
| } | |
| } | |
| /** | |
| * @param \Symfony\Component\Console\Input\InputInterface $input | |
| * @param \Symfony\Component\Console\Output\OutputInterface $output | |
| */ | |
| protected function execute(InputInterface $input, OutputInterface $output) | |
| { | |
| parent::execute($input, $output); | |
| } | |
| /** | |
| * @return \Symfony\Component\Console\Output\OutputInterface | |
| */ | |
| public function getOutput() | |
| { | |
| return $this->output; | |
| } | |
| /** | |
| * @return \Symfony\Component\Console\Input\InputInterface | |
| */ | |
| public function getInput() | |
| { | |
| return $this->input; | |
| } | |
| /** | |
| * @return \Symfony\Component\Console\Helper\DialogHelper | |
| */ | |
| public function getDialogHelper() | |
| { | |
| return $this->getHelper('dialog'); | |
| } | |
| /** | |
| * @return string current working directory | |
| */ | |
| protected function getCurrentWorkingDirectory() | |
| { | |
| $dir = getcwd(); | |
| if (false === $dir) { | |
| $dir = __DIR__; // fallback to folder of current class in case of strange errors | |
| } | |
| return $dir; | |
| } | |
| } |