예제 #1
0
 /**
  * Executes all of the event handlers.
  *
  * @return void
  */
 public static function events()
 {
     $self = get_called_class();
     // vanity.command.complete event
     Dispatcher::get()->addListener('vanity.command.complete', function (Event $event) {
         $formatter = ConsoleUtil::formatters();
         $stop_time = Timer::stop();
         echo PHP_EOL;
         echo $formatter->pending->apply(' Completed in ' . ConsoleUtil::timeHMS(round($stop_time)) . ' (' . $stop_time . ') | Peak memory usage: ' . ConsoleUtil::formatSize(memory_get_peak_usage()) . ' (' . number_format(memory_get_peak_usage()) . ' bytes) ') . PHP_EOL;
     });
     // vanity.command.log_path event
     Dispatcher::get()->addListener('vanity.command.log_path', function (EventStore $event) {
         $finder = new Finder();
         $formatter = ConsoleUtil::formatters();
         $log_path = $event->get('log_path');
         $time = $event->get('time');
         echo PHP_EOL;
         echo $formatter->yellow->apply('LOG FILES FOR THIS RUN') . PHP_EOL;
         $files = $finder->files()->name("vanity-run-{$time}-*.log")->depth(0)->in($log_path);
         $count = 0;
         foreach ($files as $file) {
             $count++;
             echo TAB . $formatter->green->apply('-> ') . $file->getRealpath() . PHP_EOL;
         }
         // Count the classes
         echo PHP_EOL;
         echo 'Found ' . $formatter->info->apply(" {$count} ") . ' log ' . ConsoleUtil::pluralize($count, 'file', 'files') . '.' . PHP_EOL;
     });
     // vanity.command.parse.report.dependencies event
     Dispatcher::get()->addListener('vanity.command.parse.report.dependencies', function (Event $event) {
         // jsonify!
         $json = ConsoleUtil::json_encode(self::getDependencies());
         // Make sure the directory is created
         $filesystem = new Filesystem();
         $filesystem->mkdir(ConfigStore::get('vanity.reports'));
         file_put_contents(ConfigStore::get('vanity.reports') . '/dependencies.json', $json);
     });
     // vanity.command.parse.warn.dependencies event
     Dispatcher::get()->addListener('vanity.command.parse.warn.dependencies', function (Event $event) use(&$self) {
         $formatter = ConsoleUtil::formatters();
         $dependencies = $self::getDependencies();
         echo PHP_EOL;
         echo $formatter->yellow->apply('REPORT: DEPENDENCIES ON EXTENSIONS') . PHP_EOL;
         foreach ($dependencies as $dependency) {
             echo TAB . $formatter->green->apply('-> ') . $dependency . PHP_EOL;
         }
         // Count the classes
         echo PHP_EOL;
         $count = count($dependencies);
         echo 'Found ' . $formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'dependency', 'dependencies') . '.' . PHP_EOL;
     });
     // vanity.command.parse.warn.inconsistencies event
     Dispatcher::get()->addListener('vanity.command.parse.warn.inconsistencies', function (Event $event) {
         $formatter = ConsoleUtil::formatters();
         $inconsistencies = DocumentationInconsistencyCollector::read();
         echo PHP_EOL;
         echo $formatter->yellow->apply('REPORT: DOCBLOCK INCONSISTENCIES') . PHP_EOL;
         // We really need \Array->apply(), don't we?
         echo 'Tags where type is inferred: ' . implode(', ', array_map(function ($w) use($formatter) {
             return $formatter->green->apply($w);
         }, explode(', ', '@param, @return, @returns, @see, @throw, @throws, @uses, @used-by, @type, @var'))) . '.' . PHP_EOL;
         foreach ($inconsistencies as $inconsistency) {
             echo TAB . $formatter->green->apply('-> ') . $inconsistency['message'] . PHP_EOL;
         }
         // Count the classes
         echo PHP_EOL;
         $count = count($inconsistencies);
         echo 'Found ' . $formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'inconsistency', 'inconsistencies') . '.' . PHP_EOL;
     });
     // Handle default HTML template
     DesktopHTMLTemplate::register('default-html');
 }
예제 #2
0
파일: Template.php 프로젝트: vanity/vanity
 /**
  * Log the number of files that were written to the console.
  *
  * @param  integer $count The number of files that were written.
  * @return void
  */
 public static function wroteFileCount($count)
 {
     $formatter = ConsoleUtil::formatters();
     echo PHP_EOL;
     echo 'Matched ' . $formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'file', 'files') . '.' . PHP_EOL;
 }
