/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); $divUtil = new \Mpmd\Util\Div(); $requestedModules = $this->_input->getArgument('module'); $allModules = $divUtil->getAllModules(); $matchCount = array(); $modules = $divUtil->globArray($allModules, $requestedModules, $matchCount); foreach ($matchCount as $pattern => $count) { if ($count == 0) { throw new \Exception('No match found for pattern: ' . $pattern); } } $output = array(); $output[] = 'digraph callgraph {'; $output[] = ''; $output[] = ' splines=false;'; $output[] = ' rankdir=LR;'; $output[] = ' edge[arrowhead=vee, arrowtail=inv, arrowsize=.7, color="#dddddd"];'; $output[] = ' node [fontname="verdana", shape=plaintext, style="filled", fillcolor="#dddddd"];'; $output[] = ' fontname="Verdana";'; $output[] = ''; foreach ($modules as $module) { $dependencies = $divUtil->getDeclaredDepenenciesForModule($module); foreach ($dependencies as $dependency) { $output[] = " {$module} -> {$dependency};"; } } $output[] = '}'; echo implode("\n", $output) . "\n"; }
/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); $collector = $this->collectData(); // filter the Mage god class $collector->filter(array('Mage')); // filter the default classes that come with PHP $divUtil = new \Mpmd\Util\Div(); $collector->filter($divUtil->getDefaultClasses()); // filter library files $libDir = \Mage::getBaseDir('lib'); $libraryFiles = $collector->filter(function ($className) use($libDir) { return !file_exists($libDir . DS . str_replace(' ', DS, ucwords(str_replace('_', ' ', $className))) . '.php'); }); $output = array(); $output[] = 'digraph callgraph {'; $output[] = ''; $output[] = ' splines=false;'; $output[] = ' rankdir=LR;'; $output[] = ' edge[arrowhead=vee, arrowtail=inv, arrowsize=.7, color="#dddddd"];'; $output[] = ' node [fontname="verdana", shape=plaintext, style="filled", fillcolor="#dddddd"];'; $output[] = ' fontname="Verdana";'; $output[] = ''; foreach ($collector->getModuleRelations() as $sourceModule => $targetModules) { foreach ($targetModules as $targetModule) { $table[] = array($sourceModule, $targetModule); $output[] = " {$sourceModule} -> {$targetModule};"; } } $output[] = '}'; echo implode("\n", $output) . "\n"; }
/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); $divUtil = new \Mpmd\Util\Div(); $requestedModules = $this->_input->getArgument('module'); $allModules = $divUtil->getAllModules(); $matchCount = array(); $modules = $divUtil->globArray($allModules, $requestedModules, $matchCount); foreach ($matchCount as $pattern => $count) { if ($count == 0) { throw new \Exception('No match found for pattern: ' . $pattern); } } $table = array(); foreach ($modules as $module) { $dependencies = $divUtil->getDeclaredDepenenciesForModule($module); if (count($dependencies) == 0) { $table[] = array($module, '[No dependency declared]'); } else { foreach ($dependencies as $dependency) { $table[] = array($module, $dependency); } } $table[] = new TableSeparator(); } // Remove TableSeparator at the end of the table if (end($table) instanceof TableSeparator) { array_pop($table); } $this->getHelper('table')->setHeaders(array('Module', 'Dependency'))->renderByFormat($output, $table, $input->getOption('format')); }
/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); $collector = $this->collectData(); // filter the Mage god class $collector->filter(array('Mage')); // filter the default classes that come with PHP $divUtil = new \Mpmd\Util\Div(); $collector->filter($divUtil->getDefaultClasses()); // filter library files except the user wants to include them if (!$this->_input->getOption('libraries')) { $libDir = \Mage::getBaseDir('lib'); $libraryFiles = $collector->filter(function ($className) use($libDir) { return !file_exists($libDir . DS . str_replace(' ', DS, ucwords(str_replace('_', ' ', $className))) . '.php'); }); } // get class relations (before filtering) $relations = $collector->getClassRelations(); $output = array(); $output[] = 'digraph callgraph {'; $output[] = ''; $output[] = ' splines=false;'; $output[] = ' rankdir=LR;'; $output[] = ' edge[arrowhead=vee, arrowtail=inv, arrowsize=.7, color="#dddddd"];'; $output[] = ' node [fontname="verdana", shape=plaintext, style="filled", fillcolor="#dddddd"];'; $output[] = ' fontname="Verdana";'; $output[] = ''; if ($this->_input->getOption('group')) { foreach ($collector->getClassesByModule() as $module => $classes) { $output[] = " subgraph cluster_{$module} {"; $output[] = " style=filled;"; $output[] = " color=\"#eeeeee\";"; $output[] = " label=\"{$module}\";"; foreach ($classes as $class) { $output[] = " node [label=\"{$class}\"] {$class};"; } $output[] = " }"; $output[] = ''; } } foreach ($relations as $sourceClass => $targetClasses) { foreach ($targetClasses as $targetClass => $types) { $style = $this->getEdgeStyleForType($types); $output[] = " {$sourceClass} -> {$targetClass} [style=\"{$style}\"];"; } } $output[] = '}'; echo implode("\n", $output) . "\n"; }
/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); $moduleName = $this->_input->getOption('module'); if (!\Mage::getConfig()->getNode('modules/' . $moduleName)) { throw new \InvalidArgumentException('Could not find module.'); } $divUtil = new \Mpmd\Util\Div(); $declaredDepenencies = $divUtil->getDeclaredDepenenciesForModule($moduleName); $collector = $this->collectData(); // filter the Mage god class $collector->filter(array('Mage')); // filter the default classes that come with PHP $collector->filter($divUtil->getDefaultClasses()); // filter library files $libDir = \Mage::getBaseDir('lib'); $libraryFiles = $collector->filter(function ($className) use($libDir) { return !file_exists($libDir . DS . str_replace(' ', DS, ucwords(str_replace('_', ' ', $className))) . '.php'); }); $actualDependencies = $collector->getModules(); $correctDepenencies = array_intersect($actualDependencies, $declaredDepenencies); $undeclaredDepenencies = array_diff($actualDependencies, $declaredDepenencies); $unusedDeclarations = array_diff($declaredDepenencies, $actualDependencies); $table = array(); foreach ($correctDepenencies as $dependency) { $table[] = array($dependency, $dependency, '<info>OK</info>'); } foreach ($unusedDeclarations as $dependency) { $table[] = array($dependency, '-', '<warning> Not used </warning>'); } foreach ($undeclaredDepenencies as $dependency) { $table[] = array('-', $dependency, '<error> Undeclared </error>'); } $this->getHelper('table')->setHeaders(array('Declared Dependency', 'Actual Dependency', 'Status'))->renderByFormat($output, $table, $input->getOption('format')); }
/** * Get libraries * * @param array $files * @return array */ public function getLibraries(array $files) { $divUtil = new \Mpmd\Util\Div(); $libraries = array(); foreach ($files as $class) { $lib = $divUtil->getModuleFromClass($class, 1); if (!in_array($lib, $libraries)) { $libraries[] = $lib; } } return $libraries; }
/** * Execute command * * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output * @throws \Exception * @return void */ protected function execute(InputInterface $input, OutputInterface $output) { $this->_input = $input; $this->_output = $output; $this->detectMagento($output, true); $this->initMagento(); if (!$this->_input->getOption('modules') && !$this->_input->getOption('libraries') && !$this->_input->getOption('classes') && !$this->_input->getOption('details')) { throw new \InvalidArgumentException('Please specify at least one of the following options: --modules, --libraries, --classes, --details'); } $divUtil = new \Mpmd\Util\Div(); $collector = $this->collectData(); // filter the Mage god class $collector->filter(array('Mage')); // get class relations (before filtering) $relations = $collector->getClassRelations(); // filter the default classes that come with PHP $collector->filter($divUtil->getDefaultClasses()); // filter library files $libDir = \Mage::getBaseDir('lib'); $libraryFiles = $collector->filter(function ($className) use($libDir) { return !file_exists($libDir . DS . str_replace(' ', DS, ucwords(str_replace('_', ' ', $className))) . '.php'); }); // Show dependent modules if ($this->_input->getOption('modules')) { $table = array(); foreach ($collector->getModuleRelations() as $sourceModule => $targetModules) { foreach ($targetModules as $targetModule) { $table[] = array($sourceModule, $targetModule); } } $this->getHelper('table')->setHeaders(array('Source Module', 'Target Module'))->renderByFormat($output, $table, $input->getOption('format')); } // Show dependent libraries if ($this->_input->getOption('libraries')) { $table = array(); foreach ($collector->getLibraries($libraryFiles) as $lib) { $table[] = array($lib); } $this->getHelper('table')->setHeaders(array('Libraries'))->renderByFormat($output, $table, $input->getOption('format')); } // Show class to class relations if ($this->_input->getOption('classes')) { $table = array(); foreach ($relations as $sourceClass => $targetClasses) { foreach ($targetClasses as $targetClass => $types) { $table[] = array($sourceClass, $targetClass, implode(',', $types)); } } $this->getHelper('table')->setHeaders(array('Source class', 'Target Class', 'Access Types'))->renderByFormat($output, $table, $input->getOption('format')); } // Show all details if ($this->_input->getOption('details')) { $table = array(); foreach ($collector->getClasses() as $file => $data) { foreach ($data as $type => $classes) { foreach ($classes as $class) { $table[] = array($file, $type, $class); } } } $this->getHelper('table')->setHeaders(array('File', 'Access Type', 'Class'))->renderByFormat($output, $table, $input->getOption('format')); } }