/** * {@inheritDoc} */ public function getConfigTreeBuilder() { $home = FileUtil::getUserHomeDirOrSysTempDir(); $workarounds = new Workarounds(); $defaultCacheDriver = $workarounds->hasSerializeReferenceIssue() ? 'memory' : 'file'; $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root('pdepend'); $rootNode->children()->arrayNode('cache')->addDefaultsIfNotSet()->children()->enumNode('driver')->defaultValue($defaultCacheDriver)->values(array('file', 'memory'))->end()->scalarNode('location')->defaultValue($home . '/.pdepend')->end()->end()->end()->arrayNode('image_convert')->addDefaultsIfNotSet()->children()->scalarNode('font_size')->defaultValue('11')->end()->scalarNode('font_family')->defaultValue('Arial')->end()->end()->end()->arrayNode('parser')->addDefaultsIfNotSet()->children()->integerNode('nesting')->defaultValue(8192)->end()->end()->end()->end(); $extensionsNode = $rootNode->children()->arrayNode('extensions')->addDefaultsIfNotSet()->children(); foreach ($this->extensions as $extension) { $extensionNode = $extensionsNode->arrayNode($extension->getName()); $extension->getConfig($extensionNode); } return $treeBuilder; }
/** * Closes the logger process and writes the output file. * * @return void * @throws \PDepend\Report\NoLogOutputException */ public function close() { // Check for configured log file if ($this->logFile === null) { throw new NoLogOutputException($this); } $metrics = $this->collectMetrics(); $proportions = $this->computeProportions($metrics); $svg = new \DOMDocument('1.0', 'UTF-8'); $svg->load(dirname(__FILE__) . '/pyramid.svg'); $items = array_merge($metrics, $proportions); foreach ($items as $name => $value) { $svg->getElementById("pdepend.{$name}")->nodeValue = $value; if (($threshold = $this->computeThreshold($name, $value)) === null) { continue; } if (($color = $svg->getElementById("threshold.{$threshold}")) === null) { continue; } if (($rect = $svg->getElementById("rect.{$name}")) === null) { continue; } preg_match('/fill:(#[^;"]+)/', $color->getAttribute('style'), $match); $style = $rect->getAttribute('style'); $style = preg_replace('/fill:#[^;"]+/', "fill:{$match[1]}", $style); $rect->setAttribute('style', $style); } $temp = FileUtil::getSysTempDir(); $temp .= '/' . uniqid('pdepend_') . '.svg'; $svg->save($temp); ImageConvert::convert($temp, $this->logFile); // Remove temp file unlink($temp); }
/** * Closes the logger process and writes the output file. * * @return void * @throws \PDepend\Report\NoLogOutputException If the no log target exists. */ public function close() { // Check for configured log file if ($this->logFile === null) { throw new NoLogOutputException($this); } $bias = 0.1; $svg = new \DOMDocument('1.0', 'UTF-8'); $svg->load(dirname(__FILE__) . '/chart.svg'); $layer = $svg->getElementById('jdepend.layer'); $bad = $svg->getElementById('jdepend.bad'); $bad->removeAttribute('xml:id'); $good = $svg->getElementById('jdepend.good'); $good->removeAttribute('xml:id'); $legendTemplate = $svg->getElementById('jdepend.legend'); $legendTemplate->removeAttribute('xml:id'); $max = 0; $min = 0; $items = array(); foreach ($this->code as $namespace) { if (!$namespace->isUserDefined()) { continue; } $metrics = $this->analyzer->getStats($namespace); if (count($metrics) === 0) { continue; } $size = $metrics['cc'] + $metrics['ac']; if ($size > $max) { $max = $size; } elseif ($min === 0 || $size < $min) { $min = $size; } $items[] = array('size' => $size, 'abstraction' => $metrics['a'], 'instability' => $metrics['i'], 'distance' => $metrics['d'], 'name' => Utf8Util::ensureEncoding($namespace->getName())); } $diff = ($max - $min) / 10; // Sort items by size usort($items, create_function('$a, $b', 'return ($a["size"] - $b["size"]);')); foreach ($items as $item) { if ($item['distance'] < $bias) { $ellipse = $good->cloneNode(true); } else { $ellipse = $bad->cloneNode(true); } $r = 15; if ($diff !== 0) { $r = 5 + ($item['size'] - $min) / $diff; } $a = $r / 15; $e = 50 - $r + $item['abstraction'] * 320; $f = 20 - $r + 190 - $item['instability'] * 190; $transform = "matrix({$a}, 0, 0, {$a}, {$e}, {$f})"; $ellipse->setAttribute('id', uniqid('pdepend_')); $ellipse->setAttribute('title', $item['name']); $ellipse->setAttribute('transform', $transform); $layer->appendChild($ellipse); $result = preg_match('#\\\\([^\\\\]+)$#', $item['name'], $found); if ($result && count($found)) { $angle = rand(0, 314) / 100 - 1.57; $legend = $legendTemplate->cloneNode(true); $legend->setAttribute('x', $e + $r * (1 + cos($angle))); $legend->setAttribute('y', $f + $r * (1 + sin($angle))); $legend->nodeValue = $found[1]; $legendTemplate->parentNode->appendChild($legend); } } $bad->parentNode->removeChild($bad); $good->parentNode->removeChild($good); $legendTemplate->parentNode->removeChild($legendTemplate); $temp = FileUtil::getSysTempDir(); $temp .= '/' . uniqid('pdepend_') . '.svg'; $svg->save($temp); ImageConvert::convert($temp, $this->logFile); // Remove temp file unlink($temp); }
/** * testGetUserHomeDirOrSysTempDirReturnsExpectedUserHomeDirectory * * @return void */ public function testGetUserHomeDirOrSysTempDirReturnsExpectedUserHomeDirectory() { $this->assertEquals(getenv('HOME'), FileUtil::getUserHomeDirOrSysTempDir()); }