예제 #3
0
 /**
  * Does the work. Determines the appropriate path to write to, and executes
  * the class-specific reflector.
  *
  * @param  OutputInterface $output The command-line output.
  * @return void
  */
 public function process(OutputInterface $output)
 {
     $output->writeln($this->formatter->yellow->apply('WRITING CLASS DEFINITIONS'));
     // Resolve output path variables
     Dispatcher::get()->dispatch('parse.user.reflect.all.pre');
     $this->path_pattern = str_replace('%STAGE%', ConsoleUtil::asciify(ConfigStore::get('vanity.stage')), $this->path_pattern);
     $this->path_pattern = str_replace('%VERSION%', ConsoleUtil::asciify(ConfigStore::get('vanity.version')), $this->path_pattern);
     $this->path_pattern = str_replace('%FORMAT%', 'json', $this->path_pattern);
     foreach ($this->classes as $class) {
         $reflect = new Reflect($class);
         $reflect->process();
         $reflect->save($this->path_pattern, $output);
     }
     Dispatcher::get()->dispatch('parse.user.reflect.all.post');
     // Count the classes
     echo PHP_EOL;
     $files = Find::files($this->path_pattern, '*.json');
     $count = count($files['absolute']);
     $output->writeln('Wrote ' . $this->formatter->info->apply(" {$count} ") . ' class definition ' . ConsoleUtil::pluralize($count, 'file', 'files') . '.');
 }
예제 #4
0
파일: Parse.php 프로젝트: vanity/vanity
 /**
  * Execute the logic for the command.
  *
  * @event  EventStore      vanity.command.parse.files.pre
  * @event  EventStore      vanity.command.parse.files.post
  * @event  EventStore      vanity.command.parse.classlist.pre
  * @event  EventStore      vanity.command.parse.classlist.post
  * @event  EventStore      vanity.command.parse.reflection.pre
  * @event  EventStore      vanity.command.parse.reflection.post
  * @event  Event           vanity.command.parse.warn.dependencies
  * @event  Event           vanity.command.parse.warn.inconsistencies
  * @event  Event           vanity.command.parse.report.dependencies
  * @event  Event           vanity.command.parse.report.inconsistencies
  * @event  Event           vanity.command.log_path
  * @event  Event           vanity.command.complete
  * @param  InputInterface  $input  The command-line input.
  * @param  OutputInterface $output The command-line output.
  * @return void
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     echo PHP_EOL;
     // Resolve the configuration and display it
     $config = new ConfigResolve($input, __DIR__ . '/parse_configs.php');
     $config->read();
     $this->displayConfig($output);
     Logger::get()->{ConfigStore::get('log.commands')}('Running command:', array($this->getName()));
     if ($input->getOption('vanity.view_config')) {
         exit;
     }
     // Load the bootstrap, if any
     if (file_exists($bootstrap = ConfigStore::get('vanity.bootstrap'))) {
         include_once $bootstrap;
     }
     #--------------------------------------------------------------------------#
     $output->writeln($this->formatter->yellow->apply('MATCHED FILES:'));
     // Parse the pattern to determine the files to match
     $path = pathinfo(ConfigStore::get('source.input'), PATHINFO_DIRNAME);
     $pattern = pathinfo(ConfigStore::get('source.input'), PATHINFO_BASENAME);
     $files = Find::files($path, $pattern);
     $this->triggerEvent('vanity.command.parse.files.pre', new EventStore(array('files' => &$files)));
     // Display the list of matches
     foreach ($files['relative'] as $file) {
         $output->writeln(TAB . $this->formatter->green->apply('-> ') . $file);
     }
     // Count the matches
     echo PHP_EOL;
     $count = count($files['relative']);
     $output->writeln('Matched ' . $this->formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'file', 'files') . '.');
     echo PHP_EOL;
     // Trigger events
     $this->triggerEvent('vanity.command.parse.files.post', new EventStore(array('files' => &$files)));
     #--------------------------------------------------------------------------#
     // Find the classes
     $output->writeln($this->formatter->yellow->apply('MATCHED CLASSES:'));
     $classes = array_filter(Find::classes($files['absolute']), function ($class) {
         if ($regex = ConfigStore::get('source.exclude.classes')) {
             return !preg_match($regex, $class);
         }
         return true;
     });
     $this->triggerEvent('vanity.command.parse.classlist.pre', new EventStore(array('classes' => &$classes)));
     // Display the classes
     foreach ($classes as $class) {
         $output->writeln(TAB . $this->formatter->green->apply('-> ') . $class);
     }
     // Count the classes
     echo PHP_EOL;
     $count = count($classes);
     $output->writeln('Found ' . $this->formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'class', 'classes') . ' to document.');
     echo PHP_EOL;
     $this->triggerEvent('vanity.command.parse.classlist.post', new EventStore(array('classes' => &$classes)));
     #--------------------------------------------------------------------------#
     $reflector = new ReflectAll($classes, ConfigStore::get('source.output'));
     $this->triggerEvent('vanity.command.parse.reflection.pre', new EventStore(array('reflector' => &$reflector)));
     $reflector->process($output);
     $this->triggerEvent('vanity.command.parse.reflection.post', new EventStore(array('reflector' => &$reflector)));
     #--------------------------------------------------------------------------#
     // Warnings
     if (ConfigStore::get('warn.dependencies')) {
         $this->triggerEvent('vanity.command.parse.warn.dependencies');
     }
     if (ConfigStore::get('warn.inconsistencies')) {
         $this->triggerEvent('vanity.command.parse.warn.inconsistencies');
     }
     // Reports
     if (ConfigStore::get('report.dependencies')) {
         $this->triggerEvent('vanity.command.parse.report.dependencies');
     }
     if (ConfigStore::get('report.inconsistencies')) {
         $this->triggerEvent('vanity.command.parse.report.inconsistencies');
     }
     $this->triggerLogMessageEvent();
     $this->triggerEvent('vanity.command.complete');
     echo PHP_EOL;
 }
예제 #5
0
파일: Generate.php 프로젝트: vanity/vanity
 /**
  * Execute the logic for the command.
  *
  * @event  Event           vanity.command.generate.files.pre
  * @event  Event           vanity.command.generate.files.post
  * @event  Event           vanity.command.complete
  * @param  InputInterface  $input  The command-line input.
  * @param  OutputInterface $output The command-line output.
  * @return void
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     echo PHP_EOL;
     // Resolve the configuration and display it
     $config = new ConfigResolve($input, __DIR__ . '/generate_configs.php');
     $config->read();
     $this->displayConfig($output);
     Logger::get()->{ConfigStore::get('log.commands')}('Running command:', array($this->getName()));
     if ($input->getOption('vanity.view_config')) {
         exit;
     }
     // Load the bootstrap, if any
     if (file_exists($bootstrap = ConfigStore::get('vanity.bootstrap'))) {
         include_once $bootstrap;
     }
     $output->writeln($this->formatter->yellow->apply('SOURCE DEFINITIONS TO DOCUMENT:'));
     // Parse the pattern to determine the files to match
     $path = pathinfo(ConfigStore::get('generator.input'), PATHINFO_DIRNAME);
     $pattern = pathinfo(ConfigStore::get('generator.input'), PATHINFO_BASENAME);
     $path = str_replace('%STAGE%', ConsoleUtil::asciify(ConfigStore::get('vanity.stage')), $path);
     $path = str_replace('%VERSION%', ConsoleUtil::asciify(ConfigStore::get('vanity.version')), $path);
     $files = Find::files($path, $pattern);
     $this->triggerEvent('vanity.command.generate.files.pre', new EventStore(array('files' => &$files)));
     // Display the list of matches
     foreach ($files['relative'] as $file) {
         $output->writeln(TAB . $this->formatter->green->apply('-> ') . $file);
     }
     // Count the matches
     echo PHP_EOL;
     $count = count($files['relative']);
     $output->writeln('Matched ' . $this->formatter->info->apply(" {$count} ") . ' ' . ConsoleUtil::pluralize($count, 'file', 'files') . '.');
     echo PHP_EOL;
     // Trigger events
     $this->triggerEvent('vanity.command.generate.files.post', new EventStore(array('files' => &$files)));
     #--------------------------------------------------------------------------#
     foreach (ConfigStore::get('generator.formats') as $format) {
         $this->triggerEvent("vanity.generate.format.{$format}.pre", new EventStore(array('files' => &$files, 'input' => ConfigStore::get('generator.input'), 'output' => ConfigStore::get('generator.output'))));
         $this->triggerEvent("vanity.generate.format.{$format}", new EventStore(array('files' => &$files, 'input' => ConfigStore::get('generator.input'), 'output' => ConfigStore::get('generator.output'))));
         $this->triggerEvent("vanity.generate.format.{$format}.post", new EventStore(array('files' => &$files, 'input' => ConfigStore::get('generator.input'), 'output' => ConfigStore::get('generator.output'))));
     }
     #--------------------------------------------------------------------------#
     $this->triggerLogMessageEvent();
     $this->triggerEvent('vanity.command.complete');
     echo PHP_EOL;
 